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> { } @@ -493,7 +503,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> @@ -509,7 +519,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 @@ -235,25 +235,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 @@ -718,31 +718,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 @@ -760,43 +760,43 @@ } // Predicates = [HasStdExtC] 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 = [HasStdExtC] 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 = [HasStdExtC] 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 = [HasStdExtC, 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 = [HasStdExtC, 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 = [HasStdExtC] 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 = [HasStdExtC] 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 = [HasStdExtC, 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 = [HasStdExtC, IsRV64] // Quadrant 1 @@ -877,23 +877,23 @@ } // Predicates = [HasStdExtC] 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 = [HasStdExtC] 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 = [HasStdExtC] 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 = [HasStdExtC, 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 = [HasStdExtC, IsRV64] let Predicates = [HasStdExtC] in { @@ -919,21 +919,21 @@ } // Predicates = [HasStdExtC] 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 = [HasStdExtC] 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 = [HasStdExtC] 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 = [HasStdExtC, 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 = [HasStdExtC, 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 @@ -150,7 +150,7 @@ class FPLoad_r funct3, string opcodestr, RegisterClass rty, SchedWrite sw> : RVInstI, Sched<[sw, ReadFMemBase]>; @@ -158,7 +158,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 @@ -160,13 +160,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 = []; } @@ -175,46 +175,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 @@ -222,7 +222,7 @@ string opcodestr> : RVInstVLX; } // hasSideEffects = 0, mayLoad = 1, mayStore = 0 @@ -230,14 +230,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 = []; } @@ -245,39 +245,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 @@ -650,7 +650,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; @@ -663,7 +663,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; @@ -679,7 +679,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> { @@ -696,7 +696,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; @@ -709,7 +709,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; @@ -725,7 +725,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> { @@ -742,7 +742,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; @@ -755,7 +755,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; @@ -771,7 +771,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> { @@ -789,7 +789,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> { @@ -805,7 +805,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> { @@ -823,7 +823,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> { @@ -840,7 +840,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; @@ -853,7 +853,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; @@ -865,7 +865,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; @@ -878,7 +878,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; @@ -1119,7 +1119,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; @@ -1133,7 +1133,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; @@ -1309,7 +1309,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; @@ -1322,7 +1322,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; @@ -1337,7 +1337,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> { @@ -1354,7 +1354,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; @@ -1367,7 +1367,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; @@ -1382,7 +1382,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> { @@ -1399,11 +1399,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; @@ -1413,11 +1412,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; @@ -1429,7 +1427,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, @@ -1448,7 +1446,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; @@ -1465,7 +1463,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; @@ -1483,7 +1481,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, @@ -1503,7 +1501,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; @@ -1516,7 +1514,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> { @@ -1529,7 +1527,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; @@ -1542,7 +1540,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> { @@ -1556,7 +1554,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> { @@ -1571,7 +1569,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";