作者l71cm (耶 很棒)
看板ASM
标题Re: 请问MMX与GCC C & ASM的问题
时间Thu May 24 18:21:08 2007
※ 引述《yanming (雪地中的雁子)》之铭言:
: ※ 引述《zxvc (zxvc)》之铭言:
: : 最近作专题要编译一个程式:
: : http://iie.fing.edu.uy/investigacion/grupos/gmm/proyectos/tararira/ingles.php3
: : 不过这程式是用C语言与x86指令写的,
: : 这程式的原作者似乎是用gcc 3编译的。
: : 可是我手边的机器多是用gcc 4,
: : 结果编译的时候出现一堆问题,我试着看看自己有没有能力修正。
: : 之前也没有用过MMX与GCC C & ASM,只在MASM上写过一点x86。
: : 我现在遇到一个问题,
: : 就是以下我自己写的一个小程式为什麽无法用gcc编译成功呢?
: : 我的编译器是gcc 4.0.3,编译的时候出现这个错误:
: : gcc test.c -mmmx
: : test.c: In function 'main':
: : test.c:9: error: impossible register constraint in 'asm'
: : test.c:15: confused by earlier errors, bailing out
: : ~~~~~~~~~~~~~~~~~~~ test.c ~~~~~~~~~~~~~~~~~~~~
: : #include <stdlib.h>
: : #include <stdio.h>
: : int main ()
: : {
: : double a, b;
: : a = 5.0;
: : b = 0.0;
: : asm (
: : "movq %1, %0 \n\t"
: : : "=y" (b)
: : : "m" (a));
: : printf ("Hello world.: %6.2f\n", b);
: : return 0;
: : }
: : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: : 『: "=y" (b)』那一行我是参考这篇文章设定的:
: : http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Machine-Constraints.html#Machine-Constraints
: : 或者缩减网址:
: : http://0rz.tw/ce2AA
: : 希望有高手能帮我解答,谢谢。
: __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 的...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.25.140
※ 编辑: l71cm 来自: 140.112.25.140 (05/24 18:25)