@@ -467,29 +467,30 @@ define i32 @mulhu_constant(i32 %a) nounwind {
467
467
define i32 @muli32_p10 (i32 %a ) nounwind {
468
468
; RV32I-LABEL: muli32_p10:
469
469
; RV32I: # %bb.0:
470
- ; RV32I-NEXT: li a1, 10
471
- ; RV32I-NEXT: tail __mulsi3
470
+ ; RV32I-NEXT: slli a1, a0, 1
471
+ ; RV32I-NEXT: slli a0, a0, 3
472
+ ; RV32I-NEXT: add a0, a0, a1
473
+ ; RV32I-NEXT: ret
472
474
;
473
475
; RV32IM-LABEL: muli32_p10:
474
476
; RV32IM: # %bb.0:
475
- ; RV32IM-NEXT: li a1, 10
476
- ; RV32IM-NEXT: mul a0, a0, a1
477
+ ; RV32IM-NEXT: slli a1, a0, 1
478
+ ; RV32IM-NEXT: slli a0, a0, 3
479
+ ; RV32IM-NEXT: add a0, a0, a1
477
480
; RV32IM-NEXT: ret
478
481
;
479
482
; RV64I-LABEL: muli32_p10:
480
483
; RV64I: # %bb.0:
481
- ; RV64I-NEXT: addi sp, sp, -16
482
- ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
483
- ; RV64I-NEXT: li a1, 10
484
- ; RV64I-NEXT: call __muldi3
485
- ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
486
- ; RV64I-NEXT: addi sp, sp, 16
484
+ ; RV64I-NEXT: slli a1, a0, 1
485
+ ; RV64I-NEXT: slli a0, a0, 3
486
+ ; RV64I-NEXT: add a0, a0, a1
487
487
; RV64I-NEXT: ret
488
488
;
489
489
; RV64IM-LABEL: muli32_p10:
490
490
; RV64IM: # %bb.0:
491
- ; RV64IM-NEXT: li a1, 10
492
- ; RV64IM-NEXT: mulw a0, a0, a1
491
+ ; RV64IM-NEXT: slli a1, a0, 1
492
+ ; RV64IM-NEXT: slli a0, a0, 3
493
+ ; RV64IM-NEXT: addw a0, a0, a1
493
494
; RV64IM-NEXT: ret
494
495
%1 = mul i32 %a , 10
495
496
ret i32 %1
@@ -498,8 +499,10 @@ define i32 @muli32_p10(i32 %a) nounwind {
498
499
define i32 @muli32_p14 (i32 %a ) nounwind {
499
500
; RV32I-LABEL: muli32_p14:
500
501
; RV32I: # %bb.0:
501
- ; RV32I-NEXT: li a1, 14
502
- ; RV32I-NEXT: tail __mulsi3
502
+ ; RV32I-NEXT: slli a1, a0, 1
503
+ ; RV32I-NEXT: slli a0, a0, 4
504
+ ; RV32I-NEXT: sub a0, a0, a1
505
+ ; RV32I-NEXT: ret
503
506
;
504
507
; RV32IM-LABEL: muli32_p14:
505
508
; RV32IM: # %bb.0:
@@ -528,29 +531,30 @@ define i32 @muli32_p14(i32 %a) nounwind {
528
531
define i32 @muli32_p20 (i32 %a ) nounwind {
529
532
; RV32I-LABEL: muli32_p20:
530
533
; RV32I: # %bb.0:
531
- ; RV32I-NEXT: li a1, 20
532
- ; RV32I-NEXT: tail __mulsi3
534
+ ; RV32I-NEXT: slli a1, a0, 2
535
+ ; RV32I-NEXT: slli a0, a0, 4
536
+ ; RV32I-NEXT: add a0, a0, a1
537
+ ; RV32I-NEXT: ret
533
538
;
534
539
; RV32IM-LABEL: muli32_p20:
535
540
; RV32IM: # %bb.0:
536
- ; RV32IM-NEXT: li a1, 20
537
- ; RV32IM-NEXT: mul a0, a0, a1
541
+ ; RV32IM-NEXT: slli a1, a0, 2
542
+ ; RV32IM-NEXT: slli a0, a0, 4
543
+ ; RV32IM-NEXT: add a0, a0, a1
538
544
; RV32IM-NEXT: ret
539
545
;
540
546
; RV64I-LABEL: muli32_p20:
541
547
; RV64I: # %bb.0:
542
- ; RV64I-NEXT: addi sp, sp, -16
543
- ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
544
- ; RV64I-NEXT: li a1, 20
545
- ; RV64I-NEXT: call __muldi3
546
- ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
547
- ; RV64I-NEXT: addi sp, sp, 16
548
+ ; RV64I-NEXT: slli a1, a0, 2
549
+ ; RV64I-NEXT: slli a0, a0, 4
550
+ ; RV64I-NEXT: add a0, a0, a1
548
551
; RV64I-NEXT: ret
549
552
;
550
553
; RV64IM-LABEL: muli32_p20:
551
554
; RV64IM: # %bb.0:
552
- ; RV64IM-NEXT: li a1, 20
553
- ; RV64IM-NEXT: mulw a0, a0, a1
555
+ ; RV64IM-NEXT: slli a1, a0, 2
556
+ ; RV64IM-NEXT: slli a0, a0, 4
557
+ ; RV64IM-NEXT: addw a0, a0, a1
554
558
; RV64IM-NEXT: ret
555
559
%1 = mul i32 %a , 20
556
560
ret i32 %1
@@ -559,8 +563,10 @@ define i32 @muli32_p20(i32 %a) nounwind {
559
563
define i32 @muli32_p28 (i32 %a ) nounwind {
560
564
; RV32I-LABEL: muli32_p28:
561
565
; RV32I: # %bb.0:
562
- ; RV32I-NEXT: li a1, 28
563
- ; RV32I-NEXT: tail __mulsi3
566
+ ; RV32I-NEXT: slli a1, a0, 2
567
+ ; RV32I-NEXT: slli a0, a0, 5
568
+ ; RV32I-NEXT: sub a0, a0, a1
569
+ ; RV32I-NEXT: ret
564
570
;
565
571
; RV32IM-LABEL: muli32_p28:
566
572
; RV32IM: # %bb.0:
@@ -589,8 +595,10 @@ define i32 @muli32_p28(i32 %a) nounwind {
589
595
define i32 @muli32_p30 (i32 %a ) nounwind {
590
596
; RV32I-LABEL: muli32_p30:
591
597
; RV32I: # %bb.0:
592
- ; RV32I-NEXT: li a1, 30
593
- ; RV32I-NEXT: tail __mulsi3
598
+ ; RV32I-NEXT: slli a1, a0, 1
599
+ ; RV32I-NEXT: slli a0, a0, 5
600
+ ; RV32I-NEXT: sub a0, a0, a1
601
+ ; RV32I-NEXT: ret
594
602
;
595
603
; RV32IM-LABEL: muli32_p30:
596
604
; RV32IM: # %bb.0:
@@ -619,8 +627,10 @@ define i32 @muli32_p30(i32 %a) nounwind {
619
627
define i32 @muli32_p56 (i32 %a ) nounwind {
620
628
; RV32I-LABEL: muli32_p56:
621
629
; RV32I: # %bb.0:
622
- ; RV32I-NEXT: li a1, 56
623
- ; RV32I-NEXT: tail __mulsi3
630
+ ; RV32I-NEXT: slli a1, a0, 3
631
+ ; RV32I-NEXT: slli a0, a0, 6
632
+ ; RV32I-NEXT: sub a0, a0, a1
633
+ ; RV32I-NEXT: ret
624
634
;
625
635
; RV32IM-LABEL: muli32_p56:
626
636
; RV32IM: # %bb.0:
@@ -649,8 +659,10 @@ define i32 @muli32_p56(i32 %a) nounwind {
649
659
define i32 @muli32_p60 (i32 %a ) nounwind {
650
660
; RV32I-LABEL: muli32_p60:
651
661
; RV32I: # %bb.0:
652
- ; RV32I-NEXT: li a1, 60
653
- ; RV32I-NEXT: tail __mulsi3
662
+ ; RV32I-NEXT: slli a1, a0, 2
663
+ ; RV32I-NEXT: slli a0, a0, 6
664
+ ; RV32I-NEXT: sub a0, a0, a1
665
+ ; RV32I-NEXT: ret
654
666
;
655
667
; RV32IM-LABEL: muli32_p60:
656
668
; RV32IM: # %bb.0:
@@ -679,8 +691,10 @@ define i32 @muli32_p60(i32 %a) nounwind {
679
691
define i32 @muli32_p62 (i32 %a ) nounwind {
680
692
; RV32I-LABEL: muli32_p62:
681
693
; RV32I: # %bb.0:
682
- ; RV32I-NEXT: li a1, 62
683
- ; RV32I-NEXT: tail __mulsi3
694
+ ; RV32I-NEXT: slli a1, a0, 1
695
+ ; RV32I-NEXT: slli a0, a0, 6
696
+ ; RV32I-NEXT: sub a0, a0, a1
697
+ ; RV32I-NEXT: ret
684
698
;
685
699
; RV32IM-LABEL: muli32_p62:
686
700
; RV32IM: # %bb.0:
@@ -895,8 +909,10 @@ define i64 @muli64_p60(i64 %a) nounwind {
895
909
;
896
910
; RV64I-LABEL: muli64_p60:
897
911
; RV64I: # %bb.0:
898
- ; RV64I-NEXT: li a1, 60
899
- ; RV64I-NEXT: tail __muldi3
912
+ ; RV64I-NEXT: slli a1, a0, 2
913
+ ; RV64I-NEXT: slli a0, a0, 6
914
+ ; RV64I-NEXT: sub a0, a0, a1
915
+ ; RV64I-NEXT: ret
900
916
;
901
917
; RV64IM-LABEL: muli64_p60:
902
918
; RV64IM: # %bb.0:
@@ -923,21 +939,28 @@ define i64 @muli64_p68(i64 %a) nounwind {
923
939
; RV32IM-LABEL: muli64_p68:
924
940
; RV32IM: # %bb.0:
925
941
; RV32IM-NEXT: li a2, 68
926
- ; RV32IM-NEXT: mul a1, a1, a2
927
- ; RV32IM-NEXT: mulhu a3, a0, a2
928
- ; RV32IM-NEXT: add a1, a3, a1
929
- ; RV32IM-NEXT: mul a0, a0, a2
942
+ ; RV32IM-NEXT: slli a3, a1, 2
943
+ ; RV32IM-NEXT: slli a1, a1, 6
944
+ ; RV32IM-NEXT: add a1, a1, a3
945
+ ; RV32IM-NEXT: slli a3, a0, 2
946
+ ; RV32IM-NEXT: mulhu a2, a0, a2
947
+ ; RV32IM-NEXT: slli a0, a0, 6
948
+ ; RV32IM-NEXT: add a1, a2, a1
949
+ ; RV32IM-NEXT: add a0, a0, a3
930
950
; RV32IM-NEXT: ret
931
951
;
932
952
; RV64I-LABEL: muli64_p68:
933
953
; RV64I: # %bb.0:
934
- ; RV64I-NEXT: li a1, 68
935
- ; RV64I-NEXT: tail __muldi3
954
+ ; RV64I-NEXT: slli a1, a0, 2
955
+ ; RV64I-NEXT: slli a0, a0, 6
956
+ ; RV64I-NEXT: add a0, a0, a1
957
+ ; RV64I-NEXT: ret
936
958
;
937
959
; RV64IM-LABEL: muli64_p68:
938
960
; RV64IM: # %bb.0:
939
- ; RV64IM-NEXT: li a1, 68
940
- ; RV64IM-NEXT: mul a0, a0, a1
961
+ ; RV64IM-NEXT: slli a1, a0, 2
962
+ ; RV64IM-NEXT: slli a0, a0, 6
963
+ ; RV64IM-NEXT: add a0, a0, a1
941
964
; RV64IM-NEXT: ret
942
965
%1 = mul i64 %a , 68
943
966
ret i64 %1
@@ -1093,8 +1116,10 @@ define i64 @muli64_m65(i64 %a) nounwind {
1093
1116
define i32 @muli32_p384 (i32 %a ) nounwind {
1094
1117
; RV32I-LABEL: muli32_p384:
1095
1118
; RV32I: # %bb.0:
1096
- ; RV32I-NEXT: li a1, 384
1097
- ; RV32I-NEXT: tail __mulsi3
1119
+ ; RV32I-NEXT: slli a1, a0, 7
1120
+ ; RV32I-NEXT: slli a0, a0, 9
1121
+ ; RV32I-NEXT: sub a0, a0, a1
1122
+ ; RV32I-NEXT: ret
1098
1123
;
1099
1124
; RV32IM-LABEL: muli32_p384:
1100
1125
; RV32IM: # %bb.0:
@@ -1123,8 +1148,10 @@ define i32 @muli32_p384(i32 %a) nounwind {
1123
1148
define i32 @muli32_p12288 (i32 %a ) nounwind {
1124
1149
; RV32I-LABEL: muli32_p12288:
1125
1150
; RV32I: # %bb.0:
1126
- ; RV32I-NEXT: lui a1, 3
1127
- ; RV32I-NEXT: tail __mulsi3
1151
+ ; RV32I-NEXT: slli a1, a0, 12
1152
+ ; RV32I-NEXT: slli a0, a0, 14
1153
+ ; RV32I-NEXT: sub a0, a0, a1
1154
+ ; RV32I-NEXT: ret
1128
1155
;
1129
1156
; RV32IM-LABEL: muli32_p12288:
1130
1157
; RV32IM: # %bb.0:
@@ -1300,12 +1327,16 @@ define i64 @muli64_p4352(i64 %a) nounwind {
1300
1327
;
1301
1328
; RV32IM-LABEL: muli64_p4352:
1302
1329
; RV32IM: # %bb.0:
1330
+ ; RV32IM-NEXT: slli a2, a1, 8
1331
+ ; RV32IM-NEXT: slli a1, a1, 12
1332
+ ; RV32IM-NEXT: add a1, a1, a2
1303
1333
; RV32IM-NEXT: li a2, 17
1304
1334
; RV32IM-NEXT: slli a2, a2, 8
1305
- ; RV32IM-NEXT: mul a1, a1, a2
1306
- ; RV32IM-NEXT: mulhu a3, a0, a2
1307
- ; RV32IM-NEXT: add a1, a3, a1
1308
- ; RV32IM-NEXT: mul a0, a0, a2
1335
+ ; RV32IM-NEXT: mulhu a2, a0, a2
1336
+ ; RV32IM-NEXT: add a1, a2, a1
1337
+ ; RV32IM-NEXT: slli a2, a0, 8
1338
+ ; RV32IM-NEXT: slli a0, a0, 12
1339
+ ; RV32IM-NEXT: add a0, a0, a2
1309
1340
; RV32IM-NEXT: ret
1310
1341
;
1311
1342
; RV64I-LABEL: muli64_p4352:
@@ -2032,12 +2063,16 @@ define i64 @muland_demand(i64 %x) nounwind {
2032
2063
; RV64I-NEXT: li a1, -29
2033
2064
; RV64I-NEXT: srli a1, a1, 2
2034
2065
; RV64I-NEXT: and a0, a0, a1
2035
- ; RV64I-NEXT: li a1, 12
2036
- ; RV64I-NEXT: tail __muldi3
2066
+ ; RV64I-NEXT: slli a1, a0, 2
2067
+ ; RV64I-NEXT: slli a0, a0, 4
2068
+ ; RV64I-NEXT: sub a0, a0, a1
2069
+ ; RV64I-NEXT: ret
2037
2070
;
2038
2071
; RV64IM-LABEL: muland_demand:
2039
2072
; RV64IM: # %bb.0:
2040
- ; RV64IM-NEXT: andi a0, a0, -8
2073
+ ; RV64IM-NEXT: li a1, -29
2074
+ ; RV64IM-NEXT: srli a1, a1, 2
2075
+ ; RV64IM-NEXT: and a0, a0, a1
2041
2076
; RV64IM-NEXT: slli a1, a0, 2
2042
2077
; RV64IM-NEXT: slli a0, a0, 4
2043
2078
; RV64IM-NEXT: sub a0, a0, a1
@@ -2068,9 +2103,10 @@ define i64 @mulzext_demand(i32 signext %x) nounwind {
2068
2103
;
2069
2104
; RV64I-LABEL: mulzext_demand:
2070
2105
; RV64I: # %bb.0:
2071
- ; RV64I-NEXT: li a1, 3
2072
- ; RV64I-NEXT: slli a1, a1, 32
2073
- ; RV64I-NEXT: tail __muldi3
2106
+ ; RV64I-NEXT: slli a1, a0, 32
2107
+ ; RV64I-NEXT: slli a0, a0, 34
2108
+ ; RV64I-NEXT: sub a0, a0, a1
2109
+ ; RV64I-NEXT: ret
2074
2110
;
2075
2111
; RV64IM-LABEL: mulzext_demand:
2076
2112
; RV64IM: # %bb.0:
0 commit comments