有没有办法用gcc自动生成MMX指令(不是SSE)
Is there a way to auto-generate MMX instructions (not SSE) with gcc
看来 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+mmx 编译没有任何区别。
GCC 无法使用 MMX 或 3DNow 进行自动矢量化!因为它缺乏正确插入 EMMS/FEMMS 的能力。 MMX 必须使用 ICC。参见 https://gcc.gnu.org/ml/gcc-patches/2004-12/msg01955.html
看来 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+mmx 编译没有任何区别。
GCC 无法使用 MMX 或 3DNow 进行自动矢量化!因为它缺乏正确插入 EMMS/FEMMS 的能力。 MMX 必须使用 ICC。参见 https://gcc.gnu.org/ml/gcc-patches/2004-12/msg01955.html