xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/vec-move-08.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test vector insertion of memory values.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Test v16i8 insertion into the first element.
6*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f1(<16 x i8> %val, i8 *%ptr) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
8*9880d681SAndroid Build Coastguard Worker; CHECK: vleb %v24, 0(%r2), 0
9*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
10*9880d681SAndroid Build Coastguard Worker  %element = load i8, i8 *%ptr
11*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <16 x i8> %val, i8 %element, i32 0
12*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %ret
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; Test v16i8 insertion into the last element.
16*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f2(<16 x i8> %val, i8 *%ptr) {
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
18*9880d681SAndroid Build Coastguard Worker; CHECK: vleb %v24, 0(%r2), 15
19*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
20*9880d681SAndroid Build Coastguard Worker  %element = load i8, i8 *%ptr
21*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <16 x i8> %val, i8 %element, i32 15
22*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %ret
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; Test v16i8 insertion with the highest in-range offset.
26*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f3(<16 x i8> %val, i8 *%base) {
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
28*9880d681SAndroid Build Coastguard Worker; CHECK: vleb %v24, 4095(%r2), 10
29*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
30*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%base, i32 4095
31*9880d681SAndroid Build Coastguard Worker  %element = load i8, i8 *%ptr
32*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <16 x i8> %val, i8 %element, i32 10
33*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %ret
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; Test v16i8 insertion with the first ouf-of-range offset.
37*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f4(<16 x i8> %val, i8 *%base) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
39*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
40*9880d681SAndroid Build Coastguard Worker; CHECK: vleb %v24, 0(%r2), 5
41*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
42*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8 *%base, i32 4096
43*9880d681SAndroid Build Coastguard Worker  %element = load i8, i8 *%ptr
44*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <16 x i8> %val, i8 %element, i32 5
45*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %ret
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; Test v16i8 insertion into a variable element.
49*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @f5(<16 x i8> %val, i8 *%ptr, i32 %index) {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
51*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vleb
52*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
53*9880d681SAndroid Build Coastguard Worker  %element = load i8, i8 *%ptr
54*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <16 x i8> %val, i8 %element, i32 %index
55*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %ret
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; Test v8i16 insertion into the first element.
59*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f6(<8 x i16> %val, i16 *%ptr) {
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
61*9880d681SAndroid Build Coastguard Worker; CHECK: vleh %v24, 0(%r2), 0
62*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
63*9880d681SAndroid Build Coastguard Worker  %element = load i16, i16 *%ptr
64*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <8 x i16> %val, i16 %element, i32 0
65*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ret
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; Test v8i16 insertion into the last element.
69*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f7(<8 x i16> %val, i16 *%ptr) {
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
71*9880d681SAndroid Build Coastguard Worker; CHECK: vleh %v24, 0(%r2), 7
72*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
73*9880d681SAndroid Build Coastguard Worker  %element = load i16, i16 *%ptr
74*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <8 x i16> %val, i16 %element, i32 7
75*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ret
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; Test v8i16 insertion with the highest in-range offset.
79*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f8(<8 x i16> %val, i16 *%base) {
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
81*9880d681SAndroid Build Coastguard Worker; CHECK: vleh %v24, 4094(%r2), 5
82*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
83*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i16, i16 *%base, i32 2047
84*9880d681SAndroid Build Coastguard Worker  %element = load i16, i16 *%ptr
85*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <8 x i16> %val, i16 %element, i32 5
86*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ret
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; Test v8i16 insertion with the first ouf-of-range offset.
90*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f9(<8 x i16> %val, i16 *%base) {
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
92*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
93*9880d681SAndroid Build Coastguard Worker; CHECK: vleh %v24, 0(%r2), 1
94*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
95*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i16, i16 *%base, i32 2048
96*9880d681SAndroid Build Coastguard Worker  %element = load i16, i16 *%ptr
97*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <8 x i16> %val, i16 %element, i32 1
98*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ret
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; Test v8i16 insertion into a variable element.
102*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @f10(<8 x i16> %val, i16 *%ptr, i32 %index) {
103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
104*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vleh
105*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
106*9880d681SAndroid Build Coastguard Worker  %element = load i16, i16 *%ptr
107*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <8 x i16> %val, i16 %element, i32 %index
108*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %ret
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Test v4i32 insertion into the first element.
112*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f11(<4 x i32> %val, i32 *%ptr) {
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
114*9880d681SAndroid Build Coastguard Worker; CHECK: vlef %v24, 0(%r2), 0
115*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
116*9880d681SAndroid Build Coastguard Worker  %element = load i32, i32 *%ptr
117*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x i32> %val, i32 %element, i32 0
118*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; Test v4i32 insertion into the last element.
122*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f12(<4 x i32> %val, i32 *%ptr) {
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
124*9880d681SAndroid Build Coastguard Worker; CHECK: vlef %v24, 0(%r2), 3
125*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
126*9880d681SAndroid Build Coastguard Worker  %element = load i32, i32 *%ptr
127*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x i32> %val, i32 %element, i32 3
128*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; Test v4i32 insertion with the highest in-range offset.
132*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f13(<4 x i32> %val, i32 *%base) {
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
134*9880d681SAndroid Build Coastguard Worker; CHECK: vlef %v24, 4092(%r2), 2
135*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
136*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i32, i32 *%base, i32 1023
137*9880d681SAndroid Build Coastguard Worker  %element = load i32, i32 *%ptr
138*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x i32> %val, i32 %element, i32 2
139*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
140*9880d681SAndroid Build Coastguard Worker}
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker; Test v4i32 insertion with the first ouf-of-range offset.
143*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f14(<4 x i32> %val, i32 *%base) {
144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
145*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
146*9880d681SAndroid Build Coastguard Worker; CHECK: vlef %v24, 0(%r2), 1
147*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
148*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i32, i32 *%base, i32 1024
149*9880d681SAndroid Build Coastguard Worker  %element = load i32, i32 *%ptr
150*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x i32> %val, i32 %element, i32 1
151*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; Test v4i32 insertion into a variable element.
155*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f15(<4 x i32> %val, i32 *%ptr, i32 %index) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vlef
158*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
159*9880d681SAndroid Build Coastguard Worker  %element = load i32, i32 *%ptr
160*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x i32> %val, i32 %element, i32 %index
161*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; Test v2i64 insertion into the first element.
165*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f16(<2 x i64> %val, i64 *%ptr) {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
167*9880d681SAndroid Build Coastguard Worker; CHECK: vleg %v24, 0(%r2), 0
168*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
169*9880d681SAndroid Build Coastguard Worker  %element = load i64, i64 *%ptr
170*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x i64> %val, i64 %element, i32 0
171*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
172*9880d681SAndroid Build Coastguard Worker}
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker; Test v2i64 insertion into the last element.
175*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f17(<2 x i64> %val, i64 *%ptr) {
176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17:
177*9880d681SAndroid Build Coastguard Worker; CHECK: vleg %v24, 0(%r2), 1
178*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
179*9880d681SAndroid Build Coastguard Worker  %element = load i64, i64 *%ptr
180*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x i64> %val, i64 %element, i32 1
181*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker; Test v2i64 insertion with the highest in-range offset.
185*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f18(<2 x i64> %val, i64 *%base) {
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18:
187*9880d681SAndroid Build Coastguard Worker; CHECK: vleg %v24, 4088(%r2), 1
188*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
189*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i64, i64 *%base, i32 511
190*9880d681SAndroid Build Coastguard Worker  %element = load i64, i64 *%ptr
191*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x i64> %val, i64 %element, i32 1
192*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker; Test v2i64 insertion with the first ouf-of-range offset.
196*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f19(<2 x i64> %val, i64 *%base) {
197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19:
198*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
199*9880d681SAndroid Build Coastguard Worker; CHECK: vleg %v24, 0(%r2), 0
200*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
201*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i64, i64 *%base, i32 512
202*9880d681SAndroid Build Coastguard Worker  %element = load i64, i64 *%ptr
203*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x i64> %val, i64 %element, i32 0
204*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker; Test v2i64 insertion into a variable element.
208*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f20(<2 x i64> %val, i64 *%ptr, i32 %index) {
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20:
210*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vleg
211*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
212*9880d681SAndroid Build Coastguard Worker  %element = load i64, i64 *%ptr
213*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x i64> %val, i64 %element, i32 %index
214*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; Test v4f32 insertion into the first element.
218*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f21(<4 x float> %val, float *%ptr) {
219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21:
220*9880d681SAndroid Build Coastguard Worker; CHECK: vlef %v24, 0(%r2), 0
221*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
222*9880d681SAndroid Build Coastguard Worker  %element = load float, float *%ptr
223*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x float> %val, float %element, i32 0
224*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker; Test v4f32 insertion into the last element.
228*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f22(<4 x float> %val, float *%ptr) {
229*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22:
230*9880d681SAndroid Build Coastguard Worker; CHECK: vlef %v24, 0(%r2), 3
231*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
232*9880d681SAndroid Build Coastguard Worker  %element = load float, float *%ptr
233*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x float> %val, float %element, i32 3
234*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker; Test v4f32 insertion with the highest in-range offset.
238*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f23(<4 x float> %val, float *%base) {
239*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23:
240*9880d681SAndroid Build Coastguard Worker; CHECK: vlef %v24, 4092(%r2), 2
241*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
242*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr float, float *%base, i32 1023
243*9880d681SAndroid Build Coastguard Worker  %element = load float, float *%ptr
244*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x float> %val, float %element, i32 2
245*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
246*9880d681SAndroid Build Coastguard Worker}
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker; Test v4f32 insertion with the first ouf-of-range offset.
249*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f24(<4 x float> %val, float *%base) {
250*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24:
251*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
252*9880d681SAndroid Build Coastguard Worker; CHECK: vlef %v24, 0(%r2), 1
253*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
254*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr float, float *%base, i32 1024
255*9880d681SAndroid Build Coastguard Worker  %element = load float, float *%ptr
256*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x float> %val, float %element, i32 1
257*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
258*9880d681SAndroid Build Coastguard Worker}
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker; Test v4f32 insertion into a variable element.
261*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f25(<4 x float> %val, float *%ptr, i32 %index) {
262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25:
263*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vlef
264*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
265*9880d681SAndroid Build Coastguard Worker  %element = load float, float *%ptr
266*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x float> %val, float %element, i32 %index
267*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
268*9880d681SAndroid Build Coastguard Worker}
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker; Test v2f64 insertion into the first element.
271*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f26(<2 x double> %val, double *%ptr) {
272*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26:
273*9880d681SAndroid Build Coastguard Worker; CHECK: vleg %v24, 0(%r2), 0
274*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
275*9880d681SAndroid Build Coastguard Worker  %element = load double, double *%ptr
276*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x double> %val, double %element, i32 0
277*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
278*9880d681SAndroid Build Coastguard Worker}
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Worker; Test v2f64 insertion into the last element.
281*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f27(<2 x double> %val, double *%ptr) {
282*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f27:
283*9880d681SAndroid Build Coastguard Worker; CHECK: vleg %v24, 0(%r2), 1
284*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
285*9880d681SAndroid Build Coastguard Worker  %element = load double, double *%ptr
286*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x double> %val, double %element, i32 1
287*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
288*9880d681SAndroid Build Coastguard Worker}
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker; Test v2f64 insertion with the highest in-range offset.
291*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f28(<2 x double> %val, double *%base) {
292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f28:
293*9880d681SAndroid Build Coastguard Worker; CHECK: vleg %v24, 4088(%r2), 1
294*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
295*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr double, double *%base, i32 511
296*9880d681SAndroid Build Coastguard Worker  %element = load double, double *%ptr
297*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x double> %val, double %element, i32 1
298*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker; Test v2f64 insertion with the first ouf-of-range offset.
302*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f29(<2 x double> %val, double *%base) {
303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f29:
304*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r2, 4096
305*9880d681SAndroid Build Coastguard Worker; CHECK: vleg %v24, 0(%r2), 0
306*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
307*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr double, double *%base, i32 512
308*9880d681SAndroid Build Coastguard Worker  %element = load double, double *%ptr
309*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x double> %val, double %element, i32 0
310*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
311*9880d681SAndroid Build Coastguard Worker}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker; Test v2f64 insertion into a variable element.
314*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f30(<2 x double> %val, double *%ptr, i32 %index) {
315*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f30:
316*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vleg
317*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
318*9880d681SAndroid Build Coastguard Worker  %element = load double, double *%ptr
319*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x double> %val, double %element, i32 %index
320*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
321*9880d681SAndroid Build Coastguard Worker}
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Worker; Test a v4i32 gather of the first element.
324*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f31(<4 x i32> %val, <4 x i32> %index, i64 %base) {
325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f31:
326*9880d681SAndroid Build Coastguard Worker; CHECK: vgef %v24, 0(%v26,%r2), 0
327*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
328*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 0
329*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
330*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %ext
331*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i32 *
332*9880d681SAndroid Build Coastguard Worker  %element = load i32, i32 *%ptr
333*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x i32> %val, i32 %element, i32 0
334*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
335*9880d681SAndroid Build Coastguard Worker}
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker; Test a v4i32 gather of the last element.
338*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f32(<4 x i32> %val, <4 x i32> %index, i64 %base) {
339*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32:
340*9880d681SAndroid Build Coastguard Worker; CHECK: vgef %v24, 0(%v26,%r2), 3
341*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
342*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 3
343*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
344*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %ext
345*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i32 *
346*9880d681SAndroid Build Coastguard Worker  %element = load i32, i32 *%ptr
347*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x i32> %val, i32 %element, i32 3
348*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
349*9880d681SAndroid Build Coastguard Worker}
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker; Test a v4i32 gather with the highest in-range offset.
352*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @f33(<4 x i32> %val, <4 x i32> %index, i64 %base) {
353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f33:
354*9880d681SAndroid Build Coastguard Worker; CHECK: vgef %v24, 4095(%v26,%r2), 1
355*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
356*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 1
357*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
358*9880d681SAndroid Build Coastguard Worker  %add1 = add i64 %base, %ext
359*9880d681SAndroid Build Coastguard Worker  %add2 = add i64 %add1, 4095
360*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add2 to i32 *
361*9880d681SAndroid Build Coastguard Worker  %element = load i32, i32 *%ptr
362*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x i32> %val, i32 %element, i32 1
363*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %ret
364*9880d681SAndroid Build Coastguard Worker}
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker; Test a v2i64 gather of the first element.
367*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f34(<2 x i64> %val, <2 x i64> %index, i64 %base) {
368*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f34:
369*9880d681SAndroid Build Coastguard Worker; CHECK: vgeg %v24, 0(%v26,%r2), 0
370*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
371*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <2 x i64> %index, i32 0
372*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %elem
373*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i64 *
374*9880d681SAndroid Build Coastguard Worker  %element = load i64, i64 *%ptr
375*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x i64> %val, i64 %element, i32 0
376*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
377*9880d681SAndroid Build Coastguard Worker}
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Worker; Test a v2i64 gather of the last element.
380*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @f35(<2 x i64> %val, <2 x i64> %index, i64 %base) {
381*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f35:
382*9880d681SAndroid Build Coastguard Worker; CHECK: vgeg %v24, 0(%v26,%r2), 1
383*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
384*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <2 x i64> %index, i32 1
385*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %elem
386*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to i64 *
387*9880d681SAndroid Build Coastguard Worker  %element = load i64, i64 *%ptr
388*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x i64> %val, i64 %element, i32 1
389*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
390*9880d681SAndroid Build Coastguard Worker}
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker; Test a v4f32 gather of the first element.
393*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f36(<4 x float> %val, <4 x i32> %index, i64 %base) {
394*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f36:
395*9880d681SAndroid Build Coastguard Worker; CHECK: vgef %v24, 0(%v26,%r2), 0
396*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
397*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 0
398*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
399*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %ext
400*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to float *
401*9880d681SAndroid Build Coastguard Worker  %element = load float, float *%ptr
402*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x float> %val, float %element, i32 0
403*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
404*9880d681SAndroid Build Coastguard Worker}
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Worker; Test a v4f32 gather of the last element.
407*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @f37(<4 x float> %val, <4 x i32> %index, i64 %base) {
408*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f37:
409*9880d681SAndroid Build Coastguard Worker; CHECK: vgef %v24, 0(%v26,%r2), 3
410*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
411*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <4 x i32> %index, i32 3
412*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %elem to i64
413*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %ext
414*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to float *
415*9880d681SAndroid Build Coastguard Worker  %element = load float, float *%ptr
416*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <4 x float> %val, float %element, i32 3
417*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %ret
418*9880d681SAndroid Build Coastguard Worker}
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Worker; Test a v2f64 gather of the first element.
421*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f38(<2 x double> %val, <2 x i64> %index, i64 %base) {
422*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f38:
423*9880d681SAndroid Build Coastguard Worker; CHECK: vgeg %v24, 0(%v26,%r2), 0
424*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
425*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <2 x i64> %index, i32 0
426*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %elem
427*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to double *
428*9880d681SAndroid Build Coastguard Worker  %element = load double, double *%ptr
429*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x double> %val, double %element, i32 0
430*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker; Test a v2f64 gather of the last element.
434*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @f39(<2 x double> %val, <2 x i64> %index, i64 %base) {
435*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f39:
436*9880d681SAndroid Build Coastguard Worker; CHECK: vgeg %v24, 0(%v26,%r2), 1
437*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
438*9880d681SAndroid Build Coastguard Worker  %elem = extractelement <2 x i64> %index, i32 1
439*9880d681SAndroid Build Coastguard Worker  %add = add i64 %base, %elem
440*9880d681SAndroid Build Coastguard Worker  %ptr = inttoptr i64 %add to double *
441*9880d681SAndroid Build Coastguard Worker  %element = load double, double *%ptr
442*9880d681SAndroid Build Coastguard Worker  %ret = insertelement <2 x double> %val, double %element, i32 1
443*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %ret
444*9880d681SAndroid Build Coastguard Worker}
445