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

Reply via email to