From 628e11564089a511e24b33971da93e0b0f708b8a Mon Sep 17 00:00:00 2001 From: Anatoly Trosinenko Date: Tue, 11 Jun 2024 14:29:10 +0300 Subject: [PATCH] [EraVM] Prepare for removing repeated operand definitions in *.td files Perform a few preparations before removing repeated definitions of operands in `EraVMInstrInfo.td`: * move the definitions of EraVM-specific `AsmOperandClass`es and `Operand`s, so that they can be used in `EraVMInstrFormats.td` * define tablegen classes to be mixed into `Ixx_x` instruction classes --- llvm/lib/Target/EraVM/EraVMInstrFormats.td | 219 ++++++++++++++------- llvm/lib/Target/EraVM/EraVMInstrInfo.td | 82 -------- 2 files changed, 143 insertions(+), 158 deletions(-) diff --git a/llvm/lib/Target/EraVM/EraVMInstrFormats.td b/llvm/lib/Target/EraVM/EraVMInstrFormats.td index de4142dae5a5..1a61c87171c3 100644 --- a/llvm/lib/Target/EraVM/EraVMInstrFormats.td +++ b/llvm/lib/Target/EraVM/EraVMInstrFormats.td @@ -108,6 +108,88 @@ def withRegisterResult : WithDifferentResult<"ToStack", "ToReg">; include "EraVMOpcodes.td" +//===----------------------------------------------------------------------===// +// EraVM Operand Definitions. +//===----------------------------------------------------------------------===// + +def UImm16Operand : AsmOperandClass { + let Name = "UImm16"; + let ParserMethod = "tryParseUImm16Operand"; + let PredicateMethod = "isImm"; + let RenderMethod = "addImmOperands"; +} + +def imm16 : Operand, IntImmLeaf { + let ParserMatchClass = UImm16Operand; +} + +def neg_imm16 : Operand, IntImmLeaf {} + +def large_imm : Operand, IntImmLeaf {} + +// This operand class represents those jump targets described +// as imm_in operand in the spec. +def JumpTargetOperand : AsmOperandClass { + let Name = "JumpTarget"; + let ParserMethod = "tryParseJumpTargetOperand"; + let PredicateMethod = "isImm"; + let RenderMethod = "addImmOperands"; +} + +def jmptarget : Operand { + let ParserMatchClass = JumpTargetOperand; + let EncoderMethod = "getJumpTargetValue"; +} + +// Address operands + +def CodeOperand : AsmOperandClass { + let Name = "CodeReference"; + let ParserMethod = "tryParseCodeOperand"; +} + +def memop : Operand { + let PrintMethod = "printMemOperand"; + let EncoderMethod = "getMemOpValue"; + let ParserMatchClass = CodeOperand; + let DecoderMethod = "DecodeCodeOperand"; + let MIOperandInfo = (ops GR256, i16imm); +} + +let ParserMethod = "tryParseStackOperand", + RenderMethod = "addStackReferenceOperands" in { +def StackInOperand : AsmOperandClass { + let Name = "StackInReference"; + let PredicateMethod = "isStackReference"; +} +def StackOutOperand : AsmOperandClass { + let Name = "StackOutReference"; + let PredicateMethod = "isStackReference"; +} +} + +def stackin : Operand { + let PrintMethod = "printStackOperand"; + let EncoderMethod = "getStackOpValue"; + let ParserMatchClass = StackInOperand; + let DecoderMethod = "DecodeStackOperand"; + let MIOperandInfo = (ops GRStackRefMarker, GR256, i16imm); +} + +def stackout : Operand { + let PrintMethod = "printStackOperand"; + let EncoderMethod = "getStackOpValue"; + let ParserMatchClass = StackOutOperand; + let DecoderMethod = "DecodeStackOperand"; + let MIOperandInfo = (ops GRStackRefMarker, GR256, i16imm); +} + //===----------------------------------------------------------------------===// // EraVM Instructions //===----------------------------------------------------------------------===// @@ -346,21 +428,59 @@ class IBinaryS pattern> - : IBinaryR { +// Mix-in classes to hook standard fields for different combinations +// of input operands. + +class SrcOperandsRR { + SrcOperandMode OperandAddrMode = OpndRR; + bits<4> rs0; bits<4> rs1; - let OperandAddrMode = OpndRR; + bits<4> Src0 = rs0; + bits<4> Src1 = rs1; +} + +class SrcOperandsIR { + SrcOperandMode OperandAddrMode = OpndIR; - let Src0 = rs0; - let Src1 = rs1; + bits<16> imm; + bits<4> rs1; + + bits<16> Imm0 = imm; + bits<4> Src1 = rs1; +} + +class SrcOperandsMR { + SrcOperandMode OperandAddrMode = OpndCR; + + bits<20> src0; + bits<4> rs1; + + bits<4> Src0 = src0{3-0}; + bits<16> Imm0 = src0{19-4}; + bits<4> Src1 = rs1; +} + +class SrcOperandsSR { + SrcOperandMode OperandAddrMode = OpndSR; + + bits<20> src0; + bits<4> rs1; + + bits<4> Src0 = src0{3-0}; + bits<16> Imm0 = src0{19-4}; + bits<4> Src1 = rs1; } +class Irr_r pattern> + : IBinaryR, + SrcOperandsRR; + class Irr_rr pattern> - : IBinaryR { - bits<4> rs1; - bits<16> imm; - - let OperandAddrMode = OpndIR; - - let Src1 = rs1; - let Imm0 = imm; -} + : IBinaryR, + SrcOperandsIR; class Iir_rr pattern> - : IBinaryR { - bits<20> src0; - bits<4> rs1; - - let OperandAddrMode = OpndCR; - - let Src0 = src0{3-0}; - let Imm0 = src0{19-4}; - let Src1 = rs1; -} + : IBinaryR, + SrcOperandsMR; class Isr_r pattern> - : IBinaryR { - bits<20> src0; - bits<4> rs1; - - let OperandAddrMode = OpndSR; - - let Src0 = src0{3-0}; - let Src1 = rs1; - let Imm0 = src0{19-4}; -} + : IBinaryR, + SrcOperandsSR; class Imr_rr pattern> - : IBinaryS { - bits<4> rs0; - bits<4> rs1; - - let OperandAddrMode = OpndRR; - - let Src0 = rs0; - let Src1 = rs1; -} + : IBinaryS, + SrcOperandsRR; class Irr_sr pattern> - : IBinaryS { - bits<16> imm; - bits<4> rs1; - - let OperandAddrMode = OpndIR; - - let Imm0 = imm; - let Src1 = rs1; -} + : IBinaryS, + SrcOperandsIR; class Iir_sr pattern> - : IBinaryS { - bits<20> src0; - bits<4> rs1; - - let OperandAddrMode = OpndCR; - - let Src0 = src0{3-0}; - let Imm0 = src0{19-4}; - let Src1 = rs1; -} + : IBinaryS, + SrcOperandsMR; class Isr_s pattern> - : IBinaryS { - bits<20> src0; - bits<4> rs1; - - let OperandAddrMode = OpndSR; - - let Src0 = src0{3-0}; - let Src1 = rs1; - let Imm0 = src0{19-4}; -} + : IBinaryS, + SrcOperandsSR; class Imr_sr; def EraVMMul_v : SDNode<"EraVMISD::MUL_V", SDT_EraVMArith, [SDNPHasChain, SDNPOutGlue]>; -//===----------------------------------------------------------------------===// -// EraVM Operand Definitions. -//===----------------------------------------------------------------------===// - -def UImm16Operand : AsmOperandClass { - let Name = "UImm16"; - let ParserMethod = "tryParseUImm16Operand"; - let PredicateMethod = "isImm"; - let RenderMethod = "addImmOperands"; -} - -def imm16 : Operand, IntImmLeaf { - let ParserMatchClass = UImm16Operand; -} - -def neg_imm16 : Operand, IntImmLeaf {} - -def large_imm : Operand, IntImmLeaf {} - -// This operand class represents those jump targets described -// as imm_in operand in the spec. -def JumpTargetOperand : AsmOperandClass { - let Name = "JumpTarget"; - let ParserMethod = "tryParseJumpTargetOperand"; - let PredicateMethod = "isImm"; - let RenderMethod = "addImmOperands"; -} - -def jmptarget : Operand { - let ParserMatchClass = JumpTargetOperand; - let EncoderMethod = "getJumpTargetValue"; -} - -// Address operands - -def CodeOperand : AsmOperandClass { - let Name = "CodeReference"; - let ParserMethod = "tryParseCodeOperand"; -} - -def memop : Operand { - let PrintMethod = "printMemOperand"; - let EncoderMethod = "getMemOpValue"; - let ParserMatchClass = CodeOperand; - let DecoderMethod = "DecodeCodeOperand"; - let MIOperandInfo = (ops GR256, i16imm); -} - -let ParserMethod = "tryParseStackOperand", - RenderMethod = "addStackReferenceOperands" in { -def StackInOperand : AsmOperandClass { - let Name = "StackInReference"; - let PredicateMethod = "isStackReference"; -} -def StackOutOperand : AsmOperandClass { - let Name = "StackOutReference"; - let PredicateMethod = "isStackReference"; -} -} - -def stackin : Operand { - let PrintMethod = "printStackOperand"; - let EncoderMethod = "getStackOpValue"; - let ParserMatchClass = StackInOperand; - let DecoderMethod = "DecodeStackOperand"; - let MIOperandInfo = (ops GRStackRefMarker, GR256, i16imm); -} - -def stackout : Operand { - let PrintMethod = "printStackOperand"; - let EncoderMethod = "getStackOpValue"; - let ParserMatchClass = StackOutOperand; - let DecoderMethod = "DecodeStackOperand"; - let MIOperandInfo = (ops GRStackRefMarker, GR256, i16imm); -} - //===----------------------------------------------------------------------===// // Custom DAG Selection Operations. //===----------------------------------------------------------------------===//