看来gcc会很乐意自动将简单的示例向量化,并发出SSE指令。有什么方法只能发出MMX指令吗?
例如,如果我在Godbolt上尝试以下示例:
int sumint(int *arr) {
int sum = 0;
for (int i=0 ; i<2048 ; i++){
sum += arr[i];
}
return sum;
}
使用-mmmx -O3 -m32 -msse2
在GCC 9.2上编译,我得到了
sumint:
mov eax, DWORD PTR [esp+4]
pxor xmm0, xmm0
lea edx, [eax+8192]
.L2:
movdqu xmm2, XMMWORD PTR [eax]
add eax, 16
paddd xmm0, xmm2
cmp edx, eax
jne .L2
movdqa xmm1, xmm0
psrldq xmm1, 8
paddd xmm0, xmm1
movdqa xmm1, xmm0
psrldq xmm1, 4
paddd xmm0, xmm1
movd eax, xmm0
ret
但是如果没有sse(即-mmmx -O3 -m32 -mno-sse2
),它只能使用通用寄存器,而不能使用mmx指令:
sumint:
mov eax, DWORD PTR [esp+4]
xor edx, edx
lea ecx, [eax+8192]
.L2:
add edx, DWORD PTR [eax]
add eax, 4
cmp eax, ecx
jne .L2
mov eax, edx
ret
我想运行一些基准测试,比较仅使用x87-fpu,MMX,SSE和SSE2的运行效果,但是如果gcc不会发出MMX指令,那么为x87和x87编译之间不会有任何区别x87 + mmx。
答案 0 :(得分:1)
GCC无法使用MMX或3DNow自动矢量化!因为它缺乏正确插入EMMS / FEMMS的能力。您必须将ICC用于MMX。参见https://gcc.gnu.org/ml/gcc-patches/2004-12/msg01955.html