aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/TableGen/DecoderEmitter/additional-encoding.td
blob: 2652407191a572a063162ec1daefe1f83bf4ba34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// 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<bits<2> opc> : Enc {
  bits<6> shamt;
  let Inst{15...14} = {0, 0};
  let Inst{13...12} = opc;
  let Inst{11...6} = shamt;
}

class EncNOP<bits<2> 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<i32> {
  let DecoderMethod = "decodeShAmt";
  let hasCompleteDecoder = false;
}

class I<dag out_ops, dag in_ops> : Instruction {
  let InOperandList = in_ops;
  let OutOperandList = out_ops;
}

// CHECK-LABEL: static const uint8_t DecoderTable16[67] = {
// CHECK-NEXT:    OPC_SwitchField, 12, 4,      //  0: switch Inst[15:12] {
// CHECK-NEXT:    0, 14,                       //  3: case 0x0: {
// CHECK-NEXT:    OPC_Scope, 8,                //  5:  try {
// CHECK-NEXT:    OPC_CheckField, 6, 6, 0,     //  7:   check Inst[11:6] == 0x0
// CHECK-NEXT:    OPC_Decode, {{[0-9, ]+}}, 0, // 11:   decode to NOP using decoder 0
// CHECK-NEXT:                                 // 11:  } else try {
// CHECK-NEXT:    OPC_Decode, {{[0-9, ]+}}, 1, // 15:   decode to SHIFT0 using decoder 1
// CHECK-NEXT:                                 // 15:  }
// CHECK-NEXT:                                 // 15: }
// CHECK-NEXT:    1, 14,                       // 19: case 0x1: {
// CHECK-NEXT:    OPC_Scope, 8,                // 21:  try {
// CHECK-NEXT:    OPC_CheckField, 6, 6, 0,     // 23:   check Inst[11:6] == 0x0
// CHECK-NEXT:    OPC_Decode, {{[0-9, ]+}}, 0, // 27:   decode to {{.*}}:NOP using decoder 0
// CHECK-NEXT:                                 // 27:  } else try {
// CHECK-NEXT:    OPC_Decode, {{[0-9, ]+}}, 1, // 31:   decode to SHIFT1 using decoder 1
// CHECK-NEXT:                                 // 31:  }
// CHECK-NEXT:                                 // 31: }
// CHECK-NEXT:    2, 14,                       // 35: case 0x2: {
// CHECK-NEXT:    OPC_Scope, 8,                // 37:  try {
// CHECK-NEXT:    OPC_CheckField, 6, 6, 0,     // 39:   check Inst[11:6] == 0x0
// CHECK-NEXT:    OPC_Decode, {{[0-9, ]+}}, 0, // 43:   decode to {{.*}}:NOP using decoder 0
// CHECK-NEXT:                                 // 43:  } else try {
// CHECK-NEXT:    OPC_Decode, {{[0-9, ]+}}, 1, // 47:   decode to SHIFT2 using decoder 1
// CHECK-NEXT:                                 // 47:  }
// CHECK-NEXT:                                 // 47: }
// CHECK-NEXT:    3, 0,                        // 51: case 0x3: {
// CHECK-NEXT:    OPC_Scope, 8,                // 53:  try {
// CHECK-NEXT:    OPC_CheckField, 6, 6, 0,     // 55:   check Inst[11:6] == 0x0
// CHECK-NEXT:    OPC_Decode, {{[0-9, ]+}}, 0, // 59:   decode to {{.*}}:NOP using decoder 0
// CHECK-NEXT:                                 // 59:  } else try {
// CHECK-NEXT:    OPC_Decode, {{[0-9, ]+}}, 1, // 63:   decode to SHIFT3 using decoder 1
// CHECK-NEXT:                                 // 63:  }
// CHECK-NEXT:                                 // 63: }
// CHECK-NEXT:                                 // 63: } // switch Inst[15:12]
// CHECK-NEXT:  };

class SHIFT<bits<2> opc> : I<(outs), (ins ShAmtOp:$shamt)>, EncSHIFT<opc>;
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<NOP>, EncNOP<1>;
def : AdditionalEncoding<NOP>, EncNOP<2>;
def : AdditionalEncoding<NOP>, EncNOP<3>;

def II : InstrInfo;

def MyTarget : Target {
  let InstructionSet = II;
}