111 lines · plain
1// RUN: llvm-tblgen -gen-emitter -I %p/../../include %s | FileCheck %s2 3// Verify VarLenCodeEmitterGen using EncodingInfos with different HwModes.4 5include "llvm/Target/Target.td"6 7def ArchInstrInfo : InstrInfo { }8 9def Arch : Target {10 let InstructionSet = ArchInstrInfo;11}12 13def Reg : Register<"reg">;14 15def RegClass : RegisterClass<"foo", [i64], 0, (add Reg)>;16 17def GR64 : RegisterOperand<RegClass>;18 19def HasA : Predicate<"Subtarget->hasA()">;20def HasB : Predicate<"Subtarget->hasB()">;21 22def ModeA : HwMode<[HasA]>;23def ModeB : HwMode<[HasB]>;24 25def fooTypeEncA : InstructionEncoding {26 dag Inst = (descend27 (operand "$src", 4),28 (operand "$dst", 4),29 0b0000000130 );31}32 33def fooTypeEncB : InstructionEncoding {34 dag Inst = (descend35 (operand "$dst", 4),36 (operand "$src", 4),37 0b0000001038 );39}40 41def fooTypeEncC : InstructionEncoding {42 dag Inst = (descend43 (operand "$dst", 4),44 (operand "$src", 4),45 0b0000010046 );47}48 49class VarLenInst : Instruction {50 let AsmString = "foo $src, $dst";51 let OutOperandList = (outs GR64:$dst);52 let InOperandList = (ins GR64:$src);53}54 55// Defined in both HwModes56def foo : VarLenInst {57 let EncodingInfos = EncodingByHwMode<58 [ModeA, ModeB],59 [fooTypeEncA, fooTypeEncB]60 >;61}62 63// Same encoding in any HwMode64def bar : VarLenInst {65 dag Inst = (descend66 (operand "$dst", 4),67 (operand "$src", 4),68 0b0000001169 );70}71 72// Only defined in HwMode B.73def baz : VarLenInst {74 let EncodingInfos = EncodingByHwMode<75 [ModeB],76 [fooTypeEncC]77 >;78}79 80// CHECK: static const uint64_t InstBits_ModeA[] = {81// CHECK: UINT64_C(3), // bar82// CHECK: UINT64_C(1), // foo83 84// CHECK: static const uint64_t InstBits_ModeB[] = {85// CHECK: UINT64_C(3), // bar86// CHECK: UINT64_C(4), // baz87// CHECK: UINT64_C(2), // foo88 89// CHECK: auto getInstBits_ModeA =90// CHECK: Idx = Index_ModeA91 92// CHECK: auto getInstBits_ModeB =93// CHECK: Idx = Index_ModeB94 95// CHECK: case ::bar: {96// CHECK-NOT: switch (Mode) {97// CHECK: Inst = getInstBits_ModeA98 99// CHECK: case ::foo: {100// CHECK: switch (Mode) {101// CHECK: case 1: {102// CHECK: Inst = getInstBits_ModeA103// CHECK: case 2: {104// CHECK: Inst = getInstBits_ModeB105 106// CHECK: case ::baz: {107// CHECK: case 1: {108// CHECK: llvm_unreachable("Undefined encoding in this mode");109// CHECK: case 2: {110// CHECK: Inst = getInstBits_ModeB111