212 lines · plain
1// RUN: llvm-tblgen -gen-global-isel -I %p/../../../include -I %p/../Common -optimize-match-table=false %s -o %t.hwmode-non-optimized.cpp2// RUN: FileCheck %s --check-prefixes=CHECK -input-file=%t.hwmode-non-optimized.cpp3 4include "llvm/Target/Target.td"5 6def MyTargetISA : InstrInfo;7def MyTarget : Target { let InstructionSet = MyTargetISA; }8 9class MyTargetGenericInstruction : GenericInstruction {10 let Namespace = "MyTarget";11}12 13//def Has32 : Predicate<"Subtarget->has32()">;14def Has64 : Predicate<"Subtarget->has64()">;15 16//def Mode32 : HwMode<[Has32]>;17def Mode64 : HwMode<[Has64]>;18 19def ModeVT : ValueTypeByHwMode<[DefaultMode, Mode64],20 [i32, i64]>;21def ModeRI : RegInfoByHwMode<22 [DefaultMode, Mode64],23 [RegInfo<32,32,32>, RegInfo<64,64,64>]>;24 25def R0 : Register<"r0"> { let Namespace = "MyTarget"; }26def GPR : RegisterClass<"MyTarget", [ModeVT], 32, (add R0)> {27 let RegInfos = ModeRI;28}29 30def p0 : PtrValueTypeByHwMode<ModeVT, 0>;31 32class I<dag OOps, dag IOps, list<dag> Pat>33 : Instruction {34 let Namespace = "MyTarget";35 let OutOperandList = OOps;36 let InOperandList = IOps;37 let Pattern = Pat;38}39 40//===- Test the function boilerplate. -------------------------------------===//41 42// CHECK: const unsigned MAX_SUBTARGET_PREDICATES = 2;43// CHECK: using PredicateBitset = llvm::Bitset<MAX_SUBTARGET_PREDICATES>;44 45// CHECK-LABEL: #ifdef GET_GLOBALISEL_TEMPORARIES_DECL46// CHECK-NEXT: mutable MatcherState State;47// CHECK-NEXT: typedef ComplexRendererFns(MyTargetInstructionSelector::*ComplexMatcherMemFn)(MachineOperand &) const;48// CHECK-NEXT: typedef void(MyTargetInstructionSelector::*CustomRendererFn)(MachineInstrBuilder &, const MachineInstr &, int) const;49// CHECK-NEXT: const ExecInfoTy<PredicateBitset, ComplexMatcherMemFn, CustomRendererFn> ExecInfo;50// CHECK-NEXT: static MyTargetInstructionSelector::ComplexMatcherMemFn ComplexPredicateFns[];51// CHECK-NEXT: static MyTargetInstructionSelector::CustomRendererFn CustomRenderers[];52// CHECK-NEXT: bool testImmPredicate_I64(unsigned PredicateID, int64_t Imm) const override;53// CHECK-NEXT: bool testImmPredicate_APInt(unsigned PredicateID, const APInt &Imm) const override;54// CHECK-NEXT: bool testImmPredicate_APFloat(unsigned PredicateID, const APFloat &Imm) const override;55// CHECK-NEXT: const uint8_t *getMatchTable() const override;56// CHECK-NEXT: bool testMIPredicate_MI(unsigned PredicateID, const MachineInstr &MI, const MatcherState &State) const override;57// CHECK-NEXT: bool testMOPredicate_MO(unsigned PredicateID, const MachineOperand &MO, const MatcherState &State) const override;58// CHECK-NEXT: bool testSimplePredicate(unsigned PredicateID) const override;59// CHECK-NEXT: bool runCustomAction(unsigned FnID, const MatcherState &State, NewMIVector &OutMIs) const override;60// CHECK-NEXT: #endif // ifdef GET_GLOBALISEL_TEMPORARIES_DECL61 62// CHECK-LABEL: #ifdef GET_GLOBALISEL_TEMPORARIES_INIT63// CHECK-NEXT: , State(0),64// CHECK-NEXT: ExecInfo(TypeObjects, NumTypeObjects, FeatureBitsets, ComplexPredicateFns, CustomRenderers)65// CHECK-NEXT: #endif // ifdef GET_GLOBALISEL_TEMPORARIES_INIT66 67// CHECK-LABEL: // LLT Objects.68// CHECK-NEXT: enum {69// CHECK-NEXT: GILLT_p0s32,70// CHECK-NEXT: GILLT_p0s64,71// CHECK-NEXT: GILLT_s32,72// CHECK-NEXT: GILLT_s64,73// CHECK-NEXT: }74// CHECK-NEXT: const static size_t NumTypeObjects = 4;75// CHECK-NEXT: const static LLT TypeObjects[] = {76// CHECK-NEXT: LLT::pointer(0, 32),77// CHECK-NEXT: LLT::pointer(0, 64),78// CHECK-NEXT: LLT::scalar(32),79// CHECK-NEXT: LLT::scalar(64),80// CHECK-NEXT: };81 82// CHECK-LABEL: enum SubtargetFeatureBits : uint8_t {83// CHECK-NEXT: Feature_HwMode1Bit = 1,84// CHECK-NEXT: Feature_HwMode0Bit = 0,85// CHECK-NEXT: };86 87// CHECK-LABEL: PredicateBitset MyTargetInstructionSelector::88// CHECK-NEXT: computeAvailableModuleFeatures(const MyTargetSubtarget *Subtarget) const {89// CHECK-NEXT: PredicateBitset Features{};90// CHECK-NEXT: if (!((Subtarget->has64())))91// CHECK-NEXT: Features.set(Feature_HwMode1Bit);92// CHECK-NEXT: if ((Subtarget->has64()))93// CHECK-NEXT: Features.set(Feature_HwMode0Bit);94// CHECK-NEXT: return Features;95// CHECK-NEXT: }96 97// CHECK-LABEL: PredicateBitset MyTargetInstructionSelector::98// CHECK-NEXT: computeAvailableFunctionFeatures(const MyTargetSubtarget *Subtarget, const MachineFunction *MF) const {99// CHECK-NEXT: PredicateBitset Features{};100// CHECK-NEXT: return Features;101// CHECK-NEXT: }102 103// CHECK-LABEL: // Feature bitsets.104// CHECK-NEXT: enum {105// CHECK-NEXT: GIFBS_Invalid,106// CHECK-NEXT: GIFBS_HwMode0,107// CHECK-NEXT: GIFBS_HwMode1,108// CHECK-NEXT: }109// CHECK-NEXT: constexpr static PredicateBitset FeatureBitsets[] {110// CHECK-NEXT: {}, // GIFBS_Invalid111// CHECK-NEXT: {Feature_HwMode0Bit, },112// CHECK-NEXT: {Feature_HwMode1Bit, },113// CHECK-NEXT: };114 115// CHECK: bool MyTargetInstructionSelector::selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const {116// CHECK-NEXT: const PredicateBitset AvailableFeatures = getAvailableFeatures();117// CHECK-NEXT: MachineIRBuilder B(I);118// CHECK-NEXT: State.MIs.clear();119// CHECK-NEXT: State.MIs.push_back(&I);120 121// CHECK: if (executeMatchTable(*this, State, ExecInfo, B, getMatchTable(), TII, MF->getRegInfo(), TRI, RBI, AvailableFeatures, &CoverageInfo)) {122// CHECK-NEXT: return true;123// CHECK-NEXT: }124 125// CHECK: const uint8_t *126// CHECK-LABEL: MyTargetInstructionSelector::getMatchTable() const {127// CHECK-NEXT: MatchTable0[] = {128 129//===- Test a simple pattern with inferred pointer operands. ---------------===//130 131// CHECK-NEXT: GIM_Try, /*On fail goto*//*Label [[LABEL_NUM:[0-9]+]]*/ GIMT_Encode4([[LABEL:[0-9]+]]),132// CHECK-NEXT: GIM_CheckFeatures, GIMT_Encode2(GIFBS_HwMode0),133// CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,134// CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_LOAD),135// CHECK-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,136// CHECK-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,137// CHECK-NEXT: // MIs[0] DstI[dst]138// CHECK-NEXT: GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s64,139// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID),140// CHECK-NEXT: // MIs[0] src1141// CHECK-NEXT: GIM_CheckPointerToAny, /*MI*/0, /*Op*/1, /*SizeInBits*/64,142// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID),143// CHECK-NEXT: // (ld:{ *:[i64] } GPR:{ *:[i64] }:$src1)<<P:Predicate_unindexedload>><<P:Predicate_load>> => (LOAD:{ *:[i64] } GPR:{ *:[i64] }:$src1)144// CHECK-NEXT: GIR_MutateOpcode, /*InsnID*/0, /*RecycleInsnID*/0, /*Opcode*/GIMT_Encode2(MyTarget::LOAD),145// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands,146// CHECK-NEXT: // GIR_Coverage, 0,147// CHECK-NEXT: GIR_Done,148// CHECK-NEXT: // Label [[LABEL_NUM]]: @[[LABEL]]149// CHECK-NEXT: GIM_Try, /*On fail goto*//*Label [[LABEL_NUM:[0-9]+]]*/ GIMT_Encode4([[LABEL:[0-9]+]]),150// CHECK-NEXT: GIM_CheckFeatures, GIMT_Encode2(GIFBS_HwMode1),151// CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,152// CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_LOAD),153// CHECK-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,154// CHECK-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,155// CHECK-NEXT: // MIs[0] DstI[dst]156// CHECK-NEXT: GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s32,157// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID),158// CHECK-NEXT: // MIs[0] src1159// CHECK-NEXT: GIM_CheckPointerToAny, /*MI*/0, /*Op*/1, /*SizeInBits*/32,160// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID),161// CHECK-NEXT: // (ld:{ *:[i32] } GPR:{ *:[i32] }:$src1)<<P:Predicate_unindexedload>><<P:Predicate_load>> => (LOAD:{ *:[i32] } GPR:{ *:[i32] }:$src1)162// CHECK-NEXT: GIR_MutateOpcode, /*InsnID*/0, /*RecycleInsnID*/0, /*Opcode*/GIMT_Encode2(MyTarget::LOAD),163// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands,164// CHECK-NEXT: // GIR_Coverage, 1,165// CHECK-NEXT: GIR_Done,166// CHECK-NEXT: // Label [[LABEL_NUM]]: @[[LABEL]]167 168def LOAD : I<(outs GPR:$dst), (ins GPR:$src1),169 [(set GPR:$dst, (load GPR:$src1))]>;170 171//===- Test a simple pattern with explicit pointer operands. ---------------===//172 173// CHECK-NEXT: GIM_Try, /*On fail goto*//*Label [[LABEL_NUM:[0-9]+]]*/ GIMT_Encode4([[LABEL:[0-9]+]]),174// CHECK-NEXT: GIM_CheckFeatures, GIMT_Encode2(GIFBS_HwMode0),175// CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,176// CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_LOAD),177// CHECK-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,178// CHECK-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,179// CHECK-NEXT: // MIs[0] DstI[dst]180// CHECK-NEXT: GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_p0s64,181// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID),182// CHECK-NEXT: // MIs[0] src183// CHECK-NEXT: GIM_CheckPointerToAny, /*MI*/0, /*Op*/1, /*SizeInBits*/64,184// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID),185// CHECK-NEXT: // (ld:{ *:[i64] } GPR:{ *:[i64] }:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>> => (LOAD:{ *:[i64] } GPR:{ *:[i64] }:$src)186// CHECK-NEXT: GIR_MutateOpcode, /*InsnID*/0, /*RecycleInsnID*/0, /*Opcode*/GIMT_Encode2(MyTarget::LOAD),187// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands,188// CHECK-NEXT: // GIR_Coverage, 2,189// CHECK-NEXT: GIR_Done,190// CHECK-NEXT: // Label [[LABEL_NUM]]: @[[LABEL]]191// CHECK-NEXT: GIM_Try, /*On fail goto*//*Label [[LABEL_NUM:[0-9]+]]*/ GIMT_Encode4([[LABEL:[0-9]+]]),192// CHECK-NEXT: GIM_CheckFeatures, GIMT_Encode2(GIFBS_HwMode1),193// CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,194// CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_LOAD),195// CHECK-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,196// CHECK-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,197// CHECK-NEXT: // MIs[0] DstI[dst]198// CHECK-NEXT: GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_p0s32,199// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID),200// CHECK-NEXT: // MIs[0] src201// CHECK-NEXT: GIM_CheckPointerToAny, /*MI*/0, /*Op*/1, /*SizeInBits*/32,202// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID),203// CHECK-NEXT: // (ld:{ *:[i32] } GPR:{ *:[i32] }:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>> => (LOAD:{ *:[i32] } GPR:{ *:[i32] }:$src)204// CHECK-NEXT: GIR_MutateOpcode, /*InsnID*/0, /*RecycleInsnID*/0, /*Opcode*/GIMT_Encode2(MyTarget::LOAD),205// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands,206// CHECK-NEXT: // GIR_Coverage, 3,207// CHECK-NEXT: GIR_Done,208// CHECK-NEXT: // Label [[LABEL_NUM]]: @[[LABEL]]209 210def : Pat<(load GPR:$src),211 (p0 (LOAD GPR:$src))>;212