Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / mul.ll
blob53a3529219fefbf872594f9aa188ef1199398ae7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32
3 ; RUN: llc --mtriple=loongarch64 < %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:    slli.w $a1, $a1, 3
91 ; LA32-NEXT:    srli.w $a2, $a0, 29
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:    mulh.wu $a4, $a0, $a2
164 ; LA32-NEXT:    mul.w $a5, $a1, $a2
165 ; LA32-NEXT:    add.w $a4, $a5, $a4
166 ; LA32-NEXT:    sltu $a5, $a4, $a5
167 ; LA32-NEXT:    mulh.wu $a6, $a1, $a2
168 ; LA32-NEXT:    add.w $a5, $a6, $a5
169 ; LA32-NEXT:    mul.w $a6, $a0, $a3
170 ; LA32-NEXT:    add.w $a4, $a6, $a4
171 ; LA32-NEXT:    sltu $a4, $a4, $a6
172 ; LA32-NEXT:    mulh.wu $a6, $a0, $a3
173 ; LA32-NEXT:    add.w $a4, $a6, $a4
174 ; LA32-NEXT:    add.w $a4, $a5, $a4
175 ; LA32-NEXT:    sltu $a5, $a4, $a5
176 ; LA32-NEXT:    mulh.wu $a6, $a1, $a3
177 ; LA32-NEXT:    add.w $a5, $a6, $a5
178 ; LA32-NEXT:    mul.w $a6, $a1, $a3
179 ; LA32-NEXT:    add.w $a4, $a6, $a4
180 ; LA32-NEXT:    sltu $a6, $a4, $a6
181 ; LA32-NEXT:    add.w $a5, $a5, $a6
182 ; LA32-NEXT:    srai.w $a6, $a1, 31
183 ; LA32-NEXT:    mul.w $a7, $a2, $a6
184 ; LA32-NEXT:    mulh.wu $a2, $a2, $a6
185 ; LA32-NEXT:    add.w $a2, $a2, $a7
186 ; LA32-NEXT:    mul.w $a6, $a3, $a6
187 ; LA32-NEXT:    add.w $a2, $a2, $a6
188 ; LA32-NEXT:    srai.w $a3, $a3, 31
189 ; LA32-NEXT:    mul.w $a1, $a3, $a1
190 ; LA32-NEXT:    mulh.wu $a6, $a3, $a0
191 ; LA32-NEXT:    add.w $a1, $a6, $a1
192 ; LA32-NEXT:    mul.w $a0, $a3, $a0
193 ; LA32-NEXT:    add.w $a1, $a1, $a0
194 ; LA32-NEXT:    add.w $a1, $a1, $a2
195 ; LA32-NEXT:    add.w $a2, $a0, $a7
196 ; LA32-NEXT:    sltu $a0, $a2, $a0
197 ; LA32-NEXT:    add.w $a0, $a1, $a0
198 ; LA32-NEXT:    add.w $a1, $a5, $a0
199 ; LA32-NEXT:    add.w $a0, $a4, $a2
200 ; LA32-NEXT:    sltu $a2, $a0, $a4
201 ; LA32-NEXT:    add.w $a1, $a1, $a2
202 ; LA32-NEXT:    ret
204 ; LA64-LABEL: mulh_d:
205 ; LA64:       # %bb.0:
206 ; LA64-NEXT:    mulh.d $a0, $a0, $a1
207 ; LA64-NEXT:    ret
208   %1 = sext i64 %a to i128
209   %2 = sext i64 %b to i128
210   %3 = mul i128 %1, %2
211   %4 = lshr i128 %3, 64
212   %5 = trunc i128 %4 to i64
213   ret i64 %5
216 define i64 @mulh_du(i64 %a, i64 %b) {
217 ; LA32-LABEL: mulh_du:
218 ; LA32:       # %bb.0:
219 ; LA32-NEXT:    mulh.wu $a4, $a0, $a2
220 ; LA32-NEXT:    mul.w $a5, $a1, $a2
221 ; LA32-NEXT:    add.w $a4, $a5, $a4
222 ; LA32-NEXT:    sltu $a5, $a4, $a5
223 ; LA32-NEXT:    mulh.wu $a2, $a1, $a2
224 ; LA32-NEXT:    add.w $a2, $a2, $a5
225 ; LA32-NEXT:    mul.w $a5, $a0, $a3
226 ; LA32-NEXT:    add.w $a4, $a5, $a4
227 ; LA32-NEXT:    sltu $a4, $a4, $a5
228 ; LA32-NEXT:    mulh.wu $a0, $a0, $a3
229 ; LA32-NEXT:    add.w $a0, $a0, $a4
230 ; LA32-NEXT:    mul.w $a4, $a1, $a3
231 ; LA32-NEXT:    mulh.wu $a1, $a1, $a3
232 ; LA32-NEXT:    add.w $a0, $a2, $a0
233 ; LA32-NEXT:    sltu $a2, $a0, $a2
234 ; LA32-NEXT:    add.w $a1, $a1, $a2
235 ; LA32-NEXT:    add.w $a0, $a4, $a0
236 ; LA32-NEXT:    sltu $a2, $a0, $a4
237 ; LA32-NEXT:    add.w $a1, $a1, $a2
238 ; LA32-NEXT:    ret
240 ; LA64-LABEL: mulh_du:
241 ; LA64:       # %bb.0:
242 ; LA64-NEXT:    mulh.du $a0, $a0, $a1
243 ; LA64-NEXT:    ret
244   %1 = zext i64 %a to i128
245   %2 = zext i64 %b to i128
246   %3 = mul i128 %1, %2
247   %4 = lshr i128 %3, 64
248   %5 = trunc i128 %4 to i64
249   ret i64 %5
252 define i64 @mulw_d_w(i32 %a, i32 %b) {
253 ; LA32-LABEL: mulw_d_w:
254 ; LA32:       # %bb.0:
255 ; LA32-NEXT:    mul.w $a2, $a0, $a1
256 ; LA32-NEXT:    mulh.w $a1, $a0, $a1
257 ; LA32-NEXT:    move $a0, $a2
258 ; LA32-NEXT:    ret
260 ; LA64-LABEL: mulw_d_w:
261 ; LA64:       # %bb.0:
262 ; LA64-NEXT:    mulw.d.w $a0, $a0, $a1
263 ; LA64-NEXT:    ret
264   %1 = sext i32 %a to i64
265   %2 = sext i32 %b to i64
266   %3 = mul i64 %1, %2
267   ret i64 %3
270 define i64 @mulw_d_wu(i32 %a, i32 %b) {
271 ; LA32-LABEL: mulw_d_wu:
272 ; LA32:       # %bb.0:
273 ; LA32-NEXT:    mul.w $a2, $a0, $a1
274 ; LA32-NEXT:    mulh.wu $a1, $a0, $a1
275 ; LA32-NEXT:    move $a0, $a2
276 ; LA32-NEXT:    ret
278 ; LA64-LABEL: mulw_d_wu:
279 ; LA64:       # %bb.0:
280 ; LA64-NEXT:    mulw.d.wu $a0, $a0, $a1
281 ; LA64-NEXT:    ret
282   %1 = zext i32 %a to i64
283   %2 = zext i32 %b to i64
284   %3 = mul i64 %1, %2
285   ret i64 %3
288 define signext i32 @mul_i32_11(i32 %a) {
289 ; LA32-LABEL: mul_i32_11:
290 ; LA32:       # %bb.0:
291 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
292 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
293 ; LA32-NEXT:    ret
295 ; LA64-LABEL: mul_i32_11:
296 ; LA64:       # %bb.0:
297 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
298 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
299 ; LA64-NEXT:    ret
300   %b = mul i32 %a, 11
301   ret i32 %b
304 define signext i32 @mul_i32_13(i32 %a) {
305 ; LA32-LABEL: mul_i32_13:
306 ; LA32:       # %bb.0:
307 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
308 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
309 ; LA32-NEXT:    ret
311 ; LA64-LABEL: mul_i32_13:
312 ; LA64:       # %bb.0:
313 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
314 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
315 ; LA64-NEXT:    ret
316   %b = mul i32 %a, 13
317   ret i32 %b
320 define signext i32 @mul_i32_19(i32 %a) {
321 ; LA32-LABEL: mul_i32_19:
322 ; LA32:       # %bb.0:
323 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
324 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
325 ; LA32-NEXT:    ret
327 ; LA64-LABEL: mul_i32_19:
328 ; LA64:       # %bb.0:
329 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
330 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
331 ; LA64-NEXT:    ret
332   %b = mul i32 %a, 19
333   ret i32 %b
336 define signext i32 @mul_i32_21(i32 %a) {
337 ; LA32-LABEL: mul_i32_21:
338 ; LA32:       # %bb.0:
339 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
340 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
341 ; LA32-NEXT:    ret
343 ; LA64-LABEL: mul_i32_21:
344 ; LA64:       # %bb.0:
345 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
346 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
347 ; LA64-NEXT:    ret
348   %b = mul i32 %a, 21
349   ret i32 %b
352 define signext i32 @mul_i32_25(i32 %a) {
353 ; LA32-LABEL: mul_i32_25:
354 ; LA32:       # %bb.0:
355 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
356 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
357 ; LA32-NEXT:    ret
359 ; LA64-LABEL: mul_i32_25:
360 ; LA64:       # %bb.0:
361 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
362 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
363 ; LA64-NEXT:    ret
364   %b = mul i32 %a, 25
365   ret i32 %b
368 define signext i32 @mul_i32_27(i32 %a) {
369 ; LA32-LABEL: mul_i32_27:
370 ; LA32:       # %bb.0:
371 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
372 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
373 ; LA32-NEXT:    ret
375 ; LA64-LABEL: mul_i32_27:
376 ; LA64:       # %bb.0:
377 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
378 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
379 ; LA64-NEXT:    ret
380   %b = mul i32 %a, 27
381   ret i32 %b
384 define signext i32 @mul_i32_35(i32 %a) {
385 ; LA32-LABEL: mul_i32_35:
386 ; LA32:       # %bb.0:
387 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
388 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
389 ; LA32-NEXT:    ret
391 ; LA64-LABEL: mul_i32_35:
392 ; LA64:       # %bb.0:
393 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
394 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
395 ; LA64-NEXT:    ret
396   %b = mul i32 %a, 35
397   ret i32 %b
400 define signext i32 @mul_i32_37(i32 %a) {
401 ; LA32-LABEL: mul_i32_37:
402 ; LA32:       # %bb.0:
403 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
404 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
405 ; LA32-NEXT:    ret
407 ; LA64-LABEL: mul_i32_37:
408 ; LA64:       # %bb.0:
409 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
410 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
411 ; LA64-NEXT:    ret
412   %b = mul i32 %a, 37
413   ret i32 %b
416 define signext i32 @mul_i32_41(i32 %a) {
417 ; LA32-LABEL: mul_i32_41:
418 ; LA32:       # %bb.0:
419 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
420 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
421 ; LA32-NEXT:    ret
423 ; LA64-LABEL: mul_i32_41:
424 ; LA64:       # %bb.0:
425 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
426 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
427 ; LA64-NEXT:    ret
428   %b = mul i32 %a, 41
429   ret i32 %b
432 define signext i32 @mul_i32_45(i32 %a) {
433 ; LA32-LABEL: mul_i32_45:
434 ; LA32:       # %bb.0:
435 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
436 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
437 ; LA32-NEXT:    ret
439 ; LA64-LABEL: mul_i32_45:
440 ; LA64:       # %bb.0:
441 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
442 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
443 ; LA64-NEXT:    ret
444   %b = mul i32 %a, 45
445   ret i32 %b
448 define signext i32 @mul_i32_49(i32 %a) {
449 ; LA32-LABEL: mul_i32_49:
450 ; LA32:       # %bb.0:
451 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
452 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
453 ; LA32-NEXT:    ret
455 ; LA64-LABEL: mul_i32_49:
456 ; LA64:       # %bb.0:
457 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
458 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
459 ; LA64-NEXT:    ret
460   %b = mul i32 %a, 49
461   ret i32 %b
464 define signext i32 @mul_i32_51(i32 %a) {
465 ; LA32-LABEL: mul_i32_51:
466 ; LA32:       # %bb.0:
467 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
468 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
469 ; LA32-NEXT:    ret
471 ; LA64-LABEL: mul_i32_51:
472 ; LA64:       # %bb.0:
473 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
474 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
475 ; LA64-NEXT:    ret
476   %b = mul i32 %a, 51
477   ret i32 %b
480 define signext i32 @mul_i32_69(i32 %a) {
481 ; LA32-LABEL: mul_i32_69:
482 ; LA32:       # %bb.0:
483 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
484 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
485 ; LA32-NEXT:    ret
487 ; LA64-LABEL: mul_i32_69:
488 ; LA64:       # %bb.0:
489 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
490 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
491 ; LA64-NEXT:    ret
492   %b = mul i32 %a, 69
493   ret i32 %b
496 define signext i32 @mul_i32_73(i32 %a) {
497 ; LA32-LABEL: mul_i32_73:
498 ; LA32:       # %bb.0:
499 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
500 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
501 ; LA32-NEXT:    ret
503 ; LA64-LABEL: mul_i32_73:
504 ; LA64:       # %bb.0:
505 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
506 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
507 ; LA64-NEXT:    ret
508   %b = mul i32 %a, 73
509   ret i32 %b
512 define signext i32 @mul_i32_81(i32 %a) {
513 ; LA32-LABEL: mul_i32_81:
514 ; LA32:       # %bb.0:
515 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
516 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
517 ; LA32-NEXT:    ret
519 ; LA64-LABEL: mul_i32_81:
520 ; LA64:       # %bb.0:
521 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
522 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
523 ; LA64-NEXT:    ret
524   %b = mul i32 %a, 81
525   ret i32 %b
528 define signext i32 @mul_i32_85(i32 %a) {
529 ; LA32-LABEL: mul_i32_85:
530 ; LA32:       # %bb.0:
531 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
532 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
533 ; LA32-NEXT:    ret
535 ; LA64-LABEL: mul_i32_85:
536 ; LA64:       # %bb.0:
537 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
538 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
539 ; LA64-NEXT:    ret
540   %b = mul i32 %a, 85
541   ret i32 %b
544 define signext i32 @mul_i32_137(i32 %a) {
545 ; LA32-LABEL: mul_i32_137:
546 ; LA32:       # %bb.0:
547 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
548 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
549 ; LA32-NEXT:    ret
551 ; LA64-LABEL: mul_i32_137:
552 ; LA64:       # %bb.0:
553 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
554 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
555 ; LA64-NEXT:    ret
556   %b = mul i32 %a, 137
557   ret i32 %b
560 define signext i32 @mul_i32_145(i32 %a) {
561 ; LA32-LABEL: mul_i32_145:
562 ; LA32:       # %bb.0:
563 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
564 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
565 ; LA32-NEXT:    ret
567 ; LA64-LABEL: mul_i32_145:
568 ; LA64:       # %bb.0:
569 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
570 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
571 ; LA64-NEXT:    ret
572   %b = mul i32 %a, 145
573   ret i32 %b
576 define signext i32 @mul_i32_153(i32 %a) {
577 ; LA32-LABEL: mul_i32_153:
578 ; LA32:       # %bb.0:
579 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
580 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
581 ; LA32-NEXT:    ret
583 ; LA64-LABEL: mul_i32_153:
584 ; LA64:       # %bb.0:
585 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
586 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
587 ; LA64-NEXT:    ret
588   %b = mul i32 %a, 153
589   ret i32 %b
592 define signext i32 @mul_i32_273(i32 %a) {
593 ; LA32-LABEL: mul_i32_273:
594 ; LA32:       # %bb.0:
595 ; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
596 ; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
597 ; LA32-NEXT:    ret
599 ; LA64-LABEL: mul_i32_273:
600 ; LA64:       # %bb.0:
601 ; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
602 ; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
603 ; LA64-NEXT:    ret
604   %b = mul i32 %a, 273
605   ret i32 %b
608 define signext i32 @mul_i32_289(i32 %a) {
609 ; LA32-LABEL: mul_i32_289:
610 ; LA32:       # %bb.0:
611 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
612 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
613 ; LA32-NEXT:    ret
615 ; LA64-LABEL: mul_i32_289:
616 ; LA64:       # %bb.0:
617 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
618 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
619 ; LA64-NEXT:    ret
620   %b = mul i32 %a, 289
621   ret i32 %b
624 define i64 @mul_i64_11(i64 %a) {
625 ; LA32-LABEL: mul_i64_11:
626 ; LA32:       # %bb.0:
627 ; LA32-NEXT:    ori $a2, $zero, 11
628 ; LA32-NEXT:    mul.w $a1, $a1, $a2
629 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
630 ; LA32-NEXT:    add.w $a1, $a3, $a1
631 ; LA32-NEXT:    mul.w $a0, $a0, $a2
632 ; LA32-NEXT:    ret
634 ; LA64-LABEL: mul_i64_11:
635 ; LA64:       # %bb.0:
636 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
637 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
638 ; LA64-NEXT:    ret
639   %b = mul i64 %a, 11
640   ret i64 %b
643 define i64 @mul_i64_13(i64 %a) {
644 ; LA32-LABEL: mul_i64_13:
645 ; LA32:       # %bb.0:
646 ; LA32-NEXT:    ori $a2, $zero, 13
647 ; LA32-NEXT:    mul.w $a1, $a1, $a2
648 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
649 ; LA32-NEXT:    add.w $a1, $a3, $a1
650 ; LA32-NEXT:    mul.w $a0, $a0, $a2
651 ; LA32-NEXT:    ret
653 ; LA64-LABEL: mul_i64_13:
654 ; LA64:       # %bb.0:
655 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
656 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
657 ; LA64-NEXT:    ret
658   %b = mul i64 %a, 13
659   ret i64 %b
662 define i64 @mul_i64_19(i64 %a) {
663 ; LA32-LABEL: mul_i64_19:
664 ; LA32:       # %bb.0:
665 ; LA32-NEXT:    ori $a2, $zero, 19
666 ; LA32-NEXT:    mul.w $a1, $a1, $a2
667 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
668 ; LA32-NEXT:    add.w $a1, $a3, $a1
669 ; LA32-NEXT:    mul.w $a0, $a0, $a2
670 ; LA32-NEXT:    ret
672 ; LA64-LABEL: mul_i64_19:
673 ; LA64:       # %bb.0:
674 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
675 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
676 ; LA64-NEXT:    ret
677   %b = mul i64 %a, 19
678   ret i64 %b
681 define i64 @mul_i64_21(i64 %a) {
682 ; LA32-LABEL: mul_i64_21:
683 ; LA32:       # %bb.0:
684 ; LA32-NEXT:    ori $a2, $zero, 21
685 ; LA32-NEXT:    mul.w $a1, $a1, $a2
686 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
687 ; LA32-NEXT:    add.w $a1, $a3, $a1
688 ; LA32-NEXT:    mul.w $a0, $a0, $a2
689 ; LA32-NEXT:    ret
691 ; LA64-LABEL: mul_i64_21:
692 ; LA64:       # %bb.0:
693 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
694 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
695 ; LA64-NEXT:    ret
696   %b = mul i64 %a, 21
697   ret i64 %b
700 define i64 @mul_i64_25(i64 %a) {
701 ; LA32-LABEL: mul_i64_25:
702 ; LA32:       # %bb.0:
703 ; LA32-NEXT:    ori $a2, $zero, 25
704 ; LA32-NEXT:    mul.w $a1, $a1, $a2
705 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
706 ; LA32-NEXT:    add.w $a1, $a3, $a1
707 ; LA32-NEXT:    mul.w $a0, $a0, $a2
708 ; LA32-NEXT:    ret
710 ; LA64-LABEL: mul_i64_25:
711 ; LA64:       # %bb.0:
712 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
713 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
714 ; LA64-NEXT:    ret
715   %b = mul i64 %a, 25
716   ret i64 %b
719 define i64 @mul_i64_27(i64 %a) {
720 ; LA32-LABEL: mul_i64_27:
721 ; LA32:       # %bb.0:
722 ; LA32-NEXT:    ori $a2, $zero, 27
723 ; LA32-NEXT:    mul.w $a1, $a1, $a2
724 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
725 ; LA32-NEXT:    add.w $a1, $a3, $a1
726 ; LA32-NEXT:    mul.w $a0, $a0, $a2
727 ; LA32-NEXT:    ret
729 ; LA64-LABEL: mul_i64_27:
730 ; LA64:       # %bb.0:
731 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
732 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
733 ; LA64-NEXT:    ret
734   %b = mul i64 %a, 27
735   ret i64 %b
738 define i64 @mul_i64_35(i64 %a) {
739 ; LA32-LABEL: mul_i64_35:
740 ; LA32:       # %bb.0:
741 ; LA32-NEXT:    ori $a2, $zero, 35
742 ; LA32-NEXT:    mul.w $a1, $a1, $a2
743 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
744 ; LA32-NEXT:    add.w $a1, $a3, $a1
745 ; LA32-NEXT:    mul.w $a0, $a0, $a2
746 ; LA32-NEXT:    ret
748 ; LA64-LABEL: mul_i64_35:
749 ; LA64:       # %bb.0:
750 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
751 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
752 ; LA64-NEXT:    ret
753   %b = mul i64 %a, 35
754   ret i64 %b
757 define i64 @mul_i64_37(i64 %a) {
758 ; LA32-LABEL: mul_i64_37:
759 ; LA32:       # %bb.0:
760 ; LA32-NEXT:    ori $a2, $zero, 37
761 ; LA32-NEXT:    mul.w $a1, $a1, $a2
762 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
763 ; LA32-NEXT:    add.w $a1, $a3, $a1
764 ; LA32-NEXT:    mul.w $a0, $a0, $a2
765 ; LA32-NEXT:    ret
767 ; LA64-LABEL: mul_i64_37:
768 ; LA64:       # %bb.0:
769 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
770 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
771 ; LA64-NEXT:    ret
772   %b = mul i64 %a, 37
773   ret i64 %b
776 define i64 @mul_i64_41(i64 %a) {
777 ; LA32-LABEL: mul_i64_41:
778 ; LA32:       # %bb.0:
779 ; LA32-NEXT:    ori $a2, $zero, 41
780 ; LA32-NEXT:    mul.w $a1, $a1, $a2
781 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
782 ; LA32-NEXT:    add.w $a1, $a3, $a1
783 ; LA32-NEXT:    mul.w $a0, $a0, $a2
784 ; LA32-NEXT:    ret
786 ; LA64-LABEL: mul_i64_41:
787 ; LA64:       # %bb.0:
788 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
789 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
790 ; LA64-NEXT:    ret
791   %b = mul i64 %a, 41
792   ret i64 %b
795 define i64 @mul_i64_45(i64 %a) {
796 ; LA32-LABEL: mul_i64_45:
797 ; LA32:       # %bb.0:
798 ; LA32-NEXT:    ori $a2, $zero, 45
799 ; LA32-NEXT:    mul.w $a1, $a1, $a2
800 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
801 ; LA32-NEXT:    add.w $a1, $a3, $a1
802 ; LA32-NEXT:    mul.w $a0, $a0, $a2
803 ; LA32-NEXT:    ret
805 ; LA64-LABEL: mul_i64_45:
806 ; LA64:       # %bb.0:
807 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
808 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
809 ; LA64-NEXT:    ret
810   %b = mul i64 %a, 45
811   ret i64 %b
814 define i64 @mul_i64_49(i64 %a) {
815 ; LA32-LABEL: mul_i64_49:
816 ; LA32:       # %bb.0:
817 ; LA32-NEXT:    ori $a2, $zero, 49
818 ; LA32-NEXT:    mul.w $a1, $a1, $a2
819 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
820 ; LA32-NEXT:    add.w $a1, $a3, $a1
821 ; LA32-NEXT:    mul.w $a0, $a0, $a2
822 ; LA32-NEXT:    ret
824 ; LA64-LABEL: mul_i64_49:
825 ; LA64:       # %bb.0:
826 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
827 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
828 ; LA64-NEXT:    ret
829   %b = mul i64 %a, 49
830   ret i64 %b
833 define i64 @mul_i64_51(i64 %a) {
834 ; LA32-LABEL: mul_i64_51:
835 ; LA32:       # %bb.0:
836 ; LA32-NEXT:    ori $a2, $zero, 51
837 ; LA32-NEXT:    mul.w $a1, $a1, $a2
838 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
839 ; LA32-NEXT:    add.w $a1, $a3, $a1
840 ; LA32-NEXT:    mul.w $a0, $a0, $a2
841 ; LA32-NEXT:    ret
843 ; LA64-LABEL: mul_i64_51:
844 ; LA64:       # %bb.0:
845 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
846 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
847 ; LA64-NEXT:    ret
848   %b = mul i64 %a, 51
849   ret i64 %b
852 define i64 @mul_i64_69(i64 %a) {
853 ; LA32-LABEL: mul_i64_69:
854 ; LA32:       # %bb.0:
855 ; LA32-NEXT:    ori $a2, $zero, 69
856 ; LA32-NEXT:    mul.w $a1, $a1, $a2
857 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
858 ; LA32-NEXT:    add.w $a1, $a3, $a1
859 ; LA32-NEXT:    mul.w $a0, $a0, $a2
860 ; LA32-NEXT:    ret
862 ; LA64-LABEL: mul_i64_69:
863 ; LA64:       # %bb.0:
864 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
865 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
866 ; LA64-NEXT:    ret
867   %b = mul i64 %a, 69
868   ret i64 %b
871 define i64 @mul_i64_73(i64 %a) {
872 ; LA32-LABEL: mul_i64_73:
873 ; LA32:       # %bb.0:
874 ; LA32-NEXT:    ori $a2, $zero, 73
875 ; LA32-NEXT:    mul.w $a1, $a1, $a2
876 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
877 ; LA32-NEXT:    add.w $a1, $a3, $a1
878 ; LA32-NEXT:    mul.w $a0, $a0, $a2
879 ; LA32-NEXT:    ret
881 ; LA64-LABEL: mul_i64_73:
882 ; LA64:       # %bb.0:
883 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
884 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
885 ; LA64-NEXT:    ret
886   %b = mul i64 %a, 73
887   ret i64 %b
890 define i64 @mul_i64_81(i64 %a) {
891 ; LA32-LABEL: mul_i64_81:
892 ; LA32:       # %bb.0:
893 ; LA32-NEXT:    ori $a2, $zero, 81
894 ; LA32-NEXT:    mul.w $a1, $a1, $a2
895 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
896 ; LA32-NEXT:    add.w $a1, $a3, $a1
897 ; LA32-NEXT:    mul.w $a0, $a0, $a2
898 ; LA32-NEXT:    ret
900 ; LA64-LABEL: mul_i64_81:
901 ; LA64:       # %bb.0:
902 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
903 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
904 ; LA64-NEXT:    ret
905   %b = mul i64 %a, 81
906   ret i64 %b
909 define i64 @mul_i64_85(i64 %a) {
910 ; LA32-LABEL: mul_i64_85:
911 ; LA32:       # %bb.0:
912 ; LA32-NEXT:    ori $a2, $zero, 85
913 ; LA32-NEXT:    mul.w $a1, $a1, $a2
914 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
915 ; LA32-NEXT:    add.w $a1, $a3, $a1
916 ; LA32-NEXT:    mul.w $a0, $a0, $a2
917 ; LA32-NEXT:    ret
919 ; LA64-LABEL: mul_i64_85:
920 ; LA64:       # %bb.0:
921 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
922 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
923 ; LA64-NEXT:    ret
924   %b = mul i64 %a, 85
925   ret i64 %b
928 define i64 @mul_i64_137(i64 %a) {
929 ; LA32-LABEL: mul_i64_137:
930 ; LA32:       # %bb.0:
931 ; LA32-NEXT:    ori $a2, $zero, 137
932 ; LA32-NEXT:    mul.w $a1, $a1, $a2
933 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
934 ; LA32-NEXT:    add.w $a1, $a3, $a1
935 ; LA32-NEXT:    mul.w $a0, $a0, $a2
936 ; LA32-NEXT:    ret
938 ; LA64-LABEL: mul_i64_137:
939 ; LA64:       # %bb.0:
940 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
941 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
942 ; LA64-NEXT:    ret
943   %b = mul i64 %a, 137
944   ret i64 %b
947 define i64 @mul_i64_145(i64 %a) {
948 ; LA32-LABEL: mul_i64_145:
949 ; LA32:       # %bb.0:
950 ; LA32-NEXT:    ori $a2, $zero, 145
951 ; LA32-NEXT:    mul.w $a1, $a1, $a2
952 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
953 ; LA32-NEXT:    add.w $a1, $a3, $a1
954 ; LA32-NEXT:    mul.w $a0, $a0, $a2
955 ; LA32-NEXT:    ret
957 ; LA64-LABEL: mul_i64_145:
958 ; LA64:       # %bb.0:
959 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
960 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
961 ; LA64-NEXT:    ret
962   %b = mul i64 %a, 145
963   ret i64 %b
966 define i64 @mul_i64_153(i64 %a) {
967 ; LA32-LABEL: mul_i64_153:
968 ; LA32:       # %bb.0:
969 ; LA32-NEXT:    ori $a2, $zero, 153
970 ; LA32-NEXT:    mul.w $a1, $a1, $a2
971 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
972 ; LA32-NEXT:    add.w $a1, $a3, $a1
973 ; LA32-NEXT:    mul.w $a0, $a0, $a2
974 ; LA32-NEXT:    ret
976 ; LA64-LABEL: mul_i64_153:
977 ; LA64:       # %bb.0:
978 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
979 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
980 ; LA64-NEXT:    ret
981   %b = mul i64 %a, 153
982   ret i64 %b
985 define i64 @mul_i64_273(i64 %a) {
986 ; LA32-LABEL: mul_i64_273:
987 ; LA32:       # %bb.0:
988 ; LA32-NEXT:    ori $a2, $zero, 273
989 ; LA32-NEXT:    mul.w $a1, $a1, $a2
990 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
991 ; LA32-NEXT:    add.w $a1, $a3, $a1
992 ; LA32-NEXT:    mul.w $a0, $a0, $a2
993 ; LA32-NEXT:    ret
995 ; LA64-LABEL: mul_i64_273:
996 ; LA64:       # %bb.0:
997 ; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
998 ; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
999 ; LA64-NEXT:    ret
1000   %b = mul i64 %a, 273
1001   ret i64 %b
1004 define i64 @mul_i64_289(i64 %a) {
1005 ; LA32-LABEL: mul_i64_289:
1006 ; LA32:       # %bb.0:
1007 ; LA32-NEXT:    ori $a2, $zero, 289
1008 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1009 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1010 ; LA32-NEXT:    add.w $a1, $a3, $a1
1011 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1012 ; LA32-NEXT:    ret
1014 ; LA64-LABEL: mul_i64_289:
1015 ; LA64:       # %bb.0:
1016 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1017 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1018 ; LA64-NEXT:    ret
1019   %b = mul i64 %a, 289
1020   ret i64 %b
1023 define signext i32 @mul_i32_4098(i32 %a) {
1024 ; LA32-LABEL: mul_i32_4098:
1025 ; LA32:       # %bb.0:
1026 ; LA32-NEXT:    slli.w $a1, $a0, 12
1027 ; LA32-NEXT:    alsl.w $a0, $a0, $a1, 1
1028 ; LA32-NEXT:    ret
1030 ; LA64-LABEL: mul_i32_4098:
1031 ; LA64:       # %bb.0:
1032 ; LA64-NEXT:    slli.d $a1, $a0, 12
1033 ; LA64-NEXT:    alsl.w $a0, $a0, $a1, 1
1034 ; LA64-NEXT:    ret
1035   %b = mul i32 %a, 4098
1036   ret i32 %b
1039 define signext i32 @mul_i32_4100(i32 %a) {
1040 ; LA32-LABEL: mul_i32_4100:
1041 ; LA32:       # %bb.0:
1042 ; LA32-NEXT:    slli.w $a1, $a0, 12
1043 ; LA32-NEXT:    alsl.w $a0, $a0, $a1, 2
1044 ; LA32-NEXT:    ret
1046 ; LA64-LABEL: mul_i32_4100:
1047 ; LA64:       # %bb.0:
1048 ; LA64-NEXT:    slli.d $a1, $a0, 12
1049 ; LA64-NEXT:    alsl.w $a0, $a0, $a1, 2
1050 ; LA64-NEXT:    ret
1051   %b = mul i32 %a, 4100
1052   ret i32 %b
1055 define signext i32 @mul_i32_4104(i32 %a) {
1056 ; LA32-LABEL: mul_i32_4104:
1057 ; LA32:       # %bb.0:
1058 ; LA32-NEXT:    slli.w $a1, $a0, 12
1059 ; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3
1060 ; LA32-NEXT:    ret
1062 ; LA64-LABEL: mul_i32_4104:
1063 ; LA64:       # %bb.0:
1064 ; LA64-NEXT:    slli.d $a1, $a0, 12
1065 ; LA64-NEXT:    alsl.w $a0, $a0, $a1, 3
1066 ; LA64-NEXT:    ret
1067   %b = mul i32 %a, 4104
1068   ret i32 %b
1071 define signext i32 @mul_i32_4112(i32 %a) {
1072 ; LA32-LABEL: mul_i32_4112:
1073 ; LA32:       # %bb.0:
1074 ; LA32-NEXT:    slli.w $a1, $a0, 12
1075 ; LA32-NEXT:    alsl.w $a0, $a0, $a1, 4
1076 ; LA32-NEXT:    ret
1078 ; LA64-LABEL: mul_i32_4112:
1079 ; LA64:       # %bb.0:
1080 ; LA64-NEXT:    slli.d $a1, $a0, 12
1081 ; LA64-NEXT:    alsl.w $a0, $a0, $a1, 4
1082 ; LA64-NEXT:    ret
1083   %b = mul i32 %a, 4112
1084   ret i32 %b
1087 define i64 @mul_i64_4098(i64 %a) {
1088 ; LA32-LABEL: mul_i64_4098:
1089 ; LA32:       # %bb.0:
1090 ; LA32-NEXT:    lu12i.w $a2, 1
1091 ; LA32-NEXT:    ori $a2, $a2, 2
1092 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1093 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1094 ; LA32-NEXT:    add.w $a1, $a3, $a1
1095 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1096 ; LA32-NEXT:    ret
1098 ; LA64-LABEL: mul_i64_4098:
1099 ; LA64:       # %bb.0:
1100 ; LA64-NEXT:    slli.d $a1, $a0, 12
1101 ; LA64-NEXT:    alsl.d $a0, $a0, $a1, 1
1102 ; LA64-NEXT:    ret
1103   %b = mul i64 %a, 4098
1104   ret i64 %b
1107 define i64 @mul_i64_4100(i64 %a) {
1108 ; LA32-LABEL: mul_i64_4100:
1109 ; LA32:       # %bb.0:
1110 ; LA32-NEXT:    lu12i.w $a2, 1
1111 ; LA32-NEXT:    ori $a2, $a2, 4
1112 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1113 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1114 ; LA32-NEXT:    add.w $a1, $a3, $a1
1115 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1116 ; LA32-NEXT:    ret
1118 ; LA64-LABEL: mul_i64_4100:
1119 ; LA64:       # %bb.0:
1120 ; LA64-NEXT:    slli.d $a1, $a0, 12
1121 ; LA64-NEXT:    alsl.d $a0, $a0, $a1, 2
1122 ; LA64-NEXT:    ret
1123   %b = mul i64 %a, 4100
1124   ret i64 %b
1127 define i64 @mul_i64_4104(i64 %a) {
1128 ; LA32-LABEL: mul_i64_4104:
1129 ; LA32:       # %bb.0:
1130 ; LA32-NEXT:    lu12i.w $a2, 1
1131 ; LA32-NEXT:    ori $a2, $a2, 8
1132 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1133 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1134 ; LA32-NEXT:    add.w $a1, $a3, $a1
1135 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1136 ; LA32-NEXT:    ret
1138 ; LA64-LABEL: mul_i64_4104:
1139 ; LA64:       # %bb.0:
1140 ; LA64-NEXT:    slli.d $a1, $a0, 12
1141 ; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3
1142 ; LA64-NEXT:    ret
1143   %b = mul i64 %a, 4104
1144   ret i64 %b
1147 define i64 @mul_i64_4112(i64 %a) {
1148 ; LA32-LABEL: mul_i64_4112:
1149 ; LA32:       # %bb.0:
1150 ; LA32-NEXT:    lu12i.w $a2, 1
1151 ; LA32-NEXT:    ori $a2, $a2, 16
1152 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1153 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1154 ; LA32-NEXT:    add.w $a1, $a3, $a1
1155 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1156 ; LA32-NEXT:    ret
1158 ; LA64-LABEL: mul_i64_4112:
1159 ; LA64:       # %bb.0:
1160 ; LA64-NEXT:    slli.d $a1, $a0, 12
1161 ; LA64-NEXT:    alsl.d $a0, $a0, $a1, 4
1162 ; LA64-NEXT:    ret
1163   %b = mul i64 %a, 4112
1164   ret i64 %b
1167 define signext i32 @mul_i32_768(i32 %a) {
1168 ; LA32-LABEL: mul_i32_768:
1169 ; LA32:       # %bb.0:
1170 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
1171 ; LA32-NEXT:    slli.w $a0, $a0, 8
1172 ; LA32-NEXT:    ret
1174 ; LA64-LABEL: mul_i32_768:
1175 ; LA64:       # %bb.0:
1176 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
1177 ; LA64-NEXT:    slli.w $a0, $a0, 8
1178 ; LA64-NEXT:    ret
1179   %b = mul i32 %a, 768
1180   ret i32 %b
1183 define signext i32 @mul_i32_1280(i32 %a) {
1184 ; LA32-LABEL: mul_i32_1280:
1185 ; LA32:       # %bb.0:
1186 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
1187 ; LA32-NEXT:    slli.w $a0, $a0, 8
1188 ; LA32-NEXT:    ret
1190 ; LA64-LABEL: mul_i32_1280:
1191 ; LA64:       # %bb.0:
1192 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
1193 ; LA64-NEXT:    slli.w $a0, $a0, 8
1194 ; LA64-NEXT:    ret
1195   %b = mul i32 %a, 1280
1196   ret i32 %b
1199 define signext i32 @mul_i32_2304(i32 %a) {
1200 ; LA32-LABEL: mul_i32_2304:
1201 ; LA32:       # %bb.0:
1202 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
1203 ; LA32-NEXT:    slli.w $a0, $a0, 8
1204 ; LA32-NEXT:    ret
1206 ; LA64-LABEL: mul_i32_2304:
1207 ; LA64:       # %bb.0:
1208 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
1209 ; LA64-NEXT:    slli.w $a0, $a0, 8
1210 ; LA64-NEXT:    ret
1211   %b = mul i32 %a, 2304
1212   ret i32 %b
1215 define signext i32 @mul_i32_4352(i32 %a) {
1216 ; LA32-LABEL: mul_i32_4352:
1217 ; LA32:       # %bb.0:
1218 ; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
1219 ; LA32-NEXT:    slli.w $a0, $a0, 8
1220 ; LA32-NEXT:    ret
1222 ; LA64-LABEL: mul_i32_4352:
1223 ; LA64:       # %bb.0:
1224 ; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
1225 ; LA64-NEXT:    slli.w $a0, $a0, 8
1226 ; LA64-NEXT:    ret
1227   %b = mul i32 %a, 4352
1228   ret i32 %b
1231 define i64 @mul_i64_768(i64 %a) {
1232 ; LA32-LABEL: mul_i64_768:
1233 ; LA32:       # %bb.0:
1234 ; LA32-NEXT:    ori $a2, $zero, 768
1235 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1236 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1237 ; LA32-NEXT:    add.w $a1, $a3, $a1
1238 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1239 ; LA32-NEXT:    ret
1241 ; LA64-LABEL: mul_i64_768:
1242 ; LA64:       # %bb.0:
1243 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
1244 ; LA64-NEXT:    slli.d $a0, $a0, 8
1245 ; LA64-NEXT:    ret
1246   %b = mul i64 %a, 768
1247   ret i64 %b
1250 define i64 @mul_i64_1280(i64 %a) {
1251 ; LA32-LABEL: mul_i64_1280:
1252 ; LA32:       # %bb.0:
1253 ; LA32-NEXT:    ori $a2, $zero, 1280
1254 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1255 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1256 ; LA32-NEXT:    add.w $a1, $a3, $a1
1257 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1258 ; LA32-NEXT:    ret
1260 ; LA64-LABEL: mul_i64_1280:
1261 ; LA64:       # %bb.0:
1262 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
1263 ; LA64-NEXT:    slli.d $a0, $a0, 8
1264 ; LA64-NEXT:    ret
1265   %b = mul i64 %a, 1280
1266   ret i64 %b
1269 define i64 @mul_i64_2304(i64 %a) {
1270 ; LA32-LABEL: mul_i64_2304:
1271 ; LA32:       # %bb.0:
1272 ; LA32-NEXT:    ori $a2, $zero, 2304
1273 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1274 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1275 ; LA32-NEXT:    add.w $a1, $a3, $a1
1276 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1277 ; LA32-NEXT:    ret
1279 ; LA64-LABEL: mul_i64_2304:
1280 ; LA64:       # %bb.0:
1281 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
1282 ; LA64-NEXT:    slli.d $a0, $a0, 8
1283 ; LA64-NEXT:    ret
1284   %b = mul i64 %a, 2304
1285   ret i64 %b
1288 define i64 @mul_i64_4352(i64 %a) {
1289 ; LA32-LABEL: mul_i64_4352:
1290 ; LA32:       # %bb.0:
1291 ; LA32-NEXT:    lu12i.w $a2, 1
1292 ; LA32-NEXT:    ori $a2, $a2, 256
1293 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1294 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1295 ; LA32-NEXT:    add.w $a1, $a3, $a1
1296 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1297 ; LA32-NEXT:    ret
1299 ; LA64-LABEL: mul_i64_4352:
1300 ; LA64:       # %bb.0:
1301 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1302 ; LA64-NEXT:    slli.d $a0, $a0, 8
1303 ; LA64-NEXT:    ret
1304   %b = mul i64 %a, 4352
1305   ret i64 %b
1308 define signext i32 @mul_i32_65792(i32 %a) {
1309 ; LA32-LABEL: mul_i32_65792:
1310 ; LA32:       # %bb.0:
1311 ; LA32-NEXT:    slli.w $a1, $a0, 8
1312 ; LA32-NEXT:    slli.w $a0, $a0, 16
1313 ; LA32-NEXT:    add.w $a0, $a0, $a1
1314 ; LA32-NEXT:    ret
1316 ; LA64-LABEL: mul_i32_65792:
1317 ; LA64:       # %bb.0:
1318 ; LA64-NEXT:    slli.d $a1, $a0, 8
1319 ; LA64-NEXT:    slli.d $a0, $a0, 16
1320 ; LA64-NEXT:    add.w $a0, $a0, $a1
1321 ; LA64-NEXT:    ret
1322   %b = mul i32 %a, 65792
1323   ret i32 %b
1326 define signext i32 @mul_i32_65280(i32 %a) {
1327 ; LA32-LABEL: mul_i32_65280:
1328 ; LA32:       # %bb.0:
1329 ; LA32-NEXT:    slli.w $a1, $a0, 8
1330 ; LA32-NEXT:    slli.w $a0, $a0, 16
1331 ; LA32-NEXT:    sub.w $a0, $a0, $a1
1332 ; LA32-NEXT:    ret
1334 ; LA64-LABEL: mul_i32_65280:
1335 ; LA64:       # %bb.0:
1336 ; LA64-NEXT:    slli.d $a1, $a0, 8
1337 ; LA64-NEXT:    slli.d $a0, $a0, 16
1338 ; LA64-NEXT:    sub.w $a0, $a0, $a1
1339 ; LA64-NEXT:    ret
1340   %b = mul i32 %a, 65280
1341   ret i32 %b
1344 define signext i32 @mul_i32_minus_65280(i32 %a) {
1345 ; LA32-LABEL: mul_i32_minus_65280:
1346 ; LA32:       # %bb.0:
1347 ; LA32-NEXT:    slli.w $a1, $a0, 16
1348 ; LA32-NEXT:    slli.w $a0, $a0, 8
1349 ; LA32-NEXT:    sub.w $a0, $a0, $a1
1350 ; LA32-NEXT:    ret
1352 ; LA64-LABEL: mul_i32_minus_65280:
1353 ; LA64:       # %bb.0:
1354 ; LA64-NEXT:    slli.d $a1, $a0, 16
1355 ; LA64-NEXT:    slli.d $a0, $a0, 8
1356 ; LA64-NEXT:    sub.w $a0, $a0, $a1
1357 ; LA64-NEXT:    ret
1358   %b = mul i32 %a, -65280
1359   ret i32 %b
1362 define i64 @mul_i64_65792(i64 %a) {
1363 ; LA32-LABEL: mul_i64_65792:
1364 ; LA32:       # %bb.0:
1365 ; LA32-NEXT:    lu12i.w $a2, 16
1366 ; LA32-NEXT:    ori $a2, $a2, 256
1367 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1368 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1369 ; LA32-NEXT:    add.w $a1, $a3, $a1
1370 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1371 ; LA32-NEXT:    ret
1373 ; LA64-LABEL: mul_i64_65792:
1374 ; LA64:       # %bb.0:
1375 ; LA64-NEXT:    slli.d $a1, $a0, 8
1376 ; LA64-NEXT:    slli.d $a0, $a0, 16
1377 ; LA64-NEXT:    add.d $a0, $a0, $a1
1378 ; LA64-NEXT:    ret
1379   %b = mul i64 %a, 65792
1380   ret i64 %b
1383 define i64 @mul_i64_65280(i64 %a) {
1384 ; LA32-LABEL: mul_i64_65280:
1385 ; LA32:       # %bb.0:
1386 ; LA32-NEXT:    lu12i.w $a2, 15
1387 ; LA32-NEXT:    ori $a2, $a2, 3840
1388 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1389 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1390 ; LA32-NEXT:    add.w $a1, $a3, $a1
1391 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1392 ; LA32-NEXT:    ret
1394 ; LA64-LABEL: mul_i64_65280:
1395 ; LA64:       # %bb.0:
1396 ; LA64-NEXT:    slli.d $a1, $a0, 8
1397 ; LA64-NEXT:    slli.d $a0, $a0, 16
1398 ; LA64-NEXT:    sub.d $a0, $a0, $a1
1399 ; LA64-NEXT:    ret
1400   %b = mul i64 %a, 65280
1401   ret i64 %b
1404 define i64 @mul_i64_minus_65280(i64 %a) {
1405 ; LA32-LABEL: mul_i64_minus_65280:
1406 ; LA32:       # %bb.0:
1407 ; LA32-NEXT:    lu12i.w $a2, -16
1408 ; LA32-NEXT:    ori $a2, $a2, 256
1409 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1410 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1411 ; LA32-NEXT:    sub.w $a3, $a3, $a0
1412 ; LA32-NEXT:    add.w $a1, $a3, $a1
1413 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1414 ; LA32-NEXT:    ret
1416 ; LA64-LABEL: mul_i64_minus_65280:
1417 ; LA64:       # %bb.0:
1418 ; LA64-NEXT:    slli.d $a1, $a0, 16
1419 ; LA64-NEXT:    slli.d $a0, $a0, 8
1420 ; LA64-NEXT:    sub.d $a0, $a0, $a1
1421 ; LA64-NEXT:    ret
1422   %b = mul i64 %a, -65280
1423   ret i64 %b
1426 ;; This multiplication is not transformed, due to
1427 ;; 1088 can be composed via a single ORI.
1428 define i64 @mul_i64_1088(i64 %a) {
1429 ; LA32-LABEL: mul_i64_1088:
1430 ; LA32:       # %bb.0:
1431 ; LA32-NEXT:    ori $a2, $zero, 1088
1432 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1433 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1434 ; LA32-NEXT:    add.w $a1, $a3, $a1
1435 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1436 ; LA32-NEXT:    ret
1438 ; LA64-LABEL: mul_i64_1088:
1439 ; LA64:       # %bb.0:
1440 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1441 ; LA64-NEXT:    slli.d $a0, $a0, 6
1442 ; LA64-NEXT:    ret
1443   %b = mul i64 %a, 1088
1444   ret i64 %b
1447 ;; This multiplication is not transformed, due to
1448 ;; -992 can be composed via a single ADDI.
1449 define i64 @mul_i64_minus_992(i64 %a) {
1450 ; LA32-LABEL: mul_i64_minus_992:
1451 ; LA32:       # %bb.0:
1452 ; LA32-NEXT:    addi.w $a2, $zero, -992
1453 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1454 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1455 ; LA32-NEXT:    sub.w $a3, $a3, $a0
1456 ; LA32-NEXT:    add.w $a1, $a3, $a1
1457 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1458 ; LA32-NEXT:    ret
1460 ; LA64-LABEL: mul_i64_minus_992:
1461 ; LA64:       # %bb.0:
1462 ; LA64-NEXT:    addi.w $a1, $zero, -992
1463 ; LA64-NEXT:    mul.d $a0, $a0, $a1
1464 ; LA64-NEXT:    ret
1465   %b = mul i64 %a, -992
1466   ret i64 %b
1469 ;; This multiplication is not transformed, due to
1470 ;; 4456448 can be composed via a single LUI.
1471 define i64 @mul_i64_4456448(i64 %a) {
1472 ; LA32-LABEL: mul_i64_4456448:
1473 ; LA32:       # %bb.0:
1474 ; LA32-NEXT:    lu12i.w $a2, 1088
1475 ; LA32-NEXT:    mul.w $a1, $a1, $a2
1476 ; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1477 ; LA32-NEXT:    add.w $a1, $a3, $a1
1478 ; LA32-NEXT:    mul.w $a0, $a0, $a2
1479 ; LA32-NEXT:    ret
1481 ; LA64-LABEL: mul_i64_4456448:
1482 ; LA64:       # %bb.0:
1483 ; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1484 ; LA64-NEXT:    slli.d $a0, $a0, 18
1485 ; LA64-NEXT:    ret
1486   %b = mul i64 %a, 4456448
1487   ret i64 %b
1490 ;; This multiplication is not transformed, due to
1491 ;; 65280 is used multiple times.
1492 define i64 @mul_i64_65280_twice(i64 %a, i64 %b) {
1493 ; LA32-LABEL: mul_i64_65280_twice:
1494 ; LA32:       # %bb.0:
1495 ; LA32-NEXT:    lu12i.w $a4, 15
1496 ; LA32-NEXT:    ori $a4, $a4, 3840
1497 ; LA32-NEXT:    mul.w $a3, $a3, $a4
1498 ; LA32-NEXT:    mulh.wu $a5, $a2, $a4
1499 ; LA32-NEXT:    add.w $a3, $a5, $a3
1500 ; LA32-NEXT:    mul.w $a1, $a1, $a4
1501 ; LA32-NEXT:    mulh.wu $a5, $a0, $a4
1502 ; LA32-NEXT:    add.w $a1, $a5, $a1
1503 ; LA32-NEXT:    xor $a1, $a1, $a3
1504 ; LA32-NEXT:    mul.w $a2, $a2, $a4
1505 ; LA32-NEXT:    mul.w $a0, $a0, $a4
1506 ; LA32-NEXT:    xor $a0, $a0, $a2
1507 ; LA32-NEXT:    ret
1509 ; LA64-LABEL: mul_i64_65280_twice:
1510 ; LA64:       # %bb.0:
1511 ; LA64-NEXT:    lu12i.w $a2, 15
1512 ; LA64-NEXT:    ori $a2, $a2, 3840
1513 ; LA64-NEXT:    mul.d $a1, $a1, $a2
1514 ; LA64-NEXT:    mul.d $a0, $a0, $a2
1515 ; LA64-NEXT:    xor $a0, $a0, $a1
1516 ; LA64-NEXT:    ret
1517   %c = mul i64 %a, 65280
1518   %d = mul i64 %b, 65280
1519   %e = xor i64 %c, %d
1520   ret i64 %e