diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -128,11 +128,21 @@ let ParserMethod = "parseZeroOffsetMemOp"; } -def GPRMemZeroOffset : RegisterOperand { +class MemOperand : RegisterOperand{ + let OperandType = "OPERAND_MEMORY"; +} + +def GPRMemZeroOffset : MemOperand { let ParserMatchClass = ZeroOffsetMemOpOperand; let PrintMethod = "printZeroOffsetMemOp"; } +def GPRMem : MemOperand; + +def SPMem : MemOperand; + +def GPRCMem : MemOperand; + class SImmAsmOperand : ImmAsmOperand<"S", width, suffix> { } @@ -496,7 +506,7 @@ let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in { class Load_ri funct3, string opcodestr> - : RVInstI; class HLoad_r funct7, bits<5> funct5, string opcodestr> @@ -512,7 +522,7 @@ let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in { class Store_rri funct3, string opcodestr> : RVInstS; class HStore_rr funct7, string opcodestr> diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -237,25 +237,25 @@ let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in class CStackLoad funct3, string OpcodeStr, RegisterClass cls, DAGOperand opnd> - : RVInst16CI; let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in class CStackStore funct3, string OpcodeStr, RegisterClass cls, DAGOperand opnd> - : RVInst16CSS; let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in class CLoad_ri funct3, string OpcodeStr, RegisterClass cls, DAGOperand opnd> - : RVInst16CL; let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in class CStore_rri funct3, string OpcodeStr, RegisterClass cls, DAGOperand opnd> - : RVInst16CS; let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in @@ -720,31 +720,31 @@ let EmitPriority = 0 in { let Predicates = [HasStdExtCOrZca] in { -def : InstAlias<"c.lw $rd, (${rs1})", (C_LW GPRC:$rd, GPRC:$rs1, 0)>; -def : InstAlias<"c.sw $rs2, (${rs1})", (C_SW GPRC:$rs2, GPRC:$rs1, 0)>; -def : InstAlias<"c.lwsp $rd, (${rs1})", (C_LWSP GPRC:$rd, SP:$rs1, 0)>; -def : InstAlias<"c.swsp $rs2, (${rs1})", (C_SWSP GPRC:$rs2, SP:$rs1, 0)>; +def : InstAlias<"c.lw $rd, (${rs1})", (C_LW GPRC:$rd, GPRCMem:$rs1, 0)>; +def : InstAlias<"c.sw $rs2, (${rs1})", (C_SW GPRC:$rs2, GPRCMem:$rs1, 0)>; +def : InstAlias<"c.lwsp $rd, (${rs1})", (C_LWSP GPRC:$rd, SPMem:$rs1, 0)>; +def : InstAlias<"c.swsp $rs2, (${rs1})", (C_SWSP GPRC:$rs2, SPMem:$rs1, 0)>; } let Predicates = [HasStdExtCOrZca, IsRV64] in { -def : InstAlias<"c.ld $rd, (${rs1})", (C_LD GPRC:$rd, GPRC:$rs1, 0)>; -def : InstAlias<"c.sd $rs2, (${rs1})", (C_SD GPRC:$rs2, GPRC:$rs1, 0)>; -def : InstAlias<"c.ldsp $rd, (${rs1})", (C_LDSP GPRC:$rd, SP:$rs1, 0)>; -def : InstAlias<"c.sdsp $rs2, (${rs1})", (C_SDSP GPRC:$rs2, SP:$rs1, 0)>; +def : InstAlias<"c.ld $rd, (${rs1})", (C_LD GPRC:$rd, GPRCMem:$rs1, 0)>; +def : InstAlias<"c.sd $rs2, (${rs1})", (C_SD GPRC:$rs2, GPRCMem:$rs1, 0)>; +def : InstAlias<"c.ldsp $rd, (${rs1})", (C_LDSP GPRC:$rd, SPMem:$rs1, 0)>; +def : InstAlias<"c.sdsp $rs2, (${rs1})", (C_SDSP GPRC:$rs2, SPMem:$rs1, 0)>; } let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in { -def : InstAlias<"c.flw $rd, (${rs1})", (C_FLW FPR32C:$rd, GPRC:$rs1, 0)>; -def : InstAlias<"c.fsw $rs2, (${rs1})", (C_FSW FPR32C:$rs2, GPRC:$rs1, 0)>; -def : InstAlias<"c.flwsp $rd, (${rs1})", (C_FLWSP FPR32C:$rd, SP:$rs1, 0)>; -def : InstAlias<"c.fswsp $rs2, (${rs1})", (C_FSWSP FPR32C:$rs2, SP:$rs1, 0)>; +def : InstAlias<"c.flw $rd, (${rs1})", (C_FLW FPR32C:$rd, GPRCMem:$rs1, 0)>; +def : InstAlias<"c.fsw $rs2, (${rs1})", (C_FSW FPR32C:$rs2, GPRCMem:$rs1, 0)>; +def : InstAlias<"c.flwsp $rd, (${rs1})", (C_FLWSP FPR32C:$rd, SPMem:$rs1, 0)>; +def : InstAlias<"c.fswsp $rs2, (${rs1})", (C_FSWSP FPR32C:$rs2, SPMem:$rs1, 0)>; } let Predicates = [HasStdExtC, HasStdExtD] in { -def : InstAlias<"c.fld $rd, (${rs1})", (C_FLD FPR64C:$rd, GPRC:$rs1, 0)>; -def : InstAlias<"c.fsd $rs2, (${rs1})", (C_FSD FPR64C:$rs2, GPRC:$rs1, 0)>; -def : InstAlias<"c.fldsp $rd, (${rs1})", (C_FLDSP FPR64C:$rd, SP:$rs1, 0)>; -def : InstAlias<"c.fsdsp $rs2, (${rs1})", (C_FSDSP FPR64C:$rs2, SP:$rs1, 0)>; +def : InstAlias<"c.fld $rd, (${rs1})", (C_FLD FPR64C:$rd, GPRCMem:$rs1, 0)>; +def : InstAlias<"c.fsd $rs2, (${rs1})", (C_FSD FPR64C:$rs2, GPRCMem:$rs1, 0)>; +def : InstAlias<"c.fldsp $rd, (${rs1})", (C_FLDSP FPR64C:$rd, SPMem:$rs1, 0)>; +def : InstAlias<"c.fsdsp $rs2, (${rs1})", (C_FSDSP FPR64C:$rs2, SPMem:$rs1, 0)>; } } // EmitPriority = 0 @@ -762,43 +762,43 @@ } // Predicates = [HasStdExtCOrZca] let Predicates = [HasStdExtC, HasStdExtD] in { -def : CompressPat<(FLD FPR64C:$rd, GPRC:$rs1, uimm8_lsb000:$imm), - (C_FLD FPR64C:$rd, GPRC:$rs1, uimm8_lsb000:$imm)>; +def : CompressPat<(FLD FPR64C:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm), + (C_FLD FPR64C:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm)>; } // Predicates = [HasStdExtC, HasStdExtD] let Predicates = [HasStdExtCOrZca] in { -def : CompressPat<(LW GPRC:$rd, GPRC:$rs1, uimm7_lsb00:$imm), - (C_LW GPRC:$rd, GPRC:$rs1, uimm7_lsb00:$imm)>; +def : CompressPat<(LW GPRC:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm), + (C_LW GPRC:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm)>; } // Predicates = [HasStdExtCOrZca] let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in { -def : CompressPat<(FLW FPR32C:$rd, GPRC:$rs1, uimm7_lsb00:$imm), - (C_FLW FPR32C:$rd, GPRC:$rs1, uimm7_lsb00:$imm)>; +def : CompressPat<(FLW FPR32C:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm), + (C_FLW FPR32C:$rd, GPRCMem:$rs1, uimm7_lsb00:$imm)>; } // Predicates = [HasStdExtC, HasStdExtF, IsRV32] let Predicates = [HasStdExtCOrZca, IsRV64] in { -def : CompressPat<(LD GPRC:$rd, GPRC:$rs1, uimm8_lsb000:$imm), - (C_LD GPRC:$rd, GPRC:$rs1, uimm8_lsb000:$imm)>; +def : CompressPat<(LD GPRC:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm), + (C_LD GPRC:$rd, GPRCMem:$rs1, uimm8_lsb000:$imm)>; } // Predicates = [HasStdExtCOrZca, IsRV64] let Predicates = [HasStdExtC, HasStdExtD] in { -def : CompressPat<(FSD FPR64C:$rs2, GPRC:$rs1, uimm8_lsb000:$imm), - (C_FSD FPR64C:$rs2, GPRC:$rs1, uimm8_lsb000:$imm)>; +def : CompressPat<(FSD FPR64C:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm), + (C_FSD FPR64C:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm)>; } // Predicates = [HasStdExtC, HasStdExtD] let Predicates = [HasStdExtCOrZca] in { -def : CompressPat<(SW GPRC:$rs2, GPRC:$rs1, uimm7_lsb00:$imm), - (C_SW GPRC:$rs2, GPRC:$rs1, uimm7_lsb00:$imm)>; +def : CompressPat<(SW GPRC:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm), + (C_SW GPRC:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm)>; } // Predicates = [HasStdExtCOrZca] let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in { -def : CompressPat<(FSW FPR32C:$rs2, GPRC:$rs1, uimm7_lsb00:$imm), - (C_FSW FPR32C:$rs2, GPRC:$rs1, uimm7_lsb00:$imm)>; +def : CompressPat<(FSW FPR32C:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm), + (C_FSW FPR32C:$rs2, GPRCMem:$rs1, uimm7_lsb00:$imm)>; } // Predicates = [HasStdExtC, HasStdExtF, IsRV32] let Predicates = [HasStdExtCOrZca, IsRV64] in { -def : CompressPat<(SD GPRC:$rs2, GPRC:$rs1, uimm8_lsb000:$imm), - (C_SD GPRC:$rs2, GPRC:$rs1, uimm8_lsb000:$imm)>; +def : CompressPat<(SD GPRC:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm), + (C_SD GPRC:$rs2, GPRCMem:$rs1, uimm8_lsb000:$imm)>; } // Predicates = [HasStdExtCOrZca, IsRV64] // Quadrant 1 @@ -879,23 +879,23 @@ } // Predicates = [HasStdExtCOrZca] let Predicates = [HasStdExtC, HasStdExtD] in { -def : CompressPat<(FLD FPR64:$rd, SP:$rs1, uimm9_lsb000:$imm), - (C_FLDSP FPR64:$rd, SP:$rs1, uimm9_lsb000:$imm)>; +def : CompressPat<(FLD FPR64:$rd, SPMem:$rs1, uimm9_lsb000:$imm), + (C_FLDSP FPR64:$rd, SPMem:$rs1, uimm9_lsb000:$imm)>; } // Predicates = [HasStdExtC, HasStdExtD] let Predicates = [HasStdExtCOrZca] in { -def : CompressPat<(LW GPRNoX0:$rd, SP:$rs1, uimm8_lsb00:$imm), - (C_LWSP GPRNoX0:$rd, SP:$rs1, uimm8_lsb00:$imm)>; +def : CompressPat<(LW GPRNoX0:$rd, SPMem:$rs1, uimm8_lsb00:$imm), + (C_LWSP GPRNoX0:$rd, SPMem:$rs1, uimm8_lsb00:$imm)>; } // Predicates = [HasStdExtCOrZca] let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in { -def : CompressPat<(FLW FPR32:$rd, SP:$rs1, uimm8_lsb00:$imm), - (C_FLWSP FPR32:$rd, SP:$rs1, uimm8_lsb00:$imm)>; +def : CompressPat<(FLW FPR32:$rd, SPMem:$rs1, uimm8_lsb00:$imm), + (C_FLWSP FPR32:$rd, SPMem:$rs1, uimm8_lsb00:$imm)>; } // Predicates = [HasStdExtC, HasStdExtF, IsRV32] let Predicates = [HasStdExtCOrZca, IsRV64] in { -def : CompressPat<(LD GPRNoX0:$rd, SP:$rs1, uimm9_lsb000:$imm), - (C_LDSP GPRNoX0:$rd, SP:$rs1, uimm9_lsb000:$imm)>; +def : CompressPat<(LD GPRNoX0:$rd, SPMem:$rs1, uimm9_lsb000:$imm), + (C_LDSP GPRNoX0:$rd, SPMem:$rs1, uimm9_lsb000:$imm)>; } // Predicates = [HasStdExtCOrZca, IsRV64] let Predicates = [HasStdExtCOrZca] in { @@ -921,21 +921,21 @@ } // Predicates = [HasStdExtCOrZca] let Predicates = [HasStdExtC, HasStdExtD] in { -def : CompressPat<(FSD FPR64:$rs2, SP:$rs1, uimm9_lsb000:$imm), - (C_FSDSP FPR64:$rs2, SP:$rs1, uimm9_lsb000:$imm)>; +def : CompressPat<(FSD FPR64:$rs2, SPMem:$rs1, uimm9_lsb000:$imm), + (C_FSDSP FPR64:$rs2, SPMem:$rs1, uimm9_lsb000:$imm)>; } // Predicates = [HasStdExtC, HasStdExtD] let Predicates = [HasStdExtCOrZca] in { -def : CompressPat<(SW GPR:$rs2, SP:$rs1, uimm8_lsb00:$imm), - (C_SWSP GPR:$rs2, SP:$rs1, uimm8_lsb00:$imm)>; +def : CompressPat<(SW GPR:$rs2, SPMem:$rs1, uimm8_lsb00:$imm), + (C_SWSP GPR:$rs2, SPMem:$rs1, uimm8_lsb00:$imm)>; } // Predicates = [HasStdExtCOrZca] let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in { -def : CompressPat<(FSW FPR32:$rs2, SP:$rs1, uimm8_lsb00:$imm), - (C_FSWSP FPR32:$rs2, SP:$rs1, uimm8_lsb00:$imm)>; +def : CompressPat<(FSW FPR32:$rs2, SPMem:$rs1, uimm8_lsb00:$imm), + (C_FSWSP FPR32:$rs2, SPMem:$rs1, uimm8_lsb00:$imm)>; } // Predicates = [HasStdExtC, HasStdExtF, IsRV32] let Predicates = [HasStdExtCOrZca, IsRV64] in { -def : CompressPat<(SD GPR:$rs2, SP:$rs1, uimm9_lsb000:$imm), - (C_SDSP GPR:$rs2, SP:$rs1, uimm9_lsb000:$imm)>; +def : CompressPat<(SD GPR:$rs2, SPMem:$rs1, uimm9_lsb000:$imm), + (C_SDSP GPR:$rs2, SPMem:$rs1, uimm9_lsb000:$imm)>; } // Predicates = [HasStdExtCOrZca, IsRV64] diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td @@ -157,7 +157,7 @@ class FPLoad_r funct3, string opcodestr, RegisterClass rty, SchedWrite sw> : RVInstI, Sched<[sw, ReadFMemBase]>; @@ -165,7 +165,7 @@ class FPStore_r funct3, string opcodestr, RegisterClass rty, SchedWrite sw> : RVInstS, Sched<[sw, ReadFStoreData, ReadFMemBase]>; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -156,13 +156,13 @@ class VUnitStrideLoad : RVInstVLU<0b000, width.Value{3}, LUMOPUnitStride, width.Value{2-0}, (outs VR:$vd), - (ins GPR:$rs1, VMaskOp:$vm), opcodestr, "$vd, (${rs1})$vm">; + (ins GPRMem:$rs1, VMaskOp:$vm), opcodestr, "$vd, (${rs1})$vm">; let vm = 1, RVVConstraint = NoConstraint in { // unit-stride whole register load vlr.v vd, (rs1) class VWholeLoad nf, RISCVWidth width, string opcodestr, RegisterClass VRC> : RVInstVLU { let Uses = []; } @@ -171,46 +171,46 @@ class VUnitStrideLoadMask : RVInstVLU<0b000, LSWidth8.Value{3}, LUMOPUnitStrideMask, LSWidth8.Value{2-0}, (outs VR:$vd), - (ins GPR:$rs1), opcodestr, "$vd, (${rs1})">; + (ins GPRMem:$rs1), opcodestr, "$vd, (${rs1})">; } // vm = 1, RVVConstraint = NoConstraint // unit-stride fault-only-first load vd, (rs1), vm class VUnitStrideLoadFF : RVInstVLU<0b000, width.Value{3}, LUMOPUnitStrideFF, width.Value{2-0}, (outs VR:$vd), - (ins GPR:$rs1, VMaskOp:$vm), opcodestr, "$vd, (${rs1})$vm">; + (ins GPRMem:$rs1, VMaskOp:$vm), opcodestr, "$vd, (${rs1})$vm">; // strided load vd, (rs1), rs2, vm class VStridedLoad : RVInstVLS<0b000, width.Value{3}, width.Value{2-0}, (outs VR:$vd), - (ins GPR:$rs1, GPR:$rs2, VMaskOp:$vm), opcodestr, + (ins GPRMem:$rs1, GPR:$rs2, VMaskOp:$vm), opcodestr, "$vd, (${rs1}), $rs2$vm">; // indexed load vd, (rs1), vs2, vm class VIndexedLoad : RVInstVLX<0b000, width.Value{3}, mop, width.Value{2-0}, (outs VR:$vd), - (ins GPR:$rs1, VR:$vs2, VMaskOp:$vm), opcodestr, + (ins GPRMem:$rs1, VR:$vs2, VMaskOp:$vm), opcodestr, "$vd, (${rs1}), $vs2$vm">; // unit-stride segment load vd, (rs1), vm class VUnitStrideSegmentLoad nf, RISCVWidth width, string opcodestr> : RVInstVLU; + (ins GPRMem:$rs1, VMaskOp:$vm), opcodestr, "$vd, (${rs1})$vm">; // segment fault-only-first load vd, (rs1), vm class VUnitStrideSegmentLoadFF nf, RISCVWidth width, string opcodestr> : RVInstVLU; + (ins GPRMem:$rs1, VMaskOp:$vm), opcodestr, "$vd, (${rs1})$vm">; // strided segment load vd, (rs1), rs2, vm class VStridedSegmentLoad nf, RISCVWidth width, string opcodestr> : RVInstVLS; // indexed segment load vd, (rs1), vs2, vm @@ -218,7 +218,7 @@ string opcodestr> : RVInstVLX; } // hasSideEffects = 0, mayLoad = 1, mayStore = 0 @@ -226,14 +226,14 @@ // unit-stride store vd, vs3, (rs1), vm class VUnitStrideStore : RVInstVSU<0b000, width.Value{3}, SUMOPUnitStride, width.Value{2-0}, - (outs), (ins VR:$vs3, GPR:$rs1, VMaskOp:$vm), opcodestr, + (outs), (ins VR:$vs3, GPRMem:$rs1, VMaskOp:$vm), opcodestr, "$vs3, (${rs1})$vm">; let vm = 1 in { // vsr.v vd, (rs1) class VWholeStore nf, string opcodestr, RegisterClass VRC> : RVInstVSU { let Uses = []; } @@ -241,39 +241,39 @@ // unit-stride mask store vd, vs3, (rs1) class VUnitStrideStoreMask : RVInstVSU<0b000, LSWidth8.Value{3}, SUMOPUnitStrideMask, LSWidth8.Value{2-0}, - (outs), (ins VR:$vs3, GPR:$rs1), opcodestr, + (outs), (ins VR:$vs3, GPRMem:$rs1), opcodestr, "$vs3, (${rs1})">; } // vm = 1 // strided store vd, vs3, (rs1), rs2, vm class VStridedStore : RVInstVSS<0b000, width.Value{3}, width.Value{2-0}, (outs), - (ins VR:$vs3, GPR:$rs1, GPR:$rs2, VMaskOp:$vm), + (ins VR:$vs3, GPRMem:$rs1, GPR:$rs2, VMaskOp:$vm), opcodestr, "$vs3, (${rs1}), $rs2$vm">; // indexed store vd, vs3, (rs1), vs2, vm class VIndexedStore : RVInstVSX<0b000, width.Value{3}, mop, width.Value{2-0}, (outs), - (ins VR:$vs3, GPR:$rs1, VR:$vs2, VMaskOp:$vm), + (ins VR:$vs3, GPRMem:$rs1, VR:$vs2, VMaskOp:$vm), opcodestr, "$vs3, (${rs1}), $vs2$vm">; // segment store vd, vs3, (rs1), vm class VUnitStrideSegmentStore nf, RISCVWidth width, string opcodestr> : RVInstVSU; // segment store vd, vs3, (rs1), rs2, vm class VStridedSegmentStore nf, RISCVWidth width, string opcodestr> : RVInstVSS; // segment store vd, vs3, (rs1), vs2, vm class VIndexedSegmentStore nf, RISCVMOP mop, RISCVWidth width, string opcodestr> : RVInstVSX; } // hasSideEffects = 0, mayLoad = 0, mayStore = 1 diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -662,7 +662,7 @@ class VPseudoUSLoadNoMask : Pseudo<(outs RetClass:$rd), - (ins GPR:$rs1, AVL:$vl, ixlenimm:$sew),[]>, + (ins GPRMem:$rs1, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { let mayLoad = 1; @@ -675,7 +675,7 @@ class VPseudoUSLoadNoMaskTU : Pseudo<(outs RetClass:$rd), - (ins RetClass:$dest, GPR:$rs1, AVL:$vl, ixlenimm:$sew),[]>, + (ins RetClass:$dest, GPRMem:$rs1, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { let mayLoad = 1; @@ -691,7 +691,7 @@ class VPseudoUSLoadMask : Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, - GPR:$rs1, + GPRMem:$rs1, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { @@ -708,7 +708,7 @@ class VPseudoUSLoadFFNoMask : Pseudo<(outs RetClass:$rd, GPR:$vl), - (ins GPR:$rs1, AVL:$avl, ixlenimm:$sew),[]>, + (ins GPRMem:$rs1, AVL:$avl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { let mayLoad = 1; @@ -721,7 +721,7 @@ class VPseudoUSLoadFFNoMaskTU : Pseudo<(outs RetClass:$rd, GPR:$vl), - (ins RetClass:$dest, GPR:$rs1, AVL:$avl, ixlenimm:$sew),[]>, + (ins RetClass:$dest, GPRMem:$rs1, AVL:$avl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { let mayLoad = 1; @@ -737,7 +737,7 @@ class VPseudoUSLoadFFMask : Pseudo<(outs GetVRegNoV0.R:$rd, GPR:$vl), (ins GetVRegNoV0.R:$merge, - GPR:$rs1, + GPRMem:$rs1, VMaskOp:$vm, AVL:$avl, ixlenimm:$sew, ixlenimm:$policy),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { @@ -754,7 +754,7 @@ class VPseudoSLoadNoMask: Pseudo<(outs RetClass:$rd), - (ins GPR:$rs1, GPR:$rs2, AVL:$vl, ixlenimm:$sew),[]>, + (ins GPRMem:$rs1, GPR:$rs2, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { let mayLoad = 1; @@ -767,7 +767,7 @@ class VPseudoSLoadNoMaskTU: Pseudo<(outs RetClass:$rd), - (ins RetClass:$dest, GPR:$rs1, GPR:$rs2, AVL:$vl, ixlenimm:$sew),[]>, + (ins RetClass:$dest, GPRMem:$rs1, GPR:$rs2, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { let mayLoad = 1; @@ -783,7 +783,7 @@ class VPseudoSLoadMask: Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, - GPR:$rs1, GPR:$rs2, + GPRMem:$rs1, GPR:$rs2, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy),[]>, RISCVVPseudo, RISCVVLE.val, VLMul> { @@ -801,7 +801,7 @@ class VPseudoILoadNoMask LMUL, bit Ordered, bit EarlyClobber>: Pseudo<(outs RetClass:$rd), - (ins GPR:$rs1, IdxClass:$rs2, AVL:$vl, + (ins GPRMem:$rs1, IdxClass:$rs2, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLX.val, VLMul, LMUL> { @@ -817,7 +817,7 @@ class VPseudoILoadNoMaskTU LMUL, bit Ordered, bit EarlyClobber>: Pseudo<(outs RetClass:$rd), - (ins RetClass:$dest, GPR:$rs1, IdxClass:$rs2, AVL:$vl, + (ins RetClass:$dest, GPRMem:$rs1, IdxClass:$rs2, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLX.val, VLMul, LMUL> { @@ -835,7 +835,7 @@ bit Ordered, bit EarlyClobber>: Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$merge, - GPR:$rs1, IdxClass:$rs2, + GPRMem:$rs1, IdxClass:$rs2, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy),[]>, RISCVVPseudo, RISCVVLX.val, VLMul, LMUL> { @@ -852,7 +852,7 @@ class VPseudoUSStoreNoMask: Pseudo<(outs), - (ins StClass:$rd, GPR:$rs1, AVL:$vl, ixlenimm:$sew),[]>, + (ins StClass:$rd, GPRMem:$rs1, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSE.val, VLMul> { let mayLoad = 0; @@ -865,7 +865,7 @@ class VPseudoUSStoreMask: Pseudo<(outs), - (ins StClass:$rd, GPR:$rs1, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, + (ins StClass:$rd, GPRMem:$rs1, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSE.val, VLMul> { let mayLoad = 0; @@ -877,7 +877,7 @@ class VPseudoSStoreNoMask: Pseudo<(outs), - (ins StClass:$rd, GPR:$rs1, GPR:$rs2, AVL:$vl, ixlenimm:$sew),[]>, + (ins StClass:$rd, GPRMem:$rs1, GPR:$rs2, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSE.val, VLMul> { let mayLoad = 0; @@ -890,7 +890,7 @@ class VPseudoSStoreMask: Pseudo<(outs), - (ins StClass:$rd, GPR:$rs1, GPR:$rs2, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, + (ins StClass:$rd, GPRMem:$rs1, GPR:$rs2, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSE.val, VLMul> { let mayLoad = 0; @@ -1163,7 +1163,7 @@ class VPseudoIStoreNoMask LMUL, bit Ordered>: Pseudo<(outs), - (ins StClass:$rd, GPR:$rs1, IdxClass:$rs2, AVL:$vl, ixlenimm:$sew),[]>, + (ins StClass:$rd, GPRMem:$rs1, IdxClass:$rs2, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSX.val, VLMul, LMUL> { let mayLoad = 0; @@ -1177,7 +1177,7 @@ class VPseudoIStoreMask LMUL, bit Ordered>: Pseudo<(outs), - (ins StClass:$rd, GPR:$rs1, IdxClass:$rs2, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, + (ins StClass:$rd, GPRMem:$rs1, IdxClass:$rs2, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSX.val, VLMul, LMUL> { let mayLoad = 0; @@ -1353,7 +1353,7 @@ class VPseudoUSSegLoadNoMask NF>: Pseudo<(outs RetClass:$rd), - (ins GPR:$rs1, AVL:$vl, ixlenimm:$sew),[]>, + (ins GPRMem:$rs1, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLSEG.val, VLMul> { let mayLoad = 1; @@ -1366,7 +1366,7 @@ class VPseudoUSSegLoadNoMaskTU NF>: Pseudo<(outs RetClass:$rd), - (ins RetClass:$dest, GPR:$rs1, AVL:$vl, ixlenimm:$sew),[]>, + (ins RetClass:$dest, GPRMem:$rs1, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLSEG.val, VLMul> { let mayLoad = 1; @@ -1381,7 +1381,7 @@ class VPseudoUSSegLoadMask NF>: Pseudo<(outs GetVRegNoV0.R:$rd), - (ins GetVRegNoV0.R:$merge, GPR:$rs1, + (ins GetVRegNoV0.R:$merge, GPRMem:$rs1, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy),[]>, RISCVVPseudo, RISCVVLSEG.val, VLMul> { @@ -1398,7 +1398,7 @@ class VPseudoUSSegLoadFFNoMask NF>: Pseudo<(outs RetClass:$rd, GPR:$vl), - (ins GPR:$rs1, AVL:$avl, ixlenimm:$sew),[]>, + (ins GPRMem:$rs1, AVL:$avl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLSEG.val, VLMul> { let mayLoad = 1; @@ -1411,7 +1411,7 @@ class VPseudoUSSegLoadFFNoMaskTU NF>: Pseudo<(outs RetClass:$rd, GPR:$vl), - (ins RetClass:$dest, GPR:$rs1, AVL:$avl, ixlenimm:$sew),[]>, + (ins RetClass:$dest, GPRMem:$rs1, AVL:$avl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLSEG.val, VLMul> { let mayLoad = 1; @@ -1426,7 +1426,7 @@ class VPseudoUSSegLoadFFMask NF>: Pseudo<(outs GetVRegNoV0.R:$rd, GPR:$vl), - (ins GetVRegNoV0.R:$merge, GPR:$rs1, + (ins GetVRegNoV0.R:$merge, GPRMem:$rs1, VMaskOp:$vm, AVL:$avl, ixlenimm:$sew, ixlenimm:$policy),[]>, RISCVVPseudo, RISCVVLSEG.val, VLMul> { @@ -1443,11 +1443,10 @@ class VPseudoSSegLoadNoMask NF>: Pseudo<(outs RetClass:$rd), - (ins GPR:$rs1, GPR:$offset, AVL:$vl, ixlenimm:$sew),[]>, + (ins GPRMem:$rs1, GPR:$offset, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLSEG.val, VLMul> { let mayLoad = 1; - let mayLoad = 1; let mayStore = 0; let hasSideEffects = 0; let HasVLOp = 1; @@ -1457,11 +1456,10 @@ class VPseudoSSegLoadNoMaskTU NF>: Pseudo<(outs RetClass:$rd), - (ins RetClass:$merge, GPR:$rs1, GPR:$offset, AVL:$vl, ixlenimm:$sew),[]>, + (ins RetClass:$merge, GPRMem:$rs1, GPR:$offset, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLSEG.val, VLMul> { let mayLoad = 1; - let mayLoad = 1; let mayStore = 0; let hasSideEffects = 0; let HasVLOp = 1; @@ -1473,7 +1471,7 @@ class VPseudoSSegLoadMask NF>: Pseudo<(outs GetVRegNoV0.R:$rd), - (ins GetVRegNoV0.R:$merge, GPR:$rs1, + (ins GetVRegNoV0.R:$merge, GPRMem:$rs1, GPR:$offset, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy),[]>, RISCVVPseudo, @@ -1492,7 +1490,7 @@ class VPseudoISegLoadNoMask LMUL, bits<4> NF, bit Ordered>: Pseudo<(outs RetClass:$rd), - (ins GPR:$rs1, IdxClass:$offset, AVL:$vl, ixlenimm:$sew),[]>, + (ins GPRMem:$rs1, IdxClass:$offset, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLXSEG.val, VLMul, LMUL> { let mayLoad = 1; @@ -1509,7 +1507,7 @@ class VPseudoISegLoadNoMaskTU LMUL, bits<4> NF, bit Ordered>: Pseudo<(outs RetClass:$rd), - (ins RetClass:$merge, GPR:$rs1, IdxClass:$offset, AVL:$vl, ixlenimm:$sew),[]>, + (ins RetClass:$merge, GPRMem:$rs1, IdxClass:$offset, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVLXSEG.val, VLMul, LMUL> { let mayLoad = 1; @@ -1527,7 +1525,7 @@ class VPseudoISegLoadMask LMUL, bits<4> NF, bit Ordered>: Pseudo<(outs GetVRegNoV0.R:$rd), - (ins GetVRegNoV0.R:$merge, GPR:$rs1, + (ins GetVRegNoV0.R:$merge, GPRMem:$rs1, IdxClass:$offset, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew, ixlenimm:$policy),[]>, RISCVVPseudo, @@ -1547,7 +1545,7 @@ class VPseudoUSSegStoreNoMask NF>: Pseudo<(outs), - (ins ValClass:$rd, GPR:$rs1, AVL:$vl, ixlenimm:$sew),[]>, + (ins ValClass:$rd, GPRMem:$rs1, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSSEG.val, VLMul> { let mayLoad = 0; @@ -1560,7 +1558,7 @@ class VPseudoUSSegStoreMask NF>: Pseudo<(outs), - (ins ValClass:$rd, GPR:$rs1, + (ins ValClass:$rd, GPRMem:$rs1, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSSEG.val, VLMul> { @@ -1573,7 +1571,7 @@ class VPseudoSSegStoreNoMask NF>: Pseudo<(outs), - (ins ValClass:$rd, GPR:$rs1, GPR: $offset, AVL:$vl, ixlenimm:$sew),[]>, + (ins ValClass:$rd, GPRMem:$rs1, GPR: $offset, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSSEG.val, VLMul> { let mayLoad = 0; @@ -1586,7 +1584,7 @@ class VPseudoSSegStoreMask NF>: Pseudo<(outs), - (ins ValClass:$rd, GPR:$rs1, GPR: $offset, + (ins ValClass:$rd, GPRMem:$rs1, GPR: $offset, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSSEG.val, VLMul> { @@ -1600,7 +1598,7 @@ class VPseudoISegStoreNoMask LMUL, bits<4> NF, bit Ordered>: Pseudo<(outs), - (ins ValClass:$rd, GPR:$rs1, IdxClass: $index, + (ins ValClass:$rd, GPRMem:$rs1, IdxClass: $index, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSXSEG.val, VLMul, LMUL> { @@ -1615,7 +1613,7 @@ class VPseudoISegStoreMask LMUL, bits<4> NF, bit Ordered>: Pseudo<(outs), - (ins ValClass:$rd, GPR:$rs1, IdxClass: $index, + (ins ValClass:$rd, GPRMem:$rs1, IdxClass: $index, VMaskOp:$vm, AVL:$vl, ixlenimm:$sew),[]>, RISCVVPseudo, RISCVVSXSEG.val, VLMul, LMUL> { diff --git a/llvm/utils/TableGen/CompressInstEmitter.cpp b/llvm/utils/TableGen/CompressInstEmitter.cpp --- a/llvm/utils/TableGen/CompressInstEmitter.cpp +++ b/llvm/utils/TableGen/CompressInstEmitter.cpp @@ -757,7 +757,11 @@ unsigned OpIdx = DestOperandMap[OpNo].Data.Operand; // Check that the operand in the Source instruction fits // the type for the Dest instruction. - if (DestOperand.Rec->isSubClassOf("RegisterClass")) { + if (DestOperand.Rec->isSubClassOf("RegisterClass") || + DestOperand.Rec->isSubClassOf("RegisterOperand")) { + auto *ClassRec = DestOperand.Rec->isSubClassOf("RegisterClass") + ? DestOperand.Rec + : DestOperand.Rec->getValueAsDef("RegClass"); NeedMRI = true; // This is a register operand. Check the register class. // Don't check register class if this is a tied operand, it was done @@ -766,7 +770,7 @@ CondStream.indent(6) << "(MI.getOperand(" << OpIdx << ").isReg()) &&\n" << " (MRI.getRegClass(" << TargetName - << "::" << DestOperand.Rec->getName() + << "::" << ClassRec->getName() << "RegClassID).contains(MI.getOperand(" << OpIdx << ").getReg())) &&\n";