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) {
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: 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
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: 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
205 ; LA64-LABEL: mulh_d:
207 ; LA64-NEXT: mulh.d $a0, $a0, $a1
209 %1 = sext i64 %a to i128
210 %2 = sext i64 %b to i128
212 %4 = lshr i128 %3, 64
213 %5 = trunc i128 %4 to i64
217 define i64 @mulh_du(i64 %a, i64 %b) {
218 ; LA32-LABEL: mulh_du:
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
241 ; LA64-LABEL: mulh_du:
243 ; LA64-NEXT: mulh.du $a0, $a0, $a1
245 %1 = zext i64 %a to i128
246 %2 = zext i64 %b to i128
248 %4 = lshr i128 %3, 64
249 %5 = trunc i128 %4 to i64
253 define i64 @mulw_d_w(i32 %a, i32 %b) {
254 ; LA32-LABEL: mulw_d_w:
256 ; LA32-NEXT: mul.w $a2, $a0, $a1
257 ; LA32-NEXT: mulh.w $a1, $a0, $a1
258 ; LA32-NEXT: move $a0, $a2
261 ; LA64-LABEL: mulw_d_w:
263 ; LA64-NEXT: mulw.d.w $a0, $a0, $a1
265 %1 = sext i32 %a to i64
266 %2 = sext i32 %b to i64
271 define i64 @mulw_d_wu(i32 %a, i32 %b) {
272 ; LA32-LABEL: mulw_d_wu:
274 ; LA32-NEXT: mul.w $a2, $a0, $a1
275 ; LA32-NEXT: mulh.wu $a1, $a0, $a1
276 ; LA32-NEXT: move $a0, $a2
279 ; LA64-LABEL: mulw_d_wu:
281 ; LA64-NEXT: mulw.d.wu $a0, $a0, $a1
283 %1 = zext i32 %a to i64
284 %2 = zext i32 %b to i64
289 define signext i32 @mul_i32_11(i32 %a) {
290 ; LA32-LABEL: mul_i32_11:
292 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 2
293 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 1
296 ; LA64-LABEL: mul_i32_11:
298 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 2
299 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 1
305 define signext i32 @mul_i32_13(i32 %a) {
306 ; LA32-LABEL: mul_i32_13:
308 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 1
309 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 2
312 ; LA64-LABEL: mul_i32_13:
314 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 1
315 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 2
321 define signext i32 @mul_i32_19(i32 %a) {
322 ; LA32-LABEL: mul_i32_19:
324 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 3
325 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 1
328 ; LA64-LABEL: mul_i32_19:
330 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 3
331 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 1
337 define signext i32 @mul_i32_21(i32 %a) {
338 ; LA32-LABEL: mul_i32_21:
340 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 2
341 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 2
344 ; LA64-LABEL: mul_i32_21:
346 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 2
347 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 2
353 define signext i32 @mul_i32_25(i32 %a) {
354 ; LA32-LABEL: mul_i32_25:
356 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 1
357 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 3
360 ; LA64-LABEL: mul_i32_25:
362 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 1
363 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 3
369 define signext i32 @mul_i32_27(i32 %a) {
370 ; LA32-LABEL: mul_i32_27:
372 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 1
373 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
376 ; LA64-LABEL: mul_i32_27:
378 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 1
379 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 3
385 define signext i32 @mul_i32_35(i32 %a) {
386 ; LA32-LABEL: mul_i32_35:
388 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 4
389 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 1
392 ; LA64-LABEL: mul_i32_35:
394 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 4
395 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 1
401 define signext i32 @mul_i32_37(i32 %a) {
402 ; LA32-LABEL: mul_i32_37:
404 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 3
405 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 2
408 ; LA64-LABEL: mul_i32_37:
410 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 3
411 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 2
417 define signext i32 @mul_i32_41(i32 %a) {
418 ; LA32-LABEL: mul_i32_41:
420 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 2
421 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 3
424 ; LA64-LABEL: mul_i32_41:
426 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 2
427 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 3
433 define signext i32 @mul_i32_45(i32 %a) {
434 ; LA32-LABEL: mul_i32_45:
436 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
437 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
440 ; LA64-LABEL: mul_i32_45:
442 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 2
443 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 3
449 define signext i32 @mul_i32_49(i32 %a) {
450 ; LA32-LABEL: mul_i32_49:
452 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 1
453 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 4
456 ; LA64-LABEL: mul_i32_49:
458 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 1
459 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 4
465 define signext i32 @mul_i32_51(i32 %a) {
466 ; LA32-LABEL: mul_i32_51:
468 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 1
469 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
472 ; LA64-LABEL: mul_i32_51:
474 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 1
475 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
481 define signext i32 @mul_i32_69(i32 %a) {
482 ; LA32-LABEL: mul_i32_69:
484 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 4
485 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 2
488 ; LA64-LABEL: mul_i32_69:
490 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 4
491 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 2
497 define signext i32 @mul_i32_73(i32 %a) {
498 ; LA32-LABEL: mul_i32_73:
500 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 3
501 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 3
504 ; LA64-LABEL: mul_i32_73:
506 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 3
507 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 3
513 define signext i32 @mul_i32_81(i32 %a) {
514 ; LA32-LABEL: mul_i32_81:
516 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 2
517 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 4
520 ; LA64-LABEL: mul_i32_81:
522 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 2
523 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 4
529 define signext i32 @mul_i32_85(i32 %a) {
530 ; LA32-LABEL: mul_i32_85:
532 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
533 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
536 ; LA64-LABEL: mul_i32_85:
538 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 2
539 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
545 define signext i32 @mul_i32_137(i32 %a) {
546 ; LA32-LABEL: mul_i32_137:
548 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 4
549 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 3
552 ; LA64-LABEL: mul_i32_137:
554 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 4
555 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 3
561 define signext i32 @mul_i32_145(i32 %a) {
562 ; LA32-LABEL: mul_i32_145:
564 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 3
565 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 4
568 ; LA64-LABEL: mul_i32_145:
570 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 3
571 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 4
577 define signext i32 @mul_i32_153(i32 %a) {
578 ; LA32-LABEL: mul_i32_153:
580 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
581 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
584 ; LA64-LABEL: mul_i32_153:
586 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 3
587 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
593 define signext i32 @mul_i32_273(i32 %a) {
594 ; LA32-LABEL: mul_i32_273:
596 ; LA32-NEXT: alsl.w $a1, $a0, $a0, 4
597 ; LA32-NEXT: alsl.w $a0, $a1, $a0, 4
600 ; LA64-LABEL: mul_i32_273:
602 ; LA64-NEXT: alsl.w $a1, $a0, $a0, 4
603 ; LA64-NEXT: alsl.w $a0, $a1, $a0, 4
609 define signext i32 @mul_i32_289(i32 %a) {
610 ; LA32-LABEL: mul_i32_289:
612 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
613 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
616 ; LA64-LABEL: mul_i32_289:
618 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
619 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
625 define i64 @mul_i64_11(i64 %a) {
626 ; LA32-LABEL: mul_i64_11:
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
635 ; LA64-LABEL: mul_i64_11:
637 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 2
638 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 1
644 define i64 @mul_i64_13(i64 %a) {
645 ; LA32-LABEL: mul_i64_13:
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
654 ; LA64-LABEL: mul_i64_13:
656 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 1
657 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 2
663 define i64 @mul_i64_19(i64 %a) {
664 ; LA32-LABEL: mul_i64_19:
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
673 ; LA64-LABEL: mul_i64_19:
675 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 3
676 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 1
682 define i64 @mul_i64_21(i64 %a) {
683 ; LA32-LABEL: mul_i64_21:
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
692 ; LA64-LABEL: mul_i64_21:
694 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 2
695 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 2
701 define i64 @mul_i64_25(i64 %a) {
702 ; LA32-LABEL: mul_i64_25:
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
711 ; LA64-LABEL: mul_i64_25:
713 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 1
714 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 3
720 define i64 @mul_i64_27(i64 %a) {
721 ; LA32-LABEL: mul_i64_27:
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
730 ; LA64-LABEL: mul_i64_27:
732 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 1
733 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
739 define i64 @mul_i64_35(i64 %a) {
740 ; LA32-LABEL: mul_i64_35:
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
749 ; LA64-LABEL: mul_i64_35:
751 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 4
752 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 1
758 define i64 @mul_i64_37(i64 %a) {
759 ; LA32-LABEL: mul_i64_37:
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
768 ; LA64-LABEL: mul_i64_37:
770 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 3
771 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 2
777 define i64 @mul_i64_41(i64 %a) {
778 ; LA32-LABEL: mul_i64_41:
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
787 ; LA64-LABEL: mul_i64_41:
789 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 2
790 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 3
796 define i64 @mul_i64_45(i64 %a) {
797 ; LA32-LABEL: mul_i64_45:
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
806 ; LA64-LABEL: mul_i64_45:
808 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
809 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
815 define i64 @mul_i64_49(i64 %a) {
816 ; LA32-LABEL: mul_i64_49:
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
825 ; LA64-LABEL: mul_i64_49:
827 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 1
828 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 4
834 define i64 @mul_i64_51(i64 %a) {
835 ; LA32-LABEL: mul_i64_51:
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
844 ; LA64-LABEL: mul_i64_51:
846 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 1
847 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
853 define i64 @mul_i64_69(i64 %a) {
854 ; LA32-LABEL: mul_i64_69:
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
863 ; LA64-LABEL: mul_i64_69:
865 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 4
866 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 2
872 define i64 @mul_i64_73(i64 %a) {
873 ; LA32-LABEL: mul_i64_73:
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
882 ; LA64-LABEL: mul_i64_73:
884 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 3
885 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 3
891 define i64 @mul_i64_81(i64 %a) {
892 ; LA32-LABEL: mul_i64_81:
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
901 ; LA64-LABEL: mul_i64_81:
903 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 2
904 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 4
910 define i64 @mul_i64_85(i64 %a) {
911 ; LA32-LABEL: mul_i64_85:
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
920 ; LA64-LABEL: mul_i64_85:
922 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
923 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
929 define i64 @mul_i64_137(i64 %a) {
930 ; LA32-LABEL: mul_i64_137:
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
939 ; LA64-LABEL: mul_i64_137:
941 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 4
942 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 3
948 define i64 @mul_i64_145(i64 %a) {
949 ; LA32-LABEL: mul_i64_145:
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
958 ; LA64-LABEL: mul_i64_145:
960 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 3
961 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 4
967 define i64 @mul_i64_153(i64 %a) {
968 ; LA32-LABEL: mul_i64_153:
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
977 ; LA64-LABEL: mul_i64_153:
979 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
980 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
986 define i64 @mul_i64_273(i64 %a) {
987 ; LA32-LABEL: mul_i64_273:
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
996 ; LA64-LABEL: mul_i64_273:
998 ; LA64-NEXT: alsl.d $a1, $a0, $a0, 4
999 ; LA64-NEXT: alsl.d $a0, $a1, $a0, 4
1001 %b = mul i64 %a, 273
1005 define i64 @mul_i64_289(i64 %a) {
1006 ; LA32-LABEL: mul_i64_289:
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
1015 ; LA64-LABEL: mul_i64_289:
1017 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1018 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1020 %b = mul i64 %a, 289
1024 define signext i32 @mul_i32_4098(i32 %a) {
1025 ; LA32-LABEL: mul_i32_4098:
1027 ; LA32-NEXT: slli.w $a1, $a0, 12
1028 ; LA32-NEXT: alsl.w $a0, $a0, $a1, 1
1031 ; LA64-LABEL: mul_i32_4098:
1033 ; LA64-NEXT: slli.d $a1, $a0, 12
1034 ; LA64-NEXT: alsl.w $a0, $a0, $a1, 1
1036 %b = mul i32 %a, 4098
1040 define signext i32 @mul_i32_4100(i32 %a) {
1041 ; LA32-LABEL: mul_i32_4100:
1043 ; LA32-NEXT: slli.w $a1, $a0, 12
1044 ; LA32-NEXT: alsl.w $a0, $a0, $a1, 2
1047 ; LA64-LABEL: mul_i32_4100:
1049 ; LA64-NEXT: slli.d $a1, $a0, 12
1050 ; LA64-NEXT: alsl.w $a0, $a0, $a1, 2
1052 %b = mul i32 %a, 4100
1056 define signext i32 @mul_i32_4104(i32 %a) {
1057 ; LA32-LABEL: mul_i32_4104:
1059 ; LA32-NEXT: slli.w $a1, $a0, 12
1060 ; LA32-NEXT: alsl.w $a0, $a0, $a1, 3
1063 ; LA64-LABEL: mul_i32_4104:
1065 ; LA64-NEXT: slli.d $a1, $a0, 12
1066 ; LA64-NEXT: alsl.w $a0, $a0, $a1, 3
1068 %b = mul i32 %a, 4104
1072 define signext i32 @mul_i32_4112(i32 %a) {
1073 ; LA32-LABEL: mul_i32_4112:
1075 ; LA32-NEXT: slli.w $a1, $a0, 12
1076 ; LA32-NEXT: alsl.w $a0, $a0, $a1, 4
1079 ; LA64-LABEL: mul_i32_4112:
1081 ; LA64-NEXT: slli.d $a1, $a0, 12
1082 ; LA64-NEXT: alsl.w $a0, $a0, $a1, 4
1084 %b = mul i32 %a, 4112
1088 define i64 @mul_i64_4098(i64 %a) {
1089 ; LA32-LABEL: mul_i64_4098:
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
1099 ; LA64-LABEL: mul_i64_4098:
1101 ; LA64-NEXT: slli.d $a1, $a0, 12
1102 ; LA64-NEXT: alsl.d $a0, $a0, $a1, 1
1104 %b = mul i64 %a, 4098
1108 define i64 @mul_i64_4100(i64 %a) {
1109 ; LA32-LABEL: mul_i64_4100:
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
1119 ; LA64-LABEL: mul_i64_4100:
1121 ; LA64-NEXT: slli.d $a1, $a0, 12
1122 ; LA64-NEXT: alsl.d $a0, $a0, $a1, 2
1124 %b = mul i64 %a, 4100
1128 define i64 @mul_i64_4104(i64 %a) {
1129 ; LA32-LABEL: mul_i64_4104:
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
1139 ; LA64-LABEL: mul_i64_4104:
1141 ; LA64-NEXT: slli.d $a1, $a0, 12
1142 ; LA64-NEXT: alsl.d $a0, $a0, $a1, 3
1144 %b = mul i64 %a, 4104
1148 define i64 @mul_i64_4112(i64 %a) {
1149 ; LA32-LABEL: mul_i64_4112:
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
1159 ; LA64-LABEL: mul_i64_4112:
1161 ; LA64-NEXT: slli.d $a1, $a0, 12
1162 ; LA64-NEXT: alsl.d $a0, $a0, $a1, 4
1164 %b = mul i64 %a, 4112
1168 define signext i32 @mul_i32_768(i32 %a) {
1169 ; LA32-LABEL: mul_i32_768:
1171 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 1
1172 ; LA32-NEXT: slli.w $a0, $a0, 8
1175 ; LA64-LABEL: mul_i32_768:
1177 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 1
1178 ; LA64-NEXT: slli.w $a0, $a0, 8
1180 %b = mul i32 %a, 768
1184 define signext i32 @mul_i32_1280(i32 %a) {
1185 ; LA32-LABEL: mul_i32_1280:
1187 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
1188 ; LA32-NEXT: slli.w $a0, $a0, 8
1191 ; LA64-LABEL: mul_i32_1280:
1193 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 2
1194 ; LA64-NEXT: slli.w $a0, $a0, 8
1196 %b = mul i32 %a, 1280
1200 define signext i32 @mul_i32_2304(i32 %a) {
1201 ; LA32-LABEL: mul_i32_2304:
1203 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
1204 ; LA32-NEXT: slli.w $a0, $a0, 8
1207 ; LA64-LABEL: mul_i32_2304:
1209 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 3
1210 ; LA64-NEXT: slli.w $a0, $a0, 8
1212 %b = mul i32 %a, 2304
1216 define signext i32 @mul_i32_4352(i32 %a) {
1217 ; LA32-LABEL: mul_i32_4352:
1219 ; LA32-NEXT: alsl.w $a0, $a0, $a0, 4
1220 ; LA32-NEXT: slli.w $a0, $a0, 8
1223 ; LA64-LABEL: mul_i32_4352:
1225 ; LA64-NEXT: alsl.w $a0, $a0, $a0, 4
1226 ; LA64-NEXT: slli.w $a0, $a0, 8
1228 %b = mul i32 %a, 4352
1232 define i64 @mul_i64_768(i64 %a) {
1233 ; LA32-LABEL: mul_i64_768:
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
1242 ; LA64-LABEL: mul_i64_768:
1244 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 1
1245 ; LA64-NEXT: slli.d $a0, $a0, 8
1247 %b = mul i64 %a, 768
1251 define i64 @mul_i64_1280(i64 %a) {
1252 ; LA32-LABEL: mul_i64_1280:
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
1261 ; LA64-LABEL: mul_i64_1280:
1263 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
1264 ; LA64-NEXT: slli.d $a0, $a0, 8
1266 %b = mul i64 %a, 1280
1270 define i64 @mul_i64_2304(i64 %a) {
1271 ; LA32-LABEL: mul_i64_2304:
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
1280 ; LA64-LABEL: mul_i64_2304:
1282 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
1283 ; LA64-NEXT: slli.d $a0, $a0, 8
1285 %b = mul i64 %a, 2304
1289 define i64 @mul_i64_4352(i64 %a) {
1290 ; LA32-LABEL: mul_i64_4352:
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
1300 ; LA64-LABEL: mul_i64_4352:
1302 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1303 ; LA64-NEXT: slli.d $a0, $a0, 8
1305 %b = mul i64 %a, 4352
1309 define signext i32 @mul_i32_65792(i32 %a) {
1310 ; LA32-LABEL: mul_i32_65792:
1312 ; LA32-NEXT: slli.w $a1, $a0, 8
1313 ; LA32-NEXT: slli.w $a0, $a0, 16
1314 ; LA32-NEXT: add.w $a0, $a0, $a1
1317 ; LA64-LABEL: mul_i32_65792:
1319 ; LA64-NEXT: slli.d $a1, $a0, 8
1320 ; LA64-NEXT: slli.d $a0, $a0, 16
1321 ; LA64-NEXT: add.w $a0, $a0, $a1
1323 %b = mul i32 %a, 65792
1327 define signext i32 @mul_i32_65280(i32 %a) {
1328 ; LA32-LABEL: mul_i32_65280:
1330 ; LA32-NEXT: slli.w $a1, $a0, 8
1331 ; LA32-NEXT: slli.w $a0, $a0, 16
1332 ; LA32-NEXT: sub.w $a0, $a0, $a1
1335 ; LA64-LABEL: mul_i32_65280:
1337 ; LA64-NEXT: slli.d $a1, $a0, 8
1338 ; LA64-NEXT: slli.d $a0, $a0, 16
1339 ; LA64-NEXT: sub.w $a0, $a0, $a1
1341 %b = mul i32 %a, 65280
1345 define signext i32 @mul_i32_minus_65280(i32 %a) {
1346 ; LA32-LABEL: mul_i32_minus_65280:
1348 ; LA32-NEXT: slli.w $a1, $a0, 16
1349 ; LA32-NEXT: slli.w $a0, $a0, 8
1350 ; LA32-NEXT: sub.w $a0, $a0, $a1
1353 ; LA64-LABEL: mul_i32_minus_65280:
1355 ; LA64-NEXT: slli.d $a1, $a0, 16
1356 ; LA64-NEXT: slli.d $a0, $a0, 8
1357 ; LA64-NEXT: sub.w $a0, $a0, $a1
1359 %b = mul i32 %a, -65280
1363 define i64 @mul_i64_65792(i64 %a) {
1364 ; LA32-LABEL: mul_i64_65792:
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
1374 ; LA64-LABEL: mul_i64_65792:
1376 ; LA64-NEXT: slli.d $a1, $a0, 8
1377 ; LA64-NEXT: slli.d $a0, $a0, 16
1378 ; LA64-NEXT: add.d $a0, $a0, $a1
1380 %b = mul i64 %a, 65792
1384 define i64 @mul_i64_65280(i64 %a) {
1385 ; LA32-LABEL: mul_i64_65280:
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
1395 ; LA64-LABEL: mul_i64_65280:
1397 ; LA64-NEXT: slli.d $a1, $a0, 8
1398 ; LA64-NEXT: slli.d $a0, $a0, 16
1399 ; LA64-NEXT: sub.d $a0, $a0, $a1
1401 %b = mul i64 %a, 65280
1405 define i64 @mul_i64_minus_65280(i64 %a) {
1406 ; LA32-LABEL: mul_i64_minus_65280:
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
1417 ; LA64-LABEL: mul_i64_minus_65280:
1419 ; LA64-NEXT: slli.d $a1, $a0, 16
1420 ; LA64-NEXT: slli.d $a0, $a0, 8
1421 ; LA64-NEXT: sub.d $a0, $a0, $a1
1423 %b = mul i64 %a, -65280
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:
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
1439 ; LA64-LABEL: mul_i64_1088:
1441 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1442 ; LA64-NEXT: slli.d $a0, $a0, 6
1444 %b = mul i64 %a, 1088
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:
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
1461 ; LA64-LABEL: mul_i64_minus_992:
1463 ; LA64-NEXT: addi.w $a1, $zero, -992
1464 ; LA64-NEXT: mul.d $a0, $a0, $a1
1466 %b = mul i64 %a, -992
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:
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
1482 ; LA64-LABEL: mul_i64_4456448:
1484 ; LA64-NEXT: alsl.d $a0, $a0, $a0, 4
1485 ; LA64-NEXT: slli.d $a0, $a0, 18
1487 %b = mul i64 %a, 4456448
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:
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
1510 ; LA64-LABEL: mul_i64_65280_twice:
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
1518 %c = mul i64 %a, 65280
1519 %d = mul i64 %b, 65280