Currently the DecoderEmitter constructor takes a bunch of string parameters containing bits of code to interpolate. However, there's only two ways it can be called. The one used for most targets which doesn't handle the SoftFail DecoderStatus (not a problem, because they don't use SoftFail). The other mode, which is used for ARM/AArch64, does handle SoftFail, but requires an externally defined helper function in those targets. This is unnecessary complication; remove the parameters, and unify onto a single version which does support SoftFail, defining the helper itself.
45 lines
1.6 KiB
TableGen
45 lines
1.6 KiB
TableGen
// RUN: llvm-tblgen -gen-disassembler -I %p/../../include %s | FileCheck %s
|
|
|
|
include "llvm/Target/Target.td"
|
|
|
|
def archInstrInfo : InstrInfo { }
|
|
|
|
def arch : Target {
|
|
let InstructionSet = archInstrInfo;
|
|
}
|
|
|
|
class TestInstruction : Instruction {
|
|
let Size = 1;
|
|
let OutOperandList = (outs);
|
|
let InOperandList = (ins);
|
|
field bits<8> Inst;
|
|
field bits<8> SoftFail = 0;
|
|
}
|
|
|
|
def InstA : TestInstruction {
|
|
let Inst = {0,0,0,0,0,0,?,?};
|
|
let AsmString = "InstA";
|
|
let DecoderMethod = "DecodeInstA";
|
|
let hasCompleteDecoder = 0;
|
|
}
|
|
|
|
def InstB : TestInstruction {
|
|
let Inst = {0,0,0,?,?,0,1,1};
|
|
let AsmString = "InstB";
|
|
let DecoderMethod = "DecodeInstB";
|
|
let hasCompleteDecoder = 0;
|
|
}
|
|
|
|
// CHECK: /* 0 */ MCD::OPC_ExtractField, 2, 1, // Inst{2} ...
|
|
// CHECK-NEXT: /* 3 */ MCD::OPC_FilterValue, 0, 36, 0, 0, // Skip to: 44
|
|
// CHECK-NEXT: /* 8 */ MCD::OPC_ExtractField, 5, 3, // Inst{7-5} ...
|
|
// CHECK-NEXT: /* 11 */ MCD::OPC_FilterValue, 0, 28, 0, 0, // Skip to: 44
|
|
// CHECK-NEXT: /* 16 */ MCD::OPC_CheckField, 0, 2, 3, 7, 0, 0, // Skip to: 30
|
|
// CHECK-NEXT: /* 23 */ MCD::OPC_TryDecode, {{[0-9]+}}, 1, 0, 0, 0, 0, // Opcode: InstB, skip to: 30
|
|
// CHECK-NEXT: /* 30 */ MCD::OPC_CheckField, 3, 2, 0, 7, 0, 0, // Skip to: 44
|
|
// CHECK-NEXT: /* 37 */ MCD::OPC_TryDecode, {{[0-9]+}}, 1, 1, 0, 0, 0, // Opcode: InstA, skip to: 44
|
|
// CHECK-NEXT: /* 44 */ MCD::OPC_Fail,
|
|
|
|
// CHECK: if (!Check(S, DecodeInstB(MI, insn, Address, Decoder))) { DecodeComplete = false; return MCDisassembler::Fail; }
|
|
// CHECK: if (!Check(S, DecodeInstA(MI, insn, Address, Decoder))) { DecodeComplete = false; return MCDisassembler::Fail; }
|