44define void @load_trunc_2i64_to_2i32 (ptr %ptr , ptr %dst ) nounwind {
55; CHECK-LABEL: load_trunc_2i64_to_2i32:
66; CHECK: # %bb.0:
7+ ; CHECK-NEXT: addi.d $sp, $sp, -16
78; CHECK-NEXT: vld $vr0, $a0, 0
89; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 1
9- ; CHECK-NEXT: st.w $a0, $a1 , 4
10+ ; CHECK-NEXT: st.w $a0, $sp , 4
1011; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 0
11- ; CHECK-NEXT: st.w $a0, $a1, 0
12+ ; CHECK-NEXT: st.w $a0, $sp, 0
13+ ; CHECK-NEXT: ld.d $a0, $sp, 0
14+ ; CHECK-NEXT: st.d $a0, $a1, 0
15+ ; CHECK-NEXT: addi.d $sp, $sp, 16
1216; CHECK-NEXT: ret
1317 %a = load <2 x i64 >, ptr %ptr
1418 %trunc = trunc <2 x i64 > %a to <2 x i32 >
@@ -19,11 +23,16 @@ define void @load_trunc_2i64_to_2i32(ptr %ptr, ptr %dst) nounwind {
1923define void @load_trunc_2i64_to_2i16 (ptr %ptr , ptr %dst ) nounwind {
2024; CHECK-LABEL: load_trunc_2i64_to_2i16:
2125; CHECK: # %bb.0:
26+ ; CHECK-NEXT: addi.d $sp, $sp, -16
2227; CHECK-NEXT: vld $vr0, $a0, 0
2328; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 1
24- ; CHECK-NEXT: st.h $a0, $a1 , 2
29+ ; CHECK-NEXT: st.h $a0, $sp , 2
2530; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 0
26- ; CHECK-NEXT: st.h $a0, $a1, 0
31+ ; CHECK-NEXT: st.h $a0, $sp, 0
32+ ; CHECK-NEXT: vld $vr0, $sp, 0
33+ ; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
34+ ; CHECK-NEXT: st.w $a0, $a1, 0
35+ ; CHECK-NEXT: addi.d $sp, $sp, 16
2736; CHECK-NEXT: ret
2837 %a = load <2 x i64 >, ptr %ptr
2938 %trunc = trunc <2 x i64 > %a to <2 x i16 >
@@ -34,11 +43,16 @@ define void @load_trunc_2i64_to_2i16(ptr %ptr, ptr %dst) nounwind {
3443define void @load_trunc_2i64_to_2i8 (ptr %ptr , ptr %dst ) nounwind {
3544; CHECK-LABEL: load_trunc_2i64_to_2i8:
3645; CHECK: # %bb.0:
46+ ; CHECK-NEXT: addi.d $sp, $sp, -16
3747; CHECK-NEXT: vld $vr0, $a0, 0
3848; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 1
39- ; CHECK-NEXT: st.b $a0, $a1 , 1
49+ ; CHECK-NEXT: st.b $a0, $sp , 1
4050; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 0
41- ; CHECK-NEXT: st.b $a0, $a1, 0
51+ ; CHECK-NEXT: st.b $a0, $sp, 0
52+ ; CHECK-NEXT: vld $vr0, $sp, 0
53+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 0
54+ ; CHECK-NEXT: st.h $a0, $a1, 0
55+ ; CHECK-NEXT: addi.d $sp, $sp, 16
4256; CHECK-NEXT: ret
4357 %a = load <2 x i64 >, ptr %ptr
4458 %trunc = trunc <2 x i64 > %a to <2 x i8 >
@@ -49,15 +63,19 @@ define void @load_trunc_2i64_to_2i8(ptr %ptr, ptr %dst) nounwind {
4963define void @load_trunc_4i32_to_4i16 (ptr %ptr , ptr %dst ) nounwind {
5064; CHECK-LABEL: load_trunc_4i32_to_4i16:
5165; CHECK: # %bb.0:
66+ ; CHECK-NEXT: addi.d $sp, $sp, -16
5267; CHECK-NEXT: vld $vr0, $a0, 0
5368; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 3
54- ; CHECK-NEXT: st.h $a0, $a1 , 6
69+ ; CHECK-NEXT: st.h $a0, $sp , 6
5570; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 2
56- ; CHECK-NEXT: st.h $a0, $a1 , 4
71+ ; CHECK-NEXT: st.h $a0, $sp , 4
5772; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 1
58- ; CHECK-NEXT: st.h $a0, $a1 , 2
73+ ; CHECK-NEXT: st.h $a0, $sp , 2
5974; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
60- ; CHECK-NEXT: st.h $a0, $a1, 0
75+ ; CHECK-NEXT: st.h $a0, $sp, 0
76+ ; CHECK-NEXT: ld.d $a0, $sp, 0
77+ ; CHECK-NEXT: st.d $a0, $a1, 0
78+ ; CHECK-NEXT: addi.d $sp, $sp, 16
6179; CHECK-NEXT: ret
6280 %a = load <4 x i32 >, ptr %ptr
6381 %trunc = trunc <4 x i32 > %a to <4 x i16 >
@@ -68,15 +86,20 @@ define void @load_trunc_4i32_to_4i16(ptr %ptr, ptr %dst) nounwind {
6886define void @load_trunc_4i32_to_4i8 (ptr %ptr , ptr %dst ) nounwind {
6987; CHECK-LABEL: load_trunc_4i32_to_4i8:
7088; CHECK: # %bb.0:
89+ ; CHECK-NEXT: addi.d $sp, $sp, -16
7190; CHECK-NEXT: vld $vr0, $a0, 0
7291; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 3
73- ; CHECK-NEXT: st.b $a0, $a1 , 3
92+ ; CHECK-NEXT: st.b $a0, $sp , 3
7493; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 2
75- ; CHECK-NEXT: st.b $a0, $a1 , 2
94+ ; CHECK-NEXT: st.b $a0, $sp , 2
7695; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 1
77- ; CHECK-NEXT: st.b $a0, $a1, 1
96+ ; CHECK-NEXT: st.b $a0, $sp, 1
97+ ; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
98+ ; CHECK-NEXT: st.b $a0, $sp, 0
99+ ; CHECK-NEXT: vld $vr0, $sp, 0
78100; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
79- ; CHECK-NEXT: st.b $a0, $a1, 0
101+ ; CHECK-NEXT: st.w $a0, $a1, 0
102+ ; CHECK-NEXT: addi.d $sp, $sp, 16
80103; CHECK-NEXT: ret
81104 %a = load <4 x i32 >, ptr %ptr
82105 %trunc = trunc <4 x i32 > %a to <4 x i8 >
@@ -87,23 +110,27 @@ define void @load_trunc_4i32_to_4i8(ptr %ptr, ptr %dst) nounwind {
87110define void @load_trunc_8i16_to_8i8 (ptr %ptr , ptr %dst ) nounwind {
88111; CHECK-LABEL: load_trunc_8i16_to_8i8:
89112; CHECK: # %bb.0:
113+ ; CHECK-NEXT: addi.d $sp, $sp, -16
90114; CHECK-NEXT: vld $vr0, $a0, 0
91115; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 7
92- ; CHECK-NEXT: st.b $a0, $a1 , 7
116+ ; CHECK-NEXT: st.b $a0, $sp , 7
93117; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 6
94- ; CHECK-NEXT: st.b $a0, $a1 , 6
118+ ; CHECK-NEXT: st.b $a0, $sp , 6
95119; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 5
96- ; CHECK-NEXT: st.b $a0, $a1 , 5
120+ ; CHECK-NEXT: st.b $a0, $sp , 5
97121; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 4
98- ; CHECK-NEXT: st.b $a0, $a1 , 4
122+ ; CHECK-NEXT: st.b $a0, $sp , 4
99123; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 3
100- ; CHECK-NEXT: st.b $a0, $a1 , 3
124+ ; CHECK-NEXT: st.b $a0, $sp , 3
101125; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 2
102- ; CHECK-NEXT: st.b $a0, $a1 , 2
126+ ; CHECK-NEXT: st.b $a0, $sp , 2
103127; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 1
104- ; CHECK-NEXT: st.b $a0, $a1 , 1
128+ ; CHECK-NEXT: st.b $a0, $sp , 1
105129; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 0
106- ; CHECK-NEXT: st.b $a0, $a1, 0
130+ ; CHECK-NEXT: st.b $a0, $sp, 0
131+ ; CHECK-NEXT: ld.d $a0, $sp, 0
132+ ; CHECK-NEXT: st.d $a0, $a1, 0
133+ ; CHECK-NEXT: addi.d $sp, $sp, 16
107134; CHECK-NEXT: ret
108135 %a = load <8 x i16 >, ptr %ptr
109136 %trunc = trunc <8 x i16 > %a to <8 x i8 >
@@ -114,10 +141,17 @@ define void @load_trunc_8i16_to_8i8(ptr %ptr, ptr %dst) nounwind {
114141define void @load_trunc_2i32_to_2i16 (ptr %ptr , ptr %dst ) nounwind {
115142; CHECK-LABEL: load_trunc_2i32_to_2i16:
116143; CHECK: # %bb.0:
117- ; CHECK-NEXT: ld.w $a2, $a0, 4
118- ; CHECK-NEXT: ld.w $a0, $a0, 0
119- ; CHECK-NEXT: st.h $a2, $a1, 2
120- ; CHECK-NEXT: st.h $a0, $a1, 0
144+ ; CHECK-NEXT: addi.d $sp, $sp, -16
145+ ; CHECK-NEXT: ld.d $a0, $a0, 0
146+ ; CHECK-NEXT: vinsgr2vr.d $vr0, $a0, 0
147+ ; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 1
148+ ; CHECK-NEXT: st.h $a0, $sp, 2
149+ ; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
150+ ; CHECK-NEXT: st.h $a0, $sp, 0
151+ ; CHECK-NEXT: vld $vr0, $sp, 0
152+ ; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
153+ ; CHECK-NEXT: st.w $a0, $a1, 0
154+ ; CHECK-NEXT: addi.d $sp, $sp, 16
121155; CHECK-NEXT: ret
122156 %a = load <2 x i32 >, ptr %ptr
123157 %trunc = trunc <2 x i32 > %a to <2 x i16 >
@@ -128,10 +162,17 @@ define void @load_trunc_2i32_to_2i16(ptr %ptr, ptr %dst) nounwind {
128162define void @load_trunc_2i32_to_2i8 (ptr %ptr , ptr %dst ) nounwind {
129163; CHECK-LABEL: load_trunc_2i32_to_2i8:
130164; CHECK: # %bb.0:
131- ; CHECK-NEXT: ld.w $a2, $a0, 4
132- ; CHECK-NEXT: ld.w $a0, $a0, 0
133- ; CHECK-NEXT: st.b $a2, $a1, 1
134- ; CHECK-NEXT: st.b $a0, $a1, 0
165+ ; CHECK-NEXT: addi.d $sp, $sp, -16
166+ ; CHECK-NEXT: ld.d $a0, $a0, 0
167+ ; CHECK-NEXT: vinsgr2vr.d $vr0, $a0, 0
168+ ; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 1
169+ ; CHECK-NEXT: st.b $a0, $sp, 1
170+ ; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
171+ ; CHECK-NEXT: st.b $a0, $sp, 0
172+ ; CHECK-NEXT: vld $vr0, $sp, 0
173+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 0
174+ ; CHECK-NEXT: st.h $a0, $a1, 0
175+ ; CHECK-NEXT: addi.d $sp, $sp, 16
135176; CHECK-NEXT: ret
136177 %a = load <2 x i32 >, ptr %ptr
137178 %trunc = trunc <2 x i32 > %a to <2 x i8 >
@@ -142,14 +183,21 @@ define void @load_trunc_2i32_to_2i8(ptr %ptr, ptr %dst) nounwind {
142183define void @load_trunc_4i16_to_4i8 (ptr %ptr , ptr %dst ) nounwind {
143184; CHECK-LABEL: load_trunc_4i16_to_4i8:
144185; CHECK: # %bb.0:
145- ; CHECK-NEXT: ld.h $a2, $a0, 6
146- ; CHECK-NEXT: ld.h $a3, $a0, 4
147- ; CHECK-NEXT: ld.h $a4, $a0, 2
148- ; CHECK-NEXT: ld.h $a0, $a0, 0
149- ; CHECK-NEXT: st.b $a2, $a1, 3
150- ; CHECK-NEXT: st.b $a3, $a1, 2
151- ; CHECK-NEXT: st.b $a4, $a1, 1
152- ; CHECK-NEXT: st.b $a0, $a1, 0
186+ ; CHECK-NEXT: addi.d $sp, $sp, -16
187+ ; CHECK-NEXT: ld.d $a0, $a0, 0
188+ ; CHECK-NEXT: vinsgr2vr.d $vr0, $a0, 0
189+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 3
190+ ; CHECK-NEXT: st.b $a0, $sp, 3
191+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 2
192+ ; CHECK-NEXT: st.b $a0, $sp, 2
193+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 1
194+ ; CHECK-NEXT: st.b $a0, $sp, 1
195+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 0
196+ ; CHECK-NEXT: st.b $a0, $sp, 0
197+ ; CHECK-NEXT: vld $vr0, $sp, 0
198+ ; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 0
199+ ; CHECK-NEXT: st.w $a0, $a1, 0
200+ ; CHECK-NEXT: addi.d $sp, $sp, 16
153201; CHECK-NEXT: ret
154202 %a = load <4 x i16 >, ptr %ptr
155203 %trunc = trunc <4 x i16 > %a to <4 x i8 >
@@ -160,10 +208,17 @@ define void @load_trunc_4i16_to_4i8(ptr %ptr, ptr %dst) nounwind {
160208define void @load_trunc_2i16_to_2i8 (ptr %ptr , ptr %dst ) nounwind {
161209; CHECK-LABEL: load_trunc_2i16_to_2i8:
162210; CHECK: # %bb.0:
163- ; CHECK-NEXT: ld.h $a2, $a0, 2
164- ; CHECK-NEXT: ld.h $a0, $a0, 0
165- ; CHECK-NEXT: st.b $a2, $a1, 1
166- ; CHECK-NEXT: st.b $a0, $a1, 0
211+ ; CHECK-NEXT: addi.d $sp, $sp, -16
212+ ; CHECK-NEXT: ld.w $a0, $a0, 0
213+ ; CHECK-NEXT: vinsgr2vr.w $vr0, $a0, 0
214+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 1
215+ ; CHECK-NEXT: st.b $a0, $sp, 1
216+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 0
217+ ; CHECK-NEXT: st.b $a0, $sp, 0
218+ ; CHECK-NEXT: vld $vr0, $sp, 0
219+ ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 0
220+ ; CHECK-NEXT: st.h $a0, $a1, 0
221+ ; CHECK-NEXT: addi.d $sp, $sp, 16
167222; CHECK-NEXT: ret
168223 %a = load <2 x i16 >, ptr %ptr
169224 %trunc = trunc <2 x i16 > %a to <2 x i8 >
0 commit comments