diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -1761,7 +1761,7 @@ AMDGPUOperand::Ptr defaultSMEMOffsetMod() const; AMDGPUOperand::Ptr defaultFlatOffset() const; - OperandMatchResultTy parseOModOperand(OperandVector &Operands); + OperandMatchResultTy parseOModSI(OperandVector &Operands); void cvtVOP3(MCInst &Inst, const OperandVector &Operands, OptionalImmIndexMap &OptionalIdx); @@ -8048,7 +8048,7 @@ getTargetStreamer().EmitDirectiveAMDGCNTarget(); } -OperandMatchResultTy AMDGPUAsmParser::parseOModOperand(OperandVector &Operands) { +OperandMatchResultTy AMDGPUAsmParser::parseOModSI(OperandVector &Operands) { StringRef Name = getTokenStr(); if (Name == "mul") { return parseIntWithPrefix("mul", Operands, @@ -9129,24 +9129,8 @@ return parseTokenOp("off", Operands); case MCK_row_95_en: return parseTokenOp("row_en", Operands); - case MCK_ImmCPol: - return parseCPol(Operands); case MCK_gds: return parseNamedBit("gds", Operands, AMDGPUOperand::ImmTyGDS); - case MCK_ImmNegHi: - return parseOperandArrayWithPrefix("neg_hi", Operands, - AMDGPUOperand::ImmTyNegHi); - case MCK_ImmNegLo: - return parseOperandArrayWithPrefix("neg_lo", Operands, - AMDGPUOperand::ImmTyNegLo); - case MCK_ImmOModSI: - return parseOModOperand(Operands); - case MCK_ImmOpSel: - return parseOperandArrayWithPrefix("op_sel", Operands, - AMDGPUOperand::ImmTyOpSel); - case MCK_ImmOpSelHi: - return parseOperandArrayWithPrefix("op_sel_hi", Operands, - AMDGPUOperand::ImmTyOpSelHi); case MCK_tfe: return parseNamedBit("tfe", Operands, AMDGPUOperand::ImmTyTFE); } diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -1121,15 +1121,6 @@ let PrintMethod = "printVOPDst"; } -class NamedMatchClass : AsmOperandClass { - let Name = "Imm"#CName; - let PredicateMethod = "is"#CName; - let ParserMethod = !if(Optional, "", "parse"#CName); - let RenderMethod = "addImmOperands"; - let IsOptional = Optional; - let DefaultMethod = !if(Optional, "default"#CName, ?); -} - class CustomOperandClass : AsmOperandClass { let Name = CName; let PredicateMethod = "is"#CName; @@ -1143,6 +1134,7 @@ AsmOperandClass Class = CustomOperandClass> { string PrintMethod = "print"#Name; AsmOperandClass ParserMatchClass = Class; + string OperandType = "OPERAND_IMMEDIATE"; } class CustomOperand : CustomOperand>; -class DefaultOperand_0 - : OperandWithDefaultOps, +class DefaultOperand + : OperandWithDefaultOps, CustomOperandProps<1, Op.ParserMatchClass.Name, Op.ParserMatchClass>; -class NamedOperandU32 : Operand { - let PrintMethod = "print"#Name; - let ParserMatchClass = MatchClass; -} - -class NamedOperandU32_0 : - OperandWithDefaultOps { - let PrintMethod = "print"#Name; - let ParserMatchClass = MatchClass; -} - -class NamedOperandU32Default0 : - OperandWithDefaultOps { - let PrintMethod = "print"#Name; - let ParserMatchClass = MatchClass; -} - -class NamedOperandU32Default1 : - OperandWithDefaultOps { - let PrintMethod = "print"#Name; - let ParserMatchClass = MatchClass; -} - class SDWAOperandClass : CustomOperandClass { string ImmTy = "AMDGPUOperand::ImmTy"#Name; @@ -1211,7 +1180,17 @@ class SDWAOperand : CustomOperand>; -let OperandType = "OPERAND_IMMEDIATE" in { +class ArrayOperandClass + : CustomOperandClass { + string ImmTy = "AMDGPUOperand::ImmTy"#Name; + let ParserMethod = + "[this](OperandVector &Operands) -> OperandMatchResultTy { "# + "return parseOperandArrayWithPrefix(\""#Id#"\", Operands, "#ImmTy#"); }"; +} + +class ArrayOperand0 + : OperandWithDefaultOps, + CustomOperandProps<1, Name, ArrayOperandClass>; def flat_offset : CustomOperand; def offset : NamedIntOperand; @@ -1220,23 +1199,23 @@ def gds : NamedBitOperand<"gds", "GDS">; -def omod : NamedOperandU32<"OModSI", NamedMatchClass<"OModSI">>; -def omod0 : NamedOperandU32_0<"OModSI", NamedMatchClass<"OModSI">>; +def omod : CustomOperand; +def omod0 : DefaultOperand; // We need to make the cases with a default of 0 distinct from no // default to help deal with some cases where the operand appears // before a mandatory operand. def clampmod : NamedBitOperand<"clamp", "ClampSI">; -def clampmod0 : DefaultOperand_0; +def clampmod0 : DefaultOperand; def highmod : NamedBitOperand<"high", "High">; -def CPol : NamedOperandU32<"CPol", NamedMatchClass<"CPol">>; -def CPol_0 : NamedOperandU32Default0<"CPol", NamedMatchClass<"CPol">>; -def CPol_GLC1 : NamedOperandU32Default1<"CPol", NamedMatchClass<"CPol">>; +def CPol : CustomOperand; +def CPol_0 : DefaultOperand; +def CPol_GLC1 : DefaultOperand; def TFE : NamedBitOperand<"tfe">; def SWZ : NamedBitOperand<"swz">; -def SWZ_0 : DefaultOperand_0; +def SWZ_0 : DefaultOperand; def UNorm : NamedBitOperand<"unorm">; def DA : NamedBitOperand<"da">; def R128A16 : CustomOperand; @@ -1256,10 +1235,10 @@ def src1_sel : SDWAOperand<"src1_sel", "SDWASrc1Sel">; def dst_unused : CustomOperand; -def op_sel0 : NamedOperandU32Default0<"OpSel", NamedMatchClass<"OpSel">>; -def op_sel_hi0 : NamedOperandU32Default0<"OpSelHi", NamedMatchClass<"OpSelHi">>; -def neg_lo0 : NamedOperandU32Default0<"NegLo", NamedMatchClass<"NegLo">>; -def neg_hi0 : NamedOperandU32Default0<"NegHi", NamedMatchClass<"NegHi">>; +def op_sel0 : ArrayOperand0<"op_sel", "OpSel">; +def op_sel_hi0 : ArrayOperand0<"op_sel_hi", "OpSelHi">; +def neg_lo0 : ArrayOperand0<"neg_lo", "NegLo">; +def neg_hi0 : ArrayOperand0<"neg_hi", "NegHi">; def dpp8 : CustomOperand; def dpp_ctrl : CustomOperand; @@ -1281,8 +1260,6 @@ def wait_vdst : NamedIntOperand; def wait_exp : NamedIntOperand; -} // End OperandType = "OPERAND_IMMEDIATE" - class KImmMatchClass : AsmOperandClass { let Name = "KImmFP"#size; let PredicateMethod = "isKImmFP"#size; diff --git a/llvm/lib/Target/AMDGPU/SMInstructions.td b/llvm/lib/Target/AMDGPU/SMInstructions.td --- a/llvm/lib/Target/AMDGPU/SMInstructions.td +++ b/llvm/lib/Target/AMDGPU/SMInstructions.td @@ -8,8 +8,7 @@ def smrd_offset_8 : ImmOperand; -let OperandType = "OPERAND_IMMEDIATE", - EncoderMethod = "getSMEMOffsetEncoding", +let EncoderMethod = "getSMEMOffsetEncoding", DecoderMethod = "decodeSMEMOffset" in { def smem_offset : ImmOperand; def smem_offset_mod : NamedIntOperand;