xref: /llvm-project/llvm/test/CodeGen/RISCV/rv32xtheadba.ll (revision 814902a03a2bb4114fd61c05e0e599fc98d61dbb)
1e25b30d9SPhilipp Tomsich; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub
2e25b30d9SPhilipp Tomsich; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \
3cd3c1658SCraig Topper; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32I
4e25b30d9SPhilipp Tomsich; RUN: llc -mtriple=riscv32 -mattr=+m,+xtheadba -verify-machineinstrs < %s \
5cd3c1658SCraig Topper; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32XTHEADBA
6e25b30d9SPhilipp Tomsich
7e25b30d9SPhilipp Tomsichdefine signext i16 @th_addsl_1(i64 %0, ptr %1) {
8e25b30d9SPhilipp Tomsich; RV32I-LABEL: th_addsl_1:
9e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
10e25b30d9SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 1
11e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a2, a0
12e25b30d9SPhilipp Tomsich; RV32I-NEXT:    lh a0, 0(a0)
13e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
14e25b30d9SPhilipp Tomsich;
15e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: th_addsl_1:
16e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
17e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a2, a0, 1
18e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    lh a0, 0(a0)
19e25b30d9SPhilipp Tomsich; RV32XTHEADBA-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; RV32I-LABEL: th_addsl_2:
27e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
28e25b30d9SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 2
29e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a2, a0
30e25b30d9SPhilipp Tomsich; RV32I-NEXT:    lw a0, 0(a0)
31e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
32e25b30d9SPhilipp Tomsich;
33e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: th_addsl_2:
34e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
35e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a2, a0, 2
36e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    lw a0, 0(a0)
37e25b30d9SPhilipp Tomsich; RV32XTHEADBA-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; RV32I-LABEL: th_addsl_3:
45e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
46e25b30d9SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 3
47e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a2, a2, a0
48e25b30d9SPhilipp Tomsich; RV32I-NEXT:    lw a0, 0(a2)
49e25b30d9SPhilipp Tomsich; RV32I-NEXT:    lw a1, 4(a2)
50e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
51e25b30d9SPhilipp Tomsich;
52e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: th_addsl_3:
53e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
54e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a1, a2, a0, 3
55e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    lw a0, 0(a1)
56e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    lw a1, 4(a1)
57e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
58e25b30d9SPhilipp Tomsich  %3 = getelementptr inbounds i64, ptr %1, i64 %0
59e25b30d9SPhilipp Tomsich  %4 = load i64, ptr %3
60e25b30d9SPhilipp Tomsich  ret i64 %4
61e25b30d9SPhilipp Tomsich}
62e25b30d9SPhilipp Tomsich
63e25b30d9SPhilipp Tomsich; Type legalization inserts a sext_inreg after the first add. That add will be
64e25b30d9SPhilipp Tomsich; selected as th.addsl which does not sign extend. SimplifyDemandedBits is unable
65e25b30d9SPhilipp Tomsich; to remove the sext_inreg because it has multiple uses. The ashr will use the
66e25b30d9SPhilipp Tomsich; sext_inreg to become sraiw. This leaves the sext_inreg only used by the shl.
67e25b30d9SPhilipp Tomsich; If the shl is selected as sllw, we don't need the sext_inreg.
68e25b30d9SPhilipp Tomsichdefine i64 @th_addsl_2_extra_sext(i32 %x, i32 %y, i32 %z) {
69e25b30d9SPhilipp Tomsich; RV32I-LABEL: th_addsl_2_extra_sext:
70e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
71e25b30d9SPhilipp Tomsich; RV32I-NEXT:    slli a0, a0, 2
72e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
73e25b30d9SPhilipp Tomsich; RV32I-NEXT:    sll a1, a2, a0
74e25b30d9SPhilipp Tomsich; RV32I-NEXT:    srai a2, a0, 2
75e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a1, a2
76e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mulh a1, a1, a2
77e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
78e25b30d9SPhilipp Tomsich;
79e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: th_addsl_2_extra_sext:
80e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
81e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
82e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    sll a1, a2, a0
83e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    srai a2, a0, 2
84e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    mul a0, a1, a2
85e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    mulh a1, a1, a2
86e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
87e25b30d9SPhilipp Tomsich  %a = shl i32 %x, 2
88e25b30d9SPhilipp Tomsich  %b = add i32 %a, %y
89e25b30d9SPhilipp Tomsich  %c = shl i32 %z, %b
90e25b30d9SPhilipp Tomsich  %d = ashr i32 %b, 2
91e25b30d9SPhilipp Tomsich  %e = sext i32 %c to i64
92e25b30d9SPhilipp Tomsich  %f = sext i32 %d to i64
93e25b30d9SPhilipp Tomsich  %g = mul i64 %e, %f
94e25b30d9SPhilipp Tomsich  ret i64 %g
95e25b30d9SPhilipp Tomsich}
96e25b30d9SPhilipp Tomsich
97e25b30d9SPhilipp Tomsichdefine i32 @addmul6(i32 %a, i32 %b) {
98e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul6:
99e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
1003e55ac94SPhilip Reames; RV32I-NEXT:    slli a2, a0, 1
1013e55ac94SPhilip Reames; RV32I-NEXT:    slli a0, a0, 3
1023e55ac94SPhilip Reames; RV32I-NEXT:    sub a0, a0, a2
103e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
104e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
105e25b30d9SPhilipp Tomsich;
106e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul6:
107e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
108e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
109e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
110e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
111e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 6
112e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
113e25b30d9SPhilipp Tomsich  ret i32 %d
114e25b30d9SPhilipp Tomsich}
115e25b30d9SPhilipp Tomsich
116e25b30d9SPhilipp Tomsichdefine i32 @addmul10(i32 %a, i32 %b) {
117e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul10:
118e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
119e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a2, 10
120e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a2
121e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
122e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
123e25b30d9SPhilipp Tomsich;
124e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul10:
125e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
126e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
127e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
128e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
129e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 10
130e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
131e25b30d9SPhilipp Tomsich  ret i32 %d
132e25b30d9SPhilipp Tomsich}
133e25b30d9SPhilipp Tomsich
134e25b30d9SPhilipp Tomsichdefine i32 @addmul12(i32 %a, i32 %b) {
135e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul12:
136e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
1373e55ac94SPhilip Reames; RV32I-NEXT:    slli a2, a0, 2
1383e55ac94SPhilip Reames; RV32I-NEXT:    slli a0, a0, 4
1393e55ac94SPhilip Reames; RV32I-NEXT:    sub a0, a0, a2
140e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
141e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
142e25b30d9SPhilipp Tomsich;
143e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul12:
144e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
145e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
146e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
147e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
148e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 12
149e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
150e25b30d9SPhilipp Tomsich  ret i32 %d
151e25b30d9SPhilipp Tomsich}
152e25b30d9SPhilipp Tomsich
153e25b30d9SPhilipp Tomsichdefine i32 @addmul18(i32 %a, i32 %b) {
154e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul18:
155e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
156e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a2, 18
157e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a2
158e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
159e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
160e25b30d9SPhilipp Tomsich;
161e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul18:
162e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
163e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
164e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
165e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
166e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 18
167e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
168e25b30d9SPhilipp Tomsich  ret i32 %d
169e25b30d9SPhilipp Tomsich}
170e25b30d9SPhilipp Tomsich
171e25b30d9SPhilipp Tomsichdefine i32 @addmul20(i32 %a, i32 %b) {
172e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul20:
173e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
174e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a2, 20
175e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a2
176e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
177e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
178e25b30d9SPhilipp Tomsich;
179e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul20:
180e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
181e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
182e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
183e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
184e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 20
185e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
186e25b30d9SPhilipp Tomsich  ret i32 %d
187e25b30d9SPhilipp Tomsich}
188e25b30d9SPhilipp Tomsich
189e25b30d9SPhilipp Tomsichdefine i32 @addmul24(i32 %a, i32 %b) {
190e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul24:
191e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
1923e55ac94SPhilip Reames; RV32I-NEXT:    slli a2, a0, 3
1933e55ac94SPhilip Reames; RV32I-NEXT:    slli a0, a0, 5
1943e55ac94SPhilip Reames; RV32I-NEXT:    sub a0, a0, a2
195e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
196e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
197e25b30d9SPhilipp Tomsich;
198e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul24:
199e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
200e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
201e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
202e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
203e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 24
204e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
205e25b30d9SPhilipp Tomsich  ret i32 %d
206e25b30d9SPhilipp Tomsich}
207e25b30d9SPhilipp Tomsich
208e25b30d9SPhilipp Tomsichdefine i32 @addmul36(i32 %a, i32 %b) {
209e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul36:
210e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
211e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a2, 36
212e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a2
213e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
214e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
215e25b30d9SPhilipp Tomsich;
216e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul36:
217e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
218e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
219e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
220e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
221e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 36
222e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
223e25b30d9SPhilipp Tomsich  ret i32 %d
224e25b30d9SPhilipp Tomsich}
225e25b30d9SPhilipp Tomsich
226e25b30d9SPhilipp Tomsichdefine i32 @addmul40(i32 %a, i32 %b) {
227e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul40:
228e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
229e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a2, 40
230e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a2
231e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
232e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
233e25b30d9SPhilipp Tomsich;
234e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul40:
235e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
236e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
237e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
238e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
239e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 40
240e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
241e25b30d9SPhilipp Tomsich  ret i32 %d
242e25b30d9SPhilipp Tomsich}
243e25b30d9SPhilipp Tomsich
244e25b30d9SPhilipp Tomsichdefine i32 @addmul72(i32 %a, i32 %b) {
245e25b30d9SPhilipp Tomsich; RV32I-LABEL: addmul72:
246e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
247e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a2, 72
248e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a2
249e25b30d9SPhilipp Tomsich; RV32I-NEXT:    add a0, a0, a1
250e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
251e25b30d9SPhilipp Tomsich;
252e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: addmul72:
253e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
254e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
255e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
256e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
257e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 72
258e25b30d9SPhilipp Tomsich  %d = add i32 %c, %b
259e25b30d9SPhilipp Tomsich  ret i32 %d
260e25b30d9SPhilipp Tomsich}
261e25b30d9SPhilipp Tomsich
262e25b30d9SPhilipp Tomsichdefine i32 @mul96(i32 %a) {
263e25b30d9SPhilipp Tomsich; RV32I-LABEL: mul96:
264e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
2653e55ac94SPhilip Reames; RV32I-NEXT:    slli a1, a0, 5
2663e55ac94SPhilip Reames; RV32I-NEXT:    slli a0, a0, 7
2673e55ac94SPhilip Reames; RV32I-NEXT:    sub a0, a0, a1
268e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
269e25b30d9SPhilipp Tomsich;
270e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: mul96:
271e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
272e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
273e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    slli a0, a0, 5
274e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
275e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 96
276e25b30d9SPhilipp Tomsich  ret i32 %c
277e25b30d9SPhilipp Tomsich}
278e25b30d9SPhilipp Tomsich
279e25b30d9SPhilipp Tomsichdefine i32 @mul160(i32 %a) {
280e25b30d9SPhilipp Tomsich; RV32I-LABEL: mul160:
281e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
282e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a1, 160
283e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a1
284e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
285e25b30d9SPhilipp Tomsich;
286e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: mul160:
287e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
288e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
289e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    slli a0, a0, 5
290e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
291e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 160
292e25b30d9SPhilipp Tomsich  ret i32 %c
293e25b30d9SPhilipp Tomsich}
294e25b30d9SPhilipp Tomsich
295e25b30d9SPhilipp Tomsichdefine i32 @mul200(i32 %a) {
296e25b30d9SPhilipp Tomsich; RV32I-LABEL: mul200:
297e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
298e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a1, 200
299e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a1
300e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
301e25b30d9SPhilipp Tomsich;
302e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: mul200:
303e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
304e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
305e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
306e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    slli a0, a0, 3
307e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
308e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 200
309e25b30d9SPhilipp Tomsich  ret i32 %c
310e25b30d9SPhilipp Tomsich}
311e25b30d9SPhilipp Tomsich
312e25b30d9SPhilipp Tomsichdefine i32 @mul288(i32 %a) {
313e25b30d9SPhilipp Tomsich; RV32I-LABEL: mul288:
314e25b30d9SPhilipp Tomsich; RV32I:       # %bb.0:
315e25b30d9SPhilipp Tomsich; RV32I-NEXT:    li a1, 288
316e25b30d9SPhilipp Tomsich; RV32I-NEXT:    mul a0, a0, a1
317e25b30d9SPhilipp Tomsich; RV32I-NEXT:    ret
318e25b30d9SPhilipp Tomsich;
319e25b30d9SPhilipp Tomsich; RV32XTHEADBA-LABEL: mul288:
320e25b30d9SPhilipp Tomsich; RV32XTHEADBA:       # %bb.0:
321e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
322e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    slli a0, a0, 5
323e25b30d9SPhilipp Tomsich; RV32XTHEADBA-NEXT:    ret
324e25b30d9SPhilipp Tomsich  %c = mul i32 %a, 288
325e25b30d9SPhilipp Tomsich  ret i32 %c
326e25b30d9SPhilipp Tomsich}
327cd3c1658SCraig Topper
328cd3c1658SCraig Topperdefine i32 @mul258(i32 %a) {
329cd3c1658SCraig Topper; RV32I-LABEL: mul258:
330cd3c1658SCraig Topper; RV32I:       # %bb.0:
331cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 258
332cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
333cd3c1658SCraig Topper; RV32I-NEXT:    ret
334cd3c1658SCraig Topper;
335cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul258:
336cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
337cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    slli a1, a0, 8
338cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
339cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
340cd3c1658SCraig Topper  %c = mul i32 %a, 258
341cd3c1658SCraig Topper  ret i32 %c
342cd3c1658SCraig Topper}
343cd3c1658SCraig Topper
344cd3c1658SCraig Topperdefine i32 @mul260(i32 %a) {
345cd3c1658SCraig Topper; RV32I-LABEL: mul260:
346cd3c1658SCraig Topper; RV32I:       # %bb.0:
347cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 260
348cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
349cd3c1658SCraig Topper; RV32I-NEXT:    ret
350cd3c1658SCraig Topper;
351cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul260:
352cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
353cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    slli a1, a0, 8
354cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
355cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
356cd3c1658SCraig Topper  %c = mul i32 %a, 260
357cd3c1658SCraig Topper  ret i32 %c
358cd3c1658SCraig Topper}
359cd3c1658SCraig Topper
360cd3c1658SCraig Topperdefine i32 @mul264(i32 %a) {
361cd3c1658SCraig Topper; RV32I-LABEL: mul264:
362cd3c1658SCraig Topper; RV32I:       # %bb.0:
363cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 264
364cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
365cd3c1658SCraig Topper; RV32I-NEXT:    ret
366cd3c1658SCraig Topper;
367cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul264:
368cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
369cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    slli a1, a0, 8
370cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
371cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
372cd3c1658SCraig Topper  %c = mul i32 %a, 264
373cd3c1658SCraig Topper  ret i32 %c
374cd3c1658SCraig Topper}
375cd3c1658SCraig Topper
376cd3c1658SCraig Topperdefine i32 @mul11(i32 %a) {
377cd3c1658SCraig Topper; RV32I-LABEL: mul11:
378cd3c1658SCraig Topper; RV32I:       # %bb.0:
379cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 11
380cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
381cd3c1658SCraig Topper; RV32I-NEXT:    ret
382cd3c1658SCraig Topper;
383cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul11:
384cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
385cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a0, 2
386cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 1
387cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
388cd3c1658SCraig Topper  %c = mul i32 %a, 11
389cd3c1658SCraig Topper  ret i32 %c
390cd3c1658SCraig Topper}
391cd3c1658SCraig Topper
392cd3c1658SCraig Topperdefine i32 @mul19(i32 %a) {
393cd3c1658SCraig Topper; RV32I-LABEL: mul19:
394cd3c1658SCraig Topper; RV32I:       # %bb.0:
395cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 19
396cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
397cd3c1658SCraig Topper; RV32I-NEXT:    ret
398cd3c1658SCraig Topper;
399cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul19:
400cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
401cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a0, 3
402cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 1
403cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
404cd3c1658SCraig Topper  %c = mul i32 %a, 19
405cd3c1658SCraig Topper  ret i32 %c
406cd3c1658SCraig Topper}
407cd3c1658SCraig Topper
408cd3c1658SCraig Topperdefine i32 @mul13(i32 %a) {
409cd3c1658SCraig Topper; RV32I-LABEL: mul13:
410cd3c1658SCraig Topper; RV32I:       # %bb.0:
411cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 13
412cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
413cd3c1658SCraig Topper; RV32I-NEXT:    ret
414cd3c1658SCraig Topper;
415cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul13:
416cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
417cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a0, 1
418cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
419cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
420cd3c1658SCraig Topper  %c = mul i32 %a, 13
421cd3c1658SCraig Topper  ret i32 %c
422cd3c1658SCraig Topper}
423cd3c1658SCraig Topper
424cd3c1658SCraig Topperdefine i32 @mul21(i32 %a) {
425cd3c1658SCraig Topper; RV32I-LABEL: mul21:
426cd3c1658SCraig Topper; RV32I:       # %bb.0:
427cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 21
428cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
429cd3c1658SCraig Topper; RV32I-NEXT:    ret
430cd3c1658SCraig Topper;
431cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul21:
432cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
433cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a0, 2
434cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
435cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
436cd3c1658SCraig Topper  %c = mul i32 %a, 21
437cd3c1658SCraig Topper  ret i32 %c
438cd3c1658SCraig Topper}
439cd3c1658SCraig Topper
440cd3c1658SCraig Topperdefine i32 @mul37(i32 %a) {
441cd3c1658SCraig Topper; RV32I-LABEL: mul37:
442cd3c1658SCraig Topper; RV32I:       # %bb.0:
443cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 37
444cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
445cd3c1658SCraig Topper; RV32I-NEXT:    ret
446cd3c1658SCraig Topper;
447cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul37:
448cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
449cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a0, 3
450cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
451cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
452cd3c1658SCraig Topper  %c = mul i32 %a, 37
453cd3c1658SCraig Topper  ret i32 %c
454cd3c1658SCraig Topper}
455cd3c1658SCraig Topper
456cd3c1658SCraig Topperdefine i32 @mul25(i32 %a) {
457cd3c1658SCraig Topper; RV32I-LABEL: mul25:
458cd3c1658SCraig Topper; RV32I:       # %bb.0:
459cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 25
460cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
461cd3c1658SCraig Topper; RV32I-NEXT:    ret
462cd3c1658SCraig Topper;
463cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul25:
464cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
465cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
466cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
467cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
468cd3c1658SCraig Topper  %c = mul i32 %a, 25
469cd3c1658SCraig Topper  ret i32 %c
470cd3c1658SCraig Topper}
471cd3c1658SCraig Topper
472cd3c1658SCraig Topperdefine i32 @mul41(i32 %a) {
473cd3c1658SCraig Topper; RV32I-LABEL: mul41:
474cd3c1658SCraig Topper; RV32I:       # %bb.0:
475cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 41
476cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
477cd3c1658SCraig Topper; RV32I-NEXT:    ret
478cd3c1658SCraig Topper;
479cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul41:
480cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
481cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a0, 2
482cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
483cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
484cd3c1658SCraig Topper  %c = mul i32 %a, 41
485cd3c1658SCraig Topper  ret i32 %c
486cd3c1658SCraig Topper}
487cd3c1658SCraig Topper
488cd3c1658SCraig Topperdefine i32 @mul73(i32 %a) {
489cd3c1658SCraig Topper; RV32I-LABEL: mul73:
490cd3c1658SCraig Topper; RV32I:       # %bb.0:
491cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 73
492cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
493cd3c1658SCraig Topper; RV32I-NEXT:    ret
494cd3c1658SCraig Topper;
495cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul73:
496cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
497cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a0, 3
498cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
499cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
500cd3c1658SCraig Topper  %c = mul i32 %a, 73
501cd3c1658SCraig Topper  ret i32 %c
502cd3c1658SCraig Topper}
503cd3c1658SCraig Topper
504cd3c1658SCraig Topperdefine i32 @mul27(i32 %a) {
505cd3c1658SCraig Topper; RV32I-LABEL: mul27:
506cd3c1658SCraig Topper; RV32I:       # %bb.0:
507cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 27
508cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
509cd3c1658SCraig Topper; RV32I-NEXT:    ret
510cd3c1658SCraig Topper;
511cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul27:
512cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
513cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
514cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
515cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
516cd3c1658SCraig Topper  %c = mul i32 %a, 27
517cd3c1658SCraig Topper  ret i32 %c
518cd3c1658SCraig Topper}
519cd3c1658SCraig Topper
520cd3c1658SCraig Topperdefine i32 @mul45(i32 %a) {
521cd3c1658SCraig Topper; RV32I-LABEL: mul45:
522cd3c1658SCraig Topper; RV32I:       # %bb.0:
523cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 45
524cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
525cd3c1658SCraig Topper; RV32I-NEXT:    ret
526cd3c1658SCraig Topper;
527cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul45:
528cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
529cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
530cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
531cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
532cd3c1658SCraig Topper  %c = mul i32 %a, 45
533cd3c1658SCraig Topper  ret i32 %c
534cd3c1658SCraig Topper}
535cd3c1658SCraig Topper
536cd3c1658SCraig Topperdefine i32 @mul81(i32 %a) {
537cd3c1658SCraig Topper; RV32I-LABEL: mul81:
538cd3c1658SCraig Topper; RV32I:       # %bb.0:
539cd3c1658SCraig Topper; RV32I-NEXT:    li a1, 81
540cd3c1658SCraig Topper; RV32I-NEXT:    mul a0, a0, a1
541cd3c1658SCraig Topper; RV32I-NEXT:    ret
542cd3c1658SCraig Topper;
543cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul81:
544cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
545cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
546cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
547cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
548cd3c1658SCraig Topper  %c = mul i32 %a, 81
549cd3c1658SCraig Topper  ret i32 %c
550cd3c1658SCraig Topper}
551cd3c1658SCraig Topper
552cd3c1658SCraig Topperdefine i32 @mul4098(i32 %a) {
553cd3c1658SCraig Topper; RV32I-LABEL: mul4098:
554cd3c1658SCraig Topper; RV32I:       # %bb.0:
555cd3c1658SCraig Topper; RV32I-NEXT:    slli a1, a0, 1
556cd3c1658SCraig Topper; RV32I-NEXT:    slli a0, a0, 12
557cd3c1658SCraig Topper; RV32I-NEXT:    add a0, a0, a1
558cd3c1658SCraig Topper; RV32I-NEXT:    ret
559cd3c1658SCraig Topper;
560cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul4098:
561cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
562cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    slli a1, a0, 12
563cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
564cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
565cd3c1658SCraig Topper  %c = mul i32 %a, 4098
566cd3c1658SCraig Topper  ret i32 %c
567cd3c1658SCraig Topper}
568cd3c1658SCraig Topper
569cd3c1658SCraig Topperdefine i32 @mul4100(i32 %a) {
570cd3c1658SCraig Topper; RV32I-LABEL: mul4100:
571cd3c1658SCraig Topper; RV32I:       # %bb.0:
572cd3c1658SCraig Topper; RV32I-NEXT:    slli a1, a0, 2
573cd3c1658SCraig Topper; RV32I-NEXT:    slli a0, a0, 12
574cd3c1658SCraig Topper; RV32I-NEXT:    add a0, a0, a1
575cd3c1658SCraig Topper; RV32I-NEXT:    ret
576cd3c1658SCraig Topper;
577cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul4100:
578cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
579cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    slli a1, a0, 12
580cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
581cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
582cd3c1658SCraig Topper  %c = mul i32 %a, 4100
583cd3c1658SCraig Topper  ret i32 %c
584cd3c1658SCraig Topper}
585cd3c1658SCraig Topper
586cd3c1658SCraig Topperdefine i32 @mul4104(i32 %a) {
587cd3c1658SCraig Topper; RV32I-LABEL: mul4104:
588cd3c1658SCraig Topper; RV32I:       # %bb.0:
589cd3c1658SCraig Topper; RV32I-NEXT:    slli a1, a0, 3
590cd3c1658SCraig Topper; RV32I-NEXT:    slli a0, a0, 12
591cd3c1658SCraig Topper; RV32I-NEXT:    add a0, a0, a1
592cd3c1658SCraig Topper; RV32I-NEXT:    ret
593cd3c1658SCraig Topper;
594cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul4104:
595cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
596cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    slli a1, a0, 12
597cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
598cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
599cd3c1658SCraig Topper  %c = mul i32 %a, 4104
600cd3c1658SCraig Topper  ret i32 %c
601cd3c1658SCraig Topper}
602cd3c1658SCraig Topper
603cd3c1658SCraig Topperdefine i32 @add4104(i32 %a) {
604*814902a0SCraig Topper; RV32I-LABEL: add4104:
605*814902a0SCraig Topper; RV32I:       # %bb.0:
606*814902a0SCraig Topper; RV32I-NEXT:    lui a1, 1
607*814902a0SCraig Topper; RV32I-NEXT:    addi a1, a1, 8
608*814902a0SCraig Topper; RV32I-NEXT:    add a0, a0, a1
609*814902a0SCraig Topper; RV32I-NEXT:    ret
610*814902a0SCraig Topper;
611*814902a0SCraig Topper; RV32XTHEADBA-LABEL: add4104:
612*814902a0SCraig Topper; RV32XTHEADBA:       # %bb.0:
613*814902a0SCraig Topper; RV32XTHEADBA-NEXT:    li a1, 1026
614*814902a0SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
615*814902a0SCraig Topper; RV32XTHEADBA-NEXT:    ret
616cd3c1658SCraig Topper  %c = add i32 %a, 4104
617cd3c1658SCraig Topper  ret i32 %c
618cd3c1658SCraig Topper}
619cd3c1658SCraig Topper
620cd3c1658SCraig Topperdefine i32 @add8208(i32 %a) {
621*814902a0SCraig Topper; RV32I-LABEL: add8208:
622*814902a0SCraig Topper; RV32I:       # %bb.0:
623*814902a0SCraig Topper; RV32I-NEXT:    lui a1, 2
624*814902a0SCraig Topper; RV32I-NEXT:    addi a1, a1, 16
625*814902a0SCraig Topper; RV32I-NEXT:    add a0, a0, a1
626*814902a0SCraig Topper; RV32I-NEXT:    ret
627*814902a0SCraig Topper;
628*814902a0SCraig Topper; RV32XTHEADBA-LABEL: add8208:
629*814902a0SCraig Topper; RV32XTHEADBA:       # %bb.0:
630*814902a0SCraig Topper; RV32XTHEADBA-NEXT:    li a1, 1026
631*814902a0SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 3
632*814902a0SCraig Topper; RV32XTHEADBA-NEXT:    ret
633cd3c1658SCraig Topper  %c = add i32 %a, 8208
634cd3c1658SCraig Topper  ret i32 %c
635cd3c1658SCraig Topper}
636cd3c1658SCraig Topper
637cd3c1658SCraig Topperdefine i32 @add8192(i32 %a) {
638cd3c1658SCraig Topper; CHECK-LABEL: add8192:
639cd3c1658SCraig Topper; CHECK:       # %bb.0:
640cd3c1658SCraig Topper; CHECK-NEXT:    lui a1, 2
641cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
642cd3c1658SCraig Topper; CHECK-NEXT:    ret
643cd3c1658SCraig Topper  %c = add i32 %a, 8192
644cd3c1658SCraig Topper  ret i32 %c
645cd3c1658SCraig Topper}
646cd3c1658SCraig Topper
647cd3c1658SCraig Topperdefine i32 @addshl_5_6(i32 %a, i32 %b) {
648cd3c1658SCraig Topper; CHECK-LABEL: addshl_5_6:
649cd3c1658SCraig Topper; CHECK:       # %bb.0:
650cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
651cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 6
652cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
653cd3c1658SCraig Topper; CHECK-NEXT:    ret
654cd3c1658SCraig Topper  %c = shl i32 %a, 5
655cd3c1658SCraig Topper  %d = shl i32 %b, 6
656cd3c1658SCraig Topper  %e = add i32 %c, %d
657cd3c1658SCraig Topper  ret i32 %e
658cd3c1658SCraig Topper}
659cd3c1658SCraig Topper
660cd3c1658SCraig Topperdefine i32 @addshl_5_7(i32 %a, i32 %b) {
661cd3c1658SCraig Topper; CHECK-LABEL: addshl_5_7:
662cd3c1658SCraig Topper; CHECK:       # %bb.0:
663cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
664cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 7
665cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
666cd3c1658SCraig Topper; CHECK-NEXT:    ret
667cd3c1658SCraig Topper  %c = shl i32 %a, 5
668cd3c1658SCraig Topper  %d = shl i32 %b, 7
669cd3c1658SCraig Topper  %e = add i32 %c, %d
670cd3c1658SCraig Topper  ret i32 %e
671cd3c1658SCraig Topper}
672cd3c1658SCraig Topper
673cd3c1658SCraig Topperdefine i32 @addshl_5_8(i32 %a, i32 %b) {
674cd3c1658SCraig Topper; CHECK-LABEL: addshl_5_8:
675cd3c1658SCraig Topper; CHECK:       # %bb.0:
676cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 5
677cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a1, 8
678cd3c1658SCraig Topper; CHECK-NEXT:    add a0, a0, a1
679cd3c1658SCraig Topper; CHECK-NEXT:    ret
680cd3c1658SCraig Topper  %c = shl i32 %a, 5
681cd3c1658SCraig Topper  %d = shl i32 %b, 8
682cd3c1658SCraig Topper  %e = add i32 %c, %d
683cd3c1658SCraig Topper  ret i32 %e
684cd3c1658SCraig Topper}
685cd3c1658SCraig Topper
686cd3c1658SCraig Topperdefine i32 @srli_1_sh2add(ptr %0, i32 %1) {
687cd3c1658SCraig Topper; RV32I-LABEL: srli_1_sh2add:
688cd3c1658SCraig Topper; RV32I:       # %bb.0:
689cd3c1658SCraig Topper; RV32I-NEXT:    slli a1, a1, 1
690cd3c1658SCraig Topper; RV32I-NEXT:    andi a1, a1, -4
691cd3c1658SCraig Topper; RV32I-NEXT:    add a0, a0, a1
692cd3c1658SCraig Topper; RV32I-NEXT:    lw a0, 0(a0)
693cd3c1658SCraig Topper; RV32I-NEXT:    ret
694cd3c1658SCraig Topper;
695cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_1_sh2add:
696cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
697cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    srli a1, a1, 1
698cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
699cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    lw a0, 0(a0)
700cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
701cd3c1658SCraig Topper  %3 = lshr i32 %1, 1
702cd3c1658SCraig Topper  %4 = getelementptr inbounds i32, ptr %0, i32 %3
703cd3c1658SCraig Topper  %5 = load i32, ptr %4, align 4
704cd3c1658SCraig Topper  ret i32 %5
705cd3c1658SCraig Topper}
706cd3c1658SCraig Topper
707cd3c1658SCraig Topperdefine i64 @srli_2_sh3add(ptr %0, i32 %1) {
708cd3c1658SCraig Topper; RV32I-LABEL: srli_2_sh3add:
709cd3c1658SCraig Topper; RV32I:       # %bb.0:
710cd3c1658SCraig Topper; RV32I-NEXT:    slli a1, a1, 1
711cd3c1658SCraig Topper; RV32I-NEXT:    andi a1, a1, -8
712cd3c1658SCraig Topper; RV32I-NEXT:    add a1, a0, a1
713cd3c1658SCraig Topper; RV32I-NEXT:    lw a0, 0(a1)
714cd3c1658SCraig Topper; RV32I-NEXT:    lw a1, 4(a1)
715cd3c1658SCraig Topper; RV32I-NEXT:    ret
716cd3c1658SCraig Topper;
717cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_2_sh3add:
718cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
719cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    srli a1, a1, 2
720cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a1, 3
721cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    lw a0, 0(a1)
722cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    lw a1, 4(a1)
723cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
724cd3c1658SCraig Topper  %3 = lshr i32 %1, 2
725cd3c1658SCraig Topper  %4 = getelementptr inbounds i64, ptr %0, i32 %3
726cd3c1658SCraig Topper  %5 = load i64, ptr %4, align 8
727cd3c1658SCraig Topper  ret i64 %5
728cd3c1658SCraig Topper}
729cd3c1658SCraig Topper
730cd3c1658SCraig Topperdefine signext i16 @srli_2_sh1add(ptr %0, i32 %1) {
731cd3c1658SCraig Topper; RV32I-LABEL: srli_2_sh1add:
732cd3c1658SCraig Topper; RV32I:       # %bb.0:
733cd3c1658SCraig Topper; RV32I-NEXT:    srli a1, a1, 1
734cd3c1658SCraig Topper; RV32I-NEXT:    andi a1, a1, -2
735cd3c1658SCraig Topper; RV32I-NEXT:    add a0, a0, a1
736cd3c1658SCraig Topper; RV32I-NEXT:    lh a0, 0(a0)
737cd3c1658SCraig Topper; RV32I-NEXT:    ret
738cd3c1658SCraig Topper;
739cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_2_sh1add:
740cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
741cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    srli a1, a1, 2
742cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 1
743cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    lh a0, 0(a0)
744cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
745cd3c1658SCraig Topper  %3 = lshr i32 %1, 2
746cd3c1658SCraig Topper  %4 = getelementptr inbounds i16, ptr %0, i32 %3
747cd3c1658SCraig Topper  %5 = load i16, ptr %4, align 2
748cd3c1658SCraig Topper  ret i16 %5
749cd3c1658SCraig Topper}
750cd3c1658SCraig Topper
751cd3c1658SCraig Topperdefine i32 @srli_3_sh2add(ptr %0, i32 %1) {
752cd3c1658SCraig Topper; RV32I-LABEL: srli_3_sh2add:
753cd3c1658SCraig Topper; RV32I:       # %bb.0:
754cd3c1658SCraig Topper; RV32I-NEXT:    srli a1, a1, 1
755cd3c1658SCraig Topper; RV32I-NEXT:    andi a1, a1, -4
756cd3c1658SCraig Topper; RV32I-NEXT:    add a0, a0, a1
757cd3c1658SCraig Topper; RV32I-NEXT:    lw a0, 0(a0)
758cd3c1658SCraig Topper; RV32I-NEXT:    ret
759cd3c1658SCraig Topper;
760cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_3_sh2add:
761cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
762cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    srli a1, a1, 3
763cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a1, 2
764cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    lw a0, 0(a0)
765cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
766cd3c1658SCraig Topper  %3 = lshr i32 %1, 3
767cd3c1658SCraig Topper  %4 = getelementptr inbounds i32, ptr %0, i32 %3
768cd3c1658SCraig Topper  %5 = load i32, ptr %4, align 4
769cd3c1658SCraig Topper  ret i32 %5
770cd3c1658SCraig Topper}
771cd3c1658SCraig Topper
772cd3c1658SCraig Topperdefine i64 @srli_4_sh3add(ptr %0, i32 %1) {
773cd3c1658SCraig Topper; RV32I-LABEL: srli_4_sh3add:
774cd3c1658SCraig Topper; RV32I:       # %bb.0:
775cd3c1658SCraig Topper; RV32I-NEXT:    srli a1, a1, 1
776cd3c1658SCraig Topper; RV32I-NEXT:    andi a1, a1, -8
777cd3c1658SCraig Topper; RV32I-NEXT:    add a1, a0, a1
778cd3c1658SCraig Topper; RV32I-NEXT:    lw a0, 0(a1)
779cd3c1658SCraig Topper; RV32I-NEXT:    lw a1, 4(a1)
780cd3c1658SCraig Topper; RV32I-NEXT:    ret
781cd3c1658SCraig Topper;
782cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: srli_4_sh3add:
783cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
784cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    srli a1, a1, 4
785cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a1, a0, a1, 3
786cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    lw a0, 0(a1)
787cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    lw a1, 4(a1)
788cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
789cd3c1658SCraig Topper  %3 = lshr i32 %1, 4
790cd3c1658SCraig Topper  %4 = getelementptr inbounds i64, ptr %0, i32 %3
791cd3c1658SCraig Topper  %5 = load i64, ptr %4, align 8
792cd3c1658SCraig Topper  ret i64 %5
793cd3c1658SCraig Topper}
794cd3c1658SCraig Topper
795cd3c1658SCraig Topperdefine i32 @mul_neg1(i32 %a) {
796cd3c1658SCraig Topper; CHECK-LABEL: mul_neg1:
797cd3c1658SCraig Topper; CHECK:       # %bb.0:
798cd3c1658SCraig Topper; CHECK-NEXT:    neg a0, a0
799cd3c1658SCraig Topper; CHECK-NEXT:    ret
800cd3c1658SCraig Topper  %c = mul i32 %a, -1
801cd3c1658SCraig Topper  ret i32 %c
802cd3c1658SCraig Topper}
803cd3c1658SCraig Topper
804cd3c1658SCraig Topperdefine i32 @mul_neg2(i32 %a) {
805cd3c1658SCraig Topper; CHECK-LABEL: mul_neg2:
806cd3c1658SCraig Topper; CHECK:       # %bb.0:
807cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 1
808cd3c1658SCraig Topper; CHECK-NEXT:    neg a0, a0
809cd3c1658SCraig Topper; CHECK-NEXT:    ret
810cd3c1658SCraig Topper  %c = mul i32 %a, -2
811cd3c1658SCraig Topper  ret i32 %c
812cd3c1658SCraig Topper}
813cd3c1658SCraig Topper
814cd3c1658SCraig Topperdefine i32 @mul_neg3(i32 %a) {
815cd3c1658SCraig Topper; RV32I-LABEL: mul_neg3:
816cd3c1658SCraig Topper; RV32I:       # %bb.0:
817cd3c1658SCraig Topper; RV32I-NEXT:    slli a1, a0, 1
818cd3c1658SCraig Topper; RV32I-NEXT:    neg a0, a0
819cd3c1658SCraig Topper; RV32I-NEXT:    sub a0, a0, a1
820cd3c1658SCraig Topper; RV32I-NEXT:    ret
821cd3c1658SCraig Topper;
822cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul_neg3:
823cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
824cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
825cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    neg a0, a0
826cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
827cd3c1658SCraig Topper  %c = mul i32 %a, -3
828cd3c1658SCraig Topper  ret i32 %c
829cd3c1658SCraig Topper}
830cd3c1658SCraig Topper
831cd3c1658SCraig Topperdefine i32 @mul_neg4(i32 %a) {
832cd3c1658SCraig Topper; CHECK-LABEL: mul_neg4:
833cd3c1658SCraig Topper; CHECK:       # %bb.0:
834cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 2
835cd3c1658SCraig Topper; CHECK-NEXT:    neg a0, a0
836cd3c1658SCraig Topper; CHECK-NEXT:    ret
837cd3c1658SCraig Topper  %c = mul i32 %a, -4
838cd3c1658SCraig Topper  ret i32 %c
839cd3c1658SCraig Topper}
840cd3c1658SCraig Topper
841cd3c1658SCraig Topperdefine i32 @mul_neg5(i32 %a) {
842cd3c1658SCraig Topper; RV32I-LABEL: mul_neg5:
843cd3c1658SCraig Topper; RV32I:       # %bb.0:
844cd3c1658SCraig Topper; RV32I-NEXT:    slli a1, a0, 2
845cd3c1658SCraig Topper; RV32I-NEXT:    neg a0, a0
846cd3c1658SCraig Topper; RV32I-NEXT:    sub a0, a0, a1
847cd3c1658SCraig Topper; RV32I-NEXT:    ret
848cd3c1658SCraig Topper;
849cd3c1658SCraig Topper; RV32XTHEADBA-LABEL: mul_neg5:
850cd3c1658SCraig Topper; RV32XTHEADBA:       # %bb.0:
851cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
852cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    neg a0, a0
853cd3c1658SCraig Topper; RV32XTHEADBA-NEXT:    ret
854cd3c1658SCraig Topper  %c = mul i32 %a, -5
855cd3c1658SCraig Topper  ret i32 %c
856cd3c1658SCraig Topper}
857cd3c1658SCraig Topper
858cd3c1658SCraig Topperdefine i32 @mul_neg6(i32 %a) {
859cd3c1658SCraig Topper; CHECK-LABEL: mul_neg6:
860cd3c1658SCraig Topper; CHECK:       # %bb.0:
861cd3c1658SCraig Topper; CHECK-NEXT:    li a1, -6
862cd3c1658SCraig Topper; CHECK-NEXT:    mul a0, a0, a1
863cd3c1658SCraig Topper; CHECK-NEXT:    ret
864cd3c1658SCraig Topper  %c = mul i32 %a, -6
865cd3c1658SCraig Topper  ret i32 %c
866cd3c1658SCraig Topper}
867cd3c1658SCraig Topper
868cd3c1658SCraig Topperdefine i32 @mul_neg7(i32 %a) {
869cd3c1658SCraig Topper; CHECK-LABEL: mul_neg7:
870cd3c1658SCraig Topper; CHECK:       # %bb.0:
871cd3c1658SCraig Topper; CHECK-NEXT:    slli a1, a0, 3
872cd3c1658SCraig Topper; CHECK-NEXT:    sub a0, a0, a1
873cd3c1658SCraig Topper; CHECK-NEXT:    ret
874cd3c1658SCraig Topper  %c = mul i32 %a, -7
875cd3c1658SCraig Topper  ret i32 %c
876cd3c1658SCraig Topper}
877cd3c1658SCraig Topper
878cd3c1658SCraig Topperdefine i32 @mul_neg8(i32 %a) {
879cd3c1658SCraig Topper; CHECK-LABEL: mul_neg8:
880cd3c1658SCraig Topper; CHECK:       # %bb.0:
881cd3c1658SCraig Topper; CHECK-NEXT:    slli a0, a0, 3
882cd3c1658SCraig Topper; CHECK-NEXT:    neg a0, a0
883cd3c1658SCraig Topper; CHECK-NEXT:    ret
884cd3c1658SCraig Topper  %c = mul i32 %a, -8
885cd3c1658SCraig Topper  ret i32 %c
886cd3c1658SCraig Topper}
887