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