From f31171e1501f84ec863439d402b10e829ca19d26 Mon Sep 17 00:00:00 2001 From: Anatoly Trosinenko Date: Thu, 6 Jun 2024 14:44:28 +0300 Subject: [PATCH] [EraVM] Refactor the three other `InstrMapping`s Unlike mapping between different input operand kinds, the three other `InstrMapping`s only have two options each that are flipped by the mapper function. Remove the synthetic Value field from `DestAddrModeValue` (renamed to `DestOperandMode`) class. Keep Value fields in `mod_set_flags` and `mod_swap` as these fields are meaningful for opcode computation. Remove the `ToReg` vs. `ToRegReg` and `ToStack` vs. `ToStackReg` separation as it is not really used. --- llvm/lib/Target/EraVM/EraVMInstrFormats.td | 90 +++++++--------------- 1 file changed, 26 insertions(+), 64 deletions(-) diff --git a/llvm/lib/Target/EraVM/EraVMInstrFormats.td b/llvm/lib/Target/EraVM/EraVMInstrFormats.td index 4aa78c4c3cae..de4142dae5a5 100644 --- a/llvm/lib/Target/EraVM/EraVMInstrFormats.td +++ b/llvm/lib/Target/EraVM/EraVMInstrFormats.td @@ -25,14 +25,10 @@ def OpndSR : SrcOperandMode; def OpndCR : SrcOperandMode; // DestAddrMode: -class DestAddrModeValue val> { - bits<3> Value = val; -} -def DestAddrNotSet : DestAddrModeValue<0>; -def ToReg : DestAddrModeValue<1>; -def ToStack : DestAddrModeValue<2>; -def ToRegReg : DestAddrModeValue<3>; -def ToStackReg : DestAddrModeValue<4>; +class DestOperandMode; +def DestAddrNotSet : DestOperandMode; +def ToReg : DestOperandMode; +def ToStack : DestOperandMode; //===----------------------------------------------------------------------===// // Instruction mapping tables @@ -49,21 +45,16 @@ class mod_set_flags { def PreserveFlags : mod_set_flags<0>; def SetFlags : mod_set_flags<1>; -def getFlagSettingOpcode : InstrMapping { +class FlipFlagSetting : InstrMapping { let FilterClass = "FlagSetting"; let RowFields = ["BaseOpcode", "OperandAddrMode", "DestAddrMode", "ReverseOperands"]; let ColFields = ["Silent"]; - let KeyCol = ["1"]; - let ValueCols = [["0"]]; + let KeyCol = [from]; + let ValueCols = [[to]]; } -def getNonFlagSettingOpcode : InstrMapping { - let FilterClass = "FlagSetting"; - let RowFields = ["BaseOpcode", "OperandAddrMode", "DestAddrMode", "ReverseOperands"]; - let ColFields = ["Silent"]; - let KeyCol = ["0"]; - let ValueCols = [["1"]]; -} +def getFlagSettingOpcode : FlipFlagSetting<"PreserveFlags", "SetFlags">; +def getNonFlagSettingOpcode : FlipFlagSetting<"SetFlags", "PreserveFlags">; // Instructions that support swapping arguments // This included non-commutative arithmetic ones: sub, shl, shr, rol, ror, div and @@ -77,21 +68,16 @@ class mod_swap { def NoSwap : mod_swap<0>; def Swap : mod_swap<1>; -def withInsSwapped : InstrMapping { +class FlipInsSwapped : InstrMapping { let FilterClass = "Swappable"; let RowFields = ["BaseOpcode", "OperandAddrMode", "DestAddrMode", "Silent"]; let ColFields = ["ReverseOperands"]; - let KeyCol = ["0"]; - let ValueCols = [["1"]]; + let KeyCol = [from]; + let ValueCols = [[to]]; } -def withInsNotSwapped : InstrMapping { - let FilterClass = "Swappable"; - let RowFields = ["BaseOpcode", "OperandAddrMode", "DestAddrMode", "Silent"]; - let ColFields = ["ReverseOperands"]; - let KeyCol = ["1"]; - let ValueCols = [["0"]]; -} +def withInsSwapped : FlipInsSwapped<"NoSwap", "Swap">; +def withInsNotSwapped : FlipInsSwapped<"Swap", "NoSwap">; class AddrModeRel; // generic map of addressing mode of operands class RetAddrModeRel; // generic map of addressing mode of results @@ -109,21 +95,16 @@ def mapIRInputTo : MapInputFrom<"OpndIR">; def mapCRInputTo : MapInputFrom<"OpndCR">; def mapSRInputTo : MapInputFrom<"OpndSR">; -def withStackResult : InstrMapping { +class WithDifferentResult : InstrMapping { let FilterClass = "RetAddrModeRel"; let RowFields = ["BaseOpcode", "OperandAddrMode", "Silent", "ReverseOperands"]; - let ColFields = ["ResultAM"]; - let KeyCol = ["0"]; - let ValueCols = [["3"]]; + let ColFields = ["DestAddrMode"]; + let KeyCol = [from]; + let ValueCols = [[to]]; } -def withRegisterResult : InstrMapping { - let FilterClass = "RetAddrModeRel"; - let RowFields = ["BaseOpcode", "OperandAddrMode", "Silent", "ReverseOperands"]; - let ColFields = ["ResultAM"]; - let KeyCol = ["3"]; - let ValueCols = [["0"]]; -} +def withStackResult : WithDifferentResult<"ToReg", "ToStack">; +def withRegisterResult : WithDifferentResult<"ToStack", "ToReg">; include "EraVMOpcodes.td" @@ -317,17 +298,16 @@ class IBinary pattern> : IForm { string BaseOpcode; - bit Silent = !eq(set_flags, PreserveFlags); - bit ReverseOperands = !eq(swap, Swap); + mod_set_flags Silent = set_flags; + mod_swap ReverseOperands = swap; SrcOperandMode OperandAddrMode = OpndAddrNotSet; - bits<3> DestAddrMode = DestAddrNotSet.Value; - int ResultAM = 0; + DestOperandMode DestAddrMode = DestAddrNotSet; let AsmString = !strconcat(opcode.Name, !if(!eq(swap, Swap), ".s", ""), !if(!eq(set_flags, SetFlags), "!", ""), "${cc}", "\t", asmstr); - let Defs = !if(Silent, [], [Flags]); + let Defs = !if(!eq(set_flags, PreserveFlags), [], [Flags]); let mayLoad = !or(isStackIn.Value, !eq(src, SrcCodeAddr)); let mayStore = isStackOut.Value; @@ -345,8 +325,7 @@ class IBinaryR { bits<4> rd0; - let DestAddrMode = ToReg.Value; - let ResultAM = 0; + let DestAddrMode = ToReg; let Dst0 = rd0; } @@ -361,8 +340,7 @@ class IBinaryS dst0; - let DestAddrMode = ToStack.Value; - let ResultAM = 3; + let DestAddrMode = ToStack; let Dst0 = dst0{3-0}; let Imm1 = dst0{19-4}; @@ -391,8 +369,6 @@ class Irr_rr { bits<4> rd1; - let DestAddrMode = ToRegReg.Value; - let Dst1 = rd1; } @@ -419,8 +395,6 @@ class Iir_rr { bits<4> rd1; - let DestAddrMode = ToRegReg.Value; - let Dst1 = rd1; } @@ -464,8 +438,6 @@ class Imr_rr { bits<4> rd1; - let DestAddrMode = ToRegReg.Value; - let Dst1 = rd1; } @@ -477,8 +449,6 @@ class Isr_rr { bits<4> rd1; - let DestAddrMode = ToRegReg.Value; - let Dst1 = rd1; } @@ -505,8 +475,6 @@ class Irr_sr { bits<4> rd1; - let DestAddrMode = ToStackReg.Value; - let Dst1 = rd1; } @@ -533,8 +501,6 @@ class Iir_sr { bits<4> rd1; - let DestAddrMode = ToStackReg.Value; - let Dst1 = rd1; } @@ -578,8 +544,6 @@ class Imr_sr { bits<4> rd1; - let DestAddrMode = ToStackReg.Value; - let Dst1 = rd1; } @@ -591,8 +555,6 @@ class Isr_sr { bits<4> rd1; - let DestAddrMode = ToStackReg.Value; - let Dst1 = rd1; }