1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx | FileCheck %s --check-prefix=X32-AVX 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X64-SSE 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=X64-AVX 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine void @fptrunc_frommem2(<2 x double>* %in, <2 x float>* %out) { 8*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: fptrunc_frommem2: 9*9880d681SAndroid Build Coastguard Worker; X32-SSE: # BB#0: # %entry 10*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 11*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 12*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps (%ecx), %xmm0 13*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: extractps $1, %xmm0, 4(%eax) 14*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movss %xmm0, (%eax) 15*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: retl 16*9880d681SAndroid Build Coastguard Worker; 17*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: fptrunc_frommem2: 18*9880d681SAndroid Build Coastguard Worker; X32-AVX: # BB#0: # %entry 19*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 20*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 21*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vcvtpd2psx (%ecx), %xmm0 22*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vextractps $1, %xmm0, 4(%eax) 23*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vmovss %xmm0, (%eax) 24*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: retl 25*9880d681SAndroid Build Coastguard Worker; 26*9880d681SAndroid Build Coastguard Worker; X64-SSE-LABEL: fptrunc_frommem2: 27*9880d681SAndroid Build Coastguard Worker; X64-SSE: # BB#0: # %entry 28*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps (%rdi), %xmm0 29*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: movlpd %xmm0, (%rsi) 30*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: retq 31*9880d681SAndroid Build Coastguard Worker; 32*9880d681SAndroid Build Coastguard Worker; X64-AVX-LABEL: fptrunc_frommem2: 33*9880d681SAndroid Build Coastguard Worker; X64-AVX: # BB#0: # %entry 34*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vcvtpd2psx (%rdi), %xmm0 35*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vmovlpd %xmm0, (%rsi) 36*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: retq 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker %0 = load <2 x double>, <2 x double>* %in 39*9880d681SAndroid Build Coastguard Worker %1 = fptrunc <2 x double> %0 to <2 x float> 40*9880d681SAndroid Build Coastguard Worker store <2 x float> %1, <2 x float>* %out, align 1 41*9880d681SAndroid Build Coastguard Worker ret void 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine void @fptrunc_frommem4(<4 x double>* %in, <4 x float>* %out) { 45*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: fptrunc_frommem4: 46*9880d681SAndroid Build Coastguard Worker; X32-SSE: # BB#0: # %entry 47*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 48*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 49*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps 16(%ecx), %xmm0 50*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps (%ecx), %xmm1 51*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] 52*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movupd %xmm1, (%eax) 53*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: retl 54*9880d681SAndroid Build Coastguard Worker; 55*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: fptrunc_frommem4: 56*9880d681SAndroid Build Coastguard Worker; X32-AVX: # BB#0: # %entry 57*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 58*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 59*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vcvtpd2psy (%ecx), %xmm0 60*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vmovupd %xmm0, (%eax) 61*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: retl 62*9880d681SAndroid Build Coastguard Worker; 63*9880d681SAndroid Build Coastguard Worker; X64-SSE-LABEL: fptrunc_frommem4: 64*9880d681SAndroid Build Coastguard Worker; X64-SSE: # BB#0: # %entry 65*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps 16(%rdi), %xmm0 66*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps (%rdi), %xmm1 67*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] 68*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: movupd %xmm1, (%rsi) 69*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: retq 70*9880d681SAndroid Build Coastguard Worker; 71*9880d681SAndroid Build Coastguard Worker; X64-AVX-LABEL: fptrunc_frommem4: 72*9880d681SAndroid Build Coastguard Worker; X64-AVX: # BB#0: # %entry 73*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vcvtpd2psy (%rdi), %xmm0 74*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vmovupd %xmm0, (%rsi) 75*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: retq 76*9880d681SAndroid Build Coastguard Workerentry: 77*9880d681SAndroid Build Coastguard Worker %0 = load <4 x double>, <4 x double>* %in 78*9880d681SAndroid Build Coastguard Worker %1 = fptrunc <4 x double> %0 to <4 x float> 79*9880d681SAndroid Build Coastguard Worker store <4 x float> %1, <4 x float>* %out, align 1 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine void @fptrunc_frommem8(<8 x double>* %in, <8 x float>* %out) { 84*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: fptrunc_frommem8: 85*9880d681SAndroid Build Coastguard Worker; X32-SSE: # BB#0: # %entry 86*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 87*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 88*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps 16(%ecx), %xmm0 89*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps (%ecx), %xmm1 90*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] 91*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps 48(%ecx), %xmm0 92*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps 32(%ecx), %xmm2 93*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm0[0] 94*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movupd %xmm2, 16(%eax) 95*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: movupd %xmm1, (%eax) 96*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: retl 97*9880d681SAndroid Build Coastguard Worker; 98*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: fptrunc_frommem8: 99*9880d681SAndroid Build Coastguard Worker; X32-AVX: # BB#0: # %entry 100*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 101*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 102*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vcvtpd2psy (%ecx), %xmm0 103*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vcvtpd2psy 32(%ecx), %xmm1 104*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 105*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vmovupd %ymm0, (%eax) 106*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vzeroupper 107*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: retl 108*9880d681SAndroid Build Coastguard Worker; 109*9880d681SAndroid Build Coastguard Worker; X64-SSE-LABEL: fptrunc_frommem8: 110*9880d681SAndroid Build Coastguard Worker; X64-SSE: # BB#0: # %entry 111*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps 16(%rdi), %xmm0 112*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps (%rdi), %xmm1 113*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] 114*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps 48(%rdi), %xmm0 115*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps 32(%rdi), %xmm2 116*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm0[0] 117*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: movupd %xmm2, 16(%rsi) 118*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: movupd %xmm1, (%rsi) 119*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: retq 120*9880d681SAndroid Build Coastguard Worker; 121*9880d681SAndroid Build Coastguard Worker; X64-AVX-LABEL: fptrunc_frommem8: 122*9880d681SAndroid Build Coastguard Worker; X64-AVX: # BB#0: # %entry 123*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vcvtpd2psy (%rdi), %xmm0 124*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vcvtpd2psy 32(%rdi), %xmm1 125*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 126*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vmovupd %ymm0, (%rsi) 127*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vzeroupper 128*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: retq 129*9880d681SAndroid Build Coastguard Workerentry: 130*9880d681SAndroid Build Coastguard Worker %0 = load <8 x double>, <8 x double>* %in 131*9880d681SAndroid Build Coastguard Worker %1 = fptrunc <8 x double> %0 to <8 x float> 132*9880d681SAndroid Build Coastguard Worker store <8 x float> %1, <8 x float>* %out, align 1 133*9880d681SAndroid Build Coastguard Worker ret void 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; FIXME: For exact truncations we should be able to fold this. 137*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @fptrunc_fromconst() { 138*9880d681SAndroid Build Coastguard Worker; X32-SSE-LABEL: fptrunc_fromconst: 139*9880d681SAndroid Build Coastguard Worker; X32-SSE: # BB#0: # %entry 140*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps .LCPI3_0, %xmm1 141*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: cvtpd2ps .LCPI3_1, %xmm0 142*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 143*9880d681SAndroid Build Coastguard Worker; X32-SSE-NEXT: retl 144*9880d681SAndroid Build Coastguard Worker; 145*9880d681SAndroid Build Coastguard Worker; X32-AVX-LABEL: fptrunc_fromconst: 146*9880d681SAndroid Build Coastguard Worker; X32-AVX: # BB#0: # %entry 147*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: vcvtpd2psy .LCPI3_0, %xmm0 148*9880d681SAndroid Build Coastguard Worker; X32-AVX-NEXT: retl 149*9880d681SAndroid Build Coastguard Worker; 150*9880d681SAndroid Build Coastguard Worker; X64-SSE-LABEL: fptrunc_fromconst: 151*9880d681SAndroid Build Coastguard Worker; X64-SSE: # BB#0: # %entry 152*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps {{.*}}(%rip), %xmm1 153*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: cvtpd2ps {{.*}}(%rip), %xmm0 154*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 155*9880d681SAndroid Build Coastguard Worker; X64-SSE-NEXT: retq 156*9880d681SAndroid Build Coastguard Worker; 157*9880d681SAndroid Build Coastguard Worker; X64-AVX-LABEL: fptrunc_fromconst: 158*9880d681SAndroid Build Coastguard Worker; X64-AVX: # BB#0: # %entry 159*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: vcvtpd2psy {{.*}}(%rip), %xmm0 160*9880d681SAndroid Build Coastguard Worker; X64-AVX-NEXT: retq 161*9880d681SAndroid Build Coastguard Workerentry: 162*9880d681SAndroid Build Coastguard Worker %0 = insertelement <4 x double> undef, double 1.0, i32 0 163*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x double> %0, double -2.0, i32 1 164*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x double> %1, double +4.0, i32 2 165*9880d681SAndroid Build Coastguard Worker %3 = insertelement <4 x double> %2, double -0.0, i32 3 166*9880d681SAndroid Build Coastguard Worker %4 = fptrunc <4 x double> %3 to <4 x float> 167*9880d681SAndroid Build Coastguard Worker ret <4 x float> %4 168*9880d681SAndroid Build Coastguard Worker} 169