Use the predicate condition instead of checkFeatures in *GenDAGISel.inc. This makes the code similar to isel pattern predicates. checkFeatures is still used by code created by SubtargetEmitter so we can't remove the string. Backends need to be careful to keep the string and predicates in sync, but I don't think that's a big issue. I haven't measured it, but this should be a compile time improvement for isel since we don't have to do any of the string processing that's inside checkFeatures. Reviewed By: kparzysz Differential Revision: https://reviews.llvm.org/D146012
94 lines
2.4 KiB
TableGen
94 lines
2.4 KiB
TableGen
// RUN: llvm-tblgen -gen-emitter -I %p/../../include %s | FileCheck %s --check-prefix=ENCODER
|
|
// RUN: llvm-tblgen -gen-disassembler -I %p/../../include %s | FileCheck %s --check-prefix=DECODER
|
|
|
|
include "llvm/Target/Target.td"
|
|
|
|
def archInstrInfo : InstrInfo { }
|
|
|
|
def arch : Target {
|
|
let InstructionSet = archInstrInfo;
|
|
}
|
|
|
|
def Myi32 : Operand<i32> {
|
|
let DecoderMethod = "DecodeMyi32";
|
|
}
|
|
|
|
def HasA : Predicate<"Subtarget->hasA()">;
|
|
def HasB : Predicate<"Subtarget->hasB()">;
|
|
|
|
def ModeA : HwMode<"+a", [HasA]>;
|
|
def ModeB : HwMode<"+b", [HasB]>;
|
|
|
|
|
|
def fooTypeEncA : InstructionEncoding {
|
|
let Size = 4;
|
|
field bits<32> SoftFail = 0;
|
|
bits<32> Inst;
|
|
bits<8> factor;
|
|
let Inst{7...0} = factor;
|
|
let Inst{3...2} = 0b11;
|
|
let Inst{1...0} = 0b00;
|
|
}
|
|
|
|
def fooTypeEncB : InstructionEncoding {
|
|
let Size = 4;
|
|
field bits<32> SoftFail = 0;
|
|
bits<32> Inst;
|
|
bits<8> factor;
|
|
let Inst{15...8} = factor;
|
|
let Inst{1...0} = 0b11;
|
|
}
|
|
|
|
let OutOperandList = (outs) in {
|
|
def foo : Instruction {
|
|
let InOperandList = (ins i32imm:$factor);
|
|
let EncodingInfos = EncodingByHwMode<
|
|
[ModeA, ModeB], [fooTypeEncA,
|
|
fooTypeEncB]
|
|
>;
|
|
let AsmString = "foo $factor";
|
|
}
|
|
|
|
def bar: Instruction {
|
|
let InOperandList = (ins i32imm:$factor);
|
|
let Size = 4;
|
|
bits<32> Inst;
|
|
bits<32> SoftFail;
|
|
bits<8> factor;
|
|
let Inst{31...24} = factor;
|
|
let Inst{1...0} = 0b10;
|
|
let AsmString = "bar $factor";
|
|
}
|
|
|
|
def baz : Instruction {
|
|
let InOperandList = (ins i32imm:$factor);
|
|
bits<32> Inst;
|
|
let EncodingInfos = EncodingByHwMode<
|
|
[ModeB], [fooTypeEncA]
|
|
>;
|
|
let AsmString = "foo $factor";
|
|
}
|
|
}
|
|
|
|
// DECODER-LABEL: DecoderTable_ModeA32[] =
|
|
// DECODER-DAG: Opcode: fooTypeEncA:foo
|
|
// DECODER-DAG: Opcode: bar
|
|
// DECODER-LABEL: DecoderTable_ModeB32[] =
|
|
// Note that the comment says fooTypeEncA but this is actually fooTypeEncB; plumbing
|
|
// the correct comment text through the decoder is nontrivial.
|
|
// DECODER-DAG: Opcode: fooTypeEncA:foo
|
|
// DECODER-DAG: Opcode: bar
|
|
|
|
// ENCODER-LABEL: static const uint64_t InstBits_ModeA[] = {
|
|
// ENCODER: UINT64_C(2), // bar
|
|
// ENCODER: UINT64_C(12), // foo
|
|
|
|
// ENCODER-LABEL: static const uint64_t InstBits_ModeB[] = {
|
|
// ENCODER: UINT64_C(2), // bar
|
|
// ENCODER: UINT64_C(3), // foo
|
|
|
|
// ENCODER: case ::foo: {
|
|
// ENCODER: switch (HwMode) {
|
|
// ENCODER: default: llvm_unreachable("Unhandled HwMode");
|
|
// ENCODER: case 1: {
|