@@ -5016,3 +5016,82 @@ define ptr @shl_add_knownbits(ptr %p, i64 %i) {
50165016 %r = getelementptr i8 , ptr %p , i64 %shr
50175017 ret ptr %r
50185018}
5019+
5020+ define i64 @exactashr1mul6 (i64 %a ) {
5021+ ; RV64I-LABEL: exactashr1mul6:
5022+ ; RV64I: # %bb.0:
5023+ ; RV64I-NEXT: slli a1, a0, 1
5024+ ; RV64I-NEXT: add a0, a1, a0
5025+ ; RV64I-NEXT: ret
5026+ ;
5027+ ; RV64ZBA-LABEL: exactashr1mul6:
5028+ ; RV64ZBA: # %bb.0:
5029+ ; RV64ZBA-NEXT: srli a0, a0, 1
5030+ ; RV64ZBA-NEXT: sh1add a0, a0, a0
5031+ ; RV64ZBA-NEXT: slli a0, a0, 1
5032+ ; RV64ZBA-NEXT: ret
5033+ ;
5034+ ; RV64XANDESPERF-LABEL: exactashr1mul6:
5035+ ; RV64XANDESPERF: # %bb.0:
5036+ ; RV64XANDESPERF-NEXT: srli a0, a0, 1
5037+ ; RV64XANDESPERF-NEXT: nds.lea.h a0, a0, a0
5038+ ; RV64XANDESPERF-NEXT: slli a0, a0, 1
5039+ ; RV64XANDESPERF-NEXT: ret
5040+ %c = ashr exact i64 %a , 1
5041+ %d = mul i64 %c , 6
5042+ ret i64 %d
5043+ }
5044+
5045+ define i64 @exactlshr3mul22 (i64 %a ) {
5046+ ; RV64I-LABEL: exactlshr3mul22:
5047+ ; RV64I: # %bb.0:
5048+ ; RV64I-NEXT: srli a0, a0, 3
5049+ ; RV64I-NEXT: li a1, 22
5050+ ; RV64I-NEXT: mul a0, a0, a1
5051+ ; RV64I-NEXT: ret
5052+ ;
5053+ ; RV64ZBA-LABEL: exactlshr3mul22:
5054+ ; RV64ZBA: # %bb.0:
5055+ ; RV64ZBA-NEXT: srli a0, a0, 3
5056+ ; RV64ZBA-NEXT: sh2add a1, a0, a0
5057+ ; RV64ZBA-NEXT: sh1add a0, a1, a0
5058+ ; RV64ZBA-NEXT: slli a0, a0, 1
5059+ ; RV64ZBA-NEXT: ret
5060+ ;
5061+ ; RV64XANDESPERF-LABEL: exactlshr3mul22:
5062+ ; RV64XANDESPERF: # %bb.0:
5063+ ; RV64XANDESPERF-NEXT: srli a0, a0, 3
5064+ ; RV64XANDESPERF-NEXT: nds.lea.w a1, a0, a0
5065+ ; RV64XANDESPERF-NEXT: nds.lea.h a0, a0, a1
5066+ ; RV64XANDESPERF-NEXT: slli a0, a0, 1
5067+ ; RV64XANDESPERF-NEXT: ret
5068+ %c = lshr exact i64 %a , 3
5069+ %d = mul i64 %c , 22
5070+ ret i64 %d
5071+ }
5072+
5073+ define i64 @exactashr1mul36 (i64 %a ) {
5074+ ; RV64I-LABEL: exactashr1mul36:
5075+ ; RV64I: # %bb.0:
5076+ ; RV64I-NEXT: slli a1, a0, 1
5077+ ; RV64I-NEXT: slli a0, a0, 4
5078+ ; RV64I-NEXT: add a0, a0, a1
5079+ ; RV64I-NEXT: ret
5080+ ;
5081+ ; RV64ZBA-LABEL: exactashr1mul36:
5082+ ; RV64ZBA: # %bb.0:
5083+ ; RV64ZBA-NEXT: srli a0, a0, 1
5084+ ; RV64ZBA-NEXT: sh3add a0, a0, a0
5085+ ; RV64ZBA-NEXT: slli a0, a0, 2
5086+ ; RV64ZBA-NEXT: ret
5087+ ;
5088+ ; RV64XANDESPERF-LABEL: exactashr1mul36:
5089+ ; RV64XANDESPERF: # %bb.0:
5090+ ; RV64XANDESPERF-NEXT: srli a0, a0, 1
5091+ ; RV64XANDESPERF-NEXT: nds.lea.d a0, a0, a0
5092+ ; RV64XANDESPERF-NEXT: slli a0, a0, 2
5093+ ; RV64XANDESPERF-NEXT: ret
5094+ %c = ashr exact i64 %a , 1
5095+ %d = mul i64 %c , 36
5096+ ret i64 %d
5097+ }
0 commit comments