Skip to content

Commit 92d8222

Browse files
authored
[LoongArch] Pre-commit tests for vector sext & zext (#128835)
1 parent ae839b0 commit 92d8222

File tree

2 files changed

+778
-0
lines changed

2 files changed

+778
-0
lines changed
Lines changed: 394 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,394 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx %s -o - | FileCheck %s
3+
4+
5+
define void @load_sext_2i8_to_2i64(ptr %ptr, ptr %dst) {
6+
; CHECK-LABEL: load_sext_2i8_to_2i64:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: ld.b $a2, $a0, 0
9+
; CHECK-NEXT: ld.b $a0, $a0, 1
10+
; CHECK-NEXT: vinsgr2vr.d $vr0, $a2, 0
11+
; CHECK-NEXT: vinsgr2vr.d $vr0, $a0, 1
12+
; CHECK-NEXT: vst $vr0, $a1, 0
13+
; CHECK-NEXT: ret
14+
entry:
15+
%A = load <2 x i8>, ptr %ptr
16+
%B = sext <2 x i8> %A to <2 x i64>
17+
store <2 x i64> %B, ptr %dst
18+
ret void
19+
}
20+
21+
define void @load_sext_4i8_to_4i32(ptr %ptr, ptr %dst) {
22+
; CHECK-LABEL: load_sext_4i8_to_4i32:
23+
; CHECK: # %bb.0: # %entry
24+
; CHECK-NEXT: ld.b $a2, $a0, 0
25+
; CHECK-NEXT: ld.b $a3, $a0, 1
26+
; CHECK-NEXT: ld.b $a4, $a0, 2
27+
; CHECK-NEXT: ld.b $a0, $a0, 3
28+
; CHECK-NEXT: vinsgr2vr.w $vr0, $a2, 0
29+
; CHECK-NEXT: vinsgr2vr.w $vr0, $a3, 1
30+
; CHECK-NEXT: vinsgr2vr.w $vr0, $a4, 2
31+
; CHECK-NEXT: vinsgr2vr.w $vr0, $a0, 3
32+
; CHECK-NEXT: vst $vr0, $a1, 0
33+
; CHECK-NEXT: ret
34+
entry:
35+
%A = load <4 x i8>, ptr %ptr
36+
%B = sext <4 x i8> %A to <4 x i32>
37+
store <4 x i32> %B, ptr %dst
38+
ret void
39+
}
40+
41+
define void @load_sext_8i8_to_8i16(ptr %ptr, ptr %dst) {
42+
; CHECK-LABEL: load_sext_8i8_to_8i16:
43+
; CHECK: # %bb.0: # %entry
44+
; CHECK-NEXT: ld.b $a2, $a0, 0
45+
; CHECK-NEXT: ld.b $a3, $a0, 1
46+
; CHECK-NEXT: ld.b $a4, $a0, 2
47+
; CHECK-NEXT: ld.b $a5, $a0, 3
48+
; CHECK-NEXT: vinsgr2vr.h $vr0, $a2, 0
49+
; CHECK-NEXT: vinsgr2vr.h $vr0, $a3, 1
50+
; CHECK-NEXT: vinsgr2vr.h $vr0, $a4, 2
51+
; CHECK-NEXT: vinsgr2vr.h $vr0, $a5, 3
52+
; CHECK-NEXT: ld.b $a2, $a0, 4
53+
; CHECK-NEXT: ld.b $a3, $a0, 5
54+
; CHECK-NEXT: ld.b $a4, $a0, 6
55+
; CHECK-NEXT: ld.b $a0, $a0, 7
56+
; CHECK-NEXT: vinsgr2vr.h $vr0, $a2, 4
57+
; CHECK-NEXT: vinsgr2vr.h $vr0, $a3, 5
58+
; CHECK-NEXT: vinsgr2vr.h $vr0, $a4, 6
59+
; CHECK-NEXT: vinsgr2vr.h $vr0, $a0, 7
60+
; CHECK-NEXT: vst $vr0, $a1, 0
61+
; CHECK-NEXT: ret
62+
entry:
63+
%A = load <8 x i8>, ptr %ptr
64+
%B = sext <8 x i8> %A to <8 x i16>
65+
store <8 x i16> %B, ptr %dst
66+
ret void
67+
}
68+
69+
define void @load_sext_2i16_to_2i64(ptr %ptr, ptr %dst) {
70+
; CHECK-LABEL: load_sext_2i16_to_2i64:
71+
; CHECK: # %bb.0: # %entry
72+
; CHECK-NEXT: ld.h $a2, $a0, 0
73+
; CHECK-NEXT: ld.h $a0, $a0, 2
74+
; CHECK-NEXT: vinsgr2vr.d $vr0, $a2, 0
75+
; CHECK-NEXT: vinsgr2vr.d $vr0, $a0, 1
76+
; CHECK-NEXT: vst $vr0, $a1, 0
77+
; CHECK-NEXT: ret
78+
entry:
79+
%A = load <2 x i16>, ptr %ptr
80+
%B = sext <2 x i16> %A to <2 x i64>
81+
store <2 x i64> %B, ptr %dst
82+
ret void
83+
}
84+
85+
define void @load_sext_4i16_to_4i32(ptr %ptr, ptr %dst) {
86+
; CHECK-LABEL: load_sext_4i16_to_4i32:
87+
; CHECK: # %bb.0: # %entry
88+
; CHECK-NEXT: ld.h $a2, $a0, 0
89+
; CHECK-NEXT: ld.h $a3, $a0, 2
90+
; CHECK-NEXT: ld.h $a4, $a0, 4
91+
; CHECK-NEXT: ld.h $a0, $a0, 6
92+
; CHECK-NEXT: vinsgr2vr.w $vr0, $a2, 0
93+
; CHECK-NEXT: vinsgr2vr.w $vr0, $a3, 1
94+
; CHECK-NEXT: vinsgr2vr.w $vr0, $a4, 2
95+
; CHECK-NEXT: vinsgr2vr.w $vr0, $a0, 3
96+
; CHECK-NEXT: vst $vr0, $a1, 0
97+
; CHECK-NEXT: ret
98+
entry:
99+
%A = load <4 x i16>, ptr %ptr
100+
%B = sext <4 x i16> %A to <4 x i32>
101+
store <4 x i32> %B, ptr %dst
102+
ret void
103+
}
104+
105+
define void @load_sext_2i32_to_2i64(ptr %ptr, ptr %dst) {
106+
; CHECK-LABEL: load_sext_2i32_to_2i64:
107+
; CHECK: # %bb.0: # %entry
108+
; CHECK-NEXT: ld.w $a2, $a0, 0
109+
; CHECK-NEXT: ld.w $a0, $a0, 4
110+
; CHECK-NEXT: vinsgr2vr.d $vr0, $a2, 0
111+
; CHECK-NEXT: vinsgr2vr.d $vr0, $a0, 1
112+
; CHECK-NEXT: vst $vr0, $a1, 0
113+
; CHECK-NEXT: ret
114+
entry:
115+
%A = load <2 x i32>, ptr %ptr
116+
%B = sext <2 x i32> %A to <2 x i64>
117+
store <2 x i64> %B, ptr %dst
118+
ret void
119+
}
120+
121+
define void @load_sext_16i8_to_16i16(ptr %ptr, ptr %dst) {
122+
; CHECK-LABEL: load_sext_16i8_to_16i16:
123+
; CHECK: # %bb.0: # %entry
124+
; CHECK-NEXT: vld $vr0, $a0, 0
125+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 0
126+
; CHECK-NEXT: vinsgr2vr.h $vr1, $a0, 0
127+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 1
128+
; CHECK-NEXT: vinsgr2vr.h $vr1, $a0, 1
129+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 2
130+
; CHECK-NEXT: vinsgr2vr.h $vr1, $a0, 2
131+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 3
132+
; CHECK-NEXT: vinsgr2vr.h $vr1, $a0, 3
133+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 4
134+
; CHECK-NEXT: vinsgr2vr.h $vr1, $a0, 4
135+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 5
136+
; CHECK-NEXT: vinsgr2vr.h $vr1, $a0, 5
137+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 6
138+
; CHECK-NEXT: vinsgr2vr.h $vr1, $a0, 6
139+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 7
140+
; CHECK-NEXT: vinsgr2vr.h $vr1, $a0, 7
141+
; CHECK-NEXT: vslli.h $vr1, $vr1, 8
142+
; CHECK-NEXT: vsrai.h $vr1, $vr1, 8
143+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 8
144+
; CHECK-NEXT: vinsgr2vr.h $vr2, $a0, 0
145+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 9
146+
; CHECK-NEXT: vinsgr2vr.h $vr2, $a0, 1
147+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 10
148+
; CHECK-NEXT: vinsgr2vr.h $vr2, $a0, 2
149+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 11
150+
; CHECK-NEXT: vinsgr2vr.h $vr2, $a0, 3
151+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 12
152+
; CHECK-NEXT: vinsgr2vr.h $vr2, $a0, 4
153+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 13
154+
; CHECK-NEXT: vinsgr2vr.h $vr2, $a0, 5
155+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 14
156+
; CHECK-NEXT: vinsgr2vr.h $vr2, $a0, 6
157+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 15
158+
; CHECK-NEXT: vinsgr2vr.h $vr2, $a0, 7
159+
; CHECK-NEXT: vslli.h $vr0, $vr2, 8
160+
; CHECK-NEXT: vsrai.h $vr0, $vr0, 8
161+
; CHECK-NEXT: vst $vr0, $a1, 16
162+
; CHECK-NEXT: vst $vr1, $a1, 0
163+
; CHECK-NEXT: ret
164+
entry:
165+
%A = load <16 x i8>, ptr %ptr
166+
%B = sext <16 x i8> %A to <16 x i16>
167+
store <16 x i16> %B, ptr %dst
168+
ret void
169+
}
170+
171+
define void @load_sext_16i8_to_16i32(ptr %ptr, ptr %dst) {
172+
; CHECK-LABEL: load_sext_16i8_to_16i32:
173+
; CHECK: # %bb.0: # %entry
174+
; CHECK-NEXT: vld $vr0, $a0, 0
175+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 0
176+
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 0
177+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 1
178+
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 1
179+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 2
180+
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 2
181+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 3
182+
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 3
183+
; CHECK-NEXT: vslli.w $vr1, $vr1, 24
184+
; CHECK-NEXT: vsrai.w $vr1, $vr1, 24
185+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 4
186+
; CHECK-NEXT: vinsgr2vr.w $vr2, $a0, 0
187+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 5
188+
; CHECK-NEXT: vinsgr2vr.w $vr2, $a0, 1
189+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 6
190+
; CHECK-NEXT: vinsgr2vr.w $vr2, $a0, 2
191+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 7
192+
; CHECK-NEXT: vinsgr2vr.w $vr2, $a0, 3
193+
; CHECK-NEXT: vslli.w $vr2, $vr2, 24
194+
; CHECK-NEXT: vsrai.w $vr2, $vr2, 24
195+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 8
196+
; CHECK-NEXT: vinsgr2vr.w $vr3, $a0, 0
197+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 9
198+
; CHECK-NEXT: vinsgr2vr.w $vr3, $a0, 1
199+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 10
200+
; CHECK-NEXT: vinsgr2vr.w $vr3, $a0, 2
201+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 11
202+
; CHECK-NEXT: vinsgr2vr.w $vr3, $a0, 3
203+
; CHECK-NEXT: vslli.w $vr3, $vr3, 24
204+
; CHECK-NEXT: vsrai.w $vr3, $vr3, 24
205+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 12
206+
; CHECK-NEXT: vinsgr2vr.w $vr4, $a0, 0
207+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 13
208+
; CHECK-NEXT: vinsgr2vr.w $vr4, $a0, 1
209+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 14
210+
; CHECK-NEXT: vinsgr2vr.w $vr4, $a0, 2
211+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 15
212+
; CHECK-NEXT: vinsgr2vr.w $vr4, $a0, 3
213+
; CHECK-NEXT: vslli.w $vr0, $vr4, 24
214+
; CHECK-NEXT: vsrai.w $vr0, $vr0, 24
215+
; CHECK-NEXT: vst $vr0, $a1, 48
216+
; CHECK-NEXT: vst $vr3, $a1, 32
217+
; CHECK-NEXT: vst $vr2, $a1, 16
218+
; CHECK-NEXT: vst $vr1, $a1, 0
219+
; CHECK-NEXT: ret
220+
entry:
221+
%A = load <16 x i8>, ptr %ptr
222+
%B = sext <16 x i8> %A to <16 x i32>
223+
store <16 x i32> %B, ptr %dst
224+
ret void
225+
}
226+
227+
define void @load_sext_16i8_to_16i64(ptr %ptr, ptr %dst) {
228+
; CHECK-LABEL: load_sext_16i8_to_16i64:
229+
; CHECK: # %bb.0: # %entry
230+
; CHECK-NEXT: vld $vr0, $a0, 0
231+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 0
232+
; CHECK-NEXT: vinsgr2vr.d $vr1, $a0, 0
233+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 1
234+
; CHECK-NEXT: vinsgr2vr.d $vr1, $a0, 1
235+
; CHECK-NEXT: vslli.d $vr1, $vr1, 56
236+
; CHECK-NEXT: vsrai.d $vr1, $vr1, 56
237+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 2
238+
; CHECK-NEXT: vinsgr2vr.d $vr2, $a0, 0
239+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 3
240+
; CHECK-NEXT: vinsgr2vr.d $vr2, $a0, 1
241+
; CHECK-NEXT: vslli.d $vr2, $vr2, 56
242+
; CHECK-NEXT: vsrai.d $vr2, $vr2, 56
243+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 4
244+
; CHECK-NEXT: vinsgr2vr.d $vr3, $a0, 0
245+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 5
246+
; CHECK-NEXT: vinsgr2vr.d $vr3, $a0, 1
247+
; CHECK-NEXT: vslli.d $vr3, $vr3, 56
248+
; CHECK-NEXT: vsrai.d $vr3, $vr3, 56
249+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 6
250+
; CHECK-NEXT: vinsgr2vr.d $vr4, $a0, 0
251+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 7
252+
; CHECK-NEXT: vinsgr2vr.d $vr4, $a0, 1
253+
; CHECK-NEXT: vslli.d $vr4, $vr4, 56
254+
; CHECK-NEXT: vsrai.d $vr4, $vr4, 56
255+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 8
256+
; CHECK-NEXT: vinsgr2vr.d $vr5, $a0, 0
257+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 9
258+
; CHECK-NEXT: vinsgr2vr.d $vr5, $a0, 1
259+
; CHECK-NEXT: vslli.d $vr5, $vr5, 56
260+
; CHECK-NEXT: vsrai.d $vr5, $vr5, 56
261+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 10
262+
; CHECK-NEXT: vinsgr2vr.d $vr6, $a0, 0
263+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 11
264+
; CHECK-NEXT: vinsgr2vr.d $vr6, $a0, 1
265+
; CHECK-NEXT: vslli.d $vr6, $vr6, 56
266+
; CHECK-NEXT: vsrai.d $vr6, $vr6, 56
267+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 12
268+
; CHECK-NEXT: vinsgr2vr.d $vr7, $a0, 0
269+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 13
270+
; CHECK-NEXT: vinsgr2vr.d $vr7, $a0, 1
271+
; CHECK-NEXT: vslli.d $vr7, $vr7, 56
272+
; CHECK-NEXT: vsrai.d $vr7, $vr7, 56
273+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 14
274+
; CHECK-NEXT: vinsgr2vr.d $vr8, $a0, 0
275+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 15
276+
; CHECK-NEXT: vinsgr2vr.d $vr8, $a0, 1
277+
; CHECK-NEXT: vslli.d $vr0, $vr8, 56
278+
; CHECK-NEXT: vsrai.d $vr0, $vr0, 56
279+
; CHECK-NEXT: vst $vr0, $a1, 112
280+
; CHECK-NEXT: vst $vr7, $a1, 96
281+
; CHECK-NEXT: vst $vr6, $a1, 80
282+
; CHECK-NEXT: vst $vr5, $a1, 64
283+
; CHECK-NEXT: vst $vr4, $a1, 48
284+
; CHECK-NEXT: vst $vr3, $a1, 32
285+
; CHECK-NEXT: vst $vr2, $a1, 16
286+
; CHECK-NEXT: vst $vr1, $a1, 0
287+
; CHECK-NEXT: ret
288+
entry:
289+
%A = load <16 x i8>, ptr %ptr
290+
%B = sext <16 x i8> %A to <16 x i64>
291+
store <16 x i64> %B, ptr %dst
292+
ret void
293+
}
294+
295+
define void @load_sext_8i16_to_8i32(ptr %ptr, ptr %dst) {
296+
; CHECK-LABEL: load_sext_8i16_to_8i32:
297+
; CHECK: # %bb.0: # %entry
298+
; CHECK-NEXT: vld $vr0, $a0, 0
299+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 0
300+
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 0
301+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 1
302+
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 1
303+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 2
304+
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 2
305+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 3
306+
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 3
307+
; CHECK-NEXT: vslli.w $vr1, $vr1, 16
308+
; CHECK-NEXT: vsrai.w $vr1, $vr1, 16
309+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 4
310+
; CHECK-NEXT: vinsgr2vr.w $vr2, $a0, 0
311+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 5
312+
; CHECK-NEXT: vinsgr2vr.w $vr2, $a0, 1
313+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 6
314+
; CHECK-NEXT: vinsgr2vr.w $vr2, $a0, 2
315+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 7
316+
; CHECK-NEXT: vinsgr2vr.w $vr2, $a0, 3
317+
; CHECK-NEXT: vslli.w $vr0, $vr2, 16
318+
; CHECK-NEXT: vsrai.w $vr0, $vr0, 16
319+
; CHECK-NEXT: vst $vr0, $a1, 16
320+
; CHECK-NEXT: vst $vr1, $a1, 0
321+
; CHECK-NEXT: ret
322+
entry:
323+
%A = load <8 x i16>, ptr %ptr
324+
%B = sext <8 x i16> %A to <8 x i32>
325+
store <8 x i32> %B, ptr %dst
326+
ret void
327+
}
328+
329+
define void @load_sext_8i16_to_8i64(ptr %ptr, ptr %dst) {
330+
; CHECK-LABEL: load_sext_8i16_to_8i64:
331+
; CHECK: # %bb.0: # %entry
332+
; CHECK-NEXT: vld $vr0, $a0, 0
333+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 0
334+
; CHECK-NEXT: vinsgr2vr.d $vr1, $a0, 0
335+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 1
336+
; CHECK-NEXT: vinsgr2vr.d $vr1, $a0, 1
337+
; CHECK-NEXT: vslli.d $vr1, $vr1, 48
338+
; CHECK-NEXT: vsrai.d $vr1, $vr1, 48
339+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 2
340+
; CHECK-NEXT: vinsgr2vr.d $vr2, $a0, 0
341+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 3
342+
; CHECK-NEXT: vinsgr2vr.d $vr2, $a0, 1
343+
; CHECK-NEXT: vslli.d $vr2, $vr2, 48
344+
; CHECK-NEXT: vsrai.d $vr2, $vr2, 48
345+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 4
346+
; CHECK-NEXT: vinsgr2vr.d $vr3, $a0, 0
347+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 5
348+
; CHECK-NEXT: vinsgr2vr.d $vr3, $a0, 1
349+
; CHECK-NEXT: vslli.d $vr3, $vr3, 48
350+
; CHECK-NEXT: vsrai.d $vr3, $vr3, 48
351+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 6
352+
; CHECK-NEXT: vinsgr2vr.d $vr4, $a0, 0
353+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 7
354+
; CHECK-NEXT: vinsgr2vr.d $vr4, $a0, 1
355+
; CHECK-NEXT: vslli.d $vr0, $vr4, 48
356+
; CHECK-NEXT: vsrai.d $vr0, $vr0, 48
357+
; CHECK-NEXT: vst $vr0, $a1, 48
358+
; CHECK-NEXT: vst $vr3, $a1, 32
359+
; CHECK-NEXT: vst $vr2, $a1, 16
360+
; CHECK-NEXT: vst $vr1, $a1, 0
361+
; CHECK-NEXT: ret
362+
entry:
363+
%A = load <8 x i16>, ptr %ptr
364+
%B = sext <8 x i16> %A to <8 x i64>
365+
store <8 x i64> %B, ptr %dst
366+
ret void
367+
}
368+
369+
define void @load_sext_4i32_to_4i64(ptr %ptr, ptr %dst) {
370+
; CHECK-LABEL: load_sext_4i32_to_4i64:
371+
; CHECK: # %bb.0: # %entry
372+
; CHECK-NEXT: vld $vr0, $a0, 0
373+
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
374+
; CHECK-NEXT: vinsgr2vr.d $vr1, $a0, 0
375+
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 1
376+
; CHECK-NEXT: vinsgr2vr.d $vr1, $a0, 1
377+
; CHECK-NEXT: vslli.d $vr1, $vr1, 32
378+
; CHECK-NEXT: vsrai.d $vr1, $vr1, 32
379+
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 2
380+
; CHECK-NEXT: vinsgr2vr.d $vr2, $a0, 0
381+
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 3
382+
; CHECK-NEXT: vinsgr2vr.d $vr2, $a0, 1
383+
; CHECK-NEXT: vslli.d $vr0, $vr2, 32
384+
; CHECK-NEXT: vsrai.d $vr0, $vr0, 32
385+
; CHECK-NEXT: vst $vr0, $a1, 16
386+
; CHECK-NEXT: vst $vr1, $a1, 0
387+
; CHECK-NEXT: ret
388+
entry:
389+
%A = load <4 x i32>, ptr %ptr
390+
%B = sext <4 x i32> %A to <4 x i64>
391+
store <4 x i64> %B, ptr %dst
392+
ret void
393+
}
394+

0 commit comments

Comments
 (0)