1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=corei7 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=core-avx-i | FileCheck %s --check-prefix=AVX 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine <1 x float> @test1(<1 x double>* %p) nounwind { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 6*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl %eax 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd (%eax), %xmm0 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtsd2ss %xmm0, %xmm0 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss %xmm0, (%esp) 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: flds (%esp) 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: popl %eax 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 15*9880d681SAndroid Build Coastguard Worker; 16*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test1: 17*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 18*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: pushl %eax 19*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 20*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd (%eax), %xmm0 21*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vcvtsd2ss %xmm0, %xmm0, %xmm0 22*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovss %xmm0, (%esp) 23*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: flds (%esp) 24*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: popl %eax 25*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retl 26*9880d681SAndroid Build Coastguard Worker %x = load <1 x double>, <1 x double>* %p 27*9880d681SAndroid Build Coastguard Worker %y = fptrunc <1 x double> %x to <1 x float> 28*9880d681SAndroid Build Coastguard Worker ret <1 x float> %y 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test2(<2 x double>* %p) nounwind { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 33*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps (%eax), %xmm0 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 37*9880d681SAndroid Build Coastguard Worker; 38*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2: 39*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 40*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 41*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vcvtpd2psx (%eax), %xmm0 42*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retl 43*9880d681SAndroid Build Coastguard Worker %x = load <2 x double>, <2 x double>* %p 44*9880d681SAndroid Build Coastguard Worker %y = fptrunc <2 x double> %x to <2 x float> 45*9880d681SAndroid Build Coastguard Worker ret <2 x float> %y 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test3(<4 x double>* %p) nounwind { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 50*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps 16(%eax), %xmm1 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps (%eax), %xmm0 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 56*9880d681SAndroid Build Coastguard Worker; 57*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test3: 58*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 59*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 60*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vcvtpd2psy (%eax), %xmm0 61*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retl 62*9880d681SAndroid Build Coastguard Worker %x = load <4 x double>, <4 x double>* %p 63*9880d681SAndroid Build Coastguard Worker %y = fptrunc <4 x double> %x to <4 x float> 64*9880d681SAndroid Build Coastguard Worker ret <4 x float> %y 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test4(<8 x double>* %p) nounwind { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 69*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps 16(%eax), %xmm1 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps (%eax), %xmm0 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps 48(%eax), %xmm2 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cvtpd2ps 32(%eax), %xmm1 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0] 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 78*9880d681SAndroid Build Coastguard Worker; 79*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test4: 80*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 81*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 82*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vcvtpd2psy (%eax), %xmm0 83*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vcvtpd2psy 32(%eax), %xmm1 84*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 85*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retl 86*9880d681SAndroid Build Coastguard Worker %x = load <8 x double>, <8 x double>* %p 87*9880d681SAndroid Build Coastguard Worker %y = fptrunc <8 x double> %x to <8 x float> 88*9880d681SAndroid Build Coastguard Worker ret <8 x float> %y 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker 92