@@ -760,10 +760,28 @@ bool LoongArchInstrInfo::canFoldIntoAddrMode(const MachineInstr &MemI,
760760 Register Reg,
761761 const MachineInstr &AddrI,
762762 ExtAddrMode &AM) const {
763- unsigned OffsetWidth = 0 ;
763+ enum MemIOffsetType {
764+ Imm14Shift2,
765+ Imm12,
766+ Imm11Shift1,
767+ Imm10Shift2,
768+ Imm9Shift3,
769+ Imm8,
770+ Imm8Shift1,
771+ Imm8Shift2,
772+ Imm8Shift3
773+ };
774+
775+ MemIOffsetType OT;
764776 switch (MemI.getOpcode ()) {
765777 default :
766778 return false ;
779+ case LoongArch::LDPTR_W:
780+ case LoongArch::LDPTR_D:
781+ case LoongArch::STPTR_W:
782+ case LoongArch::STPTR_D:
783+ OT = Imm14Shift2;
784+ break ;
767785 case LoongArch::LD_B:
768786 case LoongArch::LD_H:
769787 case LoongArch::LD_W:
@@ -779,13 +797,41 @@ bool LoongArchInstrInfo::canFoldIntoAddrMode(const MachineInstr &MemI,
779797 case LoongArch::FLD_D:
780798 case LoongArch::FST_S:
781799 case LoongArch::FST_D:
782- OffsetWidth = 12 ;
800+ case LoongArch::VLD:
801+ case LoongArch::VST:
802+ case LoongArch::XVLD:
803+ case LoongArch::XVST:
804+ case LoongArch::VLDREPL_B:
805+ case LoongArch::XVLDREPL_B:
806+ OT = Imm12;
783807 break ;
784- case LoongArch::LDPTR_W:
785- case LoongArch::LDPTR_D:
786- case LoongArch::STPTR_W:
787- case LoongArch::STPTR_D:
788- OffsetWidth = 14 ;
808+ case LoongArch::VLDREPL_H:
809+ case LoongArch::XVLDREPL_H:
810+ OT = Imm11Shift1;
811+ break ;
812+ case LoongArch::VLDREPL_W:
813+ case LoongArch::XVLDREPL_W:
814+ OT = Imm10Shift2;
815+ break ;
816+ case LoongArch::VLDREPL_D:
817+ case LoongArch::XVLDREPL_D:
818+ OT = Imm9Shift3;
819+ break ;
820+ case LoongArch::VSTELM_B:
821+ case LoongArch::XVSTELM_B:
822+ OT = Imm8;
823+ break ;
824+ case LoongArch::VSTELM_H:
825+ case LoongArch::XVSTELM_H:
826+ OT = Imm8Shift1;
827+ break ;
828+ case LoongArch::VSTELM_W:
829+ case LoongArch::XVSTELM_W:
830+ OT = Imm8Shift2;
831+ break ;
832+ case LoongArch::VSTELM_D:
833+ case LoongArch::XVSTELM_D:
834+ OT = Imm8Shift3;
789835 break ;
790836 }
791837
@@ -803,8 +849,15 @@ bool LoongArchInstrInfo::canFoldIntoAddrMode(const MachineInstr &MemI,
803849 if (!STI.is64Bit ())
804850 NewOffset = SignExtend64<32 >(NewOffset);
805851
806- if (!(OffsetWidth == 12 && isInt<12 >(NewOffset)) &&
807- !(OffsetWidth == 14 && isShiftedInt<14 , 2 >(NewOffset) && STI.hasUAL ()))
852+ if (!(OT == Imm14Shift2 && isShiftedInt<14 , 2 >(NewOffset) && STI.hasUAL ()) &&
853+ !(OT == Imm12 && isInt<12 >(NewOffset)) &&
854+ !(OT == Imm11Shift1 && isShiftedInt<11 , 1 >(NewOffset)) &&
855+ !(OT == Imm10Shift2 && isShiftedInt<10 , 2 >(NewOffset)) &&
856+ !(OT == Imm9Shift3 && isShiftedInt<9 , 3 >(NewOffset)) &&
857+ !(OT == Imm8 && isInt<8 >(NewOffset)) &&
858+ !(OT == Imm8Shift1 && isShiftedInt<8 , 1 >(NewOffset)) &&
859+ !(OT == Imm8Shift2 && isShiftedInt<8 , 2 >(NewOffset)) &&
860+ !(OT == Imm8Shift3 && isShiftedInt<8 , 3 >(NewOffset)))
808861 return false ;
809862
810863 AM.BaseReg = AddrI.getOperand (1 ).getReg ();
0 commit comments