xref: /llvm-project/llvm/test/CodeGen/RISCV/rv64xtheadba.ll (revision c557ce9f27feccdbda3588555fcb3303d1f81935)
1e25b30d9SPhilipp Tomsich; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub
2e25b30d9SPhilipp Tomsich; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
3cd3c1658SCraig Topper; RUN:   | FileCheck %s -check-prefixes=CHECK,RV64I
4e25b30d9SPhilipp Tomsich; RUN: llc -mtriple=riscv64 -mattr=+m,+xtheadba -verify-machineinstrs < %s \
5cd3c1658SCraig Topper; RUN:   | FileCheck %s -check-prefixes=CHECK,RV64XTHEADBA
6e25b30d9SPhilipp Tomsich
7e25b30d9SPhilipp Tomsichdefine signext i16 @th_addsl_1(i64 %0, ptr %1) {
8e25b30d9SPhilipp Tomsich; RV64I-LABEL: th_addsl_1:
9e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
10e25b30d9SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 1
11e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a1, a0
12e25b30d9SPhilipp Tomsich; RV64I-NEXT:    lh a0, 0(a0)
13e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
14e25b30d9SPhilipp Tomsich;
15e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: th_addsl_1:
16e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
17e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
18e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    lh a0, 0(a0)
19e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
20e25b30d9SPhilipp Tomsich  %3 = getelementptr inbounds i16, ptr %1, i64 %0
21e25b30d9SPhilipp Tomsich  %4 = load i16, ptr %3
22e25b30d9SPhilipp Tomsich  ret i16 %4
23e25b30d9SPhilipp Tomsich}
24e25b30d9SPhilipp Tomsich
25e25b30d9SPhilipp Tomsichdefine signext i32 @th_addsl_2(i64 %0, ptr %1) {
26e25b30d9SPhilipp Tomsich; RV64I-LABEL: th_addsl_2:
27e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
28e25b30d9SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 2
29e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a1, a0
30e25b30d9SPhilipp Tomsich; RV64I-NEXT:    lw a0, 0(a0)
31e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
32e25b30d9SPhilipp Tomsich;
33e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: th_addsl_2:
34e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
35e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
36e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
37e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
38e25b30d9SPhilipp Tomsich  %3 = getelementptr inbounds i32, ptr %1, i64 %0
39e25b30d9SPhilipp Tomsich  %4 = load i32, ptr %3
40e25b30d9SPhilipp Tomsich  ret i32 %4
41e25b30d9SPhilipp Tomsich}
42e25b30d9SPhilipp Tomsich
43e25b30d9SPhilipp Tomsichdefine i64 @th_addsl_3(i64 %0, ptr %1) {
44e25b30d9SPhilipp Tomsich; RV64I-LABEL: th_addsl_3:
45e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
46e25b30d9SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 3
47e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a1, a0
48e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ld a0, 0(a0)
49e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
50e25b30d9SPhilipp Tomsich;
51e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: th_addsl_3:
52e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
53e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
54e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
55e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
56e25b30d9SPhilipp Tomsich  %3 = getelementptr inbounds i64, ptr %1, i64 %0
57e25b30d9SPhilipp Tomsich  %4 = load i64, ptr %3
58e25b30d9SPhilipp Tomsich  ret i64 %4
59e25b30d9SPhilipp Tomsich}
60e25b30d9SPhilipp Tomsich
61e25b30d9SPhilipp Tomsich; Type legalization inserts a sext_inreg after the first add. That add will be
62e25b30d9SPhilipp Tomsich; selected as th.addsl which does not sign extend. SimplifyDemandedBits is unable
63e25b30d9SPhilipp Tomsich; to remove the sext_inreg because it has multiple uses. The ashr will use the
64e25b30d9SPhilipp Tomsich; sext_inreg to become sraiw. This leaves the sext_inreg only used by the shl.
65e25b30d9SPhilipp Tomsich; If the shl is selected as sllw, we don't need the sext_inreg.
66e25b30d9SPhilipp Tomsichdefine i64 @th_addsl_2_extra_sext(i32 %x, i32 %y, i32 %z) {
67e25b30d9SPhilipp Tomsich; RV64I-LABEL: th_addsl_2_extra_sext:
68e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
69e25b30d9SPhilipp Tomsich; RV64I-NEXT:    slli a0, a0, 2
70e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
71e25b30d9SPhilipp Tomsich; RV64I-NEXT:    sllw a1, a2, a0
72e25b30d9SPhilipp Tomsich; RV64I-NEXT:    sraiw a0, a0, 2
73e25b30d9SPhilipp Tomsich; RV64I-NEXT:    mul a0, a1, a0
74e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
75e25b30d9SPhilipp Tomsich;
76e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: th_addsl_2_extra_sext:
77e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
78e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
79e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    sllw a1, a2, a0
80e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    sraiw a0, a0, 2
81e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    mul a0, a1, a0
82e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
83e25b30d9SPhilipp Tomsich  %a = shl i32 %x, 2
84e25b30d9SPhilipp Tomsich  %b = add i32 %a, %y
85e25b30d9SPhilipp Tomsich  %c = shl i32 %z, %b
86e25b30d9SPhilipp Tomsich  %d = ashr i32 %b, 2
87e25b30d9SPhilipp Tomsich  %e = sext i32 %c to i64
88e25b30d9SPhilipp Tomsich  %f = sext i32 %d to i64
89e25b30d9SPhilipp Tomsich  %g = mul i64 %e, %f
90e25b30d9SPhilipp Tomsich  ret i64 %g
91e25b30d9SPhilipp Tomsich}
92e25b30d9SPhilipp Tomsich
93e25b30d9SPhilipp Tomsichdefine i64 @addmul6(i64 %a, i64 %b) {
94e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul6:
95e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
963e55ac94SPhilip Reames; RV64I-NEXT:    slli a2, a0, 1
973e55ac94SPhilip Reames; RV64I-NEXT:    slli a0, a0, 3
983e55ac94SPhilip Reames; RV64I-NEXT:    sub a0, a0, a2
99e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
100e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
101e25b30d9SPhilipp Tomsich;
102e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul6:
103e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
104e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
105e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
106e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
107e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 6
108e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
109e25b30d9SPhilipp Tomsich  ret i64 %d
110e25b30d9SPhilipp Tomsich}
111e25b30d9SPhilipp Tomsich
112*c557ce9fSCraig Topperdefine i64 @disjointormul6(i64 %a, i64 %b) {
113*c557ce9fSCraig Topper; RV64I-LABEL: disjointormul6:
114*c557ce9fSCraig Topper; RV64I:       # %bb.0:
115*c557ce9fSCraig Topper; RV64I-NEXT:    slli a2, a0, 1
116*c557ce9fSCraig Topper; RV64I-NEXT:    slli a0, a0, 3
117*c557ce9fSCraig Topper; RV64I-NEXT:    sub a0, a0, a2
118*c557ce9fSCraig Topper; RV64I-NEXT:    or a0, a0, a1
119*c557ce9fSCraig Topper; RV64I-NEXT:    ret
120*c557ce9fSCraig Topper;
121*c557ce9fSCraig Topper; RV64XTHEADBA-LABEL: disjointormul6:
122*c557ce9fSCraig Topper; RV64XTHEADBA:       # %bb.0:
123*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
124*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
125*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT:    ret
126*c557ce9fSCraig Topper  %c = mul i64 %a, 6
127*c557ce9fSCraig Topper  %d = or disjoint i64 %c, %b
128*c557ce9fSCraig Topper  ret i64 %d
129*c557ce9fSCraig Topper}
130*c557ce9fSCraig Topper
131e25b30d9SPhilipp Tomsichdefine i64 @addmul10(i64 %a, i64 %b) {
132e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul10:
133e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
134e25b30d9SPhilipp Tomsich; RV64I-NEXT:    li a2, 10
135e25b30d9SPhilipp Tomsich; RV64I-NEXT:    mul a0, a0, a2
136e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
137e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
138e25b30d9SPhilipp Tomsich;
139e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul10:
140e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
141e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
142e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
143e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
144e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 10
145e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
146e25b30d9SPhilipp Tomsich  ret i64 %d
147e25b30d9SPhilipp Tomsich}
148e25b30d9SPhilipp Tomsich
149e25b30d9SPhilipp Tomsichdefine i64 @addmul12(i64 %a, i64 %b) {
150e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul12:
151e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
1523e55ac94SPhilip Reames; RV64I-NEXT:    slli a2, a0, 2
1533e55ac94SPhilip Reames; RV64I-NEXT:    slli a0, a0, 4
1543e55ac94SPhilip Reames; RV64I-NEXT:    sub a0, a0, a2
155e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
156e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
157e25b30d9SPhilipp Tomsich;
158e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul12:
159e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
160e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
161e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
162e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
163e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 12
164e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
165e25b30d9SPhilipp Tomsich  ret i64 %d
166e25b30d9SPhilipp Tomsich}
167e25b30d9SPhilipp Tomsich
168e25b30d9SPhilipp Tomsichdefine i64 @addmul18(i64 %a, i64 %b) {
169e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul18:
170e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
171e25b30d9SPhilipp Tomsich; RV64I-NEXT:    li a2, 18
172e25b30d9SPhilipp Tomsich; RV64I-NEXT:    mul a0, a0, a2
173e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
174e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
175e25b30d9SPhilipp Tomsich;
176e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul18:
177e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
178e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
179e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
180e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
181e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 18
182e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
183e25b30d9SPhilipp Tomsich  ret i64 %d
184e25b30d9SPhilipp Tomsich}
185e25b30d9SPhilipp Tomsich
186e25b30d9SPhilipp Tomsichdefine i64 @addmul20(i64 %a, i64 %b) {
187e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul20:
188e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
189e25b30d9SPhilipp Tomsich; RV64I-NEXT:    li a2, 20
190e25b30d9SPhilipp Tomsich; RV64I-NEXT:    mul a0, a0, a2
191e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
192e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
193e25b30d9SPhilipp Tomsich;
194e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul20:
195e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
196e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
197e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
198e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
199e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 20
200e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
201e25b30d9SPhilipp Tomsich  ret i64 %d
202e25b30d9SPhilipp Tomsich}
203e25b30d9SPhilipp Tomsich
204cd3c1658SCraig Topperdefine i64 @addmul22(i64 %a, i64 %b) {
205cd3c1658SCraig Topper; CHECK-LABEL: addmul22:
206cd3c1658SCraig Topper; CHECK:       # %bb.0:
207cd3c1658SCraig Topper; CHECK-NEXT:    li a2, 22
208cd3c1658SCraig Topper; CHECK-NEXT:    mul a0, a0, a2
209cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
210cd3c1658SCraig Topper; CHECK-NEXT:    ret
211cd3c1658SCraig Topper  %c = mul i64 %a, 22
212cd3c1658SCraig Topper  %d = add i64 %c, %b
213cd3c1658SCraig Topper  ret i64 %d
214cd3c1658SCraig Topper}
215cd3c1658SCraig Topper
216e25b30d9SPhilipp Tomsichdefine i64 @addmul24(i64 %a, i64 %b) {
217e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul24:
218e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
2193e55ac94SPhilip Reames; RV64I-NEXT:    slli a2, a0, 3
2203e55ac94SPhilip Reames; RV64I-NEXT:    slli a0, a0, 5
2213e55ac94SPhilip Reames; RV64I-NEXT:    sub a0, a0, a2
222e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
223e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
224e25b30d9SPhilipp Tomsich;
225e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul24:
226e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
227e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
228e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
229e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
230e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 24
231e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
232e25b30d9SPhilipp Tomsich  ret i64 %d
233e25b30d9SPhilipp Tomsich}
234e25b30d9SPhilipp Tomsich
235e25b30d9SPhilipp Tomsichdefine i64 @addmul36(i64 %a, i64 %b) {
236e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul36:
237e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
238e25b30d9SPhilipp Tomsich; RV64I-NEXT:    li a2, 36
239e25b30d9SPhilipp Tomsich; RV64I-NEXT:    mul a0, a0, a2
240e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
241e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
242e25b30d9SPhilipp Tomsich;
243e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul36:
244e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
245e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
246e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
247e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
248e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 36
249e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
250e25b30d9SPhilipp Tomsich  ret i64 %d
251e25b30d9SPhilipp Tomsich}
252e25b30d9SPhilipp Tomsich
253e25b30d9SPhilipp Tomsichdefine i64 @addmul40(i64 %a, i64 %b) {
254e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul40:
255e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
256e25b30d9SPhilipp Tomsich; RV64I-NEXT:    li a2, 40
257e25b30d9SPhilipp Tomsich; RV64I-NEXT:    mul a0, a0, a2
258e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
259e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
260e25b30d9SPhilipp Tomsich;
261e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul40:
262e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
263e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
264e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
265e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
266e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 40
267e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
268e25b30d9SPhilipp Tomsich  ret i64 %d
269e25b30d9SPhilipp Tomsich}
270e25b30d9SPhilipp Tomsich
271e25b30d9SPhilipp Tomsichdefine i64 @addmul72(i64 %a, i64 %b) {
272e25b30d9SPhilipp Tomsich; RV64I-LABEL: addmul72:
273e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
274e25b30d9SPhilipp Tomsich; RV64I-NEXT:    li a2, 72
275e25b30d9SPhilipp Tomsich; RV64I-NEXT:    mul a0, a0, a2
276e25b30d9SPhilipp Tomsich; RV64I-NEXT:    add a0, a0, a1
277e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
278e25b30d9SPhilipp Tomsich;
279e25b30d9SPhilipp Tomsich; RV64XTHEADBA-LABEL: addmul72:
280e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
281e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
282e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
283e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
284e25b30d9SPhilipp Tomsich  %c = mul i64 %a, 72
285e25b30d9SPhilipp Tomsich  %d = add i64 %c, %b
286e25b30d9SPhilipp Tomsich  ret i64 %d
287e25b30d9SPhilipp Tomsich}
288e25b30d9SPhilipp Tomsich
289cd3c1658SCraig Topperdefine i64 @mul50(i64 %a) {
290cd3c1658SCraig Topper; RV64I-LABEL: mul50:
291cd3c1658SCraig Topper; RV64I:       # %bb.0:
292cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 50
293cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
294cd3c1658SCraig Topper; RV64I-NEXT:    ret
295cd3c1658SCraig Topper;
296cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul50:
297cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
298cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
299cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
300cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 1
301cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
302cd3c1658SCraig Topper  %c = mul i64 %a, 50
303cd3c1658SCraig Topper  ret i64 %c
304cd3c1658SCraig Topper}
305cd3c1658SCraig Topper
306cd3c1658SCraig Topperdefine i64 @addmul50(i64 %a, i64 %b) {
307cd3c1658SCraig Topper; RV64I-LABEL: addmul50:
308cd3c1658SCraig Topper; RV64I:       # %bb.0:
309cd3c1658SCraig Topper; RV64I-NEXT:    li a2, 50
310cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a2
311cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
312cd3c1658SCraig Topper; RV64I-NEXT:    ret
313cd3c1658SCraig Topper;
314cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul50:
315cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
316cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
317cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
318cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
319cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
320cd3c1658SCraig Topper  %c = mul i64 %a, 50
321cd3c1658SCraig Topper  %d = add i64 %c, %b
322cd3c1658SCraig Topper  ret i64 %d
323cd3c1658SCraig Topper}
324cd3c1658SCraig Topper
325cd3c1658SCraig Topperdefine i64 @mul100(i64 %a) {
326cd3c1658SCraig Topper; RV64I-LABEL: mul100:
327cd3c1658SCraig Topper; RV64I:       # %bb.0:
328cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 100
329cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
330cd3c1658SCraig Topper; RV64I-NEXT:    ret
331cd3c1658SCraig Topper;
332cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul100:
333cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
334cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
335cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
336cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 2
337cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
338cd3c1658SCraig Topper  %c = mul i64 %a, 100
339cd3c1658SCraig Topper  ret i64 %c
340cd3c1658SCraig Topper}
341cd3c1658SCraig Topper
342cd3c1658SCraig Topperdefine i64 @addmul100(i64 %a, i64 %b) {
343cd3c1658SCraig Topper; RV64I-LABEL: addmul100:
344cd3c1658SCraig Topper; RV64I:       # %bb.0:
345cd3c1658SCraig Topper; RV64I-NEXT:    li a2, 100
346cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a2
347cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
348cd3c1658SCraig Topper; RV64I-NEXT:    ret
349cd3c1658SCraig Topper;
350cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul100:
351cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
352cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
353cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
354cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
355cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
356cd3c1658SCraig Topper  %c = mul i64 %a, 100
357cd3c1658SCraig Topper  %d = add i64 %c, %b
358cd3c1658SCraig Topper  ret i64 %d
359cd3c1658SCraig Topper}
360cd3c1658SCraig Topper
361cd3c1658SCraig Topperdefine i64 @mul162(i64 %a) {
362cd3c1658SCraig Topper; RV64I-LABEL: mul162:
363cd3c1658SCraig Topper; RV64I:       # %bb.0:
364cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 162
365cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
366cd3c1658SCraig Topper; RV64I-NEXT:    ret
367cd3c1658SCraig Topper;
368cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul162:
369cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
370cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
371cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
372cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 1
373cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
374cd3c1658SCraig Topper  %c = mul i64 %a, 162
375cd3c1658SCraig Topper  ret i64 %c
376cd3c1658SCraig Topper}
377cd3c1658SCraig Topper
378cd3c1658SCraig Topperdefine i64 @addmul162(i64 %a, i64 %b) {
379cd3c1658SCraig Topper; RV64I-LABEL: addmul162:
380cd3c1658SCraig Topper; RV64I:       # %bb.0:
381cd3c1658SCraig Topper; RV64I-NEXT:    li a2, 162
382cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a2
383cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
384cd3c1658SCraig Topper; RV64I-NEXT:    ret
385cd3c1658SCraig Topper;
386cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul162:
387cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
388cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
389cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
390cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
391cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
392cd3c1658SCraig Topper  %c = mul i64 %a, 162
393cd3c1658SCraig Topper  %d = add i64 %c, %b
394cd3c1658SCraig Topper  ret i64 %d
395cd3c1658SCraig Topper}
396cd3c1658SCraig Topper
397cd3c1658SCraig Topperdefine i64 @mul180(i64 %a) {
398cd3c1658SCraig Topper; RV64I-LABEL: mul180:
399cd3c1658SCraig Topper; RV64I:       # %bb.0:
400cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 180
401cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
402cd3c1658SCraig Topper; RV64I-NEXT:    ret
403cd3c1658SCraig Topper;
404cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul180:
405cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
406cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
407cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
408cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 2
409cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
410cd3c1658SCraig Topper  %c = mul i64 %a, 180
411cd3c1658SCraig Topper  ret i64 %c
412cd3c1658SCraig Topper}
413cd3c1658SCraig Topper
414cd3c1658SCraig Topperdefine i64 @addmul180(i64 %a, i64 %b) {
415cd3c1658SCraig Topper; RV64I-LABEL: addmul180:
416cd3c1658SCraig Topper; RV64I:       # %bb.0:
417cd3c1658SCraig Topper; RV64I-NEXT:    li a2, 180
418cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a2
419cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
420cd3c1658SCraig Topper; RV64I-NEXT:    ret
421cd3c1658SCraig Topper;
422cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul180:
423cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
424cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
425cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
426cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
427cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
428cd3c1658SCraig Topper  %c = mul i64 %a, 180
429cd3c1658SCraig Topper  %d = add i64 %c, %b
430cd3c1658SCraig Topper  ret i64 %d
431cd3c1658SCraig Topper}
432cd3c1658SCraig Topper
433cd3c1658SCraig Topperdefine i64 @add255mul180(i64 %a) {
434cd3c1658SCraig Topper; RV64I-LABEL: add255mul180:
435cd3c1658SCraig Topper; RV64I:       # %bb.0:
436cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 180
437cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
438cd3c1658SCraig Topper; RV64I-NEXT:    addi a0, a0, 255
439cd3c1658SCraig Topper; RV64I-NEXT:    ret
440cd3c1658SCraig Topper;
441cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: add255mul180:
442cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
443cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
444cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
445*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 2
446*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT:    addi a0, a0, 255
447cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
448cd3c1658SCraig Topper  %c = mul i64 %a, 180
449cd3c1658SCraig Topper  %d = add i64 %c, 255
450cd3c1658SCraig Topper  ret i64 %d
451cd3c1658SCraig Topper}
452cd3c1658SCraig Topper
453cd3c1658SCraig Topperdefine i64 @mul200(i64 %a) {
454cd3c1658SCraig Topper; RV64I-LABEL: mul200:
455cd3c1658SCraig Topper; RV64I:       # %bb.0:
456cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 200
457cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
458cd3c1658SCraig Topper; RV64I-NEXT:    ret
459cd3c1658SCraig Topper;
460cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul200:
461cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
462cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
463cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
464cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 3
465cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
466cd3c1658SCraig Topper  %c = mul i64 %a, 200
467cd3c1658SCraig Topper  ret i64 %c
468cd3c1658SCraig Topper}
469cd3c1658SCraig Topper
470cd3c1658SCraig Topperdefine i64 @addmul200(i64 %a, i64 %b) {
471cd3c1658SCraig Topper; RV64I-LABEL: addmul200:
472cd3c1658SCraig Topper; RV64I:       # %bb.0:
473cd3c1658SCraig Topper; RV64I-NEXT:    li a2, 200
474cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a2
475cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
476cd3c1658SCraig Topper; RV64I-NEXT:    ret
477cd3c1658SCraig Topper;
478cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: addmul200:
479cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
480cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
481cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
482cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
483cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
484cd3c1658SCraig Topper  %c = mul i64 %a, 200
485cd3c1658SCraig Topper  %d = add i64 %c, %b
486cd3c1658SCraig Topper  ret i64 %d
487cd3c1658SCraig Topper}
488cd3c1658SCraig Topper
489cd3c1658SCraig Topperdefine i64 @addmul4096(i64 %a, i64 %b) {
490cd3c1658SCraig Topper; CHECK-LABEL: addmul4096:
491cd3c1658SCraig Topper; CHECK:       # %bb.0:
492cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 12
493cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
494cd3c1658SCraig Topper; CHECK-NEXT:    ret
495cd3c1658SCraig Topper  %c = mul i64 %a, 4096
496cd3c1658SCraig Topper  %d = add i64 %c, %b
497cd3c1658SCraig Topper  ret i64 %d
498cd3c1658SCraig Topper}
499cd3c1658SCraig Topper
500cd3c1658SCraig Topperdefine i64 @addmul4230(i64 %a, i64 %b) {
501cd3c1658SCraig Topper; CHECK-LABEL: addmul4230:
502cd3c1658SCraig Topper; CHECK:       # %bb.0:
503cd3c1658SCraig Topper; CHECK-NEXT:    lui a2, 1
504cd3c1658SCraig Topper; CHECK-NEXT:    addiw a2, a2, 134
505cd3c1658SCraig Topper; CHECK-NEXT:    mul a0, a0, a2
506cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
507cd3c1658SCraig Topper; CHECK-NEXT:    ret
508cd3c1658SCraig Topper  %c = mul i64 %a, 4230
509cd3c1658SCraig Topper  %d = add i64 %c, %b
510cd3c1658SCraig Topper  ret i64 %d
511cd3c1658SCraig Topper}
512cd3c1658SCraig Topper
513cd3c1658SCraig Topperdefine i64 @mul96(i64 %a) {
514cd3c1658SCraig Topper; RV64I-LABEL: mul96:
515cd3c1658SCraig Topper; RV64I:       # %bb.0:
516cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a0, 5
517cd3c1658SCraig Topper; RV64I-NEXT:    slli a0, a0, 7
518cd3c1658SCraig Topper; RV64I-NEXT:    sub a0, a0, a1
519cd3c1658SCraig Topper; RV64I-NEXT:    ret
520cd3c1658SCraig Topper;
521cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul96:
522cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
523cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
524cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 5
525cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
526cd3c1658SCraig Topper  %c = mul i64 %a, 96
527cd3c1658SCraig Topper  ret i64 %c
528cd3c1658SCraig Topper}
529cd3c1658SCraig Topper
530cd3c1658SCraig Topperdefine i64 @mul119(i64 %a) {
531cd3c1658SCraig Topper; RV64I-LABEL: mul119:
532cd3c1658SCraig Topper; RV64I:       # %bb.0:
533cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 119
534cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
535cd3c1658SCraig Topper; RV64I-NEXT:    ret
536cd3c1658SCraig Topper;
537cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul119:
538cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
539cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 3
540cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 7
541cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    sub a0, a0, a1
542cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
543cd3c1658SCraig Topper  %c = mul i64 %a, 119
544cd3c1658SCraig Topper  ret i64 %c
545cd3c1658SCraig Topper}
546cd3c1658SCraig Topper
547cd3c1658SCraig Topperdefine i64 @mul123(i64 %a) {
548cd3c1658SCraig Topper; RV64I-LABEL: mul123:
549cd3c1658SCraig Topper; RV64I:       # %bb.0:
550cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 123
551cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
552cd3c1658SCraig Topper; RV64I-NEXT:    ret
553cd3c1658SCraig Topper;
554cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul123:
555cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
556cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 2
557cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 7
558cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    sub a0, a0, a1
559cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
560cd3c1658SCraig Topper  %c = mul i64 %a, 123
561cd3c1658SCraig Topper  ret i64 %c
562cd3c1658SCraig Topper}
563cd3c1658SCraig Topper
564cd3c1658SCraig Topperdefine i64 @mul125(i64 %a) {
565cd3c1658SCraig Topper; RV64I-LABEL: mul125:
566cd3c1658SCraig Topper; RV64I:       # %bb.0:
567cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 125
568cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
569cd3c1658SCraig Topper; RV64I-NEXT:    ret
570cd3c1658SCraig Topper;
571cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul125:
572cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
573cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 1
574cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 7
575cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    sub a0, a0, a1
576cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
577cd3c1658SCraig Topper  %c = mul i64 %a, 125
578cd3c1658SCraig Topper  ret i64 %c
579cd3c1658SCraig Topper}
580cd3c1658SCraig Topper
581cd3c1658SCraig Topperdefine i64 @mul131(i64 %a) {
582cd3c1658SCraig Topper; RV64I-LABEL: mul131:
583cd3c1658SCraig Topper; RV64I:       # %bb.0:
584cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 131
585cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
586cd3c1658SCraig Topper; RV64I-NEXT:    ret
587cd3c1658SCraig Topper;
588cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul131:
589cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
590cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 1
591cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 7
592cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
593cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
594cd3c1658SCraig Topper  %c = mul i64 %a, 131
595cd3c1658SCraig Topper  ret i64 %c
596cd3c1658SCraig Topper}
597cd3c1658SCraig Topper
598cd3c1658SCraig Topperdefine i64 @mul133(i64 %a) {
599cd3c1658SCraig Topper; RV64I-LABEL: mul133:
600cd3c1658SCraig Topper; RV64I:       # %bb.0:
601cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 133
602cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
603cd3c1658SCraig Topper; RV64I-NEXT:    ret
604cd3c1658SCraig Topper;
605cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul133:
606cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
607cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 2
608cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 7
609cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
610cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
611cd3c1658SCraig Topper  %c = mul i64 %a, 133
612cd3c1658SCraig Topper  ret i64 %c
613cd3c1658SCraig Topper}
614cd3c1658SCraig Topper
615cd3c1658SCraig Topperdefine i64 @mul137(i64 %a) {
616cd3c1658SCraig Topper; RV64I-LABEL: mul137:
617cd3c1658SCraig Topper; RV64I:       # %bb.0:
618cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 137
619cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
620cd3c1658SCraig Topper; RV64I-NEXT:    ret
621cd3c1658SCraig Topper;
622cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul137:
623cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
624cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 3
625cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 7
626cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
627cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
628cd3c1658SCraig Topper  %c = mul i64 %a, 137
629cd3c1658SCraig Topper  ret i64 %c
630cd3c1658SCraig Topper}
631cd3c1658SCraig Topper
632cd3c1658SCraig Topperdefine i64 @mul160(i64 %a) {
633cd3c1658SCraig Topper; RV64I-LABEL: mul160:
634cd3c1658SCraig Topper; RV64I:       # %bb.0:
635cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 160
636cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
637cd3c1658SCraig Topper; RV64I-NEXT:    ret
638cd3c1658SCraig Topper;
639cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul160:
640cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
641cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
642cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 5
643cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
644cd3c1658SCraig Topper  %c = mul i64 %a, 160
645cd3c1658SCraig Topper  ret i64 %c
646cd3c1658SCraig Topper}
647cd3c1658SCraig Topper
648cd3c1658SCraig Topperdefine i64 @mul288(i64 %a) {
649cd3c1658SCraig Topper; RV64I-LABEL: mul288:
650cd3c1658SCraig Topper; RV64I:       # %bb.0:
651cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 288
652cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
653cd3c1658SCraig Topper; RV64I-NEXT:    ret
654cd3c1658SCraig Topper;
655cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul288:
656cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
657cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
658cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a0, a0, 5
659cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
660cd3c1658SCraig Topper  %c = mul i64 %a, 288
661cd3c1658SCraig Topper  ret i64 %c
662cd3c1658SCraig Topper}
663cd3c1658SCraig Topper
664*c557ce9fSCraig Topperdefine i64 @sh1add_imm(i64 %0) {
665*c557ce9fSCraig Topper; CHECK-LABEL: sh1add_imm:
666*c557ce9fSCraig Topper; CHECK:       # %bb.0:
667*c557ce9fSCraig Topper; CHECK-NEXT:    slli a0, a0, 1
668*c557ce9fSCraig Topper; CHECK-NEXT:    addi a0, a0, 5
669*c557ce9fSCraig Topper; CHECK-NEXT:    ret
670*c557ce9fSCraig Topper  %a = shl i64 %0, 1
671*c557ce9fSCraig Topper  %b = add i64 %a, 5
672*c557ce9fSCraig Topper  ret i64 %b
673*c557ce9fSCraig Topper}
674*c557ce9fSCraig Topper
675*c557ce9fSCraig Topperdefine i64 @sh2add_imm(i64 %0) {
676*c557ce9fSCraig Topper; CHECK-LABEL: sh2add_imm:
677*c557ce9fSCraig Topper; CHECK:       # %bb.0:
678*c557ce9fSCraig Topper; CHECK-NEXT:    slli a0, a0, 2
679*c557ce9fSCraig Topper; CHECK-NEXT:    addi a0, a0, -6
680*c557ce9fSCraig Topper; CHECK-NEXT:    ret
681*c557ce9fSCraig Topper  %a = shl i64 %0, 2
682*c557ce9fSCraig Topper  %b = add i64 %a, -6
683*c557ce9fSCraig Topper  ret i64 %b
684*c557ce9fSCraig Topper}
685*c557ce9fSCraig Topper
686*c557ce9fSCraig Topperdefine i64 @sh3add_imm(i64 %0) {
687*c557ce9fSCraig Topper; CHECK-LABEL: sh3add_imm:
688*c557ce9fSCraig Topper; CHECK:       # %bb.0:
689*c557ce9fSCraig Topper; CHECK-NEXT:    slli a0, a0, 3
690*c557ce9fSCraig Topper; CHECK-NEXT:    addi a0, a0, 7
691*c557ce9fSCraig Topper; CHECK-NEXT:    ret
692*c557ce9fSCraig Topper  %a = shl i64 %0, 3
693*c557ce9fSCraig Topper  %b = add i64 %a, 7
694*c557ce9fSCraig Topper  ret i64 %b
695*c557ce9fSCraig Topper}
696*c557ce9fSCraig Topper
697cd3c1658SCraig Topperdefine i64 @mul258(i64 %a) {
698cd3c1658SCraig Topper; RV64I-LABEL: mul258:
699cd3c1658SCraig Topper; RV64I:       # %bb.0:
700cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 258
701cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
702cd3c1658SCraig Topper; RV64I-NEXT:    ret
703cd3c1658SCraig Topper;
704cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul258:
705cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
706cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a0, 8
707cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
708cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
709cd3c1658SCraig Topper  %c = mul i64 %a, 258
710cd3c1658SCraig Topper  ret i64 %c
711cd3c1658SCraig Topper}
712cd3c1658SCraig Topper
713cd3c1658SCraig Topperdefine i64 @mul260(i64 %a) {
714cd3c1658SCraig Topper; RV64I-LABEL: mul260:
715cd3c1658SCraig Topper; RV64I:       # %bb.0:
716cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 260
717cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
718cd3c1658SCraig Topper; RV64I-NEXT:    ret
719cd3c1658SCraig Topper;
720cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul260:
721cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
722cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a0, 8
723cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
724cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
725cd3c1658SCraig Topper  %c = mul i64 %a, 260
726cd3c1658SCraig Topper  ret i64 %c
727cd3c1658SCraig Topper}
728cd3c1658SCraig Topper
729cd3c1658SCraig Topperdefine i64 @mul264(i64 %a) {
730cd3c1658SCraig Topper; RV64I-LABEL: mul264:
731cd3c1658SCraig Topper; RV64I:       # %bb.0:
732cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 264
733cd3c1658SCraig Topper; RV64I-NEXT:    mul a0, a0, a1
734cd3c1658SCraig Topper; RV64I-NEXT:    ret
735cd3c1658SCraig Topper;
736cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul264:
737cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
738cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a0, 8
739cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
740cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
741cd3c1658SCraig Topper  %c = mul i64 %a, 264
742cd3c1658SCraig Topper  ret i64 %c
743cd3c1658SCraig Topper}
744282ab543SPhilip Reamesdefine i64 @mul11(i64 %a) {
745282ab543SPhilip Reames; RV64I-LABEL: mul11:
746282ab543SPhilip Reames; RV64I:       # %bb.0:
747282ab543SPhilip Reames; RV64I-NEXT:    li a1, 11
748282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
749282ab543SPhilip Reames; RV64I-NEXT:    ret
750282ab543SPhilip Reames;
751282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul11:
752282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
753282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 2
754282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 1
755282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
756282ab543SPhilip Reames  %c = mul i64 %a, 11
757282ab543SPhilip Reames  ret i64 %c
758282ab543SPhilip Reames}
759282ab543SPhilip Reames
760282ab543SPhilip Reamesdefine i64 @mul19(i64 %a) {
761282ab543SPhilip Reames; RV64I-LABEL: mul19:
762282ab543SPhilip Reames; RV64I:       # %bb.0:
763282ab543SPhilip Reames; RV64I-NEXT:    li a1, 19
764282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
765282ab543SPhilip Reames; RV64I-NEXT:    ret
766282ab543SPhilip Reames;
767282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul19:
768282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
769282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 3
770282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 1
771282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
772282ab543SPhilip Reames  %c = mul i64 %a, 19
773282ab543SPhilip Reames  ret i64 %c
774282ab543SPhilip Reames}
775282ab543SPhilip Reames
776282ab543SPhilip Reamesdefine i64 @mul13(i64 %a) {
777282ab543SPhilip Reames; RV64I-LABEL: mul13:
778282ab543SPhilip Reames; RV64I:       # %bb.0:
779282ab543SPhilip Reames; RV64I-NEXT:    li a1, 13
780282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
781282ab543SPhilip Reames; RV64I-NEXT:    ret
782282ab543SPhilip Reames;
783282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul13:
784282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
785282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 1
786282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
787282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
788282ab543SPhilip Reames  %c = mul i64 %a, 13
789282ab543SPhilip Reames  ret i64 %c
790282ab543SPhilip Reames}
791282ab543SPhilip Reames
792282ab543SPhilip Reamesdefine i64 @mul21(i64 %a) {
793282ab543SPhilip Reames; RV64I-LABEL: mul21:
794282ab543SPhilip Reames; RV64I:       # %bb.0:
795282ab543SPhilip Reames; RV64I-NEXT:    li a1, 21
796282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
797282ab543SPhilip Reames; RV64I-NEXT:    ret
798282ab543SPhilip Reames;
799282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul21:
800282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
801282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 2
802282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
803282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
804282ab543SPhilip Reames  %c = mul i64 %a, 21
805282ab543SPhilip Reames  ret i64 %c
806282ab543SPhilip Reames}
807282ab543SPhilip Reames
808282ab543SPhilip Reamesdefine i64 @mul37(i64 %a) {
809282ab543SPhilip Reames; RV64I-LABEL: mul37:
810282ab543SPhilip Reames; RV64I:       # %bb.0:
811282ab543SPhilip Reames; RV64I-NEXT:    li a1, 37
812282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
813282ab543SPhilip Reames; RV64I-NEXT:    ret
814282ab543SPhilip Reames;
815282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul37:
816282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
817282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 3
818282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
819282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
820282ab543SPhilip Reames  %c = mul i64 %a, 37
821282ab543SPhilip Reames  ret i64 %c
822282ab543SPhilip Reames}
823282ab543SPhilip Reames
824282ab543SPhilip Reamesdefine i64 @mul25(i64 %a) {
825282ab543SPhilip Reames; RV64I-LABEL: mul25:
826282ab543SPhilip Reames; RV64I:       # %bb.0:
827282ab543SPhilip Reames; RV64I-NEXT:    li a1, 25
828282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
829282ab543SPhilip Reames; RV64I-NEXT:    ret
830282ab543SPhilip Reames;
831282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul25:
832282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
833282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
834282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
835282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
836282ab543SPhilip Reames  %c = mul i64 %a, 25
837282ab543SPhilip Reames  ret i64 %c
838282ab543SPhilip Reames}
839282ab543SPhilip Reames
840282ab543SPhilip Reamesdefine i64 @mul41(i64 %a) {
841282ab543SPhilip Reames; RV64I-LABEL: mul41:
842282ab543SPhilip Reames; RV64I:       # %bb.0:
843282ab543SPhilip Reames; RV64I-NEXT:    li a1, 41
844282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
845282ab543SPhilip Reames; RV64I-NEXT:    ret
846282ab543SPhilip Reames;
847282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul41:
848282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
849282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 2
850282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
851282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
852282ab543SPhilip Reames  %c = mul i64 %a, 41
853282ab543SPhilip Reames  ret i64 %c
854282ab543SPhilip Reames}
855282ab543SPhilip Reames
856282ab543SPhilip Reamesdefine i64 @mul73(i64 %a) {
857282ab543SPhilip Reames; RV64I-LABEL: mul73:
858282ab543SPhilip Reames; RV64I:       # %bb.0:
859282ab543SPhilip Reames; RV64I-NEXT:    li a1, 73
860282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
861282ab543SPhilip Reames; RV64I-NEXT:    ret
862282ab543SPhilip Reames;
863282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul73:
864282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
865282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a1, a0, a0, 3
866282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
867282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
868282ab543SPhilip Reames  %c = mul i64 %a, 73
869282ab543SPhilip Reames  ret i64 %c
870282ab543SPhilip Reames}
871282ab543SPhilip Reames
872282ab543SPhilip Reamesdefine i64 @mul27(i64 %a) {
873282ab543SPhilip Reames; RV64I-LABEL: mul27:
874282ab543SPhilip Reames; RV64I:       # %bb.0:
875282ab543SPhilip Reames; RV64I-NEXT:    li a1, 27
876282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
877282ab543SPhilip Reames; RV64I-NEXT:    ret
878282ab543SPhilip Reames;
879282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul27:
880282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
881282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
88203760ad0SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
883282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
884282ab543SPhilip Reames  %c = mul i64 %a, 27
885282ab543SPhilip Reames  ret i64 %c
886282ab543SPhilip Reames}
887282ab543SPhilip Reames
888282ab543SPhilip Reamesdefine i64 @mul45(i64 %a) {
889282ab543SPhilip Reames; RV64I-LABEL: mul45:
890282ab543SPhilip Reames; RV64I:       # %bb.0:
891282ab543SPhilip Reames; RV64I-NEXT:    li a1, 45
892282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
893282ab543SPhilip Reames; RV64I-NEXT:    ret
894282ab543SPhilip Reames;
895282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul45:
896282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
897282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
89803760ad0SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
899282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
900282ab543SPhilip Reames  %c = mul i64 %a, 45
901282ab543SPhilip Reames  ret i64 %c
902282ab543SPhilip Reames}
903282ab543SPhilip Reames
904282ab543SPhilip Reamesdefine i64 @mul81(i64 %a) {
905282ab543SPhilip Reames; RV64I-LABEL: mul81:
906282ab543SPhilip Reames; RV64I:       # %bb.0:
907282ab543SPhilip Reames; RV64I-NEXT:    li a1, 81
908282ab543SPhilip Reames; RV64I-NEXT:    mul a0, a0, a1
909282ab543SPhilip Reames; RV64I-NEXT:    ret
910282ab543SPhilip Reames;
911282ab543SPhilip Reames; RV64XTHEADBA-LABEL: mul81:
912282ab543SPhilip Reames; RV64XTHEADBA:       # %bb.0:
913282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
914282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
915282ab543SPhilip Reames; RV64XTHEADBA-NEXT:    ret
916282ab543SPhilip Reames  %c = mul i64 %a, 81
917282ab543SPhilip Reames  ret i64 %c
918282ab543SPhilip Reames}
919282ab543SPhilip Reames
920cd3c1658SCraig Topperdefine i64 @mul4098(i64 %a) {
921cd3c1658SCraig Topper; RV64I-LABEL: mul4098:
922e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
923cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a0, 1
924cd3c1658SCraig Topper; RV64I-NEXT:    slli a0, a0, 12
925cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
926cd3c1658SCraig Topper; RV64I-NEXT:    ret
927cd3c1658SCraig Topper;
928cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul4098:
929cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
930cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a0, 12
931cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
932cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
933cd3c1658SCraig Topper  %c = mul i64 %a, 4098
934cd3c1658SCraig Topper  ret i64 %c
935cd3c1658SCraig Topper}
936cd3c1658SCraig Topper
937cd3c1658SCraig Topperdefine i64 @mul4100(i64 %a) {
938cd3c1658SCraig Topper; RV64I-LABEL: mul4100:
939cd3c1658SCraig Topper; RV64I:       # %bb.0:
940cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a0, 2
941cd3c1658SCraig Topper; RV64I-NEXT:    slli a0, a0, 12
942cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
943cd3c1658SCraig Topper; RV64I-NEXT:    ret
944cd3c1658SCraig Topper;
945cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul4100:
946cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
947cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a0, 12
948cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
949cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
950cd3c1658SCraig Topper  %c = mul i64 %a, 4100
951cd3c1658SCraig Topper  ret i64 %c
952cd3c1658SCraig Topper}
953cd3c1658SCraig Topper
954cd3c1658SCraig Topperdefine i64 @mul4104(i64 %a) {
955cd3c1658SCraig Topper; RV64I-LABEL: mul4104:
956cd3c1658SCraig Topper; RV64I:       # %bb.0:
957cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a0, 3
958cd3c1658SCraig Topper; RV64I-NEXT:    slli a0, a0, 12
959cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
960cd3c1658SCraig Topper; RV64I-NEXT:    ret
961cd3c1658SCraig Topper;
962cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul4104:
963cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
964cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a0, 12
965cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
966cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
967cd3c1658SCraig Topper  %c = mul i64 %a, 4104
968cd3c1658SCraig Topper  ret i64 %c
969cd3c1658SCraig Topper}
970cd3c1658SCraig Topper
971cd3c1658SCraig Topperdefine signext i32 @mulw192(i32 signext %a) {
972cd3c1658SCraig Topper; RV64I-LABEL: mulw192:
973cd3c1658SCraig Topper; RV64I:       # %bb.0:
974cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a0, 6
975cd3c1658SCraig Topper; RV64I-NEXT:    slli a0, a0, 8
976cd3c1658SCraig Topper; RV64I-NEXT:    subw a0, a0, a1
977cd3c1658SCraig Topper; RV64I-NEXT:    ret
978cd3c1658SCraig Topper;
979cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mulw192:
980cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
981cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
982cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slliw a0, a0, 6
983cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
984cd3c1658SCraig Topper  %c = mul i32 %a, 192
985cd3c1658SCraig Topper  ret i32 %c
986cd3c1658SCraig Topper}
987cd3c1658SCraig Topper
988cd3c1658SCraig Topperdefine signext i32 @mulw320(i32 signext %a) {
989cd3c1658SCraig Topper; RV64I-LABEL: mulw320:
990cd3c1658SCraig Topper; RV64I:       # %bb.0:
991cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 320
992cd3c1658SCraig Topper; RV64I-NEXT:    mulw a0, a0, a1
993cd3c1658SCraig Topper; RV64I-NEXT:    ret
994cd3c1658SCraig Topper;
995cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mulw320:
996cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
997cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
998cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slliw a0, a0, 6
999cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1000cd3c1658SCraig Topper  %c = mul i32 %a, 320
1001cd3c1658SCraig Topper  ret i32 %c
1002cd3c1658SCraig Topper}
1003cd3c1658SCraig Topper
1004cd3c1658SCraig Topperdefine signext i32 @mulw576(i32 signext %a) {
1005cd3c1658SCraig Topper; RV64I-LABEL: mulw576:
1006cd3c1658SCraig Topper; RV64I:       # %bb.0:
1007cd3c1658SCraig Topper; RV64I-NEXT:    li a1, 576
1008cd3c1658SCraig Topper; RV64I-NEXT:    mulw a0, a0, a1
1009cd3c1658SCraig Topper; RV64I-NEXT:    ret
1010cd3c1658SCraig Topper;
1011cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mulw576:
1012cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1013cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
1014cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slliw a0, a0, 6
1015cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1016cd3c1658SCraig Topper  %c = mul i32 %a, 576
1017cd3c1658SCraig Topper  ret i32 %c
1018cd3c1658SCraig Topper}
1019cd3c1658SCraig Topper
1020cd3c1658SCraig Topperdefine i64 @add4104(i64 %a) {
1021814902a0SCraig Topper; RV64I-LABEL: add4104:
1022814902a0SCraig Topper; RV64I:       # %bb.0:
1023814902a0SCraig Topper; RV64I-NEXT:    lui a1, 1
1024814902a0SCraig Topper; RV64I-NEXT:    addiw a1, a1, 8
1025814902a0SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1026814902a0SCraig Topper; RV64I-NEXT:    ret
1027814902a0SCraig Topper;
1028814902a0SCraig Topper; RV64XTHEADBA-LABEL: add4104:
1029814902a0SCraig Topper; RV64XTHEADBA:       # %bb.0:
1030814902a0SCraig Topper; RV64XTHEADBA-NEXT:    li a1, 1026
1031814902a0SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
1032814902a0SCraig Topper; RV64XTHEADBA-NEXT:    ret
1033cd3c1658SCraig Topper  %c = add i64 %a, 4104
1034cd3c1658SCraig Topper  ret i64 %c
1035cd3c1658SCraig Topper}
1036cd3c1658SCraig Topper
1037cd3c1658SCraig Topperdefine i64 @add4104_2(i64 %a) {
1038*c557ce9fSCraig Topper; RV64I-LABEL: add4104_2:
1039*c557ce9fSCraig Topper; RV64I:       # %bb.0:
1040*c557ce9fSCraig Topper; RV64I-NEXT:    lui a1, 1
1041*c557ce9fSCraig Topper; RV64I-NEXT:    addiw a1, a1, 8
1042*c557ce9fSCraig Topper; RV64I-NEXT:    or a0, a0, a1
1043*c557ce9fSCraig Topper; RV64I-NEXT:    ret
1044*c557ce9fSCraig Topper;
1045*c557ce9fSCraig Topper; RV64XTHEADBA-LABEL: add4104_2:
1046*c557ce9fSCraig Topper; RV64XTHEADBA:       # %bb.0:
1047*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT:    li a1, 1026
1048*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
1049*c557ce9fSCraig Topper; RV64XTHEADBA-NEXT:    ret
1050cd3c1658SCraig Topper  %c = or disjoint i64 %a, 4104
1051cd3c1658SCraig Topper  ret i64 %c
1052cd3c1658SCraig Topper}
1053cd3c1658SCraig Topper
1054cd3c1658SCraig Topperdefine i64 @add8208(i64 %a) {
1055814902a0SCraig Topper; RV64I-LABEL: add8208:
1056814902a0SCraig Topper; RV64I:       # %bb.0:
1057814902a0SCraig Topper; RV64I-NEXT:    lui a1, 2
1058814902a0SCraig Topper; RV64I-NEXT:    addiw a1, a1, 16
1059814902a0SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1060814902a0SCraig Topper; RV64I-NEXT:    ret
1061814902a0SCraig Topper;
1062814902a0SCraig Topper; RV64XTHEADBA-LABEL: add8208:
1063814902a0SCraig Topper; RV64XTHEADBA:       # %bb.0:
1064814902a0SCraig Topper; RV64XTHEADBA-NEXT:    li a1, 1026
1065814902a0SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1066814902a0SCraig Topper; RV64XTHEADBA-NEXT:    ret
1067cd3c1658SCraig Topper  %c = add i64 %a, 8208
1068cd3c1658SCraig Topper  ret i64 %c
1069cd3c1658SCraig Topper}
1070cd3c1658SCraig Topper
1071cd3c1658SCraig Topper; Make sure we prefer LUI for the 8192 instead of using sh3add.
1072cd3c1658SCraig Topperdefine signext i32 @add8192_i32(i32 signext %a) {
1073cd3c1658SCraig Topper; CHECK-LABEL: add8192_i32:
1074cd3c1658SCraig Topper; CHECK:       # %bb.0:
1075cd3c1658SCraig Topper; CHECK-NEXT:    lui a1, 2
1076cd3c1658SCraig Topper; CHECK-NEXT:    addw a0, a0, a1
1077cd3c1658SCraig Topper; CHECK-NEXT:    ret
1078cd3c1658SCraig Topper  %c = add i32 %a, 8192
1079cd3c1658SCraig Topper  ret i32 %c
1080cd3c1658SCraig Topper}
1081cd3c1658SCraig Topper
1082cd3c1658SCraig Topper; Make sure we prefer LUI for the 8192 instead of using sh3add.
1083cd3c1658SCraig Topperdefine i64 @add8192(i64 %a) {
1084cd3c1658SCraig Topper; CHECK-LABEL: add8192:
1085cd3c1658SCraig Topper; CHECK:       # %bb.0:
1086cd3c1658SCraig Topper; CHECK-NEXT:    lui a1, 2
1087cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
1088cd3c1658SCraig Topper; CHECK-NEXT:    ret
1089cd3c1658SCraig Topper  %c = add i64 %a, 8192
1090cd3c1658SCraig Topper  ret i64 %c
1091cd3c1658SCraig Topper}
1092cd3c1658SCraig Topper
1093cd3c1658SCraig Topperdefine signext i32 @addshl32_5_6(i32 signext %a, i32 signext %b) {
1094cd3c1658SCraig Topper; CHECK-LABEL: addshl32_5_6:
1095cd3c1658SCraig Topper; CHECK:       # %bb.0:
1096cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
1097cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 6
1098cd3c1658SCraig Topper; CHECK-NEXT:    addw a0, a0, a1
1099cd3c1658SCraig Topper; CHECK-NEXT:    ret
1100cd3c1658SCraig Topper  %c = shl i32 %a, 5
1101cd3c1658SCraig Topper  %d = shl i32 %b, 6
1102cd3c1658SCraig Topper  %e = add i32 %c, %d
1103cd3c1658SCraig Topper  ret i32 %e
1104cd3c1658SCraig Topper}
1105cd3c1658SCraig Topper
1106cd3c1658SCraig Topperdefine i64 @addshl64_5_6(i64 %a, i64 %b) {
1107cd3c1658SCraig Topper; CHECK-LABEL: addshl64_5_6:
1108cd3c1658SCraig Topper; CHECK:       # %bb.0:
1109cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
1110cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 6
1111cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
1112cd3c1658SCraig Topper; CHECK-NEXT:    ret
1113cd3c1658SCraig Topper  %c = shl i64 %a, 5
1114cd3c1658SCraig Topper  %d = shl i64 %b, 6
1115cd3c1658SCraig Topper  %e = add i64 %c, %d
1116cd3c1658SCraig Topper  ret i64 %e
1117cd3c1658SCraig Topper}
1118cd3c1658SCraig Topper
1119cd3c1658SCraig Topperdefine signext i32 @addshl32_5_7(i32 signext %a, i32 signext %b) {
1120cd3c1658SCraig Topper; CHECK-LABEL: addshl32_5_7:
1121cd3c1658SCraig Topper; CHECK:       # %bb.0:
1122cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
1123cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 7
1124cd3c1658SCraig Topper; CHECK-NEXT:    addw a0, a0, a1
1125cd3c1658SCraig Topper; CHECK-NEXT:    ret
1126cd3c1658SCraig Topper  %c = shl i32 %a, 5
1127cd3c1658SCraig Topper  %d = shl i32 %b, 7
1128cd3c1658SCraig Topper  %e = add i32 %c, %d
1129cd3c1658SCraig Topper  ret i32 %e
1130cd3c1658SCraig Topper}
1131cd3c1658SCraig Topper
1132cd3c1658SCraig Topperdefine i64 @addshl64_5_7(i64 %a, i64 %b) {
1133cd3c1658SCraig Topper; CHECK-LABEL: addshl64_5_7:
1134cd3c1658SCraig Topper; CHECK:       # %bb.0:
1135cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
1136cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 7
1137cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
1138cd3c1658SCraig Topper; CHECK-NEXT:    ret
1139cd3c1658SCraig Topper  %c = shl i64 %a, 5
1140cd3c1658SCraig Topper  %d = shl i64 %b, 7
1141cd3c1658SCraig Topper  %e = add i64 %c, %d
1142cd3c1658SCraig Topper  ret i64 %e
1143cd3c1658SCraig Topper}
1144cd3c1658SCraig Topper
1145cd3c1658SCraig Topperdefine signext i32 @addshl32_5_8(i32 signext %a, i32 signext %b) {
1146cd3c1658SCraig Topper; CHECK-LABEL: addshl32_5_8:
1147cd3c1658SCraig Topper; CHECK:       # %bb.0:
1148cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
1149cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 8
1150cd3c1658SCraig Topper; CHECK-NEXT:    addw a0, a0, a1
1151cd3c1658SCraig Topper; CHECK-NEXT:    ret
1152cd3c1658SCraig Topper  %c = shl i32 %a, 5
1153cd3c1658SCraig Topper  %d = shl i32 %b, 8
1154cd3c1658SCraig Topper  %e = add i32 %c, %d
1155cd3c1658SCraig Topper  ret i32 %e
1156cd3c1658SCraig Topper}
1157cd3c1658SCraig Topper
1158cd3c1658SCraig Topperdefine i64 @addshl64_5_8(i64 %a, i64 %b) {
1159cd3c1658SCraig Topper; CHECK-LABEL: addshl64_5_8:
1160cd3c1658SCraig Topper; CHECK:       # %bb.0:
1161cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
1162cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 8
1163cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
1164cd3c1658SCraig Topper; CHECK-NEXT:    ret
1165cd3c1658SCraig Topper  %c = shl i64 %a, 5
1166cd3c1658SCraig Topper  %d = shl i64 %b, 8
1167cd3c1658SCraig Topper  %e = add i64 %c, %d
1168cd3c1658SCraig Topper  ret i64 %e
1169cd3c1658SCraig Topper}
1170cd3c1658SCraig Topper
1171cd3c1658SCraig Topperdefine i64 @sh6_sh3_add1(i64 noundef %x, i64 noundef %y, i64 noundef %z) {
1172cd3c1658SCraig Topper; RV64I-LABEL: sh6_sh3_add1:
1173cd3c1658SCraig Topper; RV64I:       # %bb.0: # %entry
1174cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1175cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 6
1176cd3c1658SCraig Topper; RV64I-NEXT:    add a1, a1, a2
1177cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a1, a0
1178cd3c1658SCraig Topper; RV64I-NEXT:    ret
1179cd3c1658SCraig Topper;
1180cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: sh6_sh3_add1:
1181cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0: # %entry
1182cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 6
1183cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a1, a1, a2, 3
1184cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a1, a0
1185cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1186cd3c1658SCraig Topperentry:
1187cd3c1658SCraig Topper  %shl = shl i64 %z, 3
1188cd3c1658SCraig Topper  %shl1 = shl i64 %y, 6
1189cd3c1658SCraig Topper  %add = add nsw i64 %shl1, %shl
1190cd3c1658SCraig Topper  %add2 = add nsw i64 %add, %x
1191cd3c1658SCraig Topper  ret i64 %add2
1192cd3c1658SCraig Topper}
1193cd3c1658SCraig Topper
1194cd3c1658SCraig Topperdefine i64 @sh6_sh3_add2(i64 noundef %x, i64 noundef %y, i64 noundef %z) {
1195cd3c1658SCraig Topper; RV64I-LABEL: sh6_sh3_add2:
1196cd3c1658SCraig Topper; RV64I:       # %bb.0: # %entry
1197cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1198cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 6
1199cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a1, a0
1200cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1201cd3c1658SCraig Topper; RV64I-NEXT:    ret
1202cd3c1658SCraig Topper;
1203cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: sh6_sh3_add2:
1204cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0: # %entry
1205cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 6
1206cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a1, a0
1207cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 3
1208cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1209cd3c1658SCraig Topperentry:
1210cd3c1658SCraig Topper  %shl = shl i64 %z, 3
1211cd3c1658SCraig Topper  %shl1 = shl i64 %y, 6
1212cd3c1658SCraig Topper  %add = add nsw i64 %shl1, %x
1213cd3c1658SCraig Topper  %add2 = add nsw i64 %add, %shl
1214cd3c1658SCraig Topper  ret i64 %add2
1215cd3c1658SCraig Topper}
1216cd3c1658SCraig Topper
1217cd3c1658SCraig Topperdefine i64 @sh6_sh3_add3(i64 noundef %x, i64 noundef %y, i64 noundef %z) {
1218cd3c1658SCraig Topper; RV64I-LABEL: sh6_sh3_add3:
1219cd3c1658SCraig Topper; RV64I:       # %bb.0: # %entry
1220cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1221cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 6
1222cd3c1658SCraig Topper; RV64I-NEXT:    add a1, a1, a2
1223cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1224cd3c1658SCraig Topper; RV64I-NEXT:    ret
1225cd3c1658SCraig Topper;
1226cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: sh6_sh3_add3:
1227cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0: # %entry
1228cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 6
1229cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a1, a1, a2, 3
1230cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1231cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1232cd3c1658SCraig Topperentry:
1233cd3c1658SCraig Topper  %shl = shl i64 %z, 3
1234cd3c1658SCraig Topper  %shl1 = shl i64 %y, 6
1235cd3c1658SCraig Topper  %add = add nsw i64 %shl1, %shl
1236cd3c1658SCraig Topper  %add2 = add nsw i64 %x, %add
1237cd3c1658SCraig Topper  ret i64 %add2
1238cd3c1658SCraig Topper}
1239cd3c1658SCraig Topper
1240cd3c1658SCraig Topperdefine i64 @sh6_sh3_add4(i64 noundef %x, i64 noundef %y, i64 noundef %z) {
1241cd3c1658SCraig Topper; RV64I-LABEL: sh6_sh3_add4:
1242cd3c1658SCraig Topper; RV64I:       # %bb.0: # %entry
1243cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1244cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 6
1245cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1246cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1247cd3c1658SCraig Topper; RV64I-NEXT:    ret
1248cd3c1658SCraig Topper;
1249cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: sh6_sh3_add4:
1250cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0: # %entry
1251cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 6
1252cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 3
1253cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1254cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1255cd3c1658SCraig Topperentry:
1256cd3c1658SCraig Topper  %shl = shl i64 %z, 3
1257cd3c1658SCraig Topper  %shl1 = shl i64 %y, 6
1258cd3c1658SCraig Topper  %add = add nsw i64 %x, %shl
1259cd3c1658SCraig Topper  %add2 = add nsw i64 %add, %shl1
1260cd3c1658SCraig Topper  ret i64 %add2
1261cd3c1658SCraig Topper}
1262cd3c1658SCraig Topper
1263cd3c1658SCraig Topperdefine signext i16 @srliw_1_sh1add(ptr %0, i32 signext %1) {
1264cd3c1658SCraig Topper; CHECK-LABEL: srliw_1_sh1add:
1265cd3c1658SCraig Topper; CHECK:       # %bb.0:
1266cd3c1658SCraig Topper; CHECK-NEXT:    srliw a1, a1, 1
1267cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 1
1268cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
1269cd3c1658SCraig Topper; CHECK-NEXT:    lh a0, 0(a0)
1270cd3c1658SCraig Topper; CHECK-NEXT:    ret
1271cd3c1658SCraig Topper  %3 = lshr i32 %1, 1
1272cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1273cd3c1658SCraig Topper  %5 = getelementptr inbounds i16, ptr %0, i64 %4
1274cd3c1658SCraig Topper  %6 = load i16, ptr %5, align 2
1275cd3c1658SCraig Topper  ret i16 %6
1276cd3c1658SCraig Topper}
1277cd3c1658SCraig Topper
1278cd3c1658SCraig Topperdefine signext i32 @srliw_2_sh2add(ptr %0, i32 signext %1) {
1279cd3c1658SCraig Topper; CHECK-LABEL: srliw_2_sh2add:
1280cd3c1658SCraig Topper; CHECK:       # %bb.0:
1281cd3c1658SCraig Topper; CHECK-NEXT:    srliw a1, a1, 2
1282cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 2
1283cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
1284cd3c1658SCraig Topper; CHECK-NEXT:    lw a0, 0(a0)
1285cd3c1658SCraig Topper; CHECK-NEXT:    ret
1286cd3c1658SCraig Topper  %3 = lshr i32 %1, 2
1287cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1288cd3c1658SCraig Topper  %5 = getelementptr inbounds i32, ptr %0, i64 %4
1289cd3c1658SCraig Topper  %6 = load i32, ptr %5, align 4
1290cd3c1658SCraig Topper  ret i32 %6
1291cd3c1658SCraig Topper}
1292cd3c1658SCraig Topper
1293cd3c1658SCraig Topperdefine i64 @srliw_3_sh3add(ptr %0, i32 signext %1) {
1294cd3c1658SCraig Topper; CHECK-LABEL: srliw_3_sh3add:
1295cd3c1658SCraig Topper; CHECK:       # %bb.0:
1296cd3c1658SCraig Topper; CHECK-NEXT:    srliw a1, a1, 3
1297cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 3
1298cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
1299cd3c1658SCraig Topper; CHECK-NEXT:    ld a0, 0(a0)
1300cd3c1658SCraig Topper; CHECK-NEXT:    ret
1301cd3c1658SCraig Topper  %3 = lshr i32 %1, 3
1302cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1303cd3c1658SCraig Topper  %5 = getelementptr inbounds i64, ptr %0, i64 %4
1304cd3c1658SCraig Topper  %6 = load i64, ptr %5, align 8
1305cd3c1658SCraig Topper  ret i64 %6
1306cd3c1658SCraig Topper}
1307cd3c1658SCraig Topper
1308cd3c1658SCraig Topperdefine signext i32 @srliw_1_sh2add(ptr %0, i32 signext %1) {
1309cd3c1658SCraig Topper; RV64I-LABEL: srliw_1_sh2add:
1310cd3c1658SCraig Topper; RV64I:       # %bb.0:
1311cd3c1658SCraig Topper; RV64I-NEXT:    srliw a1, a1, 1
1312cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 2
1313cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1314cd3c1658SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
1315cd3c1658SCraig Topper; RV64I-NEXT:    ret
1316cd3c1658SCraig Topper;
1317cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_1_sh2add:
1318cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1319cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srliw a1, a1, 1
1320cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
1321cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
1322cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1323cd3c1658SCraig Topper  %3 = lshr i32 %1, 1
1324cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1325cd3c1658SCraig Topper  %5 = getelementptr inbounds i32, ptr %0, i64 %4
1326cd3c1658SCraig Topper  %6 = load i32, ptr %5, align 4
1327cd3c1658SCraig Topper  ret i32 %6
1328cd3c1658SCraig Topper}
1329cd3c1658SCraig Topper
1330cd3c1658SCraig Topperdefine i64 @srliw_1_sh3add(ptr %0, i32 signext %1) {
1331cd3c1658SCraig Topper; RV64I-LABEL: srliw_1_sh3add:
1332cd3c1658SCraig Topper; RV64I:       # %bb.0:
1333cd3c1658SCraig Topper; RV64I-NEXT:    srliw a1, a1, 1
1334cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 3
1335cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1336cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1337cd3c1658SCraig Topper; RV64I-NEXT:    ret
1338cd3c1658SCraig Topper;
1339cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_1_sh3add:
1340cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1341cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srliw a1, a1, 1
1342cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1343cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1344cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1345cd3c1658SCraig Topper  %3 = lshr i32 %1, 1
1346cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1347cd3c1658SCraig Topper  %5 = getelementptr inbounds i64, ptr %0, i64 %4
1348cd3c1658SCraig Topper  %6 = load i64, ptr %5, align 8
1349cd3c1658SCraig Topper  ret i64 %6
1350cd3c1658SCraig Topper}
1351cd3c1658SCraig Topper
1352cd3c1658SCraig Topperdefine i64 @srliw_2_sh3add(ptr %0, i32 signext %1) {
1353cd3c1658SCraig Topper; RV64I-LABEL: srliw_2_sh3add:
1354cd3c1658SCraig Topper; RV64I:       # %bb.0:
1355cd3c1658SCraig Topper; RV64I-NEXT:    srliw a1, a1, 2
1356cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 3
1357cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1358cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1359cd3c1658SCraig Topper; RV64I-NEXT:    ret
1360cd3c1658SCraig Topper;
1361cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_2_sh3add:
1362cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1363cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srliw a1, a1, 2
1364cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1365cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1366cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1367cd3c1658SCraig Topper  %3 = lshr i32 %1, 2
1368cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1369cd3c1658SCraig Topper  %5 = getelementptr inbounds i64, ptr %0, i64 %4
1370cd3c1658SCraig Topper  %6 = load i64, ptr %5, align 8
1371cd3c1658SCraig Topper  ret i64 %6
1372cd3c1658SCraig Topper}
1373cd3c1658SCraig Topper
1374cd3c1658SCraig Topperdefine signext i16 @srliw_2_sh1add(ptr %0, i32 signext %1) {
1375cd3c1658SCraig Topper; RV64I-LABEL: srliw_2_sh1add:
1376cd3c1658SCraig Topper; RV64I:       # %bb.0:
1377cd3c1658SCraig Topper; RV64I-NEXT:    srliw a1, a1, 2
1378cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 1
1379cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1380cd3c1658SCraig Topper; RV64I-NEXT:    lh a0, 0(a0)
1381cd3c1658SCraig Topper; RV64I-NEXT:    ret
1382cd3c1658SCraig Topper;
1383cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_2_sh1add:
1384cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1385cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srliw a1, a1, 2
1386cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 1
1387cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lh a0, 0(a0)
1388cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1389cd3c1658SCraig Topper  %3 = lshr i32 %1, 2
1390cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1391cd3c1658SCraig Topper  %5 = getelementptr inbounds i16, ptr %0, i64 %4
1392cd3c1658SCraig Topper  %6 = load i16, ptr %5, align 2
1393cd3c1658SCraig Topper  ret i16 %6
1394cd3c1658SCraig Topper}
1395cd3c1658SCraig Topper
1396cd3c1658SCraig Topper
1397cd3c1658SCraig Topperdefine signext i32 @srliw_3_sh2add(ptr %0, i32 signext %1) {
1398cd3c1658SCraig Topper; RV64I-LABEL: srliw_3_sh2add:
1399cd3c1658SCraig Topper; RV64I:       # %bb.0:
1400cd3c1658SCraig Topper; RV64I-NEXT:    srliw a1, a1, 3
1401cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 2
1402cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1403cd3c1658SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
1404cd3c1658SCraig Topper; RV64I-NEXT:    ret
1405cd3c1658SCraig Topper;
1406cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_3_sh2add:
1407cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1408cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srliw a1, a1, 3
1409cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
1410cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
1411cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1412cd3c1658SCraig Topper  %3 = lshr i32 %1, 3
1413cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1414cd3c1658SCraig Topper  %5 = getelementptr inbounds i32, ptr %0, i64 %4
1415cd3c1658SCraig Topper  %6 = load i32, ptr %5, align 4
1416cd3c1658SCraig Topper  ret i32 %6
1417cd3c1658SCraig Topper}
1418cd3c1658SCraig Topper
1419cd3c1658SCraig Topperdefine i64 @srliw_4_sh3add(ptr %0, i32 signext %1) {
1420cd3c1658SCraig Topper; RV64I-LABEL: srliw_4_sh3add:
1421cd3c1658SCraig Topper; RV64I:       # %bb.0:
1422cd3c1658SCraig Topper; RV64I-NEXT:    srliw a1, a1, 4
1423cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 3
1424cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1425cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1426cd3c1658SCraig Topper; RV64I-NEXT:    ret
1427cd3c1658SCraig Topper;
1428cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srliw_4_sh3add:
1429cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1430cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srliw a1, a1, 4
1431cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1432cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1433cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1434cd3c1658SCraig Topper  %3 = lshr i32 %1, 4
1435cd3c1658SCraig Topper  %4 = zext i32 %3 to i64
1436cd3c1658SCraig Topper  %5 = getelementptr inbounds i64, ptr %0, i64 %4
1437cd3c1658SCraig Topper  %6 = load i64, ptr %5, align 8
1438cd3c1658SCraig Topper  ret i64 %6
1439cd3c1658SCraig Topper}
1440cd3c1658SCraig Topper
1441cd3c1658SCraig Topperdefine signext i32 @srli_1_sh2add(ptr %0, i64 %1) {
1442cd3c1658SCraig Topper; RV64I-LABEL: srli_1_sh2add:
1443cd3c1658SCraig Topper; RV64I:       # %bb.0:
1444cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 1
1445cd3c1658SCraig Topper; RV64I-NEXT:    andi a1, a1, -4
1446cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1447cd3c1658SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
1448cd3c1658SCraig Topper; RV64I-NEXT:    ret
1449cd3c1658SCraig Topper;
1450cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_1_sh2add:
1451cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1452cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srli a1, a1, 1
1453cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
1454cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
1455cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1456cd3c1658SCraig Topper  %3 = lshr i64 %1, 1
1457cd3c1658SCraig Topper  %4 = getelementptr inbounds i32, ptr %0, i64 %3
1458cd3c1658SCraig Topper  %5 = load i32, ptr %4, align 4
1459cd3c1658SCraig Topper  ret i32 %5
1460cd3c1658SCraig Topper}
1461cd3c1658SCraig Topper
1462cd3c1658SCraig Topperdefine i64 @srli_2_sh3add(ptr %0, i64 %1) {
1463cd3c1658SCraig Topper; RV64I-LABEL: srli_2_sh3add:
1464cd3c1658SCraig Topper; RV64I:       # %bb.0:
1465cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 1
1466cd3c1658SCraig Topper; RV64I-NEXT:    andi a1, a1, -8
1467cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1468cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1469cd3c1658SCraig Topper; RV64I-NEXT:    ret
1470cd3c1658SCraig Topper;
1471cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_2_sh3add:
1472cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1473cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srli a1, a1, 2
1474cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1475cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1476cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1477cd3c1658SCraig Topper  %3 = lshr i64 %1, 2
1478cd3c1658SCraig Topper  %4 = getelementptr inbounds i64, ptr %0, i64 %3
1479cd3c1658SCraig Topper  %5 = load i64, ptr %4, align 8
1480cd3c1658SCraig Topper  ret i64 %5
1481cd3c1658SCraig Topper}
1482cd3c1658SCraig Topper
1483cd3c1658SCraig Topperdefine signext i16 @srli_2_sh1add(ptr %0, i64 %1) {
1484cd3c1658SCraig Topper; RV64I-LABEL: srli_2_sh1add:
1485cd3c1658SCraig Topper; RV64I:       # %bb.0:
1486cd3c1658SCraig Topper; RV64I-NEXT:    srli a1, a1, 1
1487cd3c1658SCraig Topper; RV64I-NEXT:    andi a1, a1, -2
1488cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1489cd3c1658SCraig Topper; RV64I-NEXT:    lh a0, 0(a0)
1490cd3c1658SCraig Topper; RV64I-NEXT:    ret
1491cd3c1658SCraig Topper;
1492cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_2_sh1add:
1493cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1494cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srli a1, a1, 2
1495cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 1
1496cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lh a0, 0(a0)
1497cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1498cd3c1658SCraig Topper  %3 = lshr i64 %1, 2
1499cd3c1658SCraig Topper  %4 = getelementptr inbounds i16, ptr %0, i64 %3
1500cd3c1658SCraig Topper  %5 = load i16, ptr %4, align 2
1501cd3c1658SCraig Topper  ret i16 %5
1502cd3c1658SCraig Topper}
1503cd3c1658SCraig Topper
1504cd3c1658SCraig Topperdefine signext i32 @srli_3_sh2add(ptr %0, i64 %1) {
1505cd3c1658SCraig Topper; RV64I-LABEL: srli_3_sh2add:
1506cd3c1658SCraig Topper; RV64I:       # %bb.0:
1507cd3c1658SCraig Topper; RV64I-NEXT:    srli a1, a1, 1
1508cd3c1658SCraig Topper; RV64I-NEXT:    andi a1, a1, -4
1509cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1510cd3c1658SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
1511cd3c1658SCraig Topper; RV64I-NEXT:    ret
1512cd3c1658SCraig Topper;
1513cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_3_sh2add:
1514cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1515cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srli a1, a1, 3
1516cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
1517cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
1518cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1519cd3c1658SCraig Topper  %3 = lshr i64 %1, 3
1520cd3c1658SCraig Topper  %4 = getelementptr inbounds i32, ptr %0, i64 %3
1521cd3c1658SCraig Topper  %5 = load i32, ptr %4, align 4
1522cd3c1658SCraig Topper  ret i32 %5
1523cd3c1658SCraig Topper}
1524cd3c1658SCraig Topper
1525cd3c1658SCraig Topperdefine i64 @srli_4_sh3add(ptr %0, i64 %1) {
1526cd3c1658SCraig Topper; RV64I-LABEL: srli_4_sh3add:
1527cd3c1658SCraig Topper; RV64I:       # %bb.0:
1528cd3c1658SCraig Topper; RV64I-NEXT:    srli a1, a1, 1
1529cd3c1658SCraig Topper; RV64I-NEXT:    andi a1, a1, -8
1530cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1531cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1532cd3c1658SCraig Topper; RV64I-NEXT:    ret
1533cd3c1658SCraig Topper;
1534cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srli_4_sh3add:
1535cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1536cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srli a1, a1, 4
1537cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1538cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1539cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1540cd3c1658SCraig Topper  %3 = lshr i64 %1, 4
1541cd3c1658SCraig Topper  %4 = getelementptr inbounds i64, ptr %0, i64 %3
1542cd3c1658SCraig Topper  %5 = load i64, ptr %4, align 8
1543cd3c1658SCraig Topper  ret i64 %5
1544cd3c1658SCraig Topper}
1545cd3c1658SCraig Topper
1546cd3c1658SCraig Topperdefine i8 @array_index_sh1_sh0(ptr %p, i64 %idx1, i64 %idx2) {
1547cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh1_sh0:
1548cd3c1658SCraig Topper; RV64I:       # %bb.0:
1549cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 1
1550cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1551cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1552cd3c1658SCraig Topper; RV64I-NEXT:    lbu a0, 0(a0)
1553cd3c1658SCraig Topper; RV64I-NEXT:    ret
1554cd3c1658SCraig Topper;
1555cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh1_sh0:
1556cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1557cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 1
1558cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a2
1559cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lbu a0, 0(a0)
1560cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1561cd3c1658SCraig Topper  %a = getelementptr inbounds [2 x i8], ptr %p, i64 %idx1, i64 %idx2
1562cd3c1658SCraig Topper  %b = load i8, ptr %a, align 1
1563cd3c1658SCraig Topper  ret i8 %b
1564cd3c1658SCraig Topper}
1565cd3c1658SCraig Topper
1566cd3c1658SCraig Topperdefine i16 @array_index_sh1_sh1(ptr %p, i64 %idx1, i64 %idx2) {
1567cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh1_sh1:
1568cd3c1658SCraig Topper; RV64I:       # %bb.0:
1569cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 2
1570cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1571cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 1
1572cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1573cd3c1658SCraig Topper; RV64I-NEXT:    lh a0, 0(a0)
1574cd3c1658SCraig Topper; RV64I-NEXT:    ret
1575cd3c1658SCraig Topper;
1576cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh1_sh1:
1577cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1578cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
1579cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 1
1580cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lh a0, 0(a0)
1581cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1582cd3c1658SCraig Topper  %a = getelementptr inbounds [2 x i16], ptr %p, i64 %idx1, i64 %idx2
1583cd3c1658SCraig Topper  %b = load i16, ptr %a, align 2
1584cd3c1658SCraig Topper  ret i16 %b
1585cd3c1658SCraig Topper}
1586cd3c1658SCraig Topper
1587cd3c1658SCraig Topperdefine i32 @array_index_sh1_sh2(ptr %p, i64 %idx1, i64 %idx2) {
1588cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh1_sh2:
1589cd3c1658SCraig Topper; RV64I:       # %bb.0:
1590cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 3
1591cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1592cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 2
1593cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1594cd3c1658SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
1595cd3c1658SCraig Topper; RV64I-NEXT:    ret
1596cd3c1658SCraig Topper;
1597cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh1_sh2:
1598cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1599cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1600cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 2
1601cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
1602cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1603cd3c1658SCraig Topper  %a = getelementptr inbounds [2 x i32], ptr %p, i64 %idx1, i64 %idx2
1604cd3c1658SCraig Topper  %b = load i32, ptr %a, align 4
1605cd3c1658SCraig Topper  ret i32 %b
1606cd3c1658SCraig Topper}
1607cd3c1658SCraig Topper
1608cd3c1658SCraig Topperdefine i64 @array_index_sh1_sh3(ptr %p, i64 %idx1, i64 %idx2) {
1609cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh1_sh3:
1610cd3c1658SCraig Topper; RV64I:       # %bb.0:
1611cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 4
1612cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1613cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1614cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1615cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1616cd3c1658SCraig Topper; RV64I-NEXT:    ret
1617cd3c1658SCraig Topper;
1618cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh1_sh3:
1619cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1620cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 4
1621cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1622cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 3
1623cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1624cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1625cd3c1658SCraig Topper  %a = getelementptr inbounds [2 x i64], ptr %p, i64 %idx1, i64 %idx2
1626cd3c1658SCraig Topper  %b = load i64, ptr %a, align 8
1627cd3c1658SCraig Topper  ret i64 %b
1628cd3c1658SCraig Topper}
1629cd3c1658SCraig Topper
1630cd3c1658SCraig Topperdefine i8 @array_index_sh2_sh0(ptr %p, i64 %idx1, i64 %idx2) {
1631cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh2_sh0:
1632cd3c1658SCraig Topper; RV64I:       # %bb.0:
1633cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 2
1634cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1635cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1636cd3c1658SCraig Topper; RV64I-NEXT:    lbu a0, 0(a0)
1637cd3c1658SCraig Topper; RV64I-NEXT:    ret
1638cd3c1658SCraig Topper;
1639cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh2_sh0:
1640cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1641cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
1642cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a2
1643cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lbu a0, 0(a0)
1644cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1645cd3c1658SCraig Topper  %a = getelementptr inbounds [4 x i8], ptr %p, i64 %idx1, i64 %idx2
1646cd3c1658SCraig Topper  %b = load i8, ptr %a, align 1
1647cd3c1658SCraig Topper  ret i8 %b
1648cd3c1658SCraig Topper}
1649cd3c1658SCraig Topper
1650cd3c1658SCraig Topperdefine i16 @array_index_sh2_sh1(ptr %p, i64 %idx1, i64 %idx2) {
1651cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh2_sh1:
1652cd3c1658SCraig Topper; RV64I:       # %bb.0:
1653cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 3
1654cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1655cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 1
1656cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1657cd3c1658SCraig Topper; RV64I-NEXT:    lh a0, 0(a0)
1658cd3c1658SCraig Topper; RV64I-NEXT:    ret
1659cd3c1658SCraig Topper;
1660cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh2_sh1:
1661cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1662cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1663cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 1
1664cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lh a0, 0(a0)
1665cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1666cd3c1658SCraig Topper  %a = getelementptr inbounds [4 x i16], ptr %p, i64 %idx1, i64 %idx2
1667cd3c1658SCraig Topper  %b = load i16, ptr %a, align 2
1668cd3c1658SCraig Topper  ret i16 %b
1669cd3c1658SCraig Topper}
1670cd3c1658SCraig Topper
1671cd3c1658SCraig Topperdefine i32 @array_index_sh2_sh2(ptr %p, i64 %idx1, i64 %idx2) {
1672cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh2_sh2:
1673cd3c1658SCraig Topper; RV64I:       # %bb.0:
1674cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 4
1675cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1676cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 2
1677cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1678cd3c1658SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
1679cd3c1658SCraig Topper; RV64I-NEXT:    ret
1680cd3c1658SCraig Topper;
1681cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh2_sh2:
1682cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1683cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 4
1684cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1685cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 2
1686cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
1687cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1688cd3c1658SCraig Topper  %a = getelementptr inbounds [4 x i32], ptr %p, i64 %idx1, i64 %idx2
1689cd3c1658SCraig Topper  %b = load i32, ptr %a, align 4
1690cd3c1658SCraig Topper  ret i32 %b
1691cd3c1658SCraig Topper}
1692cd3c1658SCraig Topper
1693cd3c1658SCraig Topperdefine i64 @array_index_sh2_sh3(ptr %p, i64 %idx1, i64 %idx2) {
1694cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh2_sh3:
1695cd3c1658SCraig Topper; RV64I:       # %bb.0:
1696cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 5
1697cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1698cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1699cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1700cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1701cd3c1658SCraig Topper; RV64I-NEXT:    ret
1702cd3c1658SCraig Topper;
1703cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh2_sh3:
1704cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1705cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 5
1706cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1707cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 3
1708cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1709cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1710cd3c1658SCraig Topper  %a = getelementptr inbounds [4 x i64], ptr %p, i64 %idx1, i64 %idx2
1711cd3c1658SCraig Topper  %b = load i64, ptr %a, align 8
1712cd3c1658SCraig Topper  ret i64 %b
1713cd3c1658SCraig Topper}
1714cd3c1658SCraig Topper
1715cd3c1658SCraig Topperdefine i8 @array_index_sh3_sh0(ptr %p, i64 %idx1, i64 %idx2) {
1716cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh3_sh0:
1717cd3c1658SCraig Topper; RV64I:       # %bb.0:
1718cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 3
1719cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1720cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1721cd3c1658SCraig Topper; RV64I-NEXT:    lbu a0, 0(a0)
1722cd3c1658SCraig Topper; RV64I-NEXT:    ret
1723cd3c1658SCraig Topper;
1724cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh3_sh0:
1725cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1726cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
1727cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a2
1728cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lbu a0, 0(a0)
1729cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1730cd3c1658SCraig Topper  %a = getelementptr inbounds [8 x i8], ptr %p, i64 %idx1, i64 %idx2
1731cd3c1658SCraig Topper  %b = load i8, ptr %a, align 1
1732cd3c1658SCraig Topper  ret i8 %b
1733cd3c1658SCraig Topper}
1734cd3c1658SCraig Topper
1735cd3c1658SCraig Topperdefine i16 @array_index_sh3_sh1(ptr %p, i64 %idx1, i64 %idx2) {
1736cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh3_sh1:
1737cd3c1658SCraig Topper; RV64I:       # %bb.0:
1738cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 4
1739cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1740cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 1
1741cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1742cd3c1658SCraig Topper; RV64I-NEXT:    lh a0, 0(a0)
1743cd3c1658SCraig Topper; RV64I-NEXT:    ret
1744cd3c1658SCraig Topper;
1745cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh3_sh1:
1746cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1747cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 4
1748cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1749cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 1
1750cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lh a0, 0(a0)
1751cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1752cd3c1658SCraig Topper  %a = getelementptr inbounds [8 x i16], ptr %p, i64 %idx1, i64 %idx2
1753cd3c1658SCraig Topper  %b = load i16, ptr %a, align 2
1754cd3c1658SCraig Topper  ret i16 %b
1755cd3c1658SCraig Topper}
1756cd3c1658SCraig Topper
1757cd3c1658SCraig Topperdefine i32 @array_index_sh3_sh2(ptr %p, i64 %idx1, i64 %idx2) {
1758cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh3_sh2:
1759cd3c1658SCraig Topper; RV64I:       # %bb.0:
1760cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 5
1761cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1762cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 2
1763cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1764cd3c1658SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
1765cd3c1658SCraig Topper; RV64I-NEXT:    ret
1766cd3c1658SCraig Topper;
1767cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh3_sh2:
1768cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1769cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 5
1770cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1771cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 2
1772cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
1773cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1774cd3c1658SCraig Topper  %a = getelementptr inbounds [8 x i32], ptr %p, i64 %idx1, i64 %idx2
1775cd3c1658SCraig Topper  %b = load i32, ptr %a, align 4
1776cd3c1658SCraig Topper  ret i32 %b
1777cd3c1658SCraig Topper}
1778cd3c1658SCraig Topper
1779cd3c1658SCraig Topperdefine i64 @array_index_sh3_sh3(ptr %p, i64 %idx1, i64 %idx2) {
1780cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh3_sh3:
1781cd3c1658SCraig Topper; RV64I:       # %bb.0:
1782cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 6
1783cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1784cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1785cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1786cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1787cd3c1658SCraig Topper; RV64I-NEXT:    ret
1788cd3c1658SCraig Topper;
1789cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh3_sh3:
1790cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1791cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 6
1792cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1793cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 3
1794cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1795cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1796cd3c1658SCraig Topper  %a = getelementptr inbounds [8 x i64], ptr %p, i64 %idx1, i64 %idx2
1797cd3c1658SCraig Topper  %b = load i64, ptr %a, align 8
1798cd3c1658SCraig Topper  ret i64 %b
1799cd3c1658SCraig Topper}
1800cd3c1658SCraig Topper
1801cd3c1658SCraig Topper; Similar to above, but with a lshr on one of the indices. This requires
1802cd3c1658SCraig Topper; special handling during isel to form a shift pair.
1803cd3c1658SCraig Topperdefine i64 @array_index_lshr_sh3_sh3(ptr %p, i64 %idx1, i64 %idx2) {
1804cd3c1658SCraig Topper; RV64I-LABEL: array_index_lshr_sh3_sh3:
1805cd3c1658SCraig Topper; RV64I:       # %bb.0:
1806cd3c1658SCraig Topper; RV64I-NEXT:    srli a1, a1, 58
1807cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1808cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 6
1809cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1810cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1811cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1812cd3c1658SCraig Topper; RV64I-NEXT:    ret
1813cd3c1658SCraig Topper;
1814cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_lshr_sh3_sh3:
1815cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1816cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srli a1, a1, 58
1817cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 6
1818cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1819cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 3
1820cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1821cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1822cd3c1658SCraig Topper  %shr = lshr i64 %idx1, 58
1823cd3c1658SCraig Topper  %a = getelementptr inbounds [8 x i64], ptr %p, i64 %shr, i64 %idx2
1824cd3c1658SCraig Topper  %b = load i64, ptr %a, align 8
1825cd3c1658SCraig Topper  ret i64 %b
1826cd3c1658SCraig Topper}
1827cd3c1658SCraig Topper
1828cd3c1658SCraig Topperdefine i8 @array_index_sh4_sh0(ptr %p, i64 %idx1, i64 %idx2) {
1829cd3c1658SCraig Topper; CHECK-LABEL: array_index_sh4_sh0:
1830cd3c1658SCraig Topper; CHECK:       # %bb.0:
1831cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 4
1832cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a2
1833cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
1834cd3c1658SCraig Topper; CHECK-NEXT:    lbu a0, 0(a0)
1835cd3c1658SCraig Topper; CHECK-NEXT:    ret
1836cd3c1658SCraig Topper  %a = getelementptr inbounds [16 x i8], ptr %p, i64 %idx1, i64 %idx2
1837cd3c1658SCraig Topper  %b = load i8, ptr %a, align 1
1838cd3c1658SCraig Topper  ret i8 %b
1839cd3c1658SCraig Topper}
1840cd3c1658SCraig Topper
1841cd3c1658SCraig Topperdefine i16 @array_index_sh4_sh1(ptr %p, i64 %idx1, i64 %idx2) {
1842cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh4_sh1:
1843cd3c1658SCraig Topper; RV64I:       # %bb.0:
1844cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 5
1845cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1846cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 1
1847cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1848cd3c1658SCraig Topper; RV64I-NEXT:    lh a0, 0(a0)
1849cd3c1658SCraig Topper; RV64I-NEXT:    ret
1850cd3c1658SCraig Topper;
1851cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh4_sh1:
1852cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1853cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 5
1854cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1855cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 1
1856cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lh a0, 0(a0)
1857cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1858cd3c1658SCraig Topper  %a = getelementptr inbounds [16 x i16], ptr %p, i64 %idx1, i64 %idx2
1859cd3c1658SCraig Topper  %b = load i16, ptr %a, align 2
1860cd3c1658SCraig Topper  ret i16 %b
1861cd3c1658SCraig Topper}
1862cd3c1658SCraig Topper
1863cd3c1658SCraig Topperdefine i32 @array_index_sh4_sh2(ptr %p, i64 %idx1, i64 %idx2) {
1864cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh4_sh2:
1865cd3c1658SCraig Topper; RV64I:       # %bb.0:
1866cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 6
1867cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1868cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 2
1869cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1870cd3c1658SCraig Topper; RV64I-NEXT:    lw a0, 0(a0)
1871cd3c1658SCraig Topper; RV64I-NEXT:    ret
1872cd3c1658SCraig Topper;
1873cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh4_sh2:
1874cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1875cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 6
1876cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1877cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 2
1878cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    lw a0, 0(a0)
1879cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1880cd3c1658SCraig Topper  %a = getelementptr inbounds [16 x i32], ptr %p, i64 %idx1, i64 %idx2
1881cd3c1658SCraig Topper  %b = load i32, ptr %a, align 4
1882cd3c1658SCraig Topper  ret i32 %b
1883cd3c1658SCraig Topper}
1884cd3c1658SCraig Topper
1885cd3c1658SCraig Topperdefine i64 @array_index_sh4_sh3(ptr %p, i64 %idx1, i64 %idx2) {
1886cd3c1658SCraig Topper; RV64I-LABEL: array_index_sh4_sh3:
1887cd3c1658SCraig Topper; RV64I:       # %bb.0:
1888cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 7
1889cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
1890cd3c1658SCraig Topper; RV64I-NEXT:    slli a2, a2, 3
1891cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a2
1892cd3c1658SCraig Topper; RV64I-NEXT:    ld a0, 0(a0)
1893cd3c1658SCraig Topper; RV64I-NEXT:    ret
1894cd3c1658SCraig Topper;
1895cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: array_index_sh4_sh3:
1896cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0:
1897cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    slli a1, a1, 7
1898cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    add a0, a0, a1
1899cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a2, 3
1900cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ld a0, 0(a0)
1901cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    ret
1902cd3c1658SCraig Topper  %a = getelementptr inbounds [16 x i64], ptr %p, i64 %idx1, i64 %idx2
1903cd3c1658SCraig Topper  %b = load i64, ptr %a, align 8
1904cd3c1658SCraig Topper  ret i64 %b
1905cd3c1658SCraig Topper}
1906cd3c1658SCraig Topper
1907cd3c1658SCraig Topperdefine i64 @mul_neg1(i64 %a) {
1908cd3c1658SCraig Topper; CHECK-LABEL: mul_neg1:
1909cd3c1658SCraig Topper; CHECK:       # %bb.0:
1910cd3c1658SCraig Topper; CHECK-NEXT:    neg a0, a0
1911cd3c1658SCraig Topper; CHECK-NEXT:    ret
1912cd3c1658SCraig Topper  %c = mul i64 %a, -1
1913cd3c1658SCraig Topper  ret i64 %c
1914cd3c1658SCraig Topper}
1915cd3c1658SCraig Topper
1916cd3c1658SCraig Topperdefine i64 @mul_neg2(i64 %a) {
1917cd3c1658SCraig Topper; CHECK-LABEL: mul_neg2:
1918cd3c1658SCraig Topper; CHECK:       # %bb.0:
1919cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 1
1920cd3c1658SCraig Topper; CHECK-NEXT:    neg a0, a0
1921cd3c1658SCraig Topper; CHECK-NEXT:    ret
1922cd3c1658SCraig Topper  %c = mul i64 %a, -2
1923cd3c1658SCraig Topper  ret i64 %c
1924cd3c1658SCraig Topper}
1925cd3c1658SCraig Topper
1926cd3c1658SCraig Topperdefine i64 @mul_neg3(i64 %a) {
1927cd3c1658SCraig Topper; RV64I-LABEL: mul_neg3:
1928cd3c1658SCraig Topper; RV64I:       # %bb.0:
1929cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a0, 1
1930cd3c1658SCraig Topper; RV64I-NEXT:    neg a0, a0
19313e55ac94SPhilip Reames; RV64I-NEXT:    sub a0, a0, a1
1932e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
1933e25b30d9SPhilipp Tomsich;
1934cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul_neg3:
1935e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
1936e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
1937cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    neg a0, a0
1938e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
1939cd3c1658SCraig Topper  %c = mul i64 %a, -3
1940e25b30d9SPhilipp Tomsich  ret i64 %c
1941e25b30d9SPhilipp Tomsich}
1942e25b30d9SPhilipp Tomsich
1943cd3c1658SCraig Topperdefine i64 @mul_neg4(i64 %a) {
1944cd3c1658SCraig Topper; CHECK-LABEL: mul_neg4:
1945cd3c1658SCraig Topper; CHECK:       # %bb.0:
1946cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 2
1947cd3c1658SCraig Topper; CHECK-NEXT:    neg a0, a0
1948cd3c1658SCraig Topper; CHECK-NEXT:    ret
1949cd3c1658SCraig Topper  %c = mul i64 %a, -4
1950885b8d9bSPhilip Reames  ret i64 %c
1951885b8d9bSPhilip Reames}
1952885b8d9bSPhilip Reames
1953cd3c1658SCraig Topperdefine i64 @mul_neg5(i64 %a) {
1954cd3c1658SCraig Topper; RV64I-LABEL: mul_neg5:
1955e25b30d9SPhilipp Tomsich; RV64I:       # %bb.0:
1956cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a0, 2
1957cd3c1658SCraig Topper; RV64I-NEXT:    neg a0, a0
1958cd3c1658SCraig Topper; RV64I-NEXT:    sub a0, a0, a1
1959e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
1960e25b30d9SPhilipp Tomsich;
1961cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: mul_neg5:
1962e25b30d9SPhilipp Tomsich; RV64XTHEADBA:       # %bb.0:
1963e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
1964cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    neg a0, a0
1965e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
1966cd3c1658SCraig Topper  %c = mul i64 %a, -5
1967e25b30d9SPhilipp Tomsich  ret i64 %c
1968e25b30d9SPhilipp Tomsich}
1969e25b30d9SPhilipp Tomsich
1970cd3c1658SCraig Topperdefine i64 @mul_neg6(i64 %a) {
1971cd3c1658SCraig Topper; CHECK-LABEL: mul_neg6:
1972cd3c1658SCraig Topper; CHECK:       # %bb.0:
1973cd3c1658SCraig Topper; CHECK-NEXT:    li a1, -6
1974cd3c1658SCraig Topper; CHECK-NEXT:    mul a0, a0, a1
1975cd3c1658SCraig Topper; CHECK-NEXT:    ret
1976cd3c1658SCraig Topper  %c = mul i64 %a, -6
1977e25b30d9SPhilipp Tomsich  ret i64 %c
1978e25b30d9SPhilipp Tomsich}
1979e25b30d9SPhilipp Tomsich
1980cd3c1658SCraig Topperdefine i64 @mul_neg7(i64 %a) {
1981cd3c1658SCraig Topper; CHECK-LABEL: mul_neg7:
1982cd3c1658SCraig Topper; CHECK:       # %bb.0:
1983cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a0, 3
1984cd3c1658SCraig Topper; CHECK-NEXT:    sub a0, a0, a1
1985cd3c1658SCraig Topper; CHECK-NEXT:    ret
1986cd3c1658SCraig Topper  %c = mul i64 %a, -7
1987cd3c1658SCraig Topper  ret i64 %c
1988cd3c1658SCraig Topper}
1989cd3c1658SCraig Topper
1990cd3c1658SCraig Topperdefine i64 @mul_neg8(i64 %a) {
1991cd3c1658SCraig Topper; CHECK-LABEL: mul_neg8:
1992cd3c1658SCraig Topper; CHECK:       # %bb.0:
1993cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 3
1994cd3c1658SCraig Topper; CHECK-NEXT:    neg a0, a0
1995cd3c1658SCraig Topper; CHECK-NEXT:    ret
1996cd3c1658SCraig Topper  %c = mul i64 %a, -8
1997cd3c1658SCraig Topper  ret i64 %c
1998cd3c1658SCraig Topper}
1999cd3c1658SCraig Topper
2000cd3c1658SCraig Topperdefine ptr @srai_srli_sh3add(ptr %0, i64 %1) nounwind {
2001cd3c1658SCraig Topper; RV64I-LABEL: srai_srli_sh3add:
2002cd3c1658SCraig Topper; RV64I:       # %bb.0: # %entry
2003cd3c1658SCraig Topper; RV64I-NEXT:    srai a1, a1, 32
2004cd3c1658SCraig Topper; RV64I-NEXT:    srli a1, a1, 6
2005cd3c1658SCraig Topper; RV64I-NEXT:    slli a1, a1, 3
2006cd3c1658SCraig Topper; RV64I-NEXT:    add a0, a0, a1
2007e25b30d9SPhilipp Tomsich; RV64I-NEXT:    ret
2008e25b30d9SPhilipp Tomsich;
2009cd3c1658SCraig Topper; RV64XTHEADBA-LABEL: srai_srli_sh3add:
2010cd3c1658SCraig Topper; RV64XTHEADBA:       # %bb.0: # %entry
2011cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srai a1, a1, 32
2012cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    srli a1, a1, 6
2013cd3c1658SCraig Topper; RV64XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
2014e25b30d9SPhilipp Tomsich; RV64XTHEADBA-NEXT:    ret
2015cd3c1658SCraig Topperentry:
2016cd3c1658SCraig Topper  %2 = ashr i64 %1, 32
2017cd3c1658SCraig Topper  %3 = lshr i64 %2, 6
2018cd3c1658SCraig Topper  %4 = getelementptr i64, ptr %0, i64 %3
2019cd3c1658SCraig Topper  ret ptr %4
2020cd3c1658SCraig Topper}
2021cd3c1658SCraig Topper
2022cd3c1658SCraig Topperdefine ptr @srai_srli_slli(ptr %0, i64 %1) nounwind {
2023cd3c1658SCraig Topper; CHECK-LABEL: srai_srli_slli:
2024cd3c1658SCraig Topper; CHECK:       # %bb.0: # %entry
2025cd3c1658SCraig Topper; CHECK-NEXT:    srai a1, a1, 32
2026cd3c1658SCraig Topper; CHECK-NEXT:    srli a1, a1, 6
2027cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 4
2028cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
2029cd3c1658SCraig Topper; CHECK-NEXT:    ret
2030cd3c1658SCraig Topperentry:
2031cd3c1658SCraig Topper  %2 = ashr i64 %1, 32
2032cd3c1658SCraig Topper  %3 = lshr i64 %2, 6
2033cd3c1658SCraig Topper  %4 = getelementptr i128, ptr %0, i64 %3
2034cd3c1658SCraig Topper  ret ptr %4
2035cd3c1658SCraig Topper}
2036cd3c1658SCraig Topper
2037cd3c1658SCraig Topper; Negative to make sure the peephole added for srai_srli_slli and
2038cd3c1658SCraig Topper; srai_srli_sh3add doesn't break this.
2039cd3c1658SCraig Topperdefine i64 @srai_andi(i64 %x) nounwind {
2040cd3c1658SCraig Topper; CHECK-LABEL: srai_andi:
2041cd3c1658SCraig Topper; CHECK:       # %bb.0: # %entry
2042cd3c1658SCraig Topper; CHECK-NEXT:    srai a0, a0, 8
2043cd3c1658SCraig Topper; CHECK-NEXT:    andi a0, a0, -8
2044cd3c1658SCraig Topper; CHECK-NEXT:    ret
2045cd3c1658SCraig Topperentry:
2046cd3c1658SCraig Topper  %y = ashr i64 %x, 8
2047cd3c1658SCraig Topper  %z = and i64 %y, -8
2048cd3c1658SCraig Topper  ret i64 %z
2049cd3c1658SCraig Topper}
2050cd3c1658SCraig Topper
2051cd3c1658SCraig Topper; Negative to make sure the peephole added for srai_srli_slli and
2052cd3c1658SCraig Topper; srai_srli_sh3add doesn't break this.
2053cd3c1658SCraig Topperdefine i64 @srai_lui_and(i64 %x) nounwind {
2054cd3c1658SCraig Topper; CHECK-LABEL: srai_lui_and:
2055cd3c1658SCraig Topper; CHECK:       # %bb.0: # %entry
2056cd3c1658SCraig Topper; CHECK-NEXT:    srai a0, a0, 8
2057cd3c1658SCraig Topper; CHECK-NEXT:    lui a1, 1048574
2058cd3c1658SCraig Topper; CHECK-NEXT:    and a0, a0, a1
2059cd3c1658SCraig Topper; CHECK-NEXT:    ret
2060cd3c1658SCraig Topperentry:
2061cd3c1658SCraig Topper  %y = ashr i64 %x, 8
2062cd3c1658SCraig Topper  %z = and i64 %y, -8192
2063cd3c1658SCraig Topper  ret i64 %z
2064e25b30d9SPhilipp Tomsich}
2065