@@ -467,29 +467,30 @@ define i32 @mulhu_constant(i32 %a) nounwind {
467467define i32 @muli32_p10 (i32 %a ) nounwind {
468468; RV32I-LABEL: muli32_p10:
469469; 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
472474;
473475; RV32IM-LABEL: muli32_p10:
474476; 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
477480; RV32IM-NEXT: ret
478481;
479482; RV64I-LABEL: muli32_p10:
480483; 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
487487; RV64I-NEXT: ret
488488;
489489; RV64IM-LABEL: muli32_p10:
490490; 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
493494; RV64IM-NEXT: ret
494495 %1 = mul i32 %a , 10
495496 ret i32 %1
@@ -498,8 +499,10 @@ define i32 @muli32_p10(i32 %a) nounwind {
498499define i32 @muli32_p14 (i32 %a ) nounwind {
499500; RV32I-LABEL: muli32_p14:
500501; 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
503506;
504507; RV32IM-LABEL: muli32_p14:
505508; RV32IM: # %bb.0:
@@ -528,29 +531,30 @@ define i32 @muli32_p14(i32 %a) nounwind {
528531define i32 @muli32_p20 (i32 %a ) nounwind {
529532; RV32I-LABEL: muli32_p20:
530533; 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
533538;
534539; RV32IM-LABEL: muli32_p20:
535540; 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
538544; RV32IM-NEXT: ret
539545;
540546; RV64I-LABEL: muli32_p20:
541547; 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
548551; RV64I-NEXT: ret
549552;
550553; RV64IM-LABEL: muli32_p20:
551554; 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
554558; RV64IM-NEXT: ret
555559 %1 = mul i32 %a , 20
556560 ret i32 %1
@@ -559,8 +563,10 @@ define i32 @muli32_p20(i32 %a) nounwind {
559563define i32 @muli32_p28 (i32 %a ) nounwind {
560564; RV32I-LABEL: muli32_p28:
561565; 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
564570;
565571; RV32IM-LABEL: muli32_p28:
566572; RV32IM: # %bb.0:
@@ -589,8 +595,10 @@ define i32 @muli32_p28(i32 %a) nounwind {
589595define i32 @muli32_p30 (i32 %a ) nounwind {
590596; RV32I-LABEL: muli32_p30:
591597; 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
594602;
595603; RV32IM-LABEL: muli32_p30:
596604; RV32IM: # %bb.0:
@@ -619,8 +627,10 @@ define i32 @muli32_p30(i32 %a) nounwind {
619627define i32 @muli32_p56 (i32 %a ) nounwind {
620628; RV32I-LABEL: muli32_p56:
621629; 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
624634;
625635; RV32IM-LABEL: muli32_p56:
626636; RV32IM: # %bb.0:
@@ -649,8 +659,10 @@ define i32 @muli32_p56(i32 %a) nounwind {
649659define i32 @muli32_p60 (i32 %a ) nounwind {
650660; RV32I-LABEL: muli32_p60:
651661; 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
654666;
655667; RV32IM-LABEL: muli32_p60:
656668; RV32IM: # %bb.0:
@@ -679,8 +691,10 @@ define i32 @muli32_p60(i32 %a) nounwind {
679691define i32 @muli32_p62 (i32 %a ) nounwind {
680692; RV32I-LABEL: muli32_p62:
681693; 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
684698;
685699; RV32IM-LABEL: muli32_p62:
686700; RV32IM: # %bb.0:
@@ -895,8 +909,10 @@ define i64 @muli64_p60(i64 %a) nounwind {
895909;
896910; RV64I-LABEL: muli64_p60:
897911; 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
900916;
901917; RV64IM-LABEL: muli64_p60:
902918; RV64IM: # %bb.0:
@@ -923,21 +939,28 @@ define i64 @muli64_p68(i64 %a) nounwind {
923939; RV32IM-LABEL: muli64_p68:
924940; RV32IM: # %bb.0:
925941; 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
930950; RV32IM-NEXT: ret
931951;
932952; RV64I-LABEL: muli64_p68:
933953; 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
936958;
937959; RV64IM-LABEL: muli64_p68:
938960; 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
941964; RV64IM-NEXT: ret
942965 %1 = mul i64 %a , 68
943966 ret i64 %1
@@ -1093,8 +1116,10 @@ define i64 @muli64_m65(i64 %a) nounwind {
10931116define i32 @muli32_p384 (i32 %a ) nounwind {
10941117; RV32I-LABEL: muli32_p384:
10951118; 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
10981123;
10991124; RV32IM-LABEL: muli32_p384:
11001125; RV32IM: # %bb.0:
@@ -1123,8 +1148,10 @@ define i32 @muli32_p384(i32 %a) nounwind {
11231148define i32 @muli32_p12288 (i32 %a ) nounwind {
11241149; RV32I-LABEL: muli32_p12288:
11251150; 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
11281155;
11291156; RV32IM-LABEL: muli32_p12288:
11301157; RV32IM: # %bb.0:
@@ -1300,12 +1327,16 @@ define i64 @muli64_p4352(i64 %a) nounwind {
13001327;
13011328; RV32IM-LABEL: muli64_p4352:
13021329; RV32IM: # %bb.0:
1330+ ; RV32IM-NEXT: slli a2, a1, 8
1331+ ; RV32IM-NEXT: slli a1, a1, 12
1332+ ; RV32IM-NEXT: add a1, a1, a2
13031333; RV32IM-NEXT: li a2, 17
13041334; 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
13091340; RV32IM-NEXT: ret
13101341;
13111342; RV64I-LABEL: muli64_p4352:
@@ -2032,12 +2063,16 @@ define i64 @muland_demand(i64 %x) nounwind {
20322063; RV64I-NEXT: li a1, -29
20332064; RV64I-NEXT: srli a1, a1, 2
20342065; 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
20372070;
20382071; RV64IM-LABEL: muland_demand:
20392072; 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
20412076; RV64IM-NEXT: slli a1, a0, 2
20422077; RV64IM-NEXT: slli a0, a0, 4
20432078; RV64IM-NEXT: sub a0, a0, a1
@@ -2068,9 +2103,10 @@ define i64 @mulzext_demand(i32 signext %x) nounwind {
20682103;
20692104; RV64I-LABEL: mulzext_demand:
20702105; 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
20742110;
20752111; RV64IM-LABEL: mulzext_demand:
20762112; RV64IM: # %bb.0:
0 commit comments