xref: /llvm-project/llvm/test/CodeGen/LoongArch/lsx/build-vector.ll (revision dedf014901cecd7ba3bbc1aadb17098a5a95b8a7)
1add224c0Swanglei; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2add224c0Swanglei; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3add224c0Swanglei
4add224c0Swangleidefine void @buildvector_v16i8_splat(ptr %dst, i8 %a0) nounwind {
5add224c0Swanglei; CHECK-LABEL: buildvector_v16i8_splat:
6add224c0Swanglei; CHECK:       # %bb.0: # %entry
7add224c0Swanglei; CHECK-NEXT:    vreplgr2vr.b $vr0, $a1
8add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
9add224c0Swanglei; CHECK-NEXT:    ret
10add224c0Swangleientry:
11add224c0Swanglei  %insert = insertelement <16 x i8> undef, i8 %a0, i8 0
12add224c0Swanglei  %splat = shufflevector <16 x i8> %insert, <16 x i8> undef, <16 x i32> zeroinitializer
13add224c0Swanglei  store <16 x i8> %splat, ptr %dst
14add224c0Swanglei  ret void
15add224c0Swanglei}
16add224c0Swanglei
17add224c0Swangleidefine void @buildvector_v8i16_splat(ptr %dst, i16 %a0) nounwind {
18add224c0Swanglei; CHECK-LABEL: buildvector_v8i16_splat:
19add224c0Swanglei; CHECK:       # %bb.0: # %entry
20add224c0Swanglei; CHECK-NEXT:    vreplgr2vr.h $vr0, $a1
21add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
22add224c0Swanglei; CHECK-NEXT:    ret
23add224c0Swangleientry:
24add224c0Swanglei  %insert = insertelement <8 x i16> undef, i16 %a0, i8 0
25add224c0Swanglei  %splat = shufflevector <8 x i16> %insert, <8 x i16> undef, <8 x i32> zeroinitializer
26add224c0Swanglei  store <8 x i16> %splat, ptr %dst
27add224c0Swanglei  ret void
28add224c0Swanglei}
29add224c0Swanglei
30add224c0Swangleidefine void @buildvector_v4i32_splat(ptr %dst, i32 %a0) nounwind {
31add224c0Swanglei; CHECK-LABEL: buildvector_v4i32_splat:
32add224c0Swanglei; CHECK:       # %bb.0: # %entry
33add224c0Swanglei; CHECK-NEXT:    vreplgr2vr.w $vr0, $a1
34add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
35add224c0Swanglei; CHECK-NEXT:    ret
36add224c0Swangleientry:
37add224c0Swanglei  %insert = insertelement <4 x i32> undef, i32 %a0, i8 0
38add224c0Swanglei  %splat = shufflevector <4 x i32> %insert, <4 x i32> undef, <4 x i32> zeroinitializer
39add224c0Swanglei  store <4 x i32> %splat, ptr %dst
40add224c0Swanglei  ret void
41add224c0Swanglei}
42add224c0Swanglei
43add224c0Swangleidefine void @buildvector_v2i64_splat(ptr %dst, i64 %a0) nounwind {
44add224c0Swanglei; CHECK-LABEL: buildvector_v2i64_splat:
45add224c0Swanglei; CHECK:       # %bb.0: # %entry
46add224c0Swanglei; CHECK-NEXT:    vreplgr2vr.d $vr0, $a1
47add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
48add224c0Swanglei; CHECK-NEXT:    ret
49add224c0Swangleientry:
50add224c0Swanglei  %insert = insertelement <2 x i64> undef, i64 %a0, i8 0
51add224c0Swanglei  %splat = shufflevector <2 x i64> %insert, <2 x i64> undef, <2 x i32> zeroinitializer
52add224c0Swanglei  store <2 x i64> %splat, ptr %dst
53add224c0Swanglei  ret void
54add224c0Swanglei}
55add224c0Swanglei
56add224c0Swangleidefine void @buildvector_v4f32_splat(ptr %dst, float %a0) nounwind {
57add224c0Swanglei; CHECK-LABEL: buildvector_v4f32_splat:
58add224c0Swanglei; CHECK:       # %bb.0: # %entry
59add224c0Swanglei; CHECK-NEXT:    # kill: def $f0 killed $f0 def $vr0
60add224c0Swanglei; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0
61add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
62add224c0Swanglei; CHECK-NEXT:    ret
63add224c0Swangleientry:
64add224c0Swanglei  %insert = insertelement <4 x float> undef, float %a0, i8 0
65add224c0Swanglei  %splat = shufflevector <4 x float> %insert, <4 x float> undef, <4 x i32> zeroinitializer
66add224c0Swanglei  store <4 x float> %splat, ptr %dst
67add224c0Swanglei  ret void
68add224c0Swanglei}
69add224c0Swanglei
70add224c0Swangleidefine void @buildvector_v2f64_splat(ptr %dst, double %a0) nounwind {
71add224c0Swanglei; CHECK-LABEL: buildvector_v2f64_splat:
72add224c0Swanglei; CHECK:       # %bb.0: # %entry
73add224c0Swanglei; CHECK-NEXT:    # kill: def $f0_64 killed $f0_64 def $vr0
74add224c0Swanglei; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0
75add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
76add224c0Swanglei; CHECK-NEXT:    ret
77add224c0Swangleientry:
78add224c0Swanglei  %insert = insertelement <2 x double> undef, double %a0, i8 0
79add224c0Swanglei  %splat = shufflevector <2 x double> %insert, <2 x double> undef, <2 x i32> zeroinitializer
80add224c0Swanglei  store <2 x double> %splat, ptr %dst
81add224c0Swanglei  ret void
82add224c0Swanglei}
83add224c0Swanglei
84add224c0Swangleidefine void @buildvector_v16i8_const_splat(ptr %dst) nounwind {
85add224c0Swanglei; CHECK-LABEL: buildvector_v16i8_const_splat:
86add224c0Swanglei; CHECK:       # %bb.0: # %entry
87add224c0Swanglei; CHECK-NEXT:    vrepli.b $vr0, 1
88add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
89add224c0Swanglei; CHECK-NEXT:    ret
90add224c0Swangleientry:
91add224c0Swanglei  store <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, ptr %dst
92add224c0Swanglei  ret void
93add224c0Swanglei}
94add224c0Swanglei
95add224c0Swangleidefine void @buildvector_v8i16_const_splat(ptr %dst) nounwind {
96add224c0Swanglei; CHECK-LABEL: buildvector_v8i16_const_splat:
97add224c0Swanglei; CHECK:       # %bb.0: # %entry
98add224c0Swanglei; CHECK-NEXT:    vrepli.h $vr0, 1
99add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
100add224c0Swanglei; CHECK-NEXT:    ret
101add224c0Swangleientry:
102add224c0Swanglei  store <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, ptr %dst
103add224c0Swanglei  ret void
104add224c0Swanglei}
105add224c0Swanglei
106add224c0Swangleidefine void @buildvector_v4i32_const_splat(ptr %dst) nounwind {
107add224c0Swanglei; CHECK-LABEL: buildvector_v4i32_const_splat:
108add224c0Swanglei; CHECK:       # %bb.0: # %entry
109add224c0Swanglei; CHECK-NEXT:    vrepli.w $vr0, 1
110add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
111add224c0Swanglei; CHECK-NEXT:    ret
112add224c0Swangleientry:
113add224c0Swanglei  store <4 x i32> <i32 1, i32 1, i32 1, i32 1>, ptr %dst
114add224c0Swanglei  ret void
115add224c0Swanglei}
116add224c0Swanglei
117add224c0Swangleidefine void @buildvector_v2i64_const_splat(ptr %dst) nounwind {
118add224c0Swanglei; CHECK-LABEL: buildvector_v2i64_const_splat:
119add224c0Swanglei; CHECK:       # %bb.0: # %entry
120add224c0Swanglei; CHECK-NEXT:    vrepli.d $vr0, 1
121add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
122add224c0Swanglei; CHECK-NEXT:    ret
123add224c0Swangleientry:
124add224c0Swanglei  store <2 x i64> <i64 1, i64 1>, ptr %dst
125add224c0Swanglei  ret void
126add224c0Swanglei}
127add224c0Swanglei
128add224c0Swangleidefine void @buildvector_v2f32_const_splat(ptr %dst) nounwind {
129add224c0Swanglei; CHECK-LABEL: buildvector_v2f32_const_splat:
130add224c0Swanglei; CHECK:       # %bb.0: # %entry
131add224c0Swanglei; CHECK-NEXT:    lu12i.w $a1, 260096
132add224c0Swanglei; CHECK-NEXT:    vreplgr2vr.w $vr0, $a1
133add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
134add224c0Swanglei; CHECK-NEXT:    ret
135add224c0Swangleientry:
136add224c0Swanglei  store <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, ptr %dst
137add224c0Swanglei  ret void
138add224c0Swanglei}
139add224c0Swanglei
140add224c0Swangleidefine void @buildvector_v2f64_const_splat(ptr %dst) nounwind {
141add224c0Swanglei; CHECK-LABEL: buildvector_v2f64_const_splat:
142add224c0Swanglei; CHECK:       # %bb.0: # %entry
143add224c0Swanglei; CHECK-NEXT:    lu52i.d $a1, $zero, 1023
144add224c0Swanglei; CHECK-NEXT:    vreplgr2vr.d $vr0, $a1
145add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
146add224c0Swanglei; CHECK-NEXT:    ret
147add224c0Swangleientry:
148add224c0Swanglei  store <2 x double> <double 1.0, double 1.0>, ptr %dst
149add224c0Swanglei  ret void
150add224c0Swanglei}
151add224c0Swanglei
152add224c0Swangleidefine void @buildvector_v16i8_const(ptr %dst) nounwind {
153add224c0Swanglei; CHECK-LABEL: buildvector_v16i8_const:
154add224c0Swanglei; CHECK:       # %bb.0: # %entry
155add224c0Swanglei; CHECK-NEXT:    pcalau12i $a1, %pc_hi20(.LCPI12_0)
156985d64b0Shev; CHECK-NEXT:    vld $vr0, $a1, %pc_lo12(.LCPI12_0)
157add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
158add224c0Swanglei; CHECK-NEXT:    ret
159add224c0Swangleientry:
160add224c0Swanglei  store <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, ptr %dst
161add224c0Swanglei  ret void
162add224c0Swanglei}
163add224c0Swanglei
164add224c0Swangleidefine void @buildvector_v8i16_const(ptr %dst) nounwind {
165add224c0Swanglei; CHECK-LABEL: buildvector_v8i16_const:
166add224c0Swanglei; CHECK:       # %bb.0: # %entry
167add224c0Swanglei; CHECK-NEXT:    pcalau12i $a1, %pc_hi20(.LCPI13_0)
168985d64b0Shev; CHECK-NEXT:    vld $vr0, $a1, %pc_lo12(.LCPI13_0)
169add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
170add224c0Swanglei; CHECK-NEXT:    ret
171add224c0Swangleientry:
172add224c0Swanglei  store <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, ptr %dst
173add224c0Swanglei  ret void
174add224c0Swanglei}
175add224c0Swanglei
176add224c0Swangleidefine void @buildvector_v4i32_const(ptr %dst) nounwind {
177add224c0Swanglei; CHECK-LABEL: buildvector_v4i32_const:
178add224c0Swanglei; CHECK:       # %bb.0: # %entry
179add224c0Swanglei; CHECK-NEXT:    pcalau12i $a1, %pc_hi20(.LCPI14_0)
180985d64b0Shev; CHECK-NEXT:    vld $vr0, $a1, %pc_lo12(.LCPI14_0)
181add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
182add224c0Swanglei; CHECK-NEXT:    ret
183add224c0Swangleientry:
184add224c0Swanglei  store <4 x i32> <i32 0, i32 1, i32 2, i32 3>, ptr %dst
185add224c0Swanglei  ret void
186add224c0Swanglei}
187add224c0Swanglei
188add224c0Swangleidefine void @buildvector_v2i64_const(ptr %dst) nounwind {
189add224c0Swanglei; CHECK-LABEL: buildvector_v2i64_const:
190add224c0Swanglei; CHECK:       # %bb.0: # %entry
191add224c0Swanglei; CHECK-NEXT:    pcalau12i $a1, %pc_hi20(.LCPI15_0)
192985d64b0Shev; CHECK-NEXT:    vld $vr0, $a1, %pc_lo12(.LCPI15_0)
193add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
194add224c0Swanglei; CHECK-NEXT:    ret
195add224c0Swangleientry:
196add224c0Swanglei  store <2 x i64> <i64 0, i64 1>, ptr %dst
197add224c0Swanglei  ret void
198add224c0Swanglei}
199add224c0Swanglei
200add224c0Swangleidefine void @buildvector_v2f32_const(ptr %dst) nounwind {
201add224c0Swanglei; CHECK-LABEL: buildvector_v2f32_const:
202add224c0Swanglei; CHECK:       # %bb.0: # %entry
203add224c0Swanglei; CHECK-NEXT:    pcalau12i $a1, %pc_hi20(.LCPI16_0)
204985d64b0Shev; CHECK-NEXT:    vld $vr0, $a1, %pc_lo12(.LCPI16_0)
205add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
206add224c0Swanglei; CHECK-NEXT:    ret
207add224c0Swangleientry:
208add224c0Swanglei  store <4 x float> <float 0.0, float 1.0, float 2.0, float 3.0>, ptr %dst
209add224c0Swanglei  ret void
210add224c0Swanglei}
211add224c0Swanglei
212add224c0Swangleidefine void @buildvector_v2f64_const(ptr %dst) nounwind {
213add224c0Swanglei; CHECK-LABEL: buildvector_v2f64_const:
214add224c0Swanglei; CHECK:       # %bb.0: # %entry
215add224c0Swanglei; CHECK-NEXT:    pcalau12i $a1, %pc_hi20(.LCPI17_0)
216985d64b0Shev; CHECK-NEXT:    vld $vr0, $a1, %pc_lo12(.LCPI17_0)
217add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
218add224c0Swanglei; CHECK-NEXT:    ret
219add224c0Swangleientry:
220add224c0Swanglei  store <2 x double> <double 0.0, double 1.0>, ptr %dst
221add224c0Swanglei  ret void
222add224c0Swanglei}
223add224c0Swanglei
224add224c0Swangleidefine void @buildvector_v16i8(ptr %dst, i8 %a0, i8 %a1, i8 %a2, i8 %a3, i8 %a4, i8 %a5, i8 %a6, i8 %a7, i8 %a8, i8 %a9, i8 %a10, i8 %a11, i8 %a12, i8 %a13, i8 %a14, i8 %a15) nounwind {
225add224c0Swanglei; CHECK-LABEL: buildvector_v16i8:
226add224c0Swanglei; CHECK:       # %bb.0: # %entry
227a5c90e48Swanglei; CHECK-NEXT:    ld.b $t0, $sp, 64
228a5c90e48Swanglei; CHECK-NEXT:    ld.b $t1, $sp, 56
229a5c90e48Swanglei; CHECK-NEXT:    ld.b $t2, $sp, 48
230a5c90e48Swanglei; CHECK-NEXT:    ld.b $t3, $sp, 40
231a5c90e48Swanglei; CHECK-NEXT:    ld.b $t4, $sp, 32
232a5c90e48Swanglei; CHECK-NEXT:    ld.b $t5, $sp, 24
233a5c90e48Swanglei; CHECK-NEXT:    ld.b $t6, $sp, 16
234a5c90e48Swanglei; CHECK-NEXT:    ld.b $t7, $sp, 8
235a5c90e48Swanglei; CHECK-NEXT:    ld.b $t8, $sp, 0
236add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $a1, 0
237add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $a2, 1
238add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $a3, 2
239add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $a4, 3
240add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $a5, 4
241add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $a6, 5
242add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $a7, 6
243a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t8, 7
244a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t7, 8
245a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t6, 9
246a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t5, 10
247a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t4, 11
248a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t3, 12
249a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t2, 13
250a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t1, 14
251a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.b $vr0, $t0, 15
252add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
253add224c0Swanglei; CHECK-NEXT:    ret
254add224c0Swangleientry:
255add224c0Swanglei  %ins0  = insertelement <16 x i8> undef,  i8 %a0,  i32 0
256add224c0Swanglei  %ins1  = insertelement <16 x i8> %ins0,  i8 %a1,  i32 1
257add224c0Swanglei  %ins2  = insertelement <16 x i8> %ins1,  i8 %a2,  i32 2
258add224c0Swanglei  %ins3  = insertelement <16 x i8> %ins2,  i8 %a3,  i32 3
259add224c0Swanglei  %ins4  = insertelement <16 x i8> %ins3,  i8 %a4,  i32 4
260add224c0Swanglei  %ins5  = insertelement <16 x i8> %ins4,  i8 %a5,  i32 5
261add224c0Swanglei  %ins6  = insertelement <16 x i8> %ins5,  i8 %a6,  i32 6
262add224c0Swanglei  %ins7  = insertelement <16 x i8> %ins6,  i8 %a7,  i32 7
263add224c0Swanglei  %ins8  = insertelement <16 x i8> %ins7,  i8 %a8,  i32 8
264add224c0Swanglei  %ins9  = insertelement <16 x i8> %ins8,  i8 %a9,  i32 9
265add224c0Swanglei  %ins10 = insertelement <16 x i8> %ins9,  i8 %a10, i32 10
266add224c0Swanglei  %ins11 = insertelement <16 x i8> %ins10, i8 %a11, i32 11
267add224c0Swanglei  %ins12 = insertelement <16 x i8> %ins11, i8 %a12, i32 12
268add224c0Swanglei  %ins13 = insertelement <16 x i8> %ins12, i8 %a13, i32 13
269add224c0Swanglei  %ins14 = insertelement <16 x i8> %ins13, i8 %a14, i32 14
270add224c0Swanglei  %ins15 = insertelement <16 x i8> %ins14, i8 %a15, i32 15
271add224c0Swanglei  store <16 x i8> %ins15, ptr %dst
272add224c0Swanglei  ret void
273add224c0Swanglei}
274add224c0Swanglei
275add224c0Swangleidefine void @buildvector_v8i16(ptr %dst, i16 %a0, i16 %a1, i16 %a2, i16 %a3, i16 %a4, i16 %a5, i16 %a6, i16 %a7) nounwind {
276add224c0Swanglei; CHECK-LABEL: buildvector_v8i16:
277add224c0Swanglei; CHECK:       # %bb.0: # %entry
278a5c90e48Swanglei; CHECK-NEXT:    ld.h $t0, $sp, 0
279add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.h $vr0, $a1, 0
280add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.h $vr0, $a2, 1
281add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.h $vr0, $a3, 2
282add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.h $vr0, $a4, 3
283add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.h $vr0, $a5, 4
284add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.h $vr0, $a6, 5
285add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.h $vr0, $a7, 6
286a5c90e48Swanglei; CHECK-NEXT:    vinsgr2vr.h $vr0, $t0, 7
287add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
288add224c0Swanglei; CHECK-NEXT:    ret
289add224c0Swangleientry:
290add224c0Swanglei  %ins0 = insertelement <8 x i16> undef, i16 %a0, i32 0
291add224c0Swanglei  %ins1 = insertelement <8 x i16> %ins0, i16 %a1, i32 1
292add224c0Swanglei  %ins2 = insertelement <8 x i16> %ins1, i16 %a2, i32 2
293add224c0Swanglei  %ins3 = insertelement <8 x i16> %ins2, i16 %a3, i32 3
294add224c0Swanglei  %ins4 = insertelement <8 x i16> %ins3, i16 %a4, i32 4
295add224c0Swanglei  %ins5 = insertelement <8 x i16> %ins4, i16 %a5, i32 5
296add224c0Swanglei  %ins6 = insertelement <8 x i16> %ins5, i16 %a6, i32 6
297add224c0Swanglei  %ins7 = insertelement <8 x i16> %ins6, i16 %a7, i32 7
298add224c0Swanglei  store <8 x i16> %ins7, ptr %dst
299add224c0Swanglei  ret void
300add224c0Swanglei}
301add224c0Swanglei
302add224c0Swangleidefine void @buildvector_v4i32(ptr %dst, i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind {
303add224c0Swanglei; CHECK-LABEL: buildvector_v4i32:
304add224c0Swanglei; CHECK:       # %bb.0: # %entry
305add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.w $vr0, $a1, 0
306add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.w $vr0, $a2, 1
307add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.w $vr0, $a3, 2
308add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.w $vr0, $a4, 3
309add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
310add224c0Swanglei; CHECK-NEXT:    ret
311add224c0Swangleientry:
312add224c0Swanglei  %ins0 = insertelement <4 x i32> undef, i32 %a0, i32 0
313add224c0Swanglei  %ins1 = insertelement <4 x i32> %ins0, i32 %a1, i32 1
314add224c0Swanglei  %ins2 = insertelement <4 x i32> %ins1, i32 %a2, i32 2
315add224c0Swanglei  %ins3 = insertelement <4 x i32> %ins2, i32 %a3, i32 3
316add224c0Swanglei  store <4 x i32> %ins3, ptr %dst
317add224c0Swanglei  ret void
318add224c0Swanglei}
319add224c0Swanglei
320add224c0Swangleidefine void @buildvector_v2i64(ptr %dst, i64 %a0, i64 %a1) nounwind {
321add224c0Swanglei; CHECK-LABEL: buildvector_v2i64:
322add224c0Swanglei; CHECK:       # %bb.0: # %entry
323add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.d $vr0, $a1, 0
324add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.d $vr0, $a2, 1
325add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
326add224c0Swanglei; CHECK-NEXT:    ret
327add224c0Swangleientry:
328add224c0Swanglei  %ins0 = insertelement <2 x i64> undef, i64 %a0, i32 0
329add224c0Swanglei  %ins1 = insertelement <2 x i64> %ins0, i64 %a1, i32 1
330add224c0Swanglei  store <2 x i64> %ins1, ptr %dst
331add224c0Swanglei  ret void
332add224c0Swanglei}
333add224c0Swanglei
334add224c0Swangleidefine void @buildvector_v4f32(ptr %dst, float %a0, float %a1, float %a2, float %a3) nounwind {
335add224c0Swanglei; CHECK-LABEL: buildvector_v4f32:
336add224c0Swanglei; CHECK:       # %bb.0: # %entry
337add224c0Swanglei; CHECK-NEXT:    movfr2gr.s $a1, $fa0
338add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.w $vr0, $a1, 0
339add224c0Swanglei; CHECK-NEXT:    movfr2gr.s $a1, $fa1
340add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.w $vr0, $a1, 1
341add224c0Swanglei; CHECK-NEXT:    movfr2gr.s $a1, $fa2
342add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.w $vr0, $a1, 2
343add224c0Swanglei; CHECK-NEXT:    movfr2gr.s $a1, $fa3
344add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.w $vr0, $a1, 3
345add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
346add224c0Swanglei; CHECK-NEXT:    ret
347add224c0Swangleientry:
348add224c0Swanglei  %ins0 = insertelement <4 x float> undef, float %a0, i32 0
349add224c0Swanglei  %ins1 = insertelement <4 x float> %ins0, float %a1, i32 1
350add224c0Swanglei  %ins2 = insertelement <4 x float> %ins1, float %a2, i32 2
351add224c0Swanglei  %ins3 = insertelement <4 x float> %ins2, float %a3, i32 3
352add224c0Swanglei  store <4 x float> %ins3, ptr %dst
353add224c0Swanglei  ret void
354add224c0Swanglei}
355add224c0Swanglei
356add224c0Swangleidefine void @buildvector_v2f64(ptr %dst, double %a0, double %a1) nounwind {
357add224c0Swanglei; CHECK-LABEL: buildvector_v2f64:
358add224c0Swanglei; CHECK:       # %bb.0: # %entry
359add224c0Swanglei; CHECK-NEXT:    movfr2gr.d $a1, $fa0
360add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.d $vr0, $a1, 0
361add224c0Swanglei; CHECK-NEXT:    movfr2gr.d $a1, $fa1
362add224c0Swanglei; CHECK-NEXT:    vinsgr2vr.d $vr0, $a1, 1
363add224c0Swanglei; CHECK-NEXT:    vst $vr0, $a0, 0
364add224c0Swanglei; CHECK-NEXT:    ret
365add224c0Swangleientry:
366add224c0Swanglei  %ins0 = insertelement <2 x double> undef, double %a0, i32 0
367add224c0Swanglei  %ins1 = insertelement <2 x double> %ins0, double %a1, i32 1
368add224c0Swanglei  store <2 x double> %ins1, ptr %dst
369add224c0Swanglei  ret void
370add224c0Swanglei}
37166a3e4faSwanglei
37266a3e4faSwanglei;; If `isShuffleMaskLegal` returns true, it will lead to an infinite loop.
37366a3e4faSwangleidefine void @extract1_i32_zext_insert0_i64_undef(ptr %src, ptr %dst) nounwind {
37466a3e4faSwanglei; CHECK-LABEL: extract1_i32_zext_insert0_i64_undef:
37566a3e4faSwanglei; CHECK:       # %bb.0:
37666a3e4faSwanglei; CHECK-NEXT:    vld $vr0, $a0, 0
37766a3e4faSwanglei; CHECK-NEXT:    vpickve2gr.w $a0, $vr0, 1
37866a3e4faSwanglei; CHECK-NEXT:    bstrpick.d $a0, $a0, 31, 0
379*dedf0149Stangaac; CHECK-NEXT:    vinsgr2vr.d $vr0, $a0, 0
38066a3e4faSwanglei; CHECK-NEXT:    vst $vr0, $a1, 0
38166a3e4faSwanglei; CHECK-NEXT:    ret
38266a3e4faSwanglei  %v = load volatile <4 x i32>, ptr %src
38366a3e4faSwanglei  %e = extractelement <4 x i32> %v, i32 1
38466a3e4faSwanglei  %z = zext i32 %e to i64
38566a3e4faSwanglei  %r = insertelement <2 x i64> undef, i64 %z, i32 0
38666a3e4faSwanglei  store <2 x i64> %r, ptr %dst
38766a3e4faSwanglei  ret void
38866a3e4faSwanglei}
389