@@ -650,6 +650,115 @@ define i32 @addshl_5_8(i32 %a, i32 %b) {
650650 ret i32 %e
651651}
652652
653+ define i32 @srli_1_sh2add (ptr %0 , i32 %1 ) {
654+ ; RV32I-LABEL: srli_1_sh2add:
655+ ; RV32I: # %bb.0:
656+ ; RV32I-NEXT: slli a1, a1, 1
657+ ; RV32I-NEXT: andi a1, a1, -4
658+ ; RV32I-NEXT: add a0, a0, a1
659+ ; RV32I-NEXT: lw a0, 0(a0)
660+ ; RV32I-NEXT: ret
661+ ;
662+ ; RV32ZBA-LABEL: srli_1_sh2add:
663+ ; RV32ZBA: # %bb.0:
664+ ; RV32ZBA-NEXT: srli a1, a1, 1
665+ ; RV32ZBA-NEXT: sh2add a0, a1, a0
666+ ; RV32ZBA-NEXT: lw a0, 0(a0)
667+ ; RV32ZBA-NEXT: ret
668+ %3 = lshr i32 %1 , 1
669+ %4 = getelementptr inbounds i32 , ptr %0 , i32 %3
670+ %5 = load i32 , ptr %4 , align 4
671+ ret i32 %5
672+ }
673+
674+ define i64 @srli_2_sh3add (ptr %0 , i32 %1 ) {
675+ ; RV32I-LABEL: srli_2_sh3add:
676+ ; RV32I: # %bb.0:
677+ ; RV32I-NEXT: slli a1, a1, 1
678+ ; RV32I-NEXT: andi a1, a1, -8
679+ ; RV32I-NEXT: add a1, a0, a1
680+ ; RV32I-NEXT: lw a0, 0(a1)
681+ ; RV32I-NEXT: lw a1, 4(a1)
682+ ; RV32I-NEXT: ret
683+ ;
684+ ; RV32ZBA-LABEL: srli_2_sh3add:
685+ ; RV32ZBA: # %bb.0:
686+ ; RV32ZBA-NEXT: srli a1, a1, 2
687+ ; RV32ZBA-NEXT: sh3add a1, a1, a0
688+ ; RV32ZBA-NEXT: lw a0, 0(a1)
689+ ; RV32ZBA-NEXT: lw a1, 4(a1)
690+ ; RV32ZBA-NEXT: ret
691+ %3 = lshr i32 %1 , 2
692+ %4 = getelementptr inbounds i64 , ptr %0 , i32 %3
693+ %5 = load i64 , ptr %4 , align 8
694+ ret i64 %5
695+ }
696+
697+ define signext i16 @srli_2_sh1add (ptr %0 , i32 %1 ) {
698+ ; RV32I-LABEL: srli_2_sh1add:
699+ ; RV32I: # %bb.0:
700+ ; RV32I-NEXT: srli a1, a1, 1
701+ ; RV32I-NEXT: andi a1, a1, -2
702+ ; RV32I-NEXT: add a0, a0, a1
703+ ; RV32I-NEXT: lh a0, 0(a0)
704+ ; RV32I-NEXT: ret
705+ ;
706+ ; RV32ZBA-LABEL: srli_2_sh1add:
707+ ; RV32ZBA: # %bb.0:
708+ ; RV32ZBA-NEXT: srli a1, a1, 2
709+ ; RV32ZBA-NEXT: sh1add a0, a1, a0
710+ ; RV32ZBA-NEXT: lh a0, 0(a0)
711+ ; RV32ZBA-NEXT: ret
712+ %3 = lshr i32 %1 , 2
713+ %4 = getelementptr inbounds i16 , ptr %0 , i32 %3
714+ %5 = load i16 , ptr %4 , align 2
715+ ret i16 %5
716+ }
717+
718+ define i32 @srli_3_sh2add (ptr %0 , i32 %1 ) {
719+ ; RV32I-LABEL: srli_3_sh2add:
720+ ; RV32I: # %bb.0:
721+ ; RV32I-NEXT: srli a1, a1, 1
722+ ; RV32I-NEXT: andi a1, a1, -4
723+ ; RV32I-NEXT: add a0, a0, a1
724+ ; RV32I-NEXT: lw a0, 0(a0)
725+ ; RV32I-NEXT: ret
726+ ;
727+ ; RV32ZBA-LABEL: srli_3_sh2add:
728+ ; RV32ZBA: # %bb.0:
729+ ; RV32ZBA-NEXT: srli a1, a1, 3
730+ ; RV32ZBA-NEXT: sh2add a0, a1, a0
731+ ; RV32ZBA-NEXT: lw a0, 0(a0)
732+ ; RV32ZBA-NEXT: ret
733+ %3 = lshr i32 %1 , 3
734+ %4 = getelementptr inbounds i32 , ptr %0 , i32 %3
735+ %5 = load i32 , ptr %4 , align 4
736+ ret i32 %5
737+ }
738+
739+ define i64 @srli_4_sh3add (ptr %0 , i32 %1 ) {
740+ ; RV32I-LABEL: srli_4_sh3add:
741+ ; RV32I: # %bb.0:
742+ ; RV32I-NEXT: srli a1, a1, 1
743+ ; RV32I-NEXT: andi a1, a1, -8
744+ ; RV32I-NEXT: add a1, a0, a1
745+ ; RV32I-NEXT: lw a0, 0(a1)
746+ ; RV32I-NEXT: lw a1, 4(a1)
747+ ; RV32I-NEXT: ret
748+ ;
749+ ; RV32ZBA-LABEL: srli_4_sh3add:
750+ ; RV32ZBA: # %bb.0:
751+ ; RV32ZBA-NEXT: srli a1, a1, 4
752+ ; RV32ZBA-NEXT: sh3add a1, a1, a0
753+ ; RV32ZBA-NEXT: lw a0, 0(a1)
754+ ; RV32ZBA-NEXT: lw a1, 4(a1)
755+ ; RV32ZBA-NEXT: ret
756+ %3 = lshr i32 %1 , 4
757+ %4 = getelementptr inbounds i64 , ptr %0 , i32 %3
758+ %5 = load i64 , ptr %4 , align 8
759+ ret i64 %5
760+ }
761+
653762define i32 @mul_neg1 (i32 %a ) {
654763; CHECK-LABEL: mul_neg1:
655764; CHECK: # %bb.0:
0 commit comments