2

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

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

考虑这些代码部分(inte 样式程序集):

mov       ecx, dword ptr [p_pXcoords]
mov       edx, dword ptr [p_pYcoords]
movhpd    xmm6, qword ptr [oAvgX]
movhpd    xmm7, qword ptr [oAvgY]
movlpd    xmm6, qword ptr [oAvgX]
movlpd    xmm7, qword ptr [oAvgY]

其中 p_pXcoords 和 p_pYcoords 是双精度数组和函数参数,oAvgX 和 oAvgY 是简单的双精度值。

另一行代码是这样的,它位于汇编块的中间:

movhpd    xmm6, qword ptr [oAvgY]

换句话说,我需要访问变量并在代码中间的特定 sse 寄存器中使用它们。我怎样才能用 AT & T 语法做到这一点,最好:我可以用 g++ 编译器使用 -masm 标志做到这一点吗?

有什么办法可以同时为 VS 和基于 g++ 4.6.1 的编译器使用一个汇编代码

4

1 回答 1

2

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

register __m128i x asm("xmm6");

但我猜VS不支持。(我也有点惊讶你需要它来获得良好的性能。寄存器分配和指令调度是优化编译器知道的两个最基本的东西。你确定你启用了优化:-)?)

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

于 2012-11-08T14:13:08.193 回答