diff --git a/llvm/test/TableGen/FixedLenDecoderEmitter/additional-encoding.td b/llvm/test/TableGen/FixedLenDecoderEmitter/additional-encoding.td new file mode 100644 index 0000000000000..192cb3c3f5858 --- /dev/null +++ b/llvm/test/TableGen/FixedLenDecoderEmitter/additional-encoding.td @@ -0,0 +1,67 @@ +// 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 opc> : Enc { + bits<6> shamt; + let Inst{15...14} = {0, 0}; + let Inst{13...12} = opc; + let Inst{11...6} = shamt; +} + +class EncNOP 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 { + let DecoderMethod = "decodeShAmt"; + let hasCompleteDecoder = false; +} + +class I : Instruction { + let InOperandList = in_ops; + let OutOperandList = out_ops; +} + +// CHECK: /* 0 */ MCD::OPC_ExtractField, 12, 4, // Inst{15-12} ... +// CHECK-NEXT: /* 3 */ MCD::OPC_FilterValue, 0, 14, 0, // Skip to: 21 +// CHECK-NEXT: /* 7 */ MCD::OPC_CheckField, 6, 6, 0, 4, 0, // Skip to: 17 +// CHECK-NEXT: /* 13 */ MCD::OPC_Decode, {{[0-9]+}}, 2, 0, // Opcode: {{.*}}:NOP +// CHECK-NEXT: /* 17 */ MCD::OPC_TryDecodeOrFail, {{[0-9]+}}, 2, 1, +// CHECK-NEXT: /* 21 */ MCD::OPC_FilterValue, 1, 14, 0, // Skip to: 39 +// CHECK-NEXT: /* 25 */ MCD::OPC_CheckField, 6, 6, 0, 4, 0, // Skip to: 35 +// CHECK-NEXT: /* 31 */ MCD::OPC_Decode, {{[0-9]+}}, 2, 0, // Opcode: {{.*}}:NOP +// CHECK-NEXT: /* 35 */ MCD::OPC_TryDecodeOrFail, {{[0-9]+}}, 2, 1, +// CHECK-NEXT: /* 39 */ MCD::OPC_FilterValue, 2, 14, 0, // Skip to: 57 +// CHECK-NEXT: /* 43 */ MCD::OPC_CheckField, 6, 6, 0, 4, 0, // Skip to: 53 +// CHECK-NEXT: /* 49 */ MCD::OPC_Decode, {{[0-9]+}}, 2, 0, // Opcode: {{.*}}:NOP +// CHECK-NEXT: /* 53 */ MCD::OPC_TryDecodeOrFail, {{[0-9]+}}, 2, 1, +// CHECK-NEXT: /* 57 */ MCD::OPC_FilterValueOrFail, 3, +// CHECK-NEXT: /* 59 */ MCD::OPC_CheckField, 6, 6, 0, 4, 0, // Skip to: 69 +// CHECK-NEXT: /* 65 */ MCD::OPC_Decode, {{[0-9]+}}, 2, 0, // Opcode: {{.*}}:NOP +// CHECK-NEXT: /* 69 */ MCD::OPC_TryDecodeOrFail, {{[0-9]+}}, 2, 1, +// CHECK-NEXT: /* 73 */ MCD::OPC_Fail, + +class SHIFT opc> : I<(outs), (ins ShAmtOp:$shamt)>, EncSHIFT; +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, EncNOP<1>; +def : AdditionalEncoding, EncNOP<2>; +def : AdditionalEncoding, EncNOP<3>; + +def II : InstrInfo; + +def MyTarget : Target { + let InstructionSet = II; +} diff --git a/llvm/utils/TableGen/DecoderEmitter.cpp b/llvm/utils/TableGen/DecoderEmitter.cpp index ece92c7b76ec0..25f1d824ffcd9 100644 --- a/llvm/utils/TableGen/DecoderEmitter.cpp +++ b/llvm/utils/TableGen/DecoderEmitter.cpp @@ -2495,7 +2495,9 @@ void DecoderEmitter::parseInstructionEncodings() { ++NumEncodingsOmitted; continue; } + unsigned EncodingID = Encodings.size(); Encodings.emplace_back(EncodingDef, &Target.getInstruction(InstDef)); + EncodingIDsByHwMode[DefaultMode].push_back(EncodingID); } // Do some statistics.