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