129 lines · plain
1// RUN: llvm-tblgen -gen-instr-info -I %p/../../include %s | FileCheck %s2 3// Check that OpName enum and getNamedOperandIdx are as expected.4 5include "llvm/Target/Target.td"6 7def archInstrInfo : InstrInfo { }8 9def arch : Target {10 let InstructionSet = archInstrInfo;11}12 13class InstBase : Instruction {14 let Namespace = "MyNamespace";15 let UseNamedOperandTable = 1;16 let Size = 1;17 field bits<8> Inst;18}19 20def Reg : Register<"reg">;21def RegClass : RegisterClass<"foo", [i32], 0, (add Reg)>;22 23def OpA : Operand<i32>;24def OpB : Operand<i32>;25 26def RegOp : RegisterOperand<RegClass>;27 28def InstA : InstBase {29 let OutOperandList = (outs OpA:$a);30 let InOperandList = (ins OpB:$b, i32imm:$c);31}32 33def InstB : InstBase {34 let OutOperandList = (outs i32imm:$d);35 let InOperandList = (ins unknown:$x);36}37 38def InstC : InstBase {39 let OutOperandList = (outs RegClass:$d);40 let InOperandList = (ins RegOp:$x);41}42 43// InstD has UseNamedOperandTable = 0, so it won't be handled in44// getNamedOperandIdx().45def InstD : InstBase {46 let OutOperandList = (outs RegClass:$e);47 let InOperandList = (ins RegOp:$f);48 let UseNamedOperandTable = 0;49}50 51defm : RemapAllTargetPseudoPointerOperands<RegClass>;52 53// CHECK-LABEL: #ifdef GET_INSTRINFO_OPERAND_ENUM54// CHECK-NEXT: #undef GET_INSTRINFO_OPERAND_ENUM55// CHECK-EMPTY:56// CHECK-NEXT: namespace llvm::MyNamespace {57// CHECK-EMPTY:58// CHECK-NEXT: enum class OpName : uint8_t {59// CHECK-NEXT: a = 0,60// CHECK-NEXT: b = 1,61// CHECK-NEXT: c = 2,62// CHECK-NEXT: d = 3,63// CHECK-NEXT: x = 4,64// CHECK-NEXT: NUM_OPERAND_NAMES = 5,65// CHECK-NEXT: }; // enum class OpName66// CHECK-EMPTY:67// CHECK-NEXT: LLVM_READONLY int16_t getNamedOperandIdx(uint16_t Opcode, OpName Name);68// CHECK-NEXT: LLVM_READONLY OpName getOperandIdxName(uint16_t Opcode, int16_t Idx);69// CHECK-EMPTY:70// CHECK-NEXT: } // namespace llvm::MyNamespace71// CHECK-EMPTY:72// CHECK-NEXT: #endif // GET_INSTRINFO_OPERAND_ENUM73 74// CHECK-LABEL: #ifdef GET_INSTRINFO_NAMED_OPS75// CHECK-NEXT: #undef GET_INSTRINFO_NAMED_OPS76// CHECK-EMPTY:77// CHECK-NEXT: namespace llvm::MyNamespace {78// CHECK-EMPTY:79// CHECK-NEXT: LLVM_READONLY static uint8_t getInstructionIndexForOpLookup(uint16_t Opcode) {80// CHECK-NEXT: static constexpr uint8_t InstructionIndex[] = {81// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,82// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,83// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,84// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,85// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,86// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,87// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,88// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,89// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,90// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,91// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,92// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,93// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,94// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,95// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,96// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,97// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,98// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,99// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100// CHECK-NEXT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,101// CHECK-NEXT: 1, 2, 2, 0,102// CHECK-NEXT: };103// CHECK-NEXT: return InstructionIndex[Opcode];104// CHECK-NEXT: }105// CHECK-NEXT: LLVM_READONLY int16_t getNamedOperandIdx(uint16_t Opcode, OpName Name) {106// CHECK-NEXT: assert(Name != OpName::NUM_OPERAND_NAMES);107// CHECK-NEXT: static constexpr int8_t OperandMap[][5] = {108// CHECK-NEXT: {-1, -1, -1, -1, -1, },109// CHECK-NEXT: {0, 1, 2, -1, -1, },110// CHECK-NEXT: {-1, -1, -1, 0, 1, },111// CHECK-NEXT: };112// CHECK-NEXT: unsigned InstrIdx = getInstructionIndexForOpLookup(Opcode);113// CHECK-NEXT: return OperandMap[InstrIdx][(unsigned)Name];114// CHECK-NEXT: }115// CHECK-NEXT: LLVM_READONLY OpName getOperandIdxName(uint16_t Opcode, int16_t Idx) {116// CHECK-NEXT: assert(Idx >= 0 && Idx < 3);117// CHECK-NEXT: static constexpr OpName OperandMap[][3] = {118// CHECK-NEXT: {OpName::NUM_OPERAND_NAMES, OpName::NUM_OPERAND_NAMES, OpName::NUM_OPERAND_NAMES, },119// CHECK-NEXT: {OpName::a, OpName::b, OpName::c, },120// CHECK-NEXT: {OpName::d, OpName::x, OpName::NUM_OPERAND_NAMES, },121// CHECK-NEXT: };122// CHECK-NEXT: unsigned InstrIdx = getInstructionIndexForOpLookup(Opcode);123// CHECK-NEXT: return OperandMap[InstrIdx][(unsigned)Idx];124// CHECK-NEXT: }125// CHECK-EMPTY:126// CHECK-NEXT: } // namespace llvm::MyNamespace127// CHECK-EMPTY:128// CHECK-NEXT: #endif // GET_INSTRINFO_NAMED_OPS129