xref: /llvm-project/llvm/test/CodeGen/RISCV/wide-scalar-shift-by-byte-multiple-legalization.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck %s -check-prefixes=RV64I
3; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck %s -check-prefixes=RV32I
4
5define void @lshr_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
6; RV64I-LABEL: lshr_4bytes:
7; RV64I:       # %bb.0:
8; RV64I-NEXT:    lbu a3, 0(a0)
9; RV64I-NEXT:    lbu a4, 1(a0)
10; RV64I-NEXT:    lbu a5, 2(a0)
11; RV64I-NEXT:    lb a0, 3(a0)
12; RV64I-NEXT:    lbu a1, 0(a1)
13; RV64I-NEXT:    slli a4, a4, 8
14; RV64I-NEXT:    or a3, a4, a3
15; RV64I-NEXT:    slli a5, a5, 16
16; RV64I-NEXT:    slli a0, a0, 24
17; RV64I-NEXT:    slli a1, a1, 3
18; RV64I-NEXT:    or a0, a0, a5
19; RV64I-NEXT:    or a0, a0, a3
20; RV64I-NEXT:    srlw a0, a0, a1
21; RV64I-NEXT:    srli a1, a0, 16
22; RV64I-NEXT:    srli a3, a0, 24
23; RV64I-NEXT:    srli a4, a0, 8
24; RV64I-NEXT:    sb a0, 0(a2)
25; RV64I-NEXT:    sb a4, 1(a2)
26; RV64I-NEXT:    sb a1, 2(a2)
27; RV64I-NEXT:    sb a3, 3(a2)
28; RV64I-NEXT:    ret
29;
30; RV32I-LABEL: lshr_4bytes:
31; RV32I:       # %bb.0:
32; RV32I-NEXT:    lbu a3, 1(a0)
33; RV32I-NEXT:    lbu a4, 2(a0)
34; RV32I-NEXT:    lbu a5, 3(a0)
35; RV32I-NEXT:    lbu a0, 0(a0)
36; RV32I-NEXT:    slli a3, a3, 8
37; RV32I-NEXT:    slli a4, a4, 16
38; RV32I-NEXT:    slli a5, a5, 24
39; RV32I-NEXT:    or a0, a3, a0
40; RV32I-NEXT:    lbu a3, 0(a1)
41; RV32I-NEXT:    lbu a6, 1(a1)
42; RV32I-NEXT:    or a4, a5, a4
43; RV32I-NEXT:    lbu a5, 2(a1)
44; RV32I-NEXT:    lbu a1, 3(a1)
45; RV32I-NEXT:    slli a6, a6, 8
46; RV32I-NEXT:    or a3, a6, a3
47; RV32I-NEXT:    slli a5, a5, 16
48; RV32I-NEXT:    slli a1, a1, 24
49; RV32I-NEXT:    or a1, a1, a5
50; RV32I-NEXT:    or a0, a4, a0
51; RV32I-NEXT:    or a1, a1, a3
52; RV32I-NEXT:    slli a1, a1, 3
53; RV32I-NEXT:    srl a0, a0, a1
54; RV32I-NEXT:    srli a1, a0, 16
55; RV32I-NEXT:    srli a3, a0, 24
56; RV32I-NEXT:    srli a4, a0, 8
57; RV32I-NEXT:    sb a0, 0(a2)
58; RV32I-NEXT:    sb a4, 1(a2)
59; RV32I-NEXT:    sb a1, 2(a2)
60; RV32I-NEXT:    sb a3, 3(a2)
61; RV32I-NEXT:    ret
62  %src = load i32, ptr %src.ptr, align 1
63  %byteOff = load i32, ptr %byteOff.ptr, align 1
64  %bitOff = shl i32 %byteOff, 3
65  %res = lshr i32 %src, %bitOff
66  store i32 %res, ptr %dst, align 1
67  ret void
68}
69define void @shl_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
70; RV64I-LABEL: shl_4bytes:
71; RV64I:       # %bb.0:
72; RV64I-NEXT:    lbu a3, 0(a0)
73; RV64I-NEXT:    lbu a4, 1(a0)
74; RV64I-NEXT:    lbu a5, 2(a0)
75; RV64I-NEXT:    lb a0, 3(a0)
76; RV64I-NEXT:    lbu a1, 0(a1)
77; RV64I-NEXT:    slli a4, a4, 8
78; RV64I-NEXT:    or a3, a4, a3
79; RV64I-NEXT:    slli a5, a5, 16
80; RV64I-NEXT:    slli a0, a0, 24
81; RV64I-NEXT:    slli a1, a1, 3
82; RV64I-NEXT:    or a0, a0, a5
83; RV64I-NEXT:    or a0, a0, a3
84; RV64I-NEXT:    sllw a0, a0, a1
85; RV64I-NEXT:    srli a1, a0, 16
86; RV64I-NEXT:    srli a3, a0, 24
87; RV64I-NEXT:    srli a4, a0, 8
88; RV64I-NEXT:    sb a0, 0(a2)
89; RV64I-NEXT:    sb a4, 1(a2)
90; RV64I-NEXT:    sb a1, 2(a2)
91; RV64I-NEXT:    sb a3, 3(a2)
92; RV64I-NEXT:    ret
93;
94; RV32I-LABEL: shl_4bytes:
95; RV32I:       # %bb.0:
96; RV32I-NEXT:    lbu a3, 1(a0)
97; RV32I-NEXT:    lbu a4, 2(a0)
98; RV32I-NEXT:    lbu a5, 3(a0)
99; RV32I-NEXT:    lbu a0, 0(a0)
100; RV32I-NEXT:    slli a3, a3, 8
101; RV32I-NEXT:    slli a4, a4, 16
102; RV32I-NEXT:    slli a5, a5, 24
103; RV32I-NEXT:    or a0, a3, a0
104; RV32I-NEXT:    lbu a3, 0(a1)
105; RV32I-NEXT:    lbu a6, 1(a1)
106; RV32I-NEXT:    or a4, a5, a4
107; RV32I-NEXT:    lbu a5, 2(a1)
108; RV32I-NEXT:    lbu a1, 3(a1)
109; RV32I-NEXT:    slli a6, a6, 8
110; RV32I-NEXT:    or a3, a6, a3
111; RV32I-NEXT:    slli a5, a5, 16
112; RV32I-NEXT:    slli a1, a1, 24
113; RV32I-NEXT:    or a1, a1, a5
114; RV32I-NEXT:    or a0, a4, a0
115; RV32I-NEXT:    or a1, a1, a3
116; RV32I-NEXT:    slli a1, a1, 3
117; RV32I-NEXT:    sll a0, a0, a1
118; RV32I-NEXT:    srli a1, a0, 16
119; RV32I-NEXT:    srli a3, a0, 24
120; RV32I-NEXT:    srli a4, a0, 8
121; RV32I-NEXT:    sb a0, 0(a2)
122; RV32I-NEXT:    sb a4, 1(a2)
123; RV32I-NEXT:    sb a1, 2(a2)
124; RV32I-NEXT:    sb a3, 3(a2)
125; RV32I-NEXT:    ret
126  %src = load i32, ptr %src.ptr, align 1
127  %byteOff = load i32, ptr %byteOff.ptr, align 1
128  %bitOff = shl i32 %byteOff, 3
129  %res = shl i32 %src, %bitOff
130  store i32 %res, ptr %dst, align 1
131  ret void
132}
133define void @ashr_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
134; RV64I-LABEL: ashr_4bytes:
135; RV64I:       # %bb.0:
136; RV64I-NEXT:    lbu a3, 0(a0)
137; RV64I-NEXT:    lbu a4, 1(a0)
138; RV64I-NEXT:    lbu a5, 2(a0)
139; RV64I-NEXT:    lb a0, 3(a0)
140; RV64I-NEXT:    lbu a1, 0(a1)
141; RV64I-NEXT:    slli a4, a4, 8
142; RV64I-NEXT:    or a3, a4, a3
143; RV64I-NEXT:    slli a5, a5, 16
144; RV64I-NEXT:    slli a0, a0, 24
145; RV64I-NEXT:    slli a1, a1, 3
146; RV64I-NEXT:    or a0, a0, a5
147; RV64I-NEXT:    or a0, a0, a3
148; RV64I-NEXT:    sraw a0, a0, a1
149; RV64I-NEXT:    srli a1, a0, 16
150; RV64I-NEXT:    srli a3, a0, 24
151; RV64I-NEXT:    srli a4, a0, 8
152; RV64I-NEXT:    sb a0, 0(a2)
153; RV64I-NEXT:    sb a4, 1(a2)
154; RV64I-NEXT:    sb a1, 2(a2)
155; RV64I-NEXT:    sb a3, 3(a2)
156; RV64I-NEXT:    ret
157;
158; RV32I-LABEL: ashr_4bytes:
159; RV32I:       # %bb.0:
160; RV32I-NEXT:    lbu a3, 1(a0)
161; RV32I-NEXT:    lbu a4, 2(a0)
162; RV32I-NEXT:    lbu a5, 3(a0)
163; RV32I-NEXT:    lbu a0, 0(a0)
164; RV32I-NEXT:    slli a3, a3, 8
165; RV32I-NEXT:    slli a4, a4, 16
166; RV32I-NEXT:    slli a5, a5, 24
167; RV32I-NEXT:    or a0, a3, a0
168; RV32I-NEXT:    lbu a3, 0(a1)
169; RV32I-NEXT:    lbu a6, 1(a1)
170; RV32I-NEXT:    or a4, a5, a4
171; RV32I-NEXT:    lbu a5, 2(a1)
172; RV32I-NEXT:    lbu a1, 3(a1)
173; RV32I-NEXT:    slli a6, a6, 8
174; RV32I-NEXT:    or a3, a6, a3
175; RV32I-NEXT:    slli a5, a5, 16
176; RV32I-NEXT:    slli a1, a1, 24
177; RV32I-NEXT:    or a1, a1, a5
178; RV32I-NEXT:    or a0, a4, a0
179; RV32I-NEXT:    or a1, a1, a3
180; RV32I-NEXT:    slli a1, a1, 3
181; RV32I-NEXT:    sra a0, a0, a1
182; RV32I-NEXT:    srli a1, a0, 16
183; RV32I-NEXT:    srli a3, a0, 24
184; RV32I-NEXT:    srli a4, a0, 8
185; RV32I-NEXT:    sb a0, 0(a2)
186; RV32I-NEXT:    sb a4, 1(a2)
187; RV32I-NEXT:    sb a1, 2(a2)
188; RV32I-NEXT:    sb a3, 3(a2)
189; RV32I-NEXT:    ret
190  %src = load i32, ptr %src.ptr, align 1
191  %byteOff = load i32, ptr %byteOff.ptr, align 1
192  %bitOff = shl i32 %byteOff, 3
193  %res = ashr i32 %src, %bitOff
194  store i32 %res, ptr %dst, align 1
195  ret void
196}
197
198define void @lshr_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
199; RV64I-LABEL: lshr_8bytes:
200; RV64I:       # %bb.0:
201; RV64I-NEXT:    lbu a3, 0(a0)
202; RV64I-NEXT:    lbu a4, 1(a0)
203; RV64I-NEXT:    lbu a5, 2(a0)
204; RV64I-NEXT:    lbu a6, 3(a0)
205; RV64I-NEXT:    lbu a7, 4(a0)
206; RV64I-NEXT:    lbu t0, 5(a0)
207; RV64I-NEXT:    lbu t1, 6(a0)
208; RV64I-NEXT:    lbu a0, 7(a0)
209; RV64I-NEXT:    slli a4, a4, 8
210; RV64I-NEXT:    slli a5, a5, 16
211; RV64I-NEXT:    slli a6, a6, 24
212; RV64I-NEXT:    slli t0, t0, 8
213; RV64I-NEXT:    or a3, a4, a3
214; RV64I-NEXT:    or a4, a6, a5
215; RV64I-NEXT:    or a5, t0, a7
216; RV64I-NEXT:    lbu a6, 4(a1)
217; RV64I-NEXT:    lbu a7, 5(a1)
218; RV64I-NEXT:    lbu t0, 6(a1)
219; RV64I-NEXT:    lbu t2, 7(a1)
220; RV64I-NEXT:    slli t1, t1, 16
221; RV64I-NEXT:    slli a0, a0, 24
222; RV64I-NEXT:    slli a7, a7, 8
223; RV64I-NEXT:    slli t0, t0, 16
224; RV64I-NEXT:    slli t2, t2, 24
225; RV64I-NEXT:    or a0, a0, t1
226; RV64I-NEXT:    or a6, a7, a6
227; RV64I-NEXT:    lbu a7, 0(a1)
228; RV64I-NEXT:    lbu t1, 1(a1)
229; RV64I-NEXT:    or t0, t2, t0
230; RV64I-NEXT:    lbu t2, 2(a1)
231; RV64I-NEXT:    lbu a1, 3(a1)
232; RV64I-NEXT:    slli t1, t1, 8
233; RV64I-NEXT:    or a7, t1, a7
234; RV64I-NEXT:    slli t2, t2, 16
235; RV64I-NEXT:    slli a1, a1, 24
236; RV64I-NEXT:    or a1, a1, t2
237; RV64I-NEXT:    or a3, a4, a3
238; RV64I-NEXT:    or a0, a0, a5
239; RV64I-NEXT:    or a4, t0, a6
240; RV64I-NEXT:    or a1, a1, a7
241; RV64I-NEXT:    slli a0, a0, 32
242; RV64I-NEXT:    slli a1, a1, 3
243; RV64I-NEXT:    slli a4, a4, 35
244; RV64I-NEXT:    or a0, a0, a3
245; RV64I-NEXT:    or a1, a4, a1
246; RV64I-NEXT:    srl a0, a0, a1
247; RV64I-NEXT:    srli a1, a0, 48
248; RV64I-NEXT:    srli a3, a0, 56
249; RV64I-NEXT:    srli a4, a0, 32
250; RV64I-NEXT:    srli a5, a0, 40
251; RV64I-NEXT:    srli a6, a0, 16
252; RV64I-NEXT:    srli a7, a0, 24
253; RV64I-NEXT:    srli t0, a0, 8
254; RV64I-NEXT:    sb a4, 4(a2)
255; RV64I-NEXT:    sb a5, 5(a2)
256; RV64I-NEXT:    sb a1, 6(a2)
257; RV64I-NEXT:    sb a3, 7(a2)
258; RV64I-NEXT:    sb a0, 0(a2)
259; RV64I-NEXT:    sb t0, 1(a2)
260; RV64I-NEXT:    sb a6, 2(a2)
261; RV64I-NEXT:    sb a7, 3(a2)
262; RV64I-NEXT:    ret
263;
264; RV32I-LABEL: lshr_8bytes:
265; RV32I:       # %bb.0:
266; RV32I-NEXT:    lbu a3, 5(a0)
267; RV32I-NEXT:    lbu a4, 6(a0)
268; RV32I-NEXT:    lbu a5, 7(a0)
269; RV32I-NEXT:    lbu a6, 4(a0)
270; RV32I-NEXT:    slli a3, a3, 8
271; RV32I-NEXT:    slli a4, a4, 16
272; RV32I-NEXT:    slli a5, a5, 24
273; RV32I-NEXT:    or a3, a3, a6
274; RV32I-NEXT:    lbu a6, 0(a1)
275; RV32I-NEXT:    lbu a7, 1(a1)
276; RV32I-NEXT:    or a4, a5, a4
277; RV32I-NEXT:    lbu a5, 2(a1)
278; RV32I-NEXT:    lbu a1, 3(a1)
279; RV32I-NEXT:    slli a7, a7, 8
280; RV32I-NEXT:    or a6, a7, a6
281; RV32I-NEXT:    slli a5, a5, 16
282; RV32I-NEXT:    slli a1, a1, 24
283; RV32I-NEXT:    or a1, a1, a5
284; RV32I-NEXT:    or a5, a4, a3
285; RV32I-NEXT:    or a4, a1, a6
286; RV32I-NEXT:    slli a4, a4, 3
287; RV32I-NEXT:    addi a3, a4, -32
288; RV32I-NEXT:    srl a1, a5, a4
289; RV32I-NEXT:    bltz a3, .LBB3_2
290; RV32I-NEXT:  # %bb.1:
291; RV32I-NEXT:    mv a0, a1
292; RV32I-NEXT:    j .LBB3_3
293; RV32I-NEXT:  .LBB3_2:
294; RV32I-NEXT:    lbu a6, 1(a0)
295; RV32I-NEXT:    lbu a7, 0(a0)
296; RV32I-NEXT:    lbu t0, 2(a0)
297; RV32I-NEXT:    lbu a0, 3(a0)
298; RV32I-NEXT:    slli a6, a6, 8
299; RV32I-NEXT:    or a6, a6, a7
300; RV32I-NEXT:    slli a5, a5, 1
301; RV32I-NEXT:    slli t0, t0, 16
302; RV32I-NEXT:    slli a0, a0, 24
303; RV32I-NEXT:    or a0, a0, t0
304; RV32I-NEXT:    not a7, a4
305; RV32I-NEXT:    or a0, a0, a6
306; RV32I-NEXT:    srl a0, a0, a4
307; RV32I-NEXT:    sll a4, a5, a7
308; RV32I-NEXT:    or a0, a0, a4
309; RV32I-NEXT:  .LBB3_3:
310; RV32I-NEXT:    srai a3, a3, 31
311; RV32I-NEXT:    srli a4, a0, 16
312; RV32I-NEXT:    srli a5, a0, 24
313; RV32I-NEXT:    and a1, a3, a1
314; RV32I-NEXT:    srli a3, a1, 16
315; RV32I-NEXT:    srli a6, a1, 24
316; RV32I-NEXT:    srli a7, a1, 8
317; RV32I-NEXT:    sb a1, 4(a2)
318; RV32I-NEXT:    sb a7, 5(a2)
319; RV32I-NEXT:    sb a3, 6(a2)
320; RV32I-NEXT:    sb a6, 7(a2)
321; RV32I-NEXT:    srli a1, a0, 8
322; RV32I-NEXT:    sb a0, 0(a2)
323; RV32I-NEXT:    sb a1, 1(a2)
324; RV32I-NEXT:    sb a4, 2(a2)
325; RV32I-NEXT:    sb a5, 3(a2)
326; RV32I-NEXT:    ret
327  %src = load i64, ptr %src.ptr, align 1
328  %byteOff = load i64, ptr %byteOff.ptr, align 1
329  %bitOff = shl i64 %byteOff, 3
330  %res = lshr i64 %src, %bitOff
331  store i64 %res, ptr %dst, align 1
332  ret void
333}
334define void @shl_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
335; RV64I-LABEL: shl_8bytes:
336; RV64I:       # %bb.0:
337; RV64I-NEXT:    lbu a3, 0(a0)
338; RV64I-NEXT:    lbu a4, 1(a0)
339; RV64I-NEXT:    lbu a5, 2(a0)
340; RV64I-NEXT:    lbu a6, 3(a0)
341; RV64I-NEXT:    lbu a7, 4(a0)
342; RV64I-NEXT:    lbu t0, 5(a0)
343; RV64I-NEXT:    lbu t1, 6(a0)
344; RV64I-NEXT:    lbu a0, 7(a0)
345; RV64I-NEXT:    slli a4, a4, 8
346; RV64I-NEXT:    slli a5, a5, 16
347; RV64I-NEXT:    slli a6, a6, 24
348; RV64I-NEXT:    slli t0, t0, 8
349; RV64I-NEXT:    or a3, a4, a3
350; RV64I-NEXT:    or a4, a6, a5
351; RV64I-NEXT:    or a5, t0, a7
352; RV64I-NEXT:    lbu a6, 4(a1)
353; RV64I-NEXT:    lbu a7, 5(a1)
354; RV64I-NEXT:    lbu t0, 6(a1)
355; RV64I-NEXT:    lbu t2, 7(a1)
356; RV64I-NEXT:    slli t1, t1, 16
357; RV64I-NEXT:    slli a0, a0, 24
358; RV64I-NEXT:    slli a7, a7, 8
359; RV64I-NEXT:    slli t0, t0, 16
360; RV64I-NEXT:    slli t2, t2, 24
361; RV64I-NEXT:    or a0, a0, t1
362; RV64I-NEXT:    or a6, a7, a6
363; RV64I-NEXT:    lbu a7, 0(a1)
364; RV64I-NEXT:    lbu t1, 1(a1)
365; RV64I-NEXT:    or t0, t2, t0
366; RV64I-NEXT:    lbu t2, 2(a1)
367; RV64I-NEXT:    lbu a1, 3(a1)
368; RV64I-NEXT:    slli t1, t1, 8
369; RV64I-NEXT:    or a7, t1, a7
370; RV64I-NEXT:    slli t2, t2, 16
371; RV64I-NEXT:    slli a1, a1, 24
372; RV64I-NEXT:    or a1, a1, t2
373; RV64I-NEXT:    or a3, a4, a3
374; RV64I-NEXT:    or a0, a0, a5
375; RV64I-NEXT:    or a4, t0, a6
376; RV64I-NEXT:    or a1, a1, a7
377; RV64I-NEXT:    slli a0, a0, 32
378; RV64I-NEXT:    slli a1, a1, 3
379; RV64I-NEXT:    slli a4, a4, 35
380; RV64I-NEXT:    or a0, a0, a3
381; RV64I-NEXT:    or a1, a4, a1
382; RV64I-NEXT:    sll a0, a0, a1
383; RV64I-NEXT:    srli a1, a0, 48
384; RV64I-NEXT:    srli a3, a0, 56
385; RV64I-NEXT:    srli a4, a0, 32
386; RV64I-NEXT:    srli a5, a0, 40
387; RV64I-NEXT:    srli a6, a0, 16
388; RV64I-NEXT:    srli a7, a0, 24
389; RV64I-NEXT:    srli t0, a0, 8
390; RV64I-NEXT:    sb a4, 4(a2)
391; RV64I-NEXT:    sb a5, 5(a2)
392; RV64I-NEXT:    sb a1, 6(a2)
393; RV64I-NEXT:    sb a3, 7(a2)
394; RV64I-NEXT:    sb a0, 0(a2)
395; RV64I-NEXT:    sb t0, 1(a2)
396; RV64I-NEXT:    sb a6, 2(a2)
397; RV64I-NEXT:    sb a7, 3(a2)
398; RV64I-NEXT:    ret
399;
400; RV32I-LABEL: shl_8bytes:
401; RV32I:       # %bb.0:
402; RV32I-NEXT:    lbu a3, 1(a0)
403; RV32I-NEXT:    lbu a4, 2(a0)
404; RV32I-NEXT:    lbu a5, 3(a0)
405; RV32I-NEXT:    lbu a6, 0(a0)
406; RV32I-NEXT:    slli a3, a3, 8
407; RV32I-NEXT:    slli a4, a4, 16
408; RV32I-NEXT:    slli a5, a5, 24
409; RV32I-NEXT:    or a3, a3, a6
410; RV32I-NEXT:    lbu a6, 0(a1)
411; RV32I-NEXT:    lbu a7, 1(a1)
412; RV32I-NEXT:    or a4, a5, a4
413; RV32I-NEXT:    lbu a5, 2(a1)
414; RV32I-NEXT:    lbu a1, 3(a1)
415; RV32I-NEXT:    slli a7, a7, 8
416; RV32I-NEXT:    or a6, a7, a6
417; RV32I-NEXT:    slli a5, a5, 16
418; RV32I-NEXT:    slli a1, a1, 24
419; RV32I-NEXT:    or a1, a1, a5
420; RV32I-NEXT:    or a5, a4, a3
421; RV32I-NEXT:    or a4, a1, a6
422; RV32I-NEXT:    slli a4, a4, 3
423; RV32I-NEXT:    addi a3, a4, -32
424; RV32I-NEXT:    sll a1, a5, a4
425; RV32I-NEXT:    bltz a3, .LBB4_2
426; RV32I-NEXT:  # %bb.1:
427; RV32I-NEXT:    mv a0, a1
428; RV32I-NEXT:    j .LBB4_3
429; RV32I-NEXT:  .LBB4_2:
430; RV32I-NEXT:    lbu a6, 5(a0)
431; RV32I-NEXT:    lbu a7, 4(a0)
432; RV32I-NEXT:    lbu t0, 6(a0)
433; RV32I-NEXT:    lbu a0, 7(a0)
434; RV32I-NEXT:    slli a6, a6, 8
435; RV32I-NEXT:    or a6, a6, a7
436; RV32I-NEXT:    srli a5, a5, 1
437; RV32I-NEXT:    slli t0, t0, 16
438; RV32I-NEXT:    slli a0, a0, 24
439; RV32I-NEXT:    or a0, a0, t0
440; RV32I-NEXT:    not a7, a4
441; RV32I-NEXT:    or a0, a0, a6
442; RV32I-NEXT:    sll a0, a0, a4
443; RV32I-NEXT:    srl a4, a5, a7
444; RV32I-NEXT:    or a0, a0, a4
445; RV32I-NEXT:  .LBB4_3:
446; RV32I-NEXT:    srai a3, a3, 31
447; RV32I-NEXT:    srli a4, a0, 16
448; RV32I-NEXT:    srli a5, a0, 24
449; RV32I-NEXT:    and a1, a3, a1
450; RV32I-NEXT:    srli a3, a1, 16
451; RV32I-NEXT:    srli a6, a1, 24
452; RV32I-NEXT:    srli a7, a1, 8
453; RV32I-NEXT:    sb a1, 0(a2)
454; RV32I-NEXT:    sb a7, 1(a2)
455; RV32I-NEXT:    sb a3, 2(a2)
456; RV32I-NEXT:    sb a6, 3(a2)
457; RV32I-NEXT:    srli a1, a0, 8
458; RV32I-NEXT:    sb a0, 4(a2)
459; RV32I-NEXT:    sb a1, 5(a2)
460; RV32I-NEXT:    sb a4, 6(a2)
461; RV32I-NEXT:    sb a5, 7(a2)
462; RV32I-NEXT:    ret
463  %src = load i64, ptr %src.ptr, align 1
464  %byteOff = load i64, ptr %byteOff.ptr, align 1
465  %bitOff = shl i64 %byteOff, 3
466  %res = shl i64 %src, %bitOff
467  store i64 %res, ptr %dst, align 1
468  ret void
469}
470define void @ashr_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
471; RV64I-LABEL: ashr_8bytes:
472; RV64I:       # %bb.0:
473; RV64I-NEXT:    lbu a3, 0(a0)
474; RV64I-NEXT:    lbu a4, 1(a0)
475; RV64I-NEXT:    lbu a5, 2(a0)
476; RV64I-NEXT:    lbu a6, 3(a0)
477; RV64I-NEXT:    lbu a7, 4(a0)
478; RV64I-NEXT:    lbu t0, 5(a0)
479; RV64I-NEXT:    lbu t1, 6(a0)
480; RV64I-NEXT:    lbu a0, 7(a0)
481; RV64I-NEXT:    slli a4, a4, 8
482; RV64I-NEXT:    slli a5, a5, 16
483; RV64I-NEXT:    slli a6, a6, 24
484; RV64I-NEXT:    slli t0, t0, 8
485; RV64I-NEXT:    or a3, a4, a3
486; RV64I-NEXT:    or a4, a6, a5
487; RV64I-NEXT:    or a5, t0, a7
488; RV64I-NEXT:    lbu a6, 4(a1)
489; RV64I-NEXT:    lbu a7, 5(a1)
490; RV64I-NEXT:    lbu t0, 6(a1)
491; RV64I-NEXT:    lbu t2, 7(a1)
492; RV64I-NEXT:    slli t1, t1, 16
493; RV64I-NEXT:    slli a0, a0, 24
494; RV64I-NEXT:    slli a7, a7, 8
495; RV64I-NEXT:    slli t0, t0, 16
496; RV64I-NEXT:    slli t2, t2, 24
497; RV64I-NEXT:    or a0, a0, t1
498; RV64I-NEXT:    or a6, a7, a6
499; RV64I-NEXT:    lbu a7, 0(a1)
500; RV64I-NEXT:    lbu t1, 1(a1)
501; RV64I-NEXT:    or t0, t2, t0
502; RV64I-NEXT:    lbu t2, 2(a1)
503; RV64I-NEXT:    lbu a1, 3(a1)
504; RV64I-NEXT:    slli t1, t1, 8
505; RV64I-NEXT:    or a7, t1, a7
506; RV64I-NEXT:    slli t2, t2, 16
507; RV64I-NEXT:    slli a1, a1, 24
508; RV64I-NEXT:    or a1, a1, t2
509; RV64I-NEXT:    or a3, a4, a3
510; RV64I-NEXT:    or a0, a0, a5
511; RV64I-NEXT:    or a4, t0, a6
512; RV64I-NEXT:    or a1, a1, a7
513; RV64I-NEXT:    slli a0, a0, 32
514; RV64I-NEXT:    slli a1, a1, 3
515; RV64I-NEXT:    slli a4, a4, 35
516; RV64I-NEXT:    or a0, a0, a3
517; RV64I-NEXT:    or a1, a4, a1
518; RV64I-NEXT:    sra a0, a0, a1
519; RV64I-NEXT:    srli a1, a0, 48
520; RV64I-NEXT:    srli a3, a0, 56
521; RV64I-NEXT:    srli a4, a0, 32
522; RV64I-NEXT:    srli a5, a0, 40
523; RV64I-NEXT:    srli a6, a0, 16
524; RV64I-NEXT:    srli a7, a0, 24
525; RV64I-NEXT:    srli t0, a0, 8
526; RV64I-NEXT:    sb a4, 4(a2)
527; RV64I-NEXT:    sb a5, 5(a2)
528; RV64I-NEXT:    sb a1, 6(a2)
529; RV64I-NEXT:    sb a3, 7(a2)
530; RV64I-NEXT:    sb a0, 0(a2)
531; RV64I-NEXT:    sb t0, 1(a2)
532; RV64I-NEXT:    sb a6, 2(a2)
533; RV64I-NEXT:    sb a7, 3(a2)
534; RV64I-NEXT:    ret
535;
536; RV32I-LABEL: ashr_8bytes:
537; RV32I:       # %bb.0:
538; RV32I-NEXT:    lbu a3, 5(a0)
539; RV32I-NEXT:    lbu a4, 4(a0)
540; RV32I-NEXT:    lbu a5, 6(a0)
541; RV32I-NEXT:    lbu a6, 7(a0)
542; RV32I-NEXT:    slli a3, a3, 8
543; RV32I-NEXT:    lbu a7, 0(a1)
544; RV32I-NEXT:    lbu t0, 1(a1)
545; RV32I-NEXT:    or a3, a3, a4
546; RV32I-NEXT:    lbu a4, 2(a1)
547; RV32I-NEXT:    lbu a1, 3(a1)
548; RV32I-NEXT:    slli t0, t0, 8
549; RV32I-NEXT:    or a7, t0, a7
550; RV32I-NEXT:    slli a4, a4, 16
551; RV32I-NEXT:    slli a1, a1, 24
552; RV32I-NEXT:    or a1, a1, a4
553; RV32I-NEXT:    slli a4, a5, 16
554; RV32I-NEXT:    slli a5, a6, 24
555; RV32I-NEXT:    or a4, a5, a4
556; RV32I-NEXT:    or a4, a4, a3
557; RV32I-NEXT:    or a3, a1, a7
558; RV32I-NEXT:    slli a3, a3, 3
559; RV32I-NEXT:    addi a6, a3, -32
560; RV32I-NEXT:    sra a1, a4, a3
561; RV32I-NEXT:    bltz a6, .LBB5_2
562; RV32I-NEXT:  # %bb.1:
563; RV32I-NEXT:    srai a5, a5, 31
564; RV32I-NEXT:    mv a0, a1
565; RV32I-NEXT:    mv a1, a5
566; RV32I-NEXT:    j .LBB5_3
567; RV32I-NEXT:  .LBB5_2:
568; RV32I-NEXT:    lbu a5, 1(a0)
569; RV32I-NEXT:    lbu a6, 0(a0)
570; RV32I-NEXT:    lbu a7, 2(a0)
571; RV32I-NEXT:    lbu a0, 3(a0)
572; RV32I-NEXT:    slli a5, a5, 8
573; RV32I-NEXT:    or a5, a5, a6
574; RV32I-NEXT:    slli a4, a4, 1
575; RV32I-NEXT:    slli a7, a7, 16
576; RV32I-NEXT:    slli a0, a0, 24
577; RV32I-NEXT:    or a0, a0, a7
578; RV32I-NEXT:    not a6, a3
579; RV32I-NEXT:    or a0, a0, a5
580; RV32I-NEXT:    srl a0, a0, a3
581; RV32I-NEXT:    sll a3, a4, a6
582; RV32I-NEXT:    or a0, a0, a3
583; RV32I-NEXT:  .LBB5_3:
584; RV32I-NEXT:    srli a3, a1, 16
585; RV32I-NEXT:    srli a4, a1, 24
586; RV32I-NEXT:    srli a5, a1, 8
587; RV32I-NEXT:    srli a6, a0, 16
588; RV32I-NEXT:    srli a7, a0, 24
589; RV32I-NEXT:    sb a1, 4(a2)
590; RV32I-NEXT:    sb a5, 5(a2)
591; RV32I-NEXT:    sb a3, 6(a2)
592; RV32I-NEXT:    sb a4, 7(a2)
593; RV32I-NEXT:    srli a1, a0, 8
594; RV32I-NEXT:    sb a0, 0(a2)
595; RV32I-NEXT:    sb a1, 1(a2)
596; RV32I-NEXT:    sb a6, 2(a2)
597; RV32I-NEXT:    sb a7, 3(a2)
598; RV32I-NEXT:    ret
599  %src = load i64, ptr %src.ptr, align 1
600  %byteOff = load i64, ptr %byteOff.ptr, align 1
601  %bitOff = shl i64 %byteOff, 3
602  %res = ashr i64 %src, %bitOff
603  store i64 %res, ptr %dst, align 1
604  ret void
605}
606
607define void @lshr_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
608; RV64I-LABEL: lshr_16bytes:
609; RV64I:       # %bb.0:
610; RV64I-NEXT:    lbu a3, 8(a0)
611; RV64I-NEXT:    lbu a4, 9(a0)
612; RV64I-NEXT:    lbu a5, 10(a0)
613; RV64I-NEXT:    lbu a6, 11(a0)
614; RV64I-NEXT:    lbu a7, 12(a0)
615; RV64I-NEXT:    lbu t0, 13(a0)
616; RV64I-NEXT:    lbu t1, 14(a0)
617; RV64I-NEXT:    lbu t2, 15(a0)
618; RV64I-NEXT:    slli a4, a4, 8
619; RV64I-NEXT:    slli a5, a5, 16
620; RV64I-NEXT:    slli a6, a6, 24
621; RV64I-NEXT:    slli t0, t0, 8
622; RV64I-NEXT:    or a3, a4, a3
623; RV64I-NEXT:    or a4, a6, a5
624; RV64I-NEXT:    or a5, t0, a7
625; RV64I-NEXT:    lbu a6, 4(a1)
626; RV64I-NEXT:    lbu a7, 5(a1)
627; RV64I-NEXT:    lbu t0, 6(a1)
628; RV64I-NEXT:    lbu t3, 7(a1)
629; RV64I-NEXT:    slli t1, t1, 16
630; RV64I-NEXT:    slli t2, t2, 24
631; RV64I-NEXT:    slli a7, a7, 8
632; RV64I-NEXT:    slli t0, t0, 16
633; RV64I-NEXT:    slli t3, t3, 24
634; RV64I-NEXT:    or t1, t2, t1
635; RV64I-NEXT:    or a6, a7, a6
636; RV64I-NEXT:    lbu a7, 0(a1)
637; RV64I-NEXT:    lbu t2, 1(a1)
638; RV64I-NEXT:    or t0, t3, t0
639; RV64I-NEXT:    lbu t3, 2(a1)
640; RV64I-NEXT:    lbu a1, 3(a1)
641; RV64I-NEXT:    slli t2, t2, 8
642; RV64I-NEXT:    or a7, t2, a7
643; RV64I-NEXT:    slli t3, t3, 16
644; RV64I-NEXT:    slli a1, a1, 24
645; RV64I-NEXT:    or a1, a1, t3
646; RV64I-NEXT:    or a3, a4, a3
647; RV64I-NEXT:    or a4, t1, a5
648; RV64I-NEXT:    or a5, t0, a6
649; RV64I-NEXT:    or a1, a1, a7
650; RV64I-NEXT:    slli a4, a4, 32
651; RV64I-NEXT:    slli a1, a1, 3
652; RV64I-NEXT:    slli a6, a5, 35
653; RV64I-NEXT:    or a5, a4, a3
654; RV64I-NEXT:    or a4, a6, a1
655; RV64I-NEXT:    addi a3, a4, -64
656; RV64I-NEXT:    srl a1, a5, a4
657; RV64I-NEXT:    bltz a3, .LBB6_2
658; RV64I-NEXT:  # %bb.1:
659; RV64I-NEXT:    mv a0, a1
660; RV64I-NEXT:    j .LBB6_3
661; RV64I-NEXT:  .LBB6_2:
662; RV64I-NEXT:    lbu a6, 1(a0)
663; RV64I-NEXT:    lbu a7, 2(a0)
664; RV64I-NEXT:    lbu t0, 3(a0)
665; RV64I-NEXT:    lbu t1, 0(a0)
666; RV64I-NEXT:    slli a6, a6, 8
667; RV64I-NEXT:    slli a7, a7, 16
668; RV64I-NEXT:    slli t0, t0, 24
669; RV64I-NEXT:    or a6, a6, t1
670; RV64I-NEXT:    lbu t1, 4(a0)
671; RV64I-NEXT:    lbu t2, 5(a0)
672; RV64I-NEXT:    or a7, t0, a7
673; RV64I-NEXT:    lbu t0, 6(a0)
674; RV64I-NEXT:    lbu a0, 7(a0)
675; RV64I-NEXT:    slli t2, t2, 8
676; RV64I-NEXT:    or t1, t2, t1
677; RV64I-NEXT:    slli t0, t0, 16
678; RV64I-NEXT:    slli a0, a0, 24
679; RV64I-NEXT:    or a0, a0, t0
680; RV64I-NEXT:    or a6, a7, a6
681; RV64I-NEXT:    not a7, a4
682; RV64I-NEXT:    slli a5, a5, 1
683; RV64I-NEXT:    or a0, a0, t1
684; RV64I-NEXT:    slli a0, a0, 32
685; RV64I-NEXT:    or a0, a0, a6
686; RV64I-NEXT:    srl a0, a0, a4
687; RV64I-NEXT:    sll a4, a5, a7
688; RV64I-NEXT:    or a0, a0, a4
689; RV64I-NEXT:  .LBB6_3:
690; RV64I-NEXT:    srai a3, a3, 63
691; RV64I-NEXT:    srli a4, a0, 56
692; RV64I-NEXT:    srli a5, a0, 48
693; RV64I-NEXT:    srli a6, a0, 40
694; RV64I-NEXT:    srli a7, a0, 32
695; RV64I-NEXT:    srli t0, a0, 24
696; RV64I-NEXT:    srli t1, a0, 16
697; RV64I-NEXT:    and a1, a3, a1
698; RV64I-NEXT:    sb a7, 4(a2)
699; RV64I-NEXT:    sb a6, 5(a2)
700; RV64I-NEXT:    sb a5, 6(a2)
701; RV64I-NEXT:    sb a4, 7(a2)
702; RV64I-NEXT:    srli a3, a1, 56
703; RV64I-NEXT:    srli a4, a1, 48
704; RV64I-NEXT:    srli a5, a1, 40
705; RV64I-NEXT:    srli a6, a1, 32
706; RV64I-NEXT:    srli a7, a1, 24
707; RV64I-NEXT:    srli t2, a1, 16
708; RV64I-NEXT:    sb a6, 12(a2)
709; RV64I-NEXT:    sb a5, 13(a2)
710; RV64I-NEXT:    sb a4, 14(a2)
711; RV64I-NEXT:    sb a3, 15(a2)
712; RV64I-NEXT:    srli a3, a1, 8
713; RV64I-NEXT:    sb a1, 8(a2)
714; RV64I-NEXT:    sb a3, 9(a2)
715; RV64I-NEXT:    sb t2, 10(a2)
716; RV64I-NEXT:    sb a7, 11(a2)
717; RV64I-NEXT:    srli a1, a0, 8
718; RV64I-NEXT:    sb a0, 0(a2)
719; RV64I-NEXT:    sb a1, 1(a2)
720; RV64I-NEXT:    sb t1, 2(a2)
721; RV64I-NEXT:    sb t0, 3(a2)
722; RV64I-NEXT:    ret
723;
724; RV32I-LABEL: lshr_16bytes:
725; RV32I:       # %bb.0:
726; RV32I-NEXT:    addi sp, sp, -32
727; RV32I-NEXT:    lbu a3, 0(a0)
728; RV32I-NEXT:    lbu a4, 1(a0)
729; RV32I-NEXT:    lbu a5, 2(a0)
730; RV32I-NEXT:    lbu a6, 3(a0)
731; RV32I-NEXT:    lbu a7, 4(a0)
732; RV32I-NEXT:    lbu t0, 5(a0)
733; RV32I-NEXT:    lbu t1, 6(a0)
734; RV32I-NEXT:    lbu t2, 7(a0)
735; RV32I-NEXT:    slli a4, a4, 8
736; RV32I-NEXT:    slli a5, a5, 16
737; RV32I-NEXT:    slli a6, a6, 24
738; RV32I-NEXT:    or a3, a4, a3
739; RV32I-NEXT:    or a4, a6, a5
740; RV32I-NEXT:    lbu a5, 8(a0)
741; RV32I-NEXT:    lbu a6, 9(a0)
742; RV32I-NEXT:    lbu t3, 10(a0)
743; RV32I-NEXT:    lbu t4, 11(a0)
744; RV32I-NEXT:    slli t0, t0, 8
745; RV32I-NEXT:    slli t1, t1, 16
746; RV32I-NEXT:    slli t2, t2, 24
747; RV32I-NEXT:    slli a6, a6, 8
748; RV32I-NEXT:    or a7, t0, a7
749; RV32I-NEXT:    or t0, t2, t1
750; RV32I-NEXT:    or a5, a6, a5
751; RV32I-NEXT:    lbu a6, 12(a0)
752; RV32I-NEXT:    lbu t1, 13(a0)
753; RV32I-NEXT:    lbu t2, 14(a0)
754; RV32I-NEXT:    lbu a0, 15(a0)
755; RV32I-NEXT:    slli t3, t3, 16
756; RV32I-NEXT:    slli t4, t4, 24
757; RV32I-NEXT:    slli t1, t1, 8
758; RV32I-NEXT:    slli t2, t2, 16
759; RV32I-NEXT:    slli a0, a0, 24
760; RV32I-NEXT:    or t3, t4, t3
761; RV32I-NEXT:    or a6, t1, a6
762; RV32I-NEXT:    or a0, a0, t2
763; RV32I-NEXT:    lbu t1, 0(a1)
764; RV32I-NEXT:    lbu t2, 1(a1)
765; RV32I-NEXT:    lbu t4, 2(a1)
766; RV32I-NEXT:    lbu a1, 3(a1)
767; RV32I-NEXT:    sw zero, 16(sp)
768; RV32I-NEXT:    sw zero, 20(sp)
769; RV32I-NEXT:    sw zero, 24(sp)
770; RV32I-NEXT:    sw zero, 28(sp)
771; RV32I-NEXT:    slli t2, t2, 8
772; RV32I-NEXT:    or t1, t2, t1
773; RV32I-NEXT:    mv t2, sp
774; RV32I-NEXT:    slli t4, t4, 16
775; RV32I-NEXT:    slli a1, a1, 24
776; RV32I-NEXT:    or a1, a1, t4
777; RV32I-NEXT:    or a3, a4, a3
778; RV32I-NEXT:    or a4, t0, a7
779; RV32I-NEXT:    or a5, t3, a5
780; RV32I-NEXT:    or a0, a0, a6
781; RV32I-NEXT:    or a1, a1, t1
782; RV32I-NEXT:    sw a3, 0(sp)
783; RV32I-NEXT:    sw a4, 4(sp)
784; RV32I-NEXT:    sw a5, 8(sp)
785; RV32I-NEXT:    sw a0, 12(sp)
786; RV32I-NEXT:    slli a0, a1, 3
787; RV32I-NEXT:    andi a1, a1, 12
788; RV32I-NEXT:    add a1, t2, a1
789; RV32I-NEXT:    andi a3, a0, 24
790; RV32I-NEXT:    lw a4, 0(a1)
791; RV32I-NEXT:    lw a5, 4(a1)
792; RV32I-NEXT:    lw a6, 8(a1)
793; RV32I-NEXT:    xori a3, a3, 31
794; RV32I-NEXT:    lw a1, 12(a1)
795; RV32I-NEXT:    srl a7, a5, a0
796; RV32I-NEXT:    slli t0, a6, 1
797; RV32I-NEXT:    srl a4, a4, a0
798; RV32I-NEXT:    slli a5, a5, 1
799; RV32I-NEXT:    srl a6, a6, a0
800; RV32I-NEXT:    slli t1, a1, 1
801; RV32I-NEXT:    srl a0, a1, a0
802; RV32I-NEXT:    sll a1, t0, a3
803; RV32I-NEXT:    sll a5, a5, a3
804; RV32I-NEXT:    sll a3, t1, a3
805; RV32I-NEXT:    srli t0, a0, 16
806; RV32I-NEXT:    srli t1, a0, 24
807; RV32I-NEXT:    srli t2, a0, 8
808; RV32I-NEXT:    or a1, a7, a1
809; RV32I-NEXT:    or a5, a4, a5
810; RV32I-NEXT:    or a3, a6, a3
811; RV32I-NEXT:    sb a0, 12(a2)
812; RV32I-NEXT:    sb t2, 13(a2)
813; RV32I-NEXT:    sb t0, 14(a2)
814; RV32I-NEXT:    sb t1, 15(a2)
815; RV32I-NEXT:    srli a0, a3, 16
816; RV32I-NEXT:    srli t0, a3, 24
817; RV32I-NEXT:    srli a3, a3, 8
818; RV32I-NEXT:    srli t1, a5, 16
819; RV32I-NEXT:    srli t2, a5, 24
820; RV32I-NEXT:    srli a5, a5, 8
821; RV32I-NEXT:    srli t3, a1, 16
822; RV32I-NEXT:    srli t4, a1, 24
823; RV32I-NEXT:    srli a1, a1, 8
824; RV32I-NEXT:    sb a6, 8(a2)
825; RV32I-NEXT:    sb a3, 9(a2)
826; RV32I-NEXT:    sb a0, 10(a2)
827; RV32I-NEXT:    sb t0, 11(a2)
828; RV32I-NEXT:    sb a4, 0(a2)
829; RV32I-NEXT:    sb a5, 1(a2)
830; RV32I-NEXT:    sb t1, 2(a2)
831; RV32I-NEXT:    sb t2, 3(a2)
832; RV32I-NEXT:    sb a7, 4(a2)
833; RV32I-NEXT:    sb a1, 5(a2)
834; RV32I-NEXT:    sb t3, 6(a2)
835; RV32I-NEXT:    sb t4, 7(a2)
836; RV32I-NEXT:    addi sp, sp, 32
837; RV32I-NEXT:    ret
838  %src = load i128, ptr %src.ptr, align 1
839  %byteOff = load i128, ptr %byteOff.ptr, align 1
840  %bitOff = shl i128 %byteOff, 3
841  %res = lshr i128 %src, %bitOff
842  store i128 %res, ptr %dst, align 1
843  ret void
844}
845
846define void @lshr_16bytes_wordOff(ptr %src.ptr, ptr %wordOff.ptr, ptr %dst) nounwind {
847; RV64I-LABEL: lshr_16bytes_wordOff:
848; RV64I:       # %bb.0:
849; RV64I-NEXT:    lbu a3, 8(a0)
850; RV64I-NEXT:    lbu a4, 9(a0)
851; RV64I-NEXT:    lbu a5, 10(a0)
852; RV64I-NEXT:    lbu a6, 11(a0)
853; RV64I-NEXT:    lbu a7, 12(a0)
854; RV64I-NEXT:    lbu t0, 13(a0)
855; RV64I-NEXT:    lbu t1, 14(a0)
856; RV64I-NEXT:    lbu t2, 15(a0)
857; RV64I-NEXT:    slli a4, a4, 8
858; RV64I-NEXT:    slli a5, a5, 16
859; RV64I-NEXT:    slli a6, a6, 24
860; RV64I-NEXT:    slli t0, t0, 8
861; RV64I-NEXT:    or a3, a4, a3
862; RV64I-NEXT:    or a4, a6, a5
863; RV64I-NEXT:    or a5, t0, a7
864; RV64I-NEXT:    lbu a6, 4(a1)
865; RV64I-NEXT:    lbu a7, 5(a1)
866; RV64I-NEXT:    lbu t0, 6(a1)
867; RV64I-NEXT:    lbu t3, 7(a1)
868; RV64I-NEXT:    slli t1, t1, 16
869; RV64I-NEXT:    slli t2, t2, 24
870; RV64I-NEXT:    slli a7, a7, 8
871; RV64I-NEXT:    slli t0, t0, 16
872; RV64I-NEXT:    slli t3, t3, 24
873; RV64I-NEXT:    or t1, t2, t1
874; RV64I-NEXT:    or a6, a7, a6
875; RV64I-NEXT:    lbu a7, 0(a1)
876; RV64I-NEXT:    lbu t2, 1(a1)
877; RV64I-NEXT:    or t0, t3, t0
878; RV64I-NEXT:    lbu t3, 2(a1)
879; RV64I-NEXT:    lbu a1, 3(a1)
880; RV64I-NEXT:    slli t2, t2, 8
881; RV64I-NEXT:    or a7, t2, a7
882; RV64I-NEXT:    slli t3, t3, 16
883; RV64I-NEXT:    slli a1, a1, 24
884; RV64I-NEXT:    or a1, a1, t3
885; RV64I-NEXT:    or a3, a4, a3
886; RV64I-NEXT:    or a4, t1, a5
887; RV64I-NEXT:    or a5, t0, a6
888; RV64I-NEXT:    or a1, a1, a7
889; RV64I-NEXT:    slli a4, a4, 32
890; RV64I-NEXT:    slli a1, a1, 5
891; RV64I-NEXT:    slli a6, a5, 37
892; RV64I-NEXT:    or a5, a4, a3
893; RV64I-NEXT:    or a4, a6, a1
894; RV64I-NEXT:    addi a3, a4, -64
895; RV64I-NEXT:    srl a1, a5, a4
896; RV64I-NEXT:    bltz a3, .LBB7_2
897; RV64I-NEXT:  # %bb.1:
898; RV64I-NEXT:    mv a0, a1
899; RV64I-NEXT:    j .LBB7_3
900; RV64I-NEXT:  .LBB7_2:
901; RV64I-NEXT:    lbu a6, 1(a0)
902; RV64I-NEXT:    lbu a7, 2(a0)
903; RV64I-NEXT:    lbu t0, 3(a0)
904; RV64I-NEXT:    lbu t1, 0(a0)
905; RV64I-NEXT:    slli a6, a6, 8
906; RV64I-NEXT:    slli a7, a7, 16
907; RV64I-NEXT:    slli t0, t0, 24
908; RV64I-NEXT:    or a6, a6, t1
909; RV64I-NEXT:    lbu t1, 4(a0)
910; RV64I-NEXT:    lbu t2, 5(a0)
911; RV64I-NEXT:    or a7, t0, a7
912; RV64I-NEXT:    lbu t0, 6(a0)
913; RV64I-NEXT:    lbu a0, 7(a0)
914; RV64I-NEXT:    slli t2, t2, 8
915; RV64I-NEXT:    or t1, t2, t1
916; RV64I-NEXT:    slli t0, t0, 16
917; RV64I-NEXT:    slli a0, a0, 24
918; RV64I-NEXT:    or a0, a0, t0
919; RV64I-NEXT:    or a6, a7, a6
920; RV64I-NEXT:    not a7, a4
921; RV64I-NEXT:    slli a5, a5, 1
922; RV64I-NEXT:    or a0, a0, t1
923; RV64I-NEXT:    slli a0, a0, 32
924; RV64I-NEXT:    or a0, a0, a6
925; RV64I-NEXT:    srl a0, a0, a4
926; RV64I-NEXT:    sll a4, a5, a7
927; RV64I-NEXT:    or a0, a0, a4
928; RV64I-NEXT:  .LBB7_3:
929; RV64I-NEXT:    srai a3, a3, 63
930; RV64I-NEXT:    srli a4, a0, 56
931; RV64I-NEXT:    srli a5, a0, 48
932; RV64I-NEXT:    srli a6, a0, 40
933; RV64I-NEXT:    srli a7, a0, 32
934; RV64I-NEXT:    srli t0, a0, 24
935; RV64I-NEXT:    srli t1, a0, 16
936; RV64I-NEXT:    and a1, a3, a1
937; RV64I-NEXT:    sb a7, 4(a2)
938; RV64I-NEXT:    sb a6, 5(a2)
939; RV64I-NEXT:    sb a5, 6(a2)
940; RV64I-NEXT:    sb a4, 7(a2)
941; RV64I-NEXT:    srli a3, a1, 56
942; RV64I-NEXT:    srli a4, a1, 48
943; RV64I-NEXT:    srli a5, a1, 40
944; RV64I-NEXT:    srli a6, a1, 32
945; RV64I-NEXT:    srli a7, a1, 24
946; RV64I-NEXT:    srli t2, a1, 16
947; RV64I-NEXT:    sb a6, 12(a2)
948; RV64I-NEXT:    sb a5, 13(a2)
949; RV64I-NEXT:    sb a4, 14(a2)
950; RV64I-NEXT:    sb a3, 15(a2)
951; RV64I-NEXT:    srli a3, a1, 8
952; RV64I-NEXT:    sb a1, 8(a2)
953; RV64I-NEXT:    sb a3, 9(a2)
954; RV64I-NEXT:    sb t2, 10(a2)
955; RV64I-NEXT:    sb a7, 11(a2)
956; RV64I-NEXT:    srli a1, a0, 8
957; RV64I-NEXT:    sb a0, 0(a2)
958; RV64I-NEXT:    sb a1, 1(a2)
959; RV64I-NEXT:    sb t1, 2(a2)
960; RV64I-NEXT:    sb t0, 3(a2)
961; RV64I-NEXT:    ret
962;
963; RV32I-LABEL: lshr_16bytes_wordOff:
964; RV32I:       # %bb.0:
965; RV32I-NEXT:    addi sp, sp, -32
966; RV32I-NEXT:    lbu a3, 0(a0)
967; RV32I-NEXT:    lbu a4, 1(a0)
968; RV32I-NEXT:    lbu a5, 2(a0)
969; RV32I-NEXT:    lbu a6, 3(a0)
970; RV32I-NEXT:    lbu a7, 4(a0)
971; RV32I-NEXT:    lbu t0, 5(a0)
972; RV32I-NEXT:    lbu t1, 6(a0)
973; RV32I-NEXT:    lbu t2, 7(a0)
974; RV32I-NEXT:    lbu t3, 8(a0)
975; RV32I-NEXT:    lbu t4, 9(a0)
976; RV32I-NEXT:    lbu t5, 10(a0)
977; RV32I-NEXT:    lbu t6, 11(a0)
978; RV32I-NEXT:    slli a4, a4, 8
979; RV32I-NEXT:    slli a5, a5, 16
980; RV32I-NEXT:    slli a6, a6, 24
981; RV32I-NEXT:    slli t0, t0, 8
982; RV32I-NEXT:    or a3, a4, a3
983; RV32I-NEXT:    or a4, a6, a5
984; RV32I-NEXT:    or a5, t0, a7
985; RV32I-NEXT:    lbu a6, 12(a0)
986; RV32I-NEXT:    lbu a7, 13(a0)
987; RV32I-NEXT:    lbu t0, 14(a0)
988; RV32I-NEXT:    lbu a0, 15(a0)
989; RV32I-NEXT:    lbu a1, 0(a1)
990; RV32I-NEXT:    sw zero, 16(sp)
991; RV32I-NEXT:    sw zero, 20(sp)
992; RV32I-NEXT:    sw zero, 24(sp)
993; RV32I-NEXT:    sw zero, 28(sp)
994; RV32I-NEXT:    slli t1, t1, 16
995; RV32I-NEXT:    slli t2, t2, 24
996; RV32I-NEXT:    or t1, t2, t1
997; RV32I-NEXT:    mv t2, sp
998; RV32I-NEXT:    slli t4, t4, 8
999; RV32I-NEXT:    slli t5, t5, 16
1000; RV32I-NEXT:    slli t6, t6, 24
1001; RV32I-NEXT:    slli a7, a7, 8
1002; RV32I-NEXT:    slli t0, t0, 16
1003; RV32I-NEXT:    slli a0, a0, 24
1004; RV32I-NEXT:    slli a1, a1, 2
1005; RV32I-NEXT:    or t3, t4, t3
1006; RV32I-NEXT:    or t4, t6, t5
1007; RV32I-NEXT:    or a6, a7, a6
1008; RV32I-NEXT:    or a0, a0, t0
1009; RV32I-NEXT:    andi a1, a1, 12
1010; RV32I-NEXT:    or a3, a4, a3
1011; RV32I-NEXT:    or a4, t1, a5
1012; RV32I-NEXT:    or a5, t4, t3
1013; RV32I-NEXT:    or a0, a0, a6
1014; RV32I-NEXT:    add a1, t2, a1
1015; RV32I-NEXT:    sw a3, 0(sp)
1016; RV32I-NEXT:    sw a4, 4(sp)
1017; RV32I-NEXT:    sw a5, 8(sp)
1018; RV32I-NEXT:    sw a0, 12(sp)
1019; RV32I-NEXT:    lw a0, 8(a1)
1020; RV32I-NEXT:    lw a3, 4(a1)
1021; RV32I-NEXT:    lw a4, 0(a1)
1022; RV32I-NEXT:    lw a1, 12(a1)
1023; RV32I-NEXT:    srli a5, a0, 16
1024; RV32I-NEXT:    srli a6, a0, 24
1025; RV32I-NEXT:    srli a7, a0, 8
1026; RV32I-NEXT:    srli t0, a1, 16
1027; RV32I-NEXT:    srli t1, a1, 24
1028; RV32I-NEXT:    srli t2, a1, 8
1029; RV32I-NEXT:    srli t3, a4, 16
1030; RV32I-NEXT:    srli t4, a4, 24
1031; RV32I-NEXT:    srli t5, a4, 8
1032; RV32I-NEXT:    srli t6, a3, 16
1033; RV32I-NEXT:    sb a0, 8(a2)
1034; RV32I-NEXT:    sb a7, 9(a2)
1035; RV32I-NEXT:    sb a5, 10(a2)
1036; RV32I-NEXT:    sb a6, 11(a2)
1037; RV32I-NEXT:    srli a0, a3, 24
1038; RV32I-NEXT:    sb a1, 12(a2)
1039; RV32I-NEXT:    sb t2, 13(a2)
1040; RV32I-NEXT:    sb t0, 14(a2)
1041; RV32I-NEXT:    sb t1, 15(a2)
1042; RV32I-NEXT:    srli a1, a3, 8
1043; RV32I-NEXT:    sb a4, 0(a2)
1044; RV32I-NEXT:    sb t5, 1(a2)
1045; RV32I-NEXT:    sb t3, 2(a2)
1046; RV32I-NEXT:    sb t4, 3(a2)
1047; RV32I-NEXT:    sb a3, 4(a2)
1048; RV32I-NEXT:    sb a1, 5(a2)
1049; RV32I-NEXT:    sb t6, 6(a2)
1050; RV32I-NEXT:    sb a0, 7(a2)
1051; RV32I-NEXT:    addi sp, sp, 32
1052; RV32I-NEXT:    ret
1053  %src = load i128, ptr %src.ptr, align 1
1054  %wordOff = load i128, ptr %wordOff.ptr, align 1
1055  %bitOff = shl i128 %wordOff, 5
1056  %res = lshr i128 %src, %bitOff
1057  store i128 %res, ptr %dst, align 1
1058  ret void
1059}
1060
1061define void @shl_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
1062; RV64I-LABEL: shl_16bytes:
1063; RV64I:       # %bb.0:
1064; RV64I-NEXT:    lbu a3, 0(a0)
1065; RV64I-NEXT:    lbu a4, 1(a0)
1066; RV64I-NEXT:    lbu a5, 2(a0)
1067; RV64I-NEXT:    lbu a6, 3(a0)
1068; RV64I-NEXT:    lbu a7, 4(a0)
1069; RV64I-NEXT:    lbu t0, 5(a0)
1070; RV64I-NEXT:    lbu t1, 6(a0)
1071; RV64I-NEXT:    lbu t2, 7(a0)
1072; RV64I-NEXT:    slli a4, a4, 8
1073; RV64I-NEXT:    slli a5, a5, 16
1074; RV64I-NEXT:    slli a6, a6, 24
1075; RV64I-NEXT:    slli t0, t0, 8
1076; RV64I-NEXT:    or a3, a4, a3
1077; RV64I-NEXT:    or a4, a6, a5
1078; RV64I-NEXT:    or a5, t0, a7
1079; RV64I-NEXT:    lbu a6, 4(a1)
1080; RV64I-NEXT:    lbu a7, 5(a1)
1081; RV64I-NEXT:    lbu t0, 6(a1)
1082; RV64I-NEXT:    lbu t3, 7(a1)
1083; RV64I-NEXT:    slli t1, t1, 16
1084; RV64I-NEXT:    slli t2, t2, 24
1085; RV64I-NEXT:    slli a7, a7, 8
1086; RV64I-NEXT:    slli t0, t0, 16
1087; RV64I-NEXT:    slli t3, t3, 24
1088; RV64I-NEXT:    or t1, t2, t1
1089; RV64I-NEXT:    or a6, a7, a6
1090; RV64I-NEXT:    lbu a7, 0(a1)
1091; RV64I-NEXT:    lbu t2, 1(a1)
1092; RV64I-NEXT:    or t0, t3, t0
1093; RV64I-NEXT:    lbu t3, 2(a1)
1094; RV64I-NEXT:    lbu a1, 3(a1)
1095; RV64I-NEXT:    slli t2, t2, 8
1096; RV64I-NEXT:    or a7, t2, a7
1097; RV64I-NEXT:    slli t3, t3, 16
1098; RV64I-NEXT:    slli a1, a1, 24
1099; RV64I-NEXT:    or a1, a1, t3
1100; RV64I-NEXT:    or a3, a4, a3
1101; RV64I-NEXT:    or a4, t1, a5
1102; RV64I-NEXT:    or a5, t0, a6
1103; RV64I-NEXT:    or a1, a1, a7
1104; RV64I-NEXT:    slli a4, a4, 32
1105; RV64I-NEXT:    slli a1, a1, 3
1106; RV64I-NEXT:    slli a6, a5, 35
1107; RV64I-NEXT:    or a5, a4, a3
1108; RV64I-NEXT:    or a4, a6, a1
1109; RV64I-NEXT:    addi a3, a4, -64
1110; RV64I-NEXT:    sll a1, a5, a4
1111; RV64I-NEXT:    bltz a3, .LBB8_2
1112; RV64I-NEXT:  # %bb.1:
1113; RV64I-NEXT:    mv a0, a1
1114; RV64I-NEXT:    j .LBB8_3
1115; RV64I-NEXT:  .LBB8_2:
1116; RV64I-NEXT:    lbu a6, 9(a0)
1117; RV64I-NEXT:    lbu a7, 10(a0)
1118; RV64I-NEXT:    lbu t0, 11(a0)
1119; RV64I-NEXT:    lbu t1, 8(a0)
1120; RV64I-NEXT:    slli a6, a6, 8
1121; RV64I-NEXT:    slli a7, a7, 16
1122; RV64I-NEXT:    slli t0, t0, 24
1123; RV64I-NEXT:    or a6, a6, t1
1124; RV64I-NEXT:    lbu t1, 12(a0)
1125; RV64I-NEXT:    lbu t2, 13(a0)
1126; RV64I-NEXT:    or a7, t0, a7
1127; RV64I-NEXT:    lbu t0, 14(a0)
1128; RV64I-NEXT:    lbu a0, 15(a0)
1129; RV64I-NEXT:    slli t2, t2, 8
1130; RV64I-NEXT:    or t1, t2, t1
1131; RV64I-NEXT:    slli t0, t0, 16
1132; RV64I-NEXT:    slli a0, a0, 24
1133; RV64I-NEXT:    or a0, a0, t0
1134; RV64I-NEXT:    or a6, a7, a6
1135; RV64I-NEXT:    not a7, a4
1136; RV64I-NEXT:    srli a5, a5, 1
1137; RV64I-NEXT:    or a0, a0, t1
1138; RV64I-NEXT:    slli a0, a0, 32
1139; RV64I-NEXT:    or a0, a0, a6
1140; RV64I-NEXT:    sll a0, a0, a4
1141; RV64I-NEXT:    srl a4, a5, a7
1142; RV64I-NEXT:    or a0, a0, a4
1143; RV64I-NEXT:  .LBB8_3:
1144; RV64I-NEXT:    srai a3, a3, 63
1145; RV64I-NEXT:    srli a4, a0, 56
1146; RV64I-NEXT:    srli a5, a0, 48
1147; RV64I-NEXT:    srli a6, a0, 40
1148; RV64I-NEXT:    srli a7, a0, 32
1149; RV64I-NEXT:    srli t0, a0, 24
1150; RV64I-NEXT:    srli t1, a0, 16
1151; RV64I-NEXT:    and a1, a3, a1
1152; RV64I-NEXT:    sb a7, 12(a2)
1153; RV64I-NEXT:    sb a6, 13(a2)
1154; RV64I-NEXT:    sb a5, 14(a2)
1155; RV64I-NEXT:    sb a4, 15(a2)
1156; RV64I-NEXT:    srli a3, a1, 56
1157; RV64I-NEXT:    srli a4, a1, 48
1158; RV64I-NEXT:    srli a5, a1, 40
1159; RV64I-NEXT:    srli a6, a1, 32
1160; RV64I-NEXT:    srli a7, a1, 24
1161; RV64I-NEXT:    srli t2, a1, 16
1162; RV64I-NEXT:    sb a6, 4(a2)
1163; RV64I-NEXT:    sb a5, 5(a2)
1164; RV64I-NEXT:    sb a4, 6(a2)
1165; RV64I-NEXT:    sb a3, 7(a2)
1166; RV64I-NEXT:    srli a3, a1, 8
1167; RV64I-NEXT:    sb a1, 0(a2)
1168; RV64I-NEXT:    sb a3, 1(a2)
1169; RV64I-NEXT:    sb t2, 2(a2)
1170; RV64I-NEXT:    sb a7, 3(a2)
1171; RV64I-NEXT:    srli a1, a0, 8
1172; RV64I-NEXT:    sb a0, 8(a2)
1173; RV64I-NEXT:    sb a1, 9(a2)
1174; RV64I-NEXT:    sb t1, 10(a2)
1175; RV64I-NEXT:    sb t0, 11(a2)
1176; RV64I-NEXT:    ret
1177;
1178; RV32I-LABEL: shl_16bytes:
1179; RV32I:       # %bb.0:
1180; RV32I-NEXT:    addi sp, sp, -32
1181; RV32I-NEXT:    lbu a3, 0(a0)
1182; RV32I-NEXT:    lbu a4, 1(a0)
1183; RV32I-NEXT:    lbu a5, 2(a0)
1184; RV32I-NEXT:    lbu a6, 3(a0)
1185; RV32I-NEXT:    lbu a7, 4(a0)
1186; RV32I-NEXT:    lbu t0, 5(a0)
1187; RV32I-NEXT:    lbu t1, 6(a0)
1188; RV32I-NEXT:    lbu t2, 7(a0)
1189; RV32I-NEXT:    slli a4, a4, 8
1190; RV32I-NEXT:    slli a5, a5, 16
1191; RV32I-NEXT:    slli a6, a6, 24
1192; RV32I-NEXT:    or a3, a4, a3
1193; RV32I-NEXT:    or a4, a6, a5
1194; RV32I-NEXT:    lbu a5, 8(a0)
1195; RV32I-NEXT:    lbu a6, 9(a0)
1196; RV32I-NEXT:    lbu t3, 10(a0)
1197; RV32I-NEXT:    lbu t4, 11(a0)
1198; RV32I-NEXT:    slli t0, t0, 8
1199; RV32I-NEXT:    slli t1, t1, 16
1200; RV32I-NEXT:    slli t2, t2, 24
1201; RV32I-NEXT:    slli a6, a6, 8
1202; RV32I-NEXT:    or a7, t0, a7
1203; RV32I-NEXT:    or t0, t2, t1
1204; RV32I-NEXT:    or a5, a6, a5
1205; RV32I-NEXT:    lbu a6, 12(a0)
1206; RV32I-NEXT:    lbu t1, 13(a0)
1207; RV32I-NEXT:    lbu t2, 14(a0)
1208; RV32I-NEXT:    lbu a0, 15(a0)
1209; RV32I-NEXT:    slli t3, t3, 16
1210; RV32I-NEXT:    slli t4, t4, 24
1211; RV32I-NEXT:    slli t1, t1, 8
1212; RV32I-NEXT:    slli t2, t2, 16
1213; RV32I-NEXT:    slli a0, a0, 24
1214; RV32I-NEXT:    or t3, t4, t3
1215; RV32I-NEXT:    or a6, t1, a6
1216; RV32I-NEXT:    or a0, a0, t2
1217; RV32I-NEXT:    lbu t1, 0(a1)
1218; RV32I-NEXT:    lbu t2, 1(a1)
1219; RV32I-NEXT:    lbu t4, 2(a1)
1220; RV32I-NEXT:    lbu a1, 3(a1)
1221; RV32I-NEXT:    sw zero, 0(sp)
1222; RV32I-NEXT:    sw zero, 4(sp)
1223; RV32I-NEXT:    sw zero, 8(sp)
1224; RV32I-NEXT:    sw zero, 12(sp)
1225; RV32I-NEXT:    slli t2, t2, 8
1226; RV32I-NEXT:    or t1, t2, t1
1227; RV32I-NEXT:    addi t2, sp, 16
1228; RV32I-NEXT:    slli t4, t4, 16
1229; RV32I-NEXT:    slli a1, a1, 24
1230; RV32I-NEXT:    or a1, a1, t4
1231; RV32I-NEXT:    or a3, a4, a3
1232; RV32I-NEXT:    or a4, t0, a7
1233; RV32I-NEXT:    or a5, t3, a5
1234; RV32I-NEXT:    or a0, a0, a6
1235; RV32I-NEXT:    or a1, a1, t1
1236; RV32I-NEXT:    sw a3, 16(sp)
1237; RV32I-NEXT:    sw a4, 20(sp)
1238; RV32I-NEXT:    sw a5, 24(sp)
1239; RV32I-NEXT:    sw a0, 28(sp)
1240; RV32I-NEXT:    slli a0, a1, 3
1241; RV32I-NEXT:    andi a1, a1, 12
1242; RV32I-NEXT:    sub a1, t2, a1
1243; RV32I-NEXT:    andi a3, a0, 24
1244; RV32I-NEXT:    lw a4, 0(a1)
1245; RV32I-NEXT:    lw a5, 4(a1)
1246; RV32I-NEXT:    lw a6, 8(a1)
1247; RV32I-NEXT:    lw a1, 12(a1)
1248; RV32I-NEXT:    xori a3, a3, 31
1249; RV32I-NEXT:    sll a7, a5, a0
1250; RV32I-NEXT:    srli t0, a4, 1
1251; RV32I-NEXT:    sll a1, a1, a0
1252; RV32I-NEXT:    srli t1, a6, 1
1253; RV32I-NEXT:    sll a6, a6, a0
1254; RV32I-NEXT:    srli a5, a5, 1
1255; RV32I-NEXT:    sll a0, a4, a0
1256; RV32I-NEXT:    srl a4, t0, a3
1257; RV32I-NEXT:    srl t0, t1, a3
1258; RV32I-NEXT:    srl a3, a5, a3
1259; RV32I-NEXT:    srli a5, a6, 24
1260; RV32I-NEXT:    srli t1, a1, 24
1261; RV32I-NEXT:    srli t2, a0, 16
1262; RV32I-NEXT:    srli t3, a0, 24
1263; RV32I-NEXT:    srli t4, a0, 8
1264; RV32I-NEXT:    or a4, a7, a4
1265; RV32I-NEXT:    srli a7, a7, 24
1266; RV32I-NEXT:    or a1, a1, t0
1267; RV32I-NEXT:    or a3, a6, a3
1268; RV32I-NEXT:    sb a0, 0(a2)
1269; RV32I-NEXT:    sb t4, 1(a2)
1270; RV32I-NEXT:    sb t2, 2(a2)
1271; RV32I-NEXT:    sb t3, 3(a2)
1272; RV32I-NEXT:    srli a0, a3, 16
1273; RV32I-NEXT:    srli a6, a3, 8
1274; RV32I-NEXT:    srli t0, a1, 16
1275; RV32I-NEXT:    srli t2, a1, 8
1276; RV32I-NEXT:    srli t3, a4, 16
1277; RV32I-NEXT:    srli t4, a4, 8
1278; RV32I-NEXT:    sb a3, 8(a2)
1279; RV32I-NEXT:    sb a6, 9(a2)
1280; RV32I-NEXT:    sb a0, 10(a2)
1281; RV32I-NEXT:    sb a5, 11(a2)
1282; RV32I-NEXT:    sb a1, 12(a2)
1283; RV32I-NEXT:    sb t2, 13(a2)
1284; RV32I-NEXT:    sb t0, 14(a2)
1285; RV32I-NEXT:    sb t1, 15(a2)
1286; RV32I-NEXT:    sb a4, 4(a2)
1287; RV32I-NEXT:    sb t4, 5(a2)
1288; RV32I-NEXT:    sb t3, 6(a2)
1289; RV32I-NEXT:    sb a7, 7(a2)
1290; RV32I-NEXT:    addi sp, sp, 32
1291; RV32I-NEXT:    ret
1292  %src = load i128, ptr %src.ptr, align 1
1293  %byteOff = load i128, ptr %byteOff.ptr, align 1
1294  %bitOff = shl i128 %byteOff, 3
1295  %res = shl i128 %src, %bitOff
1296  store i128 %res, ptr %dst, align 1
1297  ret void
1298}
1299
1300define void @shl_16bytes_wordOff(ptr %src.ptr, ptr %wordOff.ptr, ptr %dst) nounwind {
1301; RV64I-LABEL: shl_16bytes_wordOff:
1302; RV64I:       # %bb.0:
1303; RV64I-NEXT:    lbu a3, 0(a0)
1304; RV64I-NEXT:    lbu a4, 1(a0)
1305; RV64I-NEXT:    lbu a5, 2(a0)
1306; RV64I-NEXT:    lbu a6, 3(a0)
1307; RV64I-NEXT:    lbu a7, 4(a0)
1308; RV64I-NEXT:    lbu t0, 5(a0)
1309; RV64I-NEXT:    lbu t1, 6(a0)
1310; RV64I-NEXT:    lbu t2, 7(a0)
1311; RV64I-NEXT:    slli a4, a4, 8
1312; RV64I-NEXT:    slli a5, a5, 16
1313; RV64I-NEXT:    slli a6, a6, 24
1314; RV64I-NEXT:    slli t0, t0, 8
1315; RV64I-NEXT:    or a3, a4, a3
1316; RV64I-NEXT:    or a4, a6, a5
1317; RV64I-NEXT:    or a5, t0, a7
1318; RV64I-NEXT:    lbu a6, 4(a1)
1319; RV64I-NEXT:    lbu a7, 5(a1)
1320; RV64I-NEXT:    lbu t0, 6(a1)
1321; RV64I-NEXT:    lbu t3, 7(a1)
1322; RV64I-NEXT:    slli t1, t1, 16
1323; RV64I-NEXT:    slli t2, t2, 24
1324; RV64I-NEXT:    slli a7, a7, 8
1325; RV64I-NEXT:    slli t0, t0, 16
1326; RV64I-NEXT:    slli t3, t3, 24
1327; RV64I-NEXT:    or t1, t2, t1
1328; RV64I-NEXT:    or a6, a7, a6
1329; RV64I-NEXT:    lbu a7, 0(a1)
1330; RV64I-NEXT:    lbu t2, 1(a1)
1331; RV64I-NEXT:    or t0, t3, t0
1332; RV64I-NEXT:    lbu t3, 2(a1)
1333; RV64I-NEXT:    lbu a1, 3(a1)
1334; RV64I-NEXT:    slli t2, t2, 8
1335; RV64I-NEXT:    or a7, t2, a7
1336; RV64I-NEXT:    slli t3, t3, 16
1337; RV64I-NEXT:    slli a1, a1, 24
1338; RV64I-NEXT:    or a1, a1, t3
1339; RV64I-NEXT:    or a3, a4, a3
1340; RV64I-NEXT:    or a4, t1, a5
1341; RV64I-NEXT:    or a5, t0, a6
1342; RV64I-NEXT:    or a1, a1, a7
1343; RV64I-NEXT:    slli a4, a4, 32
1344; RV64I-NEXT:    slli a1, a1, 5
1345; RV64I-NEXT:    slli a6, a5, 37
1346; RV64I-NEXT:    or a5, a4, a3
1347; RV64I-NEXT:    or a4, a6, a1
1348; RV64I-NEXT:    addi a3, a4, -64
1349; RV64I-NEXT:    sll a1, a5, a4
1350; RV64I-NEXT:    bltz a3, .LBB9_2
1351; RV64I-NEXT:  # %bb.1:
1352; RV64I-NEXT:    mv a0, a1
1353; RV64I-NEXT:    j .LBB9_3
1354; RV64I-NEXT:  .LBB9_2:
1355; RV64I-NEXT:    lbu a6, 9(a0)
1356; RV64I-NEXT:    lbu a7, 10(a0)
1357; RV64I-NEXT:    lbu t0, 11(a0)
1358; RV64I-NEXT:    lbu t1, 8(a0)
1359; RV64I-NEXT:    slli a6, a6, 8
1360; RV64I-NEXT:    slli a7, a7, 16
1361; RV64I-NEXT:    slli t0, t0, 24
1362; RV64I-NEXT:    or a6, a6, t1
1363; RV64I-NEXT:    lbu t1, 12(a0)
1364; RV64I-NEXT:    lbu t2, 13(a0)
1365; RV64I-NEXT:    or a7, t0, a7
1366; RV64I-NEXT:    lbu t0, 14(a0)
1367; RV64I-NEXT:    lbu a0, 15(a0)
1368; RV64I-NEXT:    slli t2, t2, 8
1369; RV64I-NEXT:    or t1, t2, t1
1370; RV64I-NEXT:    slli t0, t0, 16
1371; RV64I-NEXT:    slli a0, a0, 24
1372; RV64I-NEXT:    or a0, a0, t0
1373; RV64I-NEXT:    or a6, a7, a6
1374; RV64I-NEXT:    not a7, a4
1375; RV64I-NEXT:    srli a5, a5, 1
1376; RV64I-NEXT:    or a0, a0, t1
1377; RV64I-NEXT:    slli a0, a0, 32
1378; RV64I-NEXT:    or a0, a0, a6
1379; RV64I-NEXT:    sll a0, a0, a4
1380; RV64I-NEXT:    srl a4, a5, a7
1381; RV64I-NEXT:    or a0, a0, a4
1382; RV64I-NEXT:  .LBB9_3:
1383; RV64I-NEXT:    srai a3, a3, 63
1384; RV64I-NEXT:    srli a4, a0, 56
1385; RV64I-NEXT:    srli a5, a0, 48
1386; RV64I-NEXT:    srli a6, a0, 40
1387; RV64I-NEXT:    srli a7, a0, 32
1388; RV64I-NEXT:    srli t0, a0, 24
1389; RV64I-NEXT:    srli t1, a0, 16
1390; RV64I-NEXT:    and a1, a3, a1
1391; RV64I-NEXT:    sb a7, 12(a2)
1392; RV64I-NEXT:    sb a6, 13(a2)
1393; RV64I-NEXT:    sb a5, 14(a2)
1394; RV64I-NEXT:    sb a4, 15(a2)
1395; RV64I-NEXT:    srli a3, a1, 56
1396; RV64I-NEXT:    srli a4, a1, 48
1397; RV64I-NEXT:    srli a5, a1, 40
1398; RV64I-NEXT:    srli a6, a1, 32
1399; RV64I-NEXT:    srli a7, a1, 24
1400; RV64I-NEXT:    srli t2, a1, 16
1401; RV64I-NEXT:    sb a6, 4(a2)
1402; RV64I-NEXT:    sb a5, 5(a2)
1403; RV64I-NEXT:    sb a4, 6(a2)
1404; RV64I-NEXT:    sb a3, 7(a2)
1405; RV64I-NEXT:    srli a3, a1, 8
1406; RV64I-NEXT:    sb a1, 0(a2)
1407; RV64I-NEXT:    sb a3, 1(a2)
1408; RV64I-NEXT:    sb t2, 2(a2)
1409; RV64I-NEXT:    sb a7, 3(a2)
1410; RV64I-NEXT:    srli a1, a0, 8
1411; RV64I-NEXT:    sb a0, 8(a2)
1412; RV64I-NEXT:    sb a1, 9(a2)
1413; RV64I-NEXT:    sb t1, 10(a2)
1414; RV64I-NEXT:    sb t0, 11(a2)
1415; RV64I-NEXT:    ret
1416;
1417; RV32I-LABEL: shl_16bytes_wordOff:
1418; RV32I:       # %bb.0:
1419; RV32I-NEXT:    addi sp, sp, -32
1420; RV32I-NEXT:    lbu a3, 0(a0)
1421; RV32I-NEXT:    lbu a4, 1(a0)
1422; RV32I-NEXT:    lbu a5, 2(a0)
1423; RV32I-NEXT:    lbu a6, 3(a0)
1424; RV32I-NEXT:    lbu a7, 4(a0)
1425; RV32I-NEXT:    lbu t0, 5(a0)
1426; RV32I-NEXT:    lbu t1, 6(a0)
1427; RV32I-NEXT:    lbu t2, 7(a0)
1428; RV32I-NEXT:    lbu t3, 8(a0)
1429; RV32I-NEXT:    lbu t4, 9(a0)
1430; RV32I-NEXT:    lbu t5, 10(a0)
1431; RV32I-NEXT:    lbu t6, 11(a0)
1432; RV32I-NEXT:    slli a4, a4, 8
1433; RV32I-NEXT:    slli a5, a5, 16
1434; RV32I-NEXT:    slli a6, a6, 24
1435; RV32I-NEXT:    slli t0, t0, 8
1436; RV32I-NEXT:    or a3, a4, a3
1437; RV32I-NEXT:    or a4, a6, a5
1438; RV32I-NEXT:    or a5, t0, a7
1439; RV32I-NEXT:    lbu a6, 12(a0)
1440; RV32I-NEXT:    lbu a7, 13(a0)
1441; RV32I-NEXT:    lbu t0, 14(a0)
1442; RV32I-NEXT:    lbu a0, 15(a0)
1443; RV32I-NEXT:    lbu a1, 0(a1)
1444; RV32I-NEXT:    sw zero, 0(sp)
1445; RV32I-NEXT:    sw zero, 4(sp)
1446; RV32I-NEXT:    sw zero, 8(sp)
1447; RV32I-NEXT:    sw zero, 12(sp)
1448; RV32I-NEXT:    slli t1, t1, 16
1449; RV32I-NEXT:    slli t2, t2, 24
1450; RV32I-NEXT:    or t1, t2, t1
1451; RV32I-NEXT:    addi t2, sp, 16
1452; RV32I-NEXT:    slli t4, t4, 8
1453; RV32I-NEXT:    slli t5, t5, 16
1454; RV32I-NEXT:    slli t6, t6, 24
1455; RV32I-NEXT:    slli a7, a7, 8
1456; RV32I-NEXT:    slli t0, t0, 16
1457; RV32I-NEXT:    slli a0, a0, 24
1458; RV32I-NEXT:    slli a1, a1, 2
1459; RV32I-NEXT:    or t3, t4, t3
1460; RV32I-NEXT:    or t4, t6, t5
1461; RV32I-NEXT:    or a6, a7, a6
1462; RV32I-NEXT:    or a0, a0, t0
1463; RV32I-NEXT:    andi a1, a1, 12
1464; RV32I-NEXT:    or a3, a4, a3
1465; RV32I-NEXT:    or a4, t1, a5
1466; RV32I-NEXT:    or a5, t4, t3
1467; RV32I-NEXT:    or a0, a0, a6
1468; RV32I-NEXT:    sub a1, t2, a1
1469; RV32I-NEXT:    sw a3, 16(sp)
1470; RV32I-NEXT:    sw a4, 20(sp)
1471; RV32I-NEXT:    sw a5, 24(sp)
1472; RV32I-NEXT:    sw a0, 28(sp)
1473; RV32I-NEXT:    lw a0, 8(a1)
1474; RV32I-NEXT:    lw a3, 4(a1)
1475; RV32I-NEXT:    lw a4, 0(a1)
1476; RV32I-NEXT:    lw a1, 12(a1)
1477; RV32I-NEXT:    srli a5, a0, 16
1478; RV32I-NEXT:    srli a6, a0, 24
1479; RV32I-NEXT:    srli a7, a0, 8
1480; RV32I-NEXT:    srli t0, a1, 16
1481; RV32I-NEXT:    srli t1, a1, 24
1482; RV32I-NEXT:    srli t2, a1, 8
1483; RV32I-NEXT:    srli t3, a4, 16
1484; RV32I-NEXT:    srli t4, a4, 24
1485; RV32I-NEXT:    srli t5, a4, 8
1486; RV32I-NEXT:    srli t6, a3, 16
1487; RV32I-NEXT:    sb a0, 8(a2)
1488; RV32I-NEXT:    sb a7, 9(a2)
1489; RV32I-NEXT:    sb a5, 10(a2)
1490; RV32I-NEXT:    sb a6, 11(a2)
1491; RV32I-NEXT:    srli a0, a3, 24
1492; RV32I-NEXT:    sb a1, 12(a2)
1493; RV32I-NEXT:    sb t2, 13(a2)
1494; RV32I-NEXT:    sb t0, 14(a2)
1495; RV32I-NEXT:    sb t1, 15(a2)
1496; RV32I-NEXT:    srli a1, a3, 8
1497; RV32I-NEXT:    sb a4, 0(a2)
1498; RV32I-NEXT:    sb t5, 1(a2)
1499; RV32I-NEXT:    sb t3, 2(a2)
1500; RV32I-NEXT:    sb t4, 3(a2)
1501; RV32I-NEXT:    sb a3, 4(a2)
1502; RV32I-NEXT:    sb a1, 5(a2)
1503; RV32I-NEXT:    sb t6, 6(a2)
1504; RV32I-NEXT:    sb a0, 7(a2)
1505; RV32I-NEXT:    addi sp, sp, 32
1506; RV32I-NEXT:    ret
1507  %src = load i128, ptr %src.ptr, align 1
1508  %wordOff = load i128, ptr %wordOff.ptr, align 1
1509  %bitOff = shl i128 %wordOff, 5
1510  %res = shl i128 %src, %bitOff
1511  store i128 %res, ptr %dst, align 1
1512  ret void
1513}
1514
1515
1516define void @ashr_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
1517; RV64I-LABEL: ashr_16bytes:
1518; RV64I:       # %bb.0:
1519; RV64I-NEXT:    lbu a3, 8(a0)
1520; RV64I-NEXT:    lbu a4, 9(a0)
1521; RV64I-NEXT:    lbu a5, 10(a0)
1522; RV64I-NEXT:    lbu a6, 11(a0)
1523; RV64I-NEXT:    lbu a7, 12(a0)
1524; RV64I-NEXT:    lbu t0, 13(a0)
1525; RV64I-NEXT:    lbu t1, 14(a0)
1526; RV64I-NEXT:    lbu t2, 15(a0)
1527; RV64I-NEXT:    slli a4, a4, 8
1528; RV64I-NEXT:    slli a5, a5, 16
1529; RV64I-NEXT:    slli a6, a6, 24
1530; RV64I-NEXT:    slli t0, t0, 8
1531; RV64I-NEXT:    or a3, a4, a3
1532; RV64I-NEXT:    or a4, a6, a5
1533; RV64I-NEXT:    or a5, t0, a7
1534; RV64I-NEXT:    lbu a6, 4(a1)
1535; RV64I-NEXT:    lbu a7, 5(a1)
1536; RV64I-NEXT:    lbu t0, 6(a1)
1537; RV64I-NEXT:    lbu t3, 7(a1)
1538; RV64I-NEXT:    slli t1, t1, 16
1539; RV64I-NEXT:    slli t2, t2, 24
1540; RV64I-NEXT:    slli a7, a7, 8
1541; RV64I-NEXT:    slli t0, t0, 16
1542; RV64I-NEXT:    slli t3, t3, 24
1543; RV64I-NEXT:    or t1, t2, t1
1544; RV64I-NEXT:    or a6, a7, a6
1545; RV64I-NEXT:    lbu a7, 0(a1)
1546; RV64I-NEXT:    lbu t2, 1(a1)
1547; RV64I-NEXT:    or t0, t3, t0
1548; RV64I-NEXT:    lbu t3, 2(a1)
1549; RV64I-NEXT:    lbu a1, 3(a1)
1550; RV64I-NEXT:    slli t2, t2, 8
1551; RV64I-NEXT:    or a7, t2, a7
1552; RV64I-NEXT:    slli t3, t3, 16
1553; RV64I-NEXT:    slli a1, a1, 24
1554; RV64I-NEXT:    or a1, a1, t3
1555; RV64I-NEXT:    or a3, a4, a3
1556; RV64I-NEXT:    or a5, t1, a5
1557; RV64I-NEXT:    or a4, t0, a6
1558; RV64I-NEXT:    or a1, a1, a7
1559; RV64I-NEXT:    slli a6, a5, 32
1560; RV64I-NEXT:    slli a1, a1, 3
1561; RV64I-NEXT:    slli a7, a4, 35
1562; RV64I-NEXT:    or a4, a6, a3
1563; RV64I-NEXT:    or a3, a7, a1
1564; RV64I-NEXT:    addi a6, a3, -64
1565; RV64I-NEXT:    sra a1, a4, a3
1566; RV64I-NEXT:    bltz a6, .LBB10_2
1567; RV64I-NEXT:  # %bb.1:
1568; RV64I-NEXT:    sraiw a3, a5, 31
1569; RV64I-NEXT:    mv a0, a1
1570; RV64I-NEXT:    mv a1, a3
1571; RV64I-NEXT:    j .LBB10_3
1572; RV64I-NEXT:  .LBB10_2:
1573; RV64I-NEXT:    lbu a5, 1(a0)
1574; RV64I-NEXT:    lbu a6, 2(a0)
1575; RV64I-NEXT:    lbu a7, 3(a0)
1576; RV64I-NEXT:    lbu t0, 0(a0)
1577; RV64I-NEXT:    slli a5, a5, 8
1578; RV64I-NEXT:    slli a6, a6, 16
1579; RV64I-NEXT:    slli a7, a7, 24
1580; RV64I-NEXT:    or a5, a5, t0
1581; RV64I-NEXT:    lbu t0, 4(a0)
1582; RV64I-NEXT:    lbu t1, 5(a0)
1583; RV64I-NEXT:    or a6, a7, a6
1584; RV64I-NEXT:    lbu a7, 6(a0)
1585; RV64I-NEXT:    lbu a0, 7(a0)
1586; RV64I-NEXT:    slli t1, t1, 8
1587; RV64I-NEXT:    or t0, t1, t0
1588; RV64I-NEXT:    slli a7, a7, 16
1589; RV64I-NEXT:    slli a0, a0, 24
1590; RV64I-NEXT:    or a0, a0, a7
1591; RV64I-NEXT:    or a5, a6, a5
1592; RV64I-NEXT:    not a6, a3
1593; RV64I-NEXT:    slli a4, a4, 1
1594; RV64I-NEXT:    or a0, a0, t0
1595; RV64I-NEXT:    slli a0, a0, 32
1596; RV64I-NEXT:    or a0, a0, a5
1597; RV64I-NEXT:    srl a0, a0, a3
1598; RV64I-NEXT:    sll a3, a4, a6
1599; RV64I-NEXT:    or a0, a0, a3
1600; RV64I-NEXT:  .LBB10_3:
1601; RV64I-NEXT:    srli a3, a1, 56
1602; RV64I-NEXT:    srli a4, a1, 48
1603; RV64I-NEXT:    srli a5, a1, 40
1604; RV64I-NEXT:    srli a6, a1, 32
1605; RV64I-NEXT:    srli a7, a1, 24
1606; RV64I-NEXT:    srli t0, a1, 16
1607; RV64I-NEXT:    srli t1, a1, 8
1608; RV64I-NEXT:    srli t2, a0, 56
1609; RV64I-NEXT:    srli t3, a0, 48
1610; RV64I-NEXT:    srli t4, a0, 40
1611; RV64I-NEXT:    srli t5, a0, 32
1612; RV64I-NEXT:    sb a6, 12(a2)
1613; RV64I-NEXT:    sb a5, 13(a2)
1614; RV64I-NEXT:    sb a4, 14(a2)
1615; RV64I-NEXT:    sb a3, 15(a2)
1616; RV64I-NEXT:    srli a3, a0, 24
1617; RV64I-NEXT:    sb a1, 8(a2)
1618; RV64I-NEXT:    sb t1, 9(a2)
1619; RV64I-NEXT:    sb t0, 10(a2)
1620; RV64I-NEXT:    sb a7, 11(a2)
1621; RV64I-NEXT:    srli a1, a0, 16
1622; RV64I-NEXT:    sb t5, 4(a2)
1623; RV64I-NEXT:    sb t4, 5(a2)
1624; RV64I-NEXT:    sb t3, 6(a2)
1625; RV64I-NEXT:    sb t2, 7(a2)
1626; RV64I-NEXT:    srli a4, a0, 8
1627; RV64I-NEXT:    sb a0, 0(a2)
1628; RV64I-NEXT:    sb a4, 1(a2)
1629; RV64I-NEXT:    sb a1, 2(a2)
1630; RV64I-NEXT:    sb a3, 3(a2)
1631; RV64I-NEXT:    ret
1632;
1633; RV32I-LABEL: ashr_16bytes:
1634; RV32I:       # %bb.0:
1635; RV32I-NEXT:    addi sp, sp, -32
1636; RV32I-NEXT:    lbu a3, 0(a0)
1637; RV32I-NEXT:    lbu a4, 1(a0)
1638; RV32I-NEXT:    lbu a5, 2(a0)
1639; RV32I-NEXT:    lbu a6, 3(a0)
1640; RV32I-NEXT:    lbu a7, 4(a0)
1641; RV32I-NEXT:    lbu t0, 5(a0)
1642; RV32I-NEXT:    lbu t1, 6(a0)
1643; RV32I-NEXT:    lbu t2, 7(a0)
1644; RV32I-NEXT:    slli a4, a4, 8
1645; RV32I-NEXT:    or a3, a4, a3
1646; RV32I-NEXT:    lbu a4, 8(a0)
1647; RV32I-NEXT:    lbu t3, 9(a0)
1648; RV32I-NEXT:    lbu t4, 10(a0)
1649; RV32I-NEXT:    lbu t5, 11(a0)
1650; RV32I-NEXT:    slli a5, a5, 16
1651; RV32I-NEXT:    slli a6, a6, 24
1652; RV32I-NEXT:    slli t0, t0, 8
1653; RV32I-NEXT:    slli t1, t1, 16
1654; RV32I-NEXT:    slli t2, t2, 24
1655; RV32I-NEXT:    or a5, a6, a5
1656; RV32I-NEXT:    or a6, t0, a7
1657; RV32I-NEXT:    or a7, t2, t1
1658; RV32I-NEXT:    lbu t0, 12(a0)
1659; RV32I-NEXT:    lbu t1, 13(a0)
1660; RV32I-NEXT:    lbu t2, 14(a0)
1661; RV32I-NEXT:    lbu a0, 15(a0)
1662; RV32I-NEXT:    slli t3, t3, 8
1663; RV32I-NEXT:    slli t4, t4, 16
1664; RV32I-NEXT:    slli t5, t5, 24
1665; RV32I-NEXT:    slli t1, t1, 8
1666; RV32I-NEXT:    or a4, t3, a4
1667; RV32I-NEXT:    or t3, t5, t4
1668; RV32I-NEXT:    lbu t4, 0(a1)
1669; RV32I-NEXT:    lbu t5, 1(a1)
1670; RV32I-NEXT:    or t0, t1, t0
1671; RV32I-NEXT:    lbu t1, 2(a1)
1672; RV32I-NEXT:    lbu a1, 3(a1)
1673; RV32I-NEXT:    slli t5, t5, 8
1674; RV32I-NEXT:    or t4, t5, t4
1675; RV32I-NEXT:    slli t1, t1, 16
1676; RV32I-NEXT:    slli a1, a1, 24
1677; RV32I-NEXT:    or a1, a1, t1
1678; RV32I-NEXT:    mv t1, sp
1679; RV32I-NEXT:    slli t2, t2, 16
1680; RV32I-NEXT:    slli a0, a0, 24
1681; RV32I-NEXT:    or t2, a0, t2
1682; RV32I-NEXT:    srai a0, a0, 31
1683; RV32I-NEXT:    or a3, a5, a3
1684; RV32I-NEXT:    or a5, a7, a6
1685; RV32I-NEXT:    or a4, t3, a4
1686; RV32I-NEXT:    or a6, t2, t0
1687; RV32I-NEXT:    or a1, a1, t4
1688; RV32I-NEXT:    sw a0, 16(sp)
1689; RV32I-NEXT:    sw a0, 20(sp)
1690; RV32I-NEXT:    sw a0, 24(sp)
1691; RV32I-NEXT:    sw a0, 28(sp)
1692; RV32I-NEXT:    sw a3, 0(sp)
1693; RV32I-NEXT:    sw a5, 4(sp)
1694; RV32I-NEXT:    sw a4, 8(sp)
1695; RV32I-NEXT:    sw a6, 12(sp)
1696; RV32I-NEXT:    slli a0, a1, 3
1697; RV32I-NEXT:    andi a1, a1, 12
1698; RV32I-NEXT:    add a1, t1, a1
1699; RV32I-NEXT:    andi a3, a0, 24
1700; RV32I-NEXT:    lw a4, 0(a1)
1701; RV32I-NEXT:    lw a5, 4(a1)
1702; RV32I-NEXT:    lw a6, 8(a1)
1703; RV32I-NEXT:    xori a3, a3, 31
1704; RV32I-NEXT:    lw a1, 12(a1)
1705; RV32I-NEXT:    srl a7, a5, a0
1706; RV32I-NEXT:    slli t0, a6, 1
1707; RV32I-NEXT:    srl a4, a4, a0
1708; RV32I-NEXT:    slli a5, a5, 1
1709; RV32I-NEXT:    srl a6, a6, a0
1710; RV32I-NEXT:    slli t1, a1, 1
1711; RV32I-NEXT:    sra a0, a1, a0
1712; RV32I-NEXT:    sll a1, t0, a3
1713; RV32I-NEXT:    sll a5, a5, a3
1714; RV32I-NEXT:    sll a3, t1, a3
1715; RV32I-NEXT:    srli t0, a0, 16
1716; RV32I-NEXT:    srli t1, a0, 24
1717; RV32I-NEXT:    srli t2, a0, 8
1718; RV32I-NEXT:    or a1, a7, a1
1719; RV32I-NEXT:    or a5, a4, a5
1720; RV32I-NEXT:    or a3, a6, a3
1721; RV32I-NEXT:    sb a0, 12(a2)
1722; RV32I-NEXT:    sb t2, 13(a2)
1723; RV32I-NEXT:    sb t0, 14(a2)
1724; RV32I-NEXT:    sb t1, 15(a2)
1725; RV32I-NEXT:    srli a0, a3, 16
1726; RV32I-NEXT:    srli t0, a3, 24
1727; RV32I-NEXT:    srli a3, a3, 8
1728; RV32I-NEXT:    srli t1, a5, 16
1729; RV32I-NEXT:    srli t2, a5, 24
1730; RV32I-NEXT:    srli a5, a5, 8
1731; RV32I-NEXT:    srli t3, a1, 16
1732; RV32I-NEXT:    srli t4, a1, 24
1733; RV32I-NEXT:    srli a1, a1, 8
1734; RV32I-NEXT:    sb a6, 8(a2)
1735; RV32I-NEXT:    sb a3, 9(a2)
1736; RV32I-NEXT:    sb a0, 10(a2)
1737; RV32I-NEXT:    sb t0, 11(a2)
1738; RV32I-NEXT:    sb a4, 0(a2)
1739; RV32I-NEXT:    sb a5, 1(a2)
1740; RV32I-NEXT:    sb t1, 2(a2)
1741; RV32I-NEXT:    sb t2, 3(a2)
1742; RV32I-NEXT:    sb a7, 4(a2)
1743; RV32I-NEXT:    sb a1, 5(a2)
1744; RV32I-NEXT:    sb t3, 6(a2)
1745; RV32I-NEXT:    sb t4, 7(a2)
1746; RV32I-NEXT:    addi sp, sp, 32
1747; RV32I-NEXT:    ret
1748  %src = load i128, ptr %src.ptr, align 1
1749  %byteOff = load i128, ptr %byteOff.ptr, align 1
1750  %bitOff = shl i128 %byteOff, 3
1751  %res = ashr i128 %src, %bitOff
1752  store i128 %res, ptr %dst, align 1
1753  ret void
1754}
1755
1756define void @ashr_16bytes_wordOff(ptr %src.ptr, ptr %wordOff.ptr, ptr %dst) nounwind {
1757; RV64I-LABEL: ashr_16bytes_wordOff:
1758; RV64I:       # %bb.0:
1759; RV64I-NEXT:    lbu a3, 8(a0)
1760; RV64I-NEXT:    lbu a4, 9(a0)
1761; RV64I-NEXT:    lbu a5, 10(a0)
1762; RV64I-NEXT:    lbu a6, 11(a0)
1763; RV64I-NEXT:    lbu a7, 12(a0)
1764; RV64I-NEXT:    lbu t0, 13(a0)
1765; RV64I-NEXT:    lbu t1, 14(a0)
1766; RV64I-NEXT:    lbu t2, 15(a0)
1767; RV64I-NEXT:    slli a4, a4, 8
1768; RV64I-NEXT:    slli a5, a5, 16
1769; RV64I-NEXT:    slli a6, a6, 24
1770; RV64I-NEXT:    slli t0, t0, 8
1771; RV64I-NEXT:    or a3, a4, a3
1772; RV64I-NEXT:    or a4, a6, a5
1773; RV64I-NEXT:    or a5, t0, a7
1774; RV64I-NEXT:    lbu a6, 4(a1)
1775; RV64I-NEXT:    lbu a7, 5(a1)
1776; RV64I-NEXT:    lbu t0, 6(a1)
1777; RV64I-NEXT:    lbu t3, 7(a1)
1778; RV64I-NEXT:    slli t1, t1, 16
1779; RV64I-NEXT:    slli t2, t2, 24
1780; RV64I-NEXT:    slli a7, a7, 8
1781; RV64I-NEXT:    slli t0, t0, 16
1782; RV64I-NEXT:    slli t3, t3, 24
1783; RV64I-NEXT:    or t1, t2, t1
1784; RV64I-NEXT:    or a6, a7, a6
1785; RV64I-NEXT:    lbu a7, 0(a1)
1786; RV64I-NEXT:    lbu t2, 1(a1)
1787; RV64I-NEXT:    or t0, t3, t0
1788; RV64I-NEXT:    lbu t3, 2(a1)
1789; RV64I-NEXT:    lbu a1, 3(a1)
1790; RV64I-NEXT:    slli t2, t2, 8
1791; RV64I-NEXT:    or a7, t2, a7
1792; RV64I-NEXT:    slli t3, t3, 16
1793; RV64I-NEXT:    slli a1, a1, 24
1794; RV64I-NEXT:    or a1, a1, t3
1795; RV64I-NEXT:    or a3, a4, a3
1796; RV64I-NEXT:    or a5, t1, a5
1797; RV64I-NEXT:    or a4, t0, a6
1798; RV64I-NEXT:    or a1, a1, a7
1799; RV64I-NEXT:    slli a6, a5, 32
1800; RV64I-NEXT:    slli a1, a1, 5
1801; RV64I-NEXT:    slli a7, a4, 37
1802; RV64I-NEXT:    or a4, a6, a3
1803; RV64I-NEXT:    or a3, a7, a1
1804; RV64I-NEXT:    addi a6, a3, -64
1805; RV64I-NEXT:    sra a1, a4, a3
1806; RV64I-NEXT:    bltz a6, .LBB11_2
1807; RV64I-NEXT:  # %bb.1:
1808; RV64I-NEXT:    sraiw a3, a5, 31
1809; RV64I-NEXT:    mv a0, a1
1810; RV64I-NEXT:    mv a1, a3
1811; RV64I-NEXT:    j .LBB11_3
1812; RV64I-NEXT:  .LBB11_2:
1813; RV64I-NEXT:    lbu a5, 1(a0)
1814; RV64I-NEXT:    lbu a6, 2(a0)
1815; RV64I-NEXT:    lbu a7, 3(a0)
1816; RV64I-NEXT:    lbu t0, 0(a0)
1817; RV64I-NEXT:    slli a5, a5, 8
1818; RV64I-NEXT:    slli a6, a6, 16
1819; RV64I-NEXT:    slli a7, a7, 24
1820; RV64I-NEXT:    or a5, a5, t0
1821; RV64I-NEXT:    lbu t0, 4(a0)
1822; RV64I-NEXT:    lbu t1, 5(a0)
1823; RV64I-NEXT:    or a6, a7, a6
1824; RV64I-NEXT:    lbu a7, 6(a0)
1825; RV64I-NEXT:    lbu a0, 7(a0)
1826; RV64I-NEXT:    slli t1, t1, 8
1827; RV64I-NEXT:    or t0, t1, t0
1828; RV64I-NEXT:    slli a7, a7, 16
1829; RV64I-NEXT:    slli a0, a0, 24
1830; RV64I-NEXT:    or a0, a0, a7
1831; RV64I-NEXT:    or a5, a6, a5
1832; RV64I-NEXT:    not a6, a3
1833; RV64I-NEXT:    slli a4, a4, 1
1834; RV64I-NEXT:    or a0, a0, t0
1835; RV64I-NEXT:    slli a0, a0, 32
1836; RV64I-NEXT:    or a0, a0, a5
1837; RV64I-NEXT:    srl a0, a0, a3
1838; RV64I-NEXT:    sll a3, a4, a6
1839; RV64I-NEXT:    or a0, a0, a3
1840; RV64I-NEXT:  .LBB11_3:
1841; RV64I-NEXT:    srli a3, a1, 56
1842; RV64I-NEXT:    srli a4, a1, 48
1843; RV64I-NEXT:    srli a5, a1, 40
1844; RV64I-NEXT:    srli a6, a1, 32
1845; RV64I-NEXT:    srli a7, a1, 24
1846; RV64I-NEXT:    srli t0, a1, 16
1847; RV64I-NEXT:    srli t1, a1, 8
1848; RV64I-NEXT:    srli t2, a0, 56
1849; RV64I-NEXT:    srli t3, a0, 48
1850; RV64I-NEXT:    srli t4, a0, 40
1851; RV64I-NEXT:    srli t5, a0, 32
1852; RV64I-NEXT:    sb a6, 12(a2)
1853; RV64I-NEXT:    sb a5, 13(a2)
1854; RV64I-NEXT:    sb a4, 14(a2)
1855; RV64I-NEXT:    sb a3, 15(a2)
1856; RV64I-NEXT:    srli a3, a0, 24
1857; RV64I-NEXT:    sb a1, 8(a2)
1858; RV64I-NEXT:    sb t1, 9(a2)
1859; RV64I-NEXT:    sb t0, 10(a2)
1860; RV64I-NEXT:    sb a7, 11(a2)
1861; RV64I-NEXT:    srli a1, a0, 16
1862; RV64I-NEXT:    sb t5, 4(a2)
1863; RV64I-NEXT:    sb t4, 5(a2)
1864; RV64I-NEXT:    sb t3, 6(a2)
1865; RV64I-NEXT:    sb t2, 7(a2)
1866; RV64I-NEXT:    srli a4, a0, 8
1867; RV64I-NEXT:    sb a0, 0(a2)
1868; RV64I-NEXT:    sb a4, 1(a2)
1869; RV64I-NEXT:    sb a1, 2(a2)
1870; RV64I-NEXT:    sb a3, 3(a2)
1871; RV64I-NEXT:    ret
1872;
1873; RV32I-LABEL: ashr_16bytes_wordOff:
1874; RV32I:       # %bb.0:
1875; RV32I-NEXT:    addi sp, sp, -32
1876; RV32I-NEXT:    lbu a3, 0(a0)
1877; RV32I-NEXT:    lbu a4, 1(a0)
1878; RV32I-NEXT:    lbu a5, 2(a0)
1879; RV32I-NEXT:    lbu a6, 3(a0)
1880; RV32I-NEXT:    lbu a7, 4(a0)
1881; RV32I-NEXT:    lbu t0, 5(a0)
1882; RV32I-NEXT:    lbu t1, 6(a0)
1883; RV32I-NEXT:    lbu t2, 7(a0)
1884; RV32I-NEXT:    lbu t3, 8(a0)
1885; RV32I-NEXT:    lbu t4, 9(a0)
1886; RV32I-NEXT:    lbu t5, 10(a0)
1887; RV32I-NEXT:    lbu t6, 11(a0)
1888; RV32I-NEXT:    slli a4, a4, 8
1889; RV32I-NEXT:    slli a5, a5, 16
1890; RV32I-NEXT:    slli a6, a6, 24
1891; RV32I-NEXT:    slli t0, t0, 8
1892; RV32I-NEXT:    or a3, a4, a3
1893; RV32I-NEXT:    or a4, a6, a5
1894; RV32I-NEXT:    or a5, t0, a7
1895; RV32I-NEXT:    lbu a6, 12(a0)
1896; RV32I-NEXT:    lbu a7, 13(a0)
1897; RV32I-NEXT:    lbu t0, 14(a0)
1898; RV32I-NEXT:    lbu a0, 15(a0)
1899; RV32I-NEXT:    lbu a1, 0(a1)
1900; RV32I-NEXT:    slli t1, t1, 16
1901; RV32I-NEXT:    slli t2, t2, 24
1902; RV32I-NEXT:    or t1, t2, t1
1903; RV32I-NEXT:    mv t2, sp
1904; RV32I-NEXT:    slli t4, t4, 8
1905; RV32I-NEXT:    slli t5, t5, 16
1906; RV32I-NEXT:    slli t6, t6, 24
1907; RV32I-NEXT:    slli a7, a7, 8
1908; RV32I-NEXT:    slli t0, t0, 16
1909; RV32I-NEXT:    slli a0, a0, 24
1910; RV32I-NEXT:    slli a1, a1, 2
1911; RV32I-NEXT:    or t3, t4, t3
1912; RV32I-NEXT:    or t4, t6, t5
1913; RV32I-NEXT:    or a6, a7, a6
1914; RV32I-NEXT:    or a7, a0, t0
1915; RV32I-NEXT:    srai a0, a0, 31
1916; RV32I-NEXT:    andi a1, a1, 12
1917; RV32I-NEXT:    or a3, a4, a3
1918; RV32I-NEXT:    or a4, t1, a5
1919; RV32I-NEXT:    or a5, t4, t3
1920; RV32I-NEXT:    or a6, a7, a6
1921; RV32I-NEXT:    sw a0, 16(sp)
1922; RV32I-NEXT:    sw a0, 20(sp)
1923; RV32I-NEXT:    sw a0, 24(sp)
1924; RV32I-NEXT:    sw a0, 28(sp)
1925; RV32I-NEXT:    add a1, t2, a1
1926; RV32I-NEXT:    sw a3, 0(sp)
1927; RV32I-NEXT:    sw a4, 4(sp)
1928; RV32I-NEXT:    sw a5, 8(sp)
1929; RV32I-NEXT:    sw a6, 12(sp)
1930; RV32I-NEXT:    lw a0, 8(a1)
1931; RV32I-NEXT:    lw a3, 4(a1)
1932; RV32I-NEXT:    lw a4, 0(a1)
1933; RV32I-NEXT:    lw a1, 12(a1)
1934; RV32I-NEXT:    srli a5, a0, 16
1935; RV32I-NEXT:    srli a6, a0, 24
1936; RV32I-NEXT:    srli a7, a0, 8
1937; RV32I-NEXT:    srli t0, a1, 16
1938; RV32I-NEXT:    srli t1, a1, 24
1939; RV32I-NEXT:    srli t2, a1, 8
1940; RV32I-NEXT:    srli t3, a4, 16
1941; RV32I-NEXT:    srli t4, a4, 24
1942; RV32I-NEXT:    srli t5, a4, 8
1943; RV32I-NEXT:    srli t6, a3, 16
1944; RV32I-NEXT:    sb a0, 8(a2)
1945; RV32I-NEXT:    sb a7, 9(a2)
1946; RV32I-NEXT:    sb a5, 10(a2)
1947; RV32I-NEXT:    sb a6, 11(a2)
1948; RV32I-NEXT:    srli a0, a3, 24
1949; RV32I-NEXT:    sb a1, 12(a2)
1950; RV32I-NEXT:    sb t2, 13(a2)
1951; RV32I-NEXT:    sb t0, 14(a2)
1952; RV32I-NEXT:    sb t1, 15(a2)
1953; RV32I-NEXT:    srli a1, a3, 8
1954; RV32I-NEXT:    sb a4, 0(a2)
1955; RV32I-NEXT:    sb t5, 1(a2)
1956; RV32I-NEXT:    sb t3, 2(a2)
1957; RV32I-NEXT:    sb t4, 3(a2)
1958; RV32I-NEXT:    sb a3, 4(a2)
1959; RV32I-NEXT:    sb a1, 5(a2)
1960; RV32I-NEXT:    sb t6, 6(a2)
1961; RV32I-NEXT:    sb a0, 7(a2)
1962; RV32I-NEXT:    addi sp, sp, 32
1963; RV32I-NEXT:    ret
1964  %src = load i128, ptr %src.ptr, align 1
1965  %wordOff = load i128, ptr %wordOff.ptr, align 1
1966  %bitOff = shl i128 %wordOff, 5
1967  %res = ashr i128 %src, %bitOff
1968  store i128 %res, ptr %dst, align 1
1969  ret void
1970}
1971
1972define void @lshr_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
1973; RV64I-LABEL: lshr_32bytes:
1974; RV64I:       # %bb.0:
1975; RV64I-NEXT:    addi sp, sp, -160
1976; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
1977; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
1978; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
1979; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
1980; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
1981; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
1982; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
1983; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
1984; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
1985; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
1986; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
1987; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
1988; RV64I-NEXT:    lbu a3, 0(a0)
1989; RV64I-NEXT:    lbu a4, 1(a0)
1990; RV64I-NEXT:    lbu a5, 2(a0)
1991; RV64I-NEXT:    lbu a6, 3(a0)
1992; RV64I-NEXT:    lbu a7, 4(a0)
1993; RV64I-NEXT:    lbu t0, 5(a0)
1994; RV64I-NEXT:    lbu t1, 6(a0)
1995; RV64I-NEXT:    lbu t2, 7(a0)
1996; RV64I-NEXT:    lbu t3, 8(a0)
1997; RV64I-NEXT:    lbu t4, 9(a0)
1998; RV64I-NEXT:    lbu t5, 10(a0)
1999; RV64I-NEXT:    lbu t6, 11(a0)
2000; RV64I-NEXT:    lbu s0, 12(a0)
2001; RV64I-NEXT:    lbu s1, 13(a0)
2002; RV64I-NEXT:    lbu s2, 14(a0)
2003; RV64I-NEXT:    lbu s3, 15(a0)
2004; RV64I-NEXT:    lbu s4, 16(a0)
2005; RV64I-NEXT:    lbu s5, 17(a0)
2006; RV64I-NEXT:    lbu s6, 18(a0)
2007; RV64I-NEXT:    lbu s7, 19(a0)
2008; RV64I-NEXT:    slli a4, a4, 8
2009; RV64I-NEXT:    slli a5, a5, 16
2010; RV64I-NEXT:    slli a6, a6, 24
2011; RV64I-NEXT:    slli t0, t0, 8
2012; RV64I-NEXT:    slli t1, t1, 16
2013; RV64I-NEXT:    slli t2, t2, 24
2014; RV64I-NEXT:    or a3, a4, a3
2015; RV64I-NEXT:    or a4, a6, a5
2016; RV64I-NEXT:    or a5, t0, a7
2017; RV64I-NEXT:    or a6, t2, t1
2018; RV64I-NEXT:    lbu s8, 20(a0)
2019; RV64I-NEXT:    lbu s9, 21(a0)
2020; RV64I-NEXT:    lbu s10, 22(a0)
2021; RV64I-NEXT:    lbu s11, 23(a0)
2022; RV64I-NEXT:    slli t4, t4, 8
2023; RV64I-NEXT:    slli t5, t5, 16
2024; RV64I-NEXT:    slli t6, t6, 24
2025; RV64I-NEXT:    slli s1, s1, 8
2026; RV64I-NEXT:    slli s2, s2, 16
2027; RV64I-NEXT:    slli s3, s3, 24
2028; RV64I-NEXT:    or a7, t4, t3
2029; RV64I-NEXT:    or t0, t6, t5
2030; RV64I-NEXT:    or t1, s1, s0
2031; RV64I-NEXT:    or t2, s3, s2
2032; RV64I-NEXT:    lbu t6, 24(a0)
2033; RV64I-NEXT:    lbu s0, 25(a0)
2034; RV64I-NEXT:    lbu s1, 26(a0)
2035; RV64I-NEXT:    lbu s2, 27(a0)
2036; RV64I-NEXT:    slli s5, s5, 8
2037; RV64I-NEXT:    slli s6, s6, 16
2038; RV64I-NEXT:    slli s7, s7, 24
2039; RV64I-NEXT:    slli s9, s9, 8
2040; RV64I-NEXT:    or t3, s5, s4
2041; RV64I-NEXT:    or t4, s7, s6
2042; RV64I-NEXT:    or t5, s9, s8
2043; RV64I-NEXT:    lbu s3, 28(a0)
2044; RV64I-NEXT:    lbu s4, 29(a0)
2045; RV64I-NEXT:    lbu s5, 30(a0)
2046; RV64I-NEXT:    lbu s6, 31(a0)
2047; RV64I-NEXT:    slli s10, s10, 16
2048; RV64I-NEXT:    slli s11, s11, 24
2049; RV64I-NEXT:    slli s0, s0, 8
2050; RV64I-NEXT:    slli s1, s1, 16
2051; RV64I-NEXT:    slli s2, s2, 24
2052; RV64I-NEXT:    slli s4, s4, 8
2053; RV64I-NEXT:    or a0, s11, s10
2054; RV64I-NEXT:    or t6, s0, t6
2055; RV64I-NEXT:    or s0, s2, s1
2056; RV64I-NEXT:    or s1, s4, s3
2057; RV64I-NEXT:    lbu s2, 0(a1)
2058; RV64I-NEXT:    lbu s3, 1(a1)
2059; RV64I-NEXT:    lbu s4, 2(a1)
2060; RV64I-NEXT:    lbu s7, 3(a1)
2061; RV64I-NEXT:    slli s5, s5, 16
2062; RV64I-NEXT:    slli s6, s6, 24
2063; RV64I-NEXT:    slli s3, s3, 8
2064; RV64I-NEXT:    slli s4, s4, 16
2065; RV64I-NEXT:    slli s7, s7, 24
2066; RV64I-NEXT:    or s5, s6, s5
2067; RV64I-NEXT:    or s2, s3, s2
2068; RV64I-NEXT:    lbu s3, 4(a1)
2069; RV64I-NEXT:    lbu s6, 5(a1)
2070; RV64I-NEXT:    or s4, s7, s4
2071; RV64I-NEXT:    lbu s7, 6(a1)
2072; RV64I-NEXT:    lbu a1, 7(a1)
2073; RV64I-NEXT:    slli s6, s6, 8
2074; RV64I-NEXT:    or s3, s6, s3
2075; RV64I-NEXT:    sd zero, 32(sp)
2076; RV64I-NEXT:    sd zero, 40(sp)
2077; RV64I-NEXT:    sd zero, 48(sp)
2078; RV64I-NEXT:    sd zero, 56(sp)
2079; RV64I-NEXT:    slli s7, s7, 16
2080; RV64I-NEXT:    slli a1, a1, 24
2081; RV64I-NEXT:    or a1, a1, s7
2082; RV64I-NEXT:    mv s6, sp
2083; RV64I-NEXT:    or a3, a4, a3
2084; RV64I-NEXT:    or a4, a6, a5
2085; RV64I-NEXT:    or a5, t0, a7
2086; RV64I-NEXT:    or a6, t2, t1
2087; RV64I-NEXT:    or a7, t4, t3
2088; RV64I-NEXT:    or a0, a0, t5
2089; RV64I-NEXT:    or t0, s0, t6
2090; RV64I-NEXT:    or t1, s5, s1
2091; RV64I-NEXT:    or t2, s4, s2
2092; RV64I-NEXT:    or a1, a1, s3
2093; RV64I-NEXT:    slli a4, a4, 32
2094; RV64I-NEXT:    slli a6, a6, 32
2095; RV64I-NEXT:    slli a0, a0, 32
2096; RV64I-NEXT:    slli t1, t1, 32
2097; RV64I-NEXT:    slli a1, a1, 32
2098; RV64I-NEXT:    or a3, a4, a3
2099; RV64I-NEXT:    or a4, a6, a5
2100; RV64I-NEXT:    or a0, a0, a7
2101; RV64I-NEXT:    or a5, t1, t0
2102; RV64I-NEXT:    or a1, a1, t2
2103; RV64I-NEXT:    sd a3, 0(sp)
2104; RV64I-NEXT:    sd a4, 8(sp)
2105; RV64I-NEXT:    sd a0, 16(sp)
2106; RV64I-NEXT:    sd a5, 24(sp)
2107; RV64I-NEXT:    slli a4, a1, 3
2108; RV64I-NEXT:    andi a1, a1, 24
2109; RV64I-NEXT:    add a1, s6, a1
2110; RV64I-NEXT:    andi a0, a4, 56
2111; RV64I-NEXT:    ld a3, 0(a1)
2112; RV64I-NEXT:    ld a5, 8(a1)
2113; RV64I-NEXT:    ld a6, 16(a1)
2114; RV64I-NEXT:    xori a7, a0, 63
2115; RV64I-NEXT:    ld t0, 24(a1)
2116; RV64I-NEXT:    srl a0, a5, a4
2117; RV64I-NEXT:    slli t1, a6, 1
2118; RV64I-NEXT:    srl a1, a3, a4
2119; RV64I-NEXT:    slli a5, a5, 1
2120; RV64I-NEXT:    srl a3, a6, a4
2121; RV64I-NEXT:    slli a6, t0, 1
2122; RV64I-NEXT:    srl t0, t0, a4
2123; RV64I-NEXT:    sll a4, t1, a7
2124; RV64I-NEXT:    sll a5, a5, a7
2125; RV64I-NEXT:    sll a6, a6, a7
2126; RV64I-NEXT:    srli a7, t0, 56
2127; RV64I-NEXT:    srli t1, t0, 48
2128; RV64I-NEXT:    srli t2, t0, 40
2129; RV64I-NEXT:    srli t3, t0, 32
2130; RV64I-NEXT:    srli t4, t0, 24
2131; RV64I-NEXT:    srli t5, t0, 16
2132; RV64I-NEXT:    srli t6, t0, 8
2133; RV64I-NEXT:    or a4, a0, a4
2134; RV64I-NEXT:    or a5, a1, a5
2135; RV64I-NEXT:    or a6, a3, a6
2136; RV64I-NEXT:    sb t3, 28(a2)
2137; RV64I-NEXT:    sb t2, 29(a2)
2138; RV64I-NEXT:    sb t1, 30(a2)
2139; RV64I-NEXT:    sb a7, 31(a2)
2140; RV64I-NEXT:    sb t0, 24(a2)
2141; RV64I-NEXT:    sb t6, 25(a2)
2142; RV64I-NEXT:    sb t5, 26(a2)
2143; RV64I-NEXT:    sb t4, 27(a2)
2144; RV64I-NEXT:    srli a7, a6, 56
2145; RV64I-NEXT:    srli t0, a6, 48
2146; RV64I-NEXT:    srli t1, a6, 40
2147; RV64I-NEXT:    srli t2, a6, 32
2148; RV64I-NEXT:    srli t3, a6, 24
2149; RV64I-NEXT:    srli t4, a6, 16
2150; RV64I-NEXT:    srli a6, a6, 8
2151; RV64I-NEXT:    srli t5, a5, 56
2152; RV64I-NEXT:    srli t6, a5, 48
2153; RV64I-NEXT:    srli s0, a5, 40
2154; RV64I-NEXT:    srli s1, a5, 32
2155; RV64I-NEXT:    srli s2, a5, 24
2156; RV64I-NEXT:    srli s3, a5, 16
2157; RV64I-NEXT:    srli a5, a5, 8
2158; RV64I-NEXT:    srli s4, a4, 56
2159; RV64I-NEXT:    srli s5, a4, 48
2160; RV64I-NEXT:    srli s6, a4, 40
2161; RV64I-NEXT:    sb t2, 20(a2)
2162; RV64I-NEXT:    sb t1, 21(a2)
2163; RV64I-NEXT:    sb t0, 22(a2)
2164; RV64I-NEXT:    sb a7, 23(a2)
2165; RV64I-NEXT:    srli a7, a4, 32
2166; RV64I-NEXT:    sb a3, 16(a2)
2167; RV64I-NEXT:    sb a6, 17(a2)
2168; RV64I-NEXT:    sb t4, 18(a2)
2169; RV64I-NEXT:    sb t3, 19(a2)
2170; RV64I-NEXT:    srli a3, a4, 24
2171; RV64I-NEXT:    sb s1, 4(a2)
2172; RV64I-NEXT:    sb s0, 5(a2)
2173; RV64I-NEXT:    sb t6, 6(a2)
2174; RV64I-NEXT:    sb t5, 7(a2)
2175; RV64I-NEXT:    srli a6, a4, 16
2176; RV64I-NEXT:    srli a4, a4, 8
2177; RV64I-NEXT:    sb a1, 0(a2)
2178; RV64I-NEXT:    sb a5, 1(a2)
2179; RV64I-NEXT:    sb s3, 2(a2)
2180; RV64I-NEXT:    sb s2, 3(a2)
2181; RV64I-NEXT:    sb a7, 12(a2)
2182; RV64I-NEXT:    sb s6, 13(a2)
2183; RV64I-NEXT:    sb s5, 14(a2)
2184; RV64I-NEXT:    sb s4, 15(a2)
2185; RV64I-NEXT:    sb a0, 8(a2)
2186; RV64I-NEXT:    sb a4, 9(a2)
2187; RV64I-NEXT:    sb a6, 10(a2)
2188; RV64I-NEXT:    sb a3, 11(a2)
2189; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
2190; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
2191; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
2192; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
2193; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
2194; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
2195; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
2196; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
2197; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
2198; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
2199; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
2200; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
2201; RV64I-NEXT:    addi sp, sp, 160
2202; RV64I-NEXT:    ret
2203;
2204; RV32I-LABEL: lshr_32bytes:
2205; RV32I:       # %bb.0:
2206; RV32I-NEXT:    addi sp, sp, -128
2207; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
2208; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
2209; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
2210; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
2211; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
2212; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
2213; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
2214; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
2215; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
2216; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
2217; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
2218; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
2219; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
2220; RV32I-NEXT:    lbu s1, 0(a0)
2221; RV32I-NEXT:    lbu a4, 1(a0)
2222; RV32I-NEXT:    lbu a5, 2(a0)
2223; RV32I-NEXT:    lbu a6, 3(a0)
2224; RV32I-NEXT:    lbu t1, 4(a0)
2225; RV32I-NEXT:    lbu t3, 5(a0)
2226; RV32I-NEXT:    lbu t4, 6(a0)
2227; RV32I-NEXT:    lbu s0, 7(a0)
2228; RV32I-NEXT:    lbu t2, 8(a0)
2229; RV32I-NEXT:    lbu s3, 9(a0)
2230; RV32I-NEXT:    lbu s6, 10(a0)
2231; RV32I-NEXT:    lbu s8, 11(a0)
2232; RV32I-NEXT:    lbu s9, 12(a0)
2233; RV32I-NEXT:    lbu s10, 13(a0)
2234; RV32I-NEXT:    lbu s4, 14(a0)
2235; RV32I-NEXT:    lbu s7, 15(a0)
2236; RV32I-NEXT:    lbu s5, 16(a0)
2237; RV32I-NEXT:    lbu s11, 17(a0)
2238; RV32I-NEXT:    lbu ra, 18(a0)
2239; RV32I-NEXT:    lbu a3, 19(a0)
2240; RV32I-NEXT:    lbu t5, 20(a0)
2241; RV32I-NEXT:    lbu t6, 21(a0)
2242; RV32I-NEXT:    lbu a7, 22(a0)
2243; RV32I-NEXT:    lbu t0, 23(a0)
2244; RV32I-NEXT:    slli a4, a4, 8
2245; RV32I-NEXT:    slli a5, a5, 16
2246; RV32I-NEXT:    slli a6, a6, 24
2247; RV32I-NEXT:    slli t3, t3, 8
2248; RV32I-NEXT:    slli t4, t4, 16
2249; RV32I-NEXT:    slli s0, s0, 24
2250; RV32I-NEXT:    or a4, a4, s1
2251; RV32I-NEXT:    sw a4, 4(sp) # 4-byte Folded Spill
2252; RV32I-NEXT:    or a4, a6, a5
2253; RV32I-NEXT:    or a5, t3, t1
2254; RV32I-NEXT:    or a6, s0, t4
2255; RV32I-NEXT:    lbu t1, 24(a0)
2256; RV32I-NEXT:    lbu s0, 25(a0)
2257; RV32I-NEXT:    lbu s1, 26(a0)
2258; RV32I-NEXT:    lbu s2, 27(a0)
2259; RV32I-NEXT:    slli s3, s3, 8
2260; RV32I-NEXT:    slli s6, s6, 16
2261; RV32I-NEXT:    slli s8, s8, 24
2262; RV32I-NEXT:    slli s10, s10, 8
2263; RV32I-NEXT:    or t2, s3, t2
2264; RV32I-NEXT:    or t3, s8, s6
2265; RV32I-NEXT:    or t4, s10, s9
2266; RV32I-NEXT:    lbu s3, 28(a0)
2267; RV32I-NEXT:    lbu s6, 29(a0)
2268; RV32I-NEXT:    lbu s8, 30(a0)
2269; RV32I-NEXT:    lbu s9, 31(a0)
2270; RV32I-NEXT:    slli s4, s4, 16
2271; RV32I-NEXT:    slli s7, s7, 24
2272; RV32I-NEXT:    slli s11, s11, 8
2273; RV32I-NEXT:    slli ra, ra, 16
2274; RV32I-NEXT:    slli a3, a3, 24
2275; RV32I-NEXT:    or a0, s7, s4
2276; RV32I-NEXT:    or s4, s11, s5
2277; RV32I-NEXT:    or s5, a3, ra
2278; RV32I-NEXT:    lbu a3, 0(a1)
2279; RV32I-NEXT:    lbu s7, 1(a1)
2280; RV32I-NEXT:    lbu s10, 2(a1)
2281; RV32I-NEXT:    lbu a1, 3(a1)
2282; RV32I-NEXT:    sw zero, 56(sp)
2283; RV32I-NEXT:    sw zero, 60(sp)
2284; RV32I-NEXT:    sw zero, 64(sp)
2285; RV32I-NEXT:    sw zero, 68(sp)
2286; RV32I-NEXT:    sw zero, 40(sp)
2287; RV32I-NEXT:    sw zero, 44(sp)
2288; RV32I-NEXT:    sw zero, 48(sp)
2289; RV32I-NEXT:    sw zero, 52(sp)
2290; RV32I-NEXT:    slli t6, t6, 8
2291; RV32I-NEXT:    or t5, t6, t5
2292; RV32I-NEXT:    addi t6, sp, 8
2293; RV32I-NEXT:    slli a7, a7, 16
2294; RV32I-NEXT:    slli t0, t0, 24
2295; RV32I-NEXT:    slli s0, s0, 8
2296; RV32I-NEXT:    slli s1, s1, 16
2297; RV32I-NEXT:    slli s2, s2, 24
2298; RV32I-NEXT:    slli s6, s6, 8
2299; RV32I-NEXT:    slli s8, s8, 16
2300; RV32I-NEXT:    slli s9, s9, 24
2301; RV32I-NEXT:    slli s7, s7, 8
2302; RV32I-NEXT:    slli s10, s10, 16
2303; RV32I-NEXT:    slli a1, a1, 24
2304; RV32I-NEXT:    or a7, t0, a7
2305; RV32I-NEXT:    or t0, s0, t1
2306; RV32I-NEXT:    or t1, s2, s1
2307; RV32I-NEXT:    or s0, s6, s3
2308; RV32I-NEXT:    or s1, s9, s8
2309; RV32I-NEXT:    or a3, s7, a3
2310; RV32I-NEXT:    or a1, a1, s10
2311; RV32I-NEXT:    lw s2, 4(sp) # 4-byte Folded Reload
2312; RV32I-NEXT:    or a4, a4, s2
2313; RV32I-NEXT:    or a5, a6, a5
2314; RV32I-NEXT:    or a6, t3, t2
2315; RV32I-NEXT:    or a0, a0, t4
2316; RV32I-NEXT:    or t2, s5, s4
2317; RV32I-NEXT:    or a7, a7, t5
2318; RV32I-NEXT:    or t0, t1, t0
2319; RV32I-NEXT:    or s0, s1, s0
2320; RV32I-NEXT:    or a1, a1, a3
2321; RV32I-NEXT:    sw t2, 24(sp)
2322; RV32I-NEXT:    sw a7, 28(sp)
2323; RV32I-NEXT:    sw t0, 32(sp)
2324; RV32I-NEXT:    sw s0, 36(sp)
2325; RV32I-NEXT:    sw a4, 8(sp)
2326; RV32I-NEXT:    sw a5, 12(sp)
2327; RV32I-NEXT:    sw a6, 16(sp)
2328; RV32I-NEXT:    sw a0, 20(sp)
2329; RV32I-NEXT:    slli t1, a1, 3
2330; RV32I-NEXT:    andi a1, a1, 28
2331; RV32I-NEXT:    add a1, t6, a1
2332; RV32I-NEXT:    andi a0, t1, 24
2333; RV32I-NEXT:    xori t0, a0, 31
2334; RV32I-NEXT:    lw a3, 0(a1)
2335; RV32I-NEXT:    lw a4, 4(a1)
2336; RV32I-NEXT:    lw a5, 8(a1)
2337; RV32I-NEXT:    lw a6, 12(a1)
2338; RV32I-NEXT:    lw a7, 16(a1)
2339; RV32I-NEXT:    lw t2, 20(a1)
2340; RV32I-NEXT:    lw t3, 24(a1)
2341; RV32I-NEXT:    lw t4, 28(a1)
2342; RV32I-NEXT:    srl a0, a4, t1
2343; RV32I-NEXT:    slli t5, a5, 1
2344; RV32I-NEXT:    srl a1, a3, t1
2345; RV32I-NEXT:    slli t6, a4, 1
2346; RV32I-NEXT:    srl a3, a6, t1
2347; RV32I-NEXT:    slli s0, a7, 1
2348; RV32I-NEXT:    srl a4, a5, t1
2349; RV32I-NEXT:    slli s1, a6, 1
2350; RV32I-NEXT:    srl a5, t2, t1
2351; RV32I-NEXT:    slli s2, t3, 1
2352; RV32I-NEXT:    srl a6, a7, t1
2353; RV32I-NEXT:    slli t2, t2, 1
2354; RV32I-NEXT:    srl a7, t3, t1
2355; RV32I-NEXT:    slli t3, t4, 1
2356; RV32I-NEXT:    srl t1, t4, t1
2357; RV32I-NEXT:    sll t4, t5, t0
2358; RV32I-NEXT:    sll t5, t6, t0
2359; RV32I-NEXT:    sll t6, s0, t0
2360; RV32I-NEXT:    sll s0, s1, t0
2361; RV32I-NEXT:    sll s1, s2, t0
2362; RV32I-NEXT:    sll t2, t2, t0
2363; RV32I-NEXT:    sll t3, t3, t0
2364; RV32I-NEXT:    srli s2, t1, 24
2365; RV32I-NEXT:    srli s3, t1, 16
2366; RV32I-NEXT:    srli s4, t1, 8
2367; RV32I-NEXT:    or t0, a0, t4
2368; RV32I-NEXT:    or t4, a1, t5
2369; RV32I-NEXT:    or t5, a3, t6
2370; RV32I-NEXT:    or s0, a4, s0
2371; RV32I-NEXT:    or s1, a5, s1
2372; RV32I-NEXT:    or t2, a6, t2
2373; RV32I-NEXT:    or t3, a7, t3
2374; RV32I-NEXT:    sb t1, 28(a2)
2375; RV32I-NEXT:    sb s4, 29(a2)
2376; RV32I-NEXT:    sb s3, 30(a2)
2377; RV32I-NEXT:    sb s2, 31(a2)
2378; RV32I-NEXT:    srli t1, t3, 24
2379; RV32I-NEXT:    srli t6, t3, 16
2380; RV32I-NEXT:    srli t3, t3, 8
2381; RV32I-NEXT:    srli s2, t2, 24
2382; RV32I-NEXT:    srli s3, t2, 16
2383; RV32I-NEXT:    srli t2, t2, 8
2384; RV32I-NEXT:    srli s4, s1, 24
2385; RV32I-NEXT:    srli s5, s1, 16
2386; RV32I-NEXT:    srli s1, s1, 8
2387; RV32I-NEXT:    srli s6, s0, 24
2388; RV32I-NEXT:    srli s7, s0, 16
2389; RV32I-NEXT:    srli s0, s0, 8
2390; RV32I-NEXT:    srli s8, t5, 24
2391; RV32I-NEXT:    srli s9, t5, 16
2392; RV32I-NEXT:    srli t5, t5, 8
2393; RV32I-NEXT:    srli s10, t4, 24
2394; RV32I-NEXT:    srli s11, t4, 16
2395; RV32I-NEXT:    srli t4, t4, 8
2396; RV32I-NEXT:    sb a7, 24(a2)
2397; RV32I-NEXT:    sb t3, 25(a2)
2398; RV32I-NEXT:    sb t6, 26(a2)
2399; RV32I-NEXT:    sb t1, 27(a2)
2400; RV32I-NEXT:    srli a7, t0, 24
2401; RV32I-NEXT:    sb a6, 16(a2)
2402; RV32I-NEXT:    sb t2, 17(a2)
2403; RV32I-NEXT:    sb s3, 18(a2)
2404; RV32I-NEXT:    sb s2, 19(a2)
2405; RV32I-NEXT:    srli a6, t0, 16
2406; RV32I-NEXT:    srli t0, t0, 8
2407; RV32I-NEXT:    sb a5, 20(a2)
2408; RV32I-NEXT:    sb s1, 21(a2)
2409; RV32I-NEXT:    sb s5, 22(a2)
2410; RV32I-NEXT:    sb s4, 23(a2)
2411; RV32I-NEXT:    sb a4, 8(a2)
2412; RV32I-NEXT:    sb s0, 9(a2)
2413; RV32I-NEXT:    sb s7, 10(a2)
2414; RV32I-NEXT:    sb s6, 11(a2)
2415; RV32I-NEXT:    sb a3, 12(a2)
2416; RV32I-NEXT:    sb t5, 13(a2)
2417; RV32I-NEXT:    sb s9, 14(a2)
2418; RV32I-NEXT:    sb s8, 15(a2)
2419; RV32I-NEXT:    sb a1, 0(a2)
2420; RV32I-NEXT:    sb t4, 1(a2)
2421; RV32I-NEXT:    sb s11, 2(a2)
2422; RV32I-NEXT:    sb s10, 3(a2)
2423; RV32I-NEXT:    sb a0, 4(a2)
2424; RV32I-NEXT:    sb t0, 5(a2)
2425; RV32I-NEXT:    sb a6, 6(a2)
2426; RV32I-NEXT:    sb a7, 7(a2)
2427; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
2428; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
2429; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
2430; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
2431; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
2432; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
2433; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
2434; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
2435; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
2436; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
2437; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
2438; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
2439; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
2440; RV32I-NEXT:    addi sp, sp, 128
2441; RV32I-NEXT:    ret
2442  %src = load i256, ptr %src.ptr, align 1
2443  %byteOff = load i256, ptr %byteOff.ptr, align 1
2444  %bitOff = shl i256 %byteOff, 3
2445  %res = lshr i256 %src, %bitOff
2446  store i256 %res, ptr %dst, align 1
2447  ret void
2448}
2449
2450define void @lshr_32bytes_wordOff(ptr %src.ptr, ptr %wordOff.ptr, ptr %dst) nounwind {
2451; RV64I-LABEL: lshr_32bytes_wordOff:
2452; RV64I:       # %bb.0:
2453; RV64I-NEXT:    addi sp, sp, -160
2454; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
2455; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
2456; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
2457; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
2458; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
2459; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
2460; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
2461; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
2462; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
2463; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
2464; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
2465; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
2466; RV64I-NEXT:    lbu a3, 0(a0)
2467; RV64I-NEXT:    lbu a4, 1(a0)
2468; RV64I-NEXT:    lbu a5, 2(a0)
2469; RV64I-NEXT:    lbu a6, 3(a0)
2470; RV64I-NEXT:    lbu a7, 4(a0)
2471; RV64I-NEXT:    lbu t0, 5(a0)
2472; RV64I-NEXT:    lbu t1, 6(a0)
2473; RV64I-NEXT:    lbu t2, 7(a0)
2474; RV64I-NEXT:    lbu t3, 8(a0)
2475; RV64I-NEXT:    lbu t4, 9(a0)
2476; RV64I-NEXT:    lbu t5, 10(a0)
2477; RV64I-NEXT:    lbu t6, 11(a0)
2478; RV64I-NEXT:    lbu s0, 12(a0)
2479; RV64I-NEXT:    lbu s1, 13(a0)
2480; RV64I-NEXT:    lbu s2, 14(a0)
2481; RV64I-NEXT:    lbu s3, 15(a0)
2482; RV64I-NEXT:    lbu s4, 16(a0)
2483; RV64I-NEXT:    lbu s5, 17(a0)
2484; RV64I-NEXT:    lbu s6, 18(a0)
2485; RV64I-NEXT:    lbu s7, 19(a0)
2486; RV64I-NEXT:    slli a4, a4, 8
2487; RV64I-NEXT:    slli a5, a5, 16
2488; RV64I-NEXT:    slli a6, a6, 24
2489; RV64I-NEXT:    slli t0, t0, 8
2490; RV64I-NEXT:    slli t1, t1, 16
2491; RV64I-NEXT:    slli t2, t2, 24
2492; RV64I-NEXT:    or a3, a4, a3
2493; RV64I-NEXT:    or a4, a6, a5
2494; RV64I-NEXT:    or a5, t0, a7
2495; RV64I-NEXT:    or a6, t2, t1
2496; RV64I-NEXT:    lbu s8, 20(a0)
2497; RV64I-NEXT:    lbu s9, 21(a0)
2498; RV64I-NEXT:    lbu s10, 22(a0)
2499; RV64I-NEXT:    lbu s11, 23(a0)
2500; RV64I-NEXT:    slli t4, t4, 8
2501; RV64I-NEXT:    slli t5, t5, 16
2502; RV64I-NEXT:    slli t6, t6, 24
2503; RV64I-NEXT:    slli s1, s1, 8
2504; RV64I-NEXT:    slli s2, s2, 16
2505; RV64I-NEXT:    slli s3, s3, 24
2506; RV64I-NEXT:    or a7, t4, t3
2507; RV64I-NEXT:    or t0, t6, t5
2508; RV64I-NEXT:    or t1, s1, s0
2509; RV64I-NEXT:    or t2, s3, s2
2510; RV64I-NEXT:    lbu t6, 24(a0)
2511; RV64I-NEXT:    lbu s0, 25(a0)
2512; RV64I-NEXT:    lbu s1, 26(a0)
2513; RV64I-NEXT:    lbu s2, 27(a0)
2514; RV64I-NEXT:    slli s5, s5, 8
2515; RV64I-NEXT:    slli s6, s6, 16
2516; RV64I-NEXT:    slli s7, s7, 24
2517; RV64I-NEXT:    slli s9, s9, 8
2518; RV64I-NEXT:    or t3, s5, s4
2519; RV64I-NEXT:    or t4, s7, s6
2520; RV64I-NEXT:    or t5, s9, s8
2521; RV64I-NEXT:    lbu s3, 28(a0)
2522; RV64I-NEXT:    lbu s4, 29(a0)
2523; RV64I-NEXT:    lbu s5, 30(a0)
2524; RV64I-NEXT:    lbu s6, 31(a0)
2525; RV64I-NEXT:    slli s10, s10, 16
2526; RV64I-NEXT:    slli s11, s11, 24
2527; RV64I-NEXT:    slli s0, s0, 8
2528; RV64I-NEXT:    slli s1, s1, 16
2529; RV64I-NEXT:    slli s2, s2, 24
2530; RV64I-NEXT:    slli s4, s4, 8
2531; RV64I-NEXT:    or a0, s11, s10
2532; RV64I-NEXT:    or t6, s0, t6
2533; RV64I-NEXT:    or s0, s2, s1
2534; RV64I-NEXT:    or s1, s4, s3
2535; RV64I-NEXT:    lbu s2, 0(a1)
2536; RV64I-NEXT:    lbu s3, 1(a1)
2537; RV64I-NEXT:    lbu s4, 2(a1)
2538; RV64I-NEXT:    lbu s7, 3(a1)
2539; RV64I-NEXT:    slli s5, s5, 16
2540; RV64I-NEXT:    slli s6, s6, 24
2541; RV64I-NEXT:    slli s3, s3, 8
2542; RV64I-NEXT:    slli s4, s4, 16
2543; RV64I-NEXT:    slli s7, s7, 24
2544; RV64I-NEXT:    or s5, s6, s5
2545; RV64I-NEXT:    or s2, s3, s2
2546; RV64I-NEXT:    lbu s3, 4(a1)
2547; RV64I-NEXT:    lbu s6, 5(a1)
2548; RV64I-NEXT:    or s4, s7, s4
2549; RV64I-NEXT:    lbu s7, 6(a1)
2550; RV64I-NEXT:    lbu a1, 7(a1)
2551; RV64I-NEXT:    slli s6, s6, 8
2552; RV64I-NEXT:    or s3, s6, s3
2553; RV64I-NEXT:    sd zero, 32(sp)
2554; RV64I-NEXT:    sd zero, 40(sp)
2555; RV64I-NEXT:    sd zero, 48(sp)
2556; RV64I-NEXT:    sd zero, 56(sp)
2557; RV64I-NEXT:    slli s7, s7, 16
2558; RV64I-NEXT:    slli a1, a1, 24
2559; RV64I-NEXT:    or a1, a1, s7
2560; RV64I-NEXT:    mv s6, sp
2561; RV64I-NEXT:    or a3, a4, a3
2562; RV64I-NEXT:    or a4, a6, a5
2563; RV64I-NEXT:    or a5, t0, a7
2564; RV64I-NEXT:    or a6, t2, t1
2565; RV64I-NEXT:    or a7, t4, t3
2566; RV64I-NEXT:    or a0, a0, t5
2567; RV64I-NEXT:    or t0, s0, t6
2568; RV64I-NEXT:    or t1, s5, s1
2569; RV64I-NEXT:    or t2, s4, s2
2570; RV64I-NEXT:    or a1, a1, s3
2571; RV64I-NEXT:    slli a4, a4, 32
2572; RV64I-NEXT:    slli a6, a6, 32
2573; RV64I-NEXT:    slli a0, a0, 32
2574; RV64I-NEXT:    slli t1, t1, 32
2575; RV64I-NEXT:    slli a1, a1, 32
2576; RV64I-NEXT:    or a3, a4, a3
2577; RV64I-NEXT:    or a4, a6, a5
2578; RV64I-NEXT:    or a0, a0, a7
2579; RV64I-NEXT:    or a5, t1, t0
2580; RV64I-NEXT:    or a1, a1, t2
2581; RV64I-NEXT:    sd a3, 0(sp)
2582; RV64I-NEXT:    sd a4, 8(sp)
2583; RV64I-NEXT:    sd a0, 16(sp)
2584; RV64I-NEXT:    sd a5, 24(sp)
2585; RV64I-NEXT:    slli a3, a1, 5
2586; RV64I-NEXT:    slli a1, a1, 2
2587; RV64I-NEXT:    andi a1, a1, 24
2588; RV64I-NEXT:    andi a0, a3, 32
2589; RV64I-NEXT:    add a1, s6, a1
2590; RV64I-NEXT:    ld a4, 0(a1)
2591; RV64I-NEXT:    ld a5, 8(a1)
2592; RV64I-NEXT:    ld a6, 16(a1)
2593; RV64I-NEXT:    xori a7, a0, 63
2594; RV64I-NEXT:    ld t0, 24(a1)
2595; RV64I-NEXT:    srl a0, a5, a3
2596; RV64I-NEXT:    slli t1, a6, 1
2597; RV64I-NEXT:    srl a1, a4, a3
2598; RV64I-NEXT:    slli a5, a5, 1
2599; RV64I-NEXT:    srl a4, a6, a3
2600; RV64I-NEXT:    slli a6, t0, 1
2601; RV64I-NEXT:    srl a3, t0, a3
2602; RV64I-NEXT:    sll t0, t1, a7
2603; RV64I-NEXT:    sll a5, a5, a7
2604; RV64I-NEXT:    sll a6, a6, a7
2605; RV64I-NEXT:    srli a7, a4, 24
2606; RV64I-NEXT:    srli t1, a4, 16
2607; RV64I-NEXT:    srli t2, a4, 8
2608; RV64I-NEXT:    srli t3, a3, 56
2609; RV64I-NEXT:    srli t4, a3, 48
2610; RV64I-NEXT:    srli t5, a3, 40
2611; RV64I-NEXT:    srli t6, a3, 32
2612; RV64I-NEXT:    srli s0, a3, 24
2613; RV64I-NEXT:    srli s1, a3, 16
2614; RV64I-NEXT:    srli s2, a3, 8
2615; RV64I-NEXT:    srli s3, a1, 24
2616; RV64I-NEXT:    srli s4, a1, 16
2617; RV64I-NEXT:    srli s5, a1, 8
2618; RV64I-NEXT:    srli s6, a0, 24
2619; RV64I-NEXT:    or a6, a4, a6
2620; RV64I-NEXT:    sb a4, 16(a2)
2621; RV64I-NEXT:    sb t2, 17(a2)
2622; RV64I-NEXT:    sb t1, 18(a2)
2623; RV64I-NEXT:    sb a7, 19(a2)
2624; RV64I-NEXT:    srli a4, a0, 16
2625; RV64I-NEXT:    sb t6, 28(a2)
2626; RV64I-NEXT:    sb t5, 29(a2)
2627; RV64I-NEXT:    sb t4, 30(a2)
2628; RV64I-NEXT:    sb t3, 31(a2)
2629; RV64I-NEXT:    srli a7, a0, 8
2630; RV64I-NEXT:    or t0, a0, t0
2631; RV64I-NEXT:    or a5, a1, a5
2632; RV64I-NEXT:    sb a3, 24(a2)
2633; RV64I-NEXT:    sb s2, 25(a2)
2634; RV64I-NEXT:    sb s1, 26(a2)
2635; RV64I-NEXT:    sb s0, 27(a2)
2636; RV64I-NEXT:    sb a1, 0(a2)
2637; RV64I-NEXT:    sb s5, 1(a2)
2638; RV64I-NEXT:    sb s4, 2(a2)
2639; RV64I-NEXT:    sb s3, 3(a2)
2640; RV64I-NEXT:    sb a0, 8(a2)
2641; RV64I-NEXT:    sb a7, 9(a2)
2642; RV64I-NEXT:    sb a4, 10(a2)
2643; RV64I-NEXT:    sb s6, 11(a2)
2644; RV64I-NEXT:    srli a0, a6, 56
2645; RV64I-NEXT:    srli a1, a6, 48
2646; RV64I-NEXT:    srli a3, a6, 40
2647; RV64I-NEXT:    srli a4, a6, 32
2648; RV64I-NEXT:    srli a6, a5, 56
2649; RV64I-NEXT:    srli a7, a5, 48
2650; RV64I-NEXT:    srli t1, a5, 40
2651; RV64I-NEXT:    srli a5, a5, 32
2652; RV64I-NEXT:    srli t2, t0, 56
2653; RV64I-NEXT:    srli t3, t0, 48
2654; RV64I-NEXT:    srli t4, t0, 40
2655; RV64I-NEXT:    srli t0, t0, 32
2656; RV64I-NEXT:    sb a4, 20(a2)
2657; RV64I-NEXT:    sb a3, 21(a2)
2658; RV64I-NEXT:    sb a1, 22(a2)
2659; RV64I-NEXT:    sb a0, 23(a2)
2660; RV64I-NEXT:    sb a5, 4(a2)
2661; RV64I-NEXT:    sb t1, 5(a2)
2662; RV64I-NEXT:    sb a7, 6(a2)
2663; RV64I-NEXT:    sb a6, 7(a2)
2664; RV64I-NEXT:    sb t0, 12(a2)
2665; RV64I-NEXT:    sb t4, 13(a2)
2666; RV64I-NEXT:    sb t3, 14(a2)
2667; RV64I-NEXT:    sb t2, 15(a2)
2668; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
2669; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
2670; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
2671; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
2672; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
2673; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
2674; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
2675; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
2676; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
2677; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
2678; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
2679; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
2680; RV64I-NEXT:    addi sp, sp, 160
2681; RV64I-NEXT:    ret
2682;
2683; RV32I-LABEL: lshr_32bytes_wordOff:
2684; RV32I:       # %bb.0:
2685; RV32I-NEXT:    addi sp, sp, -128
2686; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
2687; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
2688; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
2689; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
2690; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
2691; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
2692; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
2693; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
2694; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
2695; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
2696; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
2697; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
2698; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
2699; RV32I-NEXT:    lbu a7, 0(a0)
2700; RV32I-NEXT:    lbu t0, 1(a0)
2701; RV32I-NEXT:    lbu t1, 2(a0)
2702; RV32I-NEXT:    lbu s1, 3(a0)
2703; RV32I-NEXT:    lbu s7, 4(a0)
2704; RV32I-NEXT:    lbu s8, 5(a0)
2705; RV32I-NEXT:    lbu s4, 6(a0)
2706; RV32I-NEXT:    lbu s6, 7(a0)
2707; RV32I-NEXT:    lbu s5, 8(a0)
2708; RV32I-NEXT:    lbu s10, 9(a0)
2709; RV32I-NEXT:    lbu s11, 10(a0)
2710; RV32I-NEXT:    lbu ra, 11(a0)
2711; RV32I-NEXT:    lbu t4, 12(a0)
2712; RV32I-NEXT:    lbu t6, 13(a0)
2713; RV32I-NEXT:    lbu a5, 14(a0)
2714; RV32I-NEXT:    lbu a6, 15(a0)
2715; RV32I-NEXT:    lbu a3, 16(a0)
2716; RV32I-NEXT:    lbu t2, 17(a0)
2717; RV32I-NEXT:    lbu t3, 18(a0)
2718; RV32I-NEXT:    lbu t5, 19(a0)
2719; RV32I-NEXT:    lbu a4, 20(a0)
2720; RV32I-NEXT:    lbu s0, 21(a0)
2721; RV32I-NEXT:    lbu s2, 22(a0)
2722; RV32I-NEXT:    lbu s3, 23(a0)
2723; RV32I-NEXT:    slli t0, t0, 8
2724; RV32I-NEXT:    slli t1, t1, 16
2725; RV32I-NEXT:    slli s1, s1, 24
2726; RV32I-NEXT:    slli s8, s8, 8
2727; RV32I-NEXT:    or a7, t0, a7
2728; RV32I-NEXT:    or t0, s1, t1
2729; RV32I-NEXT:    or t1, s8, s7
2730; RV32I-NEXT:    lbu s1, 24(a0)
2731; RV32I-NEXT:    lbu s7, 25(a0)
2732; RV32I-NEXT:    lbu s8, 26(a0)
2733; RV32I-NEXT:    lbu s9, 27(a0)
2734; RV32I-NEXT:    slli s4, s4, 16
2735; RV32I-NEXT:    slli s6, s6, 24
2736; RV32I-NEXT:    slli s10, s10, 8
2737; RV32I-NEXT:    slli s11, s11, 16
2738; RV32I-NEXT:    slli ra, ra, 24
2739; RV32I-NEXT:    or s4, s6, s4
2740; RV32I-NEXT:    or s5, s10, s5
2741; RV32I-NEXT:    or s6, ra, s11
2742; RV32I-NEXT:    lbu s10, 28(a0)
2743; RV32I-NEXT:    lbu s11, 29(a0)
2744; RV32I-NEXT:    lbu ra, 30(a0)
2745; RV32I-NEXT:    lbu a0, 31(a0)
2746; RV32I-NEXT:    lbu a1, 0(a1)
2747; RV32I-NEXT:    sw zero, 56(sp)
2748; RV32I-NEXT:    sw zero, 60(sp)
2749; RV32I-NEXT:    sw zero, 64(sp)
2750; RV32I-NEXT:    sw zero, 68(sp)
2751; RV32I-NEXT:    sw zero, 40(sp)
2752; RV32I-NEXT:    sw zero, 44(sp)
2753; RV32I-NEXT:    sw zero, 48(sp)
2754; RV32I-NEXT:    sw zero, 52(sp)
2755; RV32I-NEXT:    slli t6, t6, 8
2756; RV32I-NEXT:    or t4, t6, t4
2757; RV32I-NEXT:    addi t6, sp, 8
2758; RV32I-NEXT:    slli a5, a5, 16
2759; RV32I-NEXT:    slli a6, a6, 24
2760; RV32I-NEXT:    slli t2, t2, 8
2761; RV32I-NEXT:    slli t3, t3, 16
2762; RV32I-NEXT:    slli t5, t5, 24
2763; RV32I-NEXT:    slli s0, s0, 8
2764; RV32I-NEXT:    slli s2, s2, 16
2765; RV32I-NEXT:    slli s3, s3, 24
2766; RV32I-NEXT:    slli s7, s7, 8
2767; RV32I-NEXT:    slli s8, s8, 16
2768; RV32I-NEXT:    slli s9, s9, 24
2769; RV32I-NEXT:    slli s11, s11, 8
2770; RV32I-NEXT:    slli ra, ra, 16
2771; RV32I-NEXT:    slli a0, a0, 24
2772; RV32I-NEXT:    slli a1, a1, 2
2773; RV32I-NEXT:    or a5, a6, a5
2774; RV32I-NEXT:    or a3, t2, a3
2775; RV32I-NEXT:    or a6, t5, t3
2776; RV32I-NEXT:    or a4, s0, a4
2777; RV32I-NEXT:    or t2, s3, s2
2778; RV32I-NEXT:    or t3, s7, s1
2779; RV32I-NEXT:    or t5, s9, s8
2780; RV32I-NEXT:    or s0, s11, s10
2781; RV32I-NEXT:    or a0, a0, ra
2782; RV32I-NEXT:    andi a1, a1, 28
2783; RV32I-NEXT:    or a7, t0, a7
2784; RV32I-NEXT:    or t0, s4, t1
2785; RV32I-NEXT:    or t1, s6, s5
2786; RV32I-NEXT:    or a5, a5, t4
2787; RV32I-NEXT:    or a3, a6, a3
2788; RV32I-NEXT:    or a4, t2, a4
2789; RV32I-NEXT:    or a6, t5, t3
2790; RV32I-NEXT:    or a0, a0, s0
2791; RV32I-NEXT:    add t6, t6, a1
2792; RV32I-NEXT:    sw a3, 24(sp)
2793; RV32I-NEXT:    sw a4, 28(sp)
2794; RV32I-NEXT:    sw a6, 32(sp)
2795; RV32I-NEXT:    sw a0, 36(sp)
2796; RV32I-NEXT:    sw a7, 8(sp)
2797; RV32I-NEXT:    sw t0, 12(sp)
2798; RV32I-NEXT:    sw t1, 16(sp)
2799; RV32I-NEXT:    sw a5, 20(sp)
2800; RV32I-NEXT:    lw a6, 16(t6)
2801; RV32I-NEXT:    lw a5, 20(t6)
2802; RV32I-NEXT:    lw a7, 24(t6)
2803; RV32I-NEXT:    lw a1, 0(t6)
2804; RV32I-NEXT:    lw a0, 4(t6)
2805; RV32I-NEXT:    lw a4, 8(t6)
2806; RV32I-NEXT:    lw a3, 12(t6)
2807; RV32I-NEXT:    lw t0, 28(t6)
2808; RV32I-NEXT:    srli t1, a7, 24
2809; RV32I-NEXT:    srli t2, a7, 16
2810; RV32I-NEXT:    srli t3, a7, 8
2811; RV32I-NEXT:    srli t4, t0, 24
2812; RV32I-NEXT:    srli t5, t0, 16
2813; RV32I-NEXT:    srli t6, t0, 8
2814; RV32I-NEXT:    srli s0, a6, 24
2815; RV32I-NEXT:    srli s1, a6, 16
2816; RV32I-NEXT:    srli s2, a6, 8
2817; RV32I-NEXT:    srli s3, a5, 24
2818; RV32I-NEXT:    srli s4, a5, 16
2819; RV32I-NEXT:    srli s5, a5, 8
2820; RV32I-NEXT:    srli s6, a4, 24
2821; RV32I-NEXT:    srli s7, a4, 16
2822; RV32I-NEXT:    srli s8, a4, 8
2823; RV32I-NEXT:    srli s9, a3, 24
2824; RV32I-NEXT:    srli s10, a3, 16
2825; RV32I-NEXT:    srli s11, a3, 8
2826; RV32I-NEXT:    srli ra, a1, 24
2827; RV32I-NEXT:    sb a7, 24(a2)
2828; RV32I-NEXT:    sb t3, 25(a2)
2829; RV32I-NEXT:    sb t2, 26(a2)
2830; RV32I-NEXT:    sb t1, 27(a2)
2831; RV32I-NEXT:    srli a7, a1, 16
2832; RV32I-NEXT:    sb t0, 28(a2)
2833; RV32I-NEXT:    sb t6, 29(a2)
2834; RV32I-NEXT:    sb t5, 30(a2)
2835; RV32I-NEXT:    sb t4, 31(a2)
2836; RV32I-NEXT:    srli t0, a1, 8
2837; RV32I-NEXT:    sb a6, 16(a2)
2838; RV32I-NEXT:    sb s2, 17(a2)
2839; RV32I-NEXT:    sb s1, 18(a2)
2840; RV32I-NEXT:    sb s0, 19(a2)
2841; RV32I-NEXT:    srli a6, a0, 24
2842; RV32I-NEXT:    sb a5, 20(a2)
2843; RV32I-NEXT:    sb s5, 21(a2)
2844; RV32I-NEXT:    sb s4, 22(a2)
2845; RV32I-NEXT:    sb s3, 23(a2)
2846; RV32I-NEXT:    srli a5, a0, 16
2847; RV32I-NEXT:    sb a4, 8(a2)
2848; RV32I-NEXT:    sb s8, 9(a2)
2849; RV32I-NEXT:    sb s7, 10(a2)
2850; RV32I-NEXT:    sb s6, 11(a2)
2851; RV32I-NEXT:    srli a4, a0, 8
2852; RV32I-NEXT:    sb a3, 12(a2)
2853; RV32I-NEXT:    sb s11, 13(a2)
2854; RV32I-NEXT:    sb s10, 14(a2)
2855; RV32I-NEXT:    sb s9, 15(a2)
2856; RV32I-NEXT:    sb a1, 0(a2)
2857; RV32I-NEXT:    sb t0, 1(a2)
2858; RV32I-NEXT:    sb a7, 2(a2)
2859; RV32I-NEXT:    sb ra, 3(a2)
2860; RV32I-NEXT:    sb a0, 4(a2)
2861; RV32I-NEXT:    sb a4, 5(a2)
2862; RV32I-NEXT:    sb a5, 6(a2)
2863; RV32I-NEXT:    sb a6, 7(a2)
2864; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
2865; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
2866; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
2867; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
2868; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
2869; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
2870; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
2871; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
2872; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
2873; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
2874; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
2875; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
2876; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
2877; RV32I-NEXT:    addi sp, sp, 128
2878; RV32I-NEXT:    ret
2879  %src = load i256, ptr %src.ptr, align 1
2880  %wordOff = load i256, ptr %wordOff.ptr, align 1
2881  %bitOff = shl i256 %wordOff, 5
2882  %res = lshr i256 %src, %bitOff
2883  store i256 %res, ptr %dst, align 1
2884  ret void
2885}
2886
2887define void @lshr_32bytes_dwordOff(ptr %src.ptr, ptr %dwordOff.ptr, ptr %dst) nounwind {
2888; RV64I-LABEL: lshr_32bytes_dwordOff:
2889; RV64I:       # %bb.0:
2890; RV64I-NEXT:    addi sp, sp, -160
2891; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
2892; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
2893; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
2894; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
2895; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
2896; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
2897; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
2898; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
2899; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
2900; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
2901; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
2902; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
2903; RV64I-NEXT:    lbu a5, 0(a0)
2904; RV64I-NEXT:    lbu a7, 1(a0)
2905; RV64I-NEXT:    lbu t2, 2(a0)
2906; RV64I-NEXT:    lbu s3, 3(a0)
2907; RV64I-NEXT:    lbu t0, 4(a0)
2908; RV64I-NEXT:    lbu s8, 5(a0)
2909; RV64I-NEXT:    lbu s9, 6(a0)
2910; RV64I-NEXT:    lbu s10, 7(a0)
2911; RV64I-NEXT:    lbu s2, 8(a0)
2912; RV64I-NEXT:    lbu s4, 9(a0)
2913; RV64I-NEXT:    lbu s5, 10(a0)
2914; RV64I-NEXT:    lbu s6, 11(a0)
2915; RV64I-NEXT:    lbu s7, 12(a0)
2916; RV64I-NEXT:    lbu s11, 13(a0)
2917; RV64I-NEXT:    lbu t1, 14(a0)
2918; RV64I-NEXT:    lbu t3, 15(a0)
2919; RV64I-NEXT:    lbu a3, 16(a0)
2920; RV64I-NEXT:    lbu a6, 17(a0)
2921; RV64I-NEXT:    lbu t4, 18(a0)
2922; RV64I-NEXT:    lbu t5, 19(a0)
2923; RV64I-NEXT:    lbu a4, 20(a0)
2924; RV64I-NEXT:    lbu t6, 21(a0)
2925; RV64I-NEXT:    lbu s0, 22(a0)
2926; RV64I-NEXT:    lbu s1, 23(a0)
2927; RV64I-NEXT:    slli a7, a7, 8
2928; RV64I-NEXT:    slli t2, t2, 16
2929; RV64I-NEXT:    slli s3, s3, 24
2930; RV64I-NEXT:    slli s8, s8, 8
2931; RV64I-NEXT:    slli s9, s9, 16
2932; RV64I-NEXT:    slli s10, s10, 24
2933; RV64I-NEXT:    or a5, a7, a5
2934; RV64I-NEXT:    or a7, s3, t2
2935; RV64I-NEXT:    or t0, s8, t0
2936; RV64I-NEXT:    or t2, s10, s9
2937; RV64I-NEXT:    lbu s3, 24(a0)
2938; RV64I-NEXT:    lbu s8, 25(a0)
2939; RV64I-NEXT:    lbu s9, 26(a0)
2940; RV64I-NEXT:    lbu s10, 27(a0)
2941; RV64I-NEXT:    slli s4, s4, 8
2942; RV64I-NEXT:    slli s5, s5, 16
2943; RV64I-NEXT:    slli s6, s6, 24
2944; RV64I-NEXT:    slli s11, s11, 8
2945; RV64I-NEXT:    or s2, s4, s2
2946; RV64I-NEXT:    or s4, s6, s5
2947; RV64I-NEXT:    or s5, s11, s7
2948; RV64I-NEXT:    lbu s6, 28(a0)
2949; RV64I-NEXT:    lbu s7, 29(a0)
2950; RV64I-NEXT:    lbu s11, 30(a0)
2951; RV64I-NEXT:    lbu a0, 31(a0)
2952; RV64I-NEXT:    lbu a1, 0(a1)
2953; RV64I-NEXT:    sd zero, 32(sp)
2954; RV64I-NEXT:    sd zero, 40(sp)
2955; RV64I-NEXT:    sd zero, 48(sp)
2956; RV64I-NEXT:    sd zero, 56(sp)
2957; RV64I-NEXT:    slli t1, t1, 16
2958; RV64I-NEXT:    slli t3, t3, 24
2959; RV64I-NEXT:    or t1, t3, t1
2960; RV64I-NEXT:    mv t3, sp
2961; RV64I-NEXT:    slli a6, a6, 8
2962; RV64I-NEXT:    slli t4, t4, 16
2963; RV64I-NEXT:    slli t5, t5, 24
2964; RV64I-NEXT:    slli t6, t6, 8
2965; RV64I-NEXT:    slli s0, s0, 16
2966; RV64I-NEXT:    slli s1, s1, 24
2967; RV64I-NEXT:    slli s8, s8, 8
2968; RV64I-NEXT:    slli s9, s9, 16
2969; RV64I-NEXT:    slli s10, s10, 24
2970; RV64I-NEXT:    slli s7, s7, 8
2971; RV64I-NEXT:    slli s11, s11, 16
2972; RV64I-NEXT:    slli a0, a0, 24
2973; RV64I-NEXT:    slli a1, a1, 3
2974; RV64I-NEXT:    or a3, a6, a3
2975; RV64I-NEXT:    or a6, t5, t4
2976; RV64I-NEXT:    or a4, t6, a4
2977; RV64I-NEXT:    or s0, s1, s0
2978; RV64I-NEXT:    or t4, s8, s3
2979; RV64I-NEXT:    or t5, s10, s9
2980; RV64I-NEXT:    or t6, s7, s6
2981; RV64I-NEXT:    or a0, a0, s11
2982; RV64I-NEXT:    andi a1, a1, 24
2983; RV64I-NEXT:    or a5, a7, a5
2984; RV64I-NEXT:    or a7, t2, t0
2985; RV64I-NEXT:    or t0, s4, s2
2986; RV64I-NEXT:    or t1, t1, s5
2987; RV64I-NEXT:    or a3, a6, a3
2988; RV64I-NEXT:    or a4, s0, a4
2989; RV64I-NEXT:    or a6, t5, t4
2990; RV64I-NEXT:    or a0, a0, t6
2991; RV64I-NEXT:    add t3, t3, a1
2992; RV64I-NEXT:    slli a7, a7, 32
2993; RV64I-NEXT:    slli t1, t1, 32
2994; RV64I-NEXT:    slli a4, a4, 32
2995; RV64I-NEXT:    slli a0, a0, 32
2996; RV64I-NEXT:    or a1, a7, a5
2997; RV64I-NEXT:    or a5, t1, t0
2998; RV64I-NEXT:    or a3, a4, a3
2999; RV64I-NEXT:    or a0, a0, a6
3000; RV64I-NEXT:    sd a1, 0(sp)
3001; RV64I-NEXT:    sd a5, 8(sp)
3002; RV64I-NEXT:    sd a3, 16(sp)
3003; RV64I-NEXT:    sd a0, 24(sp)
3004; RV64I-NEXT:    ld a4, 16(t3)
3005; RV64I-NEXT:    ld a0, 8(t3)
3006; RV64I-NEXT:    ld a1, 0(t3)
3007; RV64I-NEXT:    ld a3, 24(t3)
3008; RV64I-NEXT:    srli a5, a4, 56
3009; RV64I-NEXT:    srli a6, a4, 48
3010; RV64I-NEXT:    srli a7, a4, 40
3011; RV64I-NEXT:    srli t0, a4, 32
3012; RV64I-NEXT:    srli t1, a4, 24
3013; RV64I-NEXT:    srli t2, a4, 16
3014; RV64I-NEXT:    srli t3, a4, 8
3015; RV64I-NEXT:    srli t4, a3, 56
3016; RV64I-NEXT:    srli t5, a3, 48
3017; RV64I-NEXT:    srli t6, a3, 40
3018; RV64I-NEXT:    srli s0, a3, 32
3019; RV64I-NEXT:    srli s1, a3, 24
3020; RV64I-NEXT:    srli s2, a3, 16
3021; RV64I-NEXT:    srli s3, a3, 8
3022; RV64I-NEXT:    srli s4, a1, 56
3023; RV64I-NEXT:    srli s5, a1, 48
3024; RV64I-NEXT:    srli s6, a1, 40
3025; RV64I-NEXT:    srli s7, a1, 32
3026; RV64I-NEXT:    srli s8, a1, 24
3027; RV64I-NEXT:    srli s9, a1, 16
3028; RV64I-NEXT:    srli s10, a1, 8
3029; RV64I-NEXT:    srli s11, a0, 56
3030; RV64I-NEXT:    sb t0, 20(a2)
3031; RV64I-NEXT:    sb a7, 21(a2)
3032; RV64I-NEXT:    sb a6, 22(a2)
3033; RV64I-NEXT:    sb a5, 23(a2)
3034; RV64I-NEXT:    srli a5, a0, 48
3035; RV64I-NEXT:    sb a4, 16(a2)
3036; RV64I-NEXT:    sb t3, 17(a2)
3037; RV64I-NEXT:    sb t2, 18(a2)
3038; RV64I-NEXT:    sb t1, 19(a2)
3039; RV64I-NEXT:    srli a4, a0, 40
3040; RV64I-NEXT:    sb s0, 28(a2)
3041; RV64I-NEXT:    sb t6, 29(a2)
3042; RV64I-NEXT:    sb t5, 30(a2)
3043; RV64I-NEXT:    sb t4, 31(a2)
3044; RV64I-NEXT:    srli a6, a0, 32
3045; RV64I-NEXT:    sb a3, 24(a2)
3046; RV64I-NEXT:    sb s3, 25(a2)
3047; RV64I-NEXT:    sb s2, 26(a2)
3048; RV64I-NEXT:    sb s1, 27(a2)
3049; RV64I-NEXT:    srli a3, a0, 24
3050; RV64I-NEXT:    sb s7, 4(a2)
3051; RV64I-NEXT:    sb s6, 5(a2)
3052; RV64I-NEXT:    sb s5, 6(a2)
3053; RV64I-NEXT:    sb s4, 7(a2)
3054; RV64I-NEXT:    srli a7, a0, 16
3055; RV64I-NEXT:    sb a1, 0(a2)
3056; RV64I-NEXT:    sb s10, 1(a2)
3057; RV64I-NEXT:    sb s9, 2(a2)
3058; RV64I-NEXT:    sb s8, 3(a2)
3059; RV64I-NEXT:    srli a1, a0, 8
3060; RV64I-NEXT:    sb a6, 12(a2)
3061; RV64I-NEXT:    sb a4, 13(a2)
3062; RV64I-NEXT:    sb a5, 14(a2)
3063; RV64I-NEXT:    sb s11, 15(a2)
3064; RV64I-NEXT:    sb a0, 8(a2)
3065; RV64I-NEXT:    sb a1, 9(a2)
3066; RV64I-NEXT:    sb a7, 10(a2)
3067; RV64I-NEXT:    sb a3, 11(a2)
3068; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
3069; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
3070; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
3071; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
3072; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
3073; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
3074; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
3075; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
3076; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
3077; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
3078; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
3079; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
3080; RV64I-NEXT:    addi sp, sp, 160
3081; RV64I-NEXT:    ret
3082;
3083; RV32I-LABEL: lshr_32bytes_dwordOff:
3084; RV32I:       # %bb.0:
3085; RV32I-NEXT:    addi sp, sp, -128
3086; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
3087; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
3088; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
3089; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
3090; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
3091; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
3092; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
3093; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
3094; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
3095; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
3096; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
3097; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
3098; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
3099; RV32I-NEXT:    lbu a7, 0(a0)
3100; RV32I-NEXT:    lbu t0, 1(a0)
3101; RV32I-NEXT:    lbu t1, 2(a0)
3102; RV32I-NEXT:    lbu s1, 3(a0)
3103; RV32I-NEXT:    lbu s7, 4(a0)
3104; RV32I-NEXT:    lbu s8, 5(a0)
3105; RV32I-NEXT:    lbu s4, 6(a0)
3106; RV32I-NEXT:    lbu s6, 7(a0)
3107; RV32I-NEXT:    lbu s5, 8(a0)
3108; RV32I-NEXT:    lbu s10, 9(a0)
3109; RV32I-NEXT:    lbu s11, 10(a0)
3110; RV32I-NEXT:    lbu ra, 11(a0)
3111; RV32I-NEXT:    lbu t4, 12(a0)
3112; RV32I-NEXT:    lbu t6, 13(a0)
3113; RV32I-NEXT:    lbu a5, 14(a0)
3114; RV32I-NEXT:    lbu a6, 15(a0)
3115; RV32I-NEXT:    lbu a3, 16(a0)
3116; RV32I-NEXT:    lbu t2, 17(a0)
3117; RV32I-NEXT:    lbu t3, 18(a0)
3118; RV32I-NEXT:    lbu t5, 19(a0)
3119; RV32I-NEXT:    lbu a4, 20(a0)
3120; RV32I-NEXT:    lbu s0, 21(a0)
3121; RV32I-NEXT:    lbu s2, 22(a0)
3122; RV32I-NEXT:    lbu s3, 23(a0)
3123; RV32I-NEXT:    slli t0, t0, 8
3124; RV32I-NEXT:    slli t1, t1, 16
3125; RV32I-NEXT:    slli s1, s1, 24
3126; RV32I-NEXT:    slli s8, s8, 8
3127; RV32I-NEXT:    or a7, t0, a7
3128; RV32I-NEXT:    or t0, s1, t1
3129; RV32I-NEXT:    or t1, s8, s7
3130; RV32I-NEXT:    lbu s1, 24(a0)
3131; RV32I-NEXT:    lbu s7, 25(a0)
3132; RV32I-NEXT:    lbu s8, 26(a0)
3133; RV32I-NEXT:    lbu s9, 27(a0)
3134; RV32I-NEXT:    slli s4, s4, 16
3135; RV32I-NEXT:    slli s6, s6, 24
3136; RV32I-NEXT:    slli s10, s10, 8
3137; RV32I-NEXT:    slli s11, s11, 16
3138; RV32I-NEXT:    slli ra, ra, 24
3139; RV32I-NEXT:    or s4, s6, s4
3140; RV32I-NEXT:    or s5, s10, s5
3141; RV32I-NEXT:    or s6, ra, s11
3142; RV32I-NEXT:    lbu s10, 28(a0)
3143; RV32I-NEXT:    lbu s11, 29(a0)
3144; RV32I-NEXT:    lbu ra, 30(a0)
3145; RV32I-NEXT:    lbu a0, 31(a0)
3146; RV32I-NEXT:    lbu a1, 0(a1)
3147; RV32I-NEXT:    sw zero, 56(sp)
3148; RV32I-NEXT:    sw zero, 60(sp)
3149; RV32I-NEXT:    sw zero, 64(sp)
3150; RV32I-NEXT:    sw zero, 68(sp)
3151; RV32I-NEXT:    sw zero, 40(sp)
3152; RV32I-NEXT:    sw zero, 44(sp)
3153; RV32I-NEXT:    sw zero, 48(sp)
3154; RV32I-NEXT:    sw zero, 52(sp)
3155; RV32I-NEXT:    slli t6, t6, 8
3156; RV32I-NEXT:    or t4, t6, t4
3157; RV32I-NEXT:    addi t6, sp, 8
3158; RV32I-NEXT:    slli a5, a5, 16
3159; RV32I-NEXT:    slli a6, a6, 24
3160; RV32I-NEXT:    slli t2, t2, 8
3161; RV32I-NEXT:    slli t3, t3, 16
3162; RV32I-NEXT:    slli t5, t5, 24
3163; RV32I-NEXT:    slli s0, s0, 8
3164; RV32I-NEXT:    slli s2, s2, 16
3165; RV32I-NEXT:    slli s3, s3, 24
3166; RV32I-NEXT:    slli s7, s7, 8
3167; RV32I-NEXT:    slli s8, s8, 16
3168; RV32I-NEXT:    slli s9, s9, 24
3169; RV32I-NEXT:    slli s11, s11, 8
3170; RV32I-NEXT:    slli ra, ra, 16
3171; RV32I-NEXT:    slli a0, a0, 24
3172; RV32I-NEXT:    slli a1, a1, 3
3173; RV32I-NEXT:    or a5, a6, a5
3174; RV32I-NEXT:    or a3, t2, a3
3175; RV32I-NEXT:    or a6, t5, t3
3176; RV32I-NEXT:    or a4, s0, a4
3177; RV32I-NEXT:    or t2, s3, s2
3178; RV32I-NEXT:    or t3, s7, s1
3179; RV32I-NEXT:    or t5, s9, s8
3180; RV32I-NEXT:    or s0, s11, s10
3181; RV32I-NEXT:    or a0, a0, ra
3182; RV32I-NEXT:    andi a1, a1, 24
3183; RV32I-NEXT:    or a7, t0, a7
3184; RV32I-NEXT:    or t0, s4, t1
3185; RV32I-NEXT:    or t1, s6, s5
3186; RV32I-NEXT:    or a5, a5, t4
3187; RV32I-NEXT:    or a3, a6, a3
3188; RV32I-NEXT:    or a4, t2, a4
3189; RV32I-NEXT:    or a6, t5, t3
3190; RV32I-NEXT:    or a0, a0, s0
3191; RV32I-NEXT:    add t6, t6, a1
3192; RV32I-NEXT:    sw a3, 24(sp)
3193; RV32I-NEXT:    sw a4, 28(sp)
3194; RV32I-NEXT:    sw a6, 32(sp)
3195; RV32I-NEXT:    sw a0, 36(sp)
3196; RV32I-NEXT:    sw a7, 8(sp)
3197; RV32I-NEXT:    sw t0, 12(sp)
3198; RV32I-NEXT:    sw t1, 16(sp)
3199; RV32I-NEXT:    sw a5, 20(sp)
3200; RV32I-NEXT:    lw a6, 16(t6)
3201; RV32I-NEXT:    lw a5, 20(t6)
3202; RV32I-NEXT:    lw a7, 24(t6)
3203; RV32I-NEXT:    lw a1, 0(t6)
3204; RV32I-NEXT:    lw a0, 4(t6)
3205; RV32I-NEXT:    lw a4, 8(t6)
3206; RV32I-NEXT:    lw a3, 12(t6)
3207; RV32I-NEXT:    lw t0, 28(t6)
3208; RV32I-NEXT:    srli t1, a7, 24
3209; RV32I-NEXT:    srli t2, a7, 16
3210; RV32I-NEXT:    srli t3, a7, 8
3211; RV32I-NEXT:    srli t4, t0, 24
3212; RV32I-NEXT:    srli t5, t0, 16
3213; RV32I-NEXT:    srli t6, t0, 8
3214; RV32I-NEXT:    srli s0, a6, 24
3215; RV32I-NEXT:    srli s1, a6, 16
3216; RV32I-NEXT:    srli s2, a6, 8
3217; RV32I-NEXT:    srli s3, a5, 24
3218; RV32I-NEXT:    srli s4, a5, 16
3219; RV32I-NEXT:    srli s5, a5, 8
3220; RV32I-NEXT:    srli s6, a4, 24
3221; RV32I-NEXT:    srli s7, a4, 16
3222; RV32I-NEXT:    srli s8, a4, 8
3223; RV32I-NEXT:    srli s9, a3, 24
3224; RV32I-NEXT:    srli s10, a3, 16
3225; RV32I-NEXT:    srli s11, a3, 8
3226; RV32I-NEXT:    srli ra, a1, 24
3227; RV32I-NEXT:    sb a7, 24(a2)
3228; RV32I-NEXT:    sb t3, 25(a2)
3229; RV32I-NEXT:    sb t2, 26(a2)
3230; RV32I-NEXT:    sb t1, 27(a2)
3231; RV32I-NEXT:    srli a7, a1, 16
3232; RV32I-NEXT:    sb t0, 28(a2)
3233; RV32I-NEXT:    sb t6, 29(a2)
3234; RV32I-NEXT:    sb t5, 30(a2)
3235; RV32I-NEXT:    sb t4, 31(a2)
3236; RV32I-NEXT:    srli t0, a1, 8
3237; RV32I-NEXT:    sb a6, 16(a2)
3238; RV32I-NEXT:    sb s2, 17(a2)
3239; RV32I-NEXT:    sb s1, 18(a2)
3240; RV32I-NEXT:    sb s0, 19(a2)
3241; RV32I-NEXT:    srli a6, a0, 24
3242; RV32I-NEXT:    sb a5, 20(a2)
3243; RV32I-NEXT:    sb s5, 21(a2)
3244; RV32I-NEXT:    sb s4, 22(a2)
3245; RV32I-NEXT:    sb s3, 23(a2)
3246; RV32I-NEXT:    srli a5, a0, 16
3247; RV32I-NEXT:    sb a4, 8(a2)
3248; RV32I-NEXT:    sb s8, 9(a2)
3249; RV32I-NEXT:    sb s7, 10(a2)
3250; RV32I-NEXT:    sb s6, 11(a2)
3251; RV32I-NEXT:    srli a4, a0, 8
3252; RV32I-NEXT:    sb a3, 12(a2)
3253; RV32I-NEXT:    sb s11, 13(a2)
3254; RV32I-NEXT:    sb s10, 14(a2)
3255; RV32I-NEXT:    sb s9, 15(a2)
3256; RV32I-NEXT:    sb a1, 0(a2)
3257; RV32I-NEXT:    sb t0, 1(a2)
3258; RV32I-NEXT:    sb a7, 2(a2)
3259; RV32I-NEXT:    sb ra, 3(a2)
3260; RV32I-NEXT:    sb a0, 4(a2)
3261; RV32I-NEXT:    sb a4, 5(a2)
3262; RV32I-NEXT:    sb a5, 6(a2)
3263; RV32I-NEXT:    sb a6, 7(a2)
3264; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
3265; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
3266; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
3267; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
3268; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
3269; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
3270; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
3271; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
3272; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
3273; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
3274; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
3275; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
3276; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
3277; RV32I-NEXT:    addi sp, sp, 128
3278; RV32I-NEXT:    ret
3279  %src = load i256, ptr %src.ptr, align 1
3280  %dwordOff = load i256, ptr %dwordOff.ptr, align 1
3281  %bitOff = shl i256 %dwordOff, 6
3282  %res = lshr i256 %src, %bitOff
3283  store i256 %res, ptr %dst, align 1
3284  ret void
3285}
3286
3287define void @shl_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
3288; RV64I-LABEL: shl_32bytes:
3289; RV64I:       # %bb.0:
3290; RV64I-NEXT:    addi sp, sp, -160
3291; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
3292; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
3293; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
3294; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
3295; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
3296; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
3297; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
3298; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
3299; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
3300; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
3301; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
3302; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
3303; RV64I-NEXT:    lbu a3, 0(a0)
3304; RV64I-NEXT:    lbu a4, 1(a0)
3305; RV64I-NEXT:    lbu a5, 2(a0)
3306; RV64I-NEXT:    lbu a6, 3(a0)
3307; RV64I-NEXT:    lbu a7, 4(a0)
3308; RV64I-NEXT:    lbu t0, 5(a0)
3309; RV64I-NEXT:    lbu t1, 6(a0)
3310; RV64I-NEXT:    lbu t2, 7(a0)
3311; RV64I-NEXT:    lbu t3, 8(a0)
3312; RV64I-NEXT:    lbu t4, 9(a0)
3313; RV64I-NEXT:    lbu t5, 10(a0)
3314; RV64I-NEXT:    lbu t6, 11(a0)
3315; RV64I-NEXT:    lbu s0, 12(a0)
3316; RV64I-NEXT:    lbu s1, 13(a0)
3317; RV64I-NEXT:    lbu s2, 14(a0)
3318; RV64I-NEXT:    lbu s3, 15(a0)
3319; RV64I-NEXT:    lbu s4, 16(a0)
3320; RV64I-NEXT:    lbu s5, 17(a0)
3321; RV64I-NEXT:    lbu s6, 18(a0)
3322; RV64I-NEXT:    lbu s7, 19(a0)
3323; RV64I-NEXT:    slli a4, a4, 8
3324; RV64I-NEXT:    slli a5, a5, 16
3325; RV64I-NEXT:    slli a6, a6, 24
3326; RV64I-NEXT:    slli t0, t0, 8
3327; RV64I-NEXT:    slli t1, t1, 16
3328; RV64I-NEXT:    slli t2, t2, 24
3329; RV64I-NEXT:    or a3, a4, a3
3330; RV64I-NEXT:    or a4, a6, a5
3331; RV64I-NEXT:    or a5, t0, a7
3332; RV64I-NEXT:    or a6, t2, t1
3333; RV64I-NEXT:    lbu s8, 20(a0)
3334; RV64I-NEXT:    lbu s9, 21(a0)
3335; RV64I-NEXT:    lbu s10, 22(a0)
3336; RV64I-NEXT:    lbu s11, 23(a0)
3337; RV64I-NEXT:    slli t4, t4, 8
3338; RV64I-NEXT:    slli t5, t5, 16
3339; RV64I-NEXT:    slli t6, t6, 24
3340; RV64I-NEXT:    slli s1, s1, 8
3341; RV64I-NEXT:    slli s2, s2, 16
3342; RV64I-NEXT:    slli s3, s3, 24
3343; RV64I-NEXT:    or a7, t4, t3
3344; RV64I-NEXT:    or t0, t6, t5
3345; RV64I-NEXT:    or t1, s1, s0
3346; RV64I-NEXT:    or t2, s3, s2
3347; RV64I-NEXT:    lbu t6, 24(a0)
3348; RV64I-NEXT:    lbu s0, 25(a0)
3349; RV64I-NEXT:    lbu s1, 26(a0)
3350; RV64I-NEXT:    lbu s2, 27(a0)
3351; RV64I-NEXT:    slli s5, s5, 8
3352; RV64I-NEXT:    slli s6, s6, 16
3353; RV64I-NEXT:    slli s7, s7, 24
3354; RV64I-NEXT:    slli s9, s9, 8
3355; RV64I-NEXT:    or t3, s5, s4
3356; RV64I-NEXT:    or t4, s7, s6
3357; RV64I-NEXT:    or t5, s9, s8
3358; RV64I-NEXT:    lbu s3, 28(a0)
3359; RV64I-NEXT:    lbu s4, 29(a0)
3360; RV64I-NEXT:    lbu s5, 30(a0)
3361; RV64I-NEXT:    lbu s6, 31(a0)
3362; RV64I-NEXT:    slli s10, s10, 16
3363; RV64I-NEXT:    slli s11, s11, 24
3364; RV64I-NEXT:    slli s0, s0, 8
3365; RV64I-NEXT:    slli s1, s1, 16
3366; RV64I-NEXT:    slli s2, s2, 24
3367; RV64I-NEXT:    slli s4, s4, 8
3368; RV64I-NEXT:    or a0, s11, s10
3369; RV64I-NEXT:    or t6, s0, t6
3370; RV64I-NEXT:    or s0, s2, s1
3371; RV64I-NEXT:    or s1, s4, s3
3372; RV64I-NEXT:    lbu s2, 0(a1)
3373; RV64I-NEXT:    lbu s3, 1(a1)
3374; RV64I-NEXT:    lbu s4, 2(a1)
3375; RV64I-NEXT:    lbu s7, 3(a1)
3376; RV64I-NEXT:    slli s5, s5, 16
3377; RV64I-NEXT:    slli s6, s6, 24
3378; RV64I-NEXT:    slli s3, s3, 8
3379; RV64I-NEXT:    slli s4, s4, 16
3380; RV64I-NEXT:    slli s7, s7, 24
3381; RV64I-NEXT:    or s5, s6, s5
3382; RV64I-NEXT:    or s2, s3, s2
3383; RV64I-NEXT:    lbu s3, 4(a1)
3384; RV64I-NEXT:    lbu s6, 5(a1)
3385; RV64I-NEXT:    or s4, s7, s4
3386; RV64I-NEXT:    lbu s7, 6(a1)
3387; RV64I-NEXT:    lbu a1, 7(a1)
3388; RV64I-NEXT:    slli s6, s6, 8
3389; RV64I-NEXT:    or s3, s6, s3
3390; RV64I-NEXT:    sd zero, 0(sp)
3391; RV64I-NEXT:    sd zero, 8(sp)
3392; RV64I-NEXT:    sd zero, 16(sp)
3393; RV64I-NEXT:    sd zero, 24(sp)
3394; RV64I-NEXT:    slli s7, s7, 16
3395; RV64I-NEXT:    slli a1, a1, 24
3396; RV64I-NEXT:    or a1, a1, s7
3397; RV64I-NEXT:    addi s6, sp, 32
3398; RV64I-NEXT:    or a3, a4, a3
3399; RV64I-NEXT:    or a4, a6, a5
3400; RV64I-NEXT:    or a5, t0, a7
3401; RV64I-NEXT:    or a6, t2, t1
3402; RV64I-NEXT:    or a7, t4, t3
3403; RV64I-NEXT:    or a0, a0, t5
3404; RV64I-NEXT:    or t0, s0, t6
3405; RV64I-NEXT:    or t1, s5, s1
3406; RV64I-NEXT:    or t2, s4, s2
3407; RV64I-NEXT:    or a1, a1, s3
3408; RV64I-NEXT:    slli a4, a4, 32
3409; RV64I-NEXT:    slli a6, a6, 32
3410; RV64I-NEXT:    slli a0, a0, 32
3411; RV64I-NEXT:    slli t1, t1, 32
3412; RV64I-NEXT:    slli a1, a1, 32
3413; RV64I-NEXT:    or a3, a4, a3
3414; RV64I-NEXT:    or a4, a6, a5
3415; RV64I-NEXT:    or a0, a0, a7
3416; RV64I-NEXT:    or a5, t1, t0
3417; RV64I-NEXT:    or a1, a1, t2
3418; RV64I-NEXT:    sd a3, 32(sp)
3419; RV64I-NEXT:    sd a4, 40(sp)
3420; RV64I-NEXT:    sd a0, 48(sp)
3421; RV64I-NEXT:    sd a5, 56(sp)
3422; RV64I-NEXT:    slli a0, a1, 3
3423; RV64I-NEXT:    andi a1, a1, 24
3424; RV64I-NEXT:    sub a1, s6, a1
3425; RV64I-NEXT:    andi a3, a0, 56
3426; RV64I-NEXT:    ld a4, 0(a1)
3427; RV64I-NEXT:    ld a5, 8(a1)
3428; RV64I-NEXT:    ld a6, 16(a1)
3429; RV64I-NEXT:    ld a1, 24(a1)
3430; RV64I-NEXT:    xori a3, a3, 63
3431; RV64I-NEXT:    sll a7, a5, a0
3432; RV64I-NEXT:    srli t0, a4, 1
3433; RV64I-NEXT:    sll t1, a1, a0
3434; RV64I-NEXT:    srli a1, a6, 1
3435; RV64I-NEXT:    sll t2, a6, a0
3436; RV64I-NEXT:    srli a5, a5, 1
3437; RV64I-NEXT:    sll t3, a4, a0
3438; RV64I-NEXT:    srl a0, t0, a3
3439; RV64I-NEXT:    srl a4, a1, a3
3440; RV64I-NEXT:    srl a5, a5, a3
3441; RV64I-NEXT:    srli a3, t2, 56
3442; RV64I-NEXT:    srli a1, t1, 56
3443; RV64I-NEXT:    srli t0, t3, 56
3444; RV64I-NEXT:    srli t4, t3, 48
3445; RV64I-NEXT:    srli t5, t3, 40
3446; RV64I-NEXT:    srli t6, t3, 32
3447; RV64I-NEXT:    srli s0, t3, 24
3448; RV64I-NEXT:    srli s1, t3, 16
3449; RV64I-NEXT:    srli s2, t3, 8
3450; RV64I-NEXT:    srli a6, a7, 56
3451; RV64I-NEXT:    or a0, a7, a0
3452; RV64I-NEXT:    or a4, t1, a4
3453; RV64I-NEXT:    or a5, t2, a5
3454; RV64I-NEXT:    sb t6, 4(a2)
3455; RV64I-NEXT:    sb t5, 5(a2)
3456; RV64I-NEXT:    sb t4, 6(a2)
3457; RV64I-NEXT:    sb t0, 7(a2)
3458; RV64I-NEXT:    sb t3, 0(a2)
3459; RV64I-NEXT:    sb s2, 1(a2)
3460; RV64I-NEXT:    sb s1, 2(a2)
3461; RV64I-NEXT:    sb s0, 3(a2)
3462; RV64I-NEXT:    srli a7, a5, 48
3463; RV64I-NEXT:    srli t0, a5, 40
3464; RV64I-NEXT:    srli t1, a5, 32
3465; RV64I-NEXT:    srli t2, a5, 24
3466; RV64I-NEXT:    srli t3, a5, 16
3467; RV64I-NEXT:    srli t4, a5, 8
3468; RV64I-NEXT:    srli t5, a4, 48
3469; RV64I-NEXT:    srli t6, a4, 40
3470; RV64I-NEXT:    srli s0, a4, 32
3471; RV64I-NEXT:    srli s1, a4, 24
3472; RV64I-NEXT:    srli s2, a4, 16
3473; RV64I-NEXT:    srli s3, a4, 8
3474; RV64I-NEXT:    srli s4, a0, 48
3475; RV64I-NEXT:    srli s5, a0, 40
3476; RV64I-NEXT:    srli s6, a0, 32
3477; RV64I-NEXT:    sb t1, 20(a2)
3478; RV64I-NEXT:    sb t0, 21(a2)
3479; RV64I-NEXT:    sb a7, 22(a2)
3480; RV64I-NEXT:    sb a3, 23(a2)
3481; RV64I-NEXT:    srli a3, a0, 24
3482; RV64I-NEXT:    sb s0, 28(a2)
3483; RV64I-NEXT:    sb t6, 29(a2)
3484; RV64I-NEXT:    sb t5, 30(a2)
3485; RV64I-NEXT:    sb a1, 31(a2)
3486; RV64I-NEXT:    srli a1, a0, 16
3487; RV64I-NEXT:    sb s6, 12(a2)
3488; RV64I-NEXT:    sb s5, 13(a2)
3489; RV64I-NEXT:    sb s4, 14(a2)
3490; RV64I-NEXT:    sb a6, 15(a2)
3491; RV64I-NEXT:    srli a6, a0, 8
3492; RV64I-NEXT:    sb a5, 16(a2)
3493; RV64I-NEXT:    sb t4, 17(a2)
3494; RV64I-NEXT:    sb t3, 18(a2)
3495; RV64I-NEXT:    sb t2, 19(a2)
3496; RV64I-NEXT:    sb a4, 24(a2)
3497; RV64I-NEXT:    sb s3, 25(a2)
3498; RV64I-NEXT:    sb s2, 26(a2)
3499; RV64I-NEXT:    sb s1, 27(a2)
3500; RV64I-NEXT:    sb a0, 8(a2)
3501; RV64I-NEXT:    sb a6, 9(a2)
3502; RV64I-NEXT:    sb a1, 10(a2)
3503; RV64I-NEXT:    sb a3, 11(a2)
3504; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
3505; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
3506; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
3507; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
3508; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
3509; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
3510; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
3511; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
3512; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
3513; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
3514; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
3515; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
3516; RV64I-NEXT:    addi sp, sp, 160
3517; RV64I-NEXT:    ret
3518;
3519; RV32I-LABEL: shl_32bytes:
3520; RV32I:       # %bb.0:
3521; RV32I-NEXT:    addi sp, sp, -128
3522; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
3523; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
3524; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
3525; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
3526; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
3527; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
3528; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
3529; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
3530; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
3531; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
3532; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
3533; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
3534; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
3535; RV32I-NEXT:    lbu s1, 0(a0)
3536; RV32I-NEXT:    lbu a4, 1(a0)
3537; RV32I-NEXT:    lbu a5, 2(a0)
3538; RV32I-NEXT:    lbu a6, 3(a0)
3539; RV32I-NEXT:    lbu t1, 4(a0)
3540; RV32I-NEXT:    lbu t3, 5(a0)
3541; RV32I-NEXT:    lbu t4, 6(a0)
3542; RV32I-NEXT:    lbu s0, 7(a0)
3543; RV32I-NEXT:    lbu t2, 8(a0)
3544; RV32I-NEXT:    lbu s3, 9(a0)
3545; RV32I-NEXT:    lbu s6, 10(a0)
3546; RV32I-NEXT:    lbu s8, 11(a0)
3547; RV32I-NEXT:    lbu s9, 12(a0)
3548; RV32I-NEXT:    lbu s10, 13(a0)
3549; RV32I-NEXT:    lbu s4, 14(a0)
3550; RV32I-NEXT:    lbu s7, 15(a0)
3551; RV32I-NEXT:    lbu s5, 16(a0)
3552; RV32I-NEXT:    lbu s11, 17(a0)
3553; RV32I-NEXT:    lbu ra, 18(a0)
3554; RV32I-NEXT:    lbu a3, 19(a0)
3555; RV32I-NEXT:    lbu t5, 20(a0)
3556; RV32I-NEXT:    lbu t6, 21(a0)
3557; RV32I-NEXT:    lbu a7, 22(a0)
3558; RV32I-NEXT:    lbu t0, 23(a0)
3559; RV32I-NEXT:    slli a4, a4, 8
3560; RV32I-NEXT:    slli a5, a5, 16
3561; RV32I-NEXT:    slli a6, a6, 24
3562; RV32I-NEXT:    slli t3, t3, 8
3563; RV32I-NEXT:    slli t4, t4, 16
3564; RV32I-NEXT:    slli s0, s0, 24
3565; RV32I-NEXT:    or a4, a4, s1
3566; RV32I-NEXT:    sw a4, 4(sp) # 4-byte Folded Spill
3567; RV32I-NEXT:    or a4, a6, a5
3568; RV32I-NEXT:    or a5, t3, t1
3569; RV32I-NEXT:    or a6, s0, t4
3570; RV32I-NEXT:    lbu t1, 24(a0)
3571; RV32I-NEXT:    lbu s0, 25(a0)
3572; RV32I-NEXT:    lbu s1, 26(a0)
3573; RV32I-NEXT:    lbu s2, 27(a0)
3574; RV32I-NEXT:    slli s3, s3, 8
3575; RV32I-NEXT:    slli s6, s6, 16
3576; RV32I-NEXT:    slli s8, s8, 24
3577; RV32I-NEXT:    slli s10, s10, 8
3578; RV32I-NEXT:    or t2, s3, t2
3579; RV32I-NEXT:    or t3, s8, s6
3580; RV32I-NEXT:    or t4, s10, s9
3581; RV32I-NEXT:    lbu s3, 28(a0)
3582; RV32I-NEXT:    lbu s6, 29(a0)
3583; RV32I-NEXT:    lbu s8, 30(a0)
3584; RV32I-NEXT:    lbu s9, 31(a0)
3585; RV32I-NEXT:    slli s4, s4, 16
3586; RV32I-NEXT:    slli s7, s7, 24
3587; RV32I-NEXT:    slli s11, s11, 8
3588; RV32I-NEXT:    slli ra, ra, 16
3589; RV32I-NEXT:    slli a3, a3, 24
3590; RV32I-NEXT:    or a0, s7, s4
3591; RV32I-NEXT:    or s4, s11, s5
3592; RV32I-NEXT:    or s5, a3, ra
3593; RV32I-NEXT:    lbu a3, 0(a1)
3594; RV32I-NEXT:    lbu s7, 1(a1)
3595; RV32I-NEXT:    lbu s10, 2(a1)
3596; RV32I-NEXT:    lbu a1, 3(a1)
3597; RV32I-NEXT:    sw zero, 24(sp)
3598; RV32I-NEXT:    sw zero, 28(sp)
3599; RV32I-NEXT:    sw zero, 32(sp)
3600; RV32I-NEXT:    sw zero, 36(sp)
3601; RV32I-NEXT:    sw zero, 8(sp)
3602; RV32I-NEXT:    sw zero, 12(sp)
3603; RV32I-NEXT:    sw zero, 16(sp)
3604; RV32I-NEXT:    sw zero, 20(sp)
3605; RV32I-NEXT:    slli t6, t6, 8
3606; RV32I-NEXT:    or t5, t6, t5
3607; RV32I-NEXT:    addi t6, sp, 40
3608; RV32I-NEXT:    slli a7, a7, 16
3609; RV32I-NEXT:    slli t0, t0, 24
3610; RV32I-NEXT:    slli s0, s0, 8
3611; RV32I-NEXT:    slli s1, s1, 16
3612; RV32I-NEXT:    slli s2, s2, 24
3613; RV32I-NEXT:    slli s6, s6, 8
3614; RV32I-NEXT:    slli s8, s8, 16
3615; RV32I-NEXT:    slli s9, s9, 24
3616; RV32I-NEXT:    slli s7, s7, 8
3617; RV32I-NEXT:    slli s10, s10, 16
3618; RV32I-NEXT:    slli a1, a1, 24
3619; RV32I-NEXT:    or a7, t0, a7
3620; RV32I-NEXT:    or t0, s0, t1
3621; RV32I-NEXT:    or t1, s2, s1
3622; RV32I-NEXT:    or s0, s6, s3
3623; RV32I-NEXT:    or s1, s9, s8
3624; RV32I-NEXT:    or a3, s7, a3
3625; RV32I-NEXT:    or a1, a1, s10
3626; RV32I-NEXT:    lw s2, 4(sp) # 4-byte Folded Reload
3627; RV32I-NEXT:    or a4, a4, s2
3628; RV32I-NEXT:    or a5, a6, a5
3629; RV32I-NEXT:    or a6, t3, t2
3630; RV32I-NEXT:    or a0, a0, t4
3631; RV32I-NEXT:    or t2, s5, s4
3632; RV32I-NEXT:    or a7, a7, t5
3633; RV32I-NEXT:    or t0, t1, t0
3634; RV32I-NEXT:    or s0, s1, s0
3635; RV32I-NEXT:    or a1, a1, a3
3636; RV32I-NEXT:    sw t2, 56(sp)
3637; RV32I-NEXT:    sw a7, 60(sp)
3638; RV32I-NEXT:    sw t0, 64(sp)
3639; RV32I-NEXT:    sw s0, 68(sp)
3640; RV32I-NEXT:    sw a4, 40(sp)
3641; RV32I-NEXT:    sw a5, 44(sp)
3642; RV32I-NEXT:    sw a6, 48(sp)
3643; RV32I-NEXT:    sw a0, 52(sp)
3644; RV32I-NEXT:    slli a3, a1, 3
3645; RV32I-NEXT:    andi a1, a1, 28
3646; RV32I-NEXT:    sub a1, t6, a1
3647; RV32I-NEXT:    andi a0, a3, 24
3648; RV32I-NEXT:    xori a0, a0, 31
3649; RV32I-NEXT:    lw a4, 0(a1)
3650; RV32I-NEXT:    lw a5, 4(a1)
3651; RV32I-NEXT:    lw a6, 8(a1)
3652; RV32I-NEXT:    lw a7, 12(a1)
3653; RV32I-NEXT:    lw t0, 16(a1)
3654; RV32I-NEXT:    lw t1, 20(a1)
3655; RV32I-NEXT:    lw t2, 24(a1)
3656; RV32I-NEXT:    lw a1, 28(a1)
3657; RV32I-NEXT:    sll t3, a5, a3
3658; RV32I-NEXT:    srli t4, a4, 1
3659; RV32I-NEXT:    sll t5, a7, a3
3660; RV32I-NEXT:    srli t6, a6, 1
3661; RV32I-NEXT:    sll s0, a6, a3
3662; RV32I-NEXT:    srli a5, a5, 1
3663; RV32I-NEXT:    sll s1, t1, a3
3664; RV32I-NEXT:    srli a6, t0, 1
3665; RV32I-NEXT:    sll s2, t0, a3
3666; RV32I-NEXT:    srli a7, a7, 1
3667; RV32I-NEXT:    sll s3, a1, a3
3668; RV32I-NEXT:    srli a1, t2, 1
3669; RV32I-NEXT:    sll s4, t2, a3
3670; RV32I-NEXT:    srli t0, t1, 1
3671; RV32I-NEXT:    sll s5, a4, a3
3672; RV32I-NEXT:    srl t2, t4, a0
3673; RV32I-NEXT:    srl t4, t6, a0
3674; RV32I-NEXT:    srl t6, a5, a0
3675; RV32I-NEXT:    srl s6, a6, a0
3676; RV32I-NEXT:    srl s7, a7, a0
3677; RV32I-NEXT:    srl s8, a1, a0
3678; RV32I-NEXT:    srl s9, t0, a0
3679; RV32I-NEXT:    srli t1, s4, 24
3680; RV32I-NEXT:    srli a7, s3, 24
3681; RV32I-NEXT:    srli a5, s2, 24
3682; RV32I-NEXT:    srli a3, s1, 24
3683; RV32I-NEXT:    srli a1, s0, 24
3684; RV32I-NEXT:    srli a0, t5, 24
3685; RV32I-NEXT:    srli s10, s5, 24
3686; RV32I-NEXT:    srli s11, s5, 16
3687; RV32I-NEXT:    srli ra, s5, 8
3688; RV32I-NEXT:    srli a4, t3, 24
3689; RV32I-NEXT:    or a6, t3, t2
3690; RV32I-NEXT:    or t0, t5, t4
3691; RV32I-NEXT:    or t2, s0, t6
3692; RV32I-NEXT:    or t3, s1, s6
3693; RV32I-NEXT:    or t4, s2, s7
3694; RV32I-NEXT:    or t5, s3, s8
3695; RV32I-NEXT:    or t6, s4, s9
3696; RV32I-NEXT:    sb s5, 0(a2)
3697; RV32I-NEXT:    sb ra, 1(a2)
3698; RV32I-NEXT:    sb s11, 2(a2)
3699; RV32I-NEXT:    sb s10, 3(a2)
3700; RV32I-NEXT:    srli s0, t6, 16
3701; RV32I-NEXT:    srli s1, t6, 8
3702; RV32I-NEXT:    srli s2, t5, 16
3703; RV32I-NEXT:    srli s3, t5, 8
3704; RV32I-NEXT:    srli s4, t4, 16
3705; RV32I-NEXT:    srli s5, t4, 8
3706; RV32I-NEXT:    srli s6, t3, 16
3707; RV32I-NEXT:    srli s7, t3, 8
3708; RV32I-NEXT:    srli s8, t2, 16
3709; RV32I-NEXT:    srli s9, t2, 8
3710; RV32I-NEXT:    srli s10, t0, 16
3711; RV32I-NEXT:    srli s11, t0, 8
3712; RV32I-NEXT:    sb t6, 24(a2)
3713; RV32I-NEXT:    sb s1, 25(a2)
3714; RV32I-NEXT:    sb s0, 26(a2)
3715; RV32I-NEXT:    sb t1, 27(a2)
3716; RV32I-NEXT:    srli t1, a6, 16
3717; RV32I-NEXT:    sb t5, 28(a2)
3718; RV32I-NEXT:    sb s3, 29(a2)
3719; RV32I-NEXT:    sb s2, 30(a2)
3720; RV32I-NEXT:    sb a7, 31(a2)
3721; RV32I-NEXT:    srli a7, a6, 8
3722; RV32I-NEXT:    sb t4, 16(a2)
3723; RV32I-NEXT:    sb s5, 17(a2)
3724; RV32I-NEXT:    sb s4, 18(a2)
3725; RV32I-NEXT:    sb a5, 19(a2)
3726; RV32I-NEXT:    sb t3, 20(a2)
3727; RV32I-NEXT:    sb s7, 21(a2)
3728; RV32I-NEXT:    sb s6, 22(a2)
3729; RV32I-NEXT:    sb a3, 23(a2)
3730; RV32I-NEXT:    sb t2, 8(a2)
3731; RV32I-NEXT:    sb s9, 9(a2)
3732; RV32I-NEXT:    sb s8, 10(a2)
3733; RV32I-NEXT:    sb a1, 11(a2)
3734; RV32I-NEXT:    sb t0, 12(a2)
3735; RV32I-NEXT:    sb s11, 13(a2)
3736; RV32I-NEXT:    sb s10, 14(a2)
3737; RV32I-NEXT:    sb a0, 15(a2)
3738; RV32I-NEXT:    sb a6, 4(a2)
3739; RV32I-NEXT:    sb a7, 5(a2)
3740; RV32I-NEXT:    sb t1, 6(a2)
3741; RV32I-NEXT:    sb a4, 7(a2)
3742; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
3743; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
3744; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
3745; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
3746; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
3747; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
3748; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
3749; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
3750; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
3751; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
3752; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
3753; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
3754; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
3755; RV32I-NEXT:    addi sp, sp, 128
3756; RV32I-NEXT:    ret
3757  %src = load i256, ptr %src.ptr, align 1
3758  %byteOff = load i256, ptr %byteOff.ptr, align 1
3759  %bitOff = shl i256 %byteOff, 3
3760  %res = shl i256 %src, %bitOff
3761  store i256 %res, ptr %dst, align 1
3762  ret void
3763}
3764
3765define void @shl_32bytes_wordOff(ptr %src.ptr, ptr %wordOff.ptr, ptr %dst) nounwind {
3766; RV64I-LABEL: shl_32bytes_wordOff:
3767; RV64I:       # %bb.0:
3768; RV64I-NEXT:    addi sp, sp, -160
3769; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
3770; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
3771; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
3772; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
3773; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
3774; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
3775; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
3776; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
3777; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
3778; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
3779; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
3780; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
3781; RV64I-NEXT:    lbu a3, 0(a0)
3782; RV64I-NEXT:    lbu a4, 1(a0)
3783; RV64I-NEXT:    lbu a5, 2(a0)
3784; RV64I-NEXT:    lbu a6, 3(a0)
3785; RV64I-NEXT:    lbu a7, 4(a0)
3786; RV64I-NEXT:    lbu t0, 5(a0)
3787; RV64I-NEXT:    lbu t1, 6(a0)
3788; RV64I-NEXT:    lbu t2, 7(a0)
3789; RV64I-NEXT:    lbu t3, 8(a0)
3790; RV64I-NEXT:    lbu t4, 9(a0)
3791; RV64I-NEXT:    lbu t5, 10(a0)
3792; RV64I-NEXT:    lbu t6, 11(a0)
3793; RV64I-NEXT:    lbu s0, 12(a0)
3794; RV64I-NEXT:    lbu s1, 13(a0)
3795; RV64I-NEXT:    lbu s2, 14(a0)
3796; RV64I-NEXT:    lbu s3, 15(a0)
3797; RV64I-NEXT:    lbu s4, 16(a0)
3798; RV64I-NEXT:    lbu s5, 17(a0)
3799; RV64I-NEXT:    lbu s6, 18(a0)
3800; RV64I-NEXT:    lbu s7, 19(a0)
3801; RV64I-NEXT:    slli a4, a4, 8
3802; RV64I-NEXT:    slli a5, a5, 16
3803; RV64I-NEXT:    slli a6, a6, 24
3804; RV64I-NEXT:    slli t0, t0, 8
3805; RV64I-NEXT:    slli t1, t1, 16
3806; RV64I-NEXT:    slli t2, t2, 24
3807; RV64I-NEXT:    or a3, a4, a3
3808; RV64I-NEXT:    or a4, a6, a5
3809; RV64I-NEXT:    or a5, t0, a7
3810; RV64I-NEXT:    or a6, t2, t1
3811; RV64I-NEXT:    lbu s8, 20(a0)
3812; RV64I-NEXT:    lbu s9, 21(a0)
3813; RV64I-NEXT:    lbu s10, 22(a0)
3814; RV64I-NEXT:    lbu s11, 23(a0)
3815; RV64I-NEXT:    slli t4, t4, 8
3816; RV64I-NEXT:    slli t5, t5, 16
3817; RV64I-NEXT:    slli t6, t6, 24
3818; RV64I-NEXT:    slli s1, s1, 8
3819; RV64I-NEXT:    slli s2, s2, 16
3820; RV64I-NEXT:    slli s3, s3, 24
3821; RV64I-NEXT:    or a7, t4, t3
3822; RV64I-NEXT:    or t0, t6, t5
3823; RV64I-NEXT:    or t1, s1, s0
3824; RV64I-NEXT:    or t2, s3, s2
3825; RV64I-NEXT:    lbu t6, 24(a0)
3826; RV64I-NEXT:    lbu s0, 25(a0)
3827; RV64I-NEXT:    lbu s1, 26(a0)
3828; RV64I-NEXT:    lbu s2, 27(a0)
3829; RV64I-NEXT:    slli s5, s5, 8
3830; RV64I-NEXT:    slli s6, s6, 16
3831; RV64I-NEXT:    slli s7, s7, 24
3832; RV64I-NEXT:    slli s9, s9, 8
3833; RV64I-NEXT:    or t3, s5, s4
3834; RV64I-NEXT:    or t4, s7, s6
3835; RV64I-NEXT:    or t5, s9, s8
3836; RV64I-NEXT:    lbu s3, 28(a0)
3837; RV64I-NEXT:    lbu s4, 29(a0)
3838; RV64I-NEXT:    lbu s5, 30(a0)
3839; RV64I-NEXT:    lbu s6, 31(a0)
3840; RV64I-NEXT:    slli s10, s10, 16
3841; RV64I-NEXT:    slli s11, s11, 24
3842; RV64I-NEXT:    slli s0, s0, 8
3843; RV64I-NEXT:    slli s1, s1, 16
3844; RV64I-NEXT:    slli s2, s2, 24
3845; RV64I-NEXT:    slli s4, s4, 8
3846; RV64I-NEXT:    or a0, s11, s10
3847; RV64I-NEXT:    or t6, s0, t6
3848; RV64I-NEXT:    or s0, s2, s1
3849; RV64I-NEXT:    or s1, s4, s3
3850; RV64I-NEXT:    lbu s2, 0(a1)
3851; RV64I-NEXT:    lbu s3, 1(a1)
3852; RV64I-NEXT:    lbu s4, 2(a1)
3853; RV64I-NEXT:    lbu s7, 3(a1)
3854; RV64I-NEXT:    slli s5, s5, 16
3855; RV64I-NEXT:    slli s6, s6, 24
3856; RV64I-NEXT:    slli s3, s3, 8
3857; RV64I-NEXT:    slli s4, s4, 16
3858; RV64I-NEXT:    slli s7, s7, 24
3859; RV64I-NEXT:    or s5, s6, s5
3860; RV64I-NEXT:    or s2, s3, s2
3861; RV64I-NEXT:    lbu s3, 4(a1)
3862; RV64I-NEXT:    lbu s6, 5(a1)
3863; RV64I-NEXT:    or s4, s7, s4
3864; RV64I-NEXT:    lbu s7, 6(a1)
3865; RV64I-NEXT:    lbu a1, 7(a1)
3866; RV64I-NEXT:    slli s6, s6, 8
3867; RV64I-NEXT:    or s3, s6, s3
3868; RV64I-NEXT:    sd zero, 0(sp)
3869; RV64I-NEXT:    sd zero, 8(sp)
3870; RV64I-NEXT:    sd zero, 16(sp)
3871; RV64I-NEXT:    sd zero, 24(sp)
3872; RV64I-NEXT:    slli s7, s7, 16
3873; RV64I-NEXT:    slli a1, a1, 24
3874; RV64I-NEXT:    or a1, a1, s7
3875; RV64I-NEXT:    addi s6, sp, 32
3876; RV64I-NEXT:    or a3, a4, a3
3877; RV64I-NEXT:    or a4, a6, a5
3878; RV64I-NEXT:    or a5, t0, a7
3879; RV64I-NEXT:    or a6, t2, t1
3880; RV64I-NEXT:    or a7, t4, t3
3881; RV64I-NEXT:    or a0, a0, t5
3882; RV64I-NEXT:    or t0, s0, t6
3883; RV64I-NEXT:    or t1, s5, s1
3884; RV64I-NEXT:    or t2, s4, s2
3885; RV64I-NEXT:    or a1, a1, s3
3886; RV64I-NEXT:    slli a4, a4, 32
3887; RV64I-NEXT:    slli a6, a6, 32
3888; RV64I-NEXT:    slli a0, a0, 32
3889; RV64I-NEXT:    slli t1, t1, 32
3890; RV64I-NEXT:    slli a1, a1, 32
3891; RV64I-NEXT:    or a3, a4, a3
3892; RV64I-NEXT:    or a4, a6, a5
3893; RV64I-NEXT:    or a0, a0, a7
3894; RV64I-NEXT:    or a5, t1, t0
3895; RV64I-NEXT:    or a1, a1, t2
3896; RV64I-NEXT:    sd a3, 32(sp)
3897; RV64I-NEXT:    sd a4, 40(sp)
3898; RV64I-NEXT:    sd a0, 48(sp)
3899; RV64I-NEXT:    sd a5, 56(sp)
3900; RV64I-NEXT:    slli a3, a1, 5
3901; RV64I-NEXT:    slli a1, a1, 2
3902; RV64I-NEXT:    andi a1, a1, 24
3903; RV64I-NEXT:    andi a0, a3, 32
3904; RV64I-NEXT:    sub a1, s6, a1
3905; RV64I-NEXT:    ld a4, 0(a1)
3906; RV64I-NEXT:    ld a5, 8(a1)
3907; RV64I-NEXT:    ld a6, 16(a1)
3908; RV64I-NEXT:    ld a1, 24(a1)
3909; RV64I-NEXT:    xori a7, a0, 63
3910; RV64I-NEXT:    sll a0, a5, a3
3911; RV64I-NEXT:    srli t0, a4, 1
3912; RV64I-NEXT:    sll a1, a1, a3
3913; RV64I-NEXT:    srli t1, a6, 1
3914; RV64I-NEXT:    sll a6, a6, a3
3915; RV64I-NEXT:    srli a5, a5, 1
3916; RV64I-NEXT:    sll a3, a4, a3
3917; RV64I-NEXT:    srl a4, t0, a7
3918; RV64I-NEXT:    srl t0, t1, a7
3919; RV64I-NEXT:    srl a5, a5, a7
3920; RV64I-NEXT:    srli a7, a6, 56
3921; RV64I-NEXT:    srli t1, a6, 48
3922; RV64I-NEXT:    srli t2, a6, 40
3923; RV64I-NEXT:    srli t3, a6, 32
3924; RV64I-NEXT:    srli t4, a1, 56
3925; RV64I-NEXT:    srli t5, a1, 48
3926; RV64I-NEXT:    srli t6, a1, 40
3927; RV64I-NEXT:    srli s0, a1, 32
3928; RV64I-NEXT:    srli s1, a3, 56
3929; RV64I-NEXT:    srli s2, a3, 48
3930; RV64I-NEXT:    srli s3, a3, 40
3931; RV64I-NEXT:    srli s4, a3, 32
3932; RV64I-NEXT:    srli s5, a3, 24
3933; RV64I-NEXT:    srli s6, a3, 16
3934; RV64I-NEXT:    or a1, a1, t0
3935; RV64I-NEXT:    srli t0, a3, 8
3936; RV64I-NEXT:    or a5, a6, a5
3937; RV64I-NEXT:    srli a6, a0, 56
3938; RV64I-NEXT:    sb t3, 20(a2)
3939; RV64I-NEXT:    sb t2, 21(a2)
3940; RV64I-NEXT:    sb t1, 22(a2)
3941; RV64I-NEXT:    sb a7, 23(a2)
3942; RV64I-NEXT:    srli a7, a0, 48
3943; RV64I-NEXT:    sb s0, 28(a2)
3944; RV64I-NEXT:    sb t6, 29(a2)
3945; RV64I-NEXT:    sb t5, 30(a2)
3946; RV64I-NEXT:    sb t4, 31(a2)
3947; RV64I-NEXT:    srli t1, a0, 40
3948; RV64I-NEXT:    or a4, a0, a4
3949; RV64I-NEXT:    srli a0, a0, 32
3950; RV64I-NEXT:    sb s4, 4(a2)
3951; RV64I-NEXT:    sb s3, 5(a2)
3952; RV64I-NEXT:    sb s2, 6(a2)
3953; RV64I-NEXT:    sb s1, 7(a2)
3954; RV64I-NEXT:    sb a3, 0(a2)
3955; RV64I-NEXT:    sb t0, 1(a2)
3956; RV64I-NEXT:    sb s6, 2(a2)
3957; RV64I-NEXT:    sb s5, 3(a2)
3958; RV64I-NEXT:    sb a0, 12(a2)
3959; RV64I-NEXT:    sb t1, 13(a2)
3960; RV64I-NEXT:    sb a7, 14(a2)
3961; RV64I-NEXT:    sb a6, 15(a2)
3962; RV64I-NEXT:    srli a0, a5, 24
3963; RV64I-NEXT:    srli a3, a5, 16
3964; RV64I-NEXT:    srli a6, a5, 8
3965; RV64I-NEXT:    srli a7, a1, 24
3966; RV64I-NEXT:    srli t0, a1, 16
3967; RV64I-NEXT:    srli t1, a1, 8
3968; RV64I-NEXT:    srli t2, a4, 24
3969; RV64I-NEXT:    srli t3, a4, 16
3970; RV64I-NEXT:    srli t4, a4, 8
3971; RV64I-NEXT:    sb a5, 16(a2)
3972; RV64I-NEXT:    sb a6, 17(a2)
3973; RV64I-NEXT:    sb a3, 18(a2)
3974; RV64I-NEXT:    sb a0, 19(a2)
3975; RV64I-NEXT:    sb a1, 24(a2)
3976; RV64I-NEXT:    sb t1, 25(a2)
3977; RV64I-NEXT:    sb t0, 26(a2)
3978; RV64I-NEXT:    sb a7, 27(a2)
3979; RV64I-NEXT:    sb a4, 8(a2)
3980; RV64I-NEXT:    sb t4, 9(a2)
3981; RV64I-NEXT:    sb t3, 10(a2)
3982; RV64I-NEXT:    sb t2, 11(a2)
3983; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
3984; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
3985; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
3986; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
3987; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
3988; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
3989; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
3990; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
3991; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
3992; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
3993; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
3994; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
3995; RV64I-NEXT:    addi sp, sp, 160
3996; RV64I-NEXT:    ret
3997;
3998; RV32I-LABEL: shl_32bytes_wordOff:
3999; RV32I:       # %bb.0:
4000; RV32I-NEXT:    addi sp, sp, -128
4001; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
4002; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
4003; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
4004; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
4005; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
4006; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
4007; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
4008; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
4009; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
4010; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
4011; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
4012; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
4013; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
4014; RV32I-NEXT:    lbu a7, 0(a0)
4015; RV32I-NEXT:    lbu t0, 1(a0)
4016; RV32I-NEXT:    lbu t1, 2(a0)
4017; RV32I-NEXT:    lbu s1, 3(a0)
4018; RV32I-NEXT:    lbu s7, 4(a0)
4019; RV32I-NEXT:    lbu s8, 5(a0)
4020; RV32I-NEXT:    lbu s4, 6(a0)
4021; RV32I-NEXT:    lbu s6, 7(a0)
4022; RV32I-NEXT:    lbu s5, 8(a0)
4023; RV32I-NEXT:    lbu s10, 9(a0)
4024; RV32I-NEXT:    lbu s11, 10(a0)
4025; RV32I-NEXT:    lbu ra, 11(a0)
4026; RV32I-NEXT:    lbu t4, 12(a0)
4027; RV32I-NEXT:    lbu t6, 13(a0)
4028; RV32I-NEXT:    lbu a5, 14(a0)
4029; RV32I-NEXT:    lbu a6, 15(a0)
4030; RV32I-NEXT:    lbu a3, 16(a0)
4031; RV32I-NEXT:    lbu t2, 17(a0)
4032; RV32I-NEXT:    lbu t3, 18(a0)
4033; RV32I-NEXT:    lbu t5, 19(a0)
4034; RV32I-NEXT:    lbu a4, 20(a0)
4035; RV32I-NEXT:    lbu s0, 21(a0)
4036; RV32I-NEXT:    lbu s2, 22(a0)
4037; RV32I-NEXT:    lbu s3, 23(a0)
4038; RV32I-NEXT:    slli t0, t0, 8
4039; RV32I-NEXT:    slli t1, t1, 16
4040; RV32I-NEXT:    slli s1, s1, 24
4041; RV32I-NEXT:    slli s8, s8, 8
4042; RV32I-NEXT:    or a7, t0, a7
4043; RV32I-NEXT:    or t0, s1, t1
4044; RV32I-NEXT:    or t1, s8, s7
4045; RV32I-NEXT:    lbu s1, 24(a0)
4046; RV32I-NEXT:    lbu s7, 25(a0)
4047; RV32I-NEXT:    lbu s8, 26(a0)
4048; RV32I-NEXT:    lbu s9, 27(a0)
4049; RV32I-NEXT:    slli s4, s4, 16
4050; RV32I-NEXT:    slli s6, s6, 24
4051; RV32I-NEXT:    slli s10, s10, 8
4052; RV32I-NEXT:    slli s11, s11, 16
4053; RV32I-NEXT:    slli ra, ra, 24
4054; RV32I-NEXT:    or s4, s6, s4
4055; RV32I-NEXT:    or s5, s10, s5
4056; RV32I-NEXT:    or s6, ra, s11
4057; RV32I-NEXT:    lbu s10, 28(a0)
4058; RV32I-NEXT:    lbu s11, 29(a0)
4059; RV32I-NEXT:    lbu ra, 30(a0)
4060; RV32I-NEXT:    lbu a0, 31(a0)
4061; RV32I-NEXT:    lbu a1, 0(a1)
4062; RV32I-NEXT:    sw zero, 24(sp)
4063; RV32I-NEXT:    sw zero, 28(sp)
4064; RV32I-NEXT:    sw zero, 32(sp)
4065; RV32I-NEXT:    sw zero, 36(sp)
4066; RV32I-NEXT:    sw zero, 8(sp)
4067; RV32I-NEXT:    sw zero, 12(sp)
4068; RV32I-NEXT:    sw zero, 16(sp)
4069; RV32I-NEXT:    sw zero, 20(sp)
4070; RV32I-NEXT:    slli t6, t6, 8
4071; RV32I-NEXT:    or t4, t6, t4
4072; RV32I-NEXT:    addi t6, sp, 40
4073; RV32I-NEXT:    slli a5, a5, 16
4074; RV32I-NEXT:    slli a6, a6, 24
4075; RV32I-NEXT:    slli t2, t2, 8
4076; RV32I-NEXT:    slli t3, t3, 16
4077; RV32I-NEXT:    slli t5, t5, 24
4078; RV32I-NEXT:    slli s0, s0, 8
4079; RV32I-NEXT:    slli s2, s2, 16
4080; RV32I-NEXT:    slli s3, s3, 24
4081; RV32I-NEXT:    slli s7, s7, 8
4082; RV32I-NEXT:    slli s8, s8, 16
4083; RV32I-NEXT:    slli s9, s9, 24
4084; RV32I-NEXT:    slli s11, s11, 8
4085; RV32I-NEXT:    slli ra, ra, 16
4086; RV32I-NEXT:    slli a0, a0, 24
4087; RV32I-NEXT:    slli a1, a1, 2
4088; RV32I-NEXT:    or a5, a6, a5
4089; RV32I-NEXT:    or a3, t2, a3
4090; RV32I-NEXT:    or a6, t5, t3
4091; RV32I-NEXT:    or a4, s0, a4
4092; RV32I-NEXT:    or t2, s3, s2
4093; RV32I-NEXT:    or t3, s7, s1
4094; RV32I-NEXT:    or t5, s9, s8
4095; RV32I-NEXT:    or s0, s11, s10
4096; RV32I-NEXT:    or a0, a0, ra
4097; RV32I-NEXT:    andi a1, a1, 28
4098; RV32I-NEXT:    or a7, t0, a7
4099; RV32I-NEXT:    or t0, s4, t1
4100; RV32I-NEXT:    or t1, s6, s5
4101; RV32I-NEXT:    or a5, a5, t4
4102; RV32I-NEXT:    or a3, a6, a3
4103; RV32I-NEXT:    or a4, t2, a4
4104; RV32I-NEXT:    or a6, t5, t3
4105; RV32I-NEXT:    or a0, a0, s0
4106; RV32I-NEXT:    sub t2, t6, a1
4107; RV32I-NEXT:    sw a3, 56(sp)
4108; RV32I-NEXT:    sw a4, 60(sp)
4109; RV32I-NEXT:    sw a6, 64(sp)
4110; RV32I-NEXT:    sw a0, 68(sp)
4111; RV32I-NEXT:    sw a7, 40(sp)
4112; RV32I-NEXT:    sw t0, 44(sp)
4113; RV32I-NEXT:    sw t1, 48(sp)
4114; RV32I-NEXT:    sw a5, 52(sp)
4115; RV32I-NEXT:    lw a6, 16(t2)
4116; RV32I-NEXT:    lw a5, 20(t2)
4117; RV32I-NEXT:    lw a7, 24(t2)
4118; RV32I-NEXT:    lw a1, 0(t2)
4119; RV32I-NEXT:    lw a0, 4(t2)
4120; RV32I-NEXT:    lw a4, 8(t2)
4121; RV32I-NEXT:    lw a3, 12(t2)
4122; RV32I-NEXT:    lw t0, 28(t2)
4123; RV32I-NEXT:    srli t1, a7, 24
4124; RV32I-NEXT:    srli t2, a7, 16
4125; RV32I-NEXT:    srli t3, a7, 8
4126; RV32I-NEXT:    srli t4, t0, 24
4127; RV32I-NEXT:    srli t5, t0, 16
4128; RV32I-NEXT:    srli t6, t0, 8
4129; RV32I-NEXT:    srli s0, a6, 24
4130; RV32I-NEXT:    srli s1, a6, 16
4131; RV32I-NEXT:    srli s2, a6, 8
4132; RV32I-NEXT:    srli s3, a5, 24
4133; RV32I-NEXT:    srli s4, a5, 16
4134; RV32I-NEXT:    srli s5, a5, 8
4135; RV32I-NEXT:    srli s6, a4, 24
4136; RV32I-NEXT:    srli s7, a4, 16
4137; RV32I-NEXT:    srli s8, a4, 8
4138; RV32I-NEXT:    srli s9, a3, 24
4139; RV32I-NEXT:    srli s10, a3, 16
4140; RV32I-NEXT:    srli s11, a3, 8
4141; RV32I-NEXT:    srli ra, a1, 24
4142; RV32I-NEXT:    sb a7, 24(a2)
4143; RV32I-NEXT:    sb t3, 25(a2)
4144; RV32I-NEXT:    sb t2, 26(a2)
4145; RV32I-NEXT:    sb t1, 27(a2)
4146; RV32I-NEXT:    srli a7, a1, 16
4147; RV32I-NEXT:    sb t0, 28(a2)
4148; RV32I-NEXT:    sb t6, 29(a2)
4149; RV32I-NEXT:    sb t5, 30(a2)
4150; RV32I-NEXT:    sb t4, 31(a2)
4151; RV32I-NEXT:    srli t0, a1, 8
4152; RV32I-NEXT:    sb a6, 16(a2)
4153; RV32I-NEXT:    sb s2, 17(a2)
4154; RV32I-NEXT:    sb s1, 18(a2)
4155; RV32I-NEXT:    sb s0, 19(a2)
4156; RV32I-NEXT:    srli a6, a0, 24
4157; RV32I-NEXT:    sb a5, 20(a2)
4158; RV32I-NEXT:    sb s5, 21(a2)
4159; RV32I-NEXT:    sb s4, 22(a2)
4160; RV32I-NEXT:    sb s3, 23(a2)
4161; RV32I-NEXT:    srli a5, a0, 16
4162; RV32I-NEXT:    sb a4, 8(a2)
4163; RV32I-NEXT:    sb s8, 9(a2)
4164; RV32I-NEXT:    sb s7, 10(a2)
4165; RV32I-NEXT:    sb s6, 11(a2)
4166; RV32I-NEXT:    srli a4, a0, 8
4167; RV32I-NEXT:    sb a3, 12(a2)
4168; RV32I-NEXT:    sb s11, 13(a2)
4169; RV32I-NEXT:    sb s10, 14(a2)
4170; RV32I-NEXT:    sb s9, 15(a2)
4171; RV32I-NEXT:    sb a1, 0(a2)
4172; RV32I-NEXT:    sb t0, 1(a2)
4173; RV32I-NEXT:    sb a7, 2(a2)
4174; RV32I-NEXT:    sb ra, 3(a2)
4175; RV32I-NEXT:    sb a0, 4(a2)
4176; RV32I-NEXT:    sb a4, 5(a2)
4177; RV32I-NEXT:    sb a5, 6(a2)
4178; RV32I-NEXT:    sb a6, 7(a2)
4179; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
4180; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
4181; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
4182; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
4183; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
4184; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
4185; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
4186; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
4187; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
4188; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
4189; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
4190; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
4191; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
4192; RV32I-NEXT:    addi sp, sp, 128
4193; RV32I-NEXT:    ret
4194  %src = load i256, ptr %src.ptr, align 1
4195  %wordOff = load i256, ptr %wordOff.ptr, align 1
4196  %bitOff = shl i256 %wordOff, 5
4197  %res = shl i256 %src, %bitOff
4198  store i256 %res, ptr %dst, align 1
4199  ret void
4200}
4201
4202define void @shl_32bytes_dwordOff(ptr %src.ptr, ptr %dwordOff.ptr, ptr %dst) nounwind {
4203; RV64I-LABEL: shl_32bytes_dwordOff:
4204; RV64I:       # %bb.0:
4205; RV64I-NEXT:    addi sp, sp, -160
4206; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
4207; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
4208; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
4209; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
4210; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
4211; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
4212; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
4213; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
4214; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
4215; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
4216; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
4217; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
4218; RV64I-NEXT:    lbu a5, 0(a0)
4219; RV64I-NEXT:    lbu a7, 1(a0)
4220; RV64I-NEXT:    lbu t2, 2(a0)
4221; RV64I-NEXT:    lbu s3, 3(a0)
4222; RV64I-NEXT:    lbu t0, 4(a0)
4223; RV64I-NEXT:    lbu s8, 5(a0)
4224; RV64I-NEXT:    lbu s9, 6(a0)
4225; RV64I-NEXT:    lbu s10, 7(a0)
4226; RV64I-NEXT:    lbu s2, 8(a0)
4227; RV64I-NEXT:    lbu s4, 9(a0)
4228; RV64I-NEXT:    lbu s5, 10(a0)
4229; RV64I-NEXT:    lbu s6, 11(a0)
4230; RV64I-NEXT:    lbu s7, 12(a0)
4231; RV64I-NEXT:    lbu s11, 13(a0)
4232; RV64I-NEXT:    lbu t1, 14(a0)
4233; RV64I-NEXT:    lbu t3, 15(a0)
4234; RV64I-NEXT:    lbu a3, 16(a0)
4235; RV64I-NEXT:    lbu a6, 17(a0)
4236; RV64I-NEXT:    lbu t4, 18(a0)
4237; RV64I-NEXT:    lbu t5, 19(a0)
4238; RV64I-NEXT:    lbu a4, 20(a0)
4239; RV64I-NEXT:    lbu t6, 21(a0)
4240; RV64I-NEXT:    lbu s0, 22(a0)
4241; RV64I-NEXT:    lbu s1, 23(a0)
4242; RV64I-NEXT:    slli a7, a7, 8
4243; RV64I-NEXT:    slli t2, t2, 16
4244; RV64I-NEXT:    slli s3, s3, 24
4245; RV64I-NEXT:    slli s8, s8, 8
4246; RV64I-NEXT:    slli s9, s9, 16
4247; RV64I-NEXT:    slli s10, s10, 24
4248; RV64I-NEXT:    or a5, a7, a5
4249; RV64I-NEXT:    or a7, s3, t2
4250; RV64I-NEXT:    or t0, s8, t0
4251; RV64I-NEXT:    or t2, s10, s9
4252; RV64I-NEXT:    lbu s3, 24(a0)
4253; RV64I-NEXT:    lbu s8, 25(a0)
4254; RV64I-NEXT:    lbu s9, 26(a0)
4255; RV64I-NEXT:    lbu s10, 27(a0)
4256; RV64I-NEXT:    slli s4, s4, 8
4257; RV64I-NEXT:    slli s5, s5, 16
4258; RV64I-NEXT:    slli s6, s6, 24
4259; RV64I-NEXT:    slli s11, s11, 8
4260; RV64I-NEXT:    or s2, s4, s2
4261; RV64I-NEXT:    or s4, s6, s5
4262; RV64I-NEXT:    or s5, s11, s7
4263; RV64I-NEXT:    lbu s6, 28(a0)
4264; RV64I-NEXT:    lbu s7, 29(a0)
4265; RV64I-NEXT:    lbu s11, 30(a0)
4266; RV64I-NEXT:    lbu a0, 31(a0)
4267; RV64I-NEXT:    lbu a1, 0(a1)
4268; RV64I-NEXT:    sd zero, 0(sp)
4269; RV64I-NEXT:    sd zero, 8(sp)
4270; RV64I-NEXT:    sd zero, 16(sp)
4271; RV64I-NEXT:    sd zero, 24(sp)
4272; RV64I-NEXT:    slli t1, t1, 16
4273; RV64I-NEXT:    slli t3, t3, 24
4274; RV64I-NEXT:    or t1, t3, t1
4275; RV64I-NEXT:    addi t3, sp, 32
4276; RV64I-NEXT:    slli a6, a6, 8
4277; RV64I-NEXT:    slli t4, t4, 16
4278; RV64I-NEXT:    slli t5, t5, 24
4279; RV64I-NEXT:    slli t6, t6, 8
4280; RV64I-NEXT:    slli s0, s0, 16
4281; RV64I-NEXT:    slli s1, s1, 24
4282; RV64I-NEXT:    slli s8, s8, 8
4283; RV64I-NEXT:    slli s9, s9, 16
4284; RV64I-NEXT:    slli s10, s10, 24
4285; RV64I-NEXT:    slli s7, s7, 8
4286; RV64I-NEXT:    slli s11, s11, 16
4287; RV64I-NEXT:    slli a0, a0, 24
4288; RV64I-NEXT:    slli a1, a1, 3
4289; RV64I-NEXT:    or a3, a6, a3
4290; RV64I-NEXT:    or a6, t5, t4
4291; RV64I-NEXT:    or a4, t6, a4
4292; RV64I-NEXT:    or s0, s1, s0
4293; RV64I-NEXT:    or t4, s8, s3
4294; RV64I-NEXT:    or t5, s10, s9
4295; RV64I-NEXT:    or t6, s7, s6
4296; RV64I-NEXT:    or a0, a0, s11
4297; RV64I-NEXT:    andi a1, a1, 24
4298; RV64I-NEXT:    or a5, a7, a5
4299; RV64I-NEXT:    or a7, t2, t0
4300; RV64I-NEXT:    or t0, s4, s2
4301; RV64I-NEXT:    or t1, t1, s5
4302; RV64I-NEXT:    or a3, a6, a3
4303; RV64I-NEXT:    or a4, s0, a4
4304; RV64I-NEXT:    or a6, t5, t4
4305; RV64I-NEXT:    or a0, a0, t6
4306; RV64I-NEXT:    sub t2, t3, a1
4307; RV64I-NEXT:    slli a7, a7, 32
4308; RV64I-NEXT:    slli t1, t1, 32
4309; RV64I-NEXT:    slli a4, a4, 32
4310; RV64I-NEXT:    slli a0, a0, 32
4311; RV64I-NEXT:    or a1, a7, a5
4312; RV64I-NEXT:    or a5, t1, t0
4313; RV64I-NEXT:    or a3, a4, a3
4314; RV64I-NEXT:    or a0, a0, a6
4315; RV64I-NEXT:    sd a1, 32(sp)
4316; RV64I-NEXT:    sd a5, 40(sp)
4317; RV64I-NEXT:    sd a3, 48(sp)
4318; RV64I-NEXT:    sd a0, 56(sp)
4319; RV64I-NEXT:    ld a4, 16(t2)
4320; RV64I-NEXT:    ld a0, 8(t2)
4321; RV64I-NEXT:    ld a1, 0(t2)
4322; RV64I-NEXT:    ld a3, 24(t2)
4323; RV64I-NEXT:    srli a5, a4, 56
4324; RV64I-NEXT:    srli a6, a4, 48
4325; RV64I-NEXT:    srli a7, a4, 40
4326; RV64I-NEXT:    srli t0, a4, 32
4327; RV64I-NEXT:    srli t1, a4, 24
4328; RV64I-NEXT:    srli t2, a4, 16
4329; RV64I-NEXT:    srli t3, a4, 8
4330; RV64I-NEXT:    srli t4, a3, 56
4331; RV64I-NEXT:    srli t5, a3, 48
4332; RV64I-NEXT:    srli t6, a3, 40
4333; RV64I-NEXT:    srli s0, a3, 32
4334; RV64I-NEXT:    srli s1, a3, 24
4335; RV64I-NEXT:    srli s2, a3, 16
4336; RV64I-NEXT:    srli s3, a3, 8
4337; RV64I-NEXT:    srli s4, a1, 56
4338; RV64I-NEXT:    srli s5, a1, 48
4339; RV64I-NEXT:    srli s6, a1, 40
4340; RV64I-NEXT:    srli s7, a1, 32
4341; RV64I-NEXT:    srli s8, a1, 24
4342; RV64I-NEXT:    srli s9, a1, 16
4343; RV64I-NEXT:    srli s10, a1, 8
4344; RV64I-NEXT:    srli s11, a0, 56
4345; RV64I-NEXT:    sb t0, 20(a2)
4346; RV64I-NEXT:    sb a7, 21(a2)
4347; RV64I-NEXT:    sb a6, 22(a2)
4348; RV64I-NEXT:    sb a5, 23(a2)
4349; RV64I-NEXT:    srli a5, a0, 48
4350; RV64I-NEXT:    sb a4, 16(a2)
4351; RV64I-NEXT:    sb t3, 17(a2)
4352; RV64I-NEXT:    sb t2, 18(a2)
4353; RV64I-NEXT:    sb t1, 19(a2)
4354; RV64I-NEXT:    srli a4, a0, 40
4355; RV64I-NEXT:    sb s0, 28(a2)
4356; RV64I-NEXT:    sb t6, 29(a2)
4357; RV64I-NEXT:    sb t5, 30(a2)
4358; RV64I-NEXT:    sb t4, 31(a2)
4359; RV64I-NEXT:    srli a6, a0, 32
4360; RV64I-NEXT:    sb a3, 24(a2)
4361; RV64I-NEXT:    sb s3, 25(a2)
4362; RV64I-NEXT:    sb s2, 26(a2)
4363; RV64I-NEXT:    sb s1, 27(a2)
4364; RV64I-NEXT:    srli a3, a0, 24
4365; RV64I-NEXT:    sb s7, 4(a2)
4366; RV64I-NEXT:    sb s6, 5(a2)
4367; RV64I-NEXT:    sb s5, 6(a2)
4368; RV64I-NEXT:    sb s4, 7(a2)
4369; RV64I-NEXT:    srli a7, a0, 16
4370; RV64I-NEXT:    sb a1, 0(a2)
4371; RV64I-NEXT:    sb s10, 1(a2)
4372; RV64I-NEXT:    sb s9, 2(a2)
4373; RV64I-NEXT:    sb s8, 3(a2)
4374; RV64I-NEXT:    srli a1, a0, 8
4375; RV64I-NEXT:    sb a6, 12(a2)
4376; RV64I-NEXT:    sb a4, 13(a2)
4377; RV64I-NEXT:    sb a5, 14(a2)
4378; RV64I-NEXT:    sb s11, 15(a2)
4379; RV64I-NEXT:    sb a0, 8(a2)
4380; RV64I-NEXT:    sb a1, 9(a2)
4381; RV64I-NEXT:    sb a7, 10(a2)
4382; RV64I-NEXT:    sb a3, 11(a2)
4383; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
4384; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
4385; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
4386; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
4387; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
4388; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
4389; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
4390; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
4391; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
4392; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
4393; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
4394; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
4395; RV64I-NEXT:    addi sp, sp, 160
4396; RV64I-NEXT:    ret
4397;
4398; RV32I-LABEL: shl_32bytes_dwordOff:
4399; RV32I:       # %bb.0:
4400; RV32I-NEXT:    addi sp, sp, -128
4401; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
4402; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
4403; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
4404; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
4405; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
4406; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
4407; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
4408; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
4409; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
4410; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
4411; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
4412; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
4413; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
4414; RV32I-NEXT:    lbu a7, 0(a0)
4415; RV32I-NEXT:    lbu t0, 1(a0)
4416; RV32I-NEXT:    lbu t1, 2(a0)
4417; RV32I-NEXT:    lbu s1, 3(a0)
4418; RV32I-NEXT:    lbu s7, 4(a0)
4419; RV32I-NEXT:    lbu s8, 5(a0)
4420; RV32I-NEXT:    lbu s4, 6(a0)
4421; RV32I-NEXT:    lbu s6, 7(a0)
4422; RV32I-NEXT:    lbu s5, 8(a0)
4423; RV32I-NEXT:    lbu s10, 9(a0)
4424; RV32I-NEXT:    lbu s11, 10(a0)
4425; RV32I-NEXT:    lbu ra, 11(a0)
4426; RV32I-NEXT:    lbu t4, 12(a0)
4427; RV32I-NEXT:    lbu t6, 13(a0)
4428; RV32I-NEXT:    lbu a5, 14(a0)
4429; RV32I-NEXT:    lbu a6, 15(a0)
4430; RV32I-NEXT:    lbu a3, 16(a0)
4431; RV32I-NEXT:    lbu t2, 17(a0)
4432; RV32I-NEXT:    lbu t3, 18(a0)
4433; RV32I-NEXT:    lbu t5, 19(a0)
4434; RV32I-NEXT:    lbu a4, 20(a0)
4435; RV32I-NEXT:    lbu s0, 21(a0)
4436; RV32I-NEXT:    lbu s2, 22(a0)
4437; RV32I-NEXT:    lbu s3, 23(a0)
4438; RV32I-NEXT:    slli t0, t0, 8
4439; RV32I-NEXT:    slli t1, t1, 16
4440; RV32I-NEXT:    slli s1, s1, 24
4441; RV32I-NEXT:    slli s8, s8, 8
4442; RV32I-NEXT:    or a7, t0, a7
4443; RV32I-NEXT:    or t0, s1, t1
4444; RV32I-NEXT:    or t1, s8, s7
4445; RV32I-NEXT:    lbu s1, 24(a0)
4446; RV32I-NEXT:    lbu s7, 25(a0)
4447; RV32I-NEXT:    lbu s8, 26(a0)
4448; RV32I-NEXT:    lbu s9, 27(a0)
4449; RV32I-NEXT:    slli s4, s4, 16
4450; RV32I-NEXT:    slli s6, s6, 24
4451; RV32I-NEXT:    slli s10, s10, 8
4452; RV32I-NEXT:    slli s11, s11, 16
4453; RV32I-NEXT:    slli ra, ra, 24
4454; RV32I-NEXT:    or s4, s6, s4
4455; RV32I-NEXT:    or s5, s10, s5
4456; RV32I-NEXT:    or s6, ra, s11
4457; RV32I-NEXT:    lbu s10, 28(a0)
4458; RV32I-NEXT:    lbu s11, 29(a0)
4459; RV32I-NEXT:    lbu ra, 30(a0)
4460; RV32I-NEXT:    lbu a0, 31(a0)
4461; RV32I-NEXT:    lbu a1, 0(a1)
4462; RV32I-NEXT:    sw zero, 24(sp)
4463; RV32I-NEXT:    sw zero, 28(sp)
4464; RV32I-NEXT:    sw zero, 32(sp)
4465; RV32I-NEXT:    sw zero, 36(sp)
4466; RV32I-NEXT:    sw zero, 8(sp)
4467; RV32I-NEXT:    sw zero, 12(sp)
4468; RV32I-NEXT:    sw zero, 16(sp)
4469; RV32I-NEXT:    sw zero, 20(sp)
4470; RV32I-NEXT:    slli t6, t6, 8
4471; RV32I-NEXT:    or t4, t6, t4
4472; RV32I-NEXT:    addi t6, sp, 40
4473; RV32I-NEXT:    slli a5, a5, 16
4474; RV32I-NEXT:    slli a6, a6, 24
4475; RV32I-NEXT:    slli t2, t2, 8
4476; RV32I-NEXT:    slli t3, t3, 16
4477; RV32I-NEXT:    slli t5, t5, 24
4478; RV32I-NEXT:    slli s0, s0, 8
4479; RV32I-NEXT:    slli s2, s2, 16
4480; RV32I-NEXT:    slli s3, s3, 24
4481; RV32I-NEXT:    slli s7, s7, 8
4482; RV32I-NEXT:    slli s8, s8, 16
4483; RV32I-NEXT:    slli s9, s9, 24
4484; RV32I-NEXT:    slli s11, s11, 8
4485; RV32I-NEXT:    slli ra, ra, 16
4486; RV32I-NEXT:    slli a0, a0, 24
4487; RV32I-NEXT:    slli a1, a1, 3
4488; RV32I-NEXT:    or a5, a6, a5
4489; RV32I-NEXT:    or a3, t2, a3
4490; RV32I-NEXT:    or a6, t5, t3
4491; RV32I-NEXT:    or a4, s0, a4
4492; RV32I-NEXT:    or t2, s3, s2
4493; RV32I-NEXT:    or t3, s7, s1
4494; RV32I-NEXT:    or t5, s9, s8
4495; RV32I-NEXT:    or s0, s11, s10
4496; RV32I-NEXT:    or a0, a0, ra
4497; RV32I-NEXT:    andi a1, a1, 24
4498; RV32I-NEXT:    or a7, t0, a7
4499; RV32I-NEXT:    or t0, s4, t1
4500; RV32I-NEXT:    or t1, s6, s5
4501; RV32I-NEXT:    or a5, a5, t4
4502; RV32I-NEXT:    or a3, a6, a3
4503; RV32I-NEXT:    or a4, t2, a4
4504; RV32I-NEXT:    or a6, t5, t3
4505; RV32I-NEXT:    or a0, a0, s0
4506; RV32I-NEXT:    sub t2, t6, a1
4507; RV32I-NEXT:    sw a3, 56(sp)
4508; RV32I-NEXT:    sw a4, 60(sp)
4509; RV32I-NEXT:    sw a6, 64(sp)
4510; RV32I-NEXT:    sw a0, 68(sp)
4511; RV32I-NEXT:    sw a7, 40(sp)
4512; RV32I-NEXT:    sw t0, 44(sp)
4513; RV32I-NEXT:    sw t1, 48(sp)
4514; RV32I-NEXT:    sw a5, 52(sp)
4515; RV32I-NEXT:    lw a6, 16(t2)
4516; RV32I-NEXT:    lw a5, 20(t2)
4517; RV32I-NEXT:    lw a7, 24(t2)
4518; RV32I-NEXT:    lw a1, 0(t2)
4519; RV32I-NEXT:    lw a0, 4(t2)
4520; RV32I-NEXT:    lw a4, 8(t2)
4521; RV32I-NEXT:    lw a3, 12(t2)
4522; RV32I-NEXT:    lw t0, 28(t2)
4523; RV32I-NEXT:    srli t1, a7, 24
4524; RV32I-NEXT:    srli t2, a7, 16
4525; RV32I-NEXT:    srli t3, a7, 8
4526; RV32I-NEXT:    srli t4, t0, 24
4527; RV32I-NEXT:    srli t5, t0, 16
4528; RV32I-NEXT:    srli t6, t0, 8
4529; RV32I-NEXT:    srli s0, a6, 24
4530; RV32I-NEXT:    srli s1, a6, 16
4531; RV32I-NEXT:    srli s2, a6, 8
4532; RV32I-NEXT:    srli s3, a5, 24
4533; RV32I-NEXT:    srli s4, a5, 16
4534; RV32I-NEXT:    srli s5, a5, 8
4535; RV32I-NEXT:    srli s6, a4, 24
4536; RV32I-NEXT:    srli s7, a4, 16
4537; RV32I-NEXT:    srli s8, a4, 8
4538; RV32I-NEXT:    srli s9, a3, 24
4539; RV32I-NEXT:    srli s10, a3, 16
4540; RV32I-NEXT:    srli s11, a3, 8
4541; RV32I-NEXT:    srli ra, a1, 24
4542; RV32I-NEXT:    sb a7, 24(a2)
4543; RV32I-NEXT:    sb t3, 25(a2)
4544; RV32I-NEXT:    sb t2, 26(a2)
4545; RV32I-NEXT:    sb t1, 27(a2)
4546; RV32I-NEXT:    srli a7, a1, 16
4547; RV32I-NEXT:    sb t0, 28(a2)
4548; RV32I-NEXT:    sb t6, 29(a2)
4549; RV32I-NEXT:    sb t5, 30(a2)
4550; RV32I-NEXT:    sb t4, 31(a2)
4551; RV32I-NEXT:    srli t0, a1, 8
4552; RV32I-NEXT:    sb a6, 16(a2)
4553; RV32I-NEXT:    sb s2, 17(a2)
4554; RV32I-NEXT:    sb s1, 18(a2)
4555; RV32I-NEXT:    sb s0, 19(a2)
4556; RV32I-NEXT:    srli a6, a0, 24
4557; RV32I-NEXT:    sb a5, 20(a2)
4558; RV32I-NEXT:    sb s5, 21(a2)
4559; RV32I-NEXT:    sb s4, 22(a2)
4560; RV32I-NEXT:    sb s3, 23(a2)
4561; RV32I-NEXT:    srli a5, a0, 16
4562; RV32I-NEXT:    sb a4, 8(a2)
4563; RV32I-NEXT:    sb s8, 9(a2)
4564; RV32I-NEXT:    sb s7, 10(a2)
4565; RV32I-NEXT:    sb s6, 11(a2)
4566; RV32I-NEXT:    srli a4, a0, 8
4567; RV32I-NEXT:    sb a3, 12(a2)
4568; RV32I-NEXT:    sb s11, 13(a2)
4569; RV32I-NEXT:    sb s10, 14(a2)
4570; RV32I-NEXT:    sb s9, 15(a2)
4571; RV32I-NEXT:    sb a1, 0(a2)
4572; RV32I-NEXT:    sb t0, 1(a2)
4573; RV32I-NEXT:    sb a7, 2(a2)
4574; RV32I-NEXT:    sb ra, 3(a2)
4575; RV32I-NEXT:    sb a0, 4(a2)
4576; RV32I-NEXT:    sb a4, 5(a2)
4577; RV32I-NEXT:    sb a5, 6(a2)
4578; RV32I-NEXT:    sb a6, 7(a2)
4579; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
4580; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
4581; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
4582; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
4583; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
4584; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
4585; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
4586; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
4587; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
4588; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
4589; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
4590; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
4591; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
4592; RV32I-NEXT:    addi sp, sp, 128
4593; RV32I-NEXT:    ret
4594  %src = load i256, ptr %src.ptr, align 1
4595  %dwordOff = load i256, ptr %dwordOff.ptr, align 1
4596  %bitOff = shl i256 %dwordOff, 6
4597  %res = shl i256 %src, %bitOff
4598  store i256 %res, ptr %dst, align 1
4599  ret void
4600}
4601
4602define void @ashr_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
4603; RV64I-LABEL: ashr_32bytes:
4604; RV64I:       # %bb.0:
4605; RV64I-NEXT:    addi sp, sp, -160
4606; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
4607; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
4608; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
4609; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
4610; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
4611; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
4612; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
4613; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
4614; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
4615; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
4616; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
4617; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
4618; RV64I-NEXT:    lbu a3, 0(a0)
4619; RV64I-NEXT:    lbu a4, 1(a0)
4620; RV64I-NEXT:    lbu a5, 2(a0)
4621; RV64I-NEXT:    lbu a6, 3(a0)
4622; RV64I-NEXT:    lbu a7, 4(a0)
4623; RV64I-NEXT:    lbu t0, 5(a0)
4624; RV64I-NEXT:    lbu t1, 6(a0)
4625; RV64I-NEXT:    lbu t2, 7(a0)
4626; RV64I-NEXT:    lbu t3, 8(a0)
4627; RV64I-NEXT:    lbu t4, 9(a0)
4628; RV64I-NEXT:    lbu t5, 10(a0)
4629; RV64I-NEXT:    lbu t6, 11(a0)
4630; RV64I-NEXT:    lbu s0, 12(a0)
4631; RV64I-NEXT:    lbu s1, 13(a0)
4632; RV64I-NEXT:    lbu s2, 14(a0)
4633; RV64I-NEXT:    lbu s3, 15(a0)
4634; RV64I-NEXT:    lbu s4, 16(a0)
4635; RV64I-NEXT:    lbu s5, 17(a0)
4636; RV64I-NEXT:    lbu s6, 18(a0)
4637; RV64I-NEXT:    lbu s7, 19(a0)
4638; RV64I-NEXT:    slli a4, a4, 8
4639; RV64I-NEXT:    slli a5, a5, 16
4640; RV64I-NEXT:    slli a6, a6, 24
4641; RV64I-NEXT:    slli t0, t0, 8
4642; RV64I-NEXT:    slli t1, t1, 16
4643; RV64I-NEXT:    slli t2, t2, 24
4644; RV64I-NEXT:    or a3, a4, a3
4645; RV64I-NEXT:    or a4, a6, a5
4646; RV64I-NEXT:    or a5, t0, a7
4647; RV64I-NEXT:    or a6, t2, t1
4648; RV64I-NEXT:    lbu s8, 20(a0)
4649; RV64I-NEXT:    lbu s9, 21(a0)
4650; RV64I-NEXT:    lbu s10, 22(a0)
4651; RV64I-NEXT:    lbu s11, 23(a0)
4652; RV64I-NEXT:    slli t4, t4, 8
4653; RV64I-NEXT:    slli t5, t5, 16
4654; RV64I-NEXT:    slli t6, t6, 24
4655; RV64I-NEXT:    slli s1, s1, 8
4656; RV64I-NEXT:    slli s2, s2, 16
4657; RV64I-NEXT:    slli s3, s3, 24
4658; RV64I-NEXT:    or a7, t4, t3
4659; RV64I-NEXT:    or t0, t6, t5
4660; RV64I-NEXT:    or t1, s1, s0
4661; RV64I-NEXT:    or t2, s3, s2
4662; RV64I-NEXT:    lbu t6, 24(a0)
4663; RV64I-NEXT:    lbu s0, 25(a0)
4664; RV64I-NEXT:    lbu s1, 26(a0)
4665; RV64I-NEXT:    lbu s2, 27(a0)
4666; RV64I-NEXT:    slli s5, s5, 8
4667; RV64I-NEXT:    slli s6, s6, 16
4668; RV64I-NEXT:    slli s7, s7, 24
4669; RV64I-NEXT:    slli s9, s9, 8
4670; RV64I-NEXT:    or t3, s5, s4
4671; RV64I-NEXT:    or t4, s7, s6
4672; RV64I-NEXT:    or t5, s9, s8
4673; RV64I-NEXT:    lbu s3, 28(a0)
4674; RV64I-NEXT:    lbu s4, 29(a0)
4675; RV64I-NEXT:    lbu s5, 30(a0)
4676; RV64I-NEXT:    lbu s6, 31(a0)
4677; RV64I-NEXT:    slli s10, s10, 16
4678; RV64I-NEXT:    slli s11, s11, 24
4679; RV64I-NEXT:    slli s0, s0, 8
4680; RV64I-NEXT:    slli s1, s1, 16
4681; RV64I-NEXT:    slli s2, s2, 24
4682; RV64I-NEXT:    slli s4, s4, 8
4683; RV64I-NEXT:    or a0, s11, s10
4684; RV64I-NEXT:    or t6, s0, t6
4685; RV64I-NEXT:    or s0, s2, s1
4686; RV64I-NEXT:    or s1, s4, s3
4687; RV64I-NEXT:    lbu s2, 0(a1)
4688; RV64I-NEXT:    lbu s3, 1(a1)
4689; RV64I-NEXT:    lbu s4, 2(a1)
4690; RV64I-NEXT:    lbu s7, 3(a1)
4691; RV64I-NEXT:    slli s5, s5, 16
4692; RV64I-NEXT:    slli s6, s6, 24
4693; RV64I-NEXT:    slli s3, s3, 8
4694; RV64I-NEXT:    slli s4, s4, 16
4695; RV64I-NEXT:    slli s7, s7, 24
4696; RV64I-NEXT:    or s5, s6, s5
4697; RV64I-NEXT:    or s2, s3, s2
4698; RV64I-NEXT:    lbu s3, 4(a1)
4699; RV64I-NEXT:    lbu s6, 5(a1)
4700; RV64I-NEXT:    or s4, s7, s4
4701; RV64I-NEXT:    lbu s7, 6(a1)
4702; RV64I-NEXT:    lbu a1, 7(a1)
4703; RV64I-NEXT:    slli s6, s6, 8
4704; RV64I-NEXT:    or s3, s6, s3
4705; RV64I-NEXT:    slli s7, s7, 16
4706; RV64I-NEXT:    slli a1, a1, 24
4707; RV64I-NEXT:    or a1, a1, s7
4708; RV64I-NEXT:    mv s6, sp
4709; RV64I-NEXT:    or a3, a4, a3
4710; RV64I-NEXT:    or a4, a6, a5
4711; RV64I-NEXT:    or a5, t0, a7
4712; RV64I-NEXT:    or a6, t2, t1
4713; RV64I-NEXT:    or a7, t4, t3
4714; RV64I-NEXT:    or a0, a0, t5
4715; RV64I-NEXT:    or t0, s0, t6
4716; RV64I-NEXT:    or t1, s5, s1
4717; RV64I-NEXT:    or t2, s4, s2
4718; RV64I-NEXT:    or a1, a1, s3
4719; RV64I-NEXT:    slli a4, a4, 32
4720; RV64I-NEXT:    slli a6, a6, 32
4721; RV64I-NEXT:    slli a0, a0, 32
4722; RV64I-NEXT:    slli t3, t1, 32
4723; RV64I-NEXT:    slli a1, a1, 32
4724; RV64I-NEXT:    sraiw t1, t1, 31
4725; RV64I-NEXT:    or a3, a4, a3
4726; RV64I-NEXT:    or a4, a6, a5
4727; RV64I-NEXT:    or a0, a0, a7
4728; RV64I-NEXT:    or a5, t3, t0
4729; RV64I-NEXT:    or a1, a1, t2
4730; RV64I-NEXT:    sd t1, 32(sp)
4731; RV64I-NEXT:    sd t1, 40(sp)
4732; RV64I-NEXT:    sd t1, 48(sp)
4733; RV64I-NEXT:    sd t1, 56(sp)
4734; RV64I-NEXT:    sd a3, 0(sp)
4735; RV64I-NEXT:    sd a4, 8(sp)
4736; RV64I-NEXT:    sd a0, 16(sp)
4737; RV64I-NEXT:    sd a5, 24(sp)
4738; RV64I-NEXT:    slli a4, a1, 3
4739; RV64I-NEXT:    andi a1, a1, 24
4740; RV64I-NEXT:    add a1, s6, a1
4741; RV64I-NEXT:    andi a0, a4, 56
4742; RV64I-NEXT:    ld a3, 0(a1)
4743; RV64I-NEXT:    ld a5, 8(a1)
4744; RV64I-NEXT:    ld a6, 16(a1)
4745; RV64I-NEXT:    xori a7, a0, 63
4746; RV64I-NEXT:    ld t0, 24(a1)
4747; RV64I-NEXT:    srl a0, a5, a4
4748; RV64I-NEXT:    slli t1, a6, 1
4749; RV64I-NEXT:    srl a1, a3, a4
4750; RV64I-NEXT:    slli a5, a5, 1
4751; RV64I-NEXT:    srl a3, a6, a4
4752; RV64I-NEXT:    slli a6, t0, 1
4753; RV64I-NEXT:    sra t0, t0, a4
4754; RV64I-NEXT:    sll a4, t1, a7
4755; RV64I-NEXT:    sll a5, a5, a7
4756; RV64I-NEXT:    sll a6, a6, a7
4757; RV64I-NEXT:    srli a7, t0, 56
4758; RV64I-NEXT:    srli t1, t0, 48
4759; RV64I-NEXT:    srli t2, t0, 40
4760; RV64I-NEXT:    srli t3, t0, 32
4761; RV64I-NEXT:    srli t4, t0, 24
4762; RV64I-NEXT:    srli t5, t0, 16
4763; RV64I-NEXT:    srli t6, t0, 8
4764; RV64I-NEXT:    or a4, a0, a4
4765; RV64I-NEXT:    or a5, a1, a5
4766; RV64I-NEXT:    or a6, a3, a6
4767; RV64I-NEXT:    sb t3, 28(a2)
4768; RV64I-NEXT:    sb t2, 29(a2)
4769; RV64I-NEXT:    sb t1, 30(a2)
4770; RV64I-NEXT:    sb a7, 31(a2)
4771; RV64I-NEXT:    sb t0, 24(a2)
4772; RV64I-NEXT:    sb t6, 25(a2)
4773; RV64I-NEXT:    sb t5, 26(a2)
4774; RV64I-NEXT:    sb t4, 27(a2)
4775; RV64I-NEXT:    srli a7, a6, 56
4776; RV64I-NEXT:    srli t0, a6, 48
4777; RV64I-NEXT:    srli t1, a6, 40
4778; RV64I-NEXT:    srli t2, a6, 32
4779; RV64I-NEXT:    srli t3, a6, 24
4780; RV64I-NEXT:    srli t4, a6, 16
4781; RV64I-NEXT:    srli a6, a6, 8
4782; RV64I-NEXT:    srli t5, a5, 56
4783; RV64I-NEXT:    srli t6, a5, 48
4784; RV64I-NEXT:    srli s0, a5, 40
4785; RV64I-NEXT:    srli s1, a5, 32
4786; RV64I-NEXT:    srli s2, a5, 24
4787; RV64I-NEXT:    srli s3, a5, 16
4788; RV64I-NEXT:    srli a5, a5, 8
4789; RV64I-NEXT:    srli s4, a4, 56
4790; RV64I-NEXT:    srli s5, a4, 48
4791; RV64I-NEXT:    srli s6, a4, 40
4792; RV64I-NEXT:    sb t2, 20(a2)
4793; RV64I-NEXT:    sb t1, 21(a2)
4794; RV64I-NEXT:    sb t0, 22(a2)
4795; RV64I-NEXT:    sb a7, 23(a2)
4796; RV64I-NEXT:    srli a7, a4, 32
4797; RV64I-NEXT:    sb a3, 16(a2)
4798; RV64I-NEXT:    sb a6, 17(a2)
4799; RV64I-NEXT:    sb t4, 18(a2)
4800; RV64I-NEXT:    sb t3, 19(a2)
4801; RV64I-NEXT:    srli a3, a4, 24
4802; RV64I-NEXT:    sb s1, 4(a2)
4803; RV64I-NEXT:    sb s0, 5(a2)
4804; RV64I-NEXT:    sb t6, 6(a2)
4805; RV64I-NEXT:    sb t5, 7(a2)
4806; RV64I-NEXT:    srli a6, a4, 16
4807; RV64I-NEXT:    srli a4, a4, 8
4808; RV64I-NEXT:    sb a1, 0(a2)
4809; RV64I-NEXT:    sb a5, 1(a2)
4810; RV64I-NEXT:    sb s3, 2(a2)
4811; RV64I-NEXT:    sb s2, 3(a2)
4812; RV64I-NEXT:    sb a7, 12(a2)
4813; RV64I-NEXT:    sb s6, 13(a2)
4814; RV64I-NEXT:    sb s5, 14(a2)
4815; RV64I-NEXT:    sb s4, 15(a2)
4816; RV64I-NEXT:    sb a0, 8(a2)
4817; RV64I-NEXT:    sb a4, 9(a2)
4818; RV64I-NEXT:    sb a6, 10(a2)
4819; RV64I-NEXT:    sb a3, 11(a2)
4820; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
4821; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
4822; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
4823; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
4824; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
4825; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
4826; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
4827; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
4828; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
4829; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
4830; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
4831; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
4832; RV64I-NEXT:    addi sp, sp, 160
4833; RV64I-NEXT:    ret
4834;
4835; RV32I-LABEL: ashr_32bytes:
4836; RV32I:       # %bb.0:
4837; RV32I-NEXT:    addi sp, sp, -128
4838; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
4839; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
4840; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
4841; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
4842; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
4843; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
4844; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
4845; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
4846; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
4847; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
4848; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
4849; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
4850; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
4851; RV32I-NEXT:    lbu t6, 0(a0)
4852; RV32I-NEXT:    lbu a4, 1(a0)
4853; RV32I-NEXT:    lbu a5, 2(a0)
4854; RV32I-NEXT:    lbu a6, 3(a0)
4855; RV32I-NEXT:    lbu t1, 4(a0)
4856; RV32I-NEXT:    lbu t3, 5(a0)
4857; RV32I-NEXT:    lbu t4, 6(a0)
4858; RV32I-NEXT:    lbu t5, 7(a0)
4859; RV32I-NEXT:    lbu t2, 8(a0)
4860; RV32I-NEXT:    lbu s1, 9(a0)
4861; RV32I-NEXT:    lbu s7, 10(a0)
4862; RV32I-NEXT:    lbu s8, 11(a0)
4863; RV32I-NEXT:    lbu s9, 12(a0)
4864; RV32I-NEXT:    lbu s10, 13(a0)
4865; RV32I-NEXT:    lbu s4, 14(a0)
4866; RV32I-NEXT:    lbu s6, 15(a0)
4867; RV32I-NEXT:    lbu s5, 16(a0)
4868; RV32I-NEXT:    lbu s11, 17(a0)
4869; RV32I-NEXT:    lbu ra, 18(a0)
4870; RV32I-NEXT:    lbu a3, 19(a0)
4871; RV32I-NEXT:    lbu s2, 20(a0)
4872; RV32I-NEXT:    lbu s3, 21(a0)
4873; RV32I-NEXT:    lbu a7, 22(a0)
4874; RV32I-NEXT:    lbu t0, 23(a0)
4875; RV32I-NEXT:    slli a4, a4, 8
4876; RV32I-NEXT:    slli a5, a5, 16
4877; RV32I-NEXT:    slli a6, a6, 24
4878; RV32I-NEXT:    slli t3, t3, 8
4879; RV32I-NEXT:    slli t4, t4, 16
4880; RV32I-NEXT:    slli t5, t5, 24
4881; RV32I-NEXT:    or a4, a4, t6
4882; RV32I-NEXT:    sw a4, 4(sp) # 4-byte Folded Spill
4883; RV32I-NEXT:    or a4, a6, a5
4884; RV32I-NEXT:    or a5, t3, t1
4885; RV32I-NEXT:    or a6, t5, t4
4886; RV32I-NEXT:    lbu t1, 24(a0)
4887; RV32I-NEXT:    lbu t5, 25(a0)
4888; RV32I-NEXT:    lbu t6, 26(a0)
4889; RV32I-NEXT:    lbu s0, 27(a0)
4890; RV32I-NEXT:    slli s1, s1, 8
4891; RV32I-NEXT:    slli s7, s7, 16
4892; RV32I-NEXT:    slli s8, s8, 24
4893; RV32I-NEXT:    slli s10, s10, 8
4894; RV32I-NEXT:    or t2, s1, t2
4895; RV32I-NEXT:    or t3, s8, s7
4896; RV32I-NEXT:    or t4, s10, s9
4897; RV32I-NEXT:    lbu s1, 28(a0)
4898; RV32I-NEXT:    lbu s7, 29(a0)
4899; RV32I-NEXT:    lbu s8, 30(a0)
4900; RV32I-NEXT:    lbu s9, 31(a0)
4901; RV32I-NEXT:    slli s4, s4, 16
4902; RV32I-NEXT:    slli s6, s6, 24
4903; RV32I-NEXT:    slli s11, s11, 8
4904; RV32I-NEXT:    slli ra, ra, 16
4905; RV32I-NEXT:    slli a3, a3, 24
4906; RV32I-NEXT:    or a0, s6, s4
4907; RV32I-NEXT:    or s4, s11, s5
4908; RV32I-NEXT:    or s5, a3, ra
4909; RV32I-NEXT:    lbu a3, 0(a1)
4910; RV32I-NEXT:    lbu s6, 1(a1)
4911; RV32I-NEXT:    lbu s10, 2(a1)
4912; RV32I-NEXT:    lbu a1, 3(a1)
4913; RV32I-NEXT:    slli s3, s3, 8
4914; RV32I-NEXT:    or s2, s3, s2
4915; RV32I-NEXT:    addi s3, sp, 8
4916; RV32I-NEXT:    slli a7, a7, 16
4917; RV32I-NEXT:    slli t0, t0, 24
4918; RV32I-NEXT:    slli t5, t5, 8
4919; RV32I-NEXT:    slli t6, t6, 16
4920; RV32I-NEXT:    slli s0, s0, 24
4921; RV32I-NEXT:    slli s7, s7, 8
4922; RV32I-NEXT:    slli s8, s8, 16
4923; RV32I-NEXT:    slli s9, s9, 24
4924; RV32I-NEXT:    slli s6, s6, 8
4925; RV32I-NEXT:    slli s10, s10, 16
4926; RV32I-NEXT:    slli a1, a1, 24
4927; RV32I-NEXT:    or a7, t0, a7
4928; RV32I-NEXT:    or t0, t5, t1
4929; RV32I-NEXT:    or t1, s0, t6
4930; RV32I-NEXT:    or t5, s7, s1
4931; RV32I-NEXT:    or t6, s9, s8
4932; RV32I-NEXT:    or a3, s6, a3
4933; RV32I-NEXT:    or a1, a1, s10
4934; RV32I-NEXT:    srai s0, s9, 31
4935; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
4936; RV32I-NEXT:    or a4, a4, s1
4937; RV32I-NEXT:    or a5, a6, a5
4938; RV32I-NEXT:    or a6, t3, t2
4939; RV32I-NEXT:    or a0, a0, t4
4940; RV32I-NEXT:    or t2, s5, s4
4941; RV32I-NEXT:    or a7, a7, s2
4942; RV32I-NEXT:    or t0, t1, t0
4943; RV32I-NEXT:    or t1, t6, t5
4944; RV32I-NEXT:    or a1, a1, a3
4945; RV32I-NEXT:    sw s0, 56(sp)
4946; RV32I-NEXT:    sw s0, 60(sp)
4947; RV32I-NEXT:    sw s0, 64(sp)
4948; RV32I-NEXT:    sw s0, 68(sp)
4949; RV32I-NEXT:    sw s0, 40(sp)
4950; RV32I-NEXT:    sw s0, 44(sp)
4951; RV32I-NEXT:    sw s0, 48(sp)
4952; RV32I-NEXT:    sw s0, 52(sp)
4953; RV32I-NEXT:    sw t2, 24(sp)
4954; RV32I-NEXT:    sw a7, 28(sp)
4955; RV32I-NEXT:    sw t0, 32(sp)
4956; RV32I-NEXT:    sw t1, 36(sp)
4957; RV32I-NEXT:    sw a4, 8(sp)
4958; RV32I-NEXT:    sw a5, 12(sp)
4959; RV32I-NEXT:    sw a6, 16(sp)
4960; RV32I-NEXT:    sw a0, 20(sp)
4961; RV32I-NEXT:    slli t1, a1, 3
4962; RV32I-NEXT:    andi a1, a1, 28
4963; RV32I-NEXT:    add a1, s3, a1
4964; RV32I-NEXT:    andi a0, t1, 24
4965; RV32I-NEXT:    xori t0, a0, 31
4966; RV32I-NEXT:    lw a3, 0(a1)
4967; RV32I-NEXT:    lw a4, 4(a1)
4968; RV32I-NEXT:    lw a5, 8(a1)
4969; RV32I-NEXT:    lw a6, 12(a1)
4970; RV32I-NEXT:    lw a7, 16(a1)
4971; RV32I-NEXT:    lw t2, 20(a1)
4972; RV32I-NEXT:    lw t3, 24(a1)
4973; RV32I-NEXT:    lw t4, 28(a1)
4974; RV32I-NEXT:    srl a0, a4, t1
4975; RV32I-NEXT:    slli t5, a5, 1
4976; RV32I-NEXT:    srl a1, a3, t1
4977; RV32I-NEXT:    slli t6, a4, 1
4978; RV32I-NEXT:    srl a3, a6, t1
4979; RV32I-NEXT:    slli s0, a7, 1
4980; RV32I-NEXT:    srl a4, a5, t1
4981; RV32I-NEXT:    slli s1, a6, 1
4982; RV32I-NEXT:    srl a5, t2, t1
4983; RV32I-NEXT:    slli s2, t3, 1
4984; RV32I-NEXT:    srl a6, a7, t1
4985; RV32I-NEXT:    slli t2, t2, 1
4986; RV32I-NEXT:    srl a7, t3, t1
4987; RV32I-NEXT:    slli t3, t4, 1
4988; RV32I-NEXT:    sra t1, t4, t1
4989; RV32I-NEXT:    sll t4, t5, t0
4990; RV32I-NEXT:    sll t5, t6, t0
4991; RV32I-NEXT:    sll t6, s0, t0
4992; RV32I-NEXT:    sll s0, s1, t0
4993; RV32I-NEXT:    sll s1, s2, t0
4994; RV32I-NEXT:    sll t2, t2, t0
4995; RV32I-NEXT:    sll t3, t3, t0
4996; RV32I-NEXT:    srli s2, t1, 24
4997; RV32I-NEXT:    srli s3, t1, 16
4998; RV32I-NEXT:    srli s4, t1, 8
4999; RV32I-NEXT:    or t0, a0, t4
5000; RV32I-NEXT:    or t4, a1, t5
5001; RV32I-NEXT:    or t5, a3, t6
5002; RV32I-NEXT:    or s0, a4, s0
5003; RV32I-NEXT:    or s1, a5, s1
5004; RV32I-NEXT:    or t2, a6, t2
5005; RV32I-NEXT:    or t3, a7, t3
5006; RV32I-NEXT:    sb t1, 28(a2)
5007; RV32I-NEXT:    sb s4, 29(a2)
5008; RV32I-NEXT:    sb s3, 30(a2)
5009; RV32I-NEXT:    sb s2, 31(a2)
5010; RV32I-NEXT:    srli t1, t3, 24
5011; RV32I-NEXT:    srli t6, t3, 16
5012; RV32I-NEXT:    srli t3, t3, 8
5013; RV32I-NEXT:    srli s2, t2, 24
5014; RV32I-NEXT:    srli s3, t2, 16
5015; RV32I-NEXT:    srli t2, t2, 8
5016; RV32I-NEXT:    srli s4, s1, 24
5017; RV32I-NEXT:    srli s5, s1, 16
5018; RV32I-NEXT:    srli s1, s1, 8
5019; RV32I-NEXT:    srli s6, s0, 24
5020; RV32I-NEXT:    srli s7, s0, 16
5021; RV32I-NEXT:    srli s0, s0, 8
5022; RV32I-NEXT:    srli s8, t5, 24
5023; RV32I-NEXT:    srli s9, t5, 16
5024; RV32I-NEXT:    srli t5, t5, 8
5025; RV32I-NEXT:    srli s10, t4, 24
5026; RV32I-NEXT:    srli s11, t4, 16
5027; RV32I-NEXT:    srli t4, t4, 8
5028; RV32I-NEXT:    sb a7, 24(a2)
5029; RV32I-NEXT:    sb t3, 25(a2)
5030; RV32I-NEXT:    sb t6, 26(a2)
5031; RV32I-NEXT:    sb t1, 27(a2)
5032; RV32I-NEXT:    srli a7, t0, 24
5033; RV32I-NEXT:    sb a6, 16(a2)
5034; RV32I-NEXT:    sb t2, 17(a2)
5035; RV32I-NEXT:    sb s3, 18(a2)
5036; RV32I-NEXT:    sb s2, 19(a2)
5037; RV32I-NEXT:    srli a6, t0, 16
5038; RV32I-NEXT:    srli t0, t0, 8
5039; RV32I-NEXT:    sb a5, 20(a2)
5040; RV32I-NEXT:    sb s1, 21(a2)
5041; RV32I-NEXT:    sb s5, 22(a2)
5042; RV32I-NEXT:    sb s4, 23(a2)
5043; RV32I-NEXT:    sb a4, 8(a2)
5044; RV32I-NEXT:    sb s0, 9(a2)
5045; RV32I-NEXT:    sb s7, 10(a2)
5046; RV32I-NEXT:    sb s6, 11(a2)
5047; RV32I-NEXT:    sb a3, 12(a2)
5048; RV32I-NEXT:    sb t5, 13(a2)
5049; RV32I-NEXT:    sb s9, 14(a2)
5050; RV32I-NEXT:    sb s8, 15(a2)
5051; RV32I-NEXT:    sb a1, 0(a2)
5052; RV32I-NEXT:    sb t4, 1(a2)
5053; RV32I-NEXT:    sb s11, 2(a2)
5054; RV32I-NEXT:    sb s10, 3(a2)
5055; RV32I-NEXT:    sb a0, 4(a2)
5056; RV32I-NEXT:    sb t0, 5(a2)
5057; RV32I-NEXT:    sb a6, 6(a2)
5058; RV32I-NEXT:    sb a7, 7(a2)
5059; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
5060; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
5061; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
5062; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
5063; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
5064; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
5065; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
5066; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
5067; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
5068; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
5069; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
5070; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
5071; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
5072; RV32I-NEXT:    addi sp, sp, 128
5073; RV32I-NEXT:    ret
5074  %src = load i256, ptr %src.ptr, align 1
5075  %byteOff = load i256, ptr %byteOff.ptr, align 1
5076  %bitOff = shl i256 %byteOff, 3
5077  %res = ashr i256 %src, %bitOff
5078  store i256 %res, ptr %dst, align 1
5079  ret void
5080}
5081
5082define void @ashr_32bytes_wordOff(ptr %src.ptr, ptr %wordOff.ptr, ptr %dst) nounwind {
5083; RV64I-LABEL: ashr_32bytes_wordOff:
5084; RV64I:       # %bb.0:
5085; RV64I-NEXT:    addi sp, sp, -160
5086; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
5087; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
5088; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
5089; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
5090; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
5091; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
5092; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
5093; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
5094; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
5095; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
5096; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
5097; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
5098; RV64I-NEXT:    lbu a3, 0(a0)
5099; RV64I-NEXT:    lbu a4, 1(a0)
5100; RV64I-NEXT:    lbu a5, 2(a0)
5101; RV64I-NEXT:    lbu a6, 3(a0)
5102; RV64I-NEXT:    lbu a7, 4(a0)
5103; RV64I-NEXT:    lbu t0, 5(a0)
5104; RV64I-NEXT:    lbu t1, 6(a0)
5105; RV64I-NEXT:    lbu t2, 7(a0)
5106; RV64I-NEXT:    lbu t3, 8(a0)
5107; RV64I-NEXT:    lbu t4, 9(a0)
5108; RV64I-NEXT:    lbu t5, 10(a0)
5109; RV64I-NEXT:    lbu t6, 11(a0)
5110; RV64I-NEXT:    lbu s0, 12(a0)
5111; RV64I-NEXT:    lbu s1, 13(a0)
5112; RV64I-NEXT:    lbu s2, 14(a0)
5113; RV64I-NEXT:    lbu s3, 15(a0)
5114; RV64I-NEXT:    lbu s4, 16(a0)
5115; RV64I-NEXT:    lbu s5, 17(a0)
5116; RV64I-NEXT:    lbu s6, 18(a0)
5117; RV64I-NEXT:    lbu s7, 19(a0)
5118; RV64I-NEXT:    slli a4, a4, 8
5119; RV64I-NEXT:    slli a5, a5, 16
5120; RV64I-NEXT:    slli a6, a6, 24
5121; RV64I-NEXT:    slli t0, t0, 8
5122; RV64I-NEXT:    slli t1, t1, 16
5123; RV64I-NEXT:    slli t2, t2, 24
5124; RV64I-NEXT:    or a3, a4, a3
5125; RV64I-NEXT:    or a4, a6, a5
5126; RV64I-NEXT:    or a5, t0, a7
5127; RV64I-NEXT:    or a6, t2, t1
5128; RV64I-NEXT:    lbu s8, 20(a0)
5129; RV64I-NEXT:    lbu s9, 21(a0)
5130; RV64I-NEXT:    lbu s10, 22(a0)
5131; RV64I-NEXT:    lbu s11, 23(a0)
5132; RV64I-NEXT:    slli t4, t4, 8
5133; RV64I-NEXT:    slli t5, t5, 16
5134; RV64I-NEXT:    slli t6, t6, 24
5135; RV64I-NEXT:    slli s1, s1, 8
5136; RV64I-NEXT:    slli s2, s2, 16
5137; RV64I-NEXT:    slli s3, s3, 24
5138; RV64I-NEXT:    or a7, t4, t3
5139; RV64I-NEXT:    or t0, t6, t5
5140; RV64I-NEXT:    or t1, s1, s0
5141; RV64I-NEXT:    or t2, s3, s2
5142; RV64I-NEXT:    lbu t6, 24(a0)
5143; RV64I-NEXT:    lbu s0, 25(a0)
5144; RV64I-NEXT:    lbu s1, 26(a0)
5145; RV64I-NEXT:    lbu s2, 27(a0)
5146; RV64I-NEXT:    slli s5, s5, 8
5147; RV64I-NEXT:    slli s6, s6, 16
5148; RV64I-NEXT:    slli s7, s7, 24
5149; RV64I-NEXT:    slli s9, s9, 8
5150; RV64I-NEXT:    or t3, s5, s4
5151; RV64I-NEXT:    or t4, s7, s6
5152; RV64I-NEXT:    or t5, s9, s8
5153; RV64I-NEXT:    lbu s3, 28(a0)
5154; RV64I-NEXT:    lbu s4, 29(a0)
5155; RV64I-NEXT:    lbu s5, 30(a0)
5156; RV64I-NEXT:    lbu s6, 31(a0)
5157; RV64I-NEXT:    slli s10, s10, 16
5158; RV64I-NEXT:    slli s11, s11, 24
5159; RV64I-NEXT:    slli s0, s0, 8
5160; RV64I-NEXT:    slli s1, s1, 16
5161; RV64I-NEXT:    slli s2, s2, 24
5162; RV64I-NEXT:    slli s4, s4, 8
5163; RV64I-NEXT:    or a0, s11, s10
5164; RV64I-NEXT:    or t6, s0, t6
5165; RV64I-NEXT:    or s0, s2, s1
5166; RV64I-NEXT:    or s1, s4, s3
5167; RV64I-NEXT:    lbu s2, 0(a1)
5168; RV64I-NEXT:    lbu s3, 1(a1)
5169; RV64I-NEXT:    lbu s4, 2(a1)
5170; RV64I-NEXT:    lbu s7, 3(a1)
5171; RV64I-NEXT:    slli s5, s5, 16
5172; RV64I-NEXT:    slli s6, s6, 24
5173; RV64I-NEXT:    slli s3, s3, 8
5174; RV64I-NEXT:    slli s4, s4, 16
5175; RV64I-NEXT:    slli s7, s7, 24
5176; RV64I-NEXT:    or s5, s6, s5
5177; RV64I-NEXT:    or s2, s3, s2
5178; RV64I-NEXT:    lbu s3, 4(a1)
5179; RV64I-NEXT:    lbu s6, 5(a1)
5180; RV64I-NEXT:    or s4, s7, s4
5181; RV64I-NEXT:    lbu s7, 6(a1)
5182; RV64I-NEXT:    lbu a1, 7(a1)
5183; RV64I-NEXT:    slli s6, s6, 8
5184; RV64I-NEXT:    or s3, s6, s3
5185; RV64I-NEXT:    slli s7, s7, 16
5186; RV64I-NEXT:    slli a1, a1, 24
5187; RV64I-NEXT:    or a1, a1, s7
5188; RV64I-NEXT:    mv s6, sp
5189; RV64I-NEXT:    or a3, a4, a3
5190; RV64I-NEXT:    or a4, a6, a5
5191; RV64I-NEXT:    or a5, t0, a7
5192; RV64I-NEXT:    or a6, t2, t1
5193; RV64I-NEXT:    or a7, t4, t3
5194; RV64I-NEXT:    or a0, a0, t5
5195; RV64I-NEXT:    or t0, s0, t6
5196; RV64I-NEXT:    or t1, s5, s1
5197; RV64I-NEXT:    or t2, s4, s2
5198; RV64I-NEXT:    or a1, a1, s3
5199; RV64I-NEXT:    slli a4, a4, 32
5200; RV64I-NEXT:    slli a6, a6, 32
5201; RV64I-NEXT:    slli a0, a0, 32
5202; RV64I-NEXT:    slli t3, t1, 32
5203; RV64I-NEXT:    slli a1, a1, 32
5204; RV64I-NEXT:    sraiw t1, t1, 31
5205; RV64I-NEXT:    or a3, a4, a3
5206; RV64I-NEXT:    or a4, a6, a5
5207; RV64I-NEXT:    or a0, a0, a7
5208; RV64I-NEXT:    or a5, t3, t0
5209; RV64I-NEXT:    or a1, a1, t2
5210; RV64I-NEXT:    sd t1, 32(sp)
5211; RV64I-NEXT:    sd t1, 40(sp)
5212; RV64I-NEXT:    sd t1, 48(sp)
5213; RV64I-NEXT:    sd t1, 56(sp)
5214; RV64I-NEXT:    sd a3, 0(sp)
5215; RV64I-NEXT:    sd a4, 8(sp)
5216; RV64I-NEXT:    sd a0, 16(sp)
5217; RV64I-NEXT:    sd a5, 24(sp)
5218; RV64I-NEXT:    slli a3, a1, 5
5219; RV64I-NEXT:    slli a1, a1, 2
5220; RV64I-NEXT:    andi a1, a1, 24
5221; RV64I-NEXT:    andi a0, a3, 32
5222; RV64I-NEXT:    add a1, s6, a1
5223; RV64I-NEXT:    ld a4, 0(a1)
5224; RV64I-NEXT:    ld a5, 8(a1)
5225; RV64I-NEXT:    ld a6, 16(a1)
5226; RV64I-NEXT:    xori a7, a0, 63
5227; RV64I-NEXT:    ld t0, 24(a1)
5228; RV64I-NEXT:    srl a0, a5, a3
5229; RV64I-NEXT:    slli t1, a6, 1
5230; RV64I-NEXT:    srl a1, a4, a3
5231; RV64I-NEXT:    slli a5, a5, 1
5232; RV64I-NEXT:    srl a4, a6, a3
5233; RV64I-NEXT:    slli a6, t0, 1
5234; RV64I-NEXT:    sra a3, t0, a3
5235; RV64I-NEXT:    sll t0, t1, a7
5236; RV64I-NEXT:    sll a5, a5, a7
5237; RV64I-NEXT:    sll a6, a6, a7
5238; RV64I-NEXT:    srli a7, a4, 24
5239; RV64I-NEXT:    srli t1, a4, 16
5240; RV64I-NEXT:    srli t2, a4, 8
5241; RV64I-NEXT:    srli t3, a3, 56
5242; RV64I-NEXT:    srli t4, a3, 48
5243; RV64I-NEXT:    srli t5, a3, 40
5244; RV64I-NEXT:    srli t6, a3, 32
5245; RV64I-NEXT:    srli s0, a3, 24
5246; RV64I-NEXT:    srli s1, a3, 16
5247; RV64I-NEXT:    srli s2, a3, 8
5248; RV64I-NEXT:    srli s3, a1, 24
5249; RV64I-NEXT:    srli s4, a1, 16
5250; RV64I-NEXT:    srli s5, a1, 8
5251; RV64I-NEXT:    srli s6, a0, 24
5252; RV64I-NEXT:    or a6, a4, a6
5253; RV64I-NEXT:    sb a4, 16(a2)
5254; RV64I-NEXT:    sb t2, 17(a2)
5255; RV64I-NEXT:    sb t1, 18(a2)
5256; RV64I-NEXT:    sb a7, 19(a2)
5257; RV64I-NEXT:    srli a4, a0, 16
5258; RV64I-NEXT:    sb t6, 28(a2)
5259; RV64I-NEXT:    sb t5, 29(a2)
5260; RV64I-NEXT:    sb t4, 30(a2)
5261; RV64I-NEXT:    sb t3, 31(a2)
5262; RV64I-NEXT:    srli a7, a0, 8
5263; RV64I-NEXT:    or t0, a0, t0
5264; RV64I-NEXT:    or a5, a1, a5
5265; RV64I-NEXT:    sb a3, 24(a2)
5266; RV64I-NEXT:    sb s2, 25(a2)
5267; RV64I-NEXT:    sb s1, 26(a2)
5268; RV64I-NEXT:    sb s0, 27(a2)
5269; RV64I-NEXT:    sb a1, 0(a2)
5270; RV64I-NEXT:    sb s5, 1(a2)
5271; RV64I-NEXT:    sb s4, 2(a2)
5272; RV64I-NEXT:    sb s3, 3(a2)
5273; RV64I-NEXT:    sb a0, 8(a2)
5274; RV64I-NEXT:    sb a7, 9(a2)
5275; RV64I-NEXT:    sb a4, 10(a2)
5276; RV64I-NEXT:    sb s6, 11(a2)
5277; RV64I-NEXT:    srli a0, a6, 56
5278; RV64I-NEXT:    srli a1, a6, 48
5279; RV64I-NEXT:    srli a3, a6, 40
5280; RV64I-NEXT:    srli a4, a6, 32
5281; RV64I-NEXT:    srli a6, a5, 56
5282; RV64I-NEXT:    srli a7, a5, 48
5283; RV64I-NEXT:    srli t1, a5, 40
5284; RV64I-NEXT:    srli a5, a5, 32
5285; RV64I-NEXT:    srli t2, t0, 56
5286; RV64I-NEXT:    srli t3, t0, 48
5287; RV64I-NEXT:    srli t4, t0, 40
5288; RV64I-NEXT:    srli t0, t0, 32
5289; RV64I-NEXT:    sb a4, 20(a2)
5290; RV64I-NEXT:    sb a3, 21(a2)
5291; RV64I-NEXT:    sb a1, 22(a2)
5292; RV64I-NEXT:    sb a0, 23(a2)
5293; RV64I-NEXT:    sb a5, 4(a2)
5294; RV64I-NEXT:    sb t1, 5(a2)
5295; RV64I-NEXT:    sb a7, 6(a2)
5296; RV64I-NEXT:    sb a6, 7(a2)
5297; RV64I-NEXT:    sb t0, 12(a2)
5298; RV64I-NEXT:    sb t4, 13(a2)
5299; RV64I-NEXT:    sb t3, 14(a2)
5300; RV64I-NEXT:    sb t2, 15(a2)
5301; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
5302; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
5303; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
5304; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
5305; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
5306; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
5307; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
5308; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
5309; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
5310; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
5311; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
5312; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
5313; RV64I-NEXT:    addi sp, sp, 160
5314; RV64I-NEXT:    ret
5315;
5316; RV32I-LABEL: ashr_32bytes_wordOff:
5317; RV32I:       # %bb.0:
5318; RV32I-NEXT:    addi sp, sp, -128
5319; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
5320; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
5321; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
5322; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
5323; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
5324; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
5325; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
5326; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
5327; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
5328; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
5329; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
5330; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
5331; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
5332; RV32I-NEXT:    lbu a6, 0(a0)
5333; RV32I-NEXT:    lbu t0, 1(a0)
5334; RV32I-NEXT:    lbu t1, 2(a0)
5335; RV32I-NEXT:    lbu t6, 3(a0)
5336; RV32I-NEXT:    lbu s7, 4(a0)
5337; RV32I-NEXT:    lbu s8, 5(a0)
5338; RV32I-NEXT:    lbu s3, 6(a0)
5339; RV32I-NEXT:    lbu s5, 7(a0)
5340; RV32I-NEXT:    lbu s4, 8(a0)
5341; RV32I-NEXT:    lbu s9, 9(a0)
5342; RV32I-NEXT:    lbu s10, 10(a0)
5343; RV32I-NEXT:    lbu s11, 11(a0)
5344; RV32I-NEXT:    lbu s2, 12(a0)
5345; RV32I-NEXT:    lbu s6, 13(a0)
5346; RV32I-NEXT:    lbu a5, 14(a0)
5347; RV32I-NEXT:    lbu a7, 15(a0)
5348; RV32I-NEXT:    lbu a3, 16(a0)
5349; RV32I-NEXT:    lbu t2, 17(a0)
5350; RV32I-NEXT:    lbu t3, 18(a0)
5351; RV32I-NEXT:    lbu t4, 19(a0)
5352; RV32I-NEXT:    lbu a4, 20(a0)
5353; RV32I-NEXT:    lbu t5, 21(a0)
5354; RV32I-NEXT:    lbu s0, 22(a0)
5355; RV32I-NEXT:    lbu s1, 23(a0)
5356; RV32I-NEXT:    slli t0, t0, 8
5357; RV32I-NEXT:    slli t1, t1, 16
5358; RV32I-NEXT:    slli t6, t6, 24
5359; RV32I-NEXT:    slli s8, s8, 8
5360; RV32I-NEXT:    or a6, t0, a6
5361; RV32I-NEXT:    or t0, t6, t1
5362; RV32I-NEXT:    or t1, s8, s7
5363; RV32I-NEXT:    lbu t6, 24(a0)
5364; RV32I-NEXT:    lbu s7, 25(a0)
5365; RV32I-NEXT:    lbu s8, 26(a0)
5366; RV32I-NEXT:    lbu ra, 27(a0)
5367; RV32I-NEXT:    slli s3, s3, 16
5368; RV32I-NEXT:    slli s5, s5, 24
5369; RV32I-NEXT:    slli s9, s9, 8
5370; RV32I-NEXT:    slli s10, s10, 16
5371; RV32I-NEXT:    slli s11, s11, 24
5372; RV32I-NEXT:    or s3, s5, s3
5373; RV32I-NEXT:    or s4, s9, s4
5374; RV32I-NEXT:    or s5, s11, s10
5375; RV32I-NEXT:    lbu s9, 28(a0)
5376; RV32I-NEXT:    lbu s10, 29(a0)
5377; RV32I-NEXT:    lbu s11, 30(a0)
5378; RV32I-NEXT:    lbu a0, 31(a0)
5379; RV32I-NEXT:    lbu a1, 0(a1)
5380; RV32I-NEXT:    slli s6, s6, 8
5381; RV32I-NEXT:    or s2, s6, s2
5382; RV32I-NEXT:    addi s6, sp, 8
5383; RV32I-NEXT:    slli a5, a5, 16
5384; RV32I-NEXT:    slli a7, a7, 24
5385; RV32I-NEXT:    slli t2, t2, 8
5386; RV32I-NEXT:    slli t3, t3, 16
5387; RV32I-NEXT:    slli t4, t4, 24
5388; RV32I-NEXT:    slli t5, t5, 8
5389; RV32I-NEXT:    slli s0, s0, 16
5390; RV32I-NEXT:    slli s1, s1, 24
5391; RV32I-NEXT:    slli s7, s7, 8
5392; RV32I-NEXT:    slli s8, s8, 16
5393; RV32I-NEXT:    slli ra, ra, 24
5394; RV32I-NEXT:    slli s10, s10, 8
5395; RV32I-NEXT:    slli s11, s11, 16
5396; RV32I-NEXT:    slli a0, a0, 24
5397; RV32I-NEXT:    slli a1, a1, 2
5398; RV32I-NEXT:    or a5, a7, a5
5399; RV32I-NEXT:    or a3, t2, a3
5400; RV32I-NEXT:    or a7, t4, t3
5401; RV32I-NEXT:    or a4, t5, a4
5402; RV32I-NEXT:    or s0, s1, s0
5403; RV32I-NEXT:    or t2, s7, t6
5404; RV32I-NEXT:    or t3, ra, s8
5405; RV32I-NEXT:    or t4, s10, s9
5406; RV32I-NEXT:    or t5, a0, s11
5407; RV32I-NEXT:    srai a0, a0, 31
5408; RV32I-NEXT:    andi a1, a1, 28
5409; RV32I-NEXT:    or a6, t0, a6
5410; RV32I-NEXT:    or t0, s3, t1
5411; RV32I-NEXT:    or t1, s5, s4
5412; RV32I-NEXT:    or a5, a5, s2
5413; RV32I-NEXT:    or a3, a7, a3
5414; RV32I-NEXT:    or a4, s0, a4
5415; RV32I-NEXT:    or a7, t3, t2
5416; RV32I-NEXT:    or t2, t5, t4
5417; RV32I-NEXT:    sw a0, 56(sp)
5418; RV32I-NEXT:    sw a0, 60(sp)
5419; RV32I-NEXT:    sw a0, 64(sp)
5420; RV32I-NEXT:    sw a0, 68(sp)
5421; RV32I-NEXT:    sw a0, 40(sp)
5422; RV32I-NEXT:    sw a0, 44(sp)
5423; RV32I-NEXT:    sw a0, 48(sp)
5424; RV32I-NEXT:    sw a0, 52(sp)
5425; RV32I-NEXT:    add s6, s6, a1
5426; RV32I-NEXT:    sw a3, 24(sp)
5427; RV32I-NEXT:    sw a4, 28(sp)
5428; RV32I-NEXT:    sw a7, 32(sp)
5429; RV32I-NEXT:    sw t2, 36(sp)
5430; RV32I-NEXT:    sw a6, 8(sp)
5431; RV32I-NEXT:    sw t0, 12(sp)
5432; RV32I-NEXT:    sw t1, 16(sp)
5433; RV32I-NEXT:    sw a5, 20(sp)
5434; RV32I-NEXT:    lw a6, 16(s6)
5435; RV32I-NEXT:    lw a5, 20(s6)
5436; RV32I-NEXT:    lw a7, 24(s6)
5437; RV32I-NEXT:    lw a1, 0(s6)
5438; RV32I-NEXT:    lw a0, 4(s6)
5439; RV32I-NEXT:    lw a4, 8(s6)
5440; RV32I-NEXT:    lw a3, 12(s6)
5441; RV32I-NEXT:    lw t0, 28(s6)
5442; RV32I-NEXT:    srli t1, a7, 24
5443; RV32I-NEXT:    srli t2, a7, 16
5444; RV32I-NEXT:    srli t3, a7, 8
5445; RV32I-NEXT:    srli t4, t0, 24
5446; RV32I-NEXT:    srli t5, t0, 16
5447; RV32I-NEXT:    srli t6, t0, 8
5448; RV32I-NEXT:    srli s0, a6, 24
5449; RV32I-NEXT:    srli s1, a6, 16
5450; RV32I-NEXT:    srli s2, a6, 8
5451; RV32I-NEXT:    srli s3, a5, 24
5452; RV32I-NEXT:    srli s4, a5, 16
5453; RV32I-NEXT:    srli s5, a5, 8
5454; RV32I-NEXT:    srli s6, a4, 24
5455; RV32I-NEXT:    srli s7, a4, 16
5456; RV32I-NEXT:    srli s8, a4, 8
5457; RV32I-NEXT:    srli s9, a3, 24
5458; RV32I-NEXT:    srli s10, a3, 16
5459; RV32I-NEXT:    srli s11, a3, 8
5460; RV32I-NEXT:    srli ra, a1, 24
5461; RV32I-NEXT:    sb a7, 24(a2)
5462; RV32I-NEXT:    sb t3, 25(a2)
5463; RV32I-NEXT:    sb t2, 26(a2)
5464; RV32I-NEXT:    sb t1, 27(a2)
5465; RV32I-NEXT:    srli a7, a1, 16
5466; RV32I-NEXT:    sb t0, 28(a2)
5467; RV32I-NEXT:    sb t6, 29(a2)
5468; RV32I-NEXT:    sb t5, 30(a2)
5469; RV32I-NEXT:    sb t4, 31(a2)
5470; RV32I-NEXT:    srli t0, a1, 8
5471; RV32I-NEXT:    sb a6, 16(a2)
5472; RV32I-NEXT:    sb s2, 17(a2)
5473; RV32I-NEXT:    sb s1, 18(a2)
5474; RV32I-NEXT:    sb s0, 19(a2)
5475; RV32I-NEXT:    srli a6, a0, 24
5476; RV32I-NEXT:    sb a5, 20(a2)
5477; RV32I-NEXT:    sb s5, 21(a2)
5478; RV32I-NEXT:    sb s4, 22(a2)
5479; RV32I-NEXT:    sb s3, 23(a2)
5480; RV32I-NEXT:    srli a5, a0, 16
5481; RV32I-NEXT:    sb a4, 8(a2)
5482; RV32I-NEXT:    sb s8, 9(a2)
5483; RV32I-NEXT:    sb s7, 10(a2)
5484; RV32I-NEXT:    sb s6, 11(a2)
5485; RV32I-NEXT:    srli a4, a0, 8
5486; RV32I-NEXT:    sb a3, 12(a2)
5487; RV32I-NEXT:    sb s11, 13(a2)
5488; RV32I-NEXT:    sb s10, 14(a2)
5489; RV32I-NEXT:    sb s9, 15(a2)
5490; RV32I-NEXT:    sb a1, 0(a2)
5491; RV32I-NEXT:    sb t0, 1(a2)
5492; RV32I-NEXT:    sb a7, 2(a2)
5493; RV32I-NEXT:    sb ra, 3(a2)
5494; RV32I-NEXT:    sb a0, 4(a2)
5495; RV32I-NEXT:    sb a4, 5(a2)
5496; RV32I-NEXT:    sb a5, 6(a2)
5497; RV32I-NEXT:    sb a6, 7(a2)
5498; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
5499; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
5500; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
5501; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
5502; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
5503; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
5504; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
5505; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
5506; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
5507; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
5508; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
5509; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
5510; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
5511; RV32I-NEXT:    addi sp, sp, 128
5512; RV32I-NEXT:    ret
5513  %src = load i256, ptr %src.ptr, align 1
5514  %wordOff = load i256, ptr %wordOff.ptr, align 1
5515  %bitOff = shl i256 %wordOff, 5
5516  %res = ashr i256 %src, %bitOff
5517  store i256 %res, ptr %dst, align 1
5518  ret void
5519}
5520
5521define void @ashr_32bytes_dwordOff(ptr %src.ptr, ptr %dwordOff.ptr, ptr %dst) nounwind {
5522; RV64I-LABEL: ashr_32bytes_dwordOff:
5523; RV64I:       # %bb.0:
5524; RV64I-NEXT:    addi sp, sp, -160
5525; RV64I-NEXT:    sd s0, 152(sp) # 8-byte Folded Spill
5526; RV64I-NEXT:    sd s1, 144(sp) # 8-byte Folded Spill
5527; RV64I-NEXT:    sd s2, 136(sp) # 8-byte Folded Spill
5528; RV64I-NEXT:    sd s3, 128(sp) # 8-byte Folded Spill
5529; RV64I-NEXT:    sd s4, 120(sp) # 8-byte Folded Spill
5530; RV64I-NEXT:    sd s5, 112(sp) # 8-byte Folded Spill
5531; RV64I-NEXT:    sd s6, 104(sp) # 8-byte Folded Spill
5532; RV64I-NEXT:    sd s7, 96(sp) # 8-byte Folded Spill
5533; RV64I-NEXT:    sd s8, 88(sp) # 8-byte Folded Spill
5534; RV64I-NEXT:    sd s9, 80(sp) # 8-byte Folded Spill
5535; RV64I-NEXT:    sd s10, 72(sp) # 8-byte Folded Spill
5536; RV64I-NEXT:    sd s11, 64(sp) # 8-byte Folded Spill
5537; RV64I-NEXT:    lbu a5, 0(a0)
5538; RV64I-NEXT:    lbu a7, 1(a0)
5539; RV64I-NEXT:    lbu t1, 2(a0)
5540; RV64I-NEXT:    lbu s3, 3(a0)
5541; RV64I-NEXT:    lbu t0, 4(a0)
5542; RV64I-NEXT:    lbu s8, 5(a0)
5543; RV64I-NEXT:    lbu s9, 6(a0)
5544; RV64I-NEXT:    lbu s10, 7(a0)
5545; RV64I-NEXT:    lbu s2, 8(a0)
5546; RV64I-NEXT:    lbu s4, 9(a0)
5547; RV64I-NEXT:    lbu s5, 10(a0)
5548; RV64I-NEXT:    lbu s6, 11(a0)
5549; RV64I-NEXT:    lbu s7, 12(a0)
5550; RV64I-NEXT:    lbu s11, 13(a0)
5551; RV64I-NEXT:    lbu t4, 14(a0)
5552; RV64I-NEXT:    lbu t5, 15(a0)
5553; RV64I-NEXT:    lbu a3, 16(a0)
5554; RV64I-NEXT:    lbu a6, 17(a0)
5555; RV64I-NEXT:    lbu t2, 18(a0)
5556; RV64I-NEXT:    lbu t3, 19(a0)
5557; RV64I-NEXT:    lbu a4, 20(a0)
5558; RV64I-NEXT:    lbu t6, 21(a0)
5559; RV64I-NEXT:    lbu s0, 22(a0)
5560; RV64I-NEXT:    lbu s1, 23(a0)
5561; RV64I-NEXT:    slli a7, a7, 8
5562; RV64I-NEXT:    slli t1, t1, 16
5563; RV64I-NEXT:    slli s3, s3, 24
5564; RV64I-NEXT:    slli s8, s8, 8
5565; RV64I-NEXT:    slli s9, s9, 16
5566; RV64I-NEXT:    slli s10, s10, 24
5567; RV64I-NEXT:    or a5, a7, a5
5568; RV64I-NEXT:    or a7, s3, t1
5569; RV64I-NEXT:    or t0, s8, t0
5570; RV64I-NEXT:    or t1, s10, s9
5571; RV64I-NEXT:    lbu s3, 24(a0)
5572; RV64I-NEXT:    lbu s8, 25(a0)
5573; RV64I-NEXT:    lbu s9, 26(a0)
5574; RV64I-NEXT:    lbu s10, 27(a0)
5575; RV64I-NEXT:    slli s4, s4, 8
5576; RV64I-NEXT:    slli s5, s5, 16
5577; RV64I-NEXT:    slli s6, s6, 24
5578; RV64I-NEXT:    slli s11, s11, 8
5579; RV64I-NEXT:    or s2, s4, s2
5580; RV64I-NEXT:    or s4, s6, s5
5581; RV64I-NEXT:    or s5, s11, s7
5582; RV64I-NEXT:    lbu s6, 28(a0)
5583; RV64I-NEXT:    lbu s7, 29(a0)
5584; RV64I-NEXT:    lbu s11, 30(a0)
5585; RV64I-NEXT:    lbu a0, 31(a0)
5586; RV64I-NEXT:    lbu a1, 0(a1)
5587; RV64I-NEXT:    slli t4, t4, 16
5588; RV64I-NEXT:    slli t5, t5, 24
5589; RV64I-NEXT:    or t4, t5, t4
5590; RV64I-NEXT:    mv t5, sp
5591; RV64I-NEXT:    slli a6, a6, 8
5592; RV64I-NEXT:    slli t2, t2, 16
5593; RV64I-NEXT:    slli t3, t3, 24
5594; RV64I-NEXT:    slli t6, t6, 8
5595; RV64I-NEXT:    slli s0, s0, 16
5596; RV64I-NEXT:    slli s1, s1, 24
5597; RV64I-NEXT:    slli s8, s8, 8
5598; RV64I-NEXT:    slli s9, s9, 16
5599; RV64I-NEXT:    slli s10, s10, 24
5600; RV64I-NEXT:    slli s7, s7, 8
5601; RV64I-NEXT:    slli s11, s11, 16
5602; RV64I-NEXT:    slli a0, a0, 24
5603; RV64I-NEXT:    slli a1, a1, 3
5604; RV64I-NEXT:    or a3, a6, a3
5605; RV64I-NEXT:    or a6, t3, t2
5606; RV64I-NEXT:    or a4, t6, a4
5607; RV64I-NEXT:    or s0, s1, s0
5608; RV64I-NEXT:    or t2, s8, s3
5609; RV64I-NEXT:    or t3, s10, s9
5610; RV64I-NEXT:    or t6, s7, s6
5611; RV64I-NEXT:    or a0, a0, s11
5612; RV64I-NEXT:    andi a1, a1, 24
5613; RV64I-NEXT:    or a5, a7, a5
5614; RV64I-NEXT:    or a7, t1, t0
5615; RV64I-NEXT:    or t0, s4, s2
5616; RV64I-NEXT:    or t1, t4, s5
5617; RV64I-NEXT:    or a3, a6, a3
5618; RV64I-NEXT:    or a4, s0, a4
5619; RV64I-NEXT:    or a6, t3, t2
5620; RV64I-NEXT:    or a0, a0, t6
5621; RV64I-NEXT:    add t5, t5, a1
5622; RV64I-NEXT:    slli a7, a7, 32
5623; RV64I-NEXT:    slli t1, t1, 32
5624; RV64I-NEXT:    slli a4, a4, 32
5625; RV64I-NEXT:    slli a1, a0, 32
5626; RV64I-NEXT:    sraiw a0, a0, 31
5627; RV64I-NEXT:    or a5, a7, a5
5628; RV64I-NEXT:    or a7, t1, t0
5629; RV64I-NEXT:    or a3, a4, a3
5630; RV64I-NEXT:    or a1, a1, a6
5631; RV64I-NEXT:    sd a0, 32(sp)
5632; RV64I-NEXT:    sd a0, 40(sp)
5633; RV64I-NEXT:    sd a0, 48(sp)
5634; RV64I-NEXT:    sd a0, 56(sp)
5635; RV64I-NEXT:    sd a5, 0(sp)
5636; RV64I-NEXT:    sd a7, 8(sp)
5637; RV64I-NEXT:    sd a3, 16(sp)
5638; RV64I-NEXT:    sd a1, 24(sp)
5639; RV64I-NEXT:    ld a4, 16(t5)
5640; RV64I-NEXT:    ld a0, 8(t5)
5641; RV64I-NEXT:    ld a1, 0(t5)
5642; RV64I-NEXT:    ld a3, 24(t5)
5643; RV64I-NEXT:    srli a5, a4, 56
5644; RV64I-NEXT:    srli a6, a4, 48
5645; RV64I-NEXT:    srli a7, a4, 40
5646; RV64I-NEXT:    srli t0, a4, 32
5647; RV64I-NEXT:    srli t1, a4, 24
5648; RV64I-NEXT:    srli t2, a4, 16
5649; RV64I-NEXT:    srli t3, a4, 8
5650; RV64I-NEXT:    srli t4, a3, 56
5651; RV64I-NEXT:    srli t5, a3, 48
5652; RV64I-NEXT:    srli t6, a3, 40
5653; RV64I-NEXT:    srli s0, a3, 32
5654; RV64I-NEXT:    srli s1, a3, 24
5655; RV64I-NEXT:    srli s2, a3, 16
5656; RV64I-NEXT:    srli s3, a3, 8
5657; RV64I-NEXT:    srli s4, a1, 56
5658; RV64I-NEXT:    srli s5, a1, 48
5659; RV64I-NEXT:    srli s6, a1, 40
5660; RV64I-NEXT:    srli s7, a1, 32
5661; RV64I-NEXT:    srli s8, a1, 24
5662; RV64I-NEXT:    srli s9, a1, 16
5663; RV64I-NEXT:    srli s10, a1, 8
5664; RV64I-NEXT:    srli s11, a0, 56
5665; RV64I-NEXT:    sb t0, 20(a2)
5666; RV64I-NEXT:    sb a7, 21(a2)
5667; RV64I-NEXT:    sb a6, 22(a2)
5668; RV64I-NEXT:    sb a5, 23(a2)
5669; RV64I-NEXT:    srli a5, a0, 48
5670; RV64I-NEXT:    sb a4, 16(a2)
5671; RV64I-NEXT:    sb t3, 17(a2)
5672; RV64I-NEXT:    sb t2, 18(a2)
5673; RV64I-NEXT:    sb t1, 19(a2)
5674; RV64I-NEXT:    srli a4, a0, 40
5675; RV64I-NEXT:    sb s0, 28(a2)
5676; RV64I-NEXT:    sb t6, 29(a2)
5677; RV64I-NEXT:    sb t5, 30(a2)
5678; RV64I-NEXT:    sb t4, 31(a2)
5679; RV64I-NEXT:    srli a6, a0, 32
5680; RV64I-NEXT:    sb a3, 24(a2)
5681; RV64I-NEXT:    sb s3, 25(a2)
5682; RV64I-NEXT:    sb s2, 26(a2)
5683; RV64I-NEXT:    sb s1, 27(a2)
5684; RV64I-NEXT:    srli a3, a0, 24
5685; RV64I-NEXT:    sb s7, 4(a2)
5686; RV64I-NEXT:    sb s6, 5(a2)
5687; RV64I-NEXT:    sb s5, 6(a2)
5688; RV64I-NEXT:    sb s4, 7(a2)
5689; RV64I-NEXT:    srli a7, a0, 16
5690; RV64I-NEXT:    sb a1, 0(a2)
5691; RV64I-NEXT:    sb s10, 1(a2)
5692; RV64I-NEXT:    sb s9, 2(a2)
5693; RV64I-NEXT:    sb s8, 3(a2)
5694; RV64I-NEXT:    srli a1, a0, 8
5695; RV64I-NEXT:    sb a6, 12(a2)
5696; RV64I-NEXT:    sb a4, 13(a2)
5697; RV64I-NEXT:    sb a5, 14(a2)
5698; RV64I-NEXT:    sb s11, 15(a2)
5699; RV64I-NEXT:    sb a0, 8(a2)
5700; RV64I-NEXT:    sb a1, 9(a2)
5701; RV64I-NEXT:    sb a7, 10(a2)
5702; RV64I-NEXT:    sb a3, 11(a2)
5703; RV64I-NEXT:    ld s0, 152(sp) # 8-byte Folded Reload
5704; RV64I-NEXT:    ld s1, 144(sp) # 8-byte Folded Reload
5705; RV64I-NEXT:    ld s2, 136(sp) # 8-byte Folded Reload
5706; RV64I-NEXT:    ld s3, 128(sp) # 8-byte Folded Reload
5707; RV64I-NEXT:    ld s4, 120(sp) # 8-byte Folded Reload
5708; RV64I-NEXT:    ld s5, 112(sp) # 8-byte Folded Reload
5709; RV64I-NEXT:    ld s6, 104(sp) # 8-byte Folded Reload
5710; RV64I-NEXT:    ld s7, 96(sp) # 8-byte Folded Reload
5711; RV64I-NEXT:    ld s8, 88(sp) # 8-byte Folded Reload
5712; RV64I-NEXT:    ld s9, 80(sp) # 8-byte Folded Reload
5713; RV64I-NEXT:    ld s10, 72(sp) # 8-byte Folded Reload
5714; RV64I-NEXT:    ld s11, 64(sp) # 8-byte Folded Reload
5715; RV64I-NEXT:    addi sp, sp, 160
5716; RV64I-NEXT:    ret
5717;
5718; RV32I-LABEL: ashr_32bytes_dwordOff:
5719; RV32I:       # %bb.0:
5720; RV32I-NEXT:    addi sp, sp, -128
5721; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
5722; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
5723; RV32I-NEXT:    sw s1, 116(sp) # 4-byte Folded Spill
5724; RV32I-NEXT:    sw s2, 112(sp) # 4-byte Folded Spill
5725; RV32I-NEXT:    sw s3, 108(sp) # 4-byte Folded Spill
5726; RV32I-NEXT:    sw s4, 104(sp) # 4-byte Folded Spill
5727; RV32I-NEXT:    sw s5, 100(sp) # 4-byte Folded Spill
5728; RV32I-NEXT:    sw s6, 96(sp) # 4-byte Folded Spill
5729; RV32I-NEXT:    sw s7, 92(sp) # 4-byte Folded Spill
5730; RV32I-NEXT:    sw s8, 88(sp) # 4-byte Folded Spill
5731; RV32I-NEXT:    sw s9, 84(sp) # 4-byte Folded Spill
5732; RV32I-NEXT:    sw s10, 80(sp) # 4-byte Folded Spill
5733; RV32I-NEXT:    sw s11, 76(sp) # 4-byte Folded Spill
5734; RV32I-NEXT:    lbu a6, 0(a0)
5735; RV32I-NEXT:    lbu t0, 1(a0)
5736; RV32I-NEXT:    lbu t1, 2(a0)
5737; RV32I-NEXT:    lbu t6, 3(a0)
5738; RV32I-NEXT:    lbu s7, 4(a0)
5739; RV32I-NEXT:    lbu s8, 5(a0)
5740; RV32I-NEXT:    lbu s3, 6(a0)
5741; RV32I-NEXT:    lbu s5, 7(a0)
5742; RV32I-NEXT:    lbu s4, 8(a0)
5743; RV32I-NEXT:    lbu s9, 9(a0)
5744; RV32I-NEXT:    lbu s10, 10(a0)
5745; RV32I-NEXT:    lbu s11, 11(a0)
5746; RV32I-NEXT:    lbu s2, 12(a0)
5747; RV32I-NEXT:    lbu s6, 13(a0)
5748; RV32I-NEXT:    lbu a5, 14(a0)
5749; RV32I-NEXT:    lbu a7, 15(a0)
5750; RV32I-NEXT:    lbu a3, 16(a0)
5751; RV32I-NEXT:    lbu t2, 17(a0)
5752; RV32I-NEXT:    lbu t3, 18(a0)
5753; RV32I-NEXT:    lbu t4, 19(a0)
5754; RV32I-NEXT:    lbu a4, 20(a0)
5755; RV32I-NEXT:    lbu t5, 21(a0)
5756; RV32I-NEXT:    lbu s0, 22(a0)
5757; RV32I-NEXT:    lbu s1, 23(a0)
5758; RV32I-NEXT:    slli t0, t0, 8
5759; RV32I-NEXT:    slli t1, t1, 16
5760; RV32I-NEXT:    slli t6, t6, 24
5761; RV32I-NEXT:    slli s8, s8, 8
5762; RV32I-NEXT:    or a6, t0, a6
5763; RV32I-NEXT:    or t0, t6, t1
5764; RV32I-NEXT:    or t1, s8, s7
5765; RV32I-NEXT:    lbu t6, 24(a0)
5766; RV32I-NEXT:    lbu s7, 25(a0)
5767; RV32I-NEXT:    lbu s8, 26(a0)
5768; RV32I-NEXT:    lbu ra, 27(a0)
5769; RV32I-NEXT:    slli s3, s3, 16
5770; RV32I-NEXT:    slli s5, s5, 24
5771; RV32I-NEXT:    slli s9, s9, 8
5772; RV32I-NEXT:    slli s10, s10, 16
5773; RV32I-NEXT:    slli s11, s11, 24
5774; RV32I-NEXT:    or s3, s5, s3
5775; RV32I-NEXT:    or s4, s9, s4
5776; RV32I-NEXT:    or s5, s11, s10
5777; RV32I-NEXT:    lbu s9, 28(a0)
5778; RV32I-NEXT:    lbu s10, 29(a0)
5779; RV32I-NEXT:    lbu s11, 30(a0)
5780; RV32I-NEXT:    lbu a0, 31(a0)
5781; RV32I-NEXT:    lbu a1, 0(a1)
5782; RV32I-NEXT:    slli s6, s6, 8
5783; RV32I-NEXT:    or s2, s6, s2
5784; RV32I-NEXT:    addi s6, sp, 8
5785; RV32I-NEXT:    slli a5, a5, 16
5786; RV32I-NEXT:    slli a7, a7, 24
5787; RV32I-NEXT:    slli t2, t2, 8
5788; RV32I-NEXT:    slli t3, t3, 16
5789; RV32I-NEXT:    slli t4, t4, 24
5790; RV32I-NEXT:    slli t5, t5, 8
5791; RV32I-NEXT:    slli s0, s0, 16
5792; RV32I-NEXT:    slli s1, s1, 24
5793; RV32I-NEXT:    slli s7, s7, 8
5794; RV32I-NEXT:    slli s8, s8, 16
5795; RV32I-NEXT:    slli ra, ra, 24
5796; RV32I-NEXT:    slli s10, s10, 8
5797; RV32I-NEXT:    slli s11, s11, 16
5798; RV32I-NEXT:    slli a0, a0, 24
5799; RV32I-NEXT:    slli a1, a1, 3
5800; RV32I-NEXT:    or a5, a7, a5
5801; RV32I-NEXT:    or a3, t2, a3
5802; RV32I-NEXT:    or a7, t4, t3
5803; RV32I-NEXT:    or a4, t5, a4
5804; RV32I-NEXT:    or s0, s1, s0
5805; RV32I-NEXT:    or t2, s7, t6
5806; RV32I-NEXT:    or t3, ra, s8
5807; RV32I-NEXT:    or t4, s10, s9
5808; RV32I-NEXT:    or t5, a0, s11
5809; RV32I-NEXT:    srai a0, a0, 31
5810; RV32I-NEXT:    andi a1, a1, 24
5811; RV32I-NEXT:    or a6, t0, a6
5812; RV32I-NEXT:    or t0, s3, t1
5813; RV32I-NEXT:    or t1, s5, s4
5814; RV32I-NEXT:    or a5, a5, s2
5815; RV32I-NEXT:    or a3, a7, a3
5816; RV32I-NEXT:    or a4, s0, a4
5817; RV32I-NEXT:    or a7, t3, t2
5818; RV32I-NEXT:    or t2, t5, t4
5819; RV32I-NEXT:    sw a0, 56(sp)
5820; RV32I-NEXT:    sw a0, 60(sp)
5821; RV32I-NEXT:    sw a0, 64(sp)
5822; RV32I-NEXT:    sw a0, 68(sp)
5823; RV32I-NEXT:    sw a0, 40(sp)
5824; RV32I-NEXT:    sw a0, 44(sp)
5825; RV32I-NEXT:    sw a0, 48(sp)
5826; RV32I-NEXT:    sw a0, 52(sp)
5827; RV32I-NEXT:    add s6, s6, a1
5828; RV32I-NEXT:    sw a3, 24(sp)
5829; RV32I-NEXT:    sw a4, 28(sp)
5830; RV32I-NEXT:    sw a7, 32(sp)
5831; RV32I-NEXT:    sw t2, 36(sp)
5832; RV32I-NEXT:    sw a6, 8(sp)
5833; RV32I-NEXT:    sw t0, 12(sp)
5834; RV32I-NEXT:    sw t1, 16(sp)
5835; RV32I-NEXT:    sw a5, 20(sp)
5836; RV32I-NEXT:    lw a6, 16(s6)
5837; RV32I-NEXT:    lw a5, 20(s6)
5838; RV32I-NEXT:    lw a7, 24(s6)
5839; RV32I-NEXT:    lw a1, 0(s6)
5840; RV32I-NEXT:    lw a0, 4(s6)
5841; RV32I-NEXT:    lw a4, 8(s6)
5842; RV32I-NEXT:    lw a3, 12(s6)
5843; RV32I-NEXT:    lw t0, 28(s6)
5844; RV32I-NEXT:    srli t1, a7, 24
5845; RV32I-NEXT:    srli t2, a7, 16
5846; RV32I-NEXT:    srli t3, a7, 8
5847; RV32I-NEXT:    srli t4, t0, 24
5848; RV32I-NEXT:    srli t5, t0, 16
5849; RV32I-NEXT:    srli t6, t0, 8
5850; RV32I-NEXT:    srli s0, a6, 24
5851; RV32I-NEXT:    srli s1, a6, 16
5852; RV32I-NEXT:    srli s2, a6, 8
5853; RV32I-NEXT:    srli s3, a5, 24
5854; RV32I-NEXT:    srli s4, a5, 16
5855; RV32I-NEXT:    srli s5, a5, 8
5856; RV32I-NEXT:    srli s6, a4, 24
5857; RV32I-NEXT:    srli s7, a4, 16
5858; RV32I-NEXT:    srli s8, a4, 8
5859; RV32I-NEXT:    srli s9, a3, 24
5860; RV32I-NEXT:    srli s10, a3, 16
5861; RV32I-NEXT:    srli s11, a3, 8
5862; RV32I-NEXT:    srli ra, a1, 24
5863; RV32I-NEXT:    sb a7, 24(a2)
5864; RV32I-NEXT:    sb t3, 25(a2)
5865; RV32I-NEXT:    sb t2, 26(a2)
5866; RV32I-NEXT:    sb t1, 27(a2)
5867; RV32I-NEXT:    srli a7, a1, 16
5868; RV32I-NEXT:    sb t0, 28(a2)
5869; RV32I-NEXT:    sb t6, 29(a2)
5870; RV32I-NEXT:    sb t5, 30(a2)
5871; RV32I-NEXT:    sb t4, 31(a2)
5872; RV32I-NEXT:    srli t0, a1, 8
5873; RV32I-NEXT:    sb a6, 16(a2)
5874; RV32I-NEXT:    sb s2, 17(a2)
5875; RV32I-NEXT:    sb s1, 18(a2)
5876; RV32I-NEXT:    sb s0, 19(a2)
5877; RV32I-NEXT:    srli a6, a0, 24
5878; RV32I-NEXT:    sb a5, 20(a2)
5879; RV32I-NEXT:    sb s5, 21(a2)
5880; RV32I-NEXT:    sb s4, 22(a2)
5881; RV32I-NEXT:    sb s3, 23(a2)
5882; RV32I-NEXT:    srli a5, a0, 16
5883; RV32I-NEXT:    sb a4, 8(a2)
5884; RV32I-NEXT:    sb s8, 9(a2)
5885; RV32I-NEXT:    sb s7, 10(a2)
5886; RV32I-NEXT:    sb s6, 11(a2)
5887; RV32I-NEXT:    srli a4, a0, 8
5888; RV32I-NEXT:    sb a3, 12(a2)
5889; RV32I-NEXT:    sb s11, 13(a2)
5890; RV32I-NEXT:    sb s10, 14(a2)
5891; RV32I-NEXT:    sb s9, 15(a2)
5892; RV32I-NEXT:    sb a1, 0(a2)
5893; RV32I-NEXT:    sb t0, 1(a2)
5894; RV32I-NEXT:    sb a7, 2(a2)
5895; RV32I-NEXT:    sb ra, 3(a2)
5896; RV32I-NEXT:    sb a0, 4(a2)
5897; RV32I-NEXT:    sb a4, 5(a2)
5898; RV32I-NEXT:    sb a5, 6(a2)
5899; RV32I-NEXT:    sb a6, 7(a2)
5900; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
5901; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
5902; RV32I-NEXT:    lw s1, 116(sp) # 4-byte Folded Reload
5903; RV32I-NEXT:    lw s2, 112(sp) # 4-byte Folded Reload
5904; RV32I-NEXT:    lw s3, 108(sp) # 4-byte Folded Reload
5905; RV32I-NEXT:    lw s4, 104(sp) # 4-byte Folded Reload
5906; RV32I-NEXT:    lw s5, 100(sp) # 4-byte Folded Reload
5907; RV32I-NEXT:    lw s6, 96(sp) # 4-byte Folded Reload
5908; RV32I-NEXT:    lw s7, 92(sp) # 4-byte Folded Reload
5909; RV32I-NEXT:    lw s8, 88(sp) # 4-byte Folded Reload
5910; RV32I-NEXT:    lw s9, 84(sp) # 4-byte Folded Reload
5911; RV32I-NEXT:    lw s10, 80(sp) # 4-byte Folded Reload
5912; RV32I-NEXT:    lw s11, 76(sp) # 4-byte Folded Reload
5913; RV32I-NEXT:    addi sp, sp, 128
5914; RV32I-NEXT:    ret
5915  %src = load i256, ptr %src.ptr, align 1
5916  %dwordOff = load i256, ptr %dwordOff.ptr, align 1
5917  %bitOff = shl i256 %dwordOff, 6
5918  %res = ashr i256 %src, %bitOff
5919  store i256 %res, ptr %dst, align 1
5920  ret void
5921}
5922