Revert "[lldb][test] Remove compiler version check and use regex" (#124101)
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / mul.ll
blob58cc0e7d6484a2623b336df38cdb2b2c37fbc1d5
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3 ; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
5 ;; Exercise the 'mul' LLVM IR: https://llvm.org/docs/LangRef.html#mul-instruction
7 define i1 @mul_i1(i1 %a, i1 %b) {
8 ; LA32-LABEL: mul_i1:
9 ; LA32:       # %bb.0: # %entry
10 ; LA32-NEXT:    mul.w $a0, $a0, $a1
11 ; LA32-NEXT:    ret
13 ; LA64-LABEL: mul_i1:
14 ; LA64:       # %bb.0: # %entry
15 ; LA64-NEXT:    mul.d $a0, $a0, $a1
16 ; LA64-NEXT:    ret
17 entry:
18   %r = mul i1 %a, %b
19   ret i1 %r
22 define i8 @mul_i8(i8 %a, i8 %b) {
23 ; LA32-LABEL: mul_i8:
24 ; LA32:       # %bb.0: # %entry
25 ; LA32-NEXT:    mul.w $a0, $a0, $a1
26 ; LA32-NEXT:    ret
28 ; LA64-LABEL: mul_i8:
29 ; LA64:       # %bb.0: # %entry
30 ; LA64-NEXT:    mul.d $a0, $a0, $a1
31 ; LA64-NEXT:    ret
32 entry:
33   %r = mul i8 %a, %b
34   ret i8 %r
37 define i16 @mul_i16(i16 %a, i16 %b) {
38 ; LA32-LABEL: mul_i16:
39 ; LA32:       # %bb.0: # %entry
40 ; LA32-NEXT:    mul.w $a0, $a0, $a1
41 ; LA32-NEXT:    ret
43 ; LA64-LABEL: mul_i16:
44 ; LA64:       # %bb.0: # %entry
45 ; LA64-NEXT:    mul.d $a0, $a0, $a1
46 ; LA64-NEXT:    ret
47 entry:
48   %r = mul i16 %a, %b
49   ret i16 %r
52 define i32 @mul_i32(i32 %a, i32 %b) {
53 ; LA32-LABEL: mul_i32:
54 ; LA32:       # %bb.0: # %entry
55 ; LA32-NEXT:    mul.w $a0, $a0, $a1
56 ; LA32-NEXT:    ret
58 ; LA64-LABEL: mul_i32:
59 ; LA64:       # %bb.0: # %entry
60 ; LA64-NEXT:    mul.d $a0, $a0, $a1
61 ; LA64-NEXT:    ret
62 entry:
63   %r = mul i32 %a, %b
64   ret i32 %r
67 define i64 @mul_i64(i64 %a, i64 %b) {
68 ; LA32-LABEL: mul_i64:
69 ; LA32:       # %bb.0: # %entry
70 ; LA32-NEXT:    mul.w $a3, $a0, $a3
71 ; LA32-NEXT:    mulh.wu $a4, $a0, $a2
72 ; LA32-NEXT:    add.w $a3, $a4, $a3
73 ; LA32-NEXT:    mul.w $a1, $a1, $a2
74 ; LA32-NEXT:    add.w $a1, $a3, $a1
75 ; LA32-NEXT:    mul.w $a0, $a0, $a2
76 ; LA32-NEXT:    ret
78 ; LA64-LABEL: mul_i64:
79 ; LA64:       # %bb.0: # %entry
80 ; LA64-NEXT:    mul.d $a0, $a0, $a1
81 ; LA64-NEXT:    ret
82 entry:
83   %r = mul i64 %a, %b
84   ret i64 %r
87 define i64 @mul_pow2(i64 %a) {
88 ; LA32-LABEL: mul_pow2:
89 ; LA32:       # %bb.0:
90 ; LA32-NEXT:    srli.w $a2, $a0, 29
91 ; LA32-NEXT:    slli.w $a1, $a1, 3
92 ; LA32-NEXT:    or $a1, $a1, $a2
93 ; LA32-NEXT:    slli.w $a0, $a0, 3
94 ; LA32-NEXT:    ret
96 ; LA64-LABEL: mul_pow2:
97 ; LA64:       # %bb.0:
98 ; LA64-NEXT:    slli.d $a0, $a0, 3
99 ; LA64-NEXT:    ret
100   %1 = mul i64 %a, 8
101   ret i64 %1
104 define i64 @mul_p5(i64 %a) {
105 ; LA32-LABEL: mul_p5:
106 ; LA32:       # %bb.0:
107 ; LA32-NEXT:    ori $a2, $zero, 5
108 ; LA32-NEXT:    mulh.wu $a2, $a0, $a2
109 ; LA32-NEXT:    alsl.w $a1, $a1, $a1, 2
110 ; LA32-NEXT:    add.w $a1, $a2, $a1
111 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
112 ; LA32-NEXT:    ret
114 ; LA64-LABEL: mul_p5:
115 ; LA64:       # %bb.0:
116 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
117 ; LA64-NEXT:    ret
118   %1 = mul i64 %a, 5
119   ret i64 %1
122 define i32 @mulh_w(i32 %a, i32 %b) {
123 ; LA32-LABEL: mulh_w:
124 ; LA32:       # %bb.0:
125 ; LA32-NEXT:    mulh.w $a0, $a0, $a1
126 ; LA32-NEXT:    ret
128 ; LA64-LABEL: mulh_w:
129 ; LA64:       # %bb.0:
130 ; LA64-NEXT:    mulw.d.w $a0, $a0, $a1
131 ; LA64-NEXT:    srli.d $a0, $a0, 32
132 ; LA64-NEXT:    ret
133   %1 = sext i32 %a to i64
134   %2 = sext i32 %b to i64
135   %3 = mul i64 %1, %2
136   %4 = lshr i64 %3, 32
137   %5 = trunc i64 %4 to i32
138   ret i32 %5
141 define i32 @mulh_wu(i32 %a, i32 %b) {
142 ; LA32-LABEL: mulh_wu:
143 ; LA32:       # %bb.0:
144 ; LA32-NEXT:    mulh.wu $a0, $a0, $a1
145 ; LA32-NEXT:    ret
147 ; LA64-LABEL: mulh_wu:
148 ; LA64:       # %bb.0:
149 ; LA64-NEXT:    mulw.d.wu $a0, $a0, $a1
150 ; LA64-NEXT:    srli.d $a0, $a0, 32
151 ; LA64-NEXT:    ret
152   %1 = zext i32 %a to i64
153   %2 = zext i32 %b to i64
154   %3 = mul i64 %1, %2
155   %4 = lshr i64 %3, 32
156   %5 = trunc i64 %4 to i32
157   ret i32 %5
160 define i64 @mulh_d(i64 %a, i64 %b) {
161 ; LA32-LABEL: mulh_d:
162 ; LA32:       # %bb.0:
163 ; LA32-NEXT:    srai.w $a5, $a1, 31
164 ; LA32-NEXT:    srai.w $a6, $a3, 31
165 ; LA32-NEXT:    mulh.wu $a4, $a0, $a2
166 ; LA32-NEXT:    mul.w $a7, $a1, $a2
167 ; LA32-NEXT:    add.w $a4, $a7, $a4
168 ; LA32-NEXT:    sltu $a7, $a4, $a7
169 ; LA32-NEXT:    mulh.wu $t0, $a1, $a2
170 ; LA32-NEXT:    add.w $a7, $t0, $a7
171 ; LA32-NEXT:    mul.w $t0, $a0, $a3
172 ; LA32-NEXT:    add.w $a4, $t0, $a4
173 ; LA32-NEXT:    sltu $a4, $a4, $t0
174 ; LA32-NEXT:    mulh.wu $t0, $a0, $a3
175 ; LA32-NEXT:    add.w $a4, $t0, $a4
176 ; LA32-NEXT:    add.w $t0, $a7, $a4
177 ; LA32-NEXT:    mul.w $t1, $a1, $a3
178 ; LA32-NEXT:    add.w $t2, $t1, $t0
179 ; LA32-NEXT:    mul.w $t3, $a2, $a5
180 ; LA32-NEXT:    mul.w $t4, $a6, $a0
181 ; LA32-NEXT:    add.w $t5, $t4, $t3
182 ; LA32-NEXT:    add.w $a4, $t2, $t5
183 ; LA32-NEXT:    sltu $t6, $a4, $t2
184 ; LA32-NEXT:    sltu $t1, $t2, $t1
185 ; LA32-NEXT:    sltu $a7, $t0, $a7
186 ; LA32-NEXT:    mulh.wu $t0, $a1, $a3
187 ; LA32-NEXT:    add.w $a7, $t0, $a7
188 ; LA32-NEXT:    add.w $a7, $a7, $t1
189 ; LA32-NEXT:    mulh.wu $a2, $a2, $a5
190 ; LA32-NEXT:    add.w $a2, $a2, $t3
191 ; LA32-NEXT:    mul.w $a3, $a3, $a5
192 ; LA32-NEXT:    add.w $a2, $a2, $a3
193 ; LA32-NEXT:    mul.w $a1, $a6, $a1
194 ; LA32-NEXT:    mulh.wu $a0, $a6, $a0
195 ; LA32-NEXT:    add.w $a0, $a0, $a1
196 ; LA32-NEXT:    add.w $a0, $a0, $t4
197 ; LA32-NEXT:    add.w $a0, $a0, $a2
198 ; LA32-NEXT:    sltu $a1, $t5, $t4
199 ; LA32-NEXT:    add.w $a0, $a0, $a1
200 ; LA32-NEXT:    add.w $a0, $a7, $a0
201 ; LA32-NEXT:    add.w $a1, $a0, $t6
202 ; LA32-NEXT:    move $a0, $a4
203 ; LA32-NEXT:    ret
205 ; LA64-LABEL: mulh_d:
206 ; LA64:       # %bb.0:
207 ; LA64-NEXT:    mulh.d $a0, $a0, $a1
208 ; LA64-NEXT:    ret
209   %1 = sext i64 %a to i128
210   %2 = sext i64 %b to i128
211   %3 = mul i128 %1, %2
212   %4 = lshr i128 %3, 64
213   %5 = trunc i128 %4 to i64
214   ret i64 %5
217 define i64 @mulh_du(i64 %a, i64 %b) {
218 ; LA32-LABEL: mulh_du:
219 ; LA32:       # %bb.0:
220 ; LA32-NEXT:    mulh.wu $a4, $a0, $a2
221 ; LA32-NEXT:    mul.w $a5, $a1, $a2
222 ; LA32-NEXT:    add.w $a4, $a5, $a4
223 ; LA32-NEXT:    sltu $a5, $a4, $a5
224 ; LA32-NEXT:    mulh.wu $a2, $a1, $a2
225 ; LA32-NEXT:    add.w $a2, $a2, $a5
226 ; LA32-NEXT:    mul.w $a5, $a0, $a3
227 ; LA32-NEXT:    add.w $a4, $a5, $a4
228 ; LA32-NEXT:    sltu $a4, $a4, $a5
229 ; LA32-NEXT:    mulh.wu $a0, $a0, $a3
230 ; LA32-NEXT:    add.w $a0, $a0, $a4
231 ; LA32-NEXT:    add.w $a4, $a2, $a0
232 ; LA32-NEXT:    mul.w $a5, $a1, $a3
233 ; LA32-NEXT:    add.w $a0, $a5, $a4
234 ; LA32-NEXT:    sltu $a5, $a0, $a5
235 ; LA32-NEXT:    sltu $a2, $a4, $a2
236 ; LA32-NEXT:    mulh.wu $a1, $a1, $a3
237 ; LA32-NEXT:    add.w $a1, $a1, $a2
238 ; LA32-NEXT:    add.w $a1, $a1, $a5
239 ; LA32-NEXT:    ret
241 ; LA64-LABEL: mulh_du:
242 ; LA64:       # %bb.0:
243 ; LA64-NEXT:    mulh.du $a0, $a0, $a1
244 ; LA64-NEXT:    ret
245   %1 = zext i64 %a to i128
246   %2 = zext i64 %b to i128
247   %3 = mul i128 %1, %2
248   %4 = lshr i128 %3, 64
249   %5 = trunc i128 %4 to i64
250   ret i64 %5
253 define i64 @mulw_d_w(i32 %a, i32 %b) {
254 ; LA32-LABEL: mulw_d_w:
255 ; LA32:       # %bb.0:
256 ; LA32-NEXT:    mul.w $a2, $a0, $a1
257 ; LA32-NEXT:    mulh.w $a1, $a0, $a1
258 ; LA32-NEXT:    move $a0, $a2
259 ; LA32-NEXT:    ret
261 ; LA64-LABEL: mulw_d_w:
262 ; LA64:       # %bb.0:
263 ; LA64-NEXT:    mulw.d.w $a0, $a0, $a1
264 ; LA64-NEXT:    ret
265   %1 = sext i32 %a to i64
266   %2 = sext i32 %b to i64
267   %3 = mul i64 %1, %2
268   ret i64 %3
271 define i64 @mulw_d_wu(i32 %a, i32 %b) {
272 ; LA32-LABEL: mulw_d_wu:
273 ; LA32:       # %bb.0:
274 ; LA32-NEXT:    mul.w $a2, $a0, $a1
275 ; LA32-NEXT:    mulh.wu $a1, $a0, $a1
276 ; LA32-NEXT:    move $a0, $a2
277 ; LA32-NEXT:    ret
279 ; LA64-LABEL: mulw_d_wu:
280 ; LA64:       # %bb.0:
281 ; LA64-NEXT:    mulw.d.wu $a0, $a0, $a1
282 ; LA64-NEXT:    ret
283   %1 = zext i32 %a to i64
284   %2 = zext i32 %b to i64
285   %3 = mul i64 %1, %2
286   ret i64 %3
289 define signext i32 @mul_i32_11(i32 %a) {
290 ; LA32-LABEL: mul_i32_11:
291 ; LA32:       # %bb.0:
292 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
293 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
294 ; LA32-NEXT:    ret
296 ; LA64-LABEL: mul_i32_11:
297 ; LA64:       # %bb.0:
298 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
299 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
300 ; LA64-NEXT:    ret
301   %b = mul i32 %a, 11
302   ret i32 %b
305 define signext i32 @mul_i32_13(i32 %a) {
306 ; LA32-LABEL: mul_i32_13:
307 ; LA32:       # %bb.0:
308 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
309 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
310 ; LA32-NEXT:    ret
312 ; LA64-LABEL: mul_i32_13:
313 ; LA64:       # %bb.0:
314 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
315 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
316 ; LA64-NEXT:    ret
317   %b = mul i32 %a, 13
318   ret i32 %b
321 define signext i32 @mul_i32_19(i32 %a) {
322 ; LA32-LABEL: mul_i32_19:
323 ; LA32:       # %bb.0:
324 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
325 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
326 ; LA32-NEXT:    ret
328 ; LA64-LABEL: mul_i32_19:
329 ; LA64:       # %bb.0:
330 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
331 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
332 ; LA64-NEXT:    ret
333   %b = mul i32 %a, 19
334   ret i32 %b
337 define signext i32 @mul_i32_21(i32 %a) {
338 ; LA32-LABEL: mul_i32_21:
339 ; LA32:       # %bb.0:
340 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
341 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
342 ; LA32-NEXT:    ret
344 ; LA64-LABEL: mul_i32_21:
345 ; LA64:       # %bb.0:
346 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
347 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
348 ; LA64-NEXT:    ret
349   %b = mul i32 %a, 21
350   ret i32 %b
353 define signext i32 @mul_i32_25(i32 %a) {
354 ; LA32-LABEL: mul_i32_25:
355 ; LA32:       # %bb.0:
356 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
357 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
358 ; LA32-NEXT:    ret
360 ; LA64-LABEL: mul_i32_25:
361 ; LA64:       # %bb.0:
362 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
363 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
364 ; LA64-NEXT:    ret
365   %b = mul i32 %a, 25
366   ret i32 %b
369 define signext i32 @mul_i32_27(i32 %a) {
370 ; LA32-LABEL: mul_i32_27:
371 ; LA32:       # %bb.0:
372 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
373 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
374 ; LA32-NEXT:    ret
376 ; LA64-LABEL: mul_i32_27:
377 ; LA64:       # %bb.0:
378 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
379 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
380 ; LA64-NEXT:    ret
381   %b = mul i32 %a, 27
382   ret i32 %b
385 define signext i32 @mul_i32_35(i32 %a) {
386 ; LA32-LABEL: mul_i32_35:
387 ; LA32:       # %bb.0:
388 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
389 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
390 ; LA32-NEXT:    ret
392 ; LA64-LABEL: mul_i32_35:
393 ; LA64:       # %bb.0:
394 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
395 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
396 ; LA64-NEXT:    ret
397   %b = mul i32 %a, 35
398   ret i32 %b
401 define signext i32 @mul_i32_37(i32 %a) {
402 ; LA32-LABEL: mul_i32_37:
403 ; LA32:       # %bb.0:
404 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
405 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
406 ; LA32-NEXT:    ret
408 ; LA64-LABEL: mul_i32_37:
409 ; LA64:       # %bb.0:
410 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
411 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
412 ; LA64-NEXT:    ret
413   %b = mul i32 %a, 37
414   ret i32 %b
417 define signext i32 @mul_i32_41(i32 %a) {
418 ; LA32-LABEL: mul_i32_41:
419 ; LA32:       # %bb.0:
420 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
421 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
422 ; LA32-NEXT:    ret
424 ; LA64-LABEL: mul_i32_41:
425 ; LA64:       # %bb.0:
426 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
427 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
428 ; LA64-NEXT:    ret
429   %b = mul i32 %a, 41
430   ret i32 %b
433 define signext i32 @mul_i32_45(i32 %a) {
434 ; LA32-LABEL: mul_i32_45:
435 ; LA32:       # %bb.0:
436 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
437 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
438 ; LA32-NEXT:    ret
440 ; LA64-LABEL: mul_i32_45:
441 ; LA64:       # %bb.0:
442 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
443 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
444 ; LA64-NEXT:    ret
445   %b = mul i32 %a, 45
446   ret i32 %b
449 define signext i32 @mul_i32_49(i32 %a) {
450 ; LA32-LABEL: mul_i32_49:
451 ; LA32:       # %bb.0:
452 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
453 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
454 ; LA32-NEXT:    ret
456 ; LA64-LABEL: mul_i32_49:
457 ; LA64:       # %bb.0:
458 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
459 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
460 ; LA64-NEXT:    ret
461   %b = mul i32 %a, 49
462   ret i32 %b
465 define signext i32 @mul_i32_51(i32 %a) {
466 ; LA32-LABEL: mul_i32_51:
467 ; LA32:       # %bb.0:
468 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
469 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
470 ; LA32-NEXT:    ret
472 ; LA64-LABEL: mul_i32_51:
473 ; LA64:       # %bb.0:
474 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
475 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
476 ; LA64-NEXT:    ret
477   %b = mul i32 %a, 51
478   ret i32 %b
481 define signext i32 @mul_i32_69(i32 %a) {
482 ; LA32-LABEL: mul_i32_69:
483 ; LA32:       # %bb.0:
484 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
485 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
486 ; LA32-NEXT:    ret
488 ; LA64-LABEL: mul_i32_69:
489 ; LA64:       # %bb.0:
490 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
491 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
492 ; LA64-NEXT:    ret
493   %b = mul i32 %a, 69
494   ret i32 %b
497 define signext i32 @mul_i32_73(i32 %a) {
498 ; LA32-LABEL: mul_i32_73:
499 ; LA32:       # %bb.0:
500 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
501 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
502 ; LA32-NEXT:    ret
504 ; LA64-LABEL: mul_i32_73:
505 ; LA64:       # %bb.0:
506 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
507 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
508 ; LA64-NEXT:    ret
509   %b = mul i32 %a, 73
510   ret i32 %b
513 define signext i32 @mul_i32_81(i32 %a) {
514 ; LA32-LABEL: mul_i32_81:
515 ; LA32:       # %bb.0:
516 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
517 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
518 ; LA32-NEXT:    ret
520 ; LA64-LABEL: mul_i32_81:
521 ; LA64:       # %bb.0:
522 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
523 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
524 ; LA64-NEXT:    ret
525   %b = mul i32 %a, 81
526   ret i32 %b
529 define signext i32 @mul_i32_85(i32 %a) {
530 ; LA32-LABEL: mul_i32_85:
531 ; LA32:       # %bb.0:
532 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
533 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
534 ; LA32-NEXT:    ret
536 ; LA64-LABEL: mul_i32_85:
537 ; LA64:       # %bb.0:
538 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
539 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
540 ; LA64-NEXT:    ret
541   %b = mul i32 %a, 85
542   ret i32 %b
545 define signext i32 @mul_i32_137(i32 %a) {
546 ; LA32-LABEL: mul_i32_137:
547 ; LA32:       # %bb.0:
548 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
549 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
550 ; LA32-NEXT:    ret
552 ; LA64-LABEL: mul_i32_137:
553 ; LA64:       # %bb.0:
554 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
555 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
556 ; LA64-NEXT:    ret
557   %b = mul i32 %a, 137
558   ret i32 %b
561 define signext i32 @mul_i32_145(i32 %a) {
562 ; LA32-LABEL: mul_i32_145:
563 ; LA32:       # %bb.0:
564 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
565 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
566 ; LA32-NEXT:    ret
568 ; LA64-LABEL: mul_i32_145:
569 ; LA64:       # %bb.0:
570 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
571 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
572 ; LA64-NEXT:    ret
573   %b = mul i32 %a, 145
574   ret i32 %b
577 define signext i32 @mul_i32_153(i32 %a) {
578 ; LA32-LABEL: mul_i32_153:
579 ; LA32:       # %bb.0:
580 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
581 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
582 ; LA32-NEXT:    ret
584 ; LA64-LABEL: mul_i32_153:
585 ; LA64:       # %bb.0:
586 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
587 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
588 ; LA64-NEXT:    ret
589   %b = mul i32 %a, 153
590   ret i32 %b
593 define signext i32 @mul_i32_273(i32 %a) {
594 ; LA32-LABEL: mul_i32_273:
595 ; LA32:       # %bb.0:
596 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
597 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
598 ; LA32-NEXT:    ret
600 ; LA64-LABEL: mul_i32_273:
601 ; LA64:       # %bb.0:
602 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
603 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
604 ; LA64-NEXT:    ret
605   %b = mul i32 %a, 273
606   ret i32 %b
609 define signext i32 @mul_i32_289(i32 %a) {
610 ; LA32-LABEL: mul_i32_289:
611 ; LA32:       # %bb.0:
612 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
613 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
614 ; LA32-NEXT:    ret
616 ; LA64-LABEL: mul_i32_289:
617 ; LA64:       # %bb.0:
618 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
619 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
620 ; LA64-NEXT:    ret
621   %b = mul i32 %a, 289
622   ret i32 %b
625 define i64 @mul_i64_11(i64 %a) {
626 ; LA32-LABEL: mul_i64_11:
627 ; LA32:       # %bb.0:
628 ; LA32-NEXT:    ori $a2, $zero, 11
629 ; LA32-NEXT:    mul.w $a1, $a1, $a2
630 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
631 ; LA32-NEXT:    add.w $a1, $a3, $a1
632 ; LA32-NEXT:    mul.w $a0, $a0, $a2
633 ; LA32-NEXT:    ret
635 ; LA64-LABEL: mul_i64_11:
636 ; LA64:       # %bb.0:
637 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
638 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
639 ; LA64-NEXT:    ret
640   %b = mul i64 %a, 11
641   ret i64 %b
644 define i64 @mul_i64_13(i64 %a) {
645 ; LA32-LABEL: mul_i64_13:
646 ; LA32:       # %bb.0:
647 ; LA32-NEXT:    ori $a2, $zero, 13
648 ; LA32-NEXT:    mul.w $a1, $a1, $a2
649 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
650 ; LA32-NEXT:    add.w $a1, $a3, $a1
651 ; LA32-NEXT:    mul.w $a0, $a0, $a2
652 ; LA32-NEXT:    ret
654 ; LA64-LABEL: mul_i64_13:
655 ; LA64:       # %bb.0:
656 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
657 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
658 ; LA64-NEXT:    ret
659   %b = mul i64 %a, 13
660   ret i64 %b
663 define i64 @mul_i64_19(i64 %a) {
664 ; LA32-LABEL: mul_i64_19:
665 ; LA32:       # %bb.0:
666 ; LA32-NEXT:    ori $a2, $zero, 19
667 ; LA32-NEXT:    mul.w $a1, $a1, $a2
668 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
669 ; LA32-NEXT:    add.w $a1, $a3, $a1
670 ; LA32-NEXT:    mul.w $a0, $a0, $a2
671 ; LA32-NEXT:    ret
673 ; LA64-LABEL: mul_i64_19:
674 ; LA64:       # %bb.0:
675 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
676 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
677 ; LA64-NEXT:    ret
678   %b = mul i64 %a, 19
679   ret i64 %b
682 define i64 @mul_i64_21(i64 %a) {
683 ; LA32-LABEL: mul_i64_21:
684 ; LA32:       # %bb.0:
685 ; LA32-NEXT:    ori $a2, $zero, 21
686 ; LA32-NEXT:    mul.w $a1, $a1, $a2
687 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
688 ; LA32-NEXT:    add.w $a1, $a3, $a1
689 ; LA32-NEXT:    mul.w $a0, $a0, $a2
690 ; LA32-NEXT:    ret
692 ; LA64-LABEL: mul_i64_21:
693 ; LA64:       # %bb.0:
694 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
695 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
696 ; LA64-NEXT:    ret
697   %b = mul i64 %a, 21
698   ret i64 %b
701 define i64 @mul_i64_25(i64 %a) {
702 ; LA32-LABEL: mul_i64_25:
703 ; LA32:       # %bb.0:
704 ; LA32-NEXT:    ori $a2, $zero, 25
705 ; LA32-NEXT:    mul.w $a1, $a1, $a2
706 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
707 ; LA32-NEXT:    add.w $a1, $a3, $a1
708 ; LA32-NEXT:    mul.w $a0, $a0, $a2
709 ; LA32-NEXT:    ret
711 ; LA64-LABEL: mul_i64_25:
712 ; LA64:       # %bb.0:
713 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
714 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
715 ; LA64-NEXT:    ret
716   %b = mul i64 %a, 25
717   ret i64 %b
720 define i64 @mul_i64_27(i64 %a) {
721 ; LA32-LABEL: mul_i64_27:
722 ; LA32:       # %bb.0:
723 ; LA32-NEXT:    ori $a2, $zero, 27
724 ; LA32-NEXT:    mul.w $a1, $a1, $a2
725 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
726 ; LA32-NEXT:    add.w $a1, $a3, $a1
727 ; LA32-NEXT:    mul.w $a0, $a0, $a2
728 ; LA32-NEXT:    ret
730 ; LA64-LABEL: mul_i64_27:
731 ; LA64:       # %bb.0:
732 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
733 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
734 ; LA64-NEXT:    ret
735   %b = mul i64 %a, 27
736   ret i64 %b
739 define i64 @mul_i64_35(i64 %a) {
740 ; LA32-LABEL: mul_i64_35:
741 ; LA32:       # %bb.0:
742 ; LA32-NEXT:    ori $a2, $zero, 35
743 ; LA32-NEXT:    mul.w $a1, $a1, $a2
744 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
745 ; LA32-NEXT:    add.w $a1, $a3, $a1
746 ; LA32-NEXT:    mul.w $a0, $a0, $a2
747 ; LA32-NEXT:    ret
749 ; LA64-LABEL: mul_i64_35:
750 ; LA64:       # %bb.0:
751 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
752 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
753 ; LA64-NEXT:    ret
754   %b = mul i64 %a, 35
755   ret i64 %b
758 define i64 @mul_i64_37(i64 %a) {
759 ; LA32-LABEL: mul_i64_37:
760 ; LA32:       # %bb.0:
761 ; LA32-NEXT:    ori $a2, $zero, 37
762 ; LA32-NEXT:    mul.w $a1, $a1, $a2
763 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
764 ; LA32-NEXT:    add.w $a1, $a3, $a1
765 ; LA32-NEXT:    mul.w $a0, $a0, $a2
766 ; LA32-NEXT:    ret
768 ; LA64-LABEL: mul_i64_37:
769 ; LA64:       # %bb.0:
770 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
771 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
772 ; LA64-NEXT:    ret
773   %b = mul i64 %a, 37
774   ret i64 %b
777 define i64 @mul_i64_41(i64 %a) {
778 ; LA32-LABEL: mul_i64_41:
779 ; LA32:       # %bb.0:
780 ; LA32-NEXT:    ori $a2, $zero, 41
781 ; LA32-NEXT:    mul.w $a1, $a1, $a2
782 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
783 ; LA32-NEXT:    add.w $a1, $a3, $a1
784 ; LA32-NEXT:    mul.w $a0, $a0, $a2
785 ; LA32-NEXT:    ret
787 ; LA64-LABEL: mul_i64_41:
788 ; LA64:       # %bb.0:
789 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
790 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
791 ; LA64-NEXT:    ret
792   %b = mul i64 %a, 41
793   ret i64 %b
796 define i64 @mul_i64_45(i64 %a) {
797 ; LA32-LABEL: mul_i64_45:
798 ; LA32:       # %bb.0:
799 ; LA32-NEXT:    ori $a2, $zero, 45
800 ; LA32-NEXT:    mul.w $a1, $a1, $a2
801 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
802 ; LA32-NEXT:    add.w $a1, $a3, $a1
803 ; LA32-NEXT:    mul.w $a0, $a0, $a2
804 ; LA32-NEXT:    ret
806 ; LA64-LABEL: mul_i64_45:
807 ; LA64:       # %bb.0:
808 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
809 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
810 ; LA64-NEXT:    ret
811   %b = mul i64 %a, 45
812   ret i64 %b
815 define i64 @mul_i64_49(i64 %a) {
816 ; LA32-LABEL: mul_i64_49:
817 ; LA32:       # %bb.0:
818 ; LA32-NEXT:    ori $a2, $zero, 49
819 ; LA32-NEXT:    mul.w $a1, $a1, $a2
820 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
821 ; LA32-NEXT:    add.w $a1, $a3, $a1
822 ; LA32-NEXT:    mul.w $a0, $a0, $a2
823 ; LA32-NEXT:    ret
825 ; LA64-LABEL: mul_i64_49:
826 ; LA64:       # %bb.0:
827 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
828 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
829 ; LA64-NEXT:    ret
830   %b = mul i64 %a, 49
831   ret i64 %b
834 define i64 @mul_i64_51(i64 %a) {
835 ; LA32-LABEL: mul_i64_51:
836 ; LA32:       # %bb.0:
837 ; LA32-NEXT:    ori $a2, $zero, 51
838 ; LA32-NEXT:    mul.w $a1, $a1, $a2
839 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
840 ; LA32-NEXT:    add.w $a1, $a3, $a1
841 ; LA32-NEXT:    mul.w $a0, $a0, $a2
842 ; LA32-NEXT:    ret
844 ; LA64-LABEL: mul_i64_51:
845 ; LA64:       # %bb.0:
846 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
847 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
848 ; LA64-NEXT:    ret
849   %b = mul i64 %a, 51
850   ret i64 %b
853 define i64 @mul_i64_69(i64 %a) {
854 ; LA32-LABEL: mul_i64_69:
855 ; LA32:       # %bb.0:
856 ; LA32-NEXT:    ori $a2, $zero, 69
857 ; LA32-NEXT:    mul.w $a1, $a1, $a2
858 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
859 ; LA32-NEXT:    add.w $a1, $a3, $a1
860 ; LA32-NEXT:    mul.w $a0, $a0, $a2
861 ; LA32-NEXT:    ret
863 ; LA64-LABEL: mul_i64_69:
864 ; LA64:       # %bb.0:
865 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
866 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
867 ; LA64-NEXT:    ret
868   %b = mul i64 %a, 69
869   ret i64 %b
872 define i64 @mul_i64_73(i64 %a) {
873 ; LA32-LABEL: mul_i64_73:
874 ; LA32:       # %bb.0:
875 ; LA32-NEXT:    ori $a2, $zero, 73
876 ; LA32-NEXT:    mul.w $a1, $a1, $a2
877 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
878 ; LA32-NEXT:    add.w $a1, $a3, $a1
879 ; LA32-NEXT:    mul.w $a0, $a0, $a2
880 ; LA32-NEXT:    ret
882 ; LA64-LABEL: mul_i64_73:
883 ; LA64:       # %bb.0:
884 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
885 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
886 ; LA64-NEXT:    ret
887   %b = mul i64 %a, 73
888   ret i64 %b
891 define i64 @mul_i64_81(i64 %a) {
892 ; LA32-LABEL: mul_i64_81:
893 ; LA32:       # %bb.0:
894 ; LA32-NEXT:    ori $a2, $zero, 81
895 ; LA32-NEXT:    mul.w $a1, $a1, $a2
896 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
897 ; LA32-NEXT:    add.w $a1, $a3, $a1
898 ; LA32-NEXT:    mul.w $a0, $a0, $a2
899 ; LA32-NEXT:    ret
901 ; LA64-LABEL: mul_i64_81:
902 ; LA64:       # %bb.0:
903 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
904 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
905 ; LA64-NEXT:    ret
906   %b = mul i64 %a, 81
907   ret i64 %b
910 define i64 @mul_i64_85(i64 %a) {
911 ; LA32-LABEL: mul_i64_85:
912 ; LA32:       # %bb.0:
913 ; LA32-NEXT:    ori $a2, $zero, 85
914 ; LA32-NEXT:    mul.w $a1, $a1, $a2
915 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
916 ; LA32-NEXT:    add.w $a1, $a3, $a1
917 ; LA32-NEXT:    mul.w $a0, $a0, $a2
918 ; LA32-NEXT:    ret
920 ; LA64-LABEL: mul_i64_85:
921 ; LA64:       # %bb.0:
922 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
923 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
924 ; LA64-NEXT:    ret
925   %b = mul i64 %a, 85
926   ret i64 %b
929 define i64 @mul_i64_137(i64 %a) {
930 ; LA32-LABEL: mul_i64_137:
931 ; LA32:       # %bb.0:
932 ; LA32-NEXT:    ori $a2, $zero, 137
933 ; LA32-NEXT:    mul.w $a1, $a1, $a2
934 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
935 ; LA32-NEXT:    add.w $a1, $a3, $a1
936 ; LA32-NEXT:    mul.w $a0, $a0, $a2
937 ; LA32-NEXT:    ret
939 ; LA64-LABEL: mul_i64_137:
940 ; LA64:       # %bb.0:
941 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
942 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
943 ; LA64-NEXT:    ret
944   %b = mul i64 %a, 137
945   ret i64 %b
948 define i64 @mul_i64_145(i64 %a) {
949 ; LA32-LABEL: mul_i64_145:
950 ; LA32:       # %bb.0:
951 ; LA32-NEXT:    ori $a2, $zero, 145
952 ; LA32-NEXT:    mul.w $a1, $a1, $a2
953 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
954 ; LA32-NEXT:    add.w $a1, $a3, $a1
955 ; LA32-NEXT:    mul.w $a0, $a0, $a2
956 ; LA32-NEXT:    ret
958 ; LA64-LABEL: mul_i64_145:
959 ; LA64:       # %bb.0:
960 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
961 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
962 ; LA64-NEXT:    ret
963   %b = mul i64 %a, 145
964   ret i64 %b
967 define i64 @mul_i64_153(i64 %a) {
968 ; LA32-LABEL: mul_i64_153:
969 ; LA32:       # %bb.0:
970 ; LA32-NEXT:    ori $a2, $zero, 153
971 ; LA32-NEXT:    mul.w $a1, $a1, $a2
972 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
973 ; LA32-NEXT:    add.w $a1, $a3, $a1
974 ; LA32-NEXT:    mul.w $a0, $a0, $a2
975 ; LA32-NEXT:    ret
977 ; LA64-LABEL: mul_i64_153:
978 ; LA64:       # %bb.0:
979 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
980 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
981 ; LA64-NEXT:    ret
982   %b = mul i64 %a, 153
983   ret i64 %b
986 define i64 @mul_i64_273(i64 %a) {
987 ; LA32-LABEL: mul_i64_273:
988 ; LA32:       # %bb.0:
989 ; LA32-NEXT:    ori $a2, $zero, 273
990 ; LA32-NEXT:    mul.w $a1, $a1, $a2
991 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
992 ; LA32-NEXT:    add.w $a1, $a3, $a1
993 ; LA32-NEXT:    mul.w $a0, $a0, $a2
994 ; LA32-NEXT:    ret
996 ; LA64-LABEL: mul_i64_273:
997 ; LA64:       # %bb.0:
998 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
999 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
1000 ; LA64-NEXT:    ret
1001   %b = mul i64 %a, 273
1002   ret i64 %b
1005 define i64 @mul_i64_289(i64 %a) {
1006 ; LA32-LABEL: mul_i64_289:
1007 ; LA32:       # %bb.0:
1008 ; LA32-NEXT:    ori $a2, $zero, 289
1009 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1010 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1011 ; LA32-NEXT:    add.w $a1, $a3, $a1
1012 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1013 ; LA32-NEXT:    ret
1015 ; LA64-LABEL: mul_i64_289:
1016 ; LA64:       # %bb.0:
1017 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1018 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1019 ; LA64-NEXT:    ret
1020   %b = mul i64 %a, 289
1021   ret i64 %b
1024 define signext i32 @mul_i32_4098(i32 %a) {
1025 ; LA32-LABEL: mul_i32_4098:
1026 ; LA32:       # %bb.0:
1027 ; LA32-NEXT:    slli.w $a1, $a0, 12
1028 ; LA32-NEXT:    alsl.w $a0, $a0, $a1, 1
1029 ; LA32-NEXT:    ret
1031 ; LA64-LABEL: mul_i32_4098:
1032 ; LA64:       # %bb.0:
1033 ; LA64-NEXT:    slli.d $a1, $a0, 12
1034 ; LA64-NEXT:    alsl.w $a0, $a0, $a1, 1
1035 ; LA64-NEXT:    ret
1036   %b = mul i32 %a, 4098
1037   ret i32 %b
1040 define signext i32 @mul_i32_4100(i32 %a) {
1041 ; LA32-LABEL: mul_i32_4100:
1042 ; LA32:       # %bb.0:
1043 ; LA32-NEXT:    slli.w $a1, $a0, 12
1044 ; LA32-NEXT:    alsl.w $a0, $a0, $a1, 2
1045 ; LA32-NEXT:    ret
1047 ; LA64-LABEL: mul_i32_4100:
1048 ; LA64:       # %bb.0:
1049 ; LA64-NEXT:    slli.d $a1, $a0, 12
1050 ; LA64-NEXT:    alsl.w $a0, $a0, $a1, 2
1051 ; LA64-NEXT:    ret
1052   %b = mul i32 %a, 4100
1053   ret i32 %b
1056 define signext i32 @mul_i32_4104(i32 %a) {
1057 ; LA32-LABEL: mul_i32_4104:
1058 ; LA32:       # %bb.0:
1059 ; LA32-NEXT:    slli.w $a1, $a0, 12
1060 ; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3
1061 ; LA32-NEXT:    ret
1063 ; LA64-LABEL: mul_i32_4104:
1064 ; LA64:       # %bb.0:
1065 ; LA64-NEXT:    slli.d $a1, $a0, 12
1066 ; LA64-NEXT:    alsl.w $a0, $a0, $a1, 3
1067 ; LA64-NEXT:    ret
1068   %b = mul i32 %a, 4104
1069   ret i32 %b
1072 define signext i32 @mul_i32_4112(i32 %a) {
1073 ; LA32-LABEL: mul_i32_4112:
1074 ; LA32:       # %bb.0:
1075 ; LA32-NEXT:    slli.w $a1, $a0, 12
1076 ; LA32-NEXT:    alsl.w $a0, $a0, $a1, 4
1077 ; LA32-NEXT:    ret
1079 ; LA64-LABEL: mul_i32_4112:
1080 ; LA64:       # %bb.0:
1081 ; LA64-NEXT:    slli.d $a1, $a0, 12
1082 ; LA64-NEXT:    alsl.w $a0, $a0, $a1, 4
1083 ; LA64-NEXT:    ret
1084   %b = mul i32 %a, 4112
1085   ret i32 %b
1088 define i64 @mul_i64_4098(i64 %a) {
1089 ; LA32-LABEL: mul_i64_4098:
1090 ; LA32:       # %bb.0:
1091 ; LA32-NEXT:    lu12i.w $a2, 1
1092 ; LA32-NEXT:    ori $a2, $a2, 2
1093 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1094 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1095 ; LA32-NEXT:    add.w $a1, $a3, $a1
1096 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1097 ; LA32-NEXT:    ret
1099 ; LA64-LABEL: mul_i64_4098:
1100 ; LA64:       # %bb.0:
1101 ; LA64-NEXT:    slli.d $a1, $a0, 12
1102 ; LA64-NEXT:    alsl.d $a0, $a0, $a1, 1
1103 ; LA64-NEXT:    ret
1104   %b = mul i64 %a, 4098
1105   ret i64 %b
1108 define i64 @mul_i64_4100(i64 %a) {
1109 ; LA32-LABEL: mul_i64_4100:
1110 ; LA32:       # %bb.0:
1111 ; LA32-NEXT:    lu12i.w $a2, 1
1112 ; LA32-NEXT:    ori $a2, $a2, 4
1113 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1114 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1115 ; LA32-NEXT:    add.w $a1, $a3, $a1
1116 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1117 ; LA32-NEXT:    ret
1119 ; LA64-LABEL: mul_i64_4100:
1120 ; LA64:       # %bb.0:
1121 ; LA64-NEXT:    slli.d $a1, $a0, 12
1122 ; LA64-NEXT:    alsl.d $a0, $a0, $a1, 2
1123 ; LA64-NEXT:    ret
1124   %b = mul i64 %a, 4100
1125   ret i64 %b
1128 define i64 @mul_i64_4104(i64 %a) {
1129 ; LA32-LABEL: mul_i64_4104:
1130 ; LA32:       # %bb.0:
1131 ; LA32-NEXT:    lu12i.w $a2, 1
1132 ; LA32-NEXT:    ori $a2, $a2, 8
1133 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1134 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1135 ; LA32-NEXT:    add.w $a1, $a3, $a1
1136 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1137 ; LA32-NEXT:    ret
1139 ; LA64-LABEL: mul_i64_4104:
1140 ; LA64:       # %bb.0:
1141 ; LA64-NEXT:    slli.d $a1, $a0, 12
1142 ; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3
1143 ; LA64-NEXT:    ret
1144   %b = mul i64 %a, 4104
1145   ret i64 %b
1148 define i64 @mul_i64_4112(i64 %a) {
1149 ; LA32-LABEL: mul_i64_4112:
1150 ; LA32:       # %bb.0:
1151 ; LA32-NEXT:    lu12i.w $a2, 1
1152 ; LA32-NEXT:    ori $a2, $a2, 16
1153 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1154 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1155 ; LA32-NEXT:    add.w $a1, $a3, $a1
1156 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1157 ; LA32-NEXT:    ret
1159 ; LA64-LABEL: mul_i64_4112:
1160 ; LA64:       # %bb.0:
1161 ; LA64-NEXT:    slli.d $a1, $a0, 12
1162 ; LA64-NEXT:    alsl.d $a0, $a0, $a1, 4
1163 ; LA64-NEXT:    ret
1164   %b = mul i64 %a, 4112
1165   ret i64 %b
1168 define signext i32 @mul_i32_768(i32 %a) {
1169 ; LA32-LABEL: mul_i32_768:
1170 ; LA32:       # %bb.0:
1171 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
1172 ; LA32-NEXT:    slli.w $a0, $a0, 8
1173 ; LA32-NEXT:    ret
1175 ; LA64-LABEL: mul_i32_768:
1176 ; LA64:       # %bb.0:
1177 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
1178 ; LA64-NEXT:    slli.w $a0, $a0, 8
1179 ; LA64-NEXT:    ret
1180   %b = mul i32 %a, 768
1181   ret i32 %b
1184 define signext i32 @mul_i32_1280(i32 %a) {
1185 ; LA32-LABEL: mul_i32_1280:
1186 ; LA32:       # %bb.0:
1187 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
1188 ; LA32-NEXT:    slli.w $a0, $a0, 8
1189 ; LA32-NEXT:    ret
1191 ; LA64-LABEL: mul_i32_1280:
1192 ; LA64:       # %bb.0:
1193 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
1194 ; LA64-NEXT:    slli.w $a0, $a0, 8
1195 ; LA64-NEXT:    ret
1196   %b = mul i32 %a, 1280
1197   ret i32 %b
1200 define signext i32 @mul_i32_2304(i32 %a) {
1201 ; LA32-LABEL: mul_i32_2304:
1202 ; LA32:       # %bb.0:
1203 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
1204 ; LA32-NEXT:    slli.w $a0, $a0, 8
1205 ; LA32-NEXT:    ret
1207 ; LA64-LABEL: mul_i32_2304:
1208 ; LA64:       # %bb.0:
1209 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
1210 ; LA64-NEXT:    slli.w $a0, $a0, 8
1211 ; LA64-NEXT:    ret
1212   %b = mul i32 %a, 2304
1213   ret i32 %b
1216 define signext i32 @mul_i32_4352(i32 %a) {
1217 ; LA32-LABEL: mul_i32_4352:
1218 ; LA32:       # %bb.0:
1219 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
1220 ; LA32-NEXT:    slli.w $a0, $a0, 8
1221 ; LA32-NEXT:    ret
1223 ; LA64-LABEL: mul_i32_4352:
1224 ; LA64:       # %bb.0:
1225 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
1226 ; LA64-NEXT:    slli.w $a0, $a0, 8
1227 ; LA64-NEXT:    ret
1228   %b = mul i32 %a, 4352
1229   ret i32 %b
1232 define i64 @mul_i64_768(i64 %a) {
1233 ; LA32-LABEL: mul_i64_768:
1234 ; LA32:       # %bb.0:
1235 ; LA32-NEXT:    ori $a2, $zero, 768
1236 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1237 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1238 ; LA32-NEXT:    add.w $a1, $a3, $a1
1239 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1240 ; LA32-NEXT:    ret
1242 ; LA64-LABEL: mul_i64_768:
1243 ; LA64:       # %bb.0:
1244 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
1245 ; LA64-NEXT:    slli.d $a0, $a0, 8
1246 ; LA64-NEXT:    ret
1247   %b = mul i64 %a, 768
1248   ret i64 %b
1251 define i64 @mul_i64_1280(i64 %a) {
1252 ; LA32-LABEL: mul_i64_1280:
1253 ; LA32:       # %bb.0:
1254 ; LA32-NEXT:    ori $a2, $zero, 1280
1255 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1256 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1257 ; LA32-NEXT:    add.w $a1, $a3, $a1
1258 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1259 ; LA32-NEXT:    ret
1261 ; LA64-LABEL: mul_i64_1280:
1262 ; LA64:       # %bb.0:
1263 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
1264 ; LA64-NEXT:    slli.d $a0, $a0, 8
1265 ; LA64-NEXT:    ret
1266   %b = mul i64 %a, 1280
1267   ret i64 %b
1270 define i64 @mul_i64_2304(i64 %a) {
1271 ; LA32-LABEL: mul_i64_2304:
1272 ; LA32:       # %bb.0:
1273 ; LA32-NEXT:    ori $a2, $zero, 2304
1274 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1275 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1276 ; LA32-NEXT:    add.w $a1, $a3, $a1
1277 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1278 ; LA32-NEXT:    ret
1280 ; LA64-LABEL: mul_i64_2304:
1281 ; LA64:       # %bb.0:
1282 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
1283 ; LA64-NEXT:    slli.d $a0, $a0, 8
1284 ; LA64-NEXT:    ret
1285   %b = mul i64 %a, 2304
1286   ret i64 %b
1289 define i64 @mul_i64_4352(i64 %a) {
1290 ; LA32-LABEL: mul_i64_4352:
1291 ; LA32:       # %bb.0:
1292 ; LA32-NEXT:    lu12i.w $a2, 1
1293 ; LA32-NEXT:    ori $a2, $a2, 256
1294 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1295 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1296 ; LA32-NEXT:    add.w $a1, $a3, $a1
1297 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1298 ; LA32-NEXT:    ret
1300 ; LA64-LABEL: mul_i64_4352:
1301 ; LA64:       # %bb.0:
1302 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1303 ; LA64-NEXT:    slli.d $a0, $a0, 8
1304 ; LA64-NEXT:    ret
1305   %b = mul i64 %a, 4352
1306   ret i64 %b
1309 define signext i32 @mul_i32_65792(i32 %a) {
1310 ; LA32-LABEL: mul_i32_65792:
1311 ; LA32:       # %bb.0:
1312 ; LA32-NEXT:    slli.w $a1, $a0, 8
1313 ; LA32-NEXT:    slli.w $a0, $a0, 16
1314 ; LA32-NEXT:    add.w $a0, $a0, $a1
1315 ; LA32-NEXT:    ret
1317 ; LA64-LABEL: mul_i32_65792:
1318 ; LA64:       # %bb.0:
1319 ; LA64-NEXT:    slli.d $a1, $a0, 8
1320 ; LA64-NEXT:    slli.d $a0, $a0, 16
1321 ; LA64-NEXT:    add.w $a0, $a0, $a1
1322 ; LA64-NEXT:    ret
1323   %b = mul i32 %a, 65792
1324   ret i32 %b
1327 define signext i32 @mul_i32_65280(i32 %a) {
1328 ; LA32-LABEL: mul_i32_65280:
1329 ; LA32:       # %bb.0:
1330 ; LA32-NEXT:    slli.w $a1, $a0, 8
1331 ; LA32-NEXT:    slli.w $a0, $a0, 16
1332 ; LA32-NEXT:    sub.w $a0, $a0, $a1
1333 ; LA32-NEXT:    ret
1335 ; LA64-LABEL: mul_i32_65280:
1336 ; LA64:       # %bb.0:
1337 ; LA64-NEXT:    slli.d $a1, $a0, 8
1338 ; LA64-NEXT:    slli.d $a0, $a0, 16
1339 ; LA64-NEXT:    sub.w $a0, $a0, $a1
1340 ; LA64-NEXT:    ret
1341   %b = mul i32 %a, 65280
1342   ret i32 %b
1345 define signext i32 @mul_i32_minus_65280(i32 %a) {
1346 ; LA32-LABEL: mul_i32_minus_65280:
1347 ; LA32:       # %bb.0:
1348 ; LA32-NEXT:    slli.w $a1, $a0, 16
1349 ; LA32-NEXT:    slli.w $a0, $a0, 8
1350 ; LA32-NEXT:    sub.w $a0, $a0, $a1
1351 ; LA32-NEXT:    ret
1353 ; LA64-LABEL: mul_i32_minus_65280:
1354 ; LA64:       # %bb.0:
1355 ; LA64-NEXT:    slli.d $a1, $a0, 16
1356 ; LA64-NEXT:    slli.d $a0, $a0, 8
1357 ; LA64-NEXT:    sub.w $a0, $a0, $a1
1358 ; LA64-NEXT:    ret
1359   %b = mul i32 %a, -65280
1360   ret i32 %b
1363 define i64 @mul_i64_65792(i64 %a) {
1364 ; LA32-LABEL: mul_i64_65792:
1365 ; LA32:       # %bb.0:
1366 ; LA32-NEXT:    lu12i.w $a2, 16
1367 ; LA32-NEXT:    ori $a2, $a2, 256
1368 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1369 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1370 ; LA32-NEXT:    add.w $a1, $a3, $a1
1371 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1372 ; LA32-NEXT:    ret
1374 ; LA64-LABEL: mul_i64_65792:
1375 ; LA64:       # %bb.0:
1376 ; LA64-NEXT:    slli.d $a1, $a0, 8
1377 ; LA64-NEXT:    slli.d $a0, $a0, 16
1378 ; LA64-NEXT:    add.d $a0, $a0, $a1
1379 ; LA64-NEXT:    ret
1380   %b = mul i64 %a, 65792
1381   ret i64 %b
1384 define i64 @mul_i64_65280(i64 %a) {
1385 ; LA32-LABEL: mul_i64_65280:
1386 ; LA32:       # %bb.0:
1387 ; LA32-NEXT:    lu12i.w $a2, 15
1388 ; LA32-NEXT:    ori $a2, $a2, 3840
1389 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1390 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1391 ; LA32-NEXT:    add.w $a1, $a3, $a1
1392 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1393 ; LA32-NEXT:    ret
1395 ; LA64-LABEL: mul_i64_65280:
1396 ; LA64:       # %bb.0:
1397 ; LA64-NEXT:    slli.d $a1, $a0, 8
1398 ; LA64-NEXT:    slli.d $a0, $a0, 16
1399 ; LA64-NEXT:    sub.d $a0, $a0, $a1
1400 ; LA64-NEXT:    ret
1401   %b = mul i64 %a, 65280
1402   ret i64 %b
1405 define i64 @mul_i64_minus_65280(i64 %a) {
1406 ; LA32-LABEL: mul_i64_minus_65280:
1407 ; LA32:       # %bb.0:
1408 ; LA32-NEXT:    lu12i.w $a2, -16
1409 ; LA32-NEXT:    ori $a2, $a2, 256
1410 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1411 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1412 ; LA32-NEXT:    sub.w $a3, $a3, $a0
1413 ; LA32-NEXT:    add.w $a1, $a3, $a1
1414 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1415 ; LA32-NEXT:    ret
1417 ; LA64-LABEL: mul_i64_minus_65280:
1418 ; LA64:       # %bb.0:
1419 ; LA64-NEXT:    slli.d $a1, $a0, 16
1420 ; LA64-NEXT:    slli.d $a0, $a0, 8
1421 ; LA64-NEXT:    sub.d $a0, $a0, $a1
1422 ; LA64-NEXT:    ret
1423   %b = mul i64 %a, -65280
1424   ret i64 %b
1427 ;; This multiplication is not transformed, due to
1428 ;; 1088 can be composed via a single ORI.
1429 define i64 @mul_i64_1088(i64 %a) {
1430 ; LA32-LABEL: mul_i64_1088:
1431 ; LA32:       # %bb.0:
1432 ; LA32-NEXT:    ori $a2, $zero, 1088
1433 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1434 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1435 ; LA32-NEXT:    add.w $a1, $a3, $a1
1436 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1437 ; LA32-NEXT:    ret
1439 ; LA64-LABEL: mul_i64_1088:
1440 ; LA64:       # %bb.0:
1441 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1442 ; LA64-NEXT:    slli.d $a0, $a0, 6
1443 ; LA64-NEXT:    ret
1444   %b = mul i64 %a, 1088
1445   ret i64 %b
1448 ;; This multiplication is not transformed, due to
1449 ;; -992 can be composed via a single ADDI.
1450 define i64 @mul_i64_minus_992(i64 %a) {
1451 ; LA32-LABEL: mul_i64_minus_992:
1452 ; LA32:       # %bb.0:
1453 ; LA32-NEXT:    addi.w $a2, $zero, -992
1454 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1455 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1456 ; LA32-NEXT:    sub.w $a3, $a3, $a0
1457 ; LA32-NEXT:    add.w $a1, $a3, $a1
1458 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1459 ; LA32-NEXT:    ret
1461 ; LA64-LABEL: mul_i64_minus_992:
1462 ; LA64:       # %bb.0:
1463 ; LA64-NEXT:    addi.w $a1, $zero, -992
1464 ; LA64-NEXT:    mul.d $a0, $a0, $a1
1465 ; LA64-NEXT:    ret
1466   %b = mul i64 %a, -992
1467   ret i64 %b
1470 ;; This multiplication is not transformed, due to
1471 ;; 4456448 can be composed via a single LUI.
1472 define i64 @mul_i64_4456448(i64 %a) {
1473 ; LA32-LABEL: mul_i64_4456448:
1474 ; LA32:       # %bb.0:
1475 ; LA32-NEXT:    lu12i.w $a2, 1088
1476 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1477 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1478 ; LA32-NEXT:    add.w $a1, $a3, $a1
1479 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1480 ; LA32-NEXT:    ret
1482 ; LA64-LABEL: mul_i64_4456448:
1483 ; LA64:       # %bb.0:
1484 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1485 ; LA64-NEXT:    slli.d $a0, $a0, 18
1486 ; LA64-NEXT:    ret
1487   %b = mul i64 %a, 4456448
1488   ret i64 %b
1491 ;; This multiplication is not transformed, due to
1492 ;; 65280 is used multiple times.
1493 define i64 @mul_i64_65280_twice(i64 %a, i64 %b) {
1494 ; LA32-LABEL: mul_i64_65280_twice:
1495 ; LA32:       # %bb.0:
1496 ; LA32-NEXT:    lu12i.w $a4, 15
1497 ; LA32-NEXT:    ori $a4, $a4, 3840
1498 ; LA32-NEXT:    mul.w $a1, $a1, $a4
1499 ; LA32-NEXT:    mulh.wu $a5, $a0, $a4
1500 ; LA32-NEXT:    add.w $a1, $a5, $a1
1501 ; LA32-NEXT:    mul.w $a0, $a0, $a4
1502 ; LA32-NEXT:    mul.w $a3, $a3, $a4
1503 ; LA32-NEXT:    mulh.wu $a5, $a2, $a4
1504 ; LA32-NEXT:    add.w $a3, $a5, $a3
1505 ; LA32-NEXT:    mul.w $a2, $a2, $a4
1506 ; LA32-NEXT:    xor $a1, $a1, $a3
1507 ; LA32-NEXT:    xor $a0, $a0, $a2
1508 ; LA32-NEXT:    ret
1510 ; LA64-LABEL: mul_i64_65280_twice:
1511 ; LA64:       # %bb.0:
1512 ; LA64-NEXT:    lu12i.w $a2, 15
1513 ; LA64-NEXT:    ori $a2, $a2, 3840
1514 ; LA64-NEXT:    mul.d $a0, $a0, $a2
1515 ; LA64-NEXT:    mul.d $a1, $a1, $a2
1516 ; LA64-NEXT:    xor $a0, $a0, $a1
1517 ; LA64-NEXT:    ret
1518   %c = mul i64 %a, 65280
1519   %d = mul i64 %b, 65280
1520   %e = xor i64 %c, %d
1521   ret i64 %e