17c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner//===-- SparcISelDAGToDAG.cpp - A dag to dag inst selector for Sparc ------===//
26c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//
36c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//                     The LLVM Compiler Infrastructure
46c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
76c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//
86c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//===----------------------------------------------------------------------===//
96c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//
107c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner// This file defines an instruction selector for the SPARC target.
116c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//
126c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//===----------------------------------------------------------------------===//
136c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
147c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "SparcTargetMachine.h"
156c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner#include "llvm/CodeGen/SelectionDAGISel.h"
160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Intrinsics.h"
173d62d780abbe0c2dd8edd7dd37a27365b2032d73Chris Lattner#include "llvm/Support/Compiler.h"
186c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner#include "llvm/Support/Debug.h"
19dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/ErrorHandling.h"
20dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/raw_ostream.h"
216c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattnerusing namespace llvm;
226c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
236c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//===----------------------------------------------------------------------===//
246c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner// Instruction Selector Implementation
256c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//===----------------------------------------------------------------------===//
266c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
276c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner//===--------------------------------------------------------------------===//
287c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner/// SparcDAGToDAGISel - SPARC specific code to select SPARC machine
296c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner/// instructions for SelectionDAG operations.
306c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner///
316c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattnernamespace {
327c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattnerclass SparcDAGToDAGISel : public SelectionDAGISel {
3376afdc9a80cf078aebd0ec62dba0bfafe498b1dcChris Lattner  /// Subtarget - Keep a pointer to the Sparc Subtarget around so that we can
3476afdc9a80cf078aebd0ec62dba0bfafe498b1dcChris Lattner  /// make the right decision when generating code for different targets.
357c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner  const SparcSubtarget &Subtarget;
36ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling  SparcTargetMachine &TM;
376c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattnerpublic:
38db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner  explicit SparcDAGToDAGISel(SparcTargetMachine &tm)
39db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner    : SelectionDAGISel(tm),
40db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner      Subtarget(tm.getSubtarget<SparcSubtarget>()),
41db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner      TM(tm) {
4276afdc9a80cf078aebd0ec62dba0bfafe498b1dcChris Lattner  }
436c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SDNode *Select(SDNode *N) override;
456c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
46bc83fd96721eda272d90eafcb3a2a31ef9a2c366Chris Lattner  // Complex Pattern Selectors.
4752a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner  bool SelectADDRrr(SDValue N, SDValue &R1, SDValue &R2);
4852a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner  bool SelectADDRri(SDValue N, SDValue &Base, SDValue &Offset);
49a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov
502fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
512fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  /// inline asm expressions.
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool SelectInlineAsmMemoryOperand(const SDValue &Op,
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    char ConstraintCode,
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    std::vector<SDValue> &OutOps) override;
552fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const char *getPassName() const override {
577c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner    return "SPARC DAG->DAG Pattern Instruction Selection";
58a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov  }
59a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov
606c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner  // Include the pieces autogenerated from the target description.
617c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "SparcGenDAGISel.inc"
62db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner
63db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattnerprivate:
64db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner  SDNode* getGlobalBaseReg();
656c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner};
666c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner}  // end anonymous namespace
676c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
68db486a6d5311944f61b92db9f6074944dbbdb242Chris LattnerSDNode* SparcDAGToDAGISel::getGlobalBaseReg() {
69db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner  unsigned GlobalBaseReg = TM.getInstrInfo()->getGlobalBaseReg(MF);
70ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling  return CurDAG->getRegister(GlobalBaseReg,
71ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling                             getTargetLowering()->getPointerTy()).getNode();
72db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner}
73db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner
7452a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattnerbool SparcDAGToDAGISel::SelectADDRri(SDValue Addr,
75475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                     SDValue &Base, SDValue &Offset) {
76d5aae0528132a130e2d8069c3deebe7e6a362759Chris Lattner  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) {
77ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling    Base = CurDAG->getTargetFrameIndex(FIN->getIndex(),
78ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling                                       getTargetLowering()->getPointerTy());
79825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    Offset = CurDAG->getTargetConstant(0, MVT::i32);
808fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner    return true;
818fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner  }
82056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
837d052f272d3f9ad0acdebf6811e29d529f70c1e1Venkatraman Govindaraju      Addr.getOpcode() == ISD::TargetGlobalAddress ||
847d052f272d3f9ad0acdebf6811e29d529f70c1e1Venkatraman Govindaraju      Addr.getOpcode() == ISD::TargetGlobalTLSAddress)
85ad7a3e62085f776ec87e857e769e210a89a0d544Chris Lattner    return false;  // direct calls.
86a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov
879034b883a463b37dbc4766ff7243dac3a27d0b11Chris Lattner  if (Addr.getOpcode() == ISD::ADD) {
888fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
894bb862d179486008406ec5025f925bac5493ad0dJakob Stoklund Olesen      if (isInt<13>(CN->getSExtValue())) {
90a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov        if (FrameIndexSDNode *FIN =
91d5aae0528132a130e2d8069c3deebe7e6a362759Chris Lattner                dyn_cast<FrameIndexSDNode>(Addr.getOperand(0))) {
928fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner          // Constant offset from frame ref.
9341b585ca0e706a6d43ca185e88a609178e8629e7Jakob Stoklund Olesen          Base = CurDAG->getTargetFrameIndex(FIN->getIndex(),
94ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling                                           getTargetLowering()->getPointerTy());
958fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner        } else {
96c26017a4ae14ec63bc99831dd3edbb0362f56d06Chris Lattner          Base = Addr.getOperand(0);
978fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner        }
98825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson        Offset = CurDAG->getTargetConstant(CN->getZExtValue(), MVT::i32);
999034b883a463b37dbc4766ff7243dac3a27d0b11Chris Lattner        return true;
1009034b883a463b37dbc4766ff7243dac3a27d0b11Chris Lattner      }
1018fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner    }
1027c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner    if (Addr.getOperand(0).getOpcode() == SPISD::Lo) {
103c26017a4ae14ec63bc99831dd3edbb0362f56d06Chris Lattner      Base = Addr.getOperand(1);
104e1389ad43afa6b4f7449013fec7ad37fe8ca2bbdChris Lattner      Offset = Addr.getOperand(0).getOperand(0);
105e1389ad43afa6b4f7449013fec7ad37fe8ca2bbdChris Lattner      return true;
106e1389ad43afa6b4f7449013fec7ad37fe8ca2bbdChris Lattner    }
1077c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner    if (Addr.getOperand(1).getOpcode() == SPISD::Lo) {
108c26017a4ae14ec63bc99831dd3edbb0362f56d06Chris Lattner      Base = Addr.getOperand(0);
109e1389ad43afa6b4f7449013fec7ad37fe8ca2bbdChris Lattner      Offset = Addr.getOperand(1).getOperand(0);
110e1389ad43afa6b4f7449013fec7ad37fe8ca2bbdChris Lattner      return true;
111e1389ad43afa6b4f7449013fec7ad37fe8ca2bbdChris Lattner    }
1129034b883a463b37dbc4766ff7243dac3a27d0b11Chris Lattner  }
113c26017a4ae14ec63bc99831dd3edbb0362f56d06Chris Lattner  Base = Addr;
114825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  Offset = CurDAG->getTargetConstant(0, MVT::i32);
115bc83fd96721eda272d90eafcb3a2a31ef9a2c366Chris Lattner  return true;
116bc83fd96721eda272d90eafcb3a2a31ef9a2c366Chris Lattner}
117bc83fd96721eda272d90eafcb3a2a31ef9a2c366Chris Lattner
11852a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattnerbool SparcDAGToDAGISel::SelectADDRrr(SDValue Addr, SDValue &R1, SDValue &R2) {
119ad7a3e62085f776ec87e857e769e210a89a0d544Chris Lattner  if (Addr.getOpcode() == ISD::FrameIndex) return false;
120056292fd738924f3f7703725d8f630983794b5a5Bill Wendling  if (Addr.getOpcode() == ISD::TargetExternalSymbol ||
1217d052f272d3f9ad0acdebf6811e29d529f70c1e1Venkatraman Govindaraju      Addr.getOpcode() == ISD::TargetGlobalAddress ||
1227d052f272d3f9ad0acdebf6811e29d529f70c1e1Venkatraman Govindaraju      Addr.getOpcode() == ISD::TargetGlobalTLSAddress)
123ad7a3e62085f776ec87e857e769e210a89a0d544Chris Lattner    return false;  // direct calls.
124a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov
1258fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner  if (Addr.getOpcode() == ISD::ADD) {
1264bb862d179486008406ec5025f925bac5493ad0dJakob Stoklund Olesen    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1)))
1274bb862d179486008406ec5025f925bac5493ad0dJakob Stoklund Olesen      if (isInt<13>(CN->getSExtValue()))
1284bb862d179486008406ec5025f925bac5493ad0dJakob Stoklund Olesen        return false;  // Let the reg+imm pattern catch this!
1297c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner    if (Addr.getOperand(0).getOpcode() == SPISD::Lo ||
1307c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner        Addr.getOperand(1).getOpcode() == SPISD::Lo)
1318fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner      return false;  // Let the reg+imm pattern catch this!
132c26017a4ae14ec63bc99831dd3edbb0362f56d06Chris Lattner    R1 = Addr.getOperand(0);
133c26017a4ae14ec63bc99831dd3edbb0362f56d06Chris Lattner    R2 = Addr.getOperand(1);
1348fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner    return true;
1358fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner  }
1368fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner
137c26017a4ae14ec63bc99831dd3edbb0362f56d06Chris Lattner  R1 = Addr;
138ba54bca472a15d0657e1b88776f7069042b60b4eBill Wendling  R2 = CurDAG->getRegister(SP::G0, getTargetLowering()->getPointerTy());
1398fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner  return true;
1408fa54dc70239dc08cc3c93cb7513e0625be50eb4Chris Lattner}
1416c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
142eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan GohmanSDNode *SparcDAGToDAGISel::Select(SDNode *N) {
143ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick  SDLoc dl(N);
1443e84ad28d4d3ceee25771b1e30315c20b7608c39Tim Northover  if (N->isMachineOpcode()) {
1453e84ad28d4d3ceee25771b1e30315c20b7608c39Tim Northover    N->setNodeId(-1);
146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;   // Already selected.
1473e84ad28d4d3ceee25771b1e30315c20b7608c39Tim Northover  }
14834167215a8da717b21e44f1b834dc34d15279bf1Evan Cheng
1496c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner  switch (N->getOpcode()) {
1506c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner  default: break;
151db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner  case SPISD::GLOBAL_BASE_REG:
152db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner    return getGlobalBaseReg();
153db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner
1547087e57872f68978945be227aafd17d6d43ae03eChris Lattner  case ISD::SDIV:
1557087e57872f68978945be227aafd17d6d43ae03eChris Lattner  case ISD::UDIV: {
156ad36608499429cc9dc67b95fed8732a294e6f02eJakob Stoklund Olesen    // sdivx / udivx handle 64-bit divides.
157ad36608499429cc9dc67b95fed8732a294e6f02eJakob Stoklund Olesen    if (N->getValueType(0) == MVT::i64)
158ad36608499429cc9dc67b95fed8732a294e6f02eJakob Stoklund Olesen      break;
1597087e57872f68978945be227aafd17d6d43ae03eChris Lattner    // FIXME: should use a custom expander to expose the SRA to the dag.
160475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue DivLHS = N->getOperand(0);
161475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue DivRHS = N->getOperand(1);
162a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov
1637087e57872f68978945be227aafd17d6d43ae03eChris Lattner    // Set the Y register to the high-part.
164475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue TopPart;
1657087e57872f68978945be227aafd17d6d43ae03eChris Lattner    if (N->getOpcode() == ISD::SDIV) {
166602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman      TopPart = SDValue(CurDAG->getMachineNode(SP::SRAri, dl, MVT::i32, DivLHS,
167825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                   CurDAG->getTargetConstant(31, MVT::i32)), 0);
1687087e57872f68978945be227aafd17d6d43ae03eChris Lattner    } else {
169825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      TopPart = CurDAG->getRegister(SP::G0, MVT::i32);
1707087e57872f68978945be227aafd17d6d43ae03eChris Lattner    }
171f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    TopPart = SDValue(CurDAG->getMachineNode(SP::WRYrr, dl, MVT::Glue, TopPart,
172825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                     CurDAG->getRegister(SP::G0, MVT::i32)), 0);
1737087e57872f68978945be227aafd17d6d43ae03eChris Lattner
1747087e57872f68978945be227aafd17d6d43ae03eChris Lattner    // FIXME: Handle div by immediate.
1757c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner    unsigned Opcode = N->getOpcode() == ISD::SDIV ? SP::SDIVrr : SP::UDIVrr;
176825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    return CurDAG->SelectNodeTo(N, Opcode, MVT::i32, DivLHS, DivRHS,
17795514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng                                TopPart);
178a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov  }
179ee3d5fba54c658382926cbd40ef471245b61b19cChris Lattner  case ISD::MULHU:
180ee3d5fba54c658382926cbd40ef471245b61b19cChris Lattner  case ISD::MULHS: {
1817087e57872f68978945be227aafd17d6d43ae03eChris Lattner    // FIXME: Handle mul by immediate.
182475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue MulLHS = N->getOperand(0);
183475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue MulRHS = N->getOperand(1);
1847c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner    unsigned Opcode = N->getOpcode() == ISD::MULHU ? SP::UMULrr : SP::SMULrr;
185f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner    SDNode *Mul = CurDAG->getMachineNode(Opcode, dl, MVT::i32, MVT::Glue,
186602b0c8c17f458d2c80f2deb3c8e554d516ee316Dan Gohman                                         MulLHS, MulRHS);
187ee3d5fba54c658382926cbd40ef471245b61b19cChris Lattner    // The high part is in the Y register.
188825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    return CurDAG->SelectNodeTo(N, SP::RDY, MVT::i32, SDValue(Mul, 1));
189ee3d5fba54c658382926cbd40ef471245b61b19cChris Lattner  }
1906c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner  }
191a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov
192eeb3a00b84b7767d236ec8cf0619b9217fc247b9Dan Gohman  return SelectCode(N);
1936c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner}
1946c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
1956c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner
1962fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov/// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
1972fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov/// inline asm expressions.
1982fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikovbool
1992fcfd83cb4b10c072186949ee39326f236c9f1b3Anton KorobeynikovSparcDAGToDAGISel::SelectInlineAsmMemoryOperand(const SDValue &Op,
2002fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov                                                char ConstraintCode,
2012fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov                                                std::vector<SDValue> &OutOps) {
2022fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  SDValue Op0, Op1;
2032fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  switch (ConstraintCode) {
2042fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  default: return true;
2052fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  case 'm':   // memory
20652a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner   if (!SelectADDRrr(Op, Op0, Op1))
20752a261b3c1391c5fec399ddeb3fc6ee9541e8790Chris Lattner     SelectADDRri(Op, Op0, Op1);
2082fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov   break;
2092fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  }
2102fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov
2112fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  OutOps.push_back(Op0);
2122fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  OutOps.push_back(Op1);
2132fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov  return false;
2142fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov}
2152fcfd83cb4b10c072186949ee39326f236c9f1b3Anton Korobeynikov
216a43e51d0fea8b1a6148934633012351a0432a4a6Anton Korobeynikov/// createSparcISelDag - This pass converts a legalized DAG into a
2174dcfaac2e390fdd0e8a562aeccb666178bd8664cChris Lattner/// SPARC-specific DAG, ready for instruction scheduling.
2186c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner///
219da8ac5fd9130b70b61be61e4819faa8d842d708fDan GohmanFunctionPass *llvm::createSparcISelDag(SparcTargetMachine &TM) {
2207c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner  return new SparcDAGToDAGISel(TM);
2216c18b10ad4873ad7e1b1c1d589bcf844c46f4120Chris Lattner}
222