xref: /llvm-project/llvm/test/TableGen/HwModeEncodeDecode.td (revision 2ed0aacf973d628d5abae79229e251e034831dd3)
1// RUN: llvm-tblgen -gen-emitter -I %p/../../include %s | FileCheck %s --check-prefix=ENCODER
2// RUN: llvm-tblgen -gen-disassembler -I %p/../../include %s | FileCheck %s --check-prefix=DECODER
3
4include "llvm/Target/Target.td"
5
6def archInstrInfo : InstrInfo { }
7
8def arch : Target {
9    let InstructionSet = archInstrInfo;
10}
11
12def  Myi32  : Operand<i32> {
13  let DecoderMethod = "DecodeMyi32";
14}
15
16def HasA : Predicate<"Subtarget->hasA()">;
17def HasB : Predicate<"Subtarget->hasB()">;
18
19def ModeA : HwMode<"+a", [HasA]>;
20def ModeB : HwMode<"+b", [HasB]>;
21
22
23def fooTypeEncA : InstructionEncoding {
24  let Size = 4;
25  field bits<32> SoftFail = 0;
26  bits<32> Inst;
27  bits<8> factor;
28  let Inst{7...0} = factor;
29  let Inst{3...2} = 0b11;
30  let Inst{1...0} = 0b00;
31}
32
33def fooTypeEncB : InstructionEncoding {
34  let Size = 4;
35  field bits<32> SoftFail = 0;
36  bits<32> Inst;
37  bits<8> factor;
38  let Inst{15...8} = factor;
39  let Inst{1...0} = 0b11;
40}
41
42let OutOperandList = (outs) in {
43def foo : Instruction {
44  let InOperandList = (ins i32imm:$factor);
45  let EncodingInfos = EncodingByHwMode<
46    [ModeA, ModeB], [fooTypeEncA,
47                      fooTypeEncB]
48  >;
49  let AsmString = "foo  $factor";
50}
51
52def bar: Instruction {
53  let InOperandList = (ins i32imm:$factor);
54  let Size = 4;
55  bits<32> Inst;
56  bits<32> SoftFail;
57  bits<8> factor;
58  let Inst{31...24} = factor;
59  let Inst{1...0} = 0b10;
60  let AsmString = "bar  $factor";
61}
62
63def baz : Instruction {
64  let InOperandList = (ins i32imm:$factor);
65  bits<32> Inst;
66  let EncodingInfos = EncodingByHwMode<
67    [ModeB], [fooTypeEncA]
68  >;
69  let AsmString = "foo  $factor";
70}
71}
72
73// DECODER-LABEL: DecoderTable_ModeA32[] =
74// DECODER-DAG: Opcode: fooTypeEncA:foo
75// DECODER-DAG: Opcode: bar
76// DECODER-LABEL: DecoderTable_ModeB32[] =
77// DECODER-DAG: Opcode: fooTypeEncB:foo
78// DECODER-DAG: Opcode: fooTypeEncA:baz
79// DECODER-DAG: Opcode: bar
80
81// ENCODER-LABEL:   static const uint64_t InstBits_ModeA[] = {
82// ENCODER:         UINT64_C(2),        // bar
83// ENCODER:         UINT64_C(12),       // foo
84
85// ENCODER-LABEL:   static const uint64_t InstBits_ModeB[] = {
86// ENCODER:         UINT64_C(2),        // bar
87// ENCODER:         UINT64_C(3),        // foo
88
89// ENCODER:     case ::foo: {
90// ENCODER:      switch (HwMode) {
91// ENCODER:      default: llvm_unreachable("Unhandled HwMode");
92// ENCODER:      case 1: {
93