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