有没有办法用gcc自动生成MMX指令(而不是SSE)
看来gcc会很高兴地自动向量化简单的示例,并发出SSE指令。有没有办法只发出MMX指令 例如,如果我在Godbolt上尝试以下示例:有没有办法用gcc自动生成MMX指令(而不是SSE),gcc,sse,mmx,auto-vectorization,Gcc,Sse,Mmx,Auto Vectorization,看来gcc会很高兴地自动向量化简单的示例,并发出SSE指令。有没有办法只发出MMX指令 例如,如果我在Godbolt上尝试以下示例: int sumint(int *arr) { int sum = 0; for (int i=0 ; i<2048 ; i++){ sum += arr[i]; } return sum; } 但如果没有sse(即mmmx-O3-m32-mno-sse2),它只能使用通用寄存器,而不使用mmx指令: sumi
int sumint(int *arr) {
int sum = 0;
for (int i=0 ; i<2048 ; i++){
sum += arr[i];
}
return sum;
}
但如果没有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+MMX编译就不会有任何区别。gcc不能使用MMX或3DNow自动矢量化!因为它缺乏正确插入EMM/FEMM的能力。您必须为MMX使用ICC。如果GCC的旧版本知道如何为MMX自动矢量化,请参见IDK。也许可以尝试Godbolt上最旧的GCC,尽管这可能仍然不起作用。添加标志
-fopt info vec missed
给出:missed:not vectorized:related stmt not supported:sum_10=\u 4+sum_15
因此,在使用YMM寄存器(在AVX指令中)之后,MMX自动矢量化可能没有实现vzeroupper
,这与现在解决的问题是相同的。如果有人关心过时的MMX,那么修改GCC以同样的方式插入EMM并允许重新启用MMX auto-vec(如果它在禁用15年后未被删除或因位腐烂而变得无用)可能不是一项巨大的工作。在现实生活中,任何人的时间都不值得,只是观察而已。谢谢你发这个帖子;我有时想知道,为什么现代GCC似乎无法使用MMX自动生成vec,即使使用-march=pmmx
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