@@ -484,3 +484,302 @@ define i128 @fshr128_minsize(i128 %a, i128 %b) minsize nounwind {
484484 %res = tail call i128 @llvm.fshr.i128 (i128 %a , i128 %a , i128 %b )
485485 ret i128 %res
486486}
487+
488+ define i64 @lshr64_shamt32 (i64 %a , i32 signext %b ) nounwind {
489+ ; RV32I-LABEL: lshr64_shamt32:
490+ ; RV32I: # %bb.0:
491+ ; RV32I-NEXT: addi a4, a2, -32
492+ ; RV32I-NEXT: srl a3, a1, a2
493+ ; RV32I-NEXT: bltz a4, .LBB11_2
494+ ; RV32I-NEXT: # %bb.1:
495+ ; RV32I-NEXT: mv a0, a3
496+ ; RV32I-NEXT: j .LBB11_3
497+ ; RV32I-NEXT: .LBB11_2:
498+ ; RV32I-NEXT: srl a0, a0, a2
499+ ; RV32I-NEXT: not a2, a2
500+ ; RV32I-NEXT: slli a1, a1, 1
501+ ; RV32I-NEXT: sll a1, a1, a2
502+ ; RV32I-NEXT: or a0, a0, a1
503+ ; RV32I-NEXT: .LBB11_3:
504+ ; RV32I-NEXT: srai a1, a4, 31
505+ ; RV32I-NEXT: and a1, a1, a3
506+ ; RV32I-NEXT: ret
507+ ;
508+ ; RV64I-LABEL: lshr64_shamt32:
509+ ; RV64I: # %bb.0:
510+ ; RV64I-NEXT: srl a0, a0, a1
511+ ; RV64I-NEXT: ret
512+ %zext = zext nneg i32 %b to i64
513+ %1 = lshr i64 %a , %zext
514+ ret i64 %1
515+ }
516+
517+ define i64 @ashr64_shamt32 (i64 %a , i32 signext %b ) nounwind {
518+ ; RV32I-LABEL: ashr64_shamt32:
519+ ; RV32I: # %bb.0:
520+ ; RV32I-NEXT: mv a3, a1
521+ ; RV32I-NEXT: addi a4, a2, -32
522+ ; RV32I-NEXT: sra a1, a1, a2
523+ ; RV32I-NEXT: bltz a4, .LBB12_2
524+ ; RV32I-NEXT: # %bb.1:
525+ ; RV32I-NEXT: srai a3, a3, 31
526+ ; RV32I-NEXT: mv a0, a1
527+ ; RV32I-NEXT: mv a1, a3
528+ ; RV32I-NEXT: ret
529+ ; RV32I-NEXT: .LBB12_2:
530+ ; RV32I-NEXT: srl a0, a0, a2
531+ ; RV32I-NEXT: not a2, a2
532+ ; RV32I-NEXT: slli a3, a3, 1
533+ ; RV32I-NEXT: sll a2, a3, a2
534+ ; RV32I-NEXT: or a0, a0, a2
535+ ; RV32I-NEXT: ret
536+ ;
537+ ; RV64I-LABEL: ashr64_shamt32:
538+ ; RV64I: # %bb.0:
539+ ; RV64I-NEXT: sra a0, a0, a1
540+ ; RV64I-NEXT: ret
541+ %zext = zext nneg i32 %b to i64
542+ %1 = ashr i64 %a , %zext
543+ ret i64 %1
544+ }
545+
546+ define i64 @shl64_shamt32 (i64 %a , i32 signext %b ) nounwind {
547+ ; RV32I-LABEL: shl64_shamt32:
548+ ; RV32I: # %bb.0:
549+ ; RV32I-NEXT: addi a4, a2, -32
550+ ; RV32I-NEXT: sll a3, a0, a2
551+ ; RV32I-NEXT: bltz a4, .LBB13_2
552+ ; RV32I-NEXT: # %bb.1:
553+ ; RV32I-NEXT: mv a1, a3
554+ ; RV32I-NEXT: j .LBB13_3
555+ ; RV32I-NEXT: .LBB13_2:
556+ ; RV32I-NEXT: sll a1, a1, a2
557+ ; RV32I-NEXT: not a2, a2
558+ ; RV32I-NEXT: srli a0, a0, 1
559+ ; RV32I-NEXT: srl a0, a0, a2
560+ ; RV32I-NEXT: or a1, a1, a0
561+ ; RV32I-NEXT: .LBB13_3:
562+ ; RV32I-NEXT: srai a0, a4, 31
563+ ; RV32I-NEXT: and a0, a0, a3
564+ ; RV32I-NEXT: ret
565+ ;
566+ ; RV64I-LABEL: shl64_shamt32:
567+ ; RV64I: # %bb.0:
568+ ; RV64I-NEXT: sll a0, a0, a1
569+ ; RV64I-NEXT: ret
570+ %zext = zext nneg i32 %b to i64
571+ %1 = shl i64 %a , %zext
572+ ret i64 %1
573+ }
574+
575+ define i128 @lshr128_shamt32 (i128 %a , i32 signext %b ) nounwind {
576+ ; RV32I-LABEL: lshr128_shamt32:
577+ ; RV32I: # %bb.0:
578+ ; RV32I-NEXT: addi sp, sp, -32
579+ ; RV32I-NEXT: lw a3, 0(a1)
580+ ; RV32I-NEXT: lw a4, 4(a1)
581+ ; RV32I-NEXT: lw a5, 8(a1)
582+ ; RV32I-NEXT: lw a1, 12(a1)
583+ ; RV32I-NEXT: sw zero, 16(sp)
584+ ; RV32I-NEXT: sw zero, 20(sp)
585+ ; RV32I-NEXT: sw zero, 24(sp)
586+ ; RV32I-NEXT: sw zero, 28(sp)
587+ ; RV32I-NEXT: srli a6, a2, 3
588+ ; RV32I-NEXT: mv a7, sp
589+ ; RV32I-NEXT: andi t0, a2, 31
590+ ; RV32I-NEXT: andi a6, a6, 12
591+ ; RV32I-NEXT: xori t0, t0, 31
592+ ; RV32I-NEXT: add a6, a7, a6
593+ ; RV32I-NEXT: sw a3, 0(sp)
594+ ; RV32I-NEXT: sw a4, 4(sp)
595+ ; RV32I-NEXT: sw a5, 8(sp)
596+ ; RV32I-NEXT: sw a1, 12(sp)
597+ ; RV32I-NEXT: lw a1, 0(a6)
598+ ; RV32I-NEXT: lw a3, 4(a6)
599+ ; RV32I-NEXT: lw a4, 8(a6)
600+ ; RV32I-NEXT: lw a5, 12(a6)
601+ ; RV32I-NEXT: srl a1, a1, a2
602+ ; RV32I-NEXT: slli a6, a3, 1
603+ ; RV32I-NEXT: srl a3, a3, a2
604+ ; RV32I-NEXT: slli a7, a4, 1
605+ ; RV32I-NEXT: srl a4, a4, a2
606+ ; RV32I-NEXT: srl a2, a5, a2
607+ ; RV32I-NEXT: slli a5, a5, 1
608+ ; RV32I-NEXT: sll a6, a6, t0
609+ ; RV32I-NEXT: sll a7, a7, t0
610+ ; RV32I-NEXT: sll a5, a5, t0
611+ ; RV32I-NEXT: or a1, a1, a6
612+ ; RV32I-NEXT: or a3, a3, a7
613+ ; RV32I-NEXT: or a4, a4, a5
614+ ; RV32I-NEXT: sw a1, 0(a0)
615+ ; RV32I-NEXT: sw a3, 4(a0)
616+ ; RV32I-NEXT: sw a4, 8(a0)
617+ ; RV32I-NEXT: sw a2, 12(a0)
618+ ; RV32I-NEXT: addi sp, sp, 32
619+ ; RV32I-NEXT: ret
620+ ;
621+ ; RV64I-LABEL: lshr128_shamt32:
622+ ; RV64I: # %bb.0:
623+ ; RV64I-NEXT: slli a4, a2, 32
624+ ; RV64I-NEXT: srli a4, a4, 32
625+ ; RV64I-NEXT: addi a3, a4, -64
626+ ; RV64I-NEXT: bltz a3, .LBB14_2
627+ ; RV64I-NEXT: # %bb.1:
628+ ; RV64I-NEXT: srl a0, a1, a4
629+ ; RV64I-NEXT: j .LBB14_3
630+ ; RV64I-NEXT: .LBB14_2:
631+ ; RV64I-NEXT: srl a0, a0, a2
632+ ; RV64I-NEXT: slli a5, a1, 1
633+ ; RV64I-NEXT: not a4, a4
634+ ; RV64I-NEXT: sll a4, a5, a4
635+ ; RV64I-NEXT: or a0, a0, a4
636+ ; RV64I-NEXT: .LBB14_3:
637+ ; RV64I-NEXT: srl a1, a1, a2
638+ ; RV64I-NEXT: srai a3, a3, 63
639+ ; RV64I-NEXT: and a1, a3, a1
640+ ; RV64I-NEXT: ret
641+ %zext = zext nneg i32 %b to i128
642+ %1 = lshr i128 %a , %zext
643+ ret i128 %1
644+ }
645+
646+ define i128 @ashr128_shamt32 (i128 %a , i32 signext %b ) nounwind {
647+ ; RV32I-LABEL: ashr128_shamt32:
648+ ; RV32I: # %bb.0:
649+ ; RV32I-NEXT: addi sp, sp, -32
650+ ; RV32I-NEXT: lw a3, 0(a1)
651+ ; RV32I-NEXT: lw a4, 4(a1)
652+ ; RV32I-NEXT: lw a5, 8(a1)
653+ ; RV32I-NEXT: lw a1, 12(a1)
654+ ; RV32I-NEXT: srli a6, a2, 3
655+ ; RV32I-NEXT: mv a7, sp
656+ ; RV32I-NEXT: andi t0, a2, 31
657+ ; RV32I-NEXT: andi a6, a6, 12
658+ ; RV32I-NEXT: xori t0, t0, 31
659+ ; RV32I-NEXT: add a6, a7, a6
660+ ; RV32I-NEXT: sw a3, 0(sp)
661+ ; RV32I-NEXT: sw a4, 4(sp)
662+ ; RV32I-NEXT: sw a5, 8(sp)
663+ ; RV32I-NEXT: sw a1, 12(sp)
664+ ; RV32I-NEXT: srai a1, a1, 31
665+ ; RV32I-NEXT: sw a1, 16(sp)
666+ ; RV32I-NEXT: sw a1, 20(sp)
667+ ; RV32I-NEXT: sw a1, 24(sp)
668+ ; RV32I-NEXT: sw a1, 28(sp)
669+ ; RV32I-NEXT: lw a1, 0(a6)
670+ ; RV32I-NEXT: lw a3, 4(a6)
671+ ; RV32I-NEXT: lw a4, 8(a6)
672+ ; RV32I-NEXT: lw a5, 12(a6)
673+ ; RV32I-NEXT: srl a1, a1, a2
674+ ; RV32I-NEXT: slli a6, a3, 1
675+ ; RV32I-NEXT: srl a3, a3, a2
676+ ; RV32I-NEXT: slli a7, a4, 1
677+ ; RV32I-NEXT: srl a4, a4, a2
678+ ; RV32I-NEXT: sra a2, a5, a2
679+ ; RV32I-NEXT: slli a5, a5, 1
680+ ; RV32I-NEXT: sll a6, a6, t0
681+ ; RV32I-NEXT: sll a7, a7, t0
682+ ; RV32I-NEXT: sll a5, a5, t0
683+ ; RV32I-NEXT: or a1, a1, a6
684+ ; RV32I-NEXT: or a3, a3, a7
685+ ; RV32I-NEXT: or a4, a4, a5
686+ ; RV32I-NEXT: sw a1, 0(a0)
687+ ; RV32I-NEXT: sw a3, 4(a0)
688+ ; RV32I-NEXT: sw a4, 8(a0)
689+ ; RV32I-NEXT: sw a2, 12(a0)
690+ ; RV32I-NEXT: addi sp, sp, 32
691+ ; RV32I-NEXT: ret
692+ ;
693+ ; RV64I-LABEL: ashr128_shamt32:
694+ ; RV64I: # %bb.0:
695+ ; RV64I-NEXT: slli a3, a2, 32
696+ ; RV64I-NEXT: srli a3, a3, 32
697+ ; RV64I-NEXT: addi a4, a3, -64
698+ ; RV64I-NEXT: bltz a4, .LBB15_2
699+ ; RV64I-NEXT: # %bb.1:
700+ ; RV64I-NEXT: sra a0, a1, a3
701+ ; RV64I-NEXT: srai a1, a1, 63
702+ ; RV64I-NEXT: ret
703+ ; RV64I-NEXT: .LBB15_2:
704+ ; RV64I-NEXT: srl a0, a0, a2
705+ ; RV64I-NEXT: slli a4, a1, 1
706+ ; RV64I-NEXT: not a3, a3
707+ ; RV64I-NEXT: sll a3, a4, a3
708+ ; RV64I-NEXT: or a0, a0, a3
709+ ; RV64I-NEXT: sra a1, a1, a2
710+ ; RV64I-NEXT: ret
711+ %zext = zext nneg i32 %b to i128
712+ %1 = ashr i128 %a , %zext
713+ ret i128 %1
714+ }
715+
716+ define i128 @shl128_shamt32 (i128 %a , i32 signext %b ) nounwind {
717+ ; RV32I-LABEL: shl128_shamt32:
718+ ; RV32I: # %bb.0:
719+ ; RV32I-NEXT: addi sp, sp, -32
720+ ; RV32I-NEXT: lw a3, 0(a1)
721+ ; RV32I-NEXT: lw a4, 4(a1)
722+ ; RV32I-NEXT: lw a5, 8(a1)
723+ ; RV32I-NEXT: lw a1, 12(a1)
724+ ; RV32I-NEXT: sw zero, 0(sp)
725+ ; RV32I-NEXT: sw zero, 4(sp)
726+ ; RV32I-NEXT: sw zero, 8(sp)
727+ ; RV32I-NEXT: sw zero, 12(sp)
728+ ; RV32I-NEXT: srli a6, a2, 3
729+ ; RV32I-NEXT: addi a7, sp, 16
730+ ; RV32I-NEXT: andi t0, a2, 31
731+ ; RV32I-NEXT: andi a6, a6, 12
732+ ; RV32I-NEXT: sub a6, a7, a6
733+ ; RV32I-NEXT: sw a3, 16(sp)
734+ ; RV32I-NEXT: sw a4, 20(sp)
735+ ; RV32I-NEXT: sw a5, 24(sp)
736+ ; RV32I-NEXT: sw a1, 28(sp)
737+ ; RV32I-NEXT: lw a1, 0(a6)
738+ ; RV32I-NEXT: lw a3, 4(a6)
739+ ; RV32I-NEXT: lw a4, 8(a6)
740+ ; RV32I-NEXT: lw a5, 12(a6)
741+ ; RV32I-NEXT: xori a6, t0, 31
742+ ; RV32I-NEXT: sll a7, a3, a2
743+ ; RV32I-NEXT: srli t0, a1, 1
744+ ; RV32I-NEXT: sll a5, a5, a2
745+ ; RV32I-NEXT: sll a1, a1, a2
746+ ; RV32I-NEXT: sll a2, a4, a2
747+ ; RV32I-NEXT: srli a3, a3, 1
748+ ; RV32I-NEXT: srli a4, a4, 1
749+ ; RV32I-NEXT: srl t0, t0, a6
750+ ; RV32I-NEXT: srl a3, a3, a6
751+ ; RV32I-NEXT: srl a4, a4, a6
752+ ; RV32I-NEXT: or a6, a7, t0
753+ ; RV32I-NEXT: or a2, a2, a3
754+ ; RV32I-NEXT: or a4, a5, a4
755+ ; RV32I-NEXT: sw a1, 0(a0)
756+ ; RV32I-NEXT: sw a6, 4(a0)
757+ ; RV32I-NEXT: sw a2, 8(a0)
758+ ; RV32I-NEXT: sw a4, 12(a0)
759+ ; RV32I-NEXT: addi sp, sp, 32
760+ ; RV32I-NEXT: ret
761+ ;
762+ ; RV64I-LABEL: shl128_shamt32:
763+ ; RV64I: # %bb.0:
764+ ; RV64I-NEXT: slli a4, a2, 32
765+ ; RV64I-NEXT: srli a4, a4, 32
766+ ; RV64I-NEXT: addi a3, a4, -64
767+ ; RV64I-NEXT: bltz a3, .LBB16_2
768+ ; RV64I-NEXT: # %bb.1:
769+ ; RV64I-NEXT: sll a1, a0, a4
770+ ; RV64I-NEXT: j .LBB16_3
771+ ; RV64I-NEXT: .LBB16_2:
772+ ; RV64I-NEXT: sll a1, a1, a2
773+ ; RV64I-NEXT: srli a5, a0, 1
774+ ; RV64I-NEXT: not a4, a4
775+ ; RV64I-NEXT: srl a4, a5, a4
776+ ; RV64I-NEXT: or a1, a1, a4
777+ ; RV64I-NEXT: .LBB16_3:
778+ ; RV64I-NEXT: sll a0, a0, a2
779+ ; RV64I-NEXT: srai a3, a3, 63
780+ ; RV64I-NEXT: and a0, a3, a0
781+ ; RV64I-NEXT: ret
782+ %zext = zext nneg i32 %b to i128
783+ %1 = shl i128 %a , %zext
784+ ret i128 %1
785+ }
0 commit comments