248 lines · plain
1// This testcase is to test the correctness of HwMode encoding under the 'APInt' Mode.2// RUN: llvm-tblgen -gen-emitter -I %p/../../include %s | \3// RUN: FileCheck %s --check-prefix=ENCODER4 5include "llvm/Target/Target.td"6 7def archInstrInfo : InstrInfo { }8 9def arch : Target {10 let InstructionSet = archInstrInfo;11}12 13def Myi32 : Operand<i32> {14 let DecoderMethod = "DecodeMyi32";15}16 17def HasA : Predicate<"Subtarget->hasA()">;18def HasB : Predicate<"Subtarget->hasB()">;19 20def ModeA : HwMode<[HasA]>; // Mode 121def ModeB : HwMode<[HasB]>; // Mode 222def ModeC : HwMode<[]>; // Mode 323 24 25def fooTypeEncDefault : InstructionEncoding {26 let Size = 16;27 field bits<128> SoftFail = 0;28 bits<128> Inst;29 bits<8> factor;30 let Inst{127...120} = factor;31 let Inst{3...2} = 0b10;32 let Inst{1...0} = 0b00;33}34 35def fooTypeEncA : InstructionEncoding {36 let Size = 16;37 field bits<128> SoftFail = 0;38 bits<128> Inst;39 bits<8> factor;40 let Inst{119...112} = factor;41 let Inst{3...2} = 0b11;42 let Inst{1...0} = 0b00;43}44 45def fooTypeEncB : InstructionEncoding {46 let Size = 16;47 field bits<128> SoftFail = 0;48 bits<128> Inst;49 bits<8> factor;50 let Inst{119...112} = factor;51 let Inst{111...110} = 0b11;52}53 54def fooTypeEncC : InstructionEncoding {55 let Size = 16;56 field bits<128> SoftFail = 0;57 bits<128> Inst;58 bits<8> factor;59 let Inst{31...24} = factor;60 let Inst{23...21} = 0b110;61 let Inst{1...0} = 0b11;62}63 64// Test for DefaultMode as a selector.65def foo : Instruction {66 bits<128> Inst;67 let OutOperandList = (outs);68 let InOperandList = (ins i32imm:$factor);69 let EncodingInfos = EncodingByHwMode<70 [ModeC, ModeA, ModeB, DefaultMode],71 [fooTypeEncC, fooTypeEncA, fooTypeEncB, fooTypeEncDefault]>;72 let AsmString = "foo $factor";73}74 75def bar: Instruction {76 let OutOperandList = (outs);77 let InOperandList = (ins i32imm:$factor);78 let Size = 4;79 bits<32> Inst;80 bits<32> SoftFail;81 bits<8> factor;82 let Inst{31...24} = factor;83 let Inst{1...0} = 0b10;84 let AsmString = "bar $factor";85}86 87def baz : Instruction {88 let OutOperandList = (outs);89 let InOperandList = (ins i32imm:$factor);90 bits<32> Inst;91 let EncodingInfos = EncodingByHwMode<92 [ModeB], [fooTypeEncA]93 >;94 let AsmString = "foo $factor";95}96 97def unrelated: Instruction {98 let OutOperandList = (outs);99 let DecoderNamespace = "Alt";100 let InOperandList = (ins i32imm:$factor);101 let Size = 4;102 bits<32> Inst;103 bits<32> SoftFail;104 bits<8> factor;105 let Inst{31...24} = factor;106 let Inst{1...0} = 0b10;107 let AsmString = "unrelated $factor";108}109 110// For 'bar' and 'unrelated', we didn't assign any HwModes for them,111// they should keep the same in the following four tables.112// For 'foo' we assigned four HwModes( includes 'DefaultMode' ),113// it's encodings should be different in the following four tables.114// For 'baz' we only assigned ModeB for it, so it will be presented115// as '0' in the tables of ModeA, ModeC and Default Mode.116// ENCODER-LABEL: static const uint64_t InstBits[] = {117// ENCODER-NEXT: UINT64_C(2), UINT64_C(0), // bar118// ENCODER-NEXT: UINT64_C(0), UINT64_C(0), // baz119// ENCODER-NEXT: UINT64_C(8), UINT64_C(0), // foo120// ENCODER-NEXT: UINT64_C(2), UINT64_C(0), // unrelated121// ENCODER-NEXT: };122// ENCODER-LABEL: static const uint64_t InstBits_ModeA[] = {123// ENCODER-NEXT: UINT64_C(2), UINT64_C(0), // bar124// ENCODER-NEXT: UINT64_C(0), UINT64_C(0), // baz125// ENCODER-NEXT: UINT64_C(12), UINT64_C(0), // foo126// ENCODER-NEXT: UINT64_C(2), UINT64_C(0), // unrelated127// ENCODER-NEXT: };128// ENCODER-LABEL: static const uint64_t InstBits_ModeB[] = {129// ENCODER-NEXT: UINT64_C(2), UINT64_C(0), // bar130// ENCODER-NEXT: UINT64_C(12), UINT64_C(0), // baz131// ENCODER-NEXT: UINT64_C(0), UINT64_C(211106232532992), // foo132// ENCODER-NEXT: UINT64_C(2), UINT64_C(0), // unrelated133// ENCODER-NEXT: };134// ENCODER-LABEL: static const uint64_t InstBits_ModeC[] = {135// ENCODER-NEXT: UINT64_C(2), UINT64_C(0), // bar136// ENCODER-NEXT: UINT64_C(0), UINT64_C(0), // baz137// ENCODER-NEXT: UINT64_C(12582915), UINT64_C(0), // foo138// ENCODER-NEXT: UINT64_C(2), UINT64_C(0), // unrelated139// ENCODER-NEXT: };140 141// ENCODER: const uint64_t *InstBitsByHw;142// ENCODER: constexpr unsigned FirstSupportedOpcode143// ENCODER: const unsigned opcode = MI.getOpcode();144// ENCODER: if (opcode < FirstSupportedOpcode)145// ENCODER: unsigned TableIndex = opcode - FirstSupportedOpcode146// ENCODER: if (Scratch.getBitWidth() != 128)147// ENCODER: Scratch = Scratch.zext(128);148// ENCODER: Inst = APInt(128, ArrayRef(InstBits + TableIndex * 2, 2));149// ENCODER: APInt &Value = Inst;150// ENCODER: APInt &op = Scratch;151// ENCODER: switch (opcode) {152// ENCODER-LABEL: case ::bar:153// ENCODER-LABEL: case ::unrelated:154// ENCODER-NOT: getHwMode155// ENCODER-LABEL: case ::foo: {156// ENCODER: unsigned HwMode = STI.getHwMode(MCSubtargetInfo::HwMode_EncodingInfo);157// ENCODER: switch (HwMode) {158// ENCODER: default: llvm_unreachable("Unknown hardware mode!"); break;159// ENCODER: case 0: InstBitsByHw = InstBits; break;160// ENCODER: case 1: InstBitsByHw = InstBits_ModeA; break;161// ENCODER: case 2: InstBitsByHw = InstBits_ModeB; break;162// ENCODER: case 3: InstBitsByHw = InstBits_ModeC; break;163// ENCODER: };164// ENCODER: Inst = APInt(128, ArrayRef(InstBitsByHw + TableIndex * 2, 2));165// ENCODER: Value = Inst;166// ENCODER: switch (HwMode) {167// ENCODER: default: llvm_unreachable("Unhandled HwMode");168// ENCODER: case 0: {169// ENCODER: op.clearAllBits();170// ENCODER: getMachineOpValue(MI, MI.getOperand(0), op, Fixups, STI);171// ENCODER: Value.insertBits(op.extractBitsAsZExtValue(8, 0), 120, 8);172// ENCODER: break;173// ENCODER: }174// ENCODER: case 1: {175// ENCODER: op.clearAllBits();176// ENCODER: getMachineOpValue(MI, MI.getOperand(0), op, Fixups, STI);177// ENCODER: Value.insertBits(op.extractBitsAsZExtValue(8, 0), 112, 8);178// ENCODER: break;179// ENCODER: }180// ENCODER: case 2: {181// ENCODER: op.clearAllBits();182// ENCODER: getMachineOpValue(MI, MI.getOperand(0), op, Fixups, STI);183// ENCODER: Value.insertBits(op.extractBitsAsZExtValue(8, 0), 112, 8);184// ENCODER: break;185// ENCODER: }186// ENCODER: case 3: {187// ENCODER: op.clearAllBits();188// ENCODER: getMachineOpValue(MI, MI.getOperand(0), op, Fixups, STI);189// ENCODER: Value.insertBits(op.extractBitsAsZExtValue(8, 0), 24, 8);190// ENCODER: break;191// ENCODER: }192// ENCODER-LABEL: case ::baz: {193// ENCODER: unsigned HwMode = STI.getHwMode(MCSubtargetInfo::HwMode_EncodingInfo);194// ENCODER: switch (HwMode) {195// ENCODER: default: llvm_unreachable("Unknown hardware mode!"); break;196// ENCODER: case 2: InstBitsByHw = InstBits_ModeB; break;197// ENCODER: };198// ENCODER: Inst = APInt(128, ArrayRef(InstBitsByHw + TableIndex * 2, 2));199// ENCODER: Value = Inst;200// ENCODER: switch (HwMode) {201// ENCODER: default: llvm_unreachable("Unhandled HwMode");202// ENCODER: case 2: {203// ENCODER: getMachineOpValue(MI, MI.getOperand(0), op, Fixups, STI);204// ENCODER: Value.insertBits(op.extractBitsAsZExtValue(8, 0), 112, 8);205// ENCODER: break;206// ENCODER: }207 208// ENCODER-LABEL: uint32_t archMCCodeEmitter::getOperandBitOffset209// ENCODER: switch (MI.getOpcode()) {210// ENCODER-LABEL: case ::bar:211// ENCODER-LABEL: case ::unrelated: {212// ENCODER-NOT: getHwMode213// ENCODER-LABEL: case ::foo: {214// ENCODER: unsigned HwMode = STI.getHwMode(MCSubtargetInfo::HwMode_EncodingInfo);215// ENCODER: switch (HwMode) {216// ENCODER: default: llvm_unreachable("Unhandled HwMode");217// ENCODER: case 0: {218// ENCODER: switch (OpNum) {219// ENCODER: case 0:220// ENCODER: return 120;221// ENCODER: }222// ENCODER: break;223// ENCODER: }224// ENCODER: case 1: {225// ENCODER: switch (OpNum) {226// ENCODER: case 0:227// ENCODER: return 112;228// ENCODER: }229// ENCODER: break;230// ENCODER: }231// ENCODER: case 2: {232// ENCODER: switch (OpNum) {233// ENCODER: case 0:234// ENCODER: return 112;235// ENCODER: }236// ENCODER: break;237// ENCODER: }238// ENCODER: case 3: {239// ENCODER: switch (OpNum) {240// ENCODER: case 0:241// ENCODER: return 24;242// ENCODER: }243// ENCODER: break;244// ENCODER: }245// ENCODER: }246// ENCODER: break;247// ENCODER: }248