4
4
define void @load_trunc_2i64_to_2i32 (ptr %ptr , ptr %dst ) nounwind {
5
5
; CHECK-LABEL: load_trunc_2i64_to_2i32:
6
6
; CHECK: # %bb.0:
7
+ ; CHECK-NEXT: addi.d $sp, $sp, -16
7
8
; CHECK-NEXT: vld $vr0, $a0, 0
8
9
; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 1
9
- ; CHECK-NEXT: st.w $a0, $a1 , 4
10
+ ; CHECK-NEXT: st.w $a0, $sp , 4
10
11
; 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
12
16
; CHECK-NEXT: ret
13
17
%a = load <2 x i64 >, ptr %ptr
14
18
%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 {
19
23
define void @load_trunc_2i64_to_2i16 (ptr %ptr , ptr %dst ) nounwind {
20
24
; CHECK-LABEL: load_trunc_2i64_to_2i16:
21
25
; CHECK: # %bb.0:
26
+ ; CHECK-NEXT: addi.d $sp, $sp, -16
22
27
; CHECK-NEXT: vld $vr0, $a0, 0
23
28
; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 1
24
- ; CHECK-NEXT: st.h $a0, $a1 , 2
29
+ ; CHECK-NEXT: st.h $a0, $sp , 2
25
30
; 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
27
36
; CHECK-NEXT: ret
28
37
%a = load <2 x i64 >, ptr %ptr
29
38
%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 {
34
43
define void @load_trunc_2i64_to_2i8 (ptr %ptr , ptr %dst ) nounwind {
35
44
; CHECK-LABEL: load_trunc_2i64_to_2i8:
36
45
; CHECK: # %bb.0:
46
+ ; CHECK-NEXT: addi.d $sp, $sp, -16
37
47
; CHECK-NEXT: vld $vr0, $a0, 0
38
48
; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 1
39
- ; CHECK-NEXT: st.b $a0, $a1 , 1
49
+ ; CHECK-NEXT: st.b $a0, $sp , 1
40
50
; 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
42
56
; CHECK-NEXT: ret
43
57
%a = load <2 x i64 >, ptr %ptr
44
58
%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 {
49
63
define void @load_trunc_4i32_to_4i16 (ptr %ptr , ptr %dst ) nounwind {
50
64
; CHECK-LABEL: load_trunc_4i32_to_4i16:
51
65
; CHECK: # %bb.0:
66
+ ; CHECK-NEXT: addi.d $sp, $sp, -16
52
67
; CHECK-NEXT: vld $vr0, $a0, 0
53
68
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 3
54
- ; CHECK-NEXT: st.h $a0, $a1 , 6
69
+ ; CHECK-NEXT: st.h $a0, $sp , 6
55
70
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 2
56
- ; CHECK-NEXT: st.h $a0, $a1 , 4
71
+ ; CHECK-NEXT: st.h $a0, $sp , 4
57
72
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 1
58
- ; CHECK-NEXT: st.h $a0, $a1 , 2
73
+ ; CHECK-NEXT: st.h $a0, $sp , 2
59
74
; 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
61
79
; CHECK-NEXT: ret
62
80
%a = load <4 x i32 >, ptr %ptr
63
81
%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 {
68
86
define void @load_trunc_4i32_to_4i8 (ptr %ptr , ptr %dst ) nounwind {
69
87
; CHECK-LABEL: load_trunc_4i32_to_4i8:
70
88
; CHECK: # %bb.0:
89
+ ; CHECK-NEXT: addi.d $sp, $sp, -16
71
90
; CHECK-NEXT: vld $vr0, $a0, 0
72
91
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 3
73
- ; CHECK-NEXT: st.b $a0, $a1 , 3
92
+ ; CHECK-NEXT: st.b $a0, $sp , 3
74
93
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 2
75
- ; CHECK-NEXT: st.b $a0, $a1 , 2
94
+ ; CHECK-NEXT: st.b $a0, $sp , 2
76
95
; 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
78
100
; 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
80
103
; CHECK-NEXT: ret
81
104
%a = load <4 x i32 >, ptr %ptr
82
105
%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 {
87
110
define void @load_trunc_8i16_to_8i8 (ptr %ptr , ptr %dst ) nounwind {
88
111
; CHECK-LABEL: load_trunc_8i16_to_8i8:
89
112
; CHECK: # %bb.0:
113
+ ; CHECK-NEXT: addi.d $sp, $sp, -16
90
114
; CHECK-NEXT: vld $vr0, $a0, 0
91
115
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 7
92
- ; CHECK-NEXT: st.b $a0, $a1 , 7
116
+ ; CHECK-NEXT: st.b $a0, $sp , 7
93
117
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 6
94
- ; CHECK-NEXT: st.b $a0, $a1 , 6
118
+ ; CHECK-NEXT: st.b $a0, $sp , 6
95
119
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 5
96
- ; CHECK-NEXT: st.b $a0, $a1 , 5
120
+ ; CHECK-NEXT: st.b $a0, $sp , 5
97
121
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 4
98
- ; CHECK-NEXT: st.b $a0, $a1 , 4
122
+ ; CHECK-NEXT: st.b $a0, $sp , 4
99
123
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 3
100
- ; CHECK-NEXT: st.b $a0, $a1 , 3
124
+ ; CHECK-NEXT: st.b $a0, $sp , 3
101
125
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 2
102
- ; CHECK-NEXT: st.b $a0, $a1 , 2
126
+ ; CHECK-NEXT: st.b $a0, $sp , 2
103
127
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 1
104
- ; CHECK-NEXT: st.b $a0, $a1 , 1
128
+ ; CHECK-NEXT: st.b $a0, $sp , 1
105
129
; 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
107
134
; CHECK-NEXT: ret
108
135
%a = load <8 x i16 >, ptr %ptr
109
136
%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 {
114
141
define void @load_trunc_2i32_to_2i16 (ptr %ptr , ptr %dst ) nounwind {
115
142
; CHECK-LABEL: load_trunc_2i32_to_2i16:
116
143
; 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
121
155
; CHECK-NEXT: ret
122
156
%a = load <2 x i32 >, ptr %ptr
123
157
%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 {
128
162
define void @load_trunc_2i32_to_2i8 (ptr %ptr , ptr %dst ) nounwind {
129
163
; CHECK-LABEL: load_trunc_2i32_to_2i8:
130
164
; 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
135
176
; CHECK-NEXT: ret
136
177
%a = load <2 x i32 >, ptr %ptr
137
178
%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 {
142
183
define void @load_trunc_4i16_to_4i8 (ptr %ptr , ptr %dst ) nounwind {
143
184
; CHECK-LABEL: load_trunc_4i16_to_4i8:
144
185
; 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
153
201
; CHECK-NEXT: ret
154
202
%a = load <4 x i16 >, ptr %ptr
155
203
%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 {
160
208
define void @load_trunc_2i16_to_2i8 (ptr %ptr , ptr %dst ) nounwind {
161
209
; CHECK-LABEL: load_trunc_2i16_to_2i8:
162
210
; 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
167
222
; CHECK-NEXT: ret
168
223
%a = load <2 x i16 >, ptr %ptr
169
224
%trunc = trunc <2 x i16 > %a to <2 x i8 >
0 commit comments