Skip to content

Commit a0ce7e6

Browse files
committed
support vectors
1 parent 87e8c31 commit a0ce7e6

File tree

1 file changed

+62
-9
lines changed

1 file changed

+62
-9
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)