Re: 請問MMX與GCC C & ASM的問題

看板ASM (組合語言)作者 (雪地中的雁子)時間18年前 (2007/05/24 20:03), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《l71cm (耶 很棒)》之銘言: : ※ 引述《yanming (雪地中的雁子)》之銘言: : : __asm{movq xmm0,temp_int} : : 請問當我在用 intel inline assembly 時, : : 編譯到這一行時, : : .net 會出現 "不合法的資料型態"的錯誤類別 : : 改成 __asm{movq mm0,temp_int} 時就可以正確運作 : : 這是由於 xmm0 是浮點數暫存器的關係嗎? : : 如果是,那要怎麼使用 SSE 的指令呢?(xmm0 ~ xmm7 都不能用嗎?) : 前言 (廢話): : mm0 ~ mm7 是 MMX registers (各 64-bit, 跟 fpu stack 有對應關係,很煩的) : xmm0 ~ xmm7 是 SSE 新加的沒錯,各 128-bit,為獨立單元 : movq 這個指令當初是跟 MMX 一併加入的,只能作用在 MMX registers 上 : 後來 SSE1 雖然加上 xmm0 ~ xmm7,但此時 movq 還不能用在 xmm0 ~ xmm7 上喔 : 到了 SSE2,Intel 把 movq 這類指令也加上了可以作用在 xmm registers 上的 form : "All of 64-bit SIMD integer instructions introduced with MMX technology and SSE : extensions (with the exception of the PSHUFW instruction) have been extended by : SSE2 extensions to operate on 128-bit packed integer operands located in XMM : registers" : (Intel 這麼做的目的,是為了全面抛棄 MMX, : 以前的 MMX code 只要把 mm0 ~ mm7 都換成 xmm0 ~ xmm7,再重新 assemble/compile : 大部份都不需要手動去改...) : 例如 movq xmm0, mem 就會從 mem 拿 64 bits 放進 xmm0[63:0],xmm0[127:64] 則填 0 : 好啦,講了這麼多廢話, : 大概給你兩個建議: : 1. 不要再用 mm0 ~ mm7,全改用 xmm0 ~ xmm7 吧 : 2. 換新的 compiler,確定可以支援 SSE2 的... 謝謝高手的回答,不過小弟還有一些疑問 1. 目前我是用 visual .net 2005 做 compile 難道不支援 SSE2 嗎? @@a 2. __asm{movq mm0,temp_int} 時就可以"正確運作 " 這裡我寫的會讓人誤會,將 xmm0 改成 mm0 後,是可以compile ok 但是執行結果是否正確還未測試 Orz 若 mm0 目前無人使用, 我可以將程式中其他出現 xmm0 的地方都改成mm0嗎?同理類推 ~xmm7 ? (反正只是register而已?既然xmm0的高位元都填成0? ) 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.30.3

05/25 02:21, , 1F
mm0沒有使用? 他跟x87共用喔
05/25 02:21, 1F

05/25 03:01, , 2F
用完之後就要下一個很長cycle的emms
05/25 03:01, 2F
文章代碼(AID): #16LNy6Y- (ASM)
討論串 (同標題文章)
文章代碼(AID): #16LNy6Y- (ASM)