diff options
author | James Molloy <jmolloy@google.com> | 2019-09-19 13:39:54 +0000 |
---|---|---|
committer | James Molloy <jmolloy@google.com> | 2019-09-19 13:39:54 +0000 |
commit | 88a5fbfcea79b4711542f0587bed39aa392da12f (patch) | |
tree | f0fe771785e9a746017136a34f0d62752e6054c7 /llvm/test/TableGen | |
parent | b88800d8829b9a6602547e26050fffd528e21822 (diff) | |
download | bcm5719-llvm-88a5fbfcea79b4711542f0587bed39aa392da12f.tar.gz bcm5719-llvm-88a5fbfcea79b4711542f0587bed39aa392da12f.zip |
[TableGen] Support encoding per-HwMode
Much like ValueTypeByHwMode/RegInfoByHwMode, this patch allows targets
to modify an instruction's encoding based on HwMode. When the
EncodingInfos field is non-empty the Inst and Size fields of the Instruction
are ignored and taken from EncodingInfos instead.
As part of this promote getHwMode() from TargetSubtargetInfo to MCSubtargetInfo.
This is NFC for all existing targets - new code is generated only if targets
use EncodingByHwMode.
llvm-svn: 372320
Diffstat (limited to 'llvm/test/TableGen')
-rw-r--r-- | llvm/test/TableGen/HwModeEncodeDecode.td | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/llvm/test/TableGen/HwModeEncodeDecode.td b/llvm/test/TableGen/HwModeEncodeDecode.td new file mode 100644 index 00000000000..b76d8564651 --- /dev/null +++ b/llvm/test/TableGen/HwModeEncodeDecode.td @@ -0,0 +1,81 @@ +// 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 ModeA : HwMode<"+a">; +def ModeB : HwMode<"+b">; + + +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"; +} +} + +// 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: { |