Issue |
140693
|
Summary |
[X86] Poor emulation of cmpss pattern
|
Labels |
backend:X86,
missed-optimization
|
Assignees |
|
Reporter |
RKSimon
|
https://simd.godbolt.org/z/nqP1WxY1q
Inspired by #140563
```c
#include <x86intrin.h>
__m128 test_cmpeqss(__m128 x, __m128 y) {
int cmp = y[0] == x[0];
return _mm_setr_ps(__builtin_bit_cast(float, -cmp), x[1], x[2], x[3]);
}
```
We never quite manage to recreate the single (v)cmpeqss
-march=x86-64
```asm
test_cmpeqss: # @test_cmpeqss
# %bb.0: # %entry
cmpeqss %xmm0, %xmm1
movss %xmm1, %xmm0 # xmm0 = xmm1[0],xmm0[1,2,3]
retq
```
-march=x86-64-v3
```asm
test_cmpeqss: # @test_cmpeqss
# %bb.0: # %entry
vcmpeqss %xmm0, %xmm1, %xmm1
vmovd %xmm1, %eax
vmovd %eax, %xmm1
vblendps $1, %xmm1, %xmm0, %xmm0 # xmm0 = xmm1[0],xmm0[1,2,3]
retq
```
-march=x86-64-v4
```asm
test_cmpeqss: # @test_cmpeqss
# %bb.0: # %entry
vcmpeqss %xmm0, %xmm1, %k0
kmovw %k0, %eax
negl %eax
vmovd %eax, %xmm1
vblendps $1, %xmm1, %xmm0, %xmm0 # xmm0 = xmm1[0],xmm0[1,2,3]
retq
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs