Home | History | Annotate | Download | only in MBlaze
      1 //===-- MBlazeISelLowering.cpp - MBlaze DAG Lowering Implementation -------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines the interfaces that MBlaze uses to lower LLVM code into a
     11 // selection DAG.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #define DEBUG_TYPE "mblaze-lower"
     16 #include "MBlazeISelLowering.h"
     17 #include "MBlazeMachineFunction.h"
     18 #include "MBlazeSubtarget.h"
     19 #include "MBlazeTargetMachine.h"
     20 #include "MBlazeTargetObjectFile.h"
     21 #include "llvm/CodeGen/CallingConvLower.h"
     22 #include "llvm/CodeGen/MachineFrameInfo.h"
     23 #include "llvm/CodeGen/MachineFunction.h"
     24 #include "llvm/CodeGen/MachineInstrBuilder.h"
     25 #include "llvm/CodeGen/MachineRegisterInfo.h"
     26 #include "llvm/CodeGen/SelectionDAGISel.h"
     27 #include "llvm/CodeGen/ValueTypes.h"
     28 #include "llvm/IR/CallingConv.h"
     29 #include "llvm/IR/DerivedTypes.h"
     30 #include "llvm/IR/Function.h"
     31 #include "llvm/IR/GlobalVariable.h"
     32 #include "llvm/IR/Intrinsics.h"
     33 #include "llvm/Support/Debug.h"
     34 #include "llvm/Support/ErrorHandling.h"
     35 #include "llvm/Support/raw_ostream.h"
     36 using namespace llvm;
     37 
     38 static bool CC_MBlaze_AssignReg(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
     39                                 CCValAssign::LocInfo &LocInfo,
     40                                 ISD::ArgFlagsTy &ArgFlags,
     41                                 CCState &State);
     42 
     43 const char *MBlazeTargetLowering::getTargetNodeName(unsigned Opcode) const {
     44   switch (Opcode) {
     45     case MBlazeISD::JmpLink    : return "MBlazeISD::JmpLink";
     46     case MBlazeISD::GPRel      : return "MBlazeISD::GPRel";
     47     case MBlazeISD::Wrap       : return "MBlazeISD::Wrap";
     48     case MBlazeISD::ICmp       : return "MBlazeISD::ICmp";
     49     case MBlazeISD::Ret        : return "MBlazeISD::Ret";
     50     case MBlazeISD::Select_CC  : return "MBlazeISD::Select_CC";
     51     default                    : return NULL;
     52   }
     53 }
     54 
     55 MBlazeTargetLowering::MBlazeTargetLowering(MBlazeTargetMachine &TM)
     56   : TargetLowering(TM, new MBlazeTargetObjectFile()) {
     57   Subtarget = &TM.getSubtarget<MBlazeSubtarget>();
     58 
     59   // MBlaze does not have i1 type, so use i32 for
     60   // setcc operations results (slt, sgt, ...).
     61   setBooleanContents(ZeroOrOneBooleanContent);
     62   setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?
     63 
     64   // Set up the register classes
     65   addRegisterClass(MVT::i32, &MBlaze::GPRRegClass);
     66   if (Subtarget->hasFPU()) {
     67     addRegisterClass(MVT::f32, &MBlaze::GPRRegClass);
     68     setOperationAction(ISD::ConstantFP, MVT::f32, Legal);
     69   }
     70 
     71   // Floating point operations which are not supported
     72   setOperationAction(ISD::FREM,       MVT::f32, Expand);
     73   setOperationAction(ISD::FMA,        MVT::f32, Expand);
     74   setOperationAction(ISD::UINT_TO_FP, MVT::i8,  Expand);
     75   setOperationAction(ISD::UINT_TO_FP, MVT::i16, Expand);
     76   setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand);
     77   setOperationAction(ISD::FP_TO_UINT, MVT::i32, Expand);
     78   setOperationAction(ISD::FP_ROUND,   MVT::f32, Expand);
     79   setOperationAction(ISD::FP_ROUND,   MVT::f64, Expand);
     80   setOperationAction(ISD::FCOPYSIGN,  MVT::f32, Expand);
     81   setOperationAction(ISD::FCOPYSIGN,  MVT::f64, Expand);
     82   setOperationAction(ISD::FSIN,       MVT::f32, Expand);
     83   setOperationAction(ISD::FCOS,       MVT::f32, Expand);
     84   setOperationAction(ISD::FSINCOS,    MVT::f32, Expand);
     85   setOperationAction(ISD::FPOWI,      MVT::f32, Expand);
     86   setOperationAction(ISD::FPOW,       MVT::f32, Expand);
     87   setOperationAction(ISD::FLOG,       MVT::f32, Expand);
     88   setOperationAction(ISD::FLOG2,      MVT::f32, Expand);
     89   setOperationAction(ISD::FLOG10,     MVT::f32, Expand);
     90   setOperationAction(ISD::FEXP,       MVT::f32, Expand);
     91 
     92   // Load extented operations for i1 types must be promoted
     93   setLoadExtAction(ISD::EXTLOAD,  MVT::i1,  Promote);
     94   setLoadExtAction(ISD::ZEXTLOAD, MVT::i1,  Promote);
     95   setLoadExtAction(ISD::SEXTLOAD, MVT::i1,  Promote);
     96 
     97   // Sign extended loads must be expanded
     98   setLoadExtAction(ISD::SEXTLOAD, MVT::i8, Expand);
     99   setLoadExtAction(ISD::SEXTLOAD, MVT::i16, Expand);
    100 
    101   // MBlaze has no REM or DIVREM operations.
    102   setOperationAction(ISD::UREM,    MVT::i32, Expand);
    103   setOperationAction(ISD::SREM,    MVT::i32, Expand);
    104   setOperationAction(ISD::SDIVREM, MVT::i32, Expand);
    105   setOperationAction(ISD::UDIVREM, MVT::i32, Expand);
    106 
    107   // If the processor doesn't support multiply then expand it
    108   if (!Subtarget->hasMul()) {
    109     setOperationAction(ISD::MUL, MVT::i32, Expand);
    110   }
    111 
    112   // If the processor doesn't support 64-bit multiply then expand
    113   if (!Subtarget->hasMul() || !Subtarget->hasMul64()) {
    114     setOperationAction(ISD::MULHS, MVT::i32, Expand);
    115     setOperationAction(ISD::MULHS, MVT::i64, Expand);
    116     setOperationAction(ISD::MULHU, MVT::i32, Expand);
    117     setOperationAction(ISD::MULHU, MVT::i64, Expand);
    118   }
    119 
    120   // If the processor doesn't support division then expand
    121   if (!Subtarget->hasDiv()) {
    122     setOperationAction(ISD::UDIV, MVT::i32, Expand);
    123     setOperationAction(ISD::SDIV, MVT::i32, Expand);
    124   }
    125 
    126   // Expand unsupported conversions
    127   setOperationAction(ISD::BITCAST, MVT::f32, Expand);
    128   setOperationAction(ISD::BITCAST, MVT::i32, Expand);
    129 
    130   // Expand SELECT_CC
    131   setOperationAction(ISD::SELECT_CC, MVT::Other, Expand);
    132 
    133   // MBlaze doesn't have MUL_LOHI
    134   setOperationAction(ISD::SMUL_LOHI, MVT::i32, Expand);
    135   setOperationAction(ISD::UMUL_LOHI, MVT::i32, Expand);
    136   setOperationAction(ISD::SMUL_LOHI, MVT::i64, Expand);
    137   setOperationAction(ISD::UMUL_LOHI, MVT::i64, Expand);
    138 
    139   // Used by legalize types to correctly generate the setcc result.
    140   // Without this, every float setcc comes with a AND/OR with the result,
    141   // we don't want this, since the fpcmp result goes to a flag register,
    142   // which is used implicitly by brcond and select operations.
    143   AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
    144   AddPromotedToType(ISD::SELECT, MVT::i1, MVT::i32);
    145   AddPromotedToType(ISD::SELECT_CC, MVT::i1, MVT::i32);
    146 
    147   // MBlaze Custom Operations
    148   setOperationAction(ISD::GlobalAddress,      MVT::i32,   Custom);
    149   setOperationAction(ISD::GlobalTLSAddress,   MVT::i32,   Custom);
    150   setOperationAction(ISD::JumpTable,          MVT::i32,   Custom);
    151   setOperationAction(ISD::ConstantPool,       MVT::i32,   Custom);
    152 
    153   // Variable Argument support
    154   setOperationAction(ISD::VASTART,            MVT::Other, Custom);
    155   setOperationAction(ISD::VAEND,              MVT::Other, Expand);
    156   setOperationAction(ISD::VAARG,              MVT::Other, Expand);
    157   setOperationAction(ISD::VACOPY,             MVT::Other, Expand);
    158 
    159 
    160   // Operations not directly supported by MBlaze.
    161   setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32,   Expand);
    162   setOperationAction(ISD::BR_JT,              MVT::Other, Expand);
    163   setOperationAction(ISD::BR_CC,              MVT::f32,   Expand);
    164   setOperationAction(ISD::BR_CC,              MVT::i32,   Expand);
    165   setOperationAction(ISD::SIGN_EXTEND_INREG,  MVT::i1,    Expand);
    166   setOperationAction(ISD::ROTL,               MVT::i32,   Expand);
    167   setOperationAction(ISD::ROTR,               MVT::i32,   Expand);
    168   setOperationAction(ISD::SHL_PARTS,          MVT::i32,   Expand);
    169   setOperationAction(ISD::SRA_PARTS,          MVT::i32,   Expand);
    170   setOperationAction(ISD::SRL_PARTS,          MVT::i32,   Expand);
    171   setOperationAction(ISD::CTLZ,               MVT::i32,   Expand);
    172   setOperationAction(ISD::CTLZ_ZERO_UNDEF,    MVT::i32,   Expand);
    173   setOperationAction(ISD::CTTZ,               MVT::i32,   Expand);
    174   setOperationAction(ISD::CTTZ_ZERO_UNDEF,    MVT::i32,   Expand);
    175   setOperationAction(ISD::CTPOP,              MVT::i32,   Expand);
    176   setOperationAction(ISD::BSWAP,              MVT::i32,   Expand);
    177 
    178   // We don't have line number support yet.
    179   setOperationAction(ISD::EH_LABEL,          MVT::Other, Expand);
    180 
    181   // Use the default for now
    182   setOperationAction(ISD::STACKSAVE,         MVT::Other, Expand);
    183   setOperationAction(ISD::STACKRESTORE,      MVT::Other, Expand);
    184 
    185   // MBlaze doesn't have extending float->double load/store
    186   setLoadExtAction(ISD::EXTLOAD, MVT::f32, Expand);
    187   setTruncStoreAction(MVT::f64, MVT::f32, Expand);
    188 
    189   setMinFunctionAlignment(2);
    190 
    191   setStackPointerRegisterToSaveRestore(MBlaze::R1);
    192   computeRegisterProperties();
    193 }
    194 
    195 EVT MBlazeTargetLowering::getSetCCResultType(EVT VT) const {
    196   return MVT::i32;
    197 }
    198 
    199 SDValue MBlazeTargetLowering::LowerOperation(SDValue Op,
    200                                              SelectionDAG &DAG) const {
    201   switch (Op.getOpcode())
    202   {
    203     case ISD::ConstantPool:       return LowerConstantPool(Op, DAG);
    204     case ISD::GlobalAddress:      return LowerGlobalAddress(Op, DAG);
    205     case ISD::GlobalTLSAddress:   return LowerGlobalTLSAddress(Op, DAG);
    206     case ISD::JumpTable:          return LowerJumpTable(Op, DAG);
    207     case ISD::SELECT_CC:          return LowerSELECT_CC(Op, DAG);
    208     case ISD::VASTART:            return LowerVASTART(Op, DAG);
    209   }
    210   return SDValue();
    211 }
    212 
    213 //===----------------------------------------------------------------------===//
    214 //  Lower helper functions
    215 //===----------------------------------------------------------------------===//
    216 MachineBasicBlock*
    217 MBlazeTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
    218                                                   MachineBasicBlock *MBB)
    219                                                   const {
    220   switch (MI->getOpcode()) {
    221   default: llvm_unreachable("Unexpected instr type to insert");
    222 
    223   case MBlaze::ShiftRL:
    224   case MBlaze::ShiftRA:
    225   case MBlaze::ShiftL:
    226     return EmitCustomShift(MI, MBB);
    227 
    228   case MBlaze::Select_FCC:
    229   case MBlaze::Select_CC:
    230     return EmitCustomSelect(MI, MBB);
    231 
    232   case MBlaze::CAS32:
    233   case MBlaze::SWP32:
    234   case MBlaze::LAA32:
    235   case MBlaze::LAS32:
    236   case MBlaze::LAD32:
    237   case MBlaze::LAO32:
    238   case MBlaze::LAX32:
    239   case MBlaze::LAN32:
    240     return EmitCustomAtomic(MI, MBB);
    241 
    242   case MBlaze::MEMBARRIER:
    243     // The Microblaze does not need memory barriers. Just delete the pseudo
    244     // instruction and finish.
    245     MI->eraseFromParent();
    246     return MBB;
    247   }
    248 }
    249 
    250 MachineBasicBlock*
    251 MBlazeTargetLowering::EmitCustomShift(MachineInstr *MI,
    252                                       MachineBasicBlock *MBB) const {
    253   const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
    254   DebugLoc dl = MI->getDebugLoc();
    255 
    256   // To "insert" a shift left instruction, we actually have to insert a
    257   // simple loop.  The incoming instruction knows the destination vreg to
    258   // set, the source vreg to operate over and the shift amount.
    259   const BasicBlock *LLVM_BB = MBB->getBasicBlock();
    260   MachineFunction::iterator It = MBB;
    261   ++It;
    262 
    263   // start:
    264   //   andi     samt, samt, 31
    265   //   beqid    samt, finish
    266   //   add      dst, src, r0
    267   // loop:
    268   //   addik    samt, samt, -1
    269   //   sra      dst, dst
    270   //   bneid    samt, loop
    271   //   nop
    272   // finish:
    273   MachineFunction *F = MBB->getParent();
    274   MachineRegisterInfo &R = F->getRegInfo();
    275   MachineBasicBlock *loop = F->CreateMachineBasicBlock(LLVM_BB);
    276   MachineBasicBlock *finish = F->CreateMachineBasicBlock(LLVM_BB);
    277   F->insert(It, loop);
    278   F->insert(It, finish);
    279 
    280   // Update machine-CFG edges by transferring adding all successors and
    281   // remaining instructions from the current block to the new block which
    282   // will contain the Phi node for the select.
    283   finish->splice(finish->begin(), MBB,
    284                  llvm::next(MachineBasicBlock::iterator(MI)),
    285                  MBB->end());
    286   finish->transferSuccessorsAndUpdatePHIs(MBB);
    287 
    288   // Add the true and fallthrough blocks as its successors.
    289   MBB->addSuccessor(loop);
    290   MBB->addSuccessor(finish);
    291 
    292   // Next, add the finish block as a successor of the loop block
    293   loop->addSuccessor(finish);
    294   loop->addSuccessor(loop);
    295 
    296   unsigned IAMT = R.createVirtualRegister(&MBlaze::GPRRegClass);
    297   BuildMI(MBB, dl, TII->get(MBlaze::ANDI), IAMT)
    298     .addReg(MI->getOperand(2).getReg())
    299     .addImm(31);
    300 
    301   unsigned IVAL = R.createVirtualRegister(&MBlaze::GPRRegClass);
    302   BuildMI(MBB, dl, TII->get(MBlaze::ADDIK), IVAL)
    303     .addReg(MI->getOperand(1).getReg())
    304     .addImm(0);
    305 
    306   BuildMI(MBB, dl, TII->get(MBlaze::BEQID))
    307     .addReg(IAMT)
    308     .addMBB(finish);
    309 
    310   unsigned DST = R.createVirtualRegister(&MBlaze::GPRRegClass);
    311   unsigned NDST = R.createVirtualRegister(&MBlaze::GPRRegClass);
    312   BuildMI(loop, dl, TII->get(MBlaze::PHI), DST)
    313     .addReg(IVAL).addMBB(MBB)
    314     .addReg(NDST).addMBB(loop);
    315 
    316   unsigned SAMT = R.createVirtualRegister(&MBlaze::GPRRegClass);
    317   unsigned NAMT = R.createVirtualRegister(&MBlaze::GPRRegClass);
    318   BuildMI(loop, dl, TII->get(MBlaze::PHI), SAMT)
    319     .addReg(IAMT).addMBB(MBB)
    320     .addReg(NAMT).addMBB(loop);
    321 
    322   if (MI->getOpcode() == MBlaze::ShiftL)
    323     BuildMI(loop, dl, TII->get(MBlaze::ADD), NDST).addReg(DST).addReg(DST);
    324   else if (MI->getOpcode() == MBlaze::ShiftRA)
    325     BuildMI(loop, dl, TII->get(MBlaze::SRA), NDST).addReg(DST);
    326   else if (MI->getOpcode() == MBlaze::ShiftRL)
    327     BuildMI(loop, dl, TII->get(MBlaze::SRL), NDST).addReg(DST);
    328   else
    329     llvm_unreachable("Cannot lower unknown shift instruction");
    330 
    331   BuildMI(loop, dl, TII->get(MBlaze::ADDIK), NAMT)
    332     .addReg(SAMT)
    333     .addImm(-1);
    334 
    335   BuildMI(loop, dl, TII->get(MBlaze::BNEID))
    336     .addReg(NAMT)
    337     .addMBB(loop);
    338 
    339   BuildMI(*finish, finish->begin(), dl,
    340           TII->get(MBlaze::PHI), MI->getOperand(0).getReg())
    341     .addReg(IVAL).addMBB(MBB)
    342     .addReg(NDST).addMBB(loop);
    343 
    344   // The pseudo instruction is no longer needed so remove it
    345   MI->eraseFromParent();
    346   return finish;
    347 }
    348 
    349 MachineBasicBlock*
    350 MBlazeTargetLowering::EmitCustomSelect(MachineInstr *MI,
    351                                        MachineBasicBlock *MBB) const {
    352   const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
    353   DebugLoc dl = MI->getDebugLoc();
    354 
    355   // To "insert" a SELECT_CC instruction, we actually have to insert the
    356   // diamond control-flow pattern.  The incoming instruction knows the
    357   // destination vreg to set, the condition code register to branch on, the
    358   // true/false values to select between, and a branch opcode to use.
    359   const BasicBlock *LLVM_BB = MBB->getBasicBlock();
    360   MachineFunction::iterator It = MBB;
    361   ++It;
    362 
    363   //  thisMBB:
    364   //  ...
    365   //   TrueVal = ...
    366   //   setcc r1, r2, r3
    367   //   bNE   r1, r0, copy1MBB
    368   //   fallthrough --> copy0MBB
    369   MachineFunction *F = MBB->getParent();
    370   MachineBasicBlock *flsBB = F->CreateMachineBasicBlock(LLVM_BB);
    371   MachineBasicBlock *dneBB = F->CreateMachineBasicBlock(LLVM_BB);
    372 
    373   unsigned Opc;
    374   switch (MI->getOperand(4).getImm()) {
    375   default: llvm_unreachable("Unknown branch condition");
    376   case MBlazeCC::EQ: Opc = MBlaze::BEQID; break;
    377   case MBlazeCC::NE: Opc = MBlaze::BNEID; break;
    378   case MBlazeCC::GT: Opc = MBlaze::BGTID; break;
    379   case MBlazeCC::LT: Opc = MBlaze::BLTID; break;
    380   case MBlazeCC::GE: Opc = MBlaze::BGEID; break;
    381   case MBlazeCC::LE: Opc = MBlaze::BLEID; break;
    382   }
    383 
    384   F->insert(It, flsBB);
    385   F->insert(It, dneBB);
    386 
    387   // Transfer the remainder of MBB and its successor edges to dneBB.
    388   dneBB->splice(dneBB->begin(), MBB,
    389                 llvm::next(MachineBasicBlock::iterator(MI)),
    390                 MBB->end());
    391   dneBB->transferSuccessorsAndUpdatePHIs(MBB);
    392 
    393   MBB->addSuccessor(flsBB);
    394   MBB->addSuccessor(dneBB);
    395   flsBB->addSuccessor(dneBB);
    396 
    397   BuildMI(MBB, dl, TII->get(Opc))
    398     .addReg(MI->getOperand(3).getReg())
    399     .addMBB(dneBB);
    400 
    401   //  sinkMBB:
    402   //   %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ]
    403   //  ...
    404   //BuildMI(dneBB, dl, TII->get(MBlaze::PHI), MI->getOperand(0).getReg())
    405   //  .addReg(MI->getOperand(1).getReg()).addMBB(flsBB)
    406   //  .addReg(MI->getOperand(2).getReg()).addMBB(BB);
    407 
    408   BuildMI(*dneBB, dneBB->begin(), dl,
    409           TII->get(MBlaze::PHI), MI->getOperand(0).getReg())
    410     .addReg(MI->getOperand(2).getReg()).addMBB(flsBB)
    411     .addReg(MI->getOperand(1).getReg()).addMBB(MBB);
    412 
    413   MI->eraseFromParent();   // The pseudo instruction is gone now.
    414   return dneBB;
    415 }
    416 
    417 MachineBasicBlock*
    418 MBlazeTargetLowering::EmitCustomAtomic(MachineInstr *MI,
    419                                        MachineBasicBlock *MBB) const {
    420   const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
    421   DebugLoc dl = MI->getDebugLoc();
    422 
    423   // All atomic instructions on the Microblaze are implemented using the
    424   // load-linked / store-conditional style atomic instruction sequences.
    425   // Thus, all operations will look something like the following:
    426   //
    427   //  start:
    428   //    lwx     RV, RP, 0
    429   //    <do stuff>
    430   //    swx     RV, RP, 0
    431   //    addic   RC, R0, 0
    432   //    bneid   RC, start
    433   //
    434   //  exit:
    435   //
    436   // To "insert" a shift left instruction, we actually have to insert a
    437   // simple loop.  The incoming instruction knows the destination vreg to
    438   // set, the source vreg to operate over and the shift amount.
    439   const BasicBlock *LLVM_BB = MBB->getBasicBlock();
    440   MachineFunction::iterator It = MBB;
    441   ++It;
    442 
    443   // start:
    444   //   andi     samt, samt, 31
    445   //   beqid    samt, finish
    446   //   add      dst, src, r0
    447   // loop:
    448   //   addik    samt, samt, -1
    449   //   sra      dst, dst
    450   //   bneid    samt, loop
    451   //   nop
    452   // finish:
    453   MachineFunction *F = MBB->getParent();
    454   MachineRegisterInfo &R = F->getRegInfo();
    455 
    456   // Create the start and exit basic blocks for the atomic operation
    457   MachineBasicBlock *start = F->CreateMachineBasicBlock(LLVM_BB);
    458   MachineBasicBlock *exit = F->CreateMachineBasicBlock(LLVM_BB);
    459   F->insert(It, start);
    460   F->insert(It, exit);
    461 
    462   // Update machine-CFG edges by transferring adding all successors and
    463   // remaining instructions from the current block to the new block which
    464   // will contain the Phi node for the select.
    465   exit->splice(exit->begin(), MBB, llvm::next(MachineBasicBlock::iterator(MI)),
    466                MBB->end());
    467   exit->transferSuccessorsAndUpdatePHIs(MBB);
    468 
    469   // Add the fallthrough block as its successors.
    470   MBB->addSuccessor(start);
    471 
    472   BuildMI(start, dl, TII->get(MBlaze::LWX), MI->getOperand(0).getReg())
    473     .addReg(MI->getOperand(1).getReg())
    474     .addReg(MBlaze::R0);
    475 
    476   MachineBasicBlock *final = start;
    477   unsigned finalReg = 0;
    478 
    479   switch (MI->getOpcode()) {
    480   default: llvm_unreachable("Cannot lower unknown atomic instruction!");
    481 
    482   case MBlaze::SWP32:
    483     finalReg = MI->getOperand(2).getReg();
    484     start->addSuccessor(exit);
    485     start->addSuccessor(start);
    486     break;
    487 
    488   case MBlaze::LAN32:
    489   case MBlaze::LAX32:
    490   case MBlaze::LAO32:
    491   case MBlaze::LAD32:
    492   case MBlaze::LAS32:
    493   case MBlaze::LAA32: {
    494     unsigned opcode = 0;
    495     switch (MI->getOpcode()) {
    496     default: llvm_unreachable("Cannot lower unknown atomic load!");
    497     case MBlaze::LAA32: opcode = MBlaze::ADDIK; break;
    498     case MBlaze::LAS32: opcode = MBlaze::RSUBIK; break;
    499     case MBlaze::LAD32: opcode = MBlaze::AND; break;
    500     case MBlaze::LAO32: opcode = MBlaze::OR; break;
    501     case MBlaze::LAX32: opcode = MBlaze::XOR; break;
    502     case MBlaze::LAN32: opcode = MBlaze::AND; break;
    503     }
    504 
    505     finalReg = R.createVirtualRegister(&MBlaze::GPRRegClass);
    506     start->addSuccessor(exit);
    507     start->addSuccessor(start);
    508 
    509     BuildMI(start, dl, TII->get(opcode), finalReg)
    510       .addReg(MI->getOperand(0).getReg())
    511       .addReg(MI->getOperand(2).getReg());
    512 
    513     if (MI->getOpcode() == MBlaze::LAN32) {
    514       unsigned tmp = finalReg;
    515       finalReg = R.createVirtualRegister(&MBlaze::GPRRegClass);
    516       BuildMI(start, dl, TII->get(MBlaze::XORI), finalReg)
    517         .addReg(tmp)
    518         .addImm(-1);
    519     }
    520     break;
    521   }
    522 
    523   case MBlaze::CAS32: {
    524     finalReg = MI->getOperand(3).getReg();
    525     final = F->CreateMachineBasicBlock(LLVM_BB);
    526 
    527     F->insert(It, final);
    528     start->addSuccessor(exit);
    529     start->addSuccessor(final);
    530     final->addSuccessor(exit);
    531     final->addSuccessor(start);
    532 
    533     unsigned CMP = R.createVirtualRegister(&MBlaze::GPRRegClass);
    534     BuildMI(start, dl, TII->get(MBlaze::CMP), CMP)
    535       .addReg(MI->getOperand(0).getReg())
    536       .addReg(MI->getOperand(2).getReg());
    537 
    538     BuildMI(start, dl, TII->get(MBlaze::BNEID))
    539       .addReg(CMP)
    540       .addMBB(exit);
    541 
    542     final->moveAfter(start);
    543     exit->moveAfter(final);
    544     break;
    545   }
    546   }
    547 
    548   unsigned CHK = R.createVirtualRegister(&MBlaze::GPRRegClass);
    549   BuildMI(final, dl, TII->get(MBlaze::SWX))
    550     .addReg(finalReg)
    551     .addReg(MI->getOperand(1).getReg())
    552     .addReg(MBlaze::R0);
    553 
    554   BuildMI(final, dl, TII->get(MBlaze::ADDIC), CHK)
    555     .addReg(MBlaze::R0)
    556     .addImm(0);
    557 
    558   BuildMI(final, dl, TII->get(MBlaze::BNEID))
    559     .addReg(CHK)
    560     .addMBB(start);
    561 
    562   // The pseudo instruction is no longer needed so remove it
    563   MI->eraseFromParent();
    564   return exit;
    565 }
    566 
    567 //===----------------------------------------------------------------------===//
    568 //  Misc Lower Operation implementation
    569 //===----------------------------------------------------------------------===//
    570 //
    571 
    572 SDValue MBlazeTargetLowering::LowerSELECT_CC(SDValue Op,
    573                                              SelectionDAG &DAG) const {
    574   SDValue LHS = Op.getOperand(0);
    575   SDValue RHS = Op.getOperand(1);
    576   SDValue TrueVal = Op.getOperand(2);
    577   SDValue FalseVal = Op.getOperand(3);
    578   DebugLoc dl = Op.getDebugLoc();
    579   unsigned Opc;
    580 
    581   SDValue CompareFlag;
    582   if (LHS.getValueType() == MVT::i32) {
    583     Opc = MBlazeISD::Select_CC;
    584     CompareFlag = DAG.getNode(MBlazeISD::ICmp, dl, MVT::i32, LHS, RHS)
    585                     .getValue(1);
    586   } else {
    587     llvm_unreachable("Cannot lower select_cc with unknown type");
    588   }
    589 
    590   return DAG.getNode(Opc, dl, TrueVal.getValueType(), TrueVal, FalseVal,
    591                      CompareFlag);
    592 }
    593 
    594 SDValue MBlazeTargetLowering::
    595 LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
    596   // FIXME there isn't actually debug info here
    597   DebugLoc dl = Op.getDebugLoc();
    598   const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
    599   SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32);
    600 
    601   return DAG.getNode(MBlazeISD::Wrap, dl, MVT::i32, GA);
    602 }
    603 
    604 SDValue MBlazeTargetLowering::
    605 LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
    606   llvm_unreachable("TLS not implemented for MicroBlaze.");
    607 }
    608 
    609 SDValue MBlazeTargetLowering::
    610 LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
    611   SDValue ResNode;
    612   SDValue HiPart;
    613   // FIXME there isn't actually debug info here
    614   DebugLoc dl = Op.getDebugLoc();
    615 
    616   EVT PtrVT = Op.getValueType();
    617   JumpTableSDNode *JT  = cast<JumpTableSDNode>(Op);
    618 
    619   SDValue JTI = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, 0);
    620   return DAG.getNode(MBlazeISD::Wrap, dl, MVT::i32, JTI);
    621 }
    622 
    623 SDValue MBlazeTargetLowering::
    624 LowerConstantPool(SDValue Op, SelectionDAG &DAG) const {
    625   SDValue ResNode;
    626   ConstantPoolSDNode *N = cast<ConstantPoolSDNode>(Op);
    627   const Constant *C = N->getConstVal();
    628   DebugLoc dl = Op.getDebugLoc();
    629 
    630   SDValue CP = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment(),
    631                                          N->getOffset(), 0);
    632   return DAG.getNode(MBlazeISD::Wrap, dl, MVT::i32, CP);
    633 }
    634 
    635 SDValue MBlazeTargetLowering::LowerVASTART(SDValue Op,
    636                                            SelectionDAG &DAG) const {
    637   MachineFunction &MF = DAG.getMachineFunction();
    638   MBlazeFunctionInfo *FuncInfo = MF.getInfo<MBlazeFunctionInfo>();
    639 
    640   DebugLoc dl = Op.getDebugLoc();
    641   SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
    642                                  getPointerTy());
    643 
    644   // vastart just stores the address of the VarArgsFrameIndex slot into the
    645   // memory location argument.
    646   const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
    647   return DAG.getStore(Op.getOperand(0), dl, FI, Op.getOperand(1),
    648                       MachinePointerInfo(SV),
    649                       false, false, 0);
    650 }
    651 
    652 //===----------------------------------------------------------------------===//
    653 //                      Calling Convention Implementation
    654 //===----------------------------------------------------------------------===//
    655 
    656 #include "MBlazeGenCallingConv.inc"
    657 
    658 static bool CC_MBlaze_AssignReg(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
    659                                 CCValAssign::LocInfo &LocInfo,
    660                                 ISD::ArgFlagsTy &ArgFlags,
    661                                 CCState &State) {
    662   static const uint16_t ArgRegs[] = {
    663     MBlaze::R5, MBlaze::R6, MBlaze::R7,
    664     MBlaze::R8, MBlaze::R9, MBlaze::R10
    665   };
    666 
    667   const unsigned NumArgRegs = array_lengthof(ArgRegs);
    668   unsigned Reg = State.AllocateReg(ArgRegs, NumArgRegs);
    669   if (!Reg) return false;
    670 
    671   unsigned SizeInBytes = ValVT.getSizeInBits() >> 3;
    672   State.AllocateStack(SizeInBytes, SizeInBytes);
    673   State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
    674 
    675   return true;
    676 }
    677 
    678 //===----------------------------------------------------------------------===//
    679 //                  Call Calling Convention Implementation
    680 //===----------------------------------------------------------------------===//
    681 
    682 /// LowerCall - functions arguments are copied from virtual regs to
    683 /// (physical regs)/(stack frame), CALLSEQ_START and CALLSEQ_END are emitted.
    684 /// TODO: isVarArg, isTailCall.
    685 SDValue MBlazeTargetLowering::
    686 LowerCall(TargetLowering::CallLoweringInfo &CLI,
    687           SmallVectorImpl<SDValue> &InVals) const {
    688   SelectionDAG &DAG                     = CLI.DAG;
    689   DebugLoc &dl                          = CLI.DL;
    690   SmallVector<ISD::OutputArg, 32> &Outs = CLI.Outs;
    691   SmallVector<SDValue, 32> &OutVals     = CLI.OutVals;
    692   SmallVector<ISD::InputArg, 32> &Ins   = CLI.Ins;
    693   SDValue Chain                         = CLI.Chain;
    694   SDValue Callee                        = CLI.Callee;
    695   bool &isTailCall                      = CLI.IsTailCall;
    696   CallingConv::ID CallConv              = CLI.CallConv;
    697   bool isVarArg                         = CLI.IsVarArg;
    698 
    699   // MBlaze does not yet support tail call optimization
    700   isTailCall = false;
    701 
    702   // The MBlaze requires stack slots for arguments passed to var arg
    703   // functions even if they are passed in registers.
    704   bool needsRegArgSlots = isVarArg;
    705 
    706   MachineFunction &MF = DAG.getMachineFunction();
    707   MachineFrameInfo *MFI = MF.getFrameInfo();
    708   const TargetFrameLowering &TFI = *MF.getTarget().getFrameLowering();
    709 
    710   // Analyze operands of the call, assigning locations to each operand.
    711   SmallVector<CCValAssign, 16> ArgLocs;
    712   CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
    713                  getTargetMachine(), ArgLocs, *DAG.getContext());
    714   CCInfo.AnalyzeCallOperands(Outs, CC_MBlaze);
    715 
    716   // Get a count of how many bytes are to be pushed on the stack.
    717   unsigned NumBytes = CCInfo.getNextStackOffset();
    718 
    719   // Variable argument function calls require a minimum of 24-bytes of stack
    720   if (isVarArg && NumBytes < 24) NumBytes = 24;
    721 
    722   Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
    723 
    724   SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
    725   SmallVector<SDValue, 8> MemOpChains;
    726 
    727   // Walk the register/memloc assignments, inserting copies/loads.
    728   for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
    729     CCValAssign &VA = ArgLocs[i];
    730     MVT RegVT = VA.getLocVT();
    731     SDValue Arg = OutVals[i];
    732 
    733     // Promote the value if needed.
    734     switch (VA.getLocInfo()) {
    735     default: llvm_unreachable("Unknown loc info!");
    736     case CCValAssign::Full: break;
    737     case CCValAssign::SExt:
    738       Arg = DAG.getNode(ISD::SIGN_EXTEND, dl, RegVT, Arg);
    739       break;
    740     case CCValAssign::ZExt:
    741       Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, RegVT, Arg);
    742       break;
    743     case CCValAssign::AExt:
    744       Arg = DAG.getNode(ISD::ANY_EXTEND, dl, RegVT, Arg);
    745       break;
    746     }
    747 
    748     // Arguments that can be passed on register must be kept at
    749     // RegsToPass vector
    750     if (VA.isRegLoc()) {
    751       RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
    752     } else {
    753       // Register can't get to this point...
    754       assert(VA.isMemLoc());
    755 
    756       // Since we are alread passing values on the stack we don't
    757       // need to worry about creating additional slots for the
    758       // values passed via registers.
    759       needsRegArgSlots = false;
    760 
    761       // Create the frame index object for this incoming parameter
    762       unsigned ArgSize = VA.getValVT().getSizeInBits()/8;
    763       unsigned StackLoc = VA.getLocMemOffset() + 4;
    764       int FI = MFI->CreateFixedObject(ArgSize, StackLoc, true);
    765 
    766       SDValue PtrOff = DAG.getFrameIndex(FI,getPointerTy());
    767 
    768       // emit ISD::STORE whichs stores the
    769       // parameter value to a stack Location
    770       MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff,
    771                                          MachinePointerInfo(),
    772                                          false, false, 0));
    773     }
    774   }
    775 
    776   // If we need to reserve stack space for the arguments passed via registers
    777   // then create a fixed stack object at the beginning of the stack.
    778   if (needsRegArgSlots && TFI.hasReservedCallFrame(MF))
    779     MFI->CreateFixedObject(28,0,true);
    780 
    781   // Transform all store nodes into one single node because all store
    782   // nodes are independent of each other.
    783   if (!MemOpChains.empty())
    784     Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
    785                         &MemOpChains[0], MemOpChains.size());
    786 
    787   // Build a sequence of copy-to-reg nodes chained together with token
    788   // chain and flag operands which copy the outgoing args into registers.
    789   // The InFlag in necessary since all emitted instructions must be
    790   // stuck together.
    791   SDValue InFlag;
    792   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
    793     Chain = DAG.getCopyToReg(Chain, dl, RegsToPass[i].first,
    794                              RegsToPass[i].second, InFlag);
    795     InFlag = Chain.getValue(1);
    796   }
    797 
    798   // If the callee is a GlobalAddress/ExternalSymbol node (quite common, every
    799   // direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol
    800   // node so that legalize doesn't hack it.
    801   if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
    802     Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl,
    803                                 getPointerTy(), 0, 0);
    804   else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee))
    805     Callee = DAG.getTargetExternalSymbol(S->getSymbol(),
    806                                 getPointerTy(), 0);
    807 
    808   // MBlazeJmpLink = #chain, #target_address, #opt_in_flags...
    809   //             = Chain, Callee, Reg#1, Reg#2, ...
    810   //
    811   // Returns a chain & a flag for retval copy to use.
    812   SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
    813   SmallVector<SDValue, 8> Ops;
    814   Ops.push_back(Chain);
    815   Ops.push_back(Callee);
    816 
    817   // Add argument registers to the end of the list so that they are
    818   // known live into the call.
    819   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
    820     Ops.push_back(DAG.getRegister(RegsToPass[i].first,
    821                                   RegsToPass[i].second.getValueType()));
    822   }
    823 
    824   if (InFlag.getNode())
    825     Ops.push_back(InFlag);
    826 
    827   Chain  = DAG.getNode(MBlazeISD::JmpLink, dl, NodeTys, &Ops[0], Ops.size());
    828   InFlag = Chain.getValue(1);
    829 
    830   // Create the CALLSEQ_END node.
    831   Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, true),
    832                              DAG.getIntPtrConstant(0, true), InFlag);
    833   if (!Ins.empty())
    834     InFlag = Chain.getValue(1);
    835 
    836   // Handle result values, copying them out of physregs into vregs that we
    837   // return.
    838   return LowerCallResult(Chain, InFlag, CallConv, isVarArg,
    839                          Ins, dl, DAG, InVals);
    840 }
    841 
    842 /// LowerCallResult - Lower the result values of a call into the
    843 /// appropriate copies out of appropriate physical registers.
    844 SDValue MBlazeTargetLowering::
    845 LowerCallResult(SDValue Chain, SDValue InFlag, CallingConv::ID CallConv,
    846                 bool isVarArg, const SmallVectorImpl<ISD::InputArg> &Ins,
    847                 DebugLoc dl, SelectionDAG &DAG,
    848                 SmallVectorImpl<SDValue> &InVals) const {
    849   // Assign locations to each value returned by this call.
    850   SmallVector<CCValAssign, 16> RVLocs;
    851   CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
    852                  getTargetMachine(), RVLocs, *DAG.getContext());
    853 
    854   CCInfo.AnalyzeCallResult(Ins, RetCC_MBlaze);
    855 
    856   // Copy all of the result registers out of their specified physreg.
    857   for (unsigned i = 0; i != RVLocs.size(); ++i) {
    858     Chain = DAG.getCopyFromReg(Chain, dl, RVLocs[i].getLocReg(),
    859                                RVLocs[i].getValVT(), InFlag).getValue(1);
    860     InFlag = Chain.getValue(2);
    861     InVals.push_back(Chain.getValue(0));
    862   }
    863 
    864   return Chain;
    865 }
    866 
    867 //===----------------------------------------------------------------------===//
    868 //             Formal Arguments Calling Convention Implementation
    869 //===----------------------------------------------------------------------===//
    870 
    871 /// LowerFormalArguments - transform physical registers into
    872 /// virtual registers and generate load operations for
    873 /// arguments places on the stack.
    874 SDValue MBlazeTargetLowering::
    875 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
    876                      const SmallVectorImpl<ISD::InputArg> &Ins,
    877                      DebugLoc dl, SelectionDAG &DAG,
    878                      SmallVectorImpl<SDValue> &InVals) const {
    879   MachineFunction &MF = DAG.getMachineFunction();
    880   MachineFrameInfo *MFI = MF.getFrameInfo();
    881   MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
    882 
    883   unsigned StackReg = MF.getTarget().getRegisterInfo()->getFrameRegister(MF);
    884   MBlazeFI->setVarArgsFrameIndex(0);
    885 
    886   // Used with vargs to acumulate store chains.
    887   std::vector<SDValue> OutChains;
    888 
    889   // Keep track of the last register used for arguments
    890   unsigned ArgRegEnd = 0;
    891 
    892   // Assign locations to all of the incoming arguments.
    893   SmallVector<CCValAssign, 16> ArgLocs;
    894   CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
    895                  getTargetMachine(), ArgLocs, *DAG.getContext());
    896 
    897   CCInfo.AnalyzeFormalArguments(Ins, CC_MBlaze);
    898   SDValue StackPtr;
    899 
    900   for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
    901     CCValAssign &VA = ArgLocs[i];
    902 
    903     // Arguments stored on registers
    904     if (VA.isRegLoc()) {
    905       MVT RegVT = VA.getLocVT();
    906       ArgRegEnd = VA.getLocReg();
    907       const TargetRegisterClass *RC;
    908 
    909       if (RegVT == MVT::i32)
    910         RC = &MBlaze::GPRRegClass;
    911       else if (RegVT == MVT::f32)
    912         RC = &MBlaze::GPRRegClass;
    913       else
    914         llvm_unreachable("RegVT not supported by LowerFormalArguments");
    915 
    916       // Transform the arguments stored on
    917       // physical registers into virtual ones
    918       unsigned Reg = MF.addLiveIn(ArgRegEnd, RC);
    919       SDValue ArgValue = DAG.getCopyFromReg(Chain, dl, Reg, RegVT);
    920 
    921       // If this is an 8 or 16-bit value, it has been passed promoted
    922       // to 32 bits.  Insert an assert[sz]ext to capture this, then
    923       // truncate to the right size. If if is a floating point value
    924       // then convert to the correct type.
    925       if (VA.getLocInfo() != CCValAssign::Full) {
    926         unsigned Opcode = 0;
    927         if (VA.getLocInfo() == CCValAssign::SExt)
    928           Opcode = ISD::AssertSext;
    929         else if (VA.getLocInfo() == CCValAssign::ZExt)
    930           Opcode = ISD::AssertZext;
    931         if (Opcode)
    932           ArgValue = DAG.getNode(Opcode, dl, RegVT, ArgValue,
    933                                  DAG.getValueType(VA.getValVT()));
    934         ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
    935       }
    936 
    937       InVals.push_back(ArgValue);
    938     } else { // VA.isRegLoc()
    939       // sanity check
    940       assert(VA.isMemLoc());
    941 
    942       // The last argument is not a register
    943       ArgRegEnd = 0;
    944 
    945       // The stack pointer offset is relative to the caller stack frame.
    946       // Since the real stack size is unknown here, a negative SPOffset
    947       // is used so there's a way to adjust these offsets when the stack
    948       // size get known (on EliminateFrameIndex). A dummy SPOffset is
    949       // used instead of a direct negative address (which is recorded to
    950       // be used on emitPrologue) to avoid mis-calc of the first stack
    951       // offset on PEI::calculateFrameObjectOffsets.
    952       // Arguments are always 32-bit.
    953       unsigned ArgSize = VA.getLocVT().getSizeInBits()/8;
    954       unsigned StackLoc = VA.getLocMemOffset() + 4;
    955       int FI = MFI->CreateFixedObject(ArgSize, 0, true);
    956       MBlazeFI->recordLoadArgsFI(FI, -StackLoc);
    957       MBlazeFI->recordLiveIn(FI);
    958 
    959       // Create load nodes to retrieve arguments from the stack
    960       SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
    961       InVals.push_back(DAG.getLoad(VA.getValVT(), dl, Chain, FIN,
    962                                    MachinePointerInfo::getFixedStack(FI),
    963                                    false, false, false, 0));
    964     }
    965   }
    966 
    967   // To meet ABI, when VARARGS are passed on registers, the registers
    968   // must have their values written to the caller stack frame. If the last
    969   // argument was placed in the stack, there's no need to save any register.
    970   if ((isVarArg) && ArgRegEnd) {
    971     if (StackPtr.getNode() == 0)
    972       StackPtr = DAG.getRegister(StackReg, getPointerTy());
    973 
    974     // The last register argument that must be saved is MBlaze::R10
    975     const TargetRegisterClass *RC = &MBlaze::GPRRegClass;
    976 
    977     unsigned Begin = getMBlazeRegisterNumbering(MBlaze::R5);
    978     unsigned Start = getMBlazeRegisterNumbering(ArgRegEnd+1);
    979     unsigned End   = getMBlazeRegisterNumbering(MBlaze::R10);
    980     unsigned StackLoc = Start - Begin + 1;
    981 
    982     for (; Start <= End; ++Start, ++StackLoc) {
    983       unsigned Reg = getMBlazeRegisterFromNumbering(Start);
    984       unsigned LiveReg = MF.addLiveIn(Reg, RC);
    985       SDValue ArgValue = DAG.getCopyFromReg(Chain, dl, LiveReg, MVT::i32);
    986 
    987       int FI = MFI->CreateFixedObject(4, 0, true);
    988       MBlazeFI->recordStoreVarArgsFI(FI, -(StackLoc*4));
    989       SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy());
    990       OutChains.push_back(DAG.getStore(Chain, dl, ArgValue, PtrOff,
    991                                        MachinePointerInfo(),
    992                                        false, false, 0));
    993 
    994       // Record the frame index of the first variable argument
    995       // which is a value necessary to VASTART.
    996       if (!MBlazeFI->getVarArgsFrameIndex())
    997         MBlazeFI->setVarArgsFrameIndex(FI);
    998     }
    999   }
   1000 
   1001   // All stores are grouped in one node to allow the matching between
   1002   // the size of Ins and InVals. This only happens when on varg functions
   1003   if (!OutChains.empty()) {
   1004     OutChains.push_back(Chain);
   1005     Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
   1006                         &OutChains[0], OutChains.size());
   1007   }
   1008 
   1009   return Chain;
   1010 }
   1011 
   1012 //===----------------------------------------------------------------------===//
   1013 //               Return Value Calling Convention Implementation
   1014 //===----------------------------------------------------------------------===//
   1015 
   1016 SDValue MBlazeTargetLowering::
   1017 LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
   1018             const SmallVectorImpl<ISD::OutputArg> &Outs,
   1019             const SmallVectorImpl<SDValue> &OutVals,
   1020             DebugLoc dl, SelectionDAG &DAG) const {
   1021   // CCValAssign - represent the assignment of
   1022   // the return value to a location
   1023   SmallVector<CCValAssign, 16> RVLocs;
   1024 
   1025   // CCState - Info about the registers and stack slot.
   1026   CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
   1027                  getTargetMachine(), RVLocs, *DAG.getContext());
   1028 
   1029   // Analize return values.
   1030   CCInfo.AnalyzeReturn(Outs, RetCC_MBlaze);
   1031 
   1032   SDValue Flag;
   1033   SmallVector<SDValue, 4> RetOps(1, Chain);
   1034 
   1035   // If this function is using the interrupt_handler calling convention
   1036   // then use "rtid r14, 0" otherwise use "rtsd r15, 8"
   1037   unsigned Ret = (CallConv == CallingConv::MBLAZE_INTR) ? MBlazeISD::IRet
   1038                                                         : MBlazeISD::Ret;
   1039   unsigned Reg = (CallConv == CallingConv::MBLAZE_INTR) ? MBlaze::R14
   1040                                                         : MBlaze::R15;
   1041   RetOps.push_back(DAG.getRegister(Reg, MVT::i32));
   1042 
   1043 
   1044   // Copy the result values into the output registers.
   1045   for (unsigned i = 0; i != RVLocs.size(); ++i) {
   1046     CCValAssign &VA = RVLocs[i];
   1047     assert(VA.isRegLoc() && "Can only return in registers!");
   1048 
   1049     Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(),
   1050                              OutVals[i], Flag);
   1051 
   1052     // guarantee that all emitted copies are
   1053     // stuck together, avoiding something bad
   1054     Flag = Chain.getValue(1);
   1055     RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
   1056   }
   1057 
   1058   RetOps[0] = Chain;  // Update chain.
   1059 
   1060   // Add the flag if we have it.
   1061   if (Flag.getNode())
   1062     RetOps.push_back(Flag);
   1063 
   1064   return DAG.getNode(Ret, dl, MVT::Other, &RetOps[0], RetOps.size());
   1065 }
   1066 
   1067 //===----------------------------------------------------------------------===//
   1068 //                           MBlaze Inline Assembly Support
   1069 //===----------------------------------------------------------------------===//
   1070 
   1071 /// getConstraintType - Given a constraint letter, return the type of
   1072 /// constraint it is for this target.
   1073 MBlazeTargetLowering::ConstraintType MBlazeTargetLowering::
   1074 getConstraintType(const std::string &Constraint) const
   1075 {
   1076   // MBlaze specific constrainy
   1077   //
   1078   // 'd' : An address register. Equivalent to r.
   1079   // 'y' : Equivalent to r; retained for
   1080   //       backwards compatibility.
   1081   // 'f' : Floating Point registers.
   1082   if (Constraint.size() == 1) {
   1083     switch (Constraint[0]) {
   1084       default : break;
   1085       case 'd':
   1086       case 'y':
   1087       case 'f':
   1088         return C_RegisterClass;
   1089     }
   1090   }
   1091   return TargetLowering::getConstraintType(Constraint);
   1092 }
   1093 
   1094 /// Examine constraint type and operand type and determine a weight value.
   1095 /// This object must already have been set up with the operand type
   1096 /// and the current alternative constraint selected.
   1097 TargetLowering::ConstraintWeight
   1098 MBlazeTargetLowering::getSingleConstraintMatchWeight(
   1099     AsmOperandInfo &info, const char *constraint) const {
   1100   ConstraintWeight weight = CW_Invalid;
   1101   Value *CallOperandVal = info.CallOperandVal;
   1102     // If we don't have a value, we can't do a match,
   1103     // but allow it at the lowest weight.
   1104   if (CallOperandVal == NULL)
   1105     return CW_Default;
   1106   Type *type = CallOperandVal->getType();
   1107   // Look at the constraint type.
   1108   switch (*constraint) {
   1109   default:
   1110     weight = TargetLowering::getSingleConstraintMatchWeight(info, constraint);
   1111     break;
   1112   case 'd':
   1113   case 'y':
   1114     if (type->isIntegerTy())
   1115       weight = CW_Register;
   1116     break;
   1117   case 'f':
   1118     if (type->isFloatTy())
   1119       weight = CW_Register;
   1120     break;
   1121   }
   1122   return weight;
   1123 }
   1124 
   1125 /// Given a register class constraint, like 'r', if this corresponds directly
   1126 /// to an LLVM register class, return a register of 0 and the register class
   1127 /// pointer.
   1128 std::pair<unsigned, const TargetRegisterClass*> MBlazeTargetLowering::
   1129 getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const {
   1130   if (Constraint.size() == 1) {
   1131     switch (Constraint[0]) {
   1132     case 'r':
   1133       return std::make_pair(0U, &MBlaze::GPRRegClass);
   1134       // TODO: These can't possibly be right, but match what was in
   1135       // getRegClassForInlineAsmConstraint.
   1136     case 'd':
   1137     case 'y':
   1138     case 'f':
   1139       if (VT == MVT::f32)
   1140         return std::make_pair(0U, &MBlaze::GPRRegClass);
   1141     }
   1142   }
   1143   return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
   1144 }
   1145 
   1146 bool MBlazeTargetLowering::
   1147 isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
   1148   // The MBlaze target isn't yet aware of offsets.
   1149   return false;
   1150 }
   1151 
   1152 bool MBlazeTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
   1153   return VT != MVT::f32;
   1154 }
   1155