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.
876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  virtual bool selectVSplat(SDNode *N, APInt &Imm,
886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            unsigned MinSizeInBits) const;
89c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  /// \brief Select constant vector splats whose value fits in a uimm1.
90c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  virtual bool selectVSplatUimm1(SDValue N, SDValue &Imm) const;
91c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  /// \brief Select constant vector splats whose value fits in a uimm2.
92c8a1fa77a73e7c885035421712ceba951f9024cbDaniel Sanders  virtual bool selectVSplatUimm2(SDValue N, SDValue &Imm) const;
93acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  /// \brief Select constant vector splats whose value fits in a uimm3.
94acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  virtual bool selectVSplatUimm3(SDValue N, SDValue &Imm) const;
95acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  /// \brief Select constant vector splats whose value fits in a uimm4.
96acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  virtual bool selectVSplatUimm4(SDValue N, SDValue &Imm) const;
97acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  /// \brief Select constant vector splats whose value fits in a uimm5.
98acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  virtual bool selectVSplatUimm5(SDValue N, SDValue &Imm) const;
99acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  /// \brief Select constant vector splats whose value fits in a uimm6.
100acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  virtual bool selectVSplatUimm6(SDValue N, SDValue &Imm) const;
101acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  /// \brief Select constant vector splats whose value fits in a uimm8.
102acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  virtual bool selectVSplatUimm8(SDValue N, SDValue &Imm) const;
103acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  /// \brief Select constant vector splats whose value fits in a simm5.
104acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  virtual bool selectVSplatSimm5(SDValue N, SDValue &Imm) const;
105acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  /// \brief Select constant vector splats whose value is a power of 2.
106acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders  virtual bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const;
107bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  /// \brief Select constant vector splats whose value is the inverse of a
108bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  /// power of 2.
109bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  virtual bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const;
1106ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  /// \brief Select constant vector splats whose value is a run of set bits
1116ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  /// ending at the most significant bit
1126ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  virtual bool selectVSplatMaskL(SDValue N, SDValue &Imm) const;
1136ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  /// \brief Select constant vector splats whose value is a run of set bits
1146ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  /// starting at bit zero.
1156ff1ef9931b50763a40e9ae8696cfab9e25cf4deDaniel Sanders  virtual bool selectVSplatMaskR(SDValue N, SDValue &Imm) const;
116acfa5a203c01d99aac1bdc1e045c08153bcdbbf6Daniel Sanders
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDNode *Select(SDNode *N) override;
1181d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka
119f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka  virtual std::pair<bool, SDNode*> selectNode(SDNode *Node) = 0;
1201d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka
1211d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka  // getImm - Return a target constant with the specified value.
1221d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka  inline SDValue getImm(const SDNode *Node, uint64_t Imm) {
1236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return CurDAG->getTargetConstant(Imm, SDLoc(Node), Node->getValueType(0));
1241d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka  }
1251d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka
126f283512d72757aac5bedcb270f9199194e6a12c0Akira Hatanaka  virtual void processFunctionAfterISel(MachineFunction &MF) = 0;
1271d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka
128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool SelectInlineAsmMemoryOperand(const SDValue &Op,
1294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                    unsigned ConstraintID,
130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    std::vector<SDValue> &OutOps) override;
1311d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka};
1321d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka}
1331d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka
1341d905668ddaab127eb6f9668b6314afbef7bee20Akira Hatanaka#endif
135