C++ 英特尔风格内联汇编和AT&;中的变量引用;T型,C++;

C++ 英特尔风格内联汇编和AT&;中的变量引用;T型,C++;,c++,gcc,assembly,intel,inline-assembly,C++,Gcc,Assembly,Intel,Inline Assembly,我需要使用G++4.6.1在Visual Studio和IDE中编译一些汇编代码。只要我不引用和寻址任何变量,-masm=intel标志就可以工作,但我需要这样做 我考虑过使用intrinsic,但编译的程序集根本不是最优的(例如,我无法定义要使用的sse寄存器,因此不可能进行管道优化) 考虑以下代码部分(集成式组件): 其中p_pXcoords和p_pYcoords是doublde*数组和函数参数,oAvgX和oAvgY是简化的双值 另一行代码,在汇编块的中间: movhpd xmm6,

我需要使用G++4.6.1在Visual Studio和IDE中编译一些汇编代码。只要我不引用和寻址任何变量,-masm=intel标志就可以工作,但我需要这样做

我考虑过使用intrinsic,但编译的程序集根本不是最优的(例如,我无法定义要使用的sse寄存器,因此不可能进行管道优化)

考虑以下代码部分(集成式组件):

其中p_pXcoords和p_pYcoords是doublde*数组和函数参数,oAvgX和oAvgY是简化的双值

另一行代码,在汇编块的中间:

movhpd    xmm6, qword ptr [oAvgY]

换句话说,我需要访问变量,并在代码中间的特定SSE寄存器中使用这些变量。如何使用AT&T语法做到这一点,best:我可以使用使用-masm标志的g++编译器做到这一点吗


有没有办法为VS和基于g++4.6.1的编译器使用一个汇编代码

您当然可以告诉GCC每个变量使用哪个SSE寄存器:

register __m128i x asm("xmm6");
但我想VS不支持这一点。(我也有点惊讶您需要它来获得良好的性能。寄存器分配和指令调度是优化编译器知道的两个最基本的事情。您确定启用了优化:-)?)


我可能只会编写两个函数,一个使用内部函数,另一个使用asm,用于那些不知道如何正确调度指令的编译器。

您好,谢谢您的回复。是的,我使用了-O2甚至-msse2标志,但是在使用_mm_loadu_pd时,intrinsics sorta将所有内容按顺序放入xmm0。一个特定的问题是:如何将上面给出的一行在汇编块中间转换成AT&T风格?当有较大的块时,我不打算对每一行单独使用asm(…),您必须使用“约束”来指定输入、输出和碰撞(副作用)。看。请注意,如果有较大的块,可能不应该使用内联asm-只需在单独的asm文件中编写函数即可。这样,您就可以使用相同的代码(调用约定允许)。Jester您好,是的,我知道约束,但我认为使用单独的.s文件更好。谢谢,AndyHi再次提醒Nemo,只有在g++4.6.1中打开优化(例如O2)时,才可以将变量分配给寄存器。然而,将其与优化和内部函数结合使用,一切都很好。谢谢,G。
register __m128i x asm("xmm6");