xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/fp-load-trunc.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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