Files
clang-p2996/llvm/test/CodeGen/X86/cvtv2f32.ll
Simon Pilgrim a2a0089ac3 [X86] movsd/movss/movd/movq - add support for constant comments (#78601)
If we're loading a constant value, print the constant (and the zero upper elements) instead of just the shuffle mask.

This did require me to move the shuffle mask handling into addConstantComments as we can't handle this in the MC layer.
2024-01-19 14:21:26 +00:00

95 lines
3.6 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=i686-linux-pc -mcpu=corei7 | FileCheck %s --check-prefix=X86
; RUN: llc < %s -mtriple=x86_64-linux-pc -mcpu=corei7 | FileCheck %s --check-prefix=X64
; uitofp <2 x i32> codegen from buildvector or legalization is different but gives the same results
; across the full 0 - 0xFFFFFFFF u32 range.
define <2 x float> @uitofp_2i32_cvt_buildvector(i32 %x, i32 %y, <2 x float> %v) {
; X86-LABEL: uitofp_2i32_cvt_buildvector:
; X86: # %bb.0:
; X86-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
; X86-NEXT: movsd {{.*#+}} xmm2 = [4.503599627370496E+15,0.0E+0]
; X86-NEXT: orpd %xmm2, %xmm1
; X86-NEXT: subsd %xmm2, %xmm1
; X86-NEXT: cvtsd2ss %xmm1, %xmm1
; X86-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
; X86-NEXT: orpd %xmm2, %xmm3
; X86-NEXT: subsd %xmm2, %xmm3
; X86-NEXT: xorps %xmm2, %xmm2
; X86-NEXT: cvtsd2ss %xmm3, %xmm2
; X86-NEXT: insertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
; X86-NEXT: mulps %xmm1, %xmm0
; X86-NEXT: retl
;
; X64-LABEL: uitofp_2i32_cvt_buildvector:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
; X64-NEXT: cvtsi2ss %rax, %xmm1
; X64-NEXT: movl %esi, %eax
; X64-NEXT: cvtsi2ss %rax, %xmm2
; X64-NEXT: insertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]
; X64-NEXT: mulps %xmm1, %xmm0
; X64-NEXT: retq
%t1 = uitofp i32 %x to float
%t2 = insertelement <2 x float> undef, float %t1, i32 0
%t3 = uitofp i32 %y to float
%t4 = insertelement <2 x float> %t2, float %t3, i32 1
%t5 = fmul <2 x float> %v, %t4
ret <2 x float> %t5
}
define <2 x float> @uitofp_2i32_buildvector_cvt(i32 %x, i32 %y, <2 x float> %v) {
; X86-LABEL: uitofp_2i32_buildvector_cvt:
; X86: # %bb.0:
; X86-NEXT: movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]
; X86-NEXT: pmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
; X86-NEXT: por %xmm1, %xmm2
; X86-NEXT: subpd %xmm1, %xmm2
; X86-NEXT: cvtpd2ps %xmm2, %xmm1
; X86-NEXT: mulps %xmm1, %xmm0
; X86-NEXT: retl
;
; X64-LABEL: uitofp_2i32_buildvector_cvt:
; X64: # %bb.0:
; X64-NEXT: movd %edi, %xmm1
; X64-NEXT: pinsrd $1, %esi, %xmm1
; X64-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
; X64-NEXT: movdqa {{.*#+}} xmm2 = [4.503599627370496E+15,4.503599627370496E+15]
; X64-NEXT: por %xmm2, %xmm1
; X64-NEXT: subpd %xmm2, %xmm1
; X64-NEXT: cvtpd2ps %xmm1, %xmm1
; X64-NEXT: mulps %xmm1, %xmm0
; X64-NEXT: retq
%t1 = insertelement <2 x i32> undef, i32 %x, i32 0
%t2 = insertelement <2 x i32> %t1, i32 %y, i32 1
%t3 = uitofp <2 x i32> %t2 to <2 x float>
%t4 = fmul <2 x float> %v, %t3
ret <2 x float> %t4
}
define <2 x float> @uitofp_2i32_legalized(<2 x i32> %in, <2 x float> %v) {
; X86-LABEL: uitofp_2i32_legalized:
; X86: # %bb.0:
; X86-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
; X86-NEXT: movdqa {{.*#+}} xmm2 = [4.503599627370496E+15,4.503599627370496E+15]
; X86-NEXT: por %xmm2, %xmm0
; X86-NEXT: subpd %xmm2, %xmm0
; X86-NEXT: cvtpd2ps %xmm0, %xmm0
; X86-NEXT: mulps %xmm1, %xmm0
; X86-NEXT: retl
;
; X64-LABEL: uitofp_2i32_legalized:
; X64: # %bb.0:
; X64-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
; X64-NEXT: movdqa {{.*#+}} xmm2 = [4.503599627370496E+15,4.503599627370496E+15]
; X64-NEXT: por %xmm2, %xmm0
; X64-NEXT: subpd %xmm2, %xmm0
; X64-NEXT: cvtpd2ps %xmm0, %xmm0
; X64-NEXT: mulps %xmm1, %xmm0
; X64-NEXT: retq
%t1 = uitofp <2 x i32> %in to <2 x float>
%t2 = fmul <2 x float> %v, %t1
ret <2 x float> %t2
}