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