作者yanming (雪地中的雁子)
看板ASM
標題Re: 請問MMX與GCC C & ASM的問題
時間Thu May 24 20:03:15 2007
※ 引述《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
1F:→ wowtiger:mm0沒有使用? 他跟x87共用喔 05/25 02:21
2F:推 wowtiger:用完之後就要下一個很長cycle的emms 05/25 03:01