@@ -484,3 +484,298 @@ 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: addi a4, a2, -64
624+ ; RV64I-NEXT: srl a3, a1, a2
625+ ; RV64I-NEXT: bltz a4, .LBB14_2
626+ ; RV64I-NEXT: # %bb.1:
627+ ; RV64I-NEXT: mv a0, a3
628+ ; RV64I-NEXT: j .LBB14_3
629+ ; RV64I-NEXT: .LBB14_2:
630+ ; RV64I-NEXT: srl a0, a0, a2
631+ ; RV64I-NEXT: not a2, a2
632+ ; RV64I-NEXT: slli a1, a1, 1
633+ ; RV64I-NEXT: sll a1, a1, a2
634+ ; RV64I-NEXT: or a0, a0, a1
635+ ; RV64I-NEXT: .LBB14_3:
636+ ; RV64I-NEXT: srai a1, a4, 63
637+ ; RV64I-NEXT: and a1, a1, a3
638+ ; RV64I-NEXT: ret
639+ %zext = zext nneg i32 %b to i128
640+ %1 = lshr i128 %a , %zext
641+ ret i128 %1
642+ }
643+
644+ define i128 @ashr128_shamt32 (i128 %a , i32 signext %b ) nounwind {
645+ ; RV32I-LABEL: ashr128_shamt32:
646+ ; RV32I: # %bb.0:
647+ ; RV32I-NEXT: addi sp, sp, -32
648+ ; RV32I-NEXT: lw a3, 0(a1)
649+ ; RV32I-NEXT: lw a4, 4(a1)
650+ ; RV32I-NEXT: lw a5, 8(a1)
651+ ; RV32I-NEXT: lw a1, 12(a1)
652+ ; RV32I-NEXT: srli a6, a2, 3
653+ ; RV32I-NEXT: mv a7, sp
654+ ; RV32I-NEXT: andi t0, a2, 31
655+ ; RV32I-NEXT: andi a6, a6, 12
656+ ; RV32I-NEXT: xori t0, t0, 31
657+ ; RV32I-NEXT: add a6, a7, a6
658+ ; RV32I-NEXT: sw a3, 0(sp)
659+ ; RV32I-NEXT: sw a4, 4(sp)
660+ ; RV32I-NEXT: sw a5, 8(sp)
661+ ; RV32I-NEXT: sw a1, 12(sp)
662+ ; RV32I-NEXT: srai a1, a1, 31
663+ ; RV32I-NEXT: sw a1, 16(sp)
664+ ; RV32I-NEXT: sw a1, 20(sp)
665+ ; RV32I-NEXT: sw a1, 24(sp)
666+ ; RV32I-NEXT: sw a1, 28(sp)
667+ ; RV32I-NEXT: lw a1, 0(a6)
668+ ; RV32I-NEXT: lw a3, 4(a6)
669+ ; RV32I-NEXT: lw a4, 8(a6)
670+ ; RV32I-NEXT: lw a5, 12(a6)
671+ ; RV32I-NEXT: srl a1, a1, a2
672+ ; RV32I-NEXT: slli a6, a3, 1
673+ ; RV32I-NEXT: srl a3, a3, a2
674+ ; RV32I-NEXT: slli a7, a4, 1
675+ ; RV32I-NEXT: srl a4, a4, a2
676+ ; RV32I-NEXT: sra a2, a5, a2
677+ ; RV32I-NEXT: slli a5, a5, 1
678+ ; RV32I-NEXT: sll a6, a6, t0
679+ ; RV32I-NEXT: sll a7, a7, t0
680+ ; RV32I-NEXT: sll a5, a5, t0
681+ ; RV32I-NEXT: or a1, a1, a6
682+ ; RV32I-NEXT: or a3, a3, a7
683+ ; RV32I-NEXT: or a4, a4, a5
684+ ; RV32I-NEXT: sw a1, 0(a0)
685+ ; RV32I-NEXT: sw a3, 4(a0)
686+ ; RV32I-NEXT: sw a4, 8(a0)
687+ ; RV32I-NEXT: sw a2, 12(a0)
688+ ; RV32I-NEXT: addi sp, sp, 32
689+ ; RV32I-NEXT: ret
690+ ;
691+ ; RV64I-LABEL: ashr128_shamt32:
692+ ; RV64I: # %bb.0:
693+ ; RV64I-NEXT: mv a3, a1
694+ ; RV64I-NEXT: addi a4, a2, -64
695+ ; RV64I-NEXT: sra a1, a1, a2
696+ ; RV64I-NEXT: bltz a4, .LBB15_2
697+ ; RV64I-NEXT: # %bb.1:
698+ ; RV64I-NEXT: srai a3, a3, 63
699+ ; RV64I-NEXT: mv a0, a1
700+ ; RV64I-NEXT: mv a1, a3
701+ ; RV64I-NEXT: ret
702+ ; RV64I-NEXT: .LBB15_2:
703+ ; RV64I-NEXT: srl a0, a0, a2
704+ ; RV64I-NEXT: not a2, a2
705+ ; RV64I-NEXT: slli a3, a3, 1
706+ ; RV64I-NEXT: sll a2, a3, a2
707+ ; RV64I-NEXT: or a0, a0, a2
708+ ; RV64I-NEXT: ret
709+ %zext = zext nneg i32 %b to i128
710+ %1 = ashr i128 %a , %zext
711+ ret i128 %1
712+ }
713+
714+ define i128 @shl128_shamt32 (i128 %a , i32 signext %b ) nounwind {
715+ ; RV32I-LABEL: shl128_shamt32:
716+ ; RV32I: # %bb.0:
717+ ; RV32I-NEXT: addi sp, sp, -32
718+ ; RV32I-NEXT: lw a3, 0(a1)
719+ ; RV32I-NEXT: lw a4, 4(a1)
720+ ; RV32I-NEXT: lw a5, 8(a1)
721+ ; RV32I-NEXT: lw a1, 12(a1)
722+ ; RV32I-NEXT: sw zero, 0(sp)
723+ ; RV32I-NEXT: sw zero, 4(sp)
724+ ; RV32I-NEXT: sw zero, 8(sp)
725+ ; RV32I-NEXT: sw zero, 12(sp)
726+ ; RV32I-NEXT: srli a6, a2, 3
727+ ; RV32I-NEXT: addi a7, sp, 16
728+ ; RV32I-NEXT: andi t0, a2, 31
729+ ; RV32I-NEXT: andi a6, a6, 12
730+ ; RV32I-NEXT: sub a6, a7, a6
731+ ; RV32I-NEXT: sw a3, 16(sp)
732+ ; RV32I-NEXT: sw a4, 20(sp)
733+ ; RV32I-NEXT: sw a5, 24(sp)
734+ ; RV32I-NEXT: sw a1, 28(sp)
735+ ; RV32I-NEXT: lw a1, 0(a6)
736+ ; RV32I-NEXT: lw a3, 4(a6)
737+ ; RV32I-NEXT: lw a4, 8(a6)
738+ ; RV32I-NEXT: lw a5, 12(a6)
739+ ; RV32I-NEXT: xori a6, t0, 31
740+ ; RV32I-NEXT: sll a7, a3, a2
741+ ; RV32I-NEXT: srli t0, a1, 1
742+ ; RV32I-NEXT: sll a5, a5, a2
743+ ; RV32I-NEXT: sll a1, a1, a2
744+ ; RV32I-NEXT: sll a2, a4, a2
745+ ; RV32I-NEXT: srli a3, a3, 1
746+ ; RV32I-NEXT: srli a4, a4, 1
747+ ; RV32I-NEXT: srl t0, t0, a6
748+ ; RV32I-NEXT: srl a3, a3, a6
749+ ; RV32I-NEXT: srl a4, a4, a6
750+ ; RV32I-NEXT: or a6, a7, t0
751+ ; RV32I-NEXT: or a2, a2, a3
752+ ; RV32I-NEXT: or a4, a5, a4
753+ ; RV32I-NEXT: sw a1, 0(a0)
754+ ; RV32I-NEXT: sw a6, 4(a0)
755+ ; RV32I-NEXT: sw a2, 8(a0)
756+ ; RV32I-NEXT: sw a4, 12(a0)
757+ ; RV32I-NEXT: addi sp, sp, 32
758+ ; RV32I-NEXT: ret
759+ ;
760+ ; RV64I-LABEL: shl128_shamt32:
761+ ; RV64I: # %bb.0:
762+ ; RV64I-NEXT: addi a4, a2, -64
763+ ; RV64I-NEXT: sll a3, a0, a2
764+ ; RV64I-NEXT: bltz a4, .LBB16_2
765+ ; RV64I-NEXT: # %bb.1:
766+ ; RV64I-NEXT: mv a1, a3
767+ ; RV64I-NEXT: j .LBB16_3
768+ ; RV64I-NEXT: .LBB16_2:
769+ ; RV64I-NEXT: sll a1, a1, a2
770+ ; RV64I-NEXT: not a2, a2
771+ ; RV64I-NEXT: srli a0, a0, 1
772+ ; RV64I-NEXT: srl a0, a0, a2
773+ ; RV64I-NEXT: or a1, a1, a0
774+ ; RV64I-NEXT: .LBB16_3:
775+ ; RV64I-NEXT: srai a0, a4, 63
776+ ; RV64I-NEXT: and a0, a0, a3
777+ ; RV64I-NEXT: ret
778+ %zext = zext nneg i32 %b to i128
779+ %1 = shl i128 %a , %zext
780+ ret i128 %1
781+ }
0 commit comments