brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · bbae024 Raw
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