@@ -109,6 +109,25 @@ define i64 @addmul6(i64 %a, i64 %b) {
109109 ret i64 %d
110110}
111111
112+ define i64 @disjointormul6 (i64 %a , i64 %b ) {
113+ ; RV64I-LABEL: disjointormul6:
114+ ; RV64I: # %bb.0:
115+ ; RV64I-NEXT: slli a2, a0, 1
116+ ; RV64I-NEXT: slli a0, a0, 3
117+ ; RV64I-NEXT: sub a0, a0, a2
118+ ; RV64I-NEXT: or a0, a0, a1
119+ ; RV64I-NEXT: ret
120+ ;
121+ ; RV64XTHEADBA-LABEL: disjointormul6:
122+ ; RV64XTHEADBA: # %bb.0:
123+ ; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1
124+ ; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1
125+ ; RV64XTHEADBA-NEXT: ret
126+ %c = mul i64 %a , 6
127+ %d = or disjoint i64 %c , %b
128+ ret i64 %d
129+ }
130+
112131define i64 @addmul10 (i64 %a , i64 %b ) {
113132; RV64I-LABEL: addmul10:
114133; RV64I: # %bb.0:
@@ -423,8 +442,8 @@ define i64 @add255mul180(i64 %a) {
423442; RV64XTHEADBA: # %bb.0:
424443; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2
425444; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3
426- ; RV64XTHEADBA-NEXT: li a1, 255
427- ; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2
445+ ; RV64XTHEADBA-NEXT: slli a0, a0, 2
446+ ; RV64XTHEADBA-NEXT: addi a0, a0, 255
428447; RV64XTHEADBA-NEXT: ret
429448 %c = mul i64 %a , 180
430449 %d = add i64 %c , 255
@@ -642,6 +661,39 @@ define i64 @mul288(i64 %a) {
642661 ret i64 %c
643662}
644663
664+ define i64 @sh1add_imm (i64 %0 ) {
665+ ; CHECK-LABEL: sh1add_imm:
666+ ; CHECK: # %bb.0:
667+ ; CHECK-NEXT: slli a0, a0, 1
668+ ; CHECK-NEXT: addi a0, a0, 5
669+ ; CHECK-NEXT: ret
670+ %a = shl i64 %0 , 1
671+ %b = add i64 %a , 5
672+ ret i64 %b
673+ }
674+
675+ define i64 @sh2add_imm (i64 %0 ) {
676+ ; CHECK-LABEL: sh2add_imm:
677+ ; CHECK: # %bb.0:
678+ ; CHECK-NEXT: slli a0, a0, 2
679+ ; CHECK-NEXT: addi a0, a0, -6
680+ ; CHECK-NEXT: ret
681+ %a = shl i64 %0 , 2
682+ %b = add i64 %a , -6
683+ ret i64 %b
684+ }
685+
686+ define i64 @sh3add_imm (i64 %0 ) {
687+ ; CHECK-LABEL: sh3add_imm:
688+ ; CHECK: # %bb.0:
689+ ; CHECK-NEXT: slli a0, a0, 3
690+ ; CHECK-NEXT: addi a0, a0, 7
691+ ; CHECK-NEXT: ret
692+ %a = shl i64 %0 , 3
693+ %b = add i64 %a , 7
694+ ret i64 %b
695+ }
696+
645697define i64 @mul258 (i64 %a ) {
646698; RV64I-LABEL: mul258:
647699; RV64I: # %bb.0:
@@ -983,12 +1035,18 @@ define i64 @add4104(i64 %a) {
9831035}
9841036
9851037define i64 @add4104_2 (i64 %a ) {
986- ; CHECK-LABEL: add4104_2:
987- ; CHECK: # %bb.0:
988- ; CHECK-NEXT: lui a1, 1
989- ; CHECK-NEXT: addiw a1, a1, 8
990- ; CHECK-NEXT: or a0, a0, a1
991- ; CHECK-NEXT: ret
1038+ ; RV64I-LABEL: add4104_2:
1039+ ; RV64I: # %bb.0:
1040+ ; RV64I-NEXT: lui a1, 1
1041+ ; RV64I-NEXT: addiw a1, a1, 8
1042+ ; RV64I-NEXT: or a0, a0, a1
1043+ ; RV64I-NEXT: ret
1044+ ;
1045+ ; RV64XTHEADBA-LABEL: add4104_2:
1046+ ; RV64XTHEADBA: # %bb.0:
1047+ ; RV64XTHEADBA-NEXT: li a1, 1026
1048+ ; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2
1049+ ; RV64XTHEADBA-NEXT: ret
9921050 %c = or disjoint i64 %a , 4104
9931051 ret i64 %c
9941052}
0 commit comments