Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv32xtheadba.ll
blob332e49771bedf91f168078bf801479e4e3eae6ca
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub
2 ; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefixes=RV32I
4 ; RUN: llc -mtriple=riscv32 -mattr=+m,+xtheadba -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefixes=RV32XTHEADBA
7 define signext i16 @th_addsl_1(i64 %0, ptr %1) {
8 ; RV32I-LABEL: th_addsl_1:
9 ; RV32I:       # %bb.0:
10 ; RV32I-NEXT:    slli a0, a0, 1
11 ; RV32I-NEXT:    add a0, a2, a0
12 ; RV32I-NEXT:    lh a0, 0(a0)
13 ; RV32I-NEXT:    ret
15 ; RV32XTHEADBA-LABEL: th_addsl_1:
16 ; RV32XTHEADBA:       # %bb.0:
17 ; RV32XTHEADBA-NEXT:    th.addsl a0, a2, a0, 1
18 ; RV32XTHEADBA-NEXT:    lh a0, 0(a0)
19 ; RV32XTHEADBA-NEXT:    ret
20   %3 = getelementptr inbounds i16, ptr %1, i64 %0
21   %4 = load i16, ptr %3
22   ret i16 %4
25 define signext i32 @th_addsl_2(i64 %0, ptr %1) {
26 ; RV32I-LABEL: th_addsl_2:
27 ; RV32I:       # %bb.0:
28 ; RV32I-NEXT:    slli a0, a0, 2
29 ; RV32I-NEXT:    add a0, a2, a0
30 ; RV32I-NEXT:    lw a0, 0(a0)
31 ; RV32I-NEXT:    ret
33 ; RV32XTHEADBA-LABEL: th_addsl_2:
34 ; RV32XTHEADBA:       # %bb.0:
35 ; RV32XTHEADBA-NEXT:    th.addsl a0, a2, a0, 2
36 ; RV32XTHEADBA-NEXT:    lw a0, 0(a0)
37 ; RV32XTHEADBA-NEXT:    ret
38   %3 = getelementptr inbounds i32, ptr %1, i64 %0
39   %4 = load i32, ptr %3
40   ret i32 %4
43 define i64 @th_addsl_3(i64 %0, ptr %1) {
44 ; RV32I-LABEL: th_addsl_3:
45 ; RV32I:       # %bb.0:
46 ; RV32I-NEXT:    slli a0, a0, 3
47 ; RV32I-NEXT:    add a2, a2, a0
48 ; RV32I-NEXT:    lw a0, 0(a2)
49 ; RV32I-NEXT:    lw a1, 4(a2)
50 ; RV32I-NEXT:    ret
52 ; RV32XTHEADBA-LABEL: th_addsl_3:
53 ; RV32XTHEADBA:       # %bb.0:
54 ; RV32XTHEADBA-NEXT:    th.addsl a1, a2, a0, 3
55 ; RV32XTHEADBA-NEXT:    lw a0, 0(a1)
56 ; RV32XTHEADBA-NEXT:    lw a1, 4(a1)
57 ; RV32XTHEADBA-NEXT:    ret
58   %3 = getelementptr inbounds i64, ptr %1, i64 %0
59   %4 = load i64, ptr %3
60   ret i64 %4
63 ; Type legalization inserts a sext_inreg after the first add. That add will be
64 ; selected as th.addsl which does not sign extend. SimplifyDemandedBits is unable
65 ; to remove the sext_inreg because it has multiple uses. The ashr will use the
66 ; sext_inreg to become sraiw. This leaves the sext_inreg only used by the shl.
67 ; If the shl is selected as sllw, we don't need the sext_inreg.
68 define i64 @th_addsl_2_extra_sext(i32 %x, i32 %y, i32 %z) {
69 ; RV32I-LABEL: th_addsl_2_extra_sext:
70 ; RV32I:       # %bb.0:
71 ; RV32I-NEXT:    slli a0, a0, 2
72 ; RV32I-NEXT:    add a0, a0, a1
73 ; RV32I-NEXT:    sll a1, a2, a0
74 ; RV32I-NEXT:    srai a2, a0, 2
75 ; RV32I-NEXT:    mul a0, a1, a2
76 ; RV32I-NEXT:    mulh a1, a1, a2
77 ; RV32I-NEXT:    ret
79 ; RV32XTHEADBA-LABEL: th_addsl_2_extra_sext:
80 ; RV32XTHEADBA:       # %bb.0:
81 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
82 ; RV32XTHEADBA-NEXT:    sll a1, a2, a0
83 ; RV32XTHEADBA-NEXT:    srai a2, a0, 2
84 ; RV32XTHEADBA-NEXT:    mul a0, a1, a2
85 ; RV32XTHEADBA-NEXT:    mulh a1, a1, a2
86 ; RV32XTHEADBA-NEXT:    ret
87   %a = shl i32 %x, 2
88   %b = add i32 %a, %y
89   %c = shl i32 %z, %b
90   %d = ashr i32 %b, 2
91   %e = sext i32 %c to i64
92   %f = sext i32 %d to i64
93   %g = mul i64 %e, %f
94   ret i64 %g
97 define i32 @addmul6(i32 %a, i32 %b) {
98 ; RV32I-LABEL: addmul6:
99 ; RV32I:       # %bb.0:
100 ; RV32I-NEXT:    slli a2, a0, 1
101 ; RV32I-NEXT:    slli a0, a0, 3
102 ; RV32I-NEXT:    sub a0, a0, a2
103 ; RV32I-NEXT:    add a0, a0, a1
104 ; RV32I-NEXT:    ret
106 ; RV32XTHEADBA-LABEL: addmul6:
107 ; RV32XTHEADBA:       # %bb.0:
108 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
109 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
110 ; RV32XTHEADBA-NEXT:    ret
111   %c = mul i32 %a, 6
112   %d = add i32 %c, %b
113   ret i32 %d
116 define i32 @addmul10(i32 %a, i32 %b) {
117 ; RV32I-LABEL: addmul10:
118 ; RV32I:       # %bb.0:
119 ; RV32I-NEXT:    li a2, 10
120 ; RV32I-NEXT:    mul a0, a0, a2
121 ; RV32I-NEXT:    add a0, a0, a1
122 ; RV32I-NEXT:    ret
124 ; RV32XTHEADBA-LABEL: addmul10:
125 ; RV32XTHEADBA:       # %bb.0:
126 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
127 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
128 ; RV32XTHEADBA-NEXT:    ret
129   %c = mul i32 %a, 10
130   %d = add i32 %c, %b
131   ret i32 %d
134 define i32 @addmul12(i32 %a, i32 %b) {
135 ; RV32I-LABEL: addmul12:
136 ; RV32I:       # %bb.0:
137 ; RV32I-NEXT:    slli a2, a0, 2
138 ; RV32I-NEXT:    slli a0, a0, 4
139 ; RV32I-NEXT:    sub a0, a0, a2
140 ; RV32I-NEXT:    add a0, a0, a1
141 ; RV32I-NEXT:    ret
143 ; RV32XTHEADBA-LABEL: addmul12:
144 ; RV32XTHEADBA:       # %bb.0:
145 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
146 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
147 ; RV32XTHEADBA-NEXT:    ret
148   %c = mul i32 %a, 12
149   %d = add i32 %c, %b
150   ret i32 %d
153 define i32 @addmul18(i32 %a, i32 %b) {
154 ; RV32I-LABEL: addmul18:
155 ; RV32I:       # %bb.0:
156 ; RV32I-NEXT:    li a2, 18
157 ; RV32I-NEXT:    mul a0, a0, a2
158 ; RV32I-NEXT:    add a0, a0, a1
159 ; RV32I-NEXT:    ret
161 ; RV32XTHEADBA-LABEL: addmul18:
162 ; RV32XTHEADBA:       # %bb.0:
163 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
164 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 1
165 ; RV32XTHEADBA-NEXT:    ret
166   %c = mul i32 %a, 18
167   %d = add i32 %c, %b
168   ret i32 %d
171 define i32 @addmul20(i32 %a, i32 %b) {
172 ; RV32I-LABEL: addmul20:
173 ; RV32I:       # %bb.0:
174 ; RV32I-NEXT:    li a2, 20
175 ; RV32I-NEXT:    mul a0, a0, a2
176 ; RV32I-NEXT:    add a0, a0, a1
177 ; RV32I-NEXT:    ret
179 ; RV32XTHEADBA-LABEL: addmul20:
180 ; RV32XTHEADBA:       # %bb.0:
181 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
182 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
183 ; RV32XTHEADBA-NEXT:    ret
184   %c = mul i32 %a, 20
185   %d = add i32 %c, %b
186   ret i32 %d
189 define i32 @addmul24(i32 %a, i32 %b) {
190 ; RV32I-LABEL: addmul24:
191 ; RV32I:       # %bb.0:
192 ; RV32I-NEXT:    slli a2, a0, 3
193 ; RV32I-NEXT:    slli a0, a0, 5
194 ; RV32I-NEXT:    sub a0, a0, a2
195 ; RV32I-NEXT:    add a0, a0, a1
196 ; RV32I-NEXT:    ret
198 ; RV32XTHEADBA-LABEL: addmul24:
199 ; RV32XTHEADBA:       # %bb.0:
200 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
201 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
202 ; RV32XTHEADBA-NEXT:    ret
203   %c = mul i32 %a, 24
204   %d = add i32 %c, %b
205   ret i32 %d
208 define i32 @addmul36(i32 %a, i32 %b) {
209 ; RV32I-LABEL: addmul36:
210 ; RV32I:       # %bb.0:
211 ; RV32I-NEXT:    li a2, 36
212 ; RV32I-NEXT:    mul a0, a0, a2
213 ; RV32I-NEXT:    add a0, a0, a1
214 ; RV32I-NEXT:    ret
216 ; RV32XTHEADBA-LABEL: addmul36:
217 ; RV32XTHEADBA:       # %bb.0:
218 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
219 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 2
220 ; RV32XTHEADBA-NEXT:    ret
221   %c = mul i32 %a, 36
222   %d = add i32 %c, %b
223   ret i32 %d
226 define i32 @addmul40(i32 %a, i32 %b) {
227 ; RV32I-LABEL: addmul40:
228 ; RV32I:       # %bb.0:
229 ; RV32I-NEXT:    li a2, 40
230 ; RV32I-NEXT:    mul a0, a0, a2
231 ; RV32I-NEXT:    add a0, a0, a1
232 ; RV32I-NEXT:    ret
234 ; RV32XTHEADBA-LABEL: addmul40:
235 ; RV32XTHEADBA:       # %bb.0:
236 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
237 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
238 ; RV32XTHEADBA-NEXT:    ret
239   %c = mul i32 %a, 40
240   %d = add i32 %c, %b
241   ret i32 %d
244 define i32 @addmul72(i32 %a, i32 %b) {
245 ; RV32I-LABEL: addmul72:
246 ; RV32I:       # %bb.0:
247 ; RV32I-NEXT:    li a2, 72
248 ; RV32I-NEXT:    mul a0, a0, a2
249 ; RV32I-NEXT:    add a0, a0, a1
250 ; RV32I-NEXT:    ret
252 ; RV32XTHEADBA-LABEL: addmul72:
253 ; RV32XTHEADBA:       # %bb.0:
254 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
255 ; RV32XTHEADBA-NEXT:    th.addsl a0, a1, a0, 3
256 ; RV32XTHEADBA-NEXT:    ret
257   %c = mul i32 %a, 72
258   %d = add i32 %c, %b
259   ret i32 %d
262 define i32 @mul96(i32 %a) {
263 ; RV32I-LABEL: mul96:
264 ; RV32I:       # %bb.0:
265 ; RV32I-NEXT:    slli a1, a0, 5
266 ; RV32I-NEXT:    slli a0, a0, 7
267 ; RV32I-NEXT:    sub a0, a0, a1
268 ; RV32I-NEXT:    ret
270 ; RV32XTHEADBA-LABEL: mul96:
271 ; RV32XTHEADBA:       # %bb.0:
272 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 1
273 ; RV32XTHEADBA-NEXT:    slli a0, a0, 5
274 ; RV32XTHEADBA-NEXT:    ret
275   %c = mul i32 %a, 96
276   ret i32 %c
279 define i32 @mul160(i32 %a) {
280 ; RV32I-LABEL: mul160:
281 ; RV32I:       # %bb.0:
282 ; RV32I-NEXT:    li a1, 160
283 ; RV32I-NEXT:    mul a0, a0, a1
284 ; RV32I-NEXT:    ret
286 ; RV32XTHEADBA-LABEL: mul160:
287 ; RV32XTHEADBA:       # %bb.0:
288 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
289 ; RV32XTHEADBA-NEXT:    slli a0, a0, 5
290 ; RV32XTHEADBA-NEXT:    ret
291   %c = mul i32 %a, 160
292   ret i32 %c
295 define i32 @mul200(i32 %a) {
296 ; RV32I-LABEL: mul200:
297 ; RV32I:       # %bb.0:
298 ; RV32I-NEXT:    li a1, 200
299 ; RV32I-NEXT:    mul a0, a0, a1
300 ; RV32I-NEXT:    ret
302 ; RV32XTHEADBA-LABEL: mul200:
303 ; RV32XTHEADBA:       # %bb.0:
304 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
305 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 2
306 ; RV32XTHEADBA-NEXT:    slli a0, a0, 3
307 ; RV32XTHEADBA-NEXT:    ret
308   %c = mul i32 %a, 200
309   ret i32 %c
312 define i32 @mul288(i32 %a) {
313 ; RV32I-LABEL: mul288:
314 ; RV32I:       # %bb.0:
315 ; RV32I-NEXT:    li a1, 288
316 ; RV32I-NEXT:    mul a0, a0, a1
317 ; RV32I-NEXT:    ret
319 ; RV32XTHEADBA-LABEL: mul288:
320 ; RV32XTHEADBA:       # %bb.0:
321 ; RV32XTHEADBA-NEXT:    th.addsl a0, a0, a0, 3
322 ; RV32XTHEADBA-NEXT:    slli a0, a0, 5
323 ; RV32XTHEADBA-NEXT:    ret
324   %c = mul i32 %a, 288
325   ret i32 %c