brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · 7982822 Raw
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