xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/avx512-trunc.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=x86_64-apple-darwin -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=KNL
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=SKX
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker attributes #0 = { nounwind }
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @trunc_16x32_to_16x8(<16 x i32> %i) #0 {
8*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_16x32_to_16x8:
9*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
10*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovdb %zmm0, %xmm0
11*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
12*9880d681SAndroid Build Coastguard Worker  %x = trunc <16 x i32> %i to <16 x i8>
13*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %x
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @trunc_8x64_to_8x16(<8 x i64> %i) #0 {
17*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_8x64_to_8x16:
18*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
19*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovqw %zmm0, %xmm0
20*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
21*9880d681SAndroid Build Coastguard Worker  %x = trunc <8 x i64> %i to <8 x i16>
22*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %x
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @trunc_v16i32_to_v16i16(<16 x i32> %x) #0 {
26*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_v16i32_to_v16i16:
27*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
28*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovdw %zmm0, %ymm0
29*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
30*9880d681SAndroid Build Coastguard Worker  %1 = trunc <16 x i32> %x to <16 x i16>
31*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %1
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @trunc_qb_512(<8 x i64> %i) #0 {
35*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qb_512:
36*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
37*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovqw %zmm0, %xmm0
38*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
39*9880d681SAndroid Build Coastguard Worker  %x = trunc <8 x i64> %i to <8 x i8>
40*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %x
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) #0 {
44*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qb_512_mem:
45*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
46*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovqb %zmm0, (%rdi)
47*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
48*9880d681SAndroid Build Coastguard Worker    %x = trunc <8 x i64> %i to <8 x i8>
49*9880d681SAndroid Build Coastguard Worker    store <8 x i8> %x, <8 x i8>* %res
50*9880d681SAndroid Build Coastguard Worker    ret void
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @trunc_qb_256(<4 x i64> %i) #0 {
54*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qb_256:
55*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
56*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
57*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovqd %zmm0, %ymm0
58*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
59*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
60*9880d681SAndroid Build Coastguard Worker;
61*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qb_256:
62*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
63*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqd %ymm0, %xmm0
64*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
65*9880d681SAndroid Build Coastguard Worker  %x = trunc <4 x i64> %i to <4 x i8>
66*9880d681SAndroid Build Coastguard Worker  ret <4 x i8> %x
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qb_256_mem(<4 x i64> %i, <4 x i8>* %res) #0 {
70*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qb_256_mem:
71*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
72*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
73*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovqd %zmm0, %ymm0
74*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
75*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovd %xmm0, (%rdi)
76*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
77*9880d681SAndroid Build Coastguard Worker;
78*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qb_256_mem:
79*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
80*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqb %ymm0, (%rdi)
81*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
82*9880d681SAndroid Build Coastguard Worker    %x = trunc <4 x i64> %i to <4 x i8>
83*9880d681SAndroid Build Coastguard Worker    store <4 x i8> %x, <4 x i8>* %res
84*9880d681SAndroid Build Coastguard Worker    ret void
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine <2 x i8> @trunc_qb_128(<2 x i64> %i) #0 {
88*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qb_128:
89*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
90*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
91*9880d681SAndroid Build Coastguard Worker  %x = trunc <2 x i64> %i to <2 x i8>
92*9880d681SAndroid Build Coastguard Worker  ret <2 x i8> %x
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qb_128_mem(<2 x i64> %i, <2 x i8>* %res) #0 {
96*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qb_128_mem:
97*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
98*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
99*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovd %xmm0, %eax
100*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    movw %ax, (%rdi)
101*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
102*9880d681SAndroid Build Coastguard Worker;
103*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qb_128_mem:
104*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
105*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqb %xmm0, (%rdi)
106*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
107*9880d681SAndroid Build Coastguard Worker    %x = trunc <2 x i64> %i to <2 x i8>
108*9880d681SAndroid Build Coastguard Worker    store <2 x i8> %x, <2 x i8>* %res
109*9880d681SAndroid Build Coastguard Worker    ret void
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @trunc_qw_512(<8 x i64> %i) #0 {
113*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qw_512:
114*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
115*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovqw %zmm0, %xmm0
116*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
117*9880d681SAndroid Build Coastguard Worker  %x = trunc <8 x i64> %i to <8 x i16>
118*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %x
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) #0 {
122*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qw_512_mem:
123*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
124*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovqw %zmm0, (%rdi)
125*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
126*9880d681SAndroid Build Coastguard Worker    %x = trunc <8 x i64> %i to <8 x i16>
127*9880d681SAndroid Build Coastguard Worker    store <8 x i16> %x, <8 x i16>* %res
128*9880d681SAndroid Build Coastguard Worker    ret void
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @trunc_qw_256(<4 x i64> %i) #0 {
132*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qw_256:
133*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
134*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
135*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovqd %zmm0, %ymm0
136*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
137*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
138*9880d681SAndroid Build Coastguard Worker;
139*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qw_256:
140*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
141*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqd %ymm0, %xmm0
142*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
143*9880d681SAndroid Build Coastguard Worker  %x = trunc <4 x i64> %i to <4 x i16>
144*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %x
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qw_256_mem(<4 x i64> %i, <4 x i16>* %res) #0 {
148*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qw_256_mem:
149*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
150*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
151*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovqd %zmm0, %ymm0
152*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
153*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovq %xmm0, (%rdi)
154*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
155*9880d681SAndroid Build Coastguard Worker;
156*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qw_256_mem:
157*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
158*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqw %ymm0, (%rdi)
159*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
160*9880d681SAndroid Build Coastguard Worker    %x = trunc <4 x i64> %i to <4 x i16>
161*9880d681SAndroid Build Coastguard Worker    store <4 x i16> %x, <4 x i16>* %res
162*9880d681SAndroid Build Coastguard Worker    ret void
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdefine <2 x i16> @trunc_qw_128(<2 x i64> %i) #0 {
166*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qw_128:
167*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
168*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
169*9880d681SAndroid Build Coastguard Worker  %x = trunc <2 x i64> %i to <2 x i16>
170*9880d681SAndroid Build Coastguard Worker  ret <2 x i16> %x
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qw_128_mem(<2 x i64> %i, <2 x i16>* %res) #0 {
174*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qw_128_mem:
175*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
176*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
177*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
178*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovd %xmm0, (%rdi)
179*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
180*9880d681SAndroid Build Coastguard Worker;
181*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qw_128_mem:
182*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
183*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqw %xmm0, (%rdi)
184*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
185*9880d681SAndroid Build Coastguard Worker    %x = trunc <2 x i64> %i to <2 x i16>
186*9880d681SAndroid Build Coastguard Worker    store <2 x i16> %x, <2 x i16>* %res
187*9880d681SAndroid Build Coastguard Worker    ret void
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @trunc_qd_512(<8 x i64> %i) #0 {
191*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qd_512:
192*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
193*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovqd %zmm0, %ymm0
194*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
195*9880d681SAndroid Build Coastguard Worker  %x = trunc <8 x i64> %i to <8 x i32>
196*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %x
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) #0 {
200*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qd_512_mem:
201*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
202*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovqd %zmm0, (%rdi)
203*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
204*9880d681SAndroid Build Coastguard Worker    %x = trunc <8 x i64> %i to <8 x i32>
205*9880d681SAndroid Build Coastguard Worker    store <8 x i32> %x, <8 x i32>* %res
206*9880d681SAndroid Build Coastguard Worker    ret void
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @trunc_qd_256(<4 x i64> %i) #0 {
210*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qd_256:
211*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
212*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
213*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovqd %zmm0, %ymm0
214*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
215*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
216*9880d681SAndroid Build Coastguard Worker;
217*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qd_256:
218*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
219*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqd %ymm0, %xmm0
220*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
221*9880d681SAndroid Build Coastguard Worker  %x = trunc <4 x i64> %i to <4 x i32>
222*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %x
223*9880d681SAndroid Build Coastguard Worker}
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qd_256_mem(<4 x i64> %i, <4 x i32>* %res) #0 {
226*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qd_256_mem:
227*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
228*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
229*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovqd %zmm0, %ymm0
230*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovaps %xmm0, (%rdi)
231*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
232*9880d681SAndroid Build Coastguard Worker;
233*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qd_256_mem:
234*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
235*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqd %ymm0, (%rdi)
236*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
237*9880d681SAndroid Build Coastguard Worker    %x = trunc <4 x i64> %i to <4 x i32>
238*9880d681SAndroid Build Coastguard Worker    store <4 x i32> %x, <4 x i32>* %res
239*9880d681SAndroid Build Coastguard Worker    ret void
240*9880d681SAndroid Build Coastguard Worker}
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @trunc_qd_128(<2 x i64> %i) #0 {
243*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_qd_128:
244*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
245*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
246*9880d681SAndroid Build Coastguard Worker  %x = trunc <2 x i64> %i to <2 x i32>
247*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %x
248*9880d681SAndroid Build Coastguard Worker}
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Workerdefine void @trunc_qd_128_mem(<2 x i64> %i, <2 x i32>* %res) #0 {
251*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_qd_128_mem:
252*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
253*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
254*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovq %xmm0, (%rdi)
255*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
256*9880d681SAndroid Build Coastguard Worker;
257*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_qd_128_mem:
258*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
259*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovqd %xmm0, (%rdi)
260*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
261*9880d681SAndroid Build Coastguard Worker    %x = trunc <2 x i64> %i to <2 x i32>
262*9880d681SAndroid Build Coastguard Worker    store <2 x i32> %x, <2 x i32>* %res
263*9880d681SAndroid Build Coastguard Worker    ret void
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @trunc_db_512(<16 x i32> %i) #0 {
267*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_db_512:
268*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
269*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovdb %zmm0, %xmm0
270*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
271*9880d681SAndroid Build Coastguard Worker  %x = trunc <16 x i32> %i to <16 x i8>
272*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %x
273*9880d681SAndroid Build Coastguard Worker}
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Workerdefine void @trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) #0 {
276*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_db_512_mem:
277*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
278*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovdb %zmm0, (%rdi)
279*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
280*9880d681SAndroid Build Coastguard Worker    %x = trunc <16 x i32> %i to <16 x i8>
281*9880d681SAndroid Build Coastguard Worker    store <16 x i8> %x, <16 x i8>* %res
282*9880d681SAndroid Build Coastguard Worker    ret void
283*9880d681SAndroid Build Coastguard Worker}
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @trunc_db_256(<8 x i32> %i) #0 {
286*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_db_256:
287*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
288*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
289*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdw %zmm0, %ymm0
290*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
291*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
292*9880d681SAndroid Build Coastguard Worker;
293*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_db_256:
294*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
295*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovdw %ymm0, %xmm0
296*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
297*9880d681SAndroid Build Coastguard Worker  %x = trunc <8 x i32> %i to <8 x i8>
298*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %x
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Workerdefine void @trunc_db_256_mem(<8 x i32> %i, <8 x i8>* %res) #0 {
302*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_db_256_mem:
303*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
304*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
305*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdw %zmm0, %ymm0
306*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
307*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovq %xmm0, (%rdi)
308*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
309*9880d681SAndroid Build Coastguard Worker;
310*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_db_256_mem:
311*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
312*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovdb %ymm0, (%rdi)
313*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
314*9880d681SAndroid Build Coastguard Worker    %x = trunc <8 x i32> %i to <8 x i8>
315*9880d681SAndroid Build Coastguard Worker    store <8 x i8> %x, <8 x i8>* %res
316*9880d681SAndroid Build Coastguard Worker    ret void
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @trunc_db_128(<4 x i32> %i) #0 {
320*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_db_128:
321*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
322*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
323*9880d681SAndroid Build Coastguard Worker  %x = trunc <4 x i32> %i to <4 x i8>
324*9880d681SAndroid Build Coastguard Worker  ret <4 x i8> %x
325*9880d681SAndroid Build Coastguard Worker}
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerdefine void @trunc_db_128_mem(<4 x i32> %i, <4 x i8>* %res) #0 {
328*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_db_128_mem:
329*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
330*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
331*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovd %xmm0, (%rdi)
332*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
333*9880d681SAndroid Build Coastguard Worker;
334*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_db_128_mem:
335*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
336*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovdb %xmm0, (%rdi)
337*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
338*9880d681SAndroid Build Coastguard Worker    %x = trunc <4 x i32> %i to <4 x i8>
339*9880d681SAndroid Build Coastguard Worker    store <4 x i8> %x, <4 x i8>* %res
340*9880d681SAndroid Build Coastguard Worker    ret void
341*9880d681SAndroid Build Coastguard Worker}
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Workerdefine <16 x i16> @trunc_dw_512(<16 x i32> %i) #0 {
344*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_dw_512:
345*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
346*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovdw %zmm0, %ymm0
347*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
348*9880d681SAndroid Build Coastguard Worker  %x = trunc <16 x i32> %i to <16 x i16>
349*9880d681SAndroid Build Coastguard Worker  ret <16 x i16> %x
350*9880d681SAndroid Build Coastguard Worker}
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Workerdefine void @trunc_dw_512_mem(<16 x i32> %i, <16 x i16>* %res) #0 {
353*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_dw_512_mem:
354*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
355*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    vpmovdw %zmm0, (%rdi)
356*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
357*9880d681SAndroid Build Coastguard Worker    %x = trunc <16 x i32> %i to <16 x i16>
358*9880d681SAndroid Build Coastguard Worker    store <16 x i16> %x, <16 x i16>* %res
359*9880d681SAndroid Build Coastguard Worker    ret void
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @trunc_dw_256(<8 x i32> %i) #0 {
363*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_dw_256:
364*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
365*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
366*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdw %zmm0, %ymm0
367*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
368*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
369*9880d681SAndroid Build Coastguard Worker;
370*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_dw_256:
371*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
372*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovdw %ymm0, %xmm0
373*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
374*9880d681SAndroid Build Coastguard Worker  %x = trunc <8 x i32> %i to <8 x i16>
375*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %x
376*9880d681SAndroid Build Coastguard Worker}
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerdefine void @trunc_dw_256_mem(<8 x i32> %i, <8 x i16>* %res) #0 {
379*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_dw_256_mem:
380*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
381*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
382*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdw %zmm0, %ymm0
383*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovaps %xmm0, (%rdi)
384*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
385*9880d681SAndroid Build Coastguard Worker;
386*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_dw_256_mem:
387*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
388*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovdw %ymm0, (%rdi)
389*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
390*9880d681SAndroid Build Coastguard Worker    %x = trunc <8 x i32> %i to <8 x i16>
391*9880d681SAndroid Build Coastguard Worker    store <8 x i16> %x, <8 x i16>* %res
392*9880d681SAndroid Build Coastguard Worker    ret void
393*9880d681SAndroid Build Coastguard Worker}
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Workerdefine void @trunc_dw_128_mem(<4 x i32> %i, <4 x i16>* %res) #0 {
396*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_dw_128_mem:
397*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
398*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
399*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovq %xmm0, (%rdi)
400*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
401*9880d681SAndroid Build Coastguard Worker;
402*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_dw_128_mem:
403*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
404*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovdw %xmm0, (%rdi)
405*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
406*9880d681SAndroid Build Coastguard Worker    %x = trunc <4 x i32> %i to <4 x i16>
407*9880d681SAndroid Build Coastguard Worker    store <4 x i16> %x, <4 x i16>* %res
408*9880d681SAndroid Build Coastguard Worker    ret void
409*9880d681SAndroid Build Coastguard Worker}
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @trunc_wb_512(<32 x i16> %i) #0 {
412*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_wb_512:
413*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
414*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
415*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdb %zmm0, %xmm0
416*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovsxwd %ymm1, %zmm1
417*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdb %zmm1, %xmm1
418*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
419*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
420*9880d681SAndroid Build Coastguard Worker;
421*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_wb_512:
422*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
423*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovwb %zmm0, %ymm0
424*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
425*9880d681SAndroid Build Coastguard Worker  %x = trunc <32 x i16> %i to <32 x i8>
426*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %x
427*9880d681SAndroid Build Coastguard Worker}
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Workerdefine void @trunc_wb_512_mem(<32 x i16> %i, <32 x i8>* %res) #0 {
430*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_wb_512_mem:
431*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
432*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
433*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdb %zmm0, %xmm0
434*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovsxwd %ymm1, %zmm1
435*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdb %zmm1, %xmm1
436*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
437*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovaps %ymm0, (%rdi)
438*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
439*9880d681SAndroid Build Coastguard Worker;
440*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_wb_512_mem:
441*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
442*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovwb %zmm0, (%rdi)
443*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
444*9880d681SAndroid Build Coastguard Worker    %x = trunc <32 x i16> %i to <32 x i8>
445*9880d681SAndroid Build Coastguard Worker    store <32 x i8> %x, <32 x i8>* %res
446*9880d681SAndroid Build Coastguard Worker    ret void
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @trunc_wb_256(<16 x i16> %i) #0 {
450*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_wb_256:
451*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
452*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
453*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdb %zmm0, %xmm0
454*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
455*9880d681SAndroid Build Coastguard Worker;
456*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_wb_256:
457*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
458*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovwb %ymm0, %xmm0
459*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
460*9880d681SAndroid Build Coastguard Worker  %x = trunc <16 x i16> %i to <16 x i8>
461*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %x
462*9880d681SAndroid Build Coastguard Worker}
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Workerdefine void @trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) #0 {
465*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_wb_256_mem:
466*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
467*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
468*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpmovdb %zmm0, %xmm0
469*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovaps %xmm0, (%rdi)
470*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
471*9880d681SAndroid Build Coastguard Worker;
472*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_wb_256_mem:
473*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
474*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
475*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
476*9880d681SAndroid Build Coastguard Worker    %x = trunc <16 x i16> %i to <16 x i8>
477*9880d681SAndroid Build Coastguard Worker    store <16 x i8> %x, <16 x i8>* %res
478*9880d681SAndroid Build Coastguard Worker    ret void
479*9880d681SAndroid Build Coastguard Worker}
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @trunc_wb_128(<8 x i16> %i) #0 {
482*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: trunc_wb_128:
483*9880d681SAndroid Build Coastguard Worker; ALL:       ## BB#0:
484*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
485*9880d681SAndroid Build Coastguard Worker  %x = trunc <8 x i16> %i to <8 x i8>
486*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %x
487*9880d681SAndroid Build Coastguard Worker}
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Workerdefine void @trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) #0 {
490*9880d681SAndroid Build Coastguard Worker; KNL-LABEL: trunc_wb_128_mem:
491*9880d681SAndroid Build Coastguard Worker; KNL:       ## BB#0:
492*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
493*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    vmovq %xmm0, (%rdi)
494*9880d681SAndroid Build Coastguard Worker; KNL-NEXT:    retq
495*9880d681SAndroid Build Coastguard Worker;
496*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: trunc_wb_128_mem:
497*9880d681SAndroid Build Coastguard Worker; SKX:       ## BB#0:
498*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    vpmovwb %xmm0, (%rdi)
499*9880d681SAndroid Build Coastguard Worker; SKX-NEXT:    retq
500*9880d681SAndroid Build Coastguard Worker    %x = trunc <8 x i16> %i to <8 x i8>
501*9880d681SAndroid Build Coastguard Worker    store <8 x i8> %x, <8 x i8>* %res
502*9880d681SAndroid Build Coastguard Worker    ret void
503*9880d681SAndroid Build Coastguard Worker}
504