PPCISelLowering.cpp revision 6de08f4377302cb73ca6a378410889be423af20f
1//===-- PPC32ISelLowering.cpp - PPC32 DAG Lowering Implementation ---------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the PPC32ISelLowering class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "PPC32ISelLowering.h"
15#include "PPC32TargetMachine.h"
16#include "llvm/CodeGen/MachineFrameInfo.h"
17#include "llvm/CodeGen/MachineFunction.h"
18#include "llvm/CodeGen/MachineInstrBuilder.h"
19#include "llvm/CodeGen/SelectionDAG.h"
20#include "llvm/Constants.h"
21#include "llvm/Function.h"
22using namespace llvm;
23
24PPC32TargetLowering::PPC32TargetLowering(TargetMachine &TM)
25  : TargetLowering(TM) {
26
27  // Fold away setcc operations if possible.
28  setSetCCIsExpensive();
29
30  // Set up the register classes.
31  addRegisterClass(MVT::i32, PPC32::GPRCRegisterClass);
32  addRegisterClass(MVT::f32, PPC32::FPRCRegisterClass);
33  addRegisterClass(MVT::f64, PPC32::FPRCRegisterClass);
34
35  // PowerPC has no intrinsics for these particular operations
36  setOperationAction(ISD::MEMMOVE, MVT::Other, Expand);
37  setOperationAction(ISD::MEMSET, MVT::Other, Expand);
38  setOperationAction(ISD::MEMCPY, MVT::Other, Expand);
39
40  // PowerPC has an i16 but no i8 (or i1) SEXTLOAD
41  setOperationAction(ISD::SEXTLOAD, MVT::i1, Expand);
42  setOperationAction(ISD::SEXTLOAD, MVT::i8, Expand);
43
44  // PowerPC has no SREM/UREM instructions
45  setOperationAction(ISD::SREM, MVT::i32, Expand);
46  setOperationAction(ISD::UREM, MVT::i32, Expand);
47
48  // We don't support sin/cos/sqrt/fmod
49  setOperationAction(ISD::FSIN , MVT::f64, Expand);
50  setOperationAction(ISD::FCOS , MVT::f64, Expand);
51  setOperationAction(ISD::SREM , MVT::f64, Expand);
52  setOperationAction(ISD::FSIN , MVT::f32, Expand);
53  setOperationAction(ISD::FCOS , MVT::f32, Expand);
54  setOperationAction(ISD::SREM , MVT::f32, Expand);
55
56  // If we're enabling GP optimizations, use hardware square root
57  if (!TM.getSubtarget<PPCSubtarget>().isGigaProcessor()) {
58    setOperationAction(ISD::FSQRT, MVT::f64, Expand);
59    setOperationAction(ISD::FSQRT, MVT::f32, Expand);
60  }
61
62  // PowerPC does not have CTPOP or CTTZ
63  setOperationAction(ISD::CTPOP, MVT::i32  , Expand);
64  setOperationAction(ISD::CTTZ , MVT::i32  , Expand);
65
66  // PowerPC does not have Select
67  setOperationAction(ISD::SELECT, MVT::i32, Expand);
68  setOperationAction(ISD::SELECT, MVT::f32, Expand);
69  setOperationAction(ISD::SELECT, MVT::f64, Expand);
70
71  // PowerPC wants to turn select_cc of FP into fsel when possible.
72  setOperationAction(ISD::SELECT_CC, MVT::f32, Custom);
73  setOperationAction(ISD::SELECT_CC, MVT::f64, Custom);
74
75  // PowerPC does not have BRCOND* which requires SetCC
76  setOperationAction(ISD::BRCOND,       MVT::Other, Expand);
77  setOperationAction(ISD::BRCONDTWOWAY, MVT::Other, Expand);
78
79  // PowerPC does not have FP_TO_UINT
80  setOperationAction(ISD::FP_TO_UINT, MVT::i32, Expand);
81
82  // PowerPC does not have [U|S]INT_TO_FP
83  setOperationAction(ISD::SINT_TO_FP, MVT::i32, Expand);
84  setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand);
85
86  setSetCCResultContents(ZeroOrOneSetCCResult);
87
88  computeRegisterProperties();
89}
90
91/// isFloatingPointZero - Return true if this is 0.0 or -0.0.
92static bool isFloatingPointZero(SDOperand Op) {
93  if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(Op))
94    return CFP->isExactlyValue(-0.0) || CFP->isExactlyValue(0.0);
95  else if (Op.getOpcode() == ISD::EXTLOAD || Op.getOpcode() == ISD::LOAD) {
96    // Maybe this has already been legalized into the constant pool?
97    if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(Op.getOperand(1)))
98      if (ConstantFP *CFP = dyn_cast<ConstantFP>(CP->get()))
99        return CFP->isExactlyValue(-0.0) || CFP->isExactlyValue(0.0);
100  }
101  return false;
102}
103
104/// LowerOperation - Provide custom lowering hooks for some operations.
105///
106SDOperand PPC32TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
107  switch (Op.getOpcode()) {
108  default: assert(0 && "Wasn't expecting to be able to lower this!");
109  case ISD::SELECT_CC:
110    // Turn FP only select_cc's into fsel instructions.
111    if (MVT::isFloatingPoint(Op.getOperand(0).getValueType()) &&
112        MVT::isFloatingPoint(Op.getOperand(2).getValueType())) {
113      ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get();
114
115      // Cannot handle SETEQ/SETNE.
116      if (CC == ISD::SETEQ || CC == ISD::SETNE) break;
117
118      MVT::ValueType ResVT = Op.getValueType();
119      MVT::ValueType CmpVT = Op.getOperand(0).getValueType();
120      SDOperand LHS = Op.getOperand(0), RHS = Op.getOperand(1);
121      SDOperand TV  = Op.getOperand(2), FV  = Op.getOperand(3);
122
123      // If the RHS of the comparison is a 0.0, we don't need to do the
124      // subtraction at all.
125      if (isFloatingPointZero(RHS))
126        switch (CC) {
127        default: assert(0 && "Invalid FSEL condition"); abort();
128        case ISD::SETULT:
129        case ISD::SETLT:
130          std::swap(TV, FV);  // fsel is natively setge, swap operands for setlt
131        case ISD::SETUGE:
132        case ISD::SETGE:
133          return DAG.getNode(PPCISD::FSEL, ResVT, LHS, TV, FV);
134        case ISD::SETUGT:
135        case ISD::SETGT:
136          std::swap(TV, FV);  // fsel is natively setge, swap operands for setlt
137        case ISD::SETULE:
138        case ISD::SETLE:
139          return DAG.getNode(PPCISD::FSEL, ResVT,
140                             DAG.getNode(ISD::FNEG, ResVT, LHS), TV, FV);
141        }
142
143      switch (CC) {
144      default: assert(0 && "Invalid FSEL condition"); abort();
145      case ISD::SETULT:
146      case ISD::SETLT:
147        return DAG.getNode(PPCISD::FSEL, ResVT,
148                           DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), FV, TV);
149      case ISD::SETUGE:
150      case ISD::SETGE:
151        return DAG.getNode(PPCISD::FSEL, ResVT,
152                           DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), TV, FV);
153      case ISD::SETUGT:
154      case ISD::SETGT:
155        return DAG.getNode(PPCISD::FSEL, ResVT,
156                           DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), FV, TV);
157      case ISD::SETULE:
158      case ISD::SETLE:
159        return DAG.getNode(PPCISD::FSEL, ResVT,
160                           DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), TV, FV);
161      }
162    }
163    break;
164  }
165  return SDOperand();
166}
167
168std::vector<SDOperand>
169PPC32TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) {
170  //
171  // add beautiful description of PPC stack frame format, or at least some docs
172  //
173  MachineFunction &MF = DAG.getMachineFunction();
174  MachineFrameInfo *MFI = MF.getFrameInfo();
175  MachineBasicBlock& BB = MF.front();
176  std::vector<SDOperand> ArgValues;
177
178  // Due to the rather complicated nature of the PowerPC ABI, rather than a
179  // fixed size array of physical args, for the sake of simplicity let the STL
180  // handle tracking them for us.
181  std::vector<unsigned> argVR, argPR, argOp;
182  unsigned ArgOffset = 24;
183  unsigned GPR_remaining = 8;
184  unsigned FPR_remaining = 13;
185  unsigned GPR_idx = 0, FPR_idx = 0;
186  static const unsigned GPR[] = {
187    PPC::R3, PPC::R4, PPC::R5, PPC::R6,
188    PPC::R7, PPC::R8, PPC::R9, PPC::R10,
189  };
190  static const unsigned FPR[] = {
191    PPC::F1, PPC::F2, PPC::F3, PPC::F4, PPC::F5, PPC::F6, PPC::F7,
192    PPC::F8, PPC::F9, PPC::F10, PPC::F11, PPC::F12, PPC::F13
193  };
194
195  // Add DAG nodes to load the arguments...  On entry to a function on PPC,
196  // the arguments start at offset 24, although they are likely to be passed
197  // in registers.
198  for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) {
199    SDOperand newroot, argt;
200    unsigned ObjSize;
201    bool needsLoad = false;
202    bool ArgLive = !I->use_empty();
203    MVT::ValueType ObjectVT = getValueType(I->getType());
204
205    switch (ObjectVT) {
206    default: assert(0 && "Unhandled argument type!");
207    case MVT::i1:
208    case MVT::i8:
209    case MVT::i16:
210    case MVT::i32:
211      ObjSize = 4;
212      if (!ArgLive) break;
213      if (GPR_remaining > 0) {
214        MF.addLiveIn(GPR[GPR_idx]);
215        argt = newroot = DAG.getCopyFromReg(DAG.getRoot(),
216                                            GPR[GPR_idx], MVT::i32);
217        if (ObjectVT != MVT::i32)
218          argt = DAG.getNode(ISD::TRUNCATE, ObjectVT, newroot);
219      } else {
220        needsLoad = true;
221      }
222      break;
223    case MVT::i64: ObjSize = 8;
224      if (!ArgLive) break;
225      if (GPR_remaining > 0) {
226        SDOperand argHi, argLo;
227        MF.addLiveIn(GPR[GPR_idx]);
228        argHi = DAG.getCopyFromReg(DAG.getRoot(), GPR[GPR_idx], MVT::i32);
229        // If we have two or more remaining argument registers, then both halves
230        // of the i64 can be sourced from there.  Otherwise, the lower half will
231        // have to come off the stack.  This can happen when an i64 is preceded
232        // by 28 bytes of arguments.
233        if (GPR_remaining > 1) {
234          MF.addLiveIn(GPR[GPR_idx+1]);
235          argLo = DAG.getCopyFromReg(argHi, GPR[GPR_idx+1], MVT::i32);
236        } else {
237          int FI = MFI->CreateFixedObject(4, ArgOffset+4);
238          SDOperand FIN = DAG.getFrameIndex(FI, MVT::i32);
239          argLo = DAG.getLoad(MVT::i32, DAG.getEntryNode(), FIN,
240                              DAG.getSrcValue(NULL));
241        }
242        // Build the outgoing arg thingy
243        argt = DAG.getNode(ISD::BUILD_PAIR, MVT::i64, argLo, argHi);
244        newroot = argLo;
245      } else {
246        needsLoad = true;
247      }
248      break;
249    case MVT::f32:
250    case MVT::f64:
251      ObjSize = (ObjectVT == MVT::f64) ? 8 : 4;
252      if (!ArgLive) break;
253      if (FPR_remaining > 0) {
254        MF.addLiveIn(FPR[FPR_idx]);
255        argt = newroot = DAG.getCopyFromReg(DAG.getRoot(),
256                                            FPR[FPR_idx], ObjectVT);
257        --FPR_remaining;
258        ++FPR_idx;
259      } else {
260        needsLoad = true;
261      }
262      break;
263    }
264
265    // We need to load the argument to a virtual register if we determined above
266    // that we ran out of physical registers of the appropriate type
267    if (needsLoad) {
268      unsigned SubregOffset = 0;
269      if (ObjectVT == MVT::i8 || ObjectVT == MVT::i1) SubregOffset = 3;
270      if (ObjectVT == MVT::i16) SubregOffset = 2;
271      int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
272      SDOperand FIN = DAG.getFrameIndex(FI, MVT::i32);
273      FIN = DAG.getNode(ISD::ADD, MVT::i32, FIN,
274                        DAG.getConstant(SubregOffset, MVT::i32));
275      argt = newroot = DAG.getLoad(ObjectVT, DAG.getEntryNode(), FIN,
276                                   DAG.getSrcValue(NULL));
277    }
278
279    // Every 4 bytes of argument space consumes one of the GPRs available for
280    // argument passing.
281    if (GPR_remaining > 0) {
282      unsigned delta = (GPR_remaining > 1 && ObjSize == 8) ? 2 : 1;
283      GPR_remaining -= delta;
284      GPR_idx += delta;
285    }
286    ArgOffset += ObjSize;
287    if (newroot.Val)
288      DAG.setRoot(newroot.getValue(1));
289
290    ArgValues.push_back(argt);
291  }
292
293  // If the function takes variable number of arguments, make a frame index for
294  // the start of the first vararg value... for expansion of llvm.va_start.
295  if (F.isVarArg()) {
296    VarArgsFrameIndex = MFI->CreateFixedObject(4, ArgOffset);
297    SDOperand FIN = DAG.getFrameIndex(VarArgsFrameIndex, MVT::i32);
298    // If this function is vararg, store any remaining integer argument regs
299    // to their spots on the stack so that they may be loaded by deferencing the
300    // result of va_next.
301    std::vector<SDOperand> MemOps;
302    for (; GPR_remaining > 0; --GPR_remaining, ++GPR_idx) {
303      MF.addLiveIn(GPR[GPR_idx]);
304      SDOperand Val = DAG.getCopyFromReg(DAG.getRoot(), GPR[GPR_idx], MVT::i32);
305      SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Val.getValue(1),
306                                    Val, FIN, DAG.getSrcValue(NULL));
307      MemOps.push_back(Store);
308      // Increment the address by four for the next argument to store
309      SDOperand PtrOff = DAG.getConstant(4, getPointerTy());
310      FIN = DAG.getNode(ISD::ADD, MVT::i32, FIN, PtrOff);
311    }
312    DAG.setRoot(DAG.getNode(ISD::TokenFactor, MVT::Other, MemOps));
313  }
314
315  // Finally, inform the code generator which regs we return values in.
316  switch (getValueType(F.getReturnType())) {
317    default: assert(0 && "Unknown type!");
318    case MVT::isVoid: break;
319    case MVT::i1:
320    case MVT::i8:
321    case MVT::i16:
322    case MVT::i32:
323      MF.addLiveOut(PPC::R3);
324      break;
325    case MVT::i64:
326      MF.addLiveOut(PPC::R3);
327      MF.addLiveOut(PPC::R4);
328      break;
329    case MVT::f32:
330    case MVT::f64:
331      MF.addLiveOut(PPC::F1);
332      break;
333  }
334
335  return ArgValues;
336}
337
338std::pair<SDOperand, SDOperand>
339PPC32TargetLowering::LowerCallTo(SDOperand Chain,
340                                 const Type *RetTy, bool isVarArg,
341                                 unsigned CallingConv, bool isTailCall,
342                                 SDOperand Callee, ArgListTy &Args,
343                                 SelectionDAG &DAG) {
344  // args_to_use will accumulate outgoing args for the ISD::CALL case in
345  // SelectExpr to use to put the arguments in the appropriate registers.
346  std::vector<SDOperand> args_to_use;
347
348  // Count how many bytes are to be pushed on the stack, including the linkage
349  // area, and parameter passing area.
350  unsigned NumBytes = 24;
351
352  if (Args.empty()) {
353    Chain = DAG.getNode(ISD::CALLSEQ_START, MVT::Other, Chain,
354                        DAG.getConstant(NumBytes, getPointerTy()));
355  } else {
356    for (unsigned i = 0, e = Args.size(); i != e; ++i) {
357      switch (getValueType(Args[i].second)) {
358      default: assert(0 && "Unknown value type!");
359      case MVT::i1:
360      case MVT::i8:
361      case MVT::i16:
362      case MVT::i32:
363      case MVT::f32:
364        NumBytes += 4;
365        break;
366      case MVT::i64:
367      case MVT::f64:
368        NumBytes += 8;
369        break;
370      }
371    }
372
373    // Just to be safe, we'll always reserve the full 24 bytes of linkage area
374    // plus 32 bytes of argument space in case any called code gets funky on us.
375    // (Required by ABI to support var arg)
376    if (NumBytes < 56) NumBytes = 56;
377
378    // Adjust the stack pointer for the new arguments...
379    // These operations are automatically eliminated by the prolog/epilog pass
380    Chain = DAG.getNode(ISD::CALLSEQ_START, MVT::Other, Chain,
381                        DAG.getConstant(NumBytes, getPointerTy()));
382
383    // Set up a copy of the stack pointer for use loading and storing any
384    // arguments that may not fit in the registers available for argument
385    // passing.
386    SDOperand StackPtr = DAG.getCopyFromReg(DAG.getEntryNode(),
387                                            PPC::R1, MVT::i32);
388
389    // Figure out which arguments are going to go in registers, and which in
390    // memory.  Also, if this is a vararg function, floating point operations
391    // must be stored to our stack, and loaded into integer regs as well, if
392    // any integer regs are available for argument passing.
393    unsigned ArgOffset = 24;
394    unsigned GPR_remaining = 8;
395    unsigned FPR_remaining = 13;
396
397    std::vector<SDOperand> MemOps;
398    for (unsigned i = 0, e = Args.size(); i != e; ++i) {
399      // PtrOff will be used to store the current argument to the stack if a
400      // register cannot be found for it.
401      SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
402      PtrOff = DAG.getNode(ISD::ADD, MVT::i32, StackPtr, PtrOff);
403      MVT::ValueType ArgVT = getValueType(Args[i].second);
404
405      switch (ArgVT) {
406      default: assert(0 && "Unexpected ValueType for argument!");
407      case MVT::i1:
408      case MVT::i8:
409      case MVT::i16:
410        // Promote the integer to 32 bits.  If the input type is signed use a
411        // sign extend, otherwise use a zero extend.
412        if (Args[i].second->isSigned())
413          Args[i].first =DAG.getNode(ISD::SIGN_EXTEND, MVT::i32, Args[i].first);
414        else
415          Args[i].first =DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Args[i].first);
416        // FALL THROUGH
417      case MVT::i32:
418        if (GPR_remaining > 0) {
419          args_to_use.push_back(Args[i].first);
420          --GPR_remaining;
421        } else {
422          MemOps.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain,
423                                       Args[i].first, PtrOff,
424                                       DAG.getSrcValue(NULL)));
425        }
426        ArgOffset += 4;
427        break;
428      case MVT::i64:
429        // If we have one free GPR left, we can place the upper half of the i64
430        // in it, and store the other half to the stack.  If we have two or more
431        // free GPRs, then we can pass both halves of the i64 in registers.
432        if (GPR_remaining > 0) {
433          SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32,
434                                     Args[i].first, DAG.getConstant(1, MVT::i32));
435          SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32,
436                                     Args[i].first, DAG.getConstant(0, MVT::i32));
437          args_to_use.push_back(Hi);
438          --GPR_remaining;
439          if (GPR_remaining > 0) {
440            args_to_use.push_back(Lo);
441            --GPR_remaining;
442          } else {
443            SDOperand ConstFour = DAG.getConstant(4, getPointerTy());
444            PtrOff = DAG.getNode(ISD::ADD, MVT::i32, PtrOff, ConstFour);
445            MemOps.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain,
446                                         Lo, PtrOff, DAG.getSrcValue(NULL)));
447          }
448        } else {
449          MemOps.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain,
450                                       Args[i].first, PtrOff,
451                                       DAG.getSrcValue(NULL)));
452        }
453        ArgOffset += 8;
454        break;
455      case MVT::f32:
456      case MVT::f64:
457        if (FPR_remaining > 0) {
458          args_to_use.push_back(Args[i].first);
459          --FPR_remaining;
460          if (isVarArg) {
461            SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Chain,
462                                          Args[i].first, PtrOff,
463                                          DAG.getSrcValue(NULL));
464            MemOps.push_back(Store);
465            // Float varargs are always shadowed in available integer registers
466            if (GPR_remaining > 0) {
467              SDOperand Load = DAG.getLoad(MVT::i32, Store, PtrOff,
468                                           DAG.getSrcValue(NULL));
469              MemOps.push_back(Load);
470              args_to_use.push_back(Load);
471              --GPR_remaining;
472            }
473            if (GPR_remaining > 0 && MVT::f64 == ArgVT) {
474              SDOperand ConstFour = DAG.getConstant(4, getPointerTy());
475              PtrOff = DAG.getNode(ISD::ADD, MVT::i32, PtrOff, ConstFour);
476              SDOperand Load = DAG.getLoad(MVT::i32, Store, PtrOff,
477                                           DAG.getSrcValue(NULL));
478              MemOps.push_back(Load);
479              args_to_use.push_back(Load);
480              --GPR_remaining;
481            }
482          } else {
483            // If we have any FPRs remaining, we may also have GPRs remaining.
484            // Args passed in FPRs consume either 1 (f32) or 2 (f64) available
485            // GPRs.
486            if (GPR_remaining > 0) {
487              args_to_use.push_back(DAG.getNode(ISD::UNDEF, MVT::i32));
488              --GPR_remaining;
489            }
490            if (GPR_remaining > 0 && MVT::f64 == ArgVT) {
491              args_to_use.push_back(DAG.getNode(ISD::UNDEF, MVT::i32));
492              --GPR_remaining;
493            }
494          }
495        } else {
496          MemOps.push_back(DAG.getNode(ISD::STORE, MVT::Other, Chain,
497                                       Args[i].first, PtrOff,
498                                       DAG.getSrcValue(NULL)));
499        }
500        ArgOffset += (ArgVT == MVT::f32) ? 4 : 8;
501        break;
502      }
503    }
504    if (!MemOps.empty())
505      Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, MemOps);
506  }
507
508  std::vector<MVT::ValueType> RetVals;
509  MVT::ValueType RetTyVT = getValueType(RetTy);
510  if (RetTyVT != MVT::isVoid)
511    RetVals.push_back(RetTyVT);
512  RetVals.push_back(MVT::Other);
513
514  SDOperand TheCall = SDOperand(DAG.getCall(RetVals,
515                                            Chain, Callee, args_to_use), 0);
516  Chain = TheCall.getValue(RetTyVT != MVT::isVoid);
517  Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain,
518                      DAG.getConstant(NumBytes, getPointerTy()));
519  return std::make_pair(TheCall, Chain);
520}
521
522SDOperand PPC32TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP,
523                                            Value *VAListV, SelectionDAG &DAG) {
524  // vastart just stores the address of the VarArgsFrameIndex slot into the
525  // memory location argument.
526  SDOperand FR = DAG.getFrameIndex(VarArgsFrameIndex, MVT::i32);
527  return DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, VAListP,
528                     DAG.getSrcValue(VAListV));
529}
530
531std::pair<SDOperand,SDOperand>
532PPC32TargetLowering::LowerVAArg(SDOperand Chain,
533                                SDOperand VAListP, Value *VAListV,
534                                const Type *ArgTy, SelectionDAG &DAG) {
535  MVT::ValueType ArgVT = getValueType(ArgTy);
536
537  SDOperand VAList =
538    DAG.getLoad(MVT::i32, Chain, VAListP, DAG.getSrcValue(VAListV));
539  SDOperand Result = DAG.getLoad(ArgVT, Chain, VAList, DAG.getSrcValue(NULL));
540  unsigned Amt;
541  if (ArgVT == MVT::i32 || ArgVT == MVT::f32)
542    Amt = 4;
543  else {
544    assert((ArgVT == MVT::i64 || ArgVT == MVT::f64) &&
545           "Other types should have been promoted for varargs!");
546    Amt = 8;
547  }
548  VAList = DAG.getNode(ISD::ADD, VAList.getValueType(), VAList,
549                       DAG.getConstant(Amt, VAList.getValueType()));
550  Chain = DAG.getNode(ISD::STORE, MVT::Other, Chain,
551                      VAList, VAListP, DAG.getSrcValue(VAListV));
552  return std::make_pair(Result, Chain);
553}
554
555
556std::pair<SDOperand, SDOperand> PPC32TargetLowering::
557LowerFrameReturnAddress(bool isFrameAddress, SDOperand Chain, unsigned Depth,
558                        SelectionDAG &DAG) {
559  assert(0 && "LowerFrameReturnAddress unimplemented");
560  abort();
561}
562
563MachineBasicBlock *
564PPC32TargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI,
565                                             MachineBasicBlock *BB) {
566  assert((MI->getOpcode() == PPC::SELECT_CC_Int ||
567          MI->getOpcode() == PPC::SELECT_CC_FP) &&
568         "Unexpected instr type to insert");
569
570  // To "insert" a SELECT_CC instruction, we actually have to insert the diamond
571  // control-flow pattern.  The incoming instruction knows the destination vreg
572  // to set, the condition code register to branch on, the true/false values to
573  // select between, and a branch opcode to use.
574  const BasicBlock *LLVM_BB = BB->getBasicBlock();
575  ilist<MachineBasicBlock>::iterator It = BB;
576  ++It;
577
578  //  thisMBB:
579  //  ...
580  //   TrueVal = ...
581  //   cmpTY ccX, r1, r2
582  //   bCC copy1MBB
583  //   fallthrough --> copy0MBB
584  MachineBasicBlock *thisMBB = BB;
585  MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB);
586  MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB);
587  BuildMI(BB, MI->getOperand(4).getImmedValue(), 2)
588    .addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB);
589  MachineFunction *F = BB->getParent();
590  F->getBasicBlockList().insert(It, copy0MBB);
591  F->getBasicBlockList().insert(It, sinkMBB);
592  // Update machine-CFG edges
593  BB->addSuccessor(copy0MBB);
594  BB->addSuccessor(sinkMBB);
595
596  //  copy0MBB:
597  //   %FalseValue = ...
598  //   # fallthrough to sinkMBB
599  BB = copy0MBB;
600
601  // Update machine-CFG edges
602  BB->addSuccessor(sinkMBB);
603
604  //  sinkMBB:
605  //   %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ]
606  //  ...
607  BB = sinkMBB;
608  BuildMI(BB, PPC::PHI, 4, MI->getOperand(0).getReg())
609    .addReg(MI->getOperand(3).getReg()).addMBB(copy0MBB)
610    .addReg(MI->getOperand(2).getReg()).addMBB(thisMBB);
611
612  delete MI;   // The pseudo instruction is gone now.
613  return BB;
614}
615
616