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) {
9 ; LA32: # %bb.0: # %entry
10 ; LA32-NEXT: mul.w $a0, $a0, $a1
14 ; LA64: # %bb.0: # %entry
15 ; LA64-NEXT: mul.d $a0, $a0, $a1
22 define i8 @mul_i8(i8 %a, i8 %b) {
24 ; LA32: # %bb.0: # %entry
25 ; LA32-NEXT: mul.w $a0, $a0, $a1
29 ; LA64: # %bb.0: # %entry
30 ; LA64-NEXT: mul.d $a0, $a0, $a1
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
43 ; LA64-LABEL: mul_i16:
44 ; LA64: # %bb.0: # %entry
45 ; LA64-NEXT: mul.d $a0, $a0, $a1
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
58 ; LA64-LABEL: mul_i32:
59 ; LA64: # %bb.0: # %entry
60 ; LA64-NEXT: mul.d $a0, $a0, $a1
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
78 ; LA64-LABEL: mul_i64:
79 ; LA64: # %bb.0: # %entry
80 ; LA64-NEXT: mul.d $a0, $a0, $a1
87 define i64 @mul_pow2(i64 %a) {
88 ; LA32-LABEL: mul_pow2:
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
96 ; LA64-LABEL: mul_pow2:
98 ; LA64-NEXT: slli.d $a0, $a0, 3
104 define i64 @mul_p5(i64 %a) {
105 ; LA32-LABEL: mul_p5:
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
114 ; LA64-LABEL: mul_p5:
116 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
122 define i32 @mulh_w(i32 %a, i32 %b) {
123 ; LA32-LABEL: mulh_w:
125 ; LA32-NEXT: mulh.w $a0, $a0, $a1
128 ; LA64-LABEL: mulh_w:
130 ; LA64-NEXT: mulw.d.w $a0, $a0, $a1
131 ; LA64-NEXT: srli.d $a0, $a0, 32
133 %1 = sext i32 %a to i64
134 %2 = sext i32 %b to i64
137 %5 = trunc i64 %4 to i32
141 define i32 @mulh_wu(i32 %a, i32 %b) {
142 ; LA32-LABEL: mulh_wu:
144 ; LA32-NEXT: mulh.wu $a0, $a0, $a1
147 ; LA64-LABEL: mulh_wu:
149 ; LA64-NEXT: mulw.d.wu $a0, $a0, $a1
150 ; LA64-NEXT: srli.d $a0, $a0, 32
152 %1 = zext i32 %a to i64
153 %2 = zext i32 %b to i64
156 %5 = trunc i64 %4 to i32
160 define i64 @mulh_d(i64 %a, i64 %b) {
161 ; LA32-LABEL: mulh_d:
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
204 ; LA64-LABEL: mulh_d:
206 ; LA64-NEXT: mulh.d $a0, $a0, $a1
208 %1 = sext i64 %a to i128
209 %2 = sext i64 %b to i128
211 %4 = lshr i128 %3, 64
212 %5 = trunc i128 %4 to i64
216 define i64 @mulh_du(i64 %a, i64 %b) {
217 ; LA32-LABEL: mulh_du:
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
240 ; LA64-LABEL: mulh_du:
242 ; LA64-NEXT: mulh.du $a0, $a0, $a1
244 %1 = zext i64 %a to i128
245 %2 = zext i64 %b to i128
247 %4 = lshr i128 %3, 64
248 %5 = trunc i128 %4 to i64
252 define i64 @mulw_d_w(i32 %a, i32 %b) {
253 ; LA32-LABEL: mulw_d_w:
255 ; LA32-NEXT: mul.w $a2, $a0, $a1
256 ; LA32-NEXT: mulh.w $a1, $a0, $a1
257 ; LA32-NEXT: move $a0, $a2
260 ; LA64-LABEL: mulw_d_w:
262 ; LA64-NEXT: mulw.d.w $a0, $a0, $a1
264 %1 = sext i32 %a to i64
265 %2 = sext i32 %b to i64
270 define i64 @mulw_d_wu(i32 %a, i32 %b) {
271 ; LA32-LABEL: mulw_d_wu:
273 ; LA32-NEXT: mul.w $a2, $a0, $a1
274 ; LA32-NEXT: mulh.wu $a1, $a0, $a1
275 ; LA32-NEXT: move $a0, $a2
278 ; LA64-LABEL: mulw_d_wu:
280 ; LA64-NEXT: mulw.d.wu $a0, $a0, $a1
282 %1 = zext i32 %a to i64
283 %2 = zext i32 %b to i64
288 define signext i32 @mul_i32_11(i32 %a) {
289 ; LA32-LABEL: mul_i32_11:
291 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 2
292 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 1
295 ; LA64-LABEL: mul_i32_11:
297 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 2
298 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 1
304 define signext i32 @mul_i32_13(i32 %a) {
305 ; LA32-LABEL: mul_i32_13:
307 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 1
308 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 2
311 ; LA64-LABEL: mul_i32_13:
313 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 1
314 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 2
320 define signext i32 @mul_i32_19(i32 %a) {
321 ; LA32-LABEL: mul_i32_19:
323 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 3
324 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 1
327 ; LA64-LABEL: mul_i32_19:
329 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 3
330 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 1
336 define signext i32 @mul_i32_21(i32 %a) {
337 ; LA32-LABEL: mul_i32_21:
339 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 2
340 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 2
343 ; LA64-LABEL: mul_i32_21:
345 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 2
346 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 2
352 define signext i32 @mul_i32_25(i32 %a) {
353 ; LA32-LABEL: mul_i32_25:
355 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 1
356 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 3
359 ; LA64-LABEL: mul_i32_25:
361 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 1
362 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 3
368 define signext i32 @mul_i32_27(i32 %a) {
369 ; LA32-LABEL: mul_i32_27:
371 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 1
372 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
375 ; LA64-LABEL: mul_i32_27:
377 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 1
378 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 3
384 define signext i32 @mul_i32_35(i32 %a) {
385 ; LA32-LABEL: mul_i32_35:
387 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 4
388 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 1
391 ; LA64-LABEL: mul_i32_35:
393 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 4
394 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 1
400 define signext i32 @mul_i32_37(i32 %a) {
401 ; LA32-LABEL: mul_i32_37:
403 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 3
404 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 2
407 ; LA64-LABEL: mul_i32_37:
409 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 3
410 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 2
416 define signext i32 @mul_i32_41(i32 %a) {
417 ; LA32-LABEL: mul_i32_41:
419 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 2
420 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 3
423 ; LA64-LABEL: mul_i32_41:
425 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 2
426 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 3
432 define signext i32 @mul_i32_45(i32 %a) {
433 ; LA32-LABEL: mul_i32_45:
435 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
436 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
439 ; LA64-LABEL: mul_i32_45:
441 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 2
442 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 3
448 define signext i32 @mul_i32_49(i32 %a) {
449 ; LA32-LABEL: mul_i32_49:
451 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 1
452 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 4
455 ; LA64-LABEL: mul_i32_49:
457 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 1
458 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 4
464 define signext i32 @mul_i32_51(i32 %a) {
465 ; LA32-LABEL: mul_i32_51:
467 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 1
468 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
471 ; LA64-LABEL: mul_i32_51:
473 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 1
474 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
480 define signext i32 @mul_i32_69(i32 %a) {
481 ; LA32-LABEL: mul_i32_69:
483 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 4
484 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 2
487 ; LA64-LABEL: mul_i32_69:
489 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 4
490 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 2
496 define signext i32 @mul_i32_73(i32 %a) {
497 ; LA32-LABEL: mul_i32_73:
499 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 3
500 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 3
503 ; LA64-LABEL: mul_i32_73:
505 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 3
506 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 3
512 define signext i32 @mul_i32_81(i32 %a) {
513 ; LA32-LABEL: mul_i32_81:
515 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 2
516 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 4
519 ; LA64-LABEL: mul_i32_81:
521 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 2
522 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 4
528 define signext i32 @mul_i32_85(i32 %a) {
529 ; LA32-LABEL: mul_i32_85:
531 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
532 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
535 ; LA64-LABEL: mul_i32_85:
537 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 2
538 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
544 define signext i32 @mul_i32_137(i32 %a) {
545 ; LA32-LABEL: mul_i32_137:
547 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 4
548 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 3
551 ; LA64-LABEL: mul_i32_137:
553 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 4
554 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 3
560 define signext i32 @mul_i32_145(i32 %a) {
561 ; LA32-LABEL: mul_i32_145:
563 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 3
564 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 4
567 ; LA64-LABEL: mul_i32_145:
569 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 3
570 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 4
576 define signext i32 @mul_i32_153(i32 %a) {
577 ; LA32-LABEL: mul_i32_153:
579 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
580 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
583 ; LA64-LABEL: mul_i32_153:
585 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 3
586 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
592 define signext i32 @mul_i32_273(i32 %a) {
593 ; LA32-LABEL: mul_i32_273:
595 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 4
596 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 4
599 ; LA64-LABEL: mul_i32_273:
601 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 4
602 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 4
608 define signext i32 @mul_i32_289(i32 %a) {
609 ; LA32-LABEL: mul_i32_289:
611 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
612 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
615 ; LA64-LABEL: mul_i32_289:
617 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
618 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
624 define i64 @mul_i64_11(i64 %a) {
625 ; LA32-LABEL: mul_i64_11:
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
634 ; LA64-LABEL: mul_i64_11:
636 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 2
637 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 1
643 define i64 @mul_i64_13(i64 %a) {
644 ; LA32-LABEL: mul_i64_13:
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
653 ; LA64-LABEL: mul_i64_13:
655 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 1
656 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 2
662 define i64 @mul_i64_19(i64 %a) {
663 ; LA32-LABEL: mul_i64_19:
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
672 ; LA64-LABEL: mul_i64_19:
674 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 3
675 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 1
681 define i64 @mul_i64_21(i64 %a) {
682 ; LA32-LABEL: mul_i64_21:
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
691 ; LA64-LABEL: mul_i64_21:
693 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 2
694 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 2
700 define i64 @mul_i64_25(i64 %a) {
701 ; LA32-LABEL: mul_i64_25:
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
710 ; LA64-LABEL: mul_i64_25:
712 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 1
713 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 3
719 define i64 @mul_i64_27(i64 %a) {
720 ; LA32-LABEL: mul_i64_27:
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
729 ; LA64-LABEL: mul_i64_27:
731 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 1
732 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
738 define i64 @mul_i64_35(i64 %a) {
739 ; LA32-LABEL: mul_i64_35:
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
748 ; LA64-LABEL: mul_i64_35:
750 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 4
751 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 1
757 define i64 @mul_i64_37(i64 %a) {
758 ; LA32-LABEL: mul_i64_37:
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
767 ; LA64-LABEL: mul_i64_37:
769 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 3
770 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 2
776 define i64 @mul_i64_41(i64 %a) {
777 ; LA32-LABEL: mul_i64_41:
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
786 ; LA64-LABEL: mul_i64_41:
788 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 2
789 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 3
795 define i64 @mul_i64_45(i64 %a) {
796 ; LA32-LABEL: mul_i64_45:
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
805 ; LA64-LABEL: mul_i64_45:
807 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
808 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
814 define i64 @mul_i64_49(i64 %a) {
815 ; LA32-LABEL: mul_i64_49:
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
824 ; LA64-LABEL: mul_i64_49:
826 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 1
827 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 4
833 define i64 @mul_i64_51(i64 %a) {
834 ; LA32-LABEL: mul_i64_51:
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
843 ; LA64-LABEL: mul_i64_51:
845 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 1
846 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
852 define i64 @mul_i64_69(i64 %a) {
853 ; LA32-LABEL: mul_i64_69:
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
862 ; LA64-LABEL: mul_i64_69:
864 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 4
865 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 2
871 define i64 @mul_i64_73(i64 %a) {
872 ; LA32-LABEL: mul_i64_73:
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
881 ; LA64-LABEL: mul_i64_73:
883 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 3
884 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 3
890 define i64 @mul_i64_81(i64 %a) {
891 ; LA32-LABEL: mul_i64_81:
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
900 ; LA64-LABEL: mul_i64_81:
902 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 2
903 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 4
909 define i64 @mul_i64_85(i64 %a) {
910 ; LA32-LABEL: mul_i64_85:
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
919 ; LA64-LABEL: mul_i64_85:
921 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
922 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
928 define i64 @mul_i64_137(i64 %a) {
929 ; LA32-LABEL: mul_i64_137:
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
938 ; LA64-LABEL: mul_i64_137:
940 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 4
941 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 3
947 define i64 @mul_i64_145(i64 %a) {
948 ; LA32-LABEL: mul_i64_145:
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
957 ; LA64-LABEL: mul_i64_145:
959 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 3
960 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 4
966 define i64 @mul_i64_153(i64 %a) {
967 ; LA32-LABEL: mul_i64_153:
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
976 ; LA64-LABEL: mul_i64_153:
978 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
979 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
985 define i64 @mul_i64_273(i64 %a) {
986 ; LA32-LABEL: mul_i64_273:
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
995 ; LA64-LABEL: mul_i64_273:
997 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 4
998 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 4
1000 %b = mul i64 %a, 273
1004 define i64 @mul_i64_289(i64 %a) {
1005 ; LA32-LABEL: mul_i64_289:
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
1014 ; LA64-LABEL: mul_i64_289:
1016 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1017 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1019 %b = mul i64 %a, 289
1023 define signext i32 @mul_i32_4098(i32 %a) {
1024 ; LA32-LABEL: mul_i32_4098:
1026 ; LA32-NEXT: slli.w $a1, $a0, 12
1027 ; LA32-NEXT: alsl.w $a0, $a0, $a1, 1
1030 ; LA64-LABEL: mul_i32_4098:
1032 ; LA64-NEXT: slli.d $a1, $a0, 12
1033 ; LA64-NEXT: alsl.w $a0, $a0, $a1, 1
1035 %b = mul i32 %a, 4098
1039 define signext i32 @mul_i32_4100(i32 %a) {
1040 ; LA32-LABEL: mul_i32_4100:
1042 ; LA32-NEXT: slli.w $a1, $a0, 12
1043 ; LA32-NEXT: alsl.w $a0, $a0, $a1, 2
1046 ; LA64-LABEL: mul_i32_4100:
1048 ; LA64-NEXT: slli.d $a1, $a0, 12
1049 ; LA64-NEXT: alsl.w $a0, $a0, $a1, 2
1051 %b = mul i32 %a, 4100
1055 define signext i32 @mul_i32_4104(i32 %a) {
1056 ; LA32-LABEL: mul_i32_4104:
1058 ; LA32-NEXT: slli.w $a1, $a0, 12
1059 ; LA32-NEXT: alsl.w $a0, $a0, $a1, 3
1062 ; LA64-LABEL: mul_i32_4104:
1064 ; LA64-NEXT: slli.d $a1, $a0, 12
1065 ; LA64-NEXT: alsl.w $a0, $a0, $a1, 3
1067 %b = mul i32 %a, 4104
1071 define signext i32 @mul_i32_4112(i32 %a) {
1072 ; LA32-LABEL: mul_i32_4112:
1074 ; LA32-NEXT: slli.w $a1, $a0, 12
1075 ; LA32-NEXT: alsl.w $a0, $a0, $a1, 4
1078 ; LA64-LABEL: mul_i32_4112:
1080 ; LA64-NEXT: slli.d $a1, $a0, 12
1081 ; LA64-NEXT: alsl.w $a0, $a0, $a1, 4
1083 %b = mul i32 %a, 4112
1087 define i64 @mul_i64_4098(i64 %a) {
1088 ; LA32-LABEL: mul_i64_4098:
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
1098 ; LA64-LABEL: mul_i64_4098:
1100 ; LA64-NEXT: slli.d $a1, $a0, 12
1101 ; LA64-NEXT: alsl.d $a0, $a0, $a1, 1
1103 %b = mul i64 %a, 4098
1107 define i64 @mul_i64_4100(i64 %a) {
1108 ; LA32-LABEL: mul_i64_4100:
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
1118 ; LA64-LABEL: mul_i64_4100:
1120 ; LA64-NEXT: slli.d $a1, $a0, 12
1121 ; LA64-NEXT: alsl.d $a0, $a0, $a1, 2
1123 %b = mul i64 %a, 4100
1127 define i64 @mul_i64_4104(i64 %a) {
1128 ; LA32-LABEL: mul_i64_4104:
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
1138 ; LA64-LABEL: mul_i64_4104:
1140 ; LA64-NEXT: slli.d $a1, $a0, 12
1141 ; LA64-NEXT: alsl.d $a0, $a0, $a1, 3
1143 %b = mul i64 %a, 4104
1147 define i64 @mul_i64_4112(i64 %a) {
1148 ; LA32-LABEL: mul_i64_4112:
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
1158 ; LA64-LABEL: mul_i64_4112:
1160 ; LA64-NEXT: slli.d $a1, $a0, 12
1161 ; LA64-NEXT: alsl.d $a0, $a0, $a1, 4
1163 %b = mul i64 %a, 4112
1167 define signext i32 @mul_i32_768(i32 %a) {
1168 ; LA32-LABEL: mul_i32_768:
1170 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 1
1171 ; LA32-NEXT: slli.w $a0, $a0, 8
1174 ; LA64-LABEL: mul_i32_768:
1176 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 1
1177 ; LA64-NEXT: slli.w $a0, $a0, 8
1179 %b = mul i32 %a, 768
1183 define signext i32 @mul_i32_1280(i32 %a) {
1184 ; LA32-LABEL: mul_i32_1280:
1186 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
1187 ; LA32-NEXT: slli.w $a0, $a0, 8
1190 ; LA64-LABEL: mul_i32_1280:
1192 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 2
1193 ; LA64-NEXT: slli.w $a0, $a0, 8
1195 %b = mul i32 %a, 1280
1199 define signext i32 @mul_i32_2304(i32 %a) {
1200 ; LA32-LABEL: mul_i32_2304:
1202 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
1203 ; LA32-NEXT: slli.w $a0, $a0, 8
1206 ; LA64-LABEL: mul_i32_2304:
1208 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 3
1209 ; LA64-NEXT: slli.w $a0, $a0, 8
1211 %b = mul i32 %a, 2304
1215 define signext i32 @mul_i32_4352(i32 %a) {
1216 ; LA32-LABEL: mul_i32_4352:
1218 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
1219 ; LA32-NEXT: slli.w $a0, $a0, 8
1222 ; LA64-LABEL: mul_i32_4352:
1224 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
1225 ; LA64-NEXT: slli.w $a0, $a0, 8
1227 %b = mul i32 %a, 4352
1231 define i64 @mul_i64_768(i64 %a) {
1232 ; LA32-LABEL: mul_i64_768:
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
1241 ; LA64-LABEL: mul_i64_768:
1243 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 1
1244 ; LA64-NEXT: slli.d $a0, $a0, 8
1246 %b = mul i64 %a, 768
1250 define i64 @mul_i64_1280(i64 %a) {
1251 ; LA32-LABEL: mul_i64_1280:
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
1260 ; LA64-LABEL: mul_i64_1280:
1262 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
1263 ; LA64-NEXT: slli.d $a0, $a0, 8
1265 %b = mul i64 %a, 1280
1269 define i64 @mul_i64_2304(i64 %a) {
1270 ; LA32-LABEL: mul_i64_2304:
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
1279 ; LA64-LABEL: mul_i64_2304:
1281 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
1282 ; LA64-NEXT: slli.d $a0, $a0, 8
1284 %b = mul i64 %a, 2304
1288 define i64 @mul_i64_4352(i64 %a) {
1289 ; LA32-LABEL: mul_i64_4352:
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
1299 ; LA64-LABEL: mul_i64_4352:
1301 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1302 ; LA64-NEXT: slli.d $a0, $a0, 8
1304 %b = mul i64 %a, 4352
1308 define signext i32 @mul_i32_65792(i32 %a) {
1309 ; LA32-LABEL: mul_i32_65792:
1311 ; LA32-NEXT: slli.w $a1, $a0, 8
1312 ; LA32-NEXT: slli.w $a0, $a0, 16
1313 ; LA32-NEXT: add.w $a0, $a0, $a1
1316 ; LA64-LABEL: mul_i32_65792:
1318 ; LA64-NEXT: slli.d $a1, $a0, 8
1319 ; LA64-NEXT: slli.d $a0, $a0, 16
1320 ; LA64-NEXT: add.w $a0, $a0, $a1
1322 %b = mul i32 %a, 65792
1326 define signext i32 @mul_i32_65280(i32 %a) {
1327 ; LA32-LABEL: mul_i32_65280:
1329 ; LA32-NEXT: slli.w $a1, $a0, 8
1330 ; LA32-NEXT: slli.w $a0, $a0, 16
1331 ; LA32-NEXT: sub.w $a0, $a0, $a1
1334 ; LA64-LABEL: mul_i32_65280:
1336 ; LA64-NEXT: slli.d $a1, $a0, 8
1337 ; LA64-NEXT: slli.d $a0, $a0, 16
1338 ; LA64-NEXT: sub.w $a0, $a0, $a1
1340 %b = mul i32 %a, 65280
1344 define signext i32 @mul_i32_minus_65280(i32 %a) {
1345 ; LA32-LABEL: mul_i32_minus_65280:
1347 ; LA32-NEXT: slli.w $a1, $a0, 16
1348 ; LA32-NEXT: slli.w $a0, $a0, 8
1349 ; LA32-NEXT: sub.w $a0, $a0, $a1
1352 ; LA64-LABEL: mul_i32_minus_65280:
1354 ; LA64-NEXT: slli.d $a1, $a0, 16
1355 ; LA64-NEXT: slli.d $a0, $a0, 8
1356 ; LA64-NEXT: sub.w $a0, $a0, $a1
1358 %b = mul i32 %a, -65280
1362 define i64 @mul_i64_65792(i64 %a) {
1363 ; LA32-LABEL: mul_i64_65792:
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
1373 ; LA64-LABEL: mul_i64_65792:
1375 ; LA64-NEXT: slli.d $a1, $a0, 8
1376 ; LA64-NEXT: slli.d $a0, $a0, 16
1377 ; LA64-NEXT: add.d $a0, $a0, $a1
1379 %b = mul i64 %a, 65792
1383 define i64 @mul_i64_65280(i64 %a) {
1384 ; LA32-LABEL: mul_i64_65280:
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
1394 ; LA64-LABEL: mul_i64_65280:
1396 ; LA64-NEXT: slli.d $a1, $a0, 8
1397 ; LA64-NEXT: slli.d $a0, $a0, 16
1398 ; LA64-NEXT: sub.d $a0, $a0, $a1
1400 %b = mul i64 %a, 65280
1404 define i64 @mul_i64_minus_65280(i64 %a) {
1405 ; LA32-LABEL: mul_i64_minus_65280:
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
1416 ; LA64-LABEL: mul_i64_minus_65280:
1418 ; LA64-NEXT: slli.d $a1, $a0, 16
1419 ; LA64-NEXT: slli.d $a0, $a0, 8
1420 ; LA64-NEXT: sub.d $a0, $a0, $a1
1422 %b = mul i64 %a, -65280
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:
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
1438 ; LA64-LABEL: mul_i64_1088:
1440 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1441 ; LA64-NEXT: slli.d $a0, $a0, 6
1443 %b = mul i64 %a, 1088
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:
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
1460 ; LA64-LABEL: mul_i64_minus_992:
1462 ; LA64-NEXT: addi.w $a1, $zero, -992
1463 ; LA64-NEXT: mul.d $a0, $a0, $a1
1465 %b = mul i64 %a, -992
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:
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
1481 ; LA64-LABEL: mul_i64_4456448:
1483 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1484 ; LA64-NEXT: slli.d $a0, $a0, 18
1486 %b = mul i64 %a, 4456448
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:
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
1509 ; LA64-LABEL: mul_i64_65280_twice:
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
1517 %c = mul i64 %a, 65280
1518 %d = mul i64 %b, 65280