MipsISelDAGToDAG.h revision 4c5e43da7792f75567b693105cc53e3f1992ad98
11d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka//===---- MipsISelDAGToDAG.h - A Dag to Dag Inst Selector for Mips --------===// 21d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// 31d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// The LLVM Compiler Infrastructure 41d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// 51d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// This file is distributed under the University of Illinois Open Source 61d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// License. See LICENSE.TXT for details. 71d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// 81d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka//===----------------------------------------------------------------------===// 91d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// 101d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// This file defines an instruction selector for the MIPS target. 111d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// 121d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka//===----------------------------------------------------------------------===// 131d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_MIPS_MIPSISELDAGTODAG_H 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_MIPS_MIPSISELDAGTODAG_H 161d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 171d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka#include "Mips.h" 181d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka#include "MipsSubtarget.h" 191d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka#include "MipsTargetMachine.h" 201d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka#include "llvm/CodeGen/SelectionDAGISel.h" 211d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 221d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka//===----------------------------------------------------------------------===// 231d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// Instruction Selector Implementation 241d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka//===----------------------------------------------------------------------===// 251d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 261d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka//===----------------------------------------------------------------------===// 271d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// MipsDAGToDAGISel - MIPS specific code to select MIPS machine 281d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka// instructions for SelectionDAG operations. 291d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka//===----------------------------------------------------------------------===// 301d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanakanamespace llvm { 311d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 321d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanakaclass MipsDAGToDAGISel : public SelectionDAGISel { 331d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanakapublic: 341d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka explicit MipsDAGToDAGISel(MipsTargetMachine &TM) 3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : SelectionDAGISel(TM), Subtarget(nullptr) {} 361d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 371d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka // Pass Name 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *getPassName() const override { 391d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka return "MIPS DAG->DAG Pattern Instruction Selection"; 401d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka } 411d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool runOnMachineFunction(MachineFunction &MF) override; 431d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 441d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanakaprotected: 451d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka SDNode *getGlobalBaseReg(); 461d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 471d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka /// Keep a pointer to the MipsSubtarget around so that we can make the right 481d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka /// decision when generating code for different targets. 49c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const MipsSubtarget *Subtarget; 501d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 511d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanakaprivate: 521d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka // Include the pieces autogenerated from the target description. 531d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka #include "MipsGenDAGISel.inc" 541d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 551d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka // Complex Pattern. 561d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka /// (reg + imm). 571d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka virtual bool selectAddrRegImm(SDValue Addr, SDValue &Base, 581d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka SDValue &Offset) const; 591d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 602fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders // Complex Pattern. 612fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders /// (reg + reg). 622fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders virtual bool selectAddrRegReg(SDValue Addr, SDValue &Base, 632fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders SDValue &Offset) const; 642fd3e67dc6438cee5e32e0d7d7d42891df7edd96Daniel Sanders 651d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka /// Fall back on this function if all else fails. 661d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka virtual bool selectAddrDefault(SDValue Addr, SDValue &Base, 671d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka SDValue &Offset) const; 681d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 691d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka /// Match integer address pattern. 701d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka virtual bool selectIntAddr(SDValue Addr, SDValue &Base, 711d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka SDValue &Offset) const; 721d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 73da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter virtual bool selectIntAddrMM(SDValue Addr, SDValue &Base, 74da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter SDValue &Offset) const; 75da0860f78e6e43aca3333a7815b2f9bc0f8dfac0Jack Carter 76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines virtual bool selectIntAddrLSL2MM(SDValue Addr, SDValue &Base, 77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue &Offset) const; 78ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Match addr+simm10 and addr 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual bool selectIntAddrMSA(SDValue Addr, SDValue &Base, 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SDValue &Offset) const; 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 83f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka virtual bool selectAddr16(SDNode *Parent, SDValue N, SDValue &Base, 841d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka SDValue &Offset, SDValue &Alias); 851d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 86acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders /// \brief Select constant vector splats. 87acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders virtual bool selectVSplat(SDNode *N, APInt &Imm) const; 88c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders /// \brief Select constant vector splats whose value fits in a uimm1. 89c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders virtual bool selectVSplatUimm1(SDValue N, SDValue &Imm) const; 90c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders /// \brief Select constant vector splats whose value fits in a uimm2. 91c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders virtual bool selectVSplatUimm2(SDValue N, SDValue &Imm) const; 92acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders /// \brief Select constant vector splats whose value fits in a uimm3. 93acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders virtual bool selectVSplatUimm3(SDValue N, SDValue &Imm) const; 94acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders /// \brief Select constant vector splats whose value fits in a uimm4. 95acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders virtual bool selectVSplatUimm4(SDValue N, SDValue &Imm) const; 96acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders /// \brief Select constant vector splats whose value fits in a uimm5. 97acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders virtual bool selectVSplatUimm5(SDValue N, SDValue &Imm) const; 98acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders /// \brief Select constant vector splats whose value fits in a uimm6. 99acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders virtual bool selectVSplatUimm6(SDValue N, SDValue &Imm) const; 100acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders /// \brief Select constant vector splats whose value fits in a uimm8. 101acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders virtual bool selectVSplatUimm8(SDValue N, SDValue &Imm) const; 102acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders /// \brief Select constant vector splats whose value fits in a simm5. 103acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders virtual bool selectVSplatSimm5(SDValue N, SDValue &Imm) const; 104acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders /// \brief Select constant vector splats whose value is a power of 2. 105acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders virtual bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const; 106bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders /// \brief Select constant vector splats whose value is the inverse of a 107bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders /// power of 2. 108bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders virtual bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const; 1096ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders /// \brief Select constant vector splats whose value is a run of set bits 1106ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders /// ending at the most significant bit 1116ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders virtual bool selectVSplatMaskL(SDValue N, SDValue &Imm) const; 1126ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders /// \brief Select constant vector splats whose value is a run of set bits 1136ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders /// starting at bit zero. 1146ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders virtual bool selectVSplatMaskR(SDValue N, SDValue &Imm) const; 115acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SDNode *Select(SDNode *N) override; 1171d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 118f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka virtual std::pair<bool, SDNode*> selectNode(SDNode *Node) = 0; 1191d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 1201d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka // getImm - Return a target constant with the specified value. 1211d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka inline SDValue getImm(const SDNode *Node, uint64_t Imm) { 1221d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka return CurDAG->getTargetConstant(Imm, Node->getValueType(0)); 1231d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka } 1241d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 125f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka virtual void processFunctionAfterISel(MachineFunction &MF) = 0; 1261d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool SelectInlineAsmMemoryOperand(const SDValue &Op, 1284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar unsigned ConstraintID, 129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::vector<SDValue> &OutOps) override; 1301d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka}; 1311d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka} 1321d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka 1331d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka#endif 134