作者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