brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · 82d9994 Raw
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