| // RUN: llvm-tblgen -gen-disassembler -I %p/../../../include %s | FileCheck %s | |
| include "llvm/Target/Target.td" | |
| class Enc { | |
| int Size = 2; | |
| bits<16> Inst; | |
| } | |
| class EncSHIFT<bits<2> opc> : Enc { | |
| bits<6> shamt; | |
| let Inst{15...14} = {0, 0}; | |
| let Inst{13...12} = opc; | |
| let Inst{11...6} = shamt; | |
| } | |
| class EncNOP<bits<2> opc> : Enc { | |
| let Inst{15...14} = {0, 0}; | |
| let Inst{13...12} = opc; | |
| let Inst{11...6} = {0, 0, 0, 0, 0, 0}; | |
| } | |
| def ShAmtOp : Operand<i32> { | |
| let DecoderMethod = "decodeShAmt"; | |
| let hasCompleteDecoder = false; | |
| } | |
| class I<dag out_ops, dag in_ops> : Instruction { | |
| let InOperandList = in_ops; | |
| let OutOperandList = out_ops; | |
| } | |
| // CHECK-LABEL: static const uint8_t DecoderTable16[67] = { | |
| // CHECK-NEXT: OPC_SwitchField, 12, 4, // 0: switch Inst[15:12] { | |
| // CHECK-NEXT: 0, 14, // 3: case 0x0: { | |
| // CHECK-NEXT: OPC_Scope, 8, // 5: try { | |
| // CHECK-NEXT: OPC_CheckField, 6, 6, 0, // 7: check Inst[11:6] == 0x0 | |
| // CHECK-NEXT: OPC_Decode, {{[0-9, ]+}}, 0, // 11: decode to NOP using decoder 0 | |
| // CHECK-NEXT: // 11: } else try { | |
| // CHECK-NEXT: OPC_Decode, {{[0-9, ]+}}, 1, // 15: decode to SHIFT0 using decoder 1 | |
| // CHECK-NEXT: // 15: } | |
| // CHECK-NEXT: // 15: } | |
| // CHECK-NEXT: 1, 14, // 19: case 0x1: { | |
| // CHECK-NEXT: OPC_Scope, 8, // 21: try { | |
| // CHECK-NEXT: OPC_CheckField, 6, 6, 0, // 23: check Inst[11:6] == 0x0 | |
| // CHECK-NEXT: OPC_Decode, {{[0-9, ]+}}, 0, // 27: decode to {{.*}}:NOP using decoder 0 | |
| // CHECK-NEXT: // 27: } else try { | |
| // CHECK-NEXT: OPC_Decode, {{[0-9, ]+}}, 1, // 31: decode to SHIFT1 using decoder 1 | |
| // CHECK-NEXT: // 31: } | |
| // CHECK-NEXT: // 31: } | |
| // CHECK-NEXT: 2, 14, // 35: case 0x2: { | |
| // CHECK-NEXT: OPC_Scope, 8, // 37: try { | |
| // CHECK-NEXT: OPC_CheckField, 6, 6, 0, // 39: check Inst[11:6] == 0x0 | |
| // CHECK-NEXT: OPC_Decode, {{[0-9, ]+}}, 0, // 43: decode to {{.*}}:NOP using decoder 0 | |
| // CHECK-NEXT: // 43: } else try { | |
| // CHECK-NEXT: OPC_Decode, {{[0-9, ]+}}, 1, // 47: decode to SHIFT2 using decoder 1 | |
| // CHECK-NEXT: // 47: } | |
| // CHECK-NEXT: // 47: } | |
| // CHECK-NEXT: 3, 0, // 51: case 0x3: { | |
| // CHECK-NEXT: OPC_Scope, 8, // 53: try { | |
| // CHECK-NEXT: OPC_CheckField, 6, 6, 0, // 55: check Inst[11:6] == 0x0 | |
| // CHECK-NEXT: OPC_Decode, {{[0-9, ]+}}, 0, // 59: decode to {{.*}}:NOP using decoder 0 | |
| // CHECK-NEXT: // 59: } else try { | |
| // CHECK-NEXT: OPC_Decode, {{[0-9, ]+}}, 1, // 63: decode to SHIFT3 using decoder 1 | |
| // CHECK-NEXT: // 63: } | |
| // CHECK-NEXT: // 63: } | |
| // CHECK-NEXT: // 63: } // switch Inst[15:12] | |
| // CHECK-NEXT: }; | |
| class SHIFT<bits<2> opc> : I<(outs), (ins ShAmtOp:$shamt)>, EncSHIFT<opc>; | |
| def SHIFT0 : SHIFT<0>; | |
| def SHIFT1 : SHIFT<1>; | |
| def SHIFT2 : SHIFT<2>; | |
| def SHIFT3 : SHIFT<3>; | |
| def NOP : I<(outs), (ins)>, EncNOP<0>; | |
| def : AdditionalEncoding<NOP>, EncNOP<1>; | |
| def : AdditionalEncoding<NOP>, EncNOP<2>; | |
| def : AdditionalEncoding<NOP>, EncNOP<3>; | |
| def II : InstrInfo; | |
| def MyTarget : Target { | |
| let InstructionSet = II; | |
| } |