@@ -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