Files
clang-p2996/llvm/test/CodeGen/X86/vec_fneg.ll
Roman Lebedev 0aef747b84 [NFC][X86][Codegen] Megacommit: mass-regenerate all check lines that were already autogenerated
The motivation is that the update script has at least two deviations
(`<...>@GOT`/`<...>@PLT`/ and not hiding pointer arithmetics) from
what pretty much all the checklines were generated with,
and most of the tests are still not updated, so each time one of the
non-up-to-date tests is updated to see the effect of the code change,
there is a lot of noise. Instead of having to deal with that each
time, let's just deal with everything at once.

This has been done via:
```
cd llvm-project/llvm/test/CodeGen/X86
grep -rl "; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py" | xargs -L1 <...>/llvm-project/llvm/utils/update_llc_test_checks.py --llc-binary <...>/llvm-project/build/bin/llc
```

Not all tests were regenerated, however.
2021-06-11 23:57:02 +03:00

209 lines
6.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse | FileCheck %s --check-prefix=X32-SSE --check-prefix=X32-SSE1
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X32-SSE --check-prefix=X32-SSE2
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=-sse2 | FileCheck %s --check-prefix=X64-SSE --check-prefix=X64-SSE1
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64-SSE --check-prefix=X64-SSE2
; FNEG is defined as subtraction from -0.0.
; This test verifies that we use an xor with a constant to flip the sign bits; no subtraction needed.
define <4 x float> @t1(<4 x float> %Q) nounwind {
; X32-SSE-LABEL: t1:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: t1:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; X64-SSE-NEXT: retq
%tmp = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %Q
ret <4 x float> %tmp
}
; Possibly misplaced test, but since we're checking undef scenarios...
define float @scalar_fsub_neg0_undef(float %x) nounwind {
; X32-SSE-LABEL: scalar_fsub_neg0_undef:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: fldz
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: scalar_fsub_neg0_undef:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: retq
%r = fsub float -0.0, undef
ret float %r
}
define float @scalar_fneg_undef(float %x) nounwind {
; X32-SSE-LABEL: scalar_fneg_undef:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: fldz
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: scalar_fneg_undef:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: retq
%r = fneg float undef
ret float %r
}
define <4 x float> @fsub_neg0_undef(<4 x float> %Q) nounwind {
; X32-SSE-LABEL: fsub_neg0_undef:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: fsub_neg0_undef:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: retq
%r = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, undef
ret <4 x float> %r
}
define <4 x float> @fneg_undef(<4 x float> %Q) nounwind {
; X32-SSE-LABEL: fneg_undef:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: fneg_undef:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: retq
%r = fneg <4 x float> undef
ret <4 x float> %r
}
define <4 x float> @fsub_neg0_undef_elts_undef(<4 x float> %x) {
; X32-SSE-LABEL: fsub_neg0_undef_elts_undef:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: fsub_neg0_undef_elts_undef:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: retq
%r = fsub <4 x float> <float -0.0, float undef, float undef, float -0.0>, undef
ret <4 x float> %r
}
; This test verifies that we generate an FP subtraction because "0.0 - x" is not an fneg.
define <4 x float> @t2(<4 x float> %Q) nounwind {
; X32-SSE-LABEL: t2:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: xorps %xmm1, %xmm1
; X32-SSE-NEXT: subps %xmm0, %xmm1
; X32-SSE-NEXT: movaps %xmm1, %xmm0
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: t2:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: xorps %xmm1, %xmm1
; X64-SSE-NEXT: subps %xmm0, %xmm1
; X64-SSE-NEXT: movaps %xmm1, %xmm0
; X64-SSE-NEXT: retq
%tmp = fsub <4 x float> zeroinitializer, %Q
ret <4 x float> %tmp
}
; If we're bitcasting an integer to an FP vector, we should avoid the FPU/vector unit entirely.
; Make sure that we're flipping the sign bit and only the sign bit of each float.
; So instead of something like this:
; movd %rdi, %xmm0
; xorps .LCPI2_0(%rip), %xmm0
;
; We should generate:
; movabsq (put sign bit mask in integer register))
; xorq (flip sign bits)
; movd (move to xmm return register)
define <2 x float> @fneg_bitcast(i64 %i) nounwind {
; X32-SSE1-LABEL: fneg_bitcast:
; X32-SSE1: # %bb.0:
; X32-SSE1-NEXT: pushl %ebp
; X32-SSE1-NEXT: movl %esp, %ebp
; X32-SSE1-NEXT: andl $-16, %esp
; X32-SSE1-NEXT: subl $16, %esp
; X32-SSE1-NEXT: movl $-2147483648, %eax # imm = 0x80000000
; X32-SSE1-NEXT: movl 12(%ebp), %ecx
; X32-SSE1-NEXT: xorl %eax, %ecx
; X32-SSE1-NEXT: movl %ecx, {{[0-9]+}}(%esp)
; X32-SSE1-NEXT: xorl 8(%ebp), %eax
; X32-SSE1-NEXT: movl %eax, (%esp)
; X32-SSE1-NEXT: movaps (%esp), %xmm0
; X32-SSE1-NEXT: movl %ebp, %esp
; X32-SSE1-NEXT: popl %ebp
; X32-SSE1-NEXT: retl
;
; X32-SSE2-LABEL: fneg_bitcast:
; X32-SSE2: # %bb.0:
; X32-SSE2-NEXT: movl $-2147483648, %eax # imm = 0x80000000
; X32-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X32-SSE2-NEXT: xorl %eax, %ecx
; X32-SSE2-NEXT: movd %ecx, %xmm1
; X32-SSE2-NEXT: xorl {{[0-9]+}}(%esp), %eax
; X32-SSE2-NEXT: movd %eax, %xmm0
; X32-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
; X32-SSE2-NEXT: retl
;
; X64-SSE1-LABEL: fneg_bitcast:
; X64-SSE1: # %bb.0:
; X64-SSE1-NEXT: movabsq $-9223372034707292160, %rax # imm = 0x8000000080000000
; X64-SSE1-NEXT: xorq %rdi, %rax
; X64-SSE1-NEXT: movq %rax, -{{[0-9]+}}(%rsp)
; X64-SSE1-NEXT: movaps -{{[0-9]+}}(%rsp), %xmm0
; X64-SSE1-NEXT: retq
;
; X64-SSE2-LABEL: fneg_bitcast:
; X64-SSE2: # %bb.0:
; X64-SSE2-NEXT: movabsq $-9223372034707292160, %rax # imm = 0x8000000080000000
; X64-SSE2-NEXT: xorq %rdi, %rax
; X64-SSE2-NEXT: movq %rax, %xmm0
; X64-SSE2-NEXT: retq
%bitcast = bitcast i64 %i to <2 x float>
%fneg = fsub <2 x float> <float -0.0, float -0.0>, %bitcast
ret <2 x float> %fneg
}
define <4 x float> @fneg_undef_elts_v4f32(<4 x float> %x) {
; X32-SSE-LABEL: fneg_undef_elts_v4f32:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: fneg_undef_elts_v4f32:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; X64-SSE-NEXT: retq
%r = fsub <4 x float> <float -0.0, float undef, float undef, float -0.0>, %x
ret <4 x float> %r
}
; This isn't fneg, but similarly check that (X - 0.0) is simplified.
define <4 x float> @fsub0_undef_elts_v4f32(<4 x float> %x) {
; X32-SSE-LABEL: fsub0_undef_elts_v4f32:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: fsub0_undef_elts_v4f32:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: retq
%r = fsub <4 x float> %x, <float 0.0, float undef, float 0.0, float undef>
ret <4 x float> %r
}
define <4 x float> @fneg(<4 x float> %Q) nounwind {
; X32-SSE-LABEL: fneg:
; X32-SSE: # %bb.0:
; X32-SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
; X32-SSE-NEXT: retl
;
; X64-SSE-LABEL: fneg:
; X64-SSE: # %bb.0:
; X64-SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; X64-SSE-NEXT: retq
%tmp = fneg <4 x float> %Q
ret <4 x float> %tmp
}