[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / PowerPC / wide-scalar-shift-by-byte-multiple-legalization.ll
blob16aa63cac0ab712b12487dfac0038979dba3638f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s --check-prefixes=ALL,LE,LE-64BIT
3 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu   | FileCheck %s --check-prefixes=ALL,BE
4 ; RUN: llc < %s -mtriple=ppc32--                       | FileCheck %s --check-prefixes=ALL,LE,LE-32BIT
6 define void @lshr_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
7 ; ALL-LABEL: lshr_4bytes:
8 ; ALL:       # %bb.0:
9 ; ALL-NEXT:    lwz 4, 0(4)
10 ; ALL-NEXT:    lwz 3, 0(3)
11 ; ALL-NEXT:    slwi 4, 4, 3
12 ; ALL-NEXT:    srw 3, 3, 4
13 ; ALL-NEXT:    stw 3, 0(5)
14 ; ALL-NEXT:    blr
15   %src = load i32, ptr %src.ptr, align 1
16   %byteOff = load i32, ptr %byteOff.ptr, align 1
17   %bitOff = shl i32 %byteOff, 3
18   %res = lshr i32 %src, %bitOff
19   store i32 %res, ptr %dst, align 1
20   ret void
22 define void @shl_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
23 ; ALL-LABEL: shl_4bytes:
24 ; ALL:       # %bb.0:
25 ; ALL-NEXT:    lwz 4, 0(4)
26 ; ALL-NEXT:    lwz 3, 0(3)
27 ; ALL-NEXT:    slwi 4, 4, 3
28 ; ALL-NEXT:    slw 3, 3, 4
29 ; ALL-NEXT:    stw 3, 0(5)
30 ; ALL-NEXT:    blr
31   %src = load i32, ptr %src.ptr, align 1
32   %byteOff = load i32, ptr %byteOff.ptr, align 1
33   %bitOff = shl i32 %byteOff, 3
34   %res = shl i32 %src, %bitOff
35   store i32 %res, ptr %dst, align 1
36   ret void
38 define void @ashr_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
39 ; ALL-LABEL: ashr_4bytes:
40 ; ALL:       # %bb.0:
41 ; ALL-NEXT:    lwz 4, 0(4)
42 ; ALL-NEXT:    lwz 3, 0(3)
43 ; ALL-NEXT:    slwi 4, 4, 3
44 ; ALL-NEXT:    sraw 3, 3, 4
45 ; ALL-NEXT:    stw 3, 0(5)
46 ; ALL-NEXT:    blr
47   %src = load i32, ptr %src.ptr, align 1
48   %byteOff = load i32, ptr %byteOff.ptr, align 1
49   %bitOff = shl i32 %byteOff, 3
50   %res = ashr i32 %src, %bitOff
51   store i32 %res, ptr %dst, align 1
52   ret void
55 define void @lshr_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
56 ; LE-64BIT-LABEL: lshr_8bytes:
57 ; LE-64BIT:       # %bb.0:
58 ; LE-64BIT-NEXT:    lwz 4, 0(4)
59 ; LE-64BIT-NEXT:    ld 3, 0(3)
60 ; LE-64BIT-NEXT:    slwi 4, 4, 3
61 ; LE-64BIT-NEXT:    srd 3, 3, 4
62 ; LE-64BIT-NEXT:    std 3, 0(5)
63 ; LE-64BIT-NEXT:    blr
65 ; BE-LABEL: lshr_8bytes:
66 ; BE:       # %bb.0:
67 ; BE-NEXT:    lwz 4, 4(4)
68 ; BE-NEXT:    ld 3, 0(3)
69 ; BE-NEXT:    slwi 4, 4, 3
70 ; BE-NEXT:    srd 3, 3, 4
71 ; BE-NEXT:    std 3, 0(5)
72 ; BE-NEXT:    blr
74 ; LE-32BIT-LABEL: lshr_8bytes:
75 ; LE-32BIT:       # %bb.0:
76 ; LE-32BIT-NEXT:    lwz 4, 4(4)
77 ; LE-32BIT-NEXT:    lwz 6, 4(3)
78 ; LE-32BIT-NEXT:    lwz 3, 0(3)
79 ; LE-32BIT-NEXT:    slwi 4, 4, 3
80 ; LE-32BIT-NEXT:    subfic 7, 4, 32
81 ; LE-32BIT-NEXT:    srw 6, 6, 4
82 ; LE-32BIT-NEXT:    addi 8, 4, -32
83 ; LE-32BIT-NEXT:    slw 7, 3, 7
84 ; LE-32BIT-NEXT:    srw 4, 3, 4
85 ; LE-32BIT-NEXT:    srw 3, 3, 8
86 ; LE-32BIT-NEXT:    or 6, 6, 7
87 ; LE-32BIT-NEXT:    or 3, 6, 3
88 ; LE-32BIT-NEXT:    stw 4, 0(5)
89 ; LE-32BIT-NEXT:    stw 3, 4(5)
90 ; LE-32BIT-NEXT:    blr
91   %src = load i64, ptr %src.ptr, align 1
92   %byteOff = load i64, ptr %byteOff.ptr, align 1
93   %bitOff = shl i64 %byteOff, 3
94   %res = lshr i64 %src, %bitOff
95   store i64 %res, ptr %dst, align 1
96   ret void
98 define void @shl_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
99 ; LE-64BIT-LABEL: shl_8bytes:
100 ; LE-64BIT:       # %bb.0:
101 ; LE-64BIT-NEXT:    lwz 4, 0(4)
102 ; LE-64BIT-NEXT:    ld 3, 0(3)
103 ; LE-64BIT-NEXT:    slwi 4, 4, 3
104 ; LE-64BIT-NEXT:    sld 3, 3, 4
105 ; LE-64BIT-NEXT:    std 3, 0(5)
106 ; LE-64BIT-NEXT:    blr
108 ; BE-LABEL: shl_8bytes:
109 ; BE:       # %bb.0:
110 ; BE-NEXT:    lwz 4, 4(4)
111 ; BE-NEXT:    ld 3, 0(3)
112 ; BE-NEXT:    slwi 4, 4, 3
113 ; BE-NEXT:    sld 3, 3, 4
114 ; BE-NEXT:    std 3, 0(5)
115 ; BE-NEXT:    blr
117 ; LE-32BIT-LABEL: shl_8bytes:
118 ; LE-32BIT:       # %bb.0:
119 ; LE-32BIT-NEXT:    lwz 4, 4(4)
120 ; LE-32BIT-NEXT:    lwz 6, 0(3)
121 ; LE-32BIT-NEXT:    lwz 3, 4(3)
122 ; LE-32BIT-NEXT:    slwi 4, 4, 3
123 ; LE-32BIT-NEXT:    subfic 7, 4, 32
124 ; LE-32BIT-NEXT:    slw 6, 6, 4
125 ; LE-32BIT-NEXT:    addi 8, 4, -32
126 ; LE-32BIT-NEXT:    srw 7, 3, 7
127 ; LE-32BIT-NEXT:    slw 4, 3, 4
128 ; LE-32BIT-NEXT:    slw 3, 3, 8
129 ; LE-32BIT-NEXT:    or 6, 6, 7
130 ; LE-32BIT-NEXT:    or 3, 6, 3
131 ; LE-32BIT-NEXT:    stw 4, 4(5)
132 ; LE-32BIT-NEXT:    stw 3, 0(5)
133 ; LE-32BIT-NEXT:    blr
134   %src = load i64, ptr %src.ptr, align 1
135   %byteOff = load i64, ptr %byteOff.ptr, align 1
136   %bitOff = shl i64 %byteOff, 3
137   %res = shl i64 %src, %bitOff
138   store i64 %res, ptr %dst, align 1
139   ret void
141 define void @ashr_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
142 ; LE-64BIT-LABEL: ashr_8bytes:
143 ; LE-64BIT:       # %bb.0:
144 ; LE-64BIT-NEXT:    lwz 4, 0(4)
145 ; LE-64BIT-NEXT:    ld 3, 0(3)
146 ; LE-64BIT-NEXT:    slwi 4, 4, 3
147 ; LE-64BIT-NEXT:    srad 3, 3, 4
148 ; LE-64BIT-NEXT:    std 3, 0(5)
149 ; LE-64BIT-NEXT:    blr
151 ; BE-LABEL: ashr_8bytes:
152 ; BE:       # %bb.0:
153 ; BE-NEXT:    lwz 4, 4(4)
154 ; BE-NEXT:    ld 3, 0(3)
155 ; BE-NEXT:    slwi 4, 4, 3
156 ; BE-NEXT:    srad 3, 3, 4
157 ; BE-NEXT:    std 3, 0(5)
158 ; BE-NEXT:    blr
160 ; LE-32BIT-LABEL: ashr_8bytes:
161 ; LE-32BIT:       # %bb.0:
162 ; LE-32BIT-NEXT:    lwz 4, 4(4)
163 ; LE-32BIT-NEXT:    lwz 6, 4(3)
164 ; LE-32BIT-NEXT:    lwz 3, 0(3)
165 ; LE-32BIT-NEXT:    slwi 4, 4, 3
166 ; LE-32BIT-NEXT:    subfic 7, 4, 32
167 ; LE-32BIT-NEXT:    srw 6, 6, 4
168 ; LE-32BIT-NEXT:    addi 8, 4, -32
169 ; LE-32BIT-NEXT:    slw 7, 3, 7
170 ; LE-32BIT-NEXT:    sraw 4, 3, 4
171 ; LE-32BIT-NEXT:    sraw 3, 3, 8
172 ; LE-32BIT-NEXT:    cmpwi 8, 1
173 ; LE-32BIT-NEXT:    or 6, 6, 7
174 ; LE-32BIT-NEXT:    bc 12, 0, .LBB5_1
175 ; LE-32BIT-NEXT:    b .LBB5_2
176 ; LE-32BIT-NEXT:  .LBB5_1:
177 ; LE-32BIT-NEXT:    addi 3, 6, 0
178 ; LE-32BIT-NEXT:  .LBB5_2:
179 ; LE-32BIT-NEXT:    stw 4, 0(5)
180 ; LE-32BIT-NEXT:    stw 3, 4(5)
181 ; LE-32BIT-NEXT:    blr
182   %src = load i64, ptr %src.ptr, align 1
183   %byteOff = load i64, ptr %byteOff.ptr, align 1
184   %bitOff = shl i64 %byteOff, 3
185   %res = ashr i64 %src, %bitOff
186   store i64 %res, ptr %dst, align 1
187   ret void
190 define void @lshr_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
191 ; LE-64BIT-LABEL: lshr_16bytes:
192 ; LE-64BIT:       # %bb.0:
193 ; LE-64BIT-NEXT:    lwz 4, 0(4)
194 ; LE-64BIT-NEXT:    ld 6, 8(3)
195 ; LE-64BIT-NEXT:    ld 3, 0(3)
196 ; LE-64BIT-NEXT:    slwi 4, 4, 3
197 ; LE-64BIT-NEXT:    subfic 7, 4, 64
198 ; LE-64BIT-NEXT:    srd 3, 3, 4
199 ; LE-64BIT-NEXT:    sld 7, 6, 7
200 ; LE-64BIT-NEXT:    or 3, 3, 7
201 ; LE-64BIT-NEXT:    addi 7, 4, -64
202 ; LE-64BIT-NEXT:    srd 4, 6, 4
203 ; LE-64BIT-NEXT:    srd 7, 6, 7
204 ; LE-64BIT-NEXT:    std 4, 8(5)
205 ; LE-64BIT-NEXT:    or 3, 3, 7
206 ; LE-64BIT-NEXT:    std 3, 0(5)
207 ; LE-64BIT-NEXT:    blr
209 ; BE-LABEL: lshr_16bytes:
210 ; BE:       # %bb.0:
211 ; BE-NEXT:    lwz 4, 12(4)
212 ; BE-NEXT:    ld 6, 0(3)
213 ; BE-NEXT:    ld 3, 8(3)
214 ; BE-NEXT:    slwi 4, 4, 3
215 ; BE-NEXT:    subfic 7, 4, 64
216 ; BE-NEXT:    srd 3, 3, 4
217 ; BE-NEXT:    sld 7, 6, 7
218 ; BE-NEXT:    addi 8, 4, -64
219 ; BE-NEXT:    or 3, 3, 7
220 ; BE-NEXT:    srd 7, 6, 8
221 ; BE-NEXT:    srd 4, 6, 4
222 ; BE-NEXT:    or 3, 3, 7
223 ; BE-NEXT:    std 4, 0(5)
224 ; BE-NEXT:    std 3, 8(5)
225 ; BE-NEXT:    blr
227 ; LE-32BIT-LABEL: lshr_16bytes:
228 ; LE-32BIT:       # %bb.0:
229 ; LE-32BIT-NEXT:    stwu 1, -48(1)
230 ; LE-32BIT-NEXT:    lwz 7, 0(3)
231 ; LE-32BIT-NEXT:    li 6, 0
232 ; LE-32BIT-NEXT:    lwz 8, 4(3)
233 ; LE-32BIT-NEXT:    lwz 9, 8(3)
234 ; LE-32BIT-NEXT:    lwz 3, 12(3)
235 ; LE-32BIT-NEXT:    lwz 4, 12(4)
236 ; LE-32BIT-NEXT:    stw 3, 44(1)
237 ; LE-32BIT-NEXT:    addi 3, 1, 32
238 ; LE-32BIT-NEXT:    clrlwi 4, 4, 28
239 ; LE-32BIT-NEXT:    stw 6, 28(1)
240 ; LE-32BIT-NEXT:    sub 3, 3, 4
241 ; LE-32BIT-NEXT:    stw 6, 24(1)
242 ; LE-32BIT-NEXT:    stw 6, 20(1)
243 ; LE-32BIT-NEXT:    stw 6, 16(1)
244 ; LE-32BIT-NEXT:    stw 9, 40(1)
245 ; LE-32BIT-NEXT:    stw 8, 36(1)
246 ; LE-32BIT-NEXT:    stw 7, 32(1)
247 ; LE-32BIT-NEXT:    lwz 4, 4(3)
248 ; LE-32BIT-NEXT:    lwz 6, 0(3)
249 ; LE-32BIT-NEXT:    lwz 7, 8(3)
250 ; LE-32BIT-NEXT:    lwz 3, 12(3)
251 ; LE-32BIT-NEXT:    stw 7, 8(5)
252 ; LE-32BIT-NEXT:    stw 3, 12(5)
253 ; LE-32BIT-NEXT:    stw 6, 0(5)
254 ; LE-32BIT-NEXT:    stw 4, 4(5)
255 ; LE-32BIT-NEXT:    addi 1, 1, 48
256 ; LE-32BIT-NEXT:    blr
257   %src = load i128, ptr %src.ptr, align 1
258   %byteOff = load i128, ptr %byteOff.ptr, align 1
259   %bitOff = shl i128 %byteOff, 3
260   %res = lshr i128 %src, %bitOff
261   store i128 %res, ptr %dst, align 1
262   ret void
264 define void @shl_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
265 ; LE-64BIT-LABEL: shl_16bytes:
266 ; LE-64BIT:       # %bb.0:
267 ; LE-64BIT-NEXT:    lwz 4, 0(4)
268 ; LE-64BIT-NEXT:    ld 6, 0(3)
269 ; LE-64BIT-NEXT:    ld 3, 8(3)
270 ; LE-64BIT-NEXT:    slwi 4, 4, 3
271 ; LE-64BIT-NEXT:    subfic 7, 4, 64
272 ; LE-64BIT-NEXT:    sld 3, 3, 4
273 ; LE-64BIT-NEXT:    srd 7, 6, 7
274 ; LE-64BIT-NEXT:    or 3, 3, 7
275 ; LE-64BIT-NEXT:    addi 7, 4, -64
276 ; LE-64BIT-NEXT:    sld 4, 6, 4
277 ; LE-64BIT-NEXT:    sld 7, 6, 7
278 ; LE-64BIT-NEXT:    std 4, 0(5)
279 ; LE-64BIT-NEXT:    or 3, 3, 7
280 ; LE-64BIT-NEXT:    std 3, 8(5)
281 ; LE-64BIT-NEXT:    blr
283 ; BE-LABEL: shl_16bytes:
284 ; BE:       # %bb.0:
285 ; BE-NEXT:    lwz 4, 12(4)
286 ; BE-NEXT:    ld 6, 8(3)
287 ; BE-NEXT:    ld 3, 0(3)
288 ; BE-NEXT:    slwi 4, 4, 3
289 ; BE-NEXT:    subfic 7, 4, 64
290 ; BE-NEXT:    sld 3, 3, 4
291 ; BE-NEXT:    srd 7, 6, 7
292 ; BE-NEXT:    addi 8, 4, -64
293 ; BE-NEXT:    or 3, 3, 7
294 ; BE-NEXT:    sld 7, 6, 8
295 ; BE-NEXT:    sld 4, 6, 4
296 ; BE-NEXT:    or 3, 3, 7
297 ; BE-NEXT:    std 4, 8(5)
298 ; BE-NEXT:    std 3, 0(5)
299 ; BE-NEXT:    blr
301 ; LE-32BIT-LABEL: shl_16bytes:
302 ; LE-32BIT:       # %bb.0:
303 ; LE-32BIT-NEXT:    stwu 1, -48(1)
304 ; LE-32BIT-NEXT:    lwz 7, 0(3)
305 ; LE-32BIT-NEXT:    li 6, 0
306 ; LE-32BIT-NEXT:    lwz 8, 4(3)
307 ; LE-32BIT-NEXT:    lwz 9, 8(3)
308 ; LE-32BIT-NEXT:    lwz 3, 12(3)
309 ; LE-32BIT-NEXT:    lwz 4, 12(4)
310 ; LE-32BIT-NEXT:    stw 6, 44(1)
311 ; LE-32BIT-NEXT:    stw 6, 40(1)
312 ; LE-32BIT-NEXT:    clrlwi 4, 4, 28
313 ; LE-32BIT-NEXT:    stw 6, 36(1)
314 ; LE-32BIT-NEXT:    stw 6, 32(1)
315 ; LE-32BIT-NEXT:    stw 3, 28(1)
316 ; LE-32BIT-NEXT:    addi 3, 1, 16
317 ; LE-32BIT-NEXT:    stw 9, 24(1)
318 ; LE-32BIT-NEXT:    stw 8, 20(1)
319 ; LE-32BIT-NEXT:    stw 7, 16(1)
320 ; LE-32BIT-NEXT:    lwzux 3, 4, 3
321 ; LE-32BIT-NEXT:    lwz 6, 4(4)
322 ; LE-32BIT-NEXT:    lwz 7, 12(4)
323 ; LE-32BIT-NEXT:    lwz 4, 8(4)
324 ; LE-32BIT-NEXT:    stw 3, 0(5)
325 ; LE-32BIT-NEXT:    stw 4, 8(5)
326 ; LE-32BIT-NEXT:    stw 7, 12(5)
327 ; LE-32BIT-NEXT:    stw 6, 4(5)
328 ; LE-32BIT-NEXT:    addi 1, 1, 48
329 ; LE-32BIT-NEXT:    blr
330   %src = load i128, ptr %src.ptr, align 1
331   %byteOff = load i128, ptr %byteOff.ptr, align 1
332   %bitOff = shl i128 %byteOff, 3
333   %res = shl i128 %src, %bitOff
334   store i128 %res, ptr %dst, align 1
335   ret void
337 define void @ashr_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
338 ; LE-64BIT-LABEL: ashr_16bytes:
339 ; LE-64BIT:       # %bb.0:
340 ; LE-64BIT-NEXT:    lwz 4, 0(4)
341 ; LE-64BIT-NEXT:    ld 6, 8(3)
342 ; LE-64BIT-NEXT:    ld 3, 0(3)
343 ; LE-64BIT-NEXT:    slwi 4, 4, 3
344 ; LE-64BIT-NEXT:    subfic 7, 4, 64
345 ; LE-64BIT-NEXT:    srd 3, 3, 4
346 ; LE-64BIT-NEXT:    sld 7, 6, 7
347 ; LE-64BIT-NEXT:    or 3, 3, 7
348 ; LE-64BIT-NEXT:    addi 7, 4, -64
349 ; LE-64BIT-NEXT:    srad 4, 6, 4
350 ; LE-64BIT-NEXT:    cmpwi 7, 1
351 ; LE-64BIT-NEXT:    srad 8, 6, 7
352 ; LE-64BIT-NEXT:    std 4, 8(5)
353 ; LE-64BIT-NEXT:    isellt 3, 3, 8
354 ; LE-64BIT-NEXT:    std 3, 0(5)
355 ; LE-64BIT-NEXT:    blr
357 ; BE-LABEL: ashr_16bytes:
358 ; BE:       # %bb.0:
359 ; BE-NEXT:    lwz 4, 12(4)
360 ; BE-NEXT:    ld 6, 8(3)
361 ; BE-NEXT:    ld 3, 0(3)
362 ; BE-NEXT:    slwi 4, 4, 3
363 ; BE-NEXT:    subfic 7, 4, 64
364 ; BE-NEXT:    srd 6, 6, 4
365 ; BE-NEXT:    addi 8, 4, -64
366 ; BE-NEXT:    sld 7, 3, 7
367 ; BE-NEXT:    cmpwi 8, 1
368 ; BE-NEXT:    or 6, 6, 7
369 ; BE-NEXT:    srad 7, 3, 8
370 ; BE-NEXT:    srad 3, 3, 4
371 ; BE-NEXT:    bc 12, 0, .LBB8_2
372 ; BE-NEXT:  # %bb.1:
373 ; BE-NEXT:    ori 6, 7, 0
374 ; BE-NEXT:    b .LBB8_2
375 ; BE-NEXT:  .LBB8_2:
376 ; BE-NEXT:    std 3, 0(5)
377 ; BE-NEXT:    std 6, 8(5)
378 ; BE-NEXT:    blr
380 ; LE-32BIT-LABEL: ashr_16bytes:
381 ; LE-32BIT:       # %bb.0:
382 ; LE-32BIT-NEXT:    stwu 1, -48(1)
383 ; LE-32BIT-NEXT:    lwz 7, 0(3)
384 ; LE-32BIT-NEXT:    addi 6, 1, 32
385 ; LE-32BIT-NEXT:    lwz 8, 4(3)
386 ; LE-32BIT-NEXT:    lwz 9, 8(3)
387 ; LE-32BIT-NEXT:    lwz 3, 12(3)
388 ; LE-32BIT-NEXT:    lwz 4, 12(4)
389 ; LE-32BIT-NEXT:    stw 3, 44(1)
390 ; LE-32BIT-NEXT:    srawi 3, 7, 31
391 ; LE-32BIT-NEXT:    clrlwi 4, 4, 28
392 ; LE-32BIT-NEXT:    stw 9, 40(1)
393 ; LE-32BIT-NEXT:    stw 8, 36(1)
394 ; LE-32BIT-NEXT:    stw 7, 32(1)
395 ; LE-32BIT-NEXT:    stw 3, 28(1)
396 ; LE-32BIT-NEXT:    stw 3, 24(1)
397 ; LE-32BIT-NEXT:    stw 3, 20(1)
398 ; LE-32BIT-NEXT:    stw 3, 16(1)
399 ; LE-32BIT-NEXT:    sub 3, 6, 4
400 ; LE-32BIT-NEXT:    lwz 4, 4(3)
401 ; LE-32BIT-NEXT:    lwz 6, 0(3)
402 ; LE-32BIT-NEXT:    lwz 7, 8(3)
403 ; LE-32BIT-NEXT:    lwz 3, 12(3)
404 ; LE-32BIT-NEXT:    stw 7, 8(5)
405 ; LE-32BIT-NEXT:    stw 3, 12(5)
406 ; LE-32BIT-NEXT:    stw 6, 0(5)
407 ; LE-32BIT-NEXT:    stw 4, 4(5)
408 ; LE-32BIT-NEXT:    addi 1, 1, 48
409 ; LE-32BIT-NEXT:    blr
410   %src = load i128, ptr %src.ptr, align 1
411   %byteOff = load i128, ptr %byteOff.ptr, align 1
412   %bitOff = shl i128 %byteOff, 3
413   %res = ashr i128 %src, %bitOff
414   store i128 %res, ptr %dst, align 1
415   ret void
418 define void @lshr_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
419 ; LE-64BIT-LABEL: lshr_32bytes:
420 ; LE-64BIT:       # %bb.0:
421 ; LE-64BIT-NEXT:    li 6, 16
422 ; LE-64BIT-NEXT:    lxvd2x 1, 0, 3
423 ; LE-64BIT-NEXT:    xxlxor 2, 2, 2
424 ; LE-64BIT-NEXT:    addi 7, 1, -64
425 ; LE-64BIT-NEXT:    lxvd2x 0, 3, 6
426 ; LE-64BIT-NEXT:    lwz 3, 0(4)
427 ; LE-64BIT-NEXT:    li 4, 48
428 ; LE-64BIT-NEXT:    stxvd2x 2, 7, 4
429 ; LE-64BIT-NEXT:    li 4, 32
430 ; LE-64BIT-NEXT:    clrldi 3, 3, 59
431 ; LE-64BIT-NEXT:    stxvd2x 2, 7, 4
432 ; LE-64BIT-NEXT:    stxvd2x 0, 7, 6
433 ; LE-64BIT-NEXT:    stxvd2x 1, 0, 7
434 ; LE-64BIT-NEXT:    lxvd2x 0, 7, 3
435 ; LE-64BIT-NEXT:    add 3, 7, 3
436 ; LE-64BIT-NEXT:    lxvd2x 1, 3, 6
437 ; LE-64BIT-NEXT:    stxvd2x 1, 5, 6
438 ; LE-64BIT-NEXT:    stxvd2x 0, 0, 5
439 ; LE-64BIT-NEXT:    blr
441 ; BE-LABEL: lshr_32bytes:
442 ; BE:       # %bb.0:
443 ; BE-NEXT:    ld 6, 0(3)
444 ; BE-NEXT:    ld 7, 8(3)
445 ; BE-NEXT:    ld 8, 16(3)
446 ; BE-NEXT:    ld 3, 24(3)
447 ; BE-NEXT:    lwz 4, 28(4)
448 ; BE-NEXT:    addi 9, 1, -64
449 ; BE-NEXT:    li 10, 0
450 ; BE-NEXT:    std 10, 24(9)
451 ; BE-NEXT:    std 10, 16(9)
452 ; BE-NEXT:    std 10, 8(9)
453 ; BE-NEXT:    std 10, -64(1)
454 ; BE-NEXT:    std 3, 56(9)
455 ; BE-NEXT:    clrlwi 3, 4, 27
456 ; BE-NEXT:    neg 3, 3
457 ; BE-NEXT:    std 8, 48(9)
458 ; BE-NEXT:    std 7, 40(9)
459 ; BE-NEXT:    std 6, 32(9)
460 ; BE-NEXT:    extsw 3, 3
461 ; BE-NEXT:    addi 4, 1, -32
462 ; BE-NEXT:    ldux 3, 4, 3
463 ; BE-NEXT:    ld 6, 8(4)
464 ; BE-NEXT:    ld 7, 24(4)
465 ; BE-NEXT:    ld 4, 16(4)
466 ; BE-NEXT:    std 3, 0(5)
467 ; BE-NEXT:    std 4, 16(5)
468 ; BE-NEXT:    std 7, 24(5)
469 ; BE-NEXT:    std 6, 8(5)
470 ; BE-NEXT:    blr
472 ; LE-32BIT-LABEL: lshr_32bytes:
473 ; LE-32BIT:       # %bb.0:
474 ; LE-32BIT-NEXT:    stwu 1, -80(1)
475 ; LE-32BIT-NEXT:    lwz 7, 0(3)
476 ; LE-32BIT-NEXT:    li 6, 0
477 ; LE-32BIT-NEXT:    lwz 8, 4(3)
478 ; LE-32BIT-NEXT:    lwz 9, 8(3)
479 ; LE-32BIT-NEXT:    lwz 10, 12(3)
480 ; LE-32BIT-NEXT:    lwz 11, 16(3)
481 ; LE-32BIT-NEXT:    lwz 12, 20(3)
482 ; LE-32BIT-NEXT:    lwz 0, 24(3)
483 ; LE-32BIT-NEXT:    lwz 3, 28(3)
484 ; LE-32BIT-NEXT:    lwz 4, 28(4)
485 ; LE-32BIT-NEXT:    stw 3, 76(1)
486 ; LE-32BIT-NEXT:    addi 3, 1, 48
487 ; LE-32BIT-NEXT:    clrlwi 4, 4, 27
488 ; LE-32BIT-NEXT:    stw 6, 44(1)
489 ; LE-32BIT-NEXT:    sub 3, 3, 4
490 ; LE-32BIT-NEXT:    stw 6, 40(1)
491 ; LE-32BIT-NEXT:    stw 6, 36(1)
492 ; LE-32BIT-NEXT:    stw 6, 32(1)
493 ; LE-32BIT-NEXT:    stw 6, 28(1)
494 ; LE-32BIT-NEXT:    stw 6, 24(1)
495 ; LE-32BIT-NEXT:    stw 6, 20(1)
496 ; LE-32BIT-NEXT:    stw 6, 16(1)
497 ; LE-32BIT-NEXT:    stw 0, 72(1)
498 ; LE-32BIT-NEXT:    stw 12, 68(1)
499 ; LE-32BIT-NEXT:    stw 11, 64(1)
500 ; LE-32BIT-NEXT:    stw 10, 60(1)
501 ; LE-32BIT-NEXT:    stw 9, 56(1)
502 ; LE-32BIT-NEXT:    stw 8, 52(1)
503 ; LE-32BIT-NEXT:    stw 7, 48(1)
504 ; LE-32BIT-NEXT:    lwz 4, 4(3)
505 ; LE-32BIT-NEXT:    lwz 6, 0(3)
506 ; LE-32BIT-NEXT:    lwz 7, 12(3)
507 ; LE-32BIT-NEXT:    lwz 8, 8(3)
508 ; LE-32BIT-NEXT:    lwz 9, 20(3)
509 ; LE-32BIT-NEXT:    lwz 10, 16(3)
510 ; LE-32BIT-NEXT:    lwz 11, 24(3)
511 ; LE-32BIT-NEXT:    lwz 3, 28(3)
512 ; LE-32BIT-NEXT:    stw 11, 24(5)
513 ; LE-32BIT-NEXT:    stw 3, 28(5)
514 ; LE-32BIT-NEXT:    stw 10, 16(5)
515 ; LE-32BIT-NEXT:    stw 9, 20(5)
516 ; LE-32BIT-NEXT:    stw 8, 8(5)
517 ; LE-32BIT-NEXT:    stw 7, 12(5)
518 ; LE-32BIT-NEXT:    stw 6, 0(5)
519 ; LE-32BIT-NEXT:    stw 4, 4(5)
520 ; LE-32BIT-NEXT:    addi 1, 1, 80
521 ; LE-32BIT-NEXT:    blr
522   %src = load i256, ptr %src.ptr, align 1
523   %byteOff = load i256, ptr %byteOff.ptr, align 1
524   %bitOff = shl i256 %byteOff, 3
525   %res = lshr i256 %src, %bitOff
526   store i256 %res, ptr %dst, align 1
527   ret void
529 define void @shl_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
530 ; LE-64BIT-LABEL: shl_32bytes:
531 ; LE-64BIT:       # %bb.0:
532 ; LE-64BIT-NEXT:    li 6, 16
533 ; LE-64BIT-NEXT:    lxvd2x 1, 0, 3
534 ; LE-64BIT-NEXT:    xxlxor 2, 2, 2
535 ; LE-64BIT-NEXT:    li 7, 48
536 ; LE-64BIT-NEXT:    lxvd2x 0, 3, 6
537 ; LE-64BIT-NEXT:    lwz 3, 0(4)
538 ; LE-64BIT-NEXT:    addi 4, 1, -64
539 ; LE-64BIT-NEXT:    stxvd2x 2, 4, 6
540 ; LE-64BIT-NEXT:    clrlwi 3, 3, 27
541 ; LE-64BIT-NEXT:    stxvd2x 0, 4, 7
542 ; LE-64BIT-NEXT:    li 7, 32
543 ; LE-64BIT-NEXT:    neg 3, 3
544 ; LE-64BIT-NEXT:    stxvd2x 1, 4, 7
545 ; LE-64BIT-NEXT:    stxvd2x 2, 0, 4
546 ; LE-64BIT-NEXT:    extsw 3, 3
547 ; LE-64BIT-NEXT:    addi 4, 1, -32
548 ; LE-64BIT-NEXT:    lxvd2x 0, 4, 3
549 ; LE-64BIT-NEXT:    add 3, 4, 3
550 ; LE-64BIT-NEXT:    lxvd2x 1, 3, 6
551 ; LE-64BIT-NEXT:    stxvd2x 1, 5, 6
552 ; LE-64BIT-NEXT:    stxvd2x 0, 0, 5
553 ; LE-64BIT-NEXT:    blr
555 ; BE-LABEL: shl_32bytes:
556 ; BE:       # %bb.0:
557 ; BE-NEXT:    ld 6, 0(3)
558 ; BE-NEXT:    ld 7, 8(3)
559 ; BE-NEXT:    ld 8, 16(3)
560 ; BE-NEXT:    ld 3, 24(3)
561 ; BE-NEXT:    lwz 4, 28(4)
562 ; BE-NEXT:    addi 9, 1, -64
563 ; BE-NEXT:    li 10, 0
564 ; BE-NEXT:    std 10, 56(9)
565 ; BE-NEXT:    std 10, 48(9)
566 ; BE-NEXT:    std 10, 40(9)
567 ; BE-NEXT:    std 10, 32(9)
568 ; BE-NEXT:    std 3, 24(9)
569 ; BE-NEXT:    std 8, 16(9)
570 ; BE-NEXT:    std 7, 8(9)
571 ; BE-NEXT:    std 6, -64(1)
572 ; BE-NEXT:    clrldi 3, 4, 59
573 ; BE-NEXT:    ldux 4, 3, 9
574 ; BE-NEXT:    ld 6, 8(3)
575 ; BE-NEXT:    ld 7, 24(3)
576 ; BE-NEXT:    ld 3, 16(3)
577 ; BE-NEXT:    std 4, 0(5)
578 ; BE-NEXT:    std 3, 16(5)
579 ; BE-NEXT:    std 7, 24(5)
580 ; BE-NEXT:    std 6, 8(5)
581 ; BE-NEXT:    blr
583 ; LE-32BIT-LABEL: shl_32bytes:
584 ; LE-32BIT:       # %bb.0:
585 ; LE-32BIT-NEXT:    stwu 1, -80(1)
586 ; LE-32BIT-NEXT:    lwz 7, 0(3)
587 ; LE-32BIT-NEXT:    li 6, 0
588 ; LE-32BIT-NEXT:    lwz 8, 4(3)
589 ; LE-32BIT-NEXT:    lwz 9, 8(3)
590 ; LE-32BIT-NEXT:    lwz 10, 12(3)
591 ; LE-32BIT-NEXT:    lwz 11, 16(3)
592 ; LE-32BIT-NEXT:    lwz 12, 20(3)
593 ; LE-32BIT-NEXT:    lwz 0, 24(3)
594 ; LE-32BIT-NEXT:    lwz 3, 28(3)
595 ; LE-32BIT-NEXT:    lwz 4, 28(4)
596 ; LE-32BIT-NEXT:    stw 6, 76(1)
597 ; LE-32BIT-NEXT:    stw 6, 72(1)
598 ; LE-32BIT-NEXT:    clrlwi 4, 4, 27
599 ; LE-32BIT-NEXT:    stw 6, 68(1)
600 ; LE-32BIT-NEXT:    stw 6, 64(1)
601 ; LE-32BIT-NEXT:    stw 6, 60(1)
602 ; LE-32BIT-NEXT:    stw 6, 56(1)
603 ; LE-32BIT-NEXT:    stw 6, 52(1)
604 ; LE-32BIT-NEXT:    stw 6, 48(1)
605 ; LE-32BIT-NEXT:    stw 3, 44(1)
606 ; LE-32BIT-NEXT:    addi 3, 1, 16
607 ; LE-32BIT-NEXT:    stw 0, 40(1)
608 ; LE-32BIT-NEXT:    stw 12, 36(1)
609 ; LE-32BIT-NEXT:    stw 11, 32(1)
610 ; LE-32BIT-NEXT:    stw 10, 28(1)
611 ; LE-32BIT-NEXT:    stw 9, 24(1)
612 ; LE-32BIT-NEXT:    stw 8, 20(1)
613 ; LE-32BIT-NEXT:    stw 7, 16(1)
614 ; LE-32BIT-NEXT:    lwzux 3, 4, 3
615 ; LE-32BIT-NEXT:    lwz 6, 4(4)
616 ; LE-32BIT-NEXT:    lwz 7, 12(4)
617 ; LE-32BIT-NEXT:    lwz 8, 8(4)
618 ; LE-32BIT-NEXT:    lwz 9, 20(4)
619 ; LE-32BIT-NEXT:    lwz 10, 16(4)
620 ; LE-32BIT-NEXT:    lwz 11, 28(4)
621 ; LE-32BIT-NEXT:    lwz 4, 24(4)
622 ; LE-32BIT-NEXT:    stw 3, 0(5)
623 ; LE-32BIT-NEXT:    stw 4, 24(5)
624 ; LE-32BIT-NEXT:    stw 11, 28(5)
625 ; LE-32BIT-NEXT:    stw 10, 16(5)
626 ; LE-32BIT-NEXT:    stw 9, 20(5)
627 ; LE-32BIT-NEXT:    stw 8, 8(5)
628 ; LE-32BIT-NEXT:    stw 7, 12(5)
629 ; LE-32BIT-NEXT:    stw 6, 4(5)
630 ; LE-32BIT-NEXT:    addi 1, 1, 80
631 ; LE-32BIT-NEXT:    blr
632   %src = load i256, ptr %src.ptr, align 1
633   %byteOff = load i256, ptr %byteOff.ptr, align 1
634   %bitOff = shl i256 %byteOff, 3
635   %res = shl i256 %src, %bitOff
636   store i256 %res, ptr %dst, align 1
637   ret void
639 define void @ashr_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
640 ; LE-64BIT-LABEL: ashr_32bytes:
641 ; LE-64BIT:       # %bb.0:
642 ; LE-64BIT-NEXT:    lxvd2x 0, 0, 3
643 ; LE-64BIT-NEXT:    ld 6, 16(3)
644 ; LE-64BIT-NEXT:    ld 3, 24(3)
645 ; LE-64BIT-NEXT:    addi 7, 1, -64
646 ; LE-64BIT-NEXT:    lwz 4, 0(4)
647 ; LE-64BIT-NEXT:    li 8, 16
648 ; LE-64BIT-NEXT:    std 3, 24(7)
649 ; LE-64BIT-NEXT:    sradi 3, 3, 63
650 ; LE-64BIT-NEXT:    std 6, 16(7)
651 ; LE-64BIT-NEXT:    std 3, 56(7)
652 ; LE-64BIT-NEXT:    std 3, 48(7)
653 ; LE-64BIT-NEXT:    std 3, 40(7)
654 ; LE-64BIT-NEXT:    std 3, 32(7)
655 ; LE-64BIT-NEXT:    clrldi 3, 4, 59
656 ; LE-64BIT-NEXT:    stxvd2x 0, 0, 7
657 ; LE-64BIT-NEXT:    lxvd2x 0, 7, 3
658 ; LE-64BIT-NEXT:    add 3, 7, 3
659 ; LE-64BIT-NEXT:    lxvd2x 1, 3, 8
660 ; LE-64BIT-NEXT:    stxvd2x 1, 5, 8
661 ; LE-64BIT-NEXT:    stxvd2x 0, 0, 5
662 ; LE-64BIT-NEXT:    blr
664 ; BE-LABEL: ashr_32bytes:
665 ; BE:       # %bb.0:
666 ; BE-NEXT:    ld 7, 0(3)
667 ; BE-NEXT:    ld 8, 8(3)
668 ; BE-NEXT:    ld 9, 16(3)
669 ; BE-NEXT:    ld 3, 24(3)
670 ; BE-NEXT:    lwz 4, 28(4)
671 ; BE-NEXT:    addi 6, 1, -64
672 ; BE-NEXT:    std 3, 56(6)
673 ; BE-NEXT:    sradi 3, 7, 63
674 ; BE-NEXT:    clrlwi 4, 4, 27
675 ; BE-NEXT:    std 3, 24(6)
676 ; BE-NEXT:    std 3, 16(6)
677 ; BE-NEXT:    std 3, 8(6)
678 ; BE-NEXT:    std 3, -64(1)
679 ; BE-NEXT:    neg 3, 4
680 ; BE-NEXT:    std 9, 48(6)
681 ; BE-NEXT:    std 8, 40(6)
682 ; BE-NEXT:    std 7, 32(6)
683 ; BE-NEXT:    extsw 3, 3
684 ; BE-NEXT:    addi 4, 1, -32
685 ; BE-NEXT:    ldux 3, 4, 3
686 ; BE-NEXT:    ld 6, 8(4)
687 ; BE-NEXT:    ld 7, 24(4)
688 ; BE-NEXT:    ld 4, 16(4)
689 ; BE-NEXT:    std 3, 0(5)
690 ; BE-NEXT:    std 4, 16(5)
691 ; BE-NEXT:    std 7, 24(5)
692 ; BE-NEXT:    std 6, 8(5)
693 ; BE-NEXT:    blr
695 ; LE-32BIT-LABEL: ashr_32bytes:
696 ; LE-32BIT:       # %bb.0:
697 ; LE-32BIT-NEXT:    stwu 1, -80(1)
698 ; LE-32BIT-NEXT:    lwz 7, 0(3)
699 ; LE-32BIT-NEXT:    addi 6, 1, 48
700 ; LE-32BIT-NEXT:    lwz 8, 4(3)
701 ; LE-32BIT-NEXT:    lwz 9, 8(3)
702 ; LE-32BIT-NEXT:    lwz 10, 12(3)
703 ; LE-32BIT-NEXT:    lwz 11, 16(3)
704 ; LE-32BIT-NEXT:    lwz 12, 20(3)
705 ; LE-32BIT-NEXT:    lwz 0, 24(3)
706 ; LE-32BIT-NEXT:    lwz 3, 28(3)
707 ; LE-32BIT-NEXT:    lwz 4, 28(4)
708 ; LE-32BIT-NEXT:    stw 3, 76(1)
709 ; LE-32BIT-NEXT:    srawi 3, 7, 31
710 ; LE-32BIT-NEXT:    clrlwi 4, 4, 27
711 ; LE-32BIT-NEXT:    stw 0, 72(1)
712 ; LE-32BIT-NEXT:    stw 12, 68(1)
713 ; LE-32BIT-NEXT:    stw 11, 64(1)
714 ; LE-32BIT-NEXT:    stw 10, 60(1)
715 ; LE-32BIT-NEXT:    stw 9, 56(1)
716 ; LE-32BIT-NEXT:    stw 8, 52(1)
717 ; LE-32BIT-NEXT:    stw 7, 48(1)
718 ; LE-32BIT-NEXT:    stw 3, 44(1)
719 ; LE-32BIT-NEXT:    stw 3, 40(1)
720 ; LE-32BIT-NEXT:    stw 3, 36(1)
721 ; LE-32BIT-NEXT:    stw 3, 32(1)
722 ; LE-32BIT-NEXT:    stw 3, 28(1)
723 ; LE-32BIT-NEXT:    stw 3, 24(1)
724 ; LE-32BIT-NEXT:    stw 3, 20(1)
725 ; LE-32BIT-NEXT:    stw 3, 16(1)
726 ; LE-32BIT-NEXT:    sub 3, 6, 4
727 ; LE-32BIT-NEXT:    lwz 4, 4(3)
728 ; LE-32BIT-NEXT:    lwz 6, 0(3)
729 ; LE-32BIT-NEXT:    lwz 7, 12(3)
730 ; LE-32BIT-NEXT:    lwz 8, 8(3)
731 ; LE-32BIT-NEXT:    lwz 9, 20(3)
732 ; LE-32BIT-NEXT:    lwz 10, 16(3)
733 ; LE-32BIT-NEXT:    lwz 11, 24(3)
734 ; LE-32BIT-NEXT:    lwz 3, 28(3)
735 ; LE-32BIT-NEXT:    stw 11, 24(5)
736 ; LE-32BIT-NEXT:    stw 3, 28(5)
737 ; LE-32BIT-NEXT:    stw 10, 16(5)
738 ; LE-32BIT-NEXT:    stw 9, 20(5)
739 ; LE-32BIT-NEXT:    stw 8, 8(5)
740 ; LE-32BIT-NEXT:    stw 7, 12(5)
741 ; LE-32BIT-NEXT:    stw 6, 0(5)
742 ; LE-32BIT-NEXT:    stw 4, 4(5)
743 ; LE-32BIT-NEXT:    addi 1, 1, 80
744 ; LE-32BIT-NEXT:    blr
745   %src = load i256, ptr %src.ptr, align 1
746   %byteOff = load i256, ptr %byteOff.ptr, align 1
747   %bitOff = shl i256 %byteOff, 3
748   %res = ashr i256 %src, %bitOff
749   store i256 %res, ptr %dst, align 1
750   ret void
752 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
753 ; LE: {{.*}}