LegalizeTypes support for promotion of SIGN_EXTEND_INREG.
[oota-llvm.git] / lib / CodeGen / SelectionDAG / LegalizeIntegerTypes.cpp
1 //===----- LegalizeIntegerTypes.cpp - Legalization of integer types -------===//
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 implements integer type expansion and promotion for LegalizeTypes.
11 // Promotion is the act of changing a computation in an illegal type into a
12 // computation in a larger type.  For example, implementing i8 arithmetic in an
13 // i32 register (often needed on powerpc).
14 // Expansion is the act of changing a computation in an illegal type into a
15 // computation in two identical registers of a smaller type.  For example,
16 // implementing i64 arithmetic in two i32 registers (often needed on 32-bit
17 // targets).
18 //
19 //===----------------------------------------------------------------------===//
20
21 #include "LegalizeTypes.h"
22 using namespace llvm;
23
24 //===----------------------------------------------------------------------===//
25 //  Integer Result Promotion
26 //===----------------------------------------------------------------------===//
27
28 /// PromoteIntegerResult - This method is called when a result of a node is
29 /// found to be in need of promotion to a larger type.  At this point, the node
30 /// may also have invalid operands or may have other results that need
31 /// expansion, we just know that (at least) one result needs promotion.
32 void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
33   DEBUG(cerr << "Promote integer result: "; N->dump(&DAG); cerr << "\n");
34   SDOperand Result = SDOperand();
35
36   // See if the target wants to custom expand this node.
37   if (TLI.getOperationAction(N->getOpcode(), N->getValueType(ResNo)) ==
38       TargetLowering::Custom) {
39     // If the target wants to, allow it to lower this itself.
40     if (SDNode *P = TLI.ReplaceNodeResults(N, DAG)) {
41       // Everything that once used N now uses P.  We are guaranteed that the
42       // result value types of N and the result value types of P match.
43       ReplaceNodeWith(N, P);
44       return;
45     }
46   }
47
48   switch (N->getOpcode()) {
49   default:
50 #ifndef NDEBUG
51     cerr << "PromoteIntegerResult #" << ResNo << ": ";
52     N->dump(&DAG); cerr << "\n";
53 #endif
54     assert(0 && "Do not know how to promote this operator!");
55     abort();
56   case ISD::BIT_CONVERT: Result = PromoteIntRes_BIT_CONVERT(N); break;
57   case ISD::BUILD_PAIR:  Result = PromoteIntRes_BUILD_PAIR(N); break;
58   case ISD::Constant:    Result = PromoteIntRes_Constant(N); break;
59   case ISD::CTLZ:        Result = PromoteIntRes_CTLZ(N); break;
60   case ISD::CTPOP:       Result = PromoteIntRes_CTPOP(N); break;
61   case ISD::CTTZ:        Result = PromoteIntRes_CTTZ(N); break;
62   case ISD::EXTRACT_VECTOR_ELT:
63                          Result = PromoteIntRes_EXTRACT_VECTOR_ELT(N); break;
64   case ISD::LOAD:        Result = PromoteIntRes_LOAD(cast<LoadSDNode>(N));break;
65   case ISD::SELECT:      Result = PromoteIntRes_SELECT(N); break;
66   case ISD::SELECT_CC:   Result = PromoteIntRes_SELECT_CC(N); break;
67   case ISD::SETCC:       Result = PromoteIntRes_SETCC(N); break;
68   case ISD::SHL:         Result = PromoteIntRes_SHL(N); break;
69   case ISD::SIGN_EXTEND_INREG:
70                          Result = PromoteIntRes_SIGN_EXTEND_INREG(N); break;
71   case ISD::SRA:         Result = PromoteIntRes_SRA(N); break;
72   case ISD::SRL:         Result = PromoteIntRes_SRL(N); break;
73   case ISD::TRUNCATE:    Result = PromoteIntRes_TRUNCATE(N); break;
74   case ISD::UNDEF:       Result = PromoteIntRes_UNDEF(N); break;
75   case ISD::VAARG:       Result = PromoteIntRes_VAARG(N); break;
76
77   case ISD::SIGN_EXTEND:
78   case ISD::ZERO_EXTEND:
79   case ISD::ANY_EXTEND:  Result = PromoteIntRes_INT_EXTEND(N); break;
80
81   case ISD::FP_TO_SINT:
82   case ISD::FP_TO_UINT: Result = PromoteIntRes_FP_TO_XINT(N); break;
83
84   case ISD::AND:
85   case ISD::OR:
86   case ISD::XOR:
87   case ISD::ADD:
88   case ISD::SUB:
89   case ISD::MUL:      Result = PromoteIntRes_SimpleIntBinOp(N); break;
90
91   case ISD::SDIV:
92   case ISD::SREM:     Result = PromoteIntRes_SDIV(N); break;
93
94   case ISD::UDIV:
95   case ISD::UREM:     Result = PromoteIntRes_UDIV(N); break;
96   }
97
98   // If Result is null, the sub-method took care of registering the result.
99   if (Result.Val)
100     SetPromotedInteger(SDOperand(N, ResNo), Result);
101 }
102
103 SDOperand DAGTypeLegalizer::PromoteIntRes_BIT_CONVERT(SDNode *N) {
104   SDOperand InOp = N->getOperand(0);
105   MVT InVT = InOp.getValueType();
106   MVT NInVT = TLI.getTypeToTransformTo(InVT);
107   MVT OutVT = TLI.getTypeToTransformTo(N->getValueType(0));
108
109   switch (getTypeAction(InVT)) {
110   default:
111     assert(false && "Unknown type action!");
112     break;
113   case Legal:
114     break;
115   case PromoteInteger:
116     if (OutVT.getSizeInBits() == NInVT.getSizeInBits())
117       // The input promotes to the same size.  Convert the promoted value.
118       return DAG.getNode(ISD::BIT_CONVERT, OutVT, GetPromotedInteger(InOp));
119     break;
120   case SoftenFloat:
121     // Promote the integer operand by hand.
122     return DAG.getNode(ISD::ANY_EXTEND, OutVT, GetSoftenedFloat(InOp));
123   case ExpandInteger:
124   case ExpandFloat:
125     break;
126   case ScalarizeVector:
127     // Convert the element to an integer and promote it by hand.
128     return DAG.getNode(ISD::ANY_EXTEND, OutVT,
129                        BitConvertToInteger(GetScalarizedVector(InOp)));
130   case SplitVector:
131     // For example, i32 = BIT_CONVERT v2i16 on alpha.  Convert the split
132     // pieces of the input into integers and reassemble in the final type.
133     SDOperand Lo, Hi;
134     GetSplitVector(N->getOperand(0), Lo, Hi);
135     Lo = BitConvertToInteger(Lo);
136     Hi = BitConvertToInteger(Hi);
137
138     if (TLI.isBigEndian())
139       std::swap(Lo, Hi);
140
141     InOp = DAG.getNode(ISD::ANY_EXTEND,
142                        MVT::getIntegerVT(OutVT.getSizeInBits()),
143                        JoinIntegers(Lo, Hi));
144     return DAG.getNode(ISD::BIT_CONVERT, OutVT, InOp);
145   }
146
147   // Otherwise, lower the bit-convert to a store/load from the stack, then
148   // promote the load.
149   SDOperand Op = CreateStackStoreLoad(InOp, N->getValueType(0));
150   return PromoteIntRes_LOAD(cast<LoadSDNode>(Op.Val));
151 }
152
153 SDOperand DAGTypeLegalizer::PromoteIntRes_BUILD_PAIR(SDNode *N) {
154   // The pair element type may be legal, or may not promote to the same type as
155   // the result, for example i14 = BUILD_PAIR (i7, i7).  Handle all cases.
156   return DAG.getNode(ISD::ANY_EXTEND,
157                      TLI.getTypeToTransformTo(N->getValueType(0)),
158                      JoinIntegers(N->getOperand(0), N->getOperand(1)));
159 }
160
161 SDOperand DAGTypeLegalizer::PromoteIntRes_Constant(SDNode *N) {
162   MVT VT = N->getValueType(0);
163   // Zero extend things like i1, sign extend everything else.  It shouldn't
164   // matter in theory which one we pick, but this tends to give better code?
165   unsigned Opc = VT.isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
166   SDOperand Result = DAG.getNode(Opc, TLI.getTypeToTransformTo(VT),
167                                  SDOperand(N, 0));
168   assert(isa<ConstantSDNode>(Result) && "Didn't constant fold ext?");
169   return Result;
170 }
171
172 SDOperand DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
173   SDOperand Op = GetPromotedInteger(N->getOperand(0));
174   MVT OVT = N->getValueType(0);
175   MVT NVT = Op.getValueType();
176   // Zero extend to the promoted type and do the count there.
177   Op = DAG.getNode(ISD::CTLZ, NVT, DAG.getZeroExtendInReg(Op, OVT));
178   // Subtract off the extra leading bits in the bigger type.
179   return DAG.getNode(ISD::SUB, NVT, Op,
180                      DAG.getConstant(NVT.getSizeInBits() -
181                                      OVT.getSizeInBits(), NVT));
182 }
183
184 SDOperand DAGTypeLegalizer::PromoteIntRes_CTPOP(SDNode *N) {
185   SDOperand Op = GetPromotedInteger(N->getOperand(0));
186   MVT OVT = N->getValueType(0);
187   MVT NVT = Op.getValueType();
188   // Zero extend to the promoted type and do the count there.
189   return DAG.getNode(ISD::CTPOP, NVT, DAG.getZeroExtendInReg(Op, OVT));
190 }
191
192 SDOperand DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) {
193   SDOperand Op = GetPromotedInteger(N->getOperand(0));
194   MVT OVT = N->getValueType(0);
195   MVT NVT = Op.getValueType();
196   // The count is the same in the promoted type except if the original
197   // value was zero.  This can be handled by setting the bit just off
198   // the top of the original type.
199   APInt TopBit(NVT.getSizeInBits(), 0);
200   TopBit.set(OVT.getSizeInBits());
201   Op = DAG.getNode(ISD::OR, NVT, Op, DAG.getConstant(TopBit, NVT));
202   return DAG.getNode(ISD::CTTZ, NVT, Op);
203 }
204
205 SDOperand DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N) {
206   MVT OldVT = N->getValueType(0);
207   SDOperand OldVec = N->getOperand(0);
208   unsigned OldElts = OldVec.getValueType().getVectorNumElements();
209
210   if (OldElts == 1) {
211     assert(!isTypeLegal(OldVec.getValueType()) &&
212            "Legal one-element vector of a type needing promotion!");
213     // It is tempting to follow GetScalarizedVector by a call to
214     // GetPromotedInteger, but this would be wrong because the
215     // scalarized value may not yet have been processed.
216     return DAG.getNode(ISD::ANY_EXTEND, TLI.getTypeToTransformTo(OldVT),
217                        GetScalarizedVector(OldVec));
218   }
219
220   // Convert to a vector half as long with an element type of twice the width,
221   // for example <4 x i16> -> <2 x i32>.
222   assert(!(OldElts & 1) && "Odd length vectors not supported!");
223   MVT NewVT = MVT::getIntegerVT(2 * OldVT.getSizeInBits());
224   assert(OldVT.isSimple() && NewVT.isSimple());
225
226   SDOperand NewVec = DAG.getNode(ISD::BIT_CONVERT,
227                                  MVT::getVectorVT(NewVT, OldElts / 2),
228                                  OldVec);
229
230   // Extract the element at OldIdx / 2 from the new vector.
231   SDOperand OldIdx = N->getOperand(1);
232   SDOperand NewIdx = DAG.getNode(ISD::SRL, OldIdx.getValueType(), OldIdx,
233                                  DAG.getConstant(1, TLI.getShiftAmountTy()));
234   SDOperand Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, NewVT, NewVec, NewIdx);
235
236   // Select the appropriate half of the element: Lo if OldIdx was even,
237   // Hi if it was odd.
238   SDOperand Lo = Elt;
239   SDOperand Hi = DAG.getNode(ISD::SRL, NewVT, Elt,
240                              DAG.getConstant(OldVT.getSizeInBits(),
241                                              TLI.getShiftAmountTy()));
242   if (TLI.isBigEndian())
243     std::swap(Lo, Hi);
244
245   SDOperand Odd = DAG.getNode(ISD::AND, OldIdx.getValueType(), OldIdx,
246                               DAG.getConstant(1, TLI.getShiftAmountTy()));
247   return DAG.getNode(ISD::SELECT, NewVT, Odd, Hi, Lo);
248 }
249
250 SDOperand DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
251   unsigned NewOpc = N->getOpcode();
252   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
253
254   // If we're promoting a UINT to a larger size, check to see if the new node
255   // will be legal.  If it isn't, check to see if FP_TO_SINT is legal, since
256   // we can use that instead.  This allows us to generate better code for
257   // FP_TO_UINT for small destination sizes on targets where FP_TO_UINT is not
258   // legal, such as PowerPC.
259   if (N->getOpcode() == ISD::FP_TO_UINT) {
260     if (!TLI.isOperationLegal(ISD::FP_TO_UINT, NVT) &&
261         (TLI.isOperationLegal(ISD::FP_TO_SINT, NVT) ||
262          TLI.getOperationAction(ISD::FP_TO_SINT, NVT)==TargetLowering::Custom))
263       NewOpc = ISD::FP_TO_SINT;
264   }
265
266   return DAG.getNode(NewOpc, NVT, N->getOperand(0));
267 }
268
269 SDOperand DAGTypeLegalizer::PromoteIntRes_INT_EXTEND(SDNode *N) {
270   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
271
272   if (getTypeAction(N->getOperand(0).getValueType()) == PromoteInteger) {
273     SDOperand Res = GetPromotedInteger(N->getOperand(0));
274     assert(Res.getValueType().getSizeInBits() <= NVT.getSizeInBits() &&
275            "Extension doesn't make sense!");
276
277     // If the result and operand types are the same after promotion, simplify
278     // to an in-register extension.
279     if (NVT == Res.getValueType()) {
280       // The high bits are not guaranteed to be anything.  Insert an extend.
281       if (N->getOpcode() == ISD::SIGN_EXTEND)
282         return DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Res,
283                            DAG.getValueType(N->getOperand(0).getValueType()));
284       if (N->getOpcode() == ISD::ZERO_EXTEND)
285         return DAG.getZeroExtendInReg(Res, N->getOperand(0).getValueType());
286       assert(N->getOpcode() == ISD::ANY_EXTEND && "Unknown integer extension!");
287       return Res;
288     }
289   }
290
291   // Otherwise, just extend the original operand all the way to the larger type.
292   return DAG.getNode(N->getOpcode(), NVT, N->getOperand(0));
293 }
294
295 SDOperand DAGTypeLegalizer::PromoteIntRes_LOAD(LoadSDNode *N) {
296   assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!");
297   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
298   ISD::LoadExtType ExtType =
299     ISD::isNON_EXTLoad(N) ? ISD::EXTLOAD : N->getExtensionType();
300   SDOperand Res = DAG.getExtLoad(ExtType, NVT, N->getChain(), N->getBasePtr(),
301                                  N->getSrcValue(), N->getSrcValueOffset(),
302                                  N->getMemoryVT(), N->isVolatile(),
303                                  N->getAlignment());
304
305   // Legalized the chain result - switch anything that used the old chain to
306   // use the new one.
307   ReplaceValueWith(SDOperand(N, 1), Res.getValue(1));
308   return Res;
309 }
310
311 SDOperand DAGTypeLegalizer::PromoteIntRes_SDIV(SDNode *N) {
312   // Sign extend the input.
313   SDOperand LHS = GetPromotedInteger(N->getOperand(0));
314   SDOperand RHS = GetPromotedInteger(N->getOperand(1));
315   MVT VT = N->getValueType(0);
316   LHS = DAG.getNode(ISD::SIGN_EXTEND_INREG, LHS.getValueType(), LHS,
317                     DAG.getValueType(VT));
318   RHS = DAG.getNode(ISD::SIGN_EXTEND_INREG, RHS.getValueType(), RHS,
319                     DAG.getValueType(VT));
320
321   return DAG.getNode(N->getOpcode(), LHS.getValueType(), LHS, RHS);
322 }
323
324 SDOperand DAGTypeLegalizer::PromoteIntRes_SELECT(SDNode *N) {
325   SDOperand LHS = GetPromotedInteger(N->getOperand(1));
326   SDOperand RHS = GetPromotedInteger(N->getOperand(2));
327   return DAG.getNode(ISD::SELECT, LHS.getValueType(), N->getOperand(0),LHS,RHS);
328 }
329
330 SDOperand DAGTypeLegalizer::PromoteIntRes_SELECT_CC(SDNode *N) {
331   SDOperand LHS = GetPromotedInteger(N->getOperand(2));
332   SDOperand RHS = GetPromotedInteger(N->getOperand(3));
333   return DAG.getNode(ISD::SELECT_CC, LHS.getValueType(), N->getOperand(0),
334                      N->getOperand(1), LHS, RHS, N->getOperand(4));
335 }
336
337 SDOperand DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) {
338   assert(isTypeLegal(TLI.getSetCCResultType(N->getOperand(0)))
339          && "SetCC type is not legal??");
340   return DAG.getNode(ISD::SETCC, TLI.getSetCCResultType(N->getOperand(0)),
341                      N->getOperand(0), N->getOperand(1), N->getOperand(2));
342 }
343
344 SDOperand DAGTypeLegalizer::PromoteIntRes_SHL(SDNode *N) {
345   return DAG.getNode(ISD::SHL, TLI.getTypeToTransformTo(N->getValueType(0)),
346                      GetPromotedInteger(N->getOperand(0)), N->getOperand(1));
347 }
348
349 SDOperand DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N) {
350   SDOperand Op = GetPromotedInteger(N->getOperand(0));
351   return DAG.getNode(ISD::SIGN_EXTEND_INREG, Op.getValueType(), Op,
352                      N->getOperand(1));
353 }
354
355 SDOperand DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) {
356   // The input may have strange things in the top bits of the registers, but
357   // these operations don't care.  They may have weird bits going out, but
358   // that too is okay if they are integer operations.
359   SDOperand LHS = GetPromotedInteger(N->getOperand(0));
360   SDOperand RHS = GetPromotedInteger(N->getOperand(1));
361   return DAG.getNode(N->getOpcode(), LHS.getValueType(), LHS, RHS);
362 }
363
364 SDOperand DAGTypeLegalizer::PromoteIntRes_SRA(SDNode *N) {
365   // The input value must be properly sign extended.
366   MVT VT = N->getValueType(0);
367   MVT NVT = TLI.getTypeToTransformTo(VT);
368   SDOperand Res = GetPromotedInteger(N->getOperand(0));
369   Res = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Res, DAG.getValueType(VT));
370   return DAG.getNode(ISD::SRA, NVT, Res, N->getOperand(1));
371 }
372
373 SDOperand DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
374   // The input value must be properly zero extended.
375   MVT VT = N->getValueType(0);
376   MVT NVT = TLI.getTypeToTransformTo(VT);
377   SDOperand Res = ZExtPromotedInteger(N->getOperand(0));
378   return DAG.getNode(ISD::SRL, NVT, Res, N->getOperand(1));
379 }
380
381 SDOperand DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
382   SDOperand Res;
383
384   switch (getTypeAction(N->getOperand(0).getValueType())) {
385   default: assert(0 && "Unknown type action!");
386   case Legal:
387   case ExpandInteger:
388     Res = N->getOperand(0);
389     break;
390   case PromoteInteger:
391     Res = GetPromotedInteger(N->getOperand(0));
392     break;
393   }
394
395   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
396   assert(Res.getValueType().getSizeInBits() >= NVT.getSizeInBits() &&
397          "Truncation doesn't make sense!");
398   if (Res.getValueType() == NVT)
399     return Res;
400
401   // Truncate to NVT instead of VT
402   return DAG.getNode(ISD::TRUNCATE, NVT, Res);
403 }
404
405 SDOperand DAGTypeLegalizer::PromoteIntRes_UDIV(SDNode *N) {
406   // Zero extend the input.
407   SDOperand LHS = GetPromotedInteger(N->getOperand(0));
408   SDOperand RHS = GetPromotedInteger(N->getOperand(1));
409   MVT VT = N->getValueType(0);
410   LHS = DAG.getZeroExtendInReg(LHS, VT);
411   RHS = DAG.getZeroExtendInReg(RHS, VT);
412
413   return DAG.getNode(N->getOpcode(), LHS.getValueType(), LHS, RHS);
414 }
415
416 SDOperand DAGTypeLegalizer::PromoteIntRes_UNDEF(SDNode *N) {
417   return DAG.getNode(ISD::UNDEF, TLI.getTypeToTransformTo(N->getValueType(0)));
418 }
419
420 SDOperand DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) {
421   SDOperand Chain = N->getOperand(0); // Get the chain.
422   SDOperand Ptr = N->getOperand(1); // Get the pointer.
423   MVT VT = N->getValueType(0);
424
425   const Value *V = cast<SrcValueSDNode>(N->getOperand(2))->getValue();
426   SDOperand VAList = DAG.getLoad(TLI.getPointerTy(), Chain, Ptr, V, 0);
427
428   // Increment the arg pointer, VAList, to the next vaarg
429   // FIXME: should the ABI size be used for the increment?  Think of
430   // x86 long double (10 bytes long, but aligned on 4 or 8 bytes) or
431   // integers of unusual size (such MVT::i1, which gives an increment
432   // of zero here!).
433   unsigned Increment = VT.getSizeInBits() / 8;
434   SDOperand Tmp = DAG.getNode(ISD::ADD, TLI.getPointerTy(), VAList,
435                               DAG.getConstant(Increment, TLI.getPointerTy()));
436
437   // Store the incremented VAList to the pointer.
438   Tmp = DAG.getStore(VAList.getValue(1), Tmp, Ptr, V, 0);
439
440   // Load the actual argument out of the arg pointer VAList.
441   Tmp = DAG.getExtLoad(ISD::EXTLOAD, TLI.getTypeToTransformTo(VT), Tmp,
442                        VAList, NULL, 0, VT);
443
444   // Legalized the chain result - switch anything that used the old chain to
445   // use the new one.
446   ReplaceValueWith(SDOperand(N, 1), Tmp.getValue(1));
447   return Tmp;
448 }
449
450
451 //===----------------------------------------------------------------------===//
452 //  Integer Operand Promotion
453 //===----------------------------------------------------------------------===//
454
455 /// PromoteIntegerOperand - This method is called when the specified operand of
456 /// the specified node is found to need promotion.  At this point, all of the
457 /// result types of the node are known to be legal, but other operands of the
458 /// node may need promotion or expansion as well as the specified one.
459 bool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
460   DEBUG(cerr << "Promote integer operand: "; N->dump(&DAG); cerr << "\n");
461   SDOperand Res = SDOperand();
462
463   if (TLI.getOperationAction(N->getOpcode(), N->getOperand(OpNo).getValueType())
464       == TargetLowering::Custom)
465     Res = TLI.LowerOperation(SDOperand(N, OpNo), DAG);
466
467   if (Res.Val == 0) {
468     switch (N->getOpcode()) {
469       default:
470   #ifndef NDEBUG
471       cerr << "PromoteIntegerOperand Op #" << OpNo << ": ";
472       N->dump(&DAG); cerr << "\n";
473   #endif
474       assert(0 && "Do not know how to promote this operator's operand!");
475       abort();
476
477     case ISD::ANY_EXTEND:   Res = PromoteIntOp_ANY_EXTEND(N); break;
478     case ISD::BR_CC:        Res = PromoteIntOp_BR_CC(N, OpNo); break;
479     case ISD::BRCOND:       Res = PromoteIntOp_BRCOND(N, OpNo); break;
480     case ISD::BUILD_PAIR:   Res = PromoteIntOp_BUILD_PAIR(N); break;
481     case ISD::BUILD_VECTOR: Res = PromoteIntOp_BUILD_VECTOR(N); break;
482     case ISD::FP_EXTEND:    Res = PromoteIntOp_FP_EXTEND(N); break;
483     case ISD::FP_ROUND:     Res = PromoteIntOp_FP_ROUND(N); break;
484     case ISD::INSERT_VECTOR_ELT:
485                             Res = PromoteIntOp_INSERT_VECTOR_ELT(N, OpNo);break;
486     case ISD::MEMBARRIER:   Res = PromoteIntOp_MEMBARRIER(N); break;
487     case ISD::SELECT:       Res = PromoteIntOp_SELECT(N, OpNo); break;
488     case ISD::SELECT_CC:    Res = PromoteIntOp_SELECT_CC(N, OpNo); break;
489     case ISD::SETCC:        Res = PromoteIntOp_SETCC(N, OpNo); break;
490     case ISD::SIGN_EXTEND:  Res = PromoteIntOp_SIGN_EXTEND(N); break;
491     case ISD::STORE:        Res = PromoteIntOp_STORE(cast<StoreSDNode>(N),
492                                                      OpNo); break;
493     case ISD::TRUNCATE:     Res = PromoteIntOp_TRUNCATE(N); break;
494     case ISD::ZERO_EXTEND:  Res = PromoteIntOp_ZERO_EXTEND(N); break;
495
496     case ISD::SINT_TO_FP:
497     case ISD::UINT_TO_FP: Res = PromoteIntOp_INT_TO_FP(N); break;
498     }
499   }
500
501   // If the result is null, the sub-method took care of registering results etc.
502   if (!Res.Val) return false;
503   // If the result is N, the sub-method updated N in place.
504   if (Res.Val == N) {
505     // Mark N as new and remark N and its operands.  This allows us to correctly
506     // revisit N if it needs another step of promotion and allows us to visit
507     // any new operands to N.
508     ReanalyzeNode(N);
509     return true;
510   }
511
512   assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
513          "Invalid operand expansion");
514
515   ReplaceValueWith(SDOperand(N, 0), Res);
516   return false;
517 }
518
519 /// PromoteSetCCOperands - Promote the operands of a comparison.  This code is
520 /// shared among BR_CC, SELECT_CC, and SETCC handlers.
521 void DAGTypeLegalizer::PromoteSetCCOperands(SDOperand &NewLHS,SDOperand &NewRHS,
522                                             ISD::CondCode CCCode) {
523   MVT VT = NewLHS.getValueType();
524
525   // Get the promoted values.
526   NewLHS = GetPromotedInteger(NewLHS);
527   NewRHS = GetPromotedInteger(NewRHS);
528
529   // Otherwise, we have to insert explicit sign or zero extends.  Note
530   // that we could insert sign extends for ALL conditions, but zero extend
531   // is cheaper on many machines (an AND instead of two shifts), so prefer
532   // it.
533   switch (CCCode) {
534   default: assert(0 && "Unknown integer comparison!");
535   case ISD::SETEQ:
536   case ISD::SETNE:
537   case ISD::SETUGE:
538   case ISD::SETUGT:
539   case ISD::SETULE:
540   case ISD::SETULT:
541     // ALL of these operations will work if we either sign or zero extend
542     // the operands (including the unsigned comparisons!).  Zero extend is
543     // usually a simpler/cheaper operation, so prefer it.
544     NewLHS = DAG.getZeroExtendInReg(NewLHS, VT);
545     NewRHS = DAG.getZeroExtendInReg(NewRHS, VT);
546     break;
547   case ISD::SETGE:
548   case ISD::SETGT:
549   case ISD::SETLT:
550   case ISD::SETLE:
551     NewLHS = DAG.getNode(ISD::SIGN_EXTEND_INREG, NewLHS.getValueType(), NewLHS,
552                          DAG.getValueType(VT));
553     NewRHS = DAG.getNode(ISD::SIGN_EXTEND_INREG, NewRHS.getValueType(), NewRHS,
554                          DAG.getValueType(VT));
555     break;
556   }
557 }
558
559 SDOperand DAGTypeLegalizer::PromoteIntOp_ANY_EXTEND(SDNode *N) {
560   SDOperand Op = GetPromotedInteger(N->getOperand(0));
561   return DAG.getNode(ISD::ANY_EXTEND, N->getValueType(0), Op);
562 }
563
564 SDOperand DAGTypeLegalizer::PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo) {
565   assert(OpNo == 2 && "Don't know how to promote this operand!");
566
567   SDOperand LHS = N->getOperand(2);
568   SDOperand RHS = N->getOperand(3);
569   PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(1))->get());
570
571   // The chain (Op#0), CC (#1) and basic block destination (Op#4) are always
572   // legal types.
573   return DAG.UpdateNodeOperands(SDOperand(N, 0), N->getOperand(0),
574                                 N->getOperand(1), LHS, RHS, N->getOperand(4));
575 }
576
577 SDOperand DAGTypeLegalizer::PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo) {
578   assert(OpNo == 1 && "only know how to promote condition");
579   SDOperand Cond = GetPromotedInteger(N->getOperand(1));  // Promote condition.
580
581   // The top bits of the promoted condition are not necessarily zero, ensure
582   // that the value is properly zero extended.
583   unsigned BitWidth = Cond.getValueSizeInBits();
584   if (!DAG.MaskedValueIsZero(Cond,
585                              APInt::getHighBitsSet(BitWidth, BitWidth-1)))
586     Cond = DAG.getZeroExtendInReg(Cond, MVT::i1);
587
588   // The chain (Op#0) and basic block destination (Op#2) are always legal types.
589   return DAG.UpdateNodeOperands(SDOperand(N, 0), N->getOperand(0), Cond,
590                                 N->getOperand(2));
591 }
592
593 SDOperand DAGTypeLegalizer::PromoteIntOp_BUILD_PAIR(SDNode *N) {
594   // Since the result type is legal, the operands must promote to it.
595   MVT OVT = N->getOperand(0).getValueType();
596   SDOperand Lo = GetPromotedInteger(N->getOperand(0));
597   SDOperand Hi = GetPromotedInteger(N->getOperand(1));
598   assert(Lo.getValueType() == N->getValueType(0) && "Operand over promoted?");
599
600   Lo = DAG.getZeroExtendInReg(Lo, OVT);
601   Hi = DAG.getNode(ISD::SHL, N->getValueType(0), Hi,
602                    DAG.getConstant(OVT.getSizeInBits(),
603                                    TLI.getShiftAmountTy()));
604   return DAG.getNode(ISD::OR, N->getValueType(0), Lo, Hi);
605 }
606
607 SDOperand DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR(SDNode *N) {
608   // The vector type is legal but the element type is not.  This implies
609   // that the vector is a power-of-two in length and that the element
610   // type does not have a strange size (eg: it is not i1).
611   MVT VecVT = N->getValueType(0);
612   unsigned NumElts = VecVT.getVectorNumElements();
613   assert(!(NumElts & 1) && "Legal vector of one illegal element?");
614
615   // Build a vector of half the length out of elements of twice the bitwidth.
616   // For example <4 x i16> -> <2 x i32>.
617   MVT OldVT = N->getOperand(0).getValueType();
618   MVT NewVT = MVT::getIntegerVT(2 * OldVT.getSizeInBits());
619   assert(OldVT.isSimple() && NewVT.isSimple());
620
621   std::vector<SDOperand> NewElts;
622   NewElts.reserve(NumElts/2);
623
624   for (unsigned i = 0; i < NumElts; i += 2) {
625     // Combine two successive elements into one promoted element.
626     SDOperand Lo = N->getOperand(i);
627     SDOperand Hi = N->getOperand(i+1);
628     if (TLI.isBigEndian())
629       std::swap(Lo, Hi);
630     NewElts.push_back(JoinIntegers(Lo, Hi));
631   }
632
633   SDOperand NewVec = DAG.getNode(ISD::BUILD_VECTOR,
634                                  MVT::getVectorVT(NewVT, NewElts.size()),
635                                  &NewElts[0], NewElts.size());
636
637   // Convert the new vector to the old vector type.
638   return DAG.getNode(ISD::BIT_CONVERT, VecVT, NewVec);
639 }
640
641 SDOperand DAGTypeLegalizer::PromoteIntOp_FP_EXTEND(SDNode *N) {
642   SDOperand Op = GetPromotedInteger(N->getOperand(0));
643   return DAG.getNode(ISD::FP_EXTEND, N->getValueType(0), Op);
644 }
645
646 SDOperand DAGTypeLegalizer::PromoteIntOp_FP_ROUND(SDNode *N) {
647   SDOperand Op = GetPromotedInteger(N->getOperand(0));
648   return DAG.getNode(ISD::FP_ROUND, N->getValueType(0), Op,
649                      DAG.getIntPtrConstant(0));
650 }
651
652 SDOperand DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,
653                                                              unsigned OpNo) {
654   if (OpNo == 1) {
655     // Promote the inserted value.  This is valid because the type does not
656     // have to match the vector element type.
657
658     // Check that any extra bits introduced will be truncated away.
659     assert(N->getOperand(1).getValueType().getSizeInBits() >=
660            N->getValueType(0).getVectorElementType().getSizeInBits() &&
661            "Type of inserted value narrower than vector element type!");
662     return DAG.UpdateNodeOperands(SDOperand(N, 0), N->getOperand(0),
663                                   GetPromotedInteger(N->getOperand(1)),
664                                   N->getOperand(2));
665   }
666
667   assert(OpNo == 2 && "Different operand and result vector types?");
668
669   // Promote the index.
670   SDOperand Idx = N->getOperand(2);
671   Idx = DAG.getZeroExtendInReg(GetPromotedInteger(Idx), Idx.getValueType());
672   return DAG.UpdateNodeOperands(SDOperand(N, 0), N->getOperand(0),
673                                 N->getOperand(1), Idx);
674 }
675
676 SDOperand DAGTypeLegalizer::PromoteIntOp_INT_TO_FP(SDNode *N) {
677   SDOperand In = GetPromotedInteger(N->getOperand(0));
678   MVT OpVT = N->getOperand(0).getValueType();
679   if (N->getOpcode() == ISD::UINT_TO_FP)
680     In = DAG.getZeroExtendInReg(In, OpVT);
681   else
682     In = DAG.getNode(ISD::SIGN_EXTEND_INREG, In.getValueType(),
683                      In, DAG.getValueType(OpVT));
684
685   return DAG.UpdateNodeOperands(SDOperand(N, 0), In);
686 }
687
688 SDOperand DAGTypeLegalizer::PromoteIntOp_MEMBARRIER(SDNode *N) {
689   SDOperand NewOps[6];
690   NewOps[0] = N->getOperand(0);
691   for (unsigned i = 1; i < array_lengthof(NewOps); ++i) {
692     SDOperand Flag = GetPromotedInteger(N->getOperand(i));
693     NewOps[i] = DAG.getZeroExtendInReg(Flag, MVT::i1);
694   }
695   return DAG.UpdateNodeOperands(SDOperand (N, 0), NewOps,
696                                 array_lengthof(NewOps));
697 }
698
699 SDOperand DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) {
700   assert(OpNo == 0 && "Only know how to promote condition");
701   SDOperand Cond = GetPromotedInteger(N->getOperand(0));  // Promote condition.
702
703   // The top bits of the promoted condition are not necessarily zero, ensure
704   // that the value is properly zero extended.
705   unsigned BitWidth = Cond.getValueSizeInBits();
706   if (!DAG.MaskedValueIsZero(Cond,
707                              APInt::getHighBitsSet(BitWidth, BitWidth-1)))
708     Cond = DAG.getZeroExtendInReg(Cond, MVT::i1);
709
710   // The chain (Op#0) and basic block destination (Op#2) are always legal types.
711   return DAG.UpdateNodeOperands(SDOperand(N, 0), Cond, N->getOperand(1),
712                                 N->getOperand(2));
713 }
714
715 SDOperand DAGTypeLegalizer::PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo) {
716   assert(OpNo == 0 && "Don't know how to promote this operand!");
717
718   SDOperand LHS = N->getOperand(0);
719   SDOperand RHS = N->getOperand(1);
720   PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(4))->get());
721
722   // The CC (#4) and the possible return values (#2 and #3) have legal types.
723   return DAG.UpdateNodeOperands(SDOperand(N, 0), LHS, RHS, N->getOperand(2),
724                                 N->getOperand(3), N->getOperand(4));
725 }
726
727 SDOperand DAGTypeLegalizer::PromoteIntOp_SETCC(SDNode *N, unsigned OpNo) {
728   assert(OpNo == 0 && "Don't know how to promote this operand!");
729
730   SDOperand LHS = N->getOperand(0);
731   SDOperand RHS = N->getOperand(1);
732   PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(2))->get());
733
734   // The CC (#2) is always legal.
735   return DAG.UpdateNodeOperands(SDOperand(N, 0), LHS, RHS, N->getOperand(2));
736 }
737
738 SDOperand DAGTypeLegalizer::PromoteIntOp_SIGN_EXTEND(SDNode *N) {
739   SDOperand Op = GetPromotedInteger(N->getOperand(0));
740   Op = DAG.getNode(ISD::ANY_EXTEND, N->getValueType(0), Op);
741   return DAG.getNode(ISD::SIGN_EXTEND_INREG, Op.getValueType(),
742                      Op, DAG.getValueType(N->getOperand(0).getValueType()));
743 }
744
745 SDOperand DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
746   assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
747   SDOperand Ch = N->getChain(), Ptr = N->getBasePtr();
748   int SVOffset = N->getSrcValueOffset();
749   unsigned Alignment = N->getAlignment();
750   bool isVolatile = N->isVolatile();
751
752   SDOperand Val = GetPromotedInteger(N->getValue());  // Get promoted value.
753
754   assert(!N->isTruncatingStore() && "Cannot promote this store operand!");
755
756   // Truncate the value and store the result.
757   return DAG.getTruncStore(Ch, Val, Ptr, N->getSrcValue(),
758                            SVOffset, N->getMemoryVT(),
759                            isVolatile, Alignment);
760 }
761
762 SDOperand DAGTypeLegalizer::PromoteIntOp_TRUNCATE(SDNode *N) {
763   SDOperand Op = GetPromotedInteger(N->getOperand(0));
764   return DAG.getNode(ISD::TRUNCATE, N->getValueType(0), Op);
765 }
766
767 SDOperand DAGTypeLegalizer::PromoteIntOp_ZERO_EXTEND(SDNode *N) {
768   SDOperand Op = GetPromotedInteger(N->getOperand(0));
769   Op = DAG.getNode(ISD::ANY_EXTEND, N->getValueType(0), Op);
770   return DAG.getZeroExtendInReg(Op, N->getOperand(0).getValueType());
771 }
772
773
774 //===----------------------------------------------------------------------===//
775 //  Integer Result Expansion
776 //===----------------------------------------------------------------------===//
777
778 /// ExpandIntegerResult - This method is called when the specified result of the
779 /// specified node is found to need expansion.  At this point, the node may also
780 /// have invalid operands or may have other results that need promotion, we just
781 /// know that (at least) one result needs expansion.
782 void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
783   DEBUG(cerr << "Expand integer result: "; N->dump(&DAG); cerr << "\n");
784   SDOperand Lo, Hi;
785   Lo = Hi = SDOperand();
786
787   // See if the target wants to custom expand this node.
788   if (TLI.getOperationAction(N->getOpcode(), N->getValueType(ResNo)) ==
789       TargetLowering::Custom) {
790     // If the target wants to, allow it to lower this itself.
791     if (SDNode *P = TLI.ReplaceNodeResults(N, DAG)) {
792       // Everything that once used N now uses P.  We are guaranteed that the
793       // result value types of N and the result value types of P match.
794       ReplaceNodeWith(N, P);
795       return;
796     }
797   }
798
799   switch (N->getOpcode()) {
800   default:
801 #ifndef NDEBUG
802     cerr << "ExpandIntegerResult #" << ResNo << ": ";
803     N->dump(&DAG); cerr << "\n";
804 #endif
805     assert(0 && "Do not know how to expand the result of this operator!");
806     abort();
807
808   case ISD::MERGE_VALUES: SplitRes_MERGE_VALUES(N, Lo, Hi); break;
809   case ISD::SELECT:       SplitRes_SELECT(N, Lo, Hi); break;
810   case ISD::SELECT_CC:    SplitRes_SELECT_CC(N, Lo, Hi); break;
811   case ISD::UNDEF:        SplitRes_UNDEF(N, Lo, Hi); break;
812
813   case ISD::BIT_CONVERT:        ExpandRes_BIT_CONVERT(N, Lo, Hi); break;
814   case ISD::BUILD_PAIR:         ExpandRes_BUILD_PAIR(N, Lo, Hi); break;
815   case ISD::EXTRACT_ELEMENT:    ExpandRes_EXTRACT_ELEMENT(N, Lo, Hi); break;
816   case ISD::EXTRACT_VECTOR_ELT: ExpandRes_EXTRACT_VECTOR_ELT(N, Lo, Hi); break;
817
818   case ISD::Constant:    ExpandIntRes_Constant(N, Lo, Hi); break;
819   case ISD::ANY_EXTEND:  ExpandIntRes_ANY_EXTEND(N, Lo, Hi); break;
820   case ISD::ZERO_EXTEND: ExpandIntRes_ZERO_EXTEND(N, Lo, Hi); break;
821   case ISD::SIGN_EXTEND: ExpandIntRes_SIGN_EXTEND(N, Lo, Hi); break;
822   case ISD::AssertZext:  ExpandIntRes_AssertZext(N, Lo, Hi); break;
823   case ISD::TRUNCATE:    ExpandIntRes_TRUNCATE(N, Lo, Hi); break;
824   case ISD::SIGN_EXTEND_INREG: ExpandIntRes_SIGN_EXTEND_INREG(N, Lo, Hi); break;
825   case ISD::FP_TO_SINT:  ExpandIntRes_FP_TO_SINT(N, Lo, Hi); break;
826   case ISD::FP_TO_UINT:  ExpandIntRes_FP_TO_UINT(N, Lo, Hi); break;
827   case ISD::LOAD:        ExpandIntRes_LOAD(cast<LoadSDNode>(N), Lo, Hi); break;
828
829   case ISD::AND:
830   case ISD::OR:
831   case ISD::XOR:         ExpandIntRes_Logical(N, Lo, Hi); break;
832   case ISD::BSWAP:       ExpandIntRes_BSWAP(N, Lo, Hi); break;
833   case ISD::ADD:
834   case ISD::SUB:         ExpandIntRes_ADDSUB(N, Lo, Hi); break;
835   case ISD::ADDC:
836   case ISD::SUBC:        ExpandIntRes_ADDSUBC(N, Lo, Hi); break;
837   case ISD::ADDE:
838   case ISD::SUBE:        ExpandIntRes_ADDSUBE(N, Lo, Hi); break;
839   case ISD::MUL:         ExpandIntRes_MUL(N, Lo, Hi); break;
840   case ISD::SDIV:        ExpandIntRes_SDIV(N, Lo, Hi); break;
841   case ISD::SREM:        ExpandIntRes_SREM(N, Lo, Hi); break;
842   case ISD::UDIV:        ExpandIntRes_UDIV(N, Lo, Hi); break;
843   case ISD::UREM:        ExpandIntRes_UREM(N, Lo, Hi); break;
844   case ISD::SHL:
845   case ISD::SRA:
846   case ISD::SRL:         ExpandIntRes_Shift(N, Lo, Hi); break;
847
848   case ISD::CTLZ:        ExpandIntRes_CTLZ(N, Lo, Hi); break;
849   case ISD::CTPOP:       ExpandIntRes_CTPOP(N, Lo, Hi); break;
850   case ISD::CTTZ:        ExpandIntRes_CTTZ(N, Lo, Hi); break;
851   }
852
853   // If Lo/Hi is null, the sub-method took care of registering results etc.
854   if (Lo.Val)
855     SetExpandedInteger(SDOperand(N, ResNo), Lo, Hi);
856 }
857
858 void DAGTypeLegalizer::ExpandIntRes_Constant(SDNode *N,
859                                              SDOperand &Lo, SDOperand &Hi) {
860   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
861   unsigned NBitWidth = NVT.getSizeInBits();
862   const APInt &Cst = cast<ConstantSDNode>(N)->getAPIntValue();
863   Lo = DAG.getConstant(APInt(Cst).trunc(NBitWidth), NVT);
864   Hi = DAG.getConstant(Cst.lshr(NBitWidth).trunc(NBitWidth), NVT);
865 }
866
867 void DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(SDNode *N,
868                                                SDOperand &Lo, SDOperand &Hi) {
869   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
870   SDOperand Op = N->getOperand(0);
871   if (Op.getValueType().bitsLE(NVT)) {
872     // The low part is any extension of the input (which degenerates to a copy).
873     Lo = DAG.getNode(ISD::ANY_EXTEND, NVT, Op);
874     Hi = DAG.getNode(ISD::UNDEF, NVT);   // The high part is undefined.
875   } else {
876     // For example, extension of an i48 to an i64.  The operand type necessarily
877     // promotes to the result type, so will end up being expanded too.
878     assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
879            "Only know how to promote this result!");
880     SDOperand Res = GetPromotedInteger(Op);
881     assert(Res.getValueType() == N->getValueType(0) &&
882            "Operand over promoted?");
883     // Split the promoted operand.  This will simplify when it is expanded.
884     SplitInteger(Res, Lo, Hi);
885   }
886 }
887
888 void DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(SDNode *N,
889                                                 SDOperand &Lo, SDOperand &Hi) {
890   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
891   SDOperand Op = N->getOperand(0);
892   if (Op.getValueType().bitsLE(NVT)) {
893     // The low part is zero extension of the input (which degenerates to a copy).
894     Lo = DAG.getNode(ISD::ZERO_EXTEND, NVT, N->getOperand(0));
895     Hi = DAG.getConstant(0, NVT);   // The high part is just a zero.
896   } else {
897     // For example, extension of an i48 to an i64.  The operand type necessarily
898     // promotes to the result type, so will end up being expanded too.
899     assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
900            "Only know how to promote this result!");
901     SDOperand Res = GetPromotedInteger(Op);
902     assert(Res.getValueType() == N->getValueType(0) &&
903            "Operand over promoted?");
904     // Split the promoted operand.  This will simplify when it is expanded.
905     SplitInteger(Res, Lo, Hi);
906     unsigned ExcessBits =
907       Op.getValueType().getSizeInBits() - NVT.getSizeInBits();
908     Hi = DAG.getZeroExtendInReg(Hi, MVT::getIntegerVT(ExcessBits));
909   }
910 }
911
912 void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(SDNode *N,
913                                                 SDOperand &Lo, SDOperand &Hi) {
914   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
915   SDOperand Op = N->getOperand(0);
916   if (Op.getValueType().bitsLE(NVT)) {
917     // The low part is sign extension of the input (which degenerates to a copy).
918     Lo = DAG.getNode(ISD::SIGN_EXTEND, NVT, N->getOperand(0));
919     // The high part is obtained by SRA'ing all but one of the bits of low part.
920     unsigned LoSize = NVT.getSizeInBits();
921     Hi = DAG.getNode(ISD::SRA, NVT, Lo,
922                      DAG.getConstant(LoSize-1, TLI.getShiftAmountTy()));
923   } else {
924     // For example, extension of an i48 to an i64.  The operand type necessarily
925     // promotes to the result type, so will end up being expanded too.
926     assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
927            "Only know how to promote this result!");
928     SDOperand Res = GetPromotedInteger(Op);
929     assert(Res.getValueType() == N->getValueType(0) &&
930            "Operand over promoted?");
931     // Split the promoted operand.  This will simplify when it is expanded.
932     SplitInteger(Res, Lo, Hi);
933     unsigned ExcessBits =
934       Op.getValueType().getSizeInBits() - NVT.getSizeInBits();
935     Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, Hi.getValueType(), Hi,
936                      DAG.getValueType(MVT::getIntegerVT(ExcessBits)));
937   }
938 }
939
940 void DAGTypeLegalizer::ExpandIntRes_AssertZext(SDNode *N,
941                                                SDOperand &Lo, SDOperand &Hi) {
942   GetExpandedInteger(N->getOperand(0), Lo, Hi);
943   MVT NVT = Lo.getValueType();
944   MVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
945   unsigned NVTBits = NVT.getSizeInBits();
946   unsigned EVTBits = EVT.getSizeInBits();
947
948   if (NVTBits < EVTBits) {
949     Hi = DAG.getNode(ISD::AssertZext, NVT, Hi,
950                      DAG.getValueType(MVT::getIntegerVT(EVTBits - NVTBits)));
951   } else {
952     Lo = DAG.getNode(ISD::AssertZext, NVT, Lo, DAG.getValueType(EVT));
953     // The high part must be zero, make it explicit.
954     Hi = DAG.getConstant(0, NVT);
955   }
956 }
957
958 void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(SDNode *N,
959                                              SDOperand &Lo, SDOperand &Hi) {
960   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
961   Lo = DAG.getNode(ISD::TRUNCATE, NVT, N->getOperand(0));
962   Hi = DAG.getNode(ISD::SRL, N->getOperand(0).getValueType(), N->getOperand(0),
963                    DAG.getConstant(NVT.getSizeInBits(),
964                                    TLI.getShiftAmountTy()));
965   Hi = DAG.getNode(ISD::TRUNCATE, NVT, Hi);
966 }
967
968 void DAGTypeLegalizer::
969 ExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDOperand &Lo, SDOperand &Hi) {
970   GetExpandedInteger(N->getOperand(0), Lo, Hi);
971   MVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
972
973   if (EVT.bitsLE(Lo.getValueType())) {
974     // sext_inreg the low part if needed.
975     Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, Lo.getValueType(), Lo,
976                      N->getOperand(1));
977
978     // The high part gets the sign extension from the lo-part.  This handles
979     // things like sextinreg V:i64 from i8.
980     Hi = DAG.getNode(ISD::SRA, Hi.getValueType(), Lo,
981                      DAG.getConstant(Hi.getValueType().getSizeInBits()-1,
982                                      TLI.getShiftAmountTy()));
983   } else {
984     // For example, extension of an i48 to an i64.  Leave the low part alone,
985     // sext_inreg the high part.
986     unsigned ExcessBits =
987       EVT.getSizeInBits() - Lo.getValueType().getSizeInBits();
988     Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, Hi.getValueType(), Hi,
989                      DAG.getValueType(MVT::getIntegerVT(ExcessBits)));
990   }
991 }
992
993 void DAGTypeLegalizer::ExpandIntRes_FP_TO_SINT(SDNode *N, SDOperand &Lo,
994                                                SDOperand &Hi) {
995   MVT VT = N->getValueType(0);
996   SDOperand Op = N->getOperand(0);
997   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
998
999   if (VT == MVT::i32) {
1000     if (Op.getValueType() == MVT::f32)
1001       LC = RTLIB::FPTOSINT_F32_I32;
1002     else if (Op.getValueType() == MVT::f64)
1003       LC = RTLIB::FPTOSINT_F64_I32;
1004     else if (Op.getValueType() == MVT::f80)
1005       LC = RTLIB::FPTOSINT_F80_I32;
1006     else if (Op.getValueType() == MVT::ppcf128)
1007       LC = RTLIB::FPTOSINT_PPCF128_I32;
1008   } else if (VT == MVT::i64) {
1009     if (Op.getValueType() == MVT::f32)
1010       LC = RTLIB::FPTOSINT_F32_I64;
1011     else if (Op.getValueType() == MVT::f64)
1012       LC = RTLIB::FPTOSINT_F64_I64;
1013     else if (Op.getValueType() == MVT::f80)
1014       LC = RTLIB::FPTOSINT_F80_I64;
1015     else if (Op.getValueType() == MVT::ppcf128)
1016       LC = RTLIB::FPTOSINT_PPCF128_I64;
1017   } else if (VT == MVT::i128) {
1018     if (Op.getValueType() == MVT::f32)
1019       LC = RTLIB::FPTOSINT_F32_I128;
1020     else if (Op.getValueType() == MVT::f64)
1021       LC = RTLIB::FPTOSINT_F64_I128;
1022     else if (Op.getValueType() == MVT::f80)
1023       LC = RTLIB::FPTOSINT_F80_I128;
1024     else if (Op.getValueType() == MVT::ppcf128)
1025       LC = RTLIB::FPTOSINT_PPCF128_I128;
1026   }
1027   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-sint conversion!");
1028   SplitInteger(MakeLibCall(LC, VT, &Op, 1, true/*sign irrelevant*/), Lo, Hi);
1029 }
1030
1031 void DAGTypeLegalizer::ExpandIntRes_FP_TO_UINT(SDNode *N, SDOperand &Lo,
1032                                                SDOperand &Hi) {
1033   MVT VT = N->getValueType(0);
1034   SDOperand Op = N->getOperand(0);
1035   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1036   if (VT == MVT::i32) {
1037     if (Op.getValueType() == MVT::f32)
1038       LC = RTLIB::FPTOUINT_F32_I32;
1039     else if (Op.getValueType() == MVT::f64)
1040       LC = RTLIB::FPTOUINT_F64_I32;
1041     else if (Op.getValueType() == MVT::f80)
1042       LC = RTLIB::FPTOUINT_F80_I32;
1043     else if (Op.getValueType() == MVT::ppcf128)
1044       LC = RTLIB::FPTOUINT_PPCF128_I32;
1045   } else if (VT == MVT::i64) {
1046     if (Op.getValueType() == MVT::f32)
1047       LC = RTLIB::FPTOUINT_F32_I64;
1048     else if (Op.getValueType() == MVT::f64)
1049       LC = RTLIB::FPTOUINT_F64_I64;
1050     else if (Op.getValueType() == MVT::f80)
1051       LC = RTLIB::FPTOUINT_F80_I64;
1052     else if (Op.getValueType() == MVT::ppcf128)
1053       LC = RTLIB::FPTOUINT_PPCF128_I64;
1054   } else if (VT == MVT::i128) {
1055     if (Op.getValueType() == MVT::f32)
1056       LC = RTLIB::FPTOUINT_F32_I128;
1057     else if (Op.getValueType() == MVT::f64)
1058       LC = RTLIB::FPTOUINT_F64_I128;
1059     else if (Op.getValueType() == MVT::f80)
1060       LC = RTLIB::FPTOUINT_F80_I128;
1061     else if (Op.getValueType() == MVT::ppcf128)
1062       LC = RTLIB::FPTOUINT_PPCF128_I128;
1063   }
1064   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-uint conversion!");
1065   SplitInteger(MakeLibCall(LC, VT, &Op, 1, false/*sign irrelevant*/), Lo, Hi);
1066 }
1067
1068 void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
1069                                          SDOperand &Lo, SDOperand &Hi) {
1070   if (ISD::isNormalLoad(N)) {
1071     ExpandRes_NormalLoad(N, Lo, Hi);
1072     return;
1073   }
1074
1075   assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!");
1076
1077   MVT VT = N->getValueType(0);
1078   MVT NVT = TLI.getTypeToTransformTo(VT);
1079   SDOperand Ch  = N->getChain();
1080   SDOperand Ptr = N->getBasePtr();
1081   ISD::LoadExtType ExtType = N->getExtensionType();
1082   int SVOffset = N->getSrcValueOffset();
1083   unsigned Alignment = N->getAlignment();
1084   bool isVolatile = N->isVolatile();
1085
1086   assert(NVT.isByteSized() && "Expanded type not byte sized!");
1087
1088   if (N->getMemoryVT().bitsLE(NVT)) {
1089     MVT EVT = N->getMemoryVT();
1090
1091     Lo = DAG.getExtLoad(ExtType, NVT, Ch, Ptr, N->getSrcValue(), SVOffset, EVT,
1092                         isVolatile, Alignment);
1093
1094     // Remember the chain.
1095     Ch = Lo.getValue(1);
1096
1097     if (ExtType == ISD::SEXTLOAD) {
1098       // The high part is obtained by SRA'ing all but one of the bits of the
1099       // lo part.
1100       unsigned LoSize = Lo.getValueType().getSizeInBits();
1101       Hi = DAG.getNode(ISD::SRA, NVT, Lo,
1102                        DAG.getConstant(LoSize-1, TLI.getShiftAmountTy()));
1103     } else if (ExtType == ISD::ZEXTLOAD) {
1104       // The high part is just a zero.
1105       Hi = DAG.getConstant(0, NVT);
1106     } else {
1107       assert(ExtType == ISD::EXTLOAD && "Unknown extload!");
1108       // The high part is undefined.
1109       Hi = DAG.getNode(ISD::UNDEF, NVT);
1110     }
1111   } else if (TLI.isLittleEndian()) {
1112     // Little-endian - low bits are at low addresses.
1113     Lo = DAG.getLoad(NVT, Ch, Ptr, N->getSrcValue(), SVOffset,
1114                      isVolatile, Alignment);
1115
1116     unsigned ExcessBits =
1117       N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
1118     MVT NEVT = MVT::getIntegerVT(ExcessBits);
1119
1120     // Increment the pointer to the other half.
1121     unsigned IncrementSize = NVT.getSizeInBits()/8;
1122     Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
1123                       DAG.getIntPtrConstant(IncrementSize));
1124     Hi = DAG.getExtLoad(ExtType, NVT, Ch, Ptr, N->getSrcValue(),
1125                         SVOffset+IncrementSize, NEVT,
1126                         isVolatile, MinAlign(Alignment, IncrementSize));
1127
1128     // Build a factor node to remember that this load is independent of the
1129     // other one.
1130     Ch = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1),
1131                      Hi.getValue(1));
1132   } else {
1133     // Big-endian - high bits are at low addresses.  Favor aligned loads at
1134     // the cost of some bit-fiddling.
1135     MVT EVT = N->getMemoryVT();
1136     unsigned EBytes = EVT.getStoreSizeInBits()/8;
1137     unsigned IncrementSize = NVT.getSizeInBits()/8;
1138     unsigned ExcessBits = (EBytes - IncrementSize)*8;
1139
1140     // Load both the high bits and maybe some of the low bits.
1141     Hi = DAG.getExtLoad(ExtType, NVT, Ch, Ptr, N->getSrcValue(), SVOffset,
1142                         MVT::getIntegerVT(EVT.getSizeInBits() - ExcessBits),
1143                         isVolatile, Alignment);
1144
1145     // Increment the pointer to the other half.
1146     Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
1147                       DAG.getIntPtrConstant(IncrementSize));
1148     // Load the rest of the low bits.
1149     Lo = DAG.getExtLoad(ISD::ZEXTLOAD, NVT, Ch, Ptr, N->getSrcValue(),
1150                         SVOffset+IncrementSize,
1151                         MVT::getIntegerVT(ExcessBits),
1152                         isVolatile, MinAlign(Alignment, IncrementSize));
1153
1154     // Build a factor node to remember that this load is independent of the
1155     // other one.
1156     Ch = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1),
1157                      Hi.getValue(1));
1158
1159     if (ExcessBits < NVT.getSizeInBits()) {
1160       // Transfer low bits from the bottom of Hi to the top of Lo.
1161       Lo = DAG.getNode(ISD::OR, NVT, Lo,
1162                        DAG.getNode(ISD::SHL, NVT, Hi,
1163                                    DAG.getConstant(ExcessBits,
1164                                                    TLI.getShiftAmountTy())));
1165       // Move high bits to the right position in Hi.
1166       Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, NVT, Hi,
1167                        DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
1168                                        TLI.getShiftAmountTy()));
1169     }
1170   }
1171
1172   // Legalized the chain result - switch anything that used the old chain to
1173   // use the new one.
1174   ReplaceValueWith(SDOperand(N, 1), Ch);
1175 }
1176
1177 void DAGTypeLegalizer::ExpandIntRes_Logical(SDNode *N,
1178                                             SDOperand &Lo, SDOperand &Hi) {
1179   SDOperand LL, LH, RL, RH;
1180   GetExpandedInteger(N->getOperand(0), LL, LH);
1181   GetExpandedInteger(N->getOperand(1), RL, RH);
1182   Lo = DAG.getNode(N->getOpcode(), LL.getValueType(), LL, RL);
1183   Hi = DAG.getNode(N->getOpcode(), LL.getValueType(), LH, RH);
1184 }
1185
1186 void DAGTypeLegalizer::ExpandIntRes_BSWAP(SDNode *N,
1187                                           SDOperand &Lo, SDOperand &Hi) {
1188   GetExpandedInteger(N->getOperand(0), Hi, Lo);  // Note swapped operands.
1189   Lo = DAG.getNode(ISD::BSWAP, Lo.getValueType(), Lo);
1190   Hi = DAG.getNode(ISD::BSWAP, Hi.getValueType(), Hi);
1191 }
1192
1193 void DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,
1194                                            SDOperand &Lo, SDOperand &Hi) {
1195   // Expand the subcomponents.
1196   SDOperand LHSL, LHSH, RHSL, RHSH;
1197   GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
1198   GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
1199   SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag);
1200   SDOperand LoOps[2] = { LHSL, RHSL };
1201   SDOperand HiOps[3] = { LHSH, RHSH };
1202
1203   if (N->getOpcode() == ISD::ADD) {
1204     Lo = DAG.getNode(ISD::ADDC, VTList, LoOps, 2);
1205     HiOps[2] = Lo.getValue(1);
1206     Hi = DAG.getNode(ISD::ADDE, VTList, HiOps, 3);
1207   } else {
1208     Lo = DAG.getNode(ISD::SUBC, VTList, LoOps, 2);
1209     HiOps[2] = Lo.getValue(1);
1210     Hi = DAG.getNode(ISD::SUBE, VTList, HiOps, 3);
1211   }
1212 }
1213
1214 void DAGTypeLegalizer::ExpandIntRes_ADDSUBC(SDNode *N,
1215                                             SDOperand &Lo, SDOperand &Hi) {
1216   // Expand the subcomponents.
1217   SDOperand LHSL, LHSH, RHSL, RHSH;
1218   GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
1219   GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
1220   SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag);
1221   SDOperand LoOps[2] = { LHSL, RHSL };
1222   SDOperand HiOps[3] = { LHSH, RHSH };
1223
1224   if (N->getOpcode() == ISD::ADDC) {
1225     Lo = DAG.getNode(ISD::ADDC, VTList, LoOps, 2);
1226     HiOps[2] = Lo.getValue(1);
1227     Hi = DAG.getNode(ISD::ADDE, VTList, HiOps, 3);
1228   } else {
1229     Lo = DAG.getNode(ISD::SUBC, VTList, LoOps, 2);
1230     HiOps[2] = Lo.getValue(1);
1231     Hi = DAG.getNode(ISD::SUBE, VTList, HiOps, 3);
1232   }
1233
1234   // Legalized the flag result - switch anything that used the old flag to
1235   // use the new one.
1236   ReplaceValueWith(SDOperand(N, 1), Hi.getValue(1));
1237 }
1238
1239 void DAGTypeLegalizer::ExpandIntRes_ADDSUBE(SDNode *N,
1240                                             SDOperand &Lo, SDOperand &Hi) {
1241   // Expand the subcomponents.
1242   SDOperand LHSL, LHSH, RHSL, RHSH;
1243   GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
1244   GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
1245   SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag);
1246   SDOperand LoOps[3] = { LHSL, RHSL, N->getOperand(2) };
1247   SDOperand HiOps[3] = { LHSH, RHSH };
1248
1249   Lo = DAG.getNode(N->getOpcode(), VTList, LoOps, 3);
1250   HiOps[2] = Lo.getValue(1);
1251   Hi = DAG.getNode(N->getOpcode(), VTList, HiOps, 3);
1252
1253   // Legalized the flag result - switch anything that used the old flag to
1254   // use the new one.
1255   ReplaceValueWith(SDOperand(N, 1), Hi.getValue(1));
1256 }
1257
1258 void DAGTypeLegalizer::ExpandIntRes_MUL(SDNode *N,
1259                                         SDOperand &Lo, SDOperand &Hi) {
1260   MVT VT = N->getValueType(0);
1261   MVT NVT = TLI.getTypeToTransformTo(VT);
1262
1263   bool HasMULHS = TLI.isOperationLegal(ISD::MULHS, NVT);
1264   bool HasMULHU = TLI.isOperationLegal(ISD::MULHU, NVT);
1265   bool HasSMUL_LOHI = TLI.isOperationLegal(ISD::SMUL_LOHI, NVT);
1266   bool HasUMUL_LOHI = TLI.isOperationLegal(ISD::UMUL_LOHI, NVT);
1267   if (HasMULHU || HasMULHS || HasUMUL_LOHI || HasSMUL_LOHI) {
1268     SDOperand LL, LH, RL, RH;
1269     GetExpandedInteger(N->getOperand(0), LL, LH);
1270     GetExpandedInteger(N->getOperand(1), RL, RH);
1271     unsigned OuterBitSize = VT.getSizeInBits();
1272     unsigned InnerBitSize = NVT.getSizeInBits();
1273     unsigned LHSSB = DAG.ComputeNumSignBits(N->getOperand(0));
1274     unsigned RHSSB = DAG.ComputeNumSignBits(N->getOperand(1));
1275
1276     APInt HighMask = APInt::getHighBitsSet(OuterBitSize, InnerBitSize);
1277     if (DAG.MaskedValueIsZero(N->getOperand(0), HighMask) &&
1278         DAG.MaskedValueIsZero(N->getOperand(1), HighMask)) {
1279       // The inputs are both zero-extended.
1280       if (HasUMUL_LOHI) {
1281         // We can emit a umul_lohi.
1282         Lo = DAG.getNode(ISD::UMUL_LOHI, DAG.getVTList(NVT, NVT), LL, RL);
1283         Hi = SDOperand(Lo.Val, 1);
1284         return;
1285       }
1286       if (HasMULHU) {
1287         // We can emit a mulhu+mul.
1288         Lo = DAG.getNode(ISD::MUL, NVT, LL, RL);
1289         Hi = DAG.getNode(ISD::MULHU, NVT, LL, RL);
1290         return;
1291       }
1292     }
1293     if (LHSSB > InnerBitSize && RHSSB > InnerBitSize) {
1294       // The input values are both sign-extended.
1295       if (HasSMUL_LOHI) {
1296         // We can emit a smul_lohi.
1297         Lo = DAG.getNode(ISD::SMUL_LOHI, DAG.getVTList(NVT, NVT), LL, RL);
1298         Hi = SDOperand(Lo.Val, 1);
1299         return;
1300       }
1301       if (HasMULHS) {
1302         // We can emit a mulhs+mul.
1303         Lo = DAG.getNode(ISD::MUL, NVT, LL, RL);
1304         Hi = DAG.getNode(ISD::MULHS, NVT, LL, RL);
1305         return;
1306       }
1307     }
1308     if (HasUMUL_LOHI) {
1309       // Lo,Hi = umul LHS, RHS.
1310       SDOperand UMulLOHI = DAG.getNode(ISD::UMUL_LOHI,
1311                                        DAG.getVTList(NVT, NVT), LL, RL);
1312       Lo = UMulLOHI;
1313       Hi = UMulLOHI.getValue(1);
1314       RH = DAG.getNode(ISD::MUL, NVT, LL, RH);
1315       LH = DAG.getNode(ISD::MUL, NVT, LH, RL);
1316       Hi = DAG.getNode(ISD::ADD, NVT, Hi, RH);
1317       Hi = DAG.getNode(ISD::ADD, NVT, Hi, LH);
1318       return;
1319     }
1320     if (HasMULHU) {
1321       Lo = DAG.getNode(ISD::MUL, NVT, LL, RL);
1322       Hi = DAG.getNode(ISD::MULHU, NVT, LL, RL);
1323       RH = DAG.getNode(ISD::MUL, NVT, LL, RH);
1324       LH = DAG.getNode(ISD::MUL, NVT, LH, RL);
1325       Hi = DAG.getNode(ISD::ADD, NVT, Hi, RH);
1326       Hi = DAG.getNode(ISD::ADD, NVT, Hi, LH);
1327       return;
1328     }
1329   }
1330
1331   // If nothing else, we can make a libcall.
1332   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1333   if (VT == MVT::i32)
1334     LC = RTLIB::MUL_I32;
1335   else if (VT == MVT::i64)
1336     LC = RTLIB::MUL_I64;
1337   else if (VT == MVT::i128)
1338     LC = RTLIB::MUL_I128;
1339   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported MUL!");
1340
1341   SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) };
1342   SplitInteger(MakeLibCall(LC, VT, Ops, 2, true/*sign irrelevant*/), Lo, Hi);
1343 }
1344
1345 void DAGTypeLegalizer::ExpandIntRes_SDIV(SDNode *N,
1346                                          SDOperand &Lo, SDOperand &Hi) {
1347   MVT VT = N->getValueType(0);
1348
1349   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1350   if (VT == MVT::i32)
1351     LC = RTLIB::SDIV_I32;
1352   else if (VT == MVT::i64)
1353     LC = RTLIB::SDIV_I64;
1354   else if (VT == MVT::i128)
1355     LC = RTLIB::SDIV_I128;
1356   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SDIV!");
1357
1358   SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) };
1359   SplitInteger(MakeLibCall(LC, VT, Ops, 2, true), Lo, Hi);
1360 }
1361
1362 void DAGTypeLegalizer::ExpandIntRes_SREM(SDNode *N,
1363                                          SDOperand &Lo, SDOperand &Hi) {
1364   MVT VT = N->getValueType(0);
1365
1366   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1367   if (VT == MVT::i32)
1368     LC = RTLIB::SREM_I32;
1369   else if (VT == MVT::i64)
1370     LC = RTLIB::SREM_I64;
1371   else if (VT == MVT::i128)
1372     LC = RTLIB::SREM_I128;
1373   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SREM!");
1374
1375   SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) };
1376   SplitInteger(MakeLibCall(LC, VT, Ops, 2, true), Lo, Hi);
1377 }
1378
1379 void DAGTypeLegalizer::ExpandIntRes_UDIV(SDNode *N,
1380                                          SDOperand &Lo, SDOperand &Hi) {
1381   MVT VT = N->getValueType(0);
1382
1383   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1384   if (VT == MVT::i32)
1385     LC = RTLIB::UDIV_I32;
1386   else if (VT == MVT::i64)
1387     LC = RTLIB::UDIV_I64;
1388   else if (VT == MVT::i128)
1389     LC = RTLIB::UDIV_I128;
1390   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UDIV!");
1391
1392   SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) };
1393   SplitInteger(MakeLibCall(LC, VT, Ops, 2, false), Lo, Hi);
1394 }
1395
1396 void DAGTypeLegalizer::ExpandIntRes_UREM(SDNode *N,
1397                                          SDOperand &Lo, SDOperand &Hi) {
1398   MVT VT = N->getValueType(0);
1399
1400   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1401   if (VT == MVT::i32)
1402     LC = RTLIB::UREM_I32;
1403   else if (VT == MVT::i64)
1404     LC = RTLIB::UREM_I64;
1405   else if (VT == MVT::i128)
1406     LC = RTLIB::UREM_I128;
1407   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UREM!");
1408
1409   SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) };
1410   SplitInteger(MakeLibCall(LC, VT, Ops, 2, false), Lo, Hi);
1411 }
1412
1413 void DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N,
1414                                           SDOperand &Lo, SDOperand &Hi) {
1415   MVT VT = N->getValueType(0);
1416
1417   // If we can emit an efficient shift operation, do so now.  Check to see if
1418   // the RHS is a constant.
1419   if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1)))
1420     return ExpandShiftByConstant(N, CN->getValue(), Lo, Hi);
1421
1422   // If we can determine that the high bit of the shift is zero or one, even if
1423   // the low bits are variable, emit this shift in an optimized form.
1424   if (ExpandShiftWithKnownAmountBit(N, Lo, Hi))
1425     return;
1426
1427   // If this target supports shift_PARTS, use it.  First, map to the _PARTS opc.
1428   unsigned PartsOpc;
1429   if (N->getOpcode() == ISD::SHL) {
1430     PartsOpc = ISD::SHL_PARTS;
1431   } else if (N->getOpcode() == ISD::SRL) {
1432     PartsOpc = ISD::SRL_PARTS;
1433   } else {
1434     assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
1435     PartsOpc = ISD::SRA_PARTS;
1436   }
1437
1438   // Next check to see if the target supports this SHL_PARTS operation or if it
1439   // will custom expand it.
1440   MVT NVT = TLI.getTypeToTransformTo(VT);
1441   TargetLowering::LegalizeAction Action = TLI.getOperationAction(PartsOpc, NVT);
1442   if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) ||
1443       Action == TargetLowering::Custom) {
1444     // Expand the subcomponents.
1445     SDOperand LHSL, LHSH;
1446     GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
1447
1448     SDOperand Ops[] = { LHSL, LHSH, N->getOperand(1) };
1449     MVT VT = LHSL.getValueType();
1450     Lo = DAG.getNode(PartsOpc, DAG.getNodeValueTypes(VT, VT), 2, Ops, 3);
1451     Hi = Lo.getValue(1);
1452     return;
1453   }
1454
1455   // Otherwise, emit a libcall.
1456   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1457   bool isSigned;
1458   if (N->getOpcode() == ISD::SHL) {
1459     isSigned = false; /*sign irrelevant*/
1460     if (VT == MVT::i32)
1461       LC = RTLIB::SHL_I32;
1462     else if (VT == MVT::i64)
1463       LC = RTLIB::SHL_I64;
1464     else if (VT == MVT::i128)
1465       LC = RTLIB::SHL_I128;
1466   } else if (N->getOpcode() == ISD::SRL) {
1467     isSigned = false;
1468     if (VT == MVT::i32)
1469       LC = RTLIB::SRL_I32;
1470     else if (VT == MVT::i64)
1471       LC = RTLIB::SRL_I64;
1472     else if (VT == MVT::i128)
1473       LC = RTLIB::SRL_I128;
1474   } else {
1475     assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
1476     isSigned = true;
1477     if (VT == MVT::i32)
1478       LC = RTLIB::SRA_I32;
1479     else if (VT == MVT::i64)
1480       LC = RTLIB::SRA_I64;
1481     else if (VT == MVT::i128)
1482       LC = RTLIB::SRA_I128;
1483   }
1484   assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported shift!");
1485
1486   SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) };
1487   SplitInteger(MakeLibCall(LC, VT, Ops, 2, isSigned), Lo, Hi);
1488 }
1489
1490 void DAGTypeLegalizer::ExpandIntRes_CTLZ(SDNode *N,
1491                                          SDOperand &Lo, SDOperand &Hi) {
1492   // ctlz (HiLo) -> Hi != 0 ? ctlz(Hi) : (ctlz(Lo)+32)
1493   GetExpandedInteger(N->getOperand(0), Lo, Hi);
1494   MVT NVT = Lo.getValueType();
1495
1496   SDOperand HiNotZero = DAG.getSetCC(TLI.getSetCCResultType(Hi), Hi,
1497                                      DAG.getConstant(0, NVT), ISD::SETNE);
1498
1499   SDOperand LoLZ = DAG.getNode(ISD::CTLZ, NVT, Lo);
1500   SDOperand HiLZ = DAG.getNode(ISD::CTLZ, NVT, Hi);
1501
1502   Lo = DAG.getNode(ISD::SELECT, NVT, HiNotZero, HiLZ,
1503                    DAG.getNode(ISD::ADD, NVT, LoLZ,
1504                                DAG.getConstant(NVT.getSizeInBits(), NVT)));
1505   Hi = DAG.getConstant(0, NVT);
1506 }
1507
1508 void DAGTypeLegalizer::ExpandIntRes_CTPOP(SDNode *N,
1509                                           SDOperand &Lo, SDOperand &Hi) {
1510   // ctpop(HiLo) -> ctpop(Hi)+ctpop(Lo)
1511   GetExpandedInteger(N->getOperand(0), Lo, Hi);
1512   MVT NVT = Lo.getValueType();
1513   Lo = DAG.getNode(ISD::ADD, NVT, DAG.getNode(ISD::CTPOP, NVT, Lo),
1514                    DAG.getNode(ISD::CTPOP, NVT, Hi));
1515   Hi = DAG.getConstant(0, NVT);
1516 }
1517
1518 void DAGTypeLegalizer::ExpandIntRes_CTTZ(SDNode *N,
1519                                          SDOperand &Lo, SDOperand &Hi) {
1520   // cttz (HiLo) -> Lo != 0 ? cttz(Lo) : (cttz(Hi)+32)
1521   GetExpandedInteger(N->getOperand(0), Lo, Hi);
1522   MVT NVT = Lo.getValueType();
1523
1524   SDOperand LoNotZero = DAG.getSetCC(TLI.getSetCCResultType(Lo), Lo,
1525                                      DAG.getConstant(0, NVT), ISD::SETNE);
1526
1527   SDOperand LoLZ = DAG.getNode(ISD::CTTZ, NVT, Lo);
1528   SDOperand HiLZ = DAG.getNode(ISD::CTTZ, NVT, Hi);
1529
1530   Lo = DAG.getNode(ISD::SELECT, NVT, LoNotZero, LoLZ,
1531                    DAG.getNode(ISD::ADD, NVT, HiLZ,
1532                                DAG.getConstant(NVT.getSizeInBits(), NVT)));
1533   Hi = DAG.getConstant(0, NVT);
1534 }
1535
1536 /// ExpandShiftByConstant - N is a shift by a value that needs to be expanded,
1537 /// and the shift amount is a constant 'Amt'.  Expand the operation.
1538 void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,
1539                                              SDOperand &Lo, SDOperand &Hi) {
1540   // Expand the incoming operand to be shifted, so that we have its parts
1541   SDOperand InL, InH;
1542   GetExpandedInteger(N->getOperand(0), InL, InH);
1543
1544   MVT NVT = InL.getValueType();
1545   unsigned VTBits = N->getValueType(0).getSizeInBits();
1546   unsigned NVTBits = NVT.getSizeInBits();
1547   MVT ShTy = N->getOperand(1).getValueType();
1548
1549   if (N->getOpcode() == ISD::SHL) {
1550     if (Amt > VTBits) {
1551       Lo = Hi = DAG.getConstant(0, NVT);
1552     } else if (Amt > NVTBits) {
1553       Lo = DAG.getConstant(0, NVT);
1554       Hi = DAG.getNode(ISD::SHL, NVT, InL, DAG.getConstant(Amt-NVTBits,ShTy));
1555     } else if (Amt == NVTBits) {
1556       Lo = DAG.getConstant(0, NVT);
1557       Hi = InL;
1558     } else if (Amt == 1) {
1559       // Emit this X << 1 as X+X.
1560       SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
1561       SDOperand LoOps[2] = { InL, InL };
1562       Lo = DAG.getNode(ISD::ADDC, VTList, LoOps, 2);
1563       SDOperand HiOps[3] = { InH, InH, Lo.getValue(1) };
1564       Hi = DAG.getNode(ISD::ADDE, VTList, HiOps, 3);
1565     } else {
1566       Lo = DAG.getNode(ISD::SHL, NVT, InL, DAG.getConstant(Amt, ShTy));
1567       Hi = DAG.getNode(ISD::OR, NVT,
1568                        DAG.getNode(ISD::SHL, NVT, InH,
1569                                    DAG.getConstant(Amt, ShTy)),
1570                        DAG.getNode(ISD::SRL, NVT, InL,
1571                                    DAG.getConstant(NVTBits-Amt, ShTy)));
1572     }
1573     return;
1574   }
1575
1576   if (N->getOpcode() == ISD::SRL) {
1577     if (Amt > VTBits) {
1578       Lo = DAG.getConstant(0, NVT);
1579       Hi = DAG.getConstant(0, NVT);
1580     } else if (Amt > NVTBits) {
1581       Lo = DAG.getNode(ISD::SRL, NVT, InH, DAG.getConstant(Amt-NVTBits,ShTy));
1582       Hi = DAG.getConstant(0, NVT);
1583     } else if (Amt == NVTBits) {
1584       Lo = InH;
1585       Hi = DAG.getConstant(0, NVT);
1586     } else {
1587       Lo = DAG.getNode(ISD::OR, NVT,
1588                        DAG.getNode(ISD::SRL, NVT, InL,
1589                                    DAG.getConstant(Amt, ShTy)),
1590                        DAG.getNode(ISD::SHL, NVT, InH,
1591                                    DAG.getConstant(NVTBits-Amt, ShTy)));
1592       Hi = DAG.getNode(ISD::SRL, NVT, InH, DAG.getConstant(Amt, ShTy));
1593     }
1594     return;
1595   }
1596
1597   assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
1598   if (Amt > VTBits) {
1599     Hi = Lo = DAG.getNode(ISD::SRA, NVT, InH,
1600                           DAG.getConstant(NVTBits-1, ShTy));
1601   } else if (Amt > NVTBits) {
1602     Lo = DAG.getNode(ISD::SRA, NVT, InH,
1603                      DAG.getConstant(Amt-NVTBits, ShTy));
1604     Hi = DAG.getNode(ISD::SRA, NVT, InH,
1605                      DAG.getConstant(NVTBits-1, ShTy));
1606   } else if (Amt == NVTBits) {
1607     Lo = InH;
1608     Hi = DAG.getNode(ISD::SRA, NVT, InH,
1609                      DAG.getConstant(NVTBits-1, ShTy));
1610   } else {
1611     Lo = DAG.getNode(ISD::OR, NVT,
1612                      DAG.getNode(ISD::SRL, NVT, InL,
1613                                  DAG.getConstant(Amt, ShTy)),
1614                      DAG.getNode(ISD::SHL, NVT, InH,
1615                                  DAG.getConstant(NVTBits-Amt, ShTy)));
1616     Hi = DAG.getNode(ISD::SRA, NVT, InH, DAG.getConstant(Amt, ShTy));
1617   }
1618 }
1619
1620 /// ExpandShiftWithKnownAmountBit - Try to determine whether we can simplify
1621 /// this shift based on knowledge of the high bit of the shift amount.  If we
1622 /// can tell this, we know that it is >= 32 or < 32, without knowing the actual
1623 /// shift amount.
1624 bool DAGTypeLegalizer::
1625 ExpandShiftWithKnownAmountBit(SDNode *N, SDOperand &Lo, SDOperand &Hi) {
1626   SDOperand Amt = N->getOperand(1);
1627   MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
1628   MVT ShTy = Amt.getValueType();
1629   unsigned ShBits = ShTy.getSizeInBits();
1630   unsigned NVTBits = NVT.getSizeInBits();
1631   assert(isPowerOf2_32(NVTBits) &&
1632          "Expanded integer type size not a power of two!");
1633
1634   APInt HighBitMask = APInt::getHighBitsSet(ShBits, ShBits - Log2_32(NVTBits));
1635   APInt KnownZero, KnownOne;
1636   DAG.ComputeMaskedBits(N->getOperand(1), HighBitMask, KnownZero, KnownOne);
1637
1638   // If we don't know anything about the high bits, exit.
1639   if (((KnownZero|KnownOne) & HighBitMask) == 0)
1640     return false;
1641
1642   // Get the incoming operand to be shifted.
1643   SDOperand InL, InH;
1644   GetExpandedInteger(N->getOperand(0), InL, InH);
1645
1646   // If we know that any of the high bits of the shift amount are one, then we
1647   // can do this as a couple of simple shifts.
1648   if (KnownOne.intersects(HighBitMask)) {
1649     // Mask out the high bit, which we know is set.
1650     Amt = DAG.getNode(ISD::AND, ShTy, Amt,
1651                       DAG.getConstant(~HighBitMask, ShTy));
1652
1653     switch (N->getOpcode()) {
1654     default: assert(0 && "Unknown shift");
1655     case ISD::SHL:
1656       Lo = DAG.getConstant(0, NVT);              // Low part is zero.
1657       Hi = DAG.getNode(ISD::SHL, NVT, InL, Amt); // High part from Lo part.
1658       return true;
1659     case ISD::SRL:
1660       Hi = DAG.getConstant(0, NVT);              // Hi part is zero.
1661       Lo = DAG.getNode(ISD::SRL, NVT, InH, Amt); // Lo part from Hi part.
1662       return true;
1663     case ISD::SRA:
1664       Hi = DAG.getNode(ISD::SRA, NVT, InH,       // Sign extend high part.
1665                        DAG.getConstant(NVTBits-1, ShTy));
1666       Lo = DAG.getNode(ISD::SRA, NVT, InH, Amt); // Lo part from Hi part.
1667       return true;
1668     }
1669   }
1670
1671   // If we know that all of the high bits of the shift amount are zero, then we
1672   // can do this as a couple of simple shifts.
1673   if ((KnownZero & HighBitMask) == HighBitMask) {
1674     // Compute 32-amt.
1675     SDOperand Amt2 = DAG.getNode(ISD::SUB, ShTy,
1676                                  DAG.getConstant(NVTBits, ShTy),
1677                                  Amt);
1678     unsigned Op1, Op2;
1679     switch (N->getOpcode()) {
1680     default: assert(0 && "Unknown shift");
1681     case ISD::SHL:  Op1 = ISD::SHL; Op2 = ISD::SRL; break;
1682     case ISD::SRL:
1683     case ISD::SRA:  Op1 = ISD::SRL; Op2 = ISD::SHL; break;
1684     }
1685
1686     Lo = DAG.getNode(N->getOpcode(), NVT, InL, Amt);
1687     Hi = DAG.getNode(ISD::OR, NVT,
1688                      DAG.getNode(Op1, NVT, InH, Amt),
1689                      DAG.getNode(Op2, NVT, InL, Amt2));
1690     return true;
1691   }
1692
1693   return false;
1694 }
1695
1696
1697 //===----------------------------------------------------------------------===//
1698 //  Integer Operand Expansion
1699 //===----------------------------------------------------------------------===//
1700
1701 /// ExpandIntegerOperand - This method is called when the specified operand of
1702 /// the specified node is found to need expansion.  At this point, all of the
1703 /// result types of the node are known to be legal, but other operands of the
1704 /// node may need promotion or expansion as well as the specified one.
1705 bool DAGTypeLegalizer::ExpandIntegerOperand(SDNode *N, unsigned OpNo) {
1706   DEBUG(cerr << "Expand integer operand: "; N->dump(&DAG); cerr << "\n");
1707   SDOperand Res = SDOperand();
1708
1709   if (TLI.getOperationAction(N->getOpcode(), N->getOperand(OpNo).getValueType())
1710       == TargetLowering::Custom)
1711     Res = TLI.LowerOperation(SDOperand(N, OpNo), DAG);
1712
1713   if (Res.Val == 0) {
1714     switch (N->getOpcode()) {
1715     default:
1716   #ifndef NDEBUG
1717       cerr << "ExpandIntegerOperand Op #" << OpNo << ": ";
1718       N->dump(&DAG); cerr << "\n";
1719   #endif
1720       assert(0 && "Do not know how to expand this operator's operand!");
1721       abort();
1722
1723     case ISD::BUILD_VECTOR:    Res = ExpandOp_BUILD_VECTOR(N); break;
1724     case ISD::BIT_CONVERT:     Res = ExpandOp_BIT_CONVERT(N); break;
1725     case ISD::EXTRACT_ELEMENT: Res = ExpandOp_EXTRACT_ELEMENT(N); break;
1726
1727     case ISD::TRUNCATE:        Res = ExpandIntOp_TRUNCATE(N); break;
1728
1729     case ISD::SINT_TO_FP:      Res = ExpandIntOp_SINT_TO_FP(N); break;
1730     case ISD::UINT_TO_FP:      Res = ExpandIntOp_UINT_TO_FP(N); break;
1731
1732     case ISD::BR_CC:     Res = ExpandIntOp_BR_CC(N); break;
1733     case ISD::SELECT_CC: Res = ExpandIntOp_SELECT_CC(N); break;
1734     case ISD::SETCC:     Res = ExpandIntOp_SETCC(N); break;
1735
1736     case ISD::STORE:
1737       Res = ExpandIntOp_STORE(cast<StoreSDNode>(N), OpNo);
1738       break;
1739     }
1740   }
1741
1742   // If the result is null, the sub-method took care of registering results etc.
1743   if (!Res.Val) return false;
1744   // If the result is N, the sub-method updated N in place.  Check to see if any
1745   // operands are new, and if so, mark them.
1746   if (Res.Val == N) {
1747     // Mark N as new and remark N and its operands.  This allows us to correctly
1748     // revisit N if it needs another step of expansion and allows us to visit
1749     // any new operands to N.
1750     ReanalyzeNode(N);
1751     return true;
1752   }
1753
1754   assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
1755          "Invalid operand expansion");
1756
1757   ReplaceValueWith(SDOperand(N, 0), Res);
1758   return false;
1759 }
1760
1761 SDOperand DAGTypeLegalizer::ExpandIntOp_TRUNCATE(SDNode *N) {
1762   SDOperand InL, InH;
1763   GetExpandedInteger(N->getOperand(0), InL, InH);
1764   // Just truncate the low part of the source.
1765   return DAG.getNode(ISD::TRUNCATE, N->getValueType(0), InL);
1766 }
1767
1768 SDOperand DAGTypeLegalizer::ExpandIntOp_SINT_TO_FP(SDNode *N) {
1769   SDOperand Op = N->getOperand(0);
1770   MVT SrcVT = Op.getValueType();
1771   MVT DstVT = N->getValueType(0);
1772
1773   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1774   if (SrcVT == MVT::i32) {
1775     if (DstVT == MVT::f32)
1776       LC = RTLIB::SINTTOFP_I32_F32;
1777     else if (DstVT == MVT::f64)
1778       LC = RTLIB::SINTTOFP_I32_F64;
1779     else if (DstVT == MVT::f80)
1780       LC = RTLIB::SINTTOFP_I32_F80;
1781     else if (DstVT == MVT::ppcf128)
1782       LC = RTLIB::SINTTOFP_I32_PPCF128;
1783   } else if (SrcVT == MVT::i64) {
1784     if (DstVT == MVT::f32)
1785       LC = RTLIB::SINTTOFP_I64_F32;
1786     else if (DstVT == MVT::f64)
1787       LC = RTLIB::SINTTOFP_I64_F64;
1788     else if (DstVT == MVT::f80)
1789       LC = RTLIB::SINTTOFP_I64_F80;
1790     else if (DstVT == MVT::ppcf128)
1791       LC = RTLIB::SINTTOFP_I64_PPCF128;
1792   } else if (SrcVT == MVT::i128) {
1793     if (DstVT == MVT::f32)
1794       LC = RTLIB::SINTTOFP_I128_F32;
1795     else if (DstVT == MVT::f64)
1796       LC = RTLIB::SINTTOFP_I128_F64;
1797     else if (DstVT == MVT::f80)
1798       LC = RTLIB::SINTTOFP_I128_F80;
1799     else if (DstVT == MVT::ppcf128)
1800       LC = RTLIB::SINTTOFP_I128_PPCF128;
1801   }
1802   assert(LC != RTLIB::UNKNOWN_LIBCALL &&
1803          "Don't know how to expand this SINT_TO_FP!");
1804
1805   return MakeLibCall(LC, DstVT, &Op, 1, true);
1806 }
1807
1808 SDOperand DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
1809   SDOperand Op = N->getOperand(0);
1810   MVT SrcVT = Op.getValueType();
1811   MVT DstVT = N->getValueType(0);
1812
1813   if (TLI.getOperationAction(ISD::SINT_TO_FP, SrcVT) == TargetLowering::Custom){
1814     // Do a signed conversion then adjust the result.
1815     SDOperand SignedConv = DAG.getNode(ISD::SINT_TO_FP, DstVT, Op);
1816     SignedConv = TLI.LowerOperation(SignedConv, DAG);
1817
1818     // The result of the signed conversion needs adjusting if the 'sign bit' of
1819     // the incoming integer was set.  To handle this, we dynamically test to see
1820     // if it is set, and, if so, add a fudge factor.
1821
1822     const uint64_t F32TwoE32  = 0x4F800000ULL;
1823     const uint64_t F32TwoE64  = 0x5F800000ULL;
1824     const uint64_t F32TwoE128 = 0x7F800000ULL;
1825
1826     APInt FF(32, 0);
1827     if (SrcVT == MVT::i32)
1828       FF = APInt(32, F32TwoE32);
1829     else if (SrcVT == MVT::i64)
1830       FF = APInt(32, F32TwoE64);
1831     else if (SrcVT == MVT::i128)
1832       FF = APInt(32, F32TwoE128);
1833     else
1834       assert(false && "Unsupported UINT_TO_FP!");
1835
1836     // Check whether the sign bit is set.
1837     SDOperand Lo, Hi;
1838     GetExpandedInteger(Op, Lo, Hi);
1839     SDOperand SignSet = DAG.getSetCC(TLI.getSetCCResultType(Hi), Hi,
1840                                      DAG.getConstant(0, Hi.getValueType()),
1841                                      ISD::SETLT);
1842
1843     // Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
1844     SDOperand FudgePtr = DAG.getConstantPool(ConstantInt::get(FF.zext(64)),
1845                                              TLI.getPointerTy());
1846
1847     // Get a pointer to FF if the sign bit was set, or to 0 otherwise.
1848     SDOperand Zero = DAG.getIntPtrConstant(0);
1849     SDOperand Four = DAG.getIntPtrConstant(4);
1850     if (TLI.isBigEndian()) std::swap(Zero, Four);
1851     SDOperand Offset = DAG.getNode(ISD::SELECT, Zero.getValueType(), SignSet,
1852                                    Zero, Four);
1853     FudgePtr = DAG.getNode(ISD::ADD, TLI.getPointerTy(), FudgePtr, Offset);
1854
1855     // Load the value out, extending it from f32 to the destination float type.
1856     // FIXME: Avoid the extend by constructing the right constant pool?
1857     SDOperand Fudge = DAG.getExtLoad(ISD::EXTLOAD, DstVT, DAG.getEntryNode(),
1858                                      FudgePtr, NULL, 0, MVT::f32);
1859     return DAG.getNode(ISD::FADD, DstVT, SignedConv, Fudge);
1860   }
1861
1862   // Otherwise, use a libcall.
1863   RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1864   if (SrcVT == MVT::i32) {
1865     if (DstVT == MVT::f32)
1866       LC = RTLIB::UINTTOFP_I32_F32;
1867     else if (DstVT == MVT::f64)
1868       LC = RTLIB::UINTTOFP_I32_F64;
1869     else if (DstVT == MVT::f80)
1870       LC = RTLIB::UINTTOFP_I32_F80;
1871     else if (DstVT == MVT::ppcf128)
1872       LC = RTLIB::UINTTOFP_I32_PPCF128;
1873   } else if (SrcVT == MVT::i64) {
1874     if (DstVT == MVT::f32)
1875       LC = RTLIB::UINTTOFP_I64_F32;
1876     else if (DstVT == MVT::f64)
1877       LC = RTLIB::UINTTOFP_I64_F64;
1878     else if (DstVT == MVT::f80)
1879       LC = RTLIB::UINTTOFP_I64_F80;
1880     else if (DstVT == MVT::ppcf128)
1881       LC = RTLIB::UINTTOFP_I64_PPCF128;
1882   } else if (SrcVT == MVT::i128) {
1883     if (DstVT == MVT::f32)
1884       LC = RTLIB::UINTTOFP_I128_F32;
1885     else if (DstVT == MVT::f64)
1886       LC = RTLIB::UINTTOFP_I128_F64;
1887     else if (DstVT == MVT::f80)
1888       LC = RTLIB::UINTTOFP_I128_F80;
1889     else if (DstVT == MVT::ppcf128)
1890       LC = RTLIB::UINTTOFP_I128_PPCF128;
1891   }
1892   assert(LC != RTLIB::UNKNOWN_LIBCALL &&
1893          "Don't know how to expand this UINT_TO_FP!");
1894
1895   return MakeLibCall(LC, DstVT, &Op, 1, true);
1896 }
1897
1898 SDOperand DAGTypeLegalizer::ExpandIntOp_BR_CC(SDNode *N) {
1899   SDOperand NewLHS = N->getOperand(2), NewRHS = N->getOperand(3);
1900   ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(1))->get();
1901   IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode);
1902
1903   // If ExpandSetCCOperands returned a scalar, we need to compare the result
1904   // against zero to select between true and false values.
1905   if (NewRHS.Val == 0) {
1906     NewRHS = DAG.getConstant(0, NewLHS.getValueType());
1907     CCCode = ISD::SETNE;
1908   }
1909
1910   // Update N to have the operands specified.
1911   return DAG.UpdateNodeOperands(SDOperand(N, 0), N->getOperand(0),
1912                                 DAG.getCondCode(CCCode), NewLHS, NewRHS,
1913                                 N->getOperand(4));
1914 }
1915
1916 SDOperand DAGTypeLegalizer::ExpandIntOp_SELECT_CC(SDNode *N) {
1917   SDOperand NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
1918   ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get();
1919   IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode);
1920
1921   // If ExpandSetCCOperands returned a scalar, we need to compare the result
1922   // against zero to select between true and false values.
1923   if (NewRHS.Val == 0) {
1924     NewRHS = DAG.getConstant(0, NewLHS.getValueType());
1925     CCCode = ISD::SETNE;
1926   }
1927
1928   // Update N to have the operands specified.
1929   return DAG.UpdateNodeOperands(SDOperand(N, 0), NewLHS, NewRHS,
1930                                 N->getOperand(2), N->getOperand(3),
1931                                 DAG.getCondCode(CCCode));
1932 }
1933
1934 SDOperand DAGTypeLegalizer::ExpandIntOp_SETCC(SDNode *N) {
1935   SDOperand NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
1936   ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(2))->get();
1937   IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode);
1938
1939   // If ExpandSetCCOperands returned a scalar, use it.
1940   if (NewRHS.Val == 0) {
1941     assert(NewLHS.getValueType() == N->getValueType(0) &&
1942            "Unexpected setcc expansion!");
1943     return NewLHS;
1944   }
1945
1946   // Otherwise, update N to have the operands specified.
1947   return DAG.UpdateNodeOperands(SDOperand(N, 0), NewLHS, NewRHS,
1948                                 DAG.getCondCode(CCCode));
1949 }
1950
1951 /// IntegerExpandSetCCOperands - Expand the operands of a comparison.  This code
1952 /// is shared among BR_CC, SELECT_CC, and SETCC handlers.
1953 void DAGTypeLegalizer::IntegerExpandSetCCOperands(SDOperand &NewLHS,
1954                                                   SDOperand &NewRHS,
1955                                                   ISD::CondCode &CCCode) {
1956   SDOperand LHSLo, LHSHi, RHSLo, RHSHi;
1957   GetExpandedInteger(NewLHS, LHSLo, LHSHi);
1958   GetExpandedInteger(NewRHS, RHSLo, RHSHi);
1959
1960   MVT VT = NewLHS.getValueType();
1961
1962   if (CCCode == ISD::SETEQ || CCCode == ISD::SETNE) {
1963     if (RHSLo == RHSHi) {
1964       if (ConstantSDNode *RHSCST = dyn_cast<ConstantSDNode>(RHSLo)) {
1965         if (RHSCST->isAllOnesValue()) {
1966           // Equality comparison to -1.
1967           NewLHS = DAG.getNode(ISD::AND, LHSLo.getValueType(), LHSLo, LHSHi);
1968           NewRHS = RHSLo;
1969           return;
1970         }
1971       }
1972     }
1973
1974     NewLHS = DAG.getNode(ISD::XOR, LHSLo.getValueType(), LHSLo, RHSLo);
1975     NewRHS = DAG.getNode(ISD::XOR, LHSLo.getValueType(), LHSHi, RHSHi);
1976     NewLHS = DAG.getNode(ISD::OR, NewLHS.getValueType(), NewLHS, NewRHS);
1977     NewRHS = DAG.getConstant(0, NewLHS.getValueType());
1978     return;
1979   }
1980
1981   // If this is a comparison of the sign bit, just look at the top part.
1982   // X > -1,  x < 0
1983   if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(NewRHS))
1984     if ((CCCode == ISD::SETLT && CST->isNullValue()) ||     // X < 0
1985         (CCCode == ISD::SETGT && CST->isAllOnesValue())) {  // X > -1
1986       NewLHS = LHSHi;
1987       NewRHS = RHSHi;
1988       return;
1989     }
1990
1991   // FIXME: This generated code sucks.
1992   ISD::CondCode LowCC;
1993   switch (CCCode) {
1994   default: assert(0 && "Unknown integer setcc!");
1995   case ISD::SETLT:
1996   case ISD::SETULT: LowCC = ISD::SETULT; break;
1997   case ISD::SETGT:
1998   case ISD::SETUGT: LowCC = ISD::SETUGT; break;
1999   case ISD::SETLE:
2000   case ISD::SETULE: LowCC = ISD::SETULE; break;
2001   case ISD::SETGE:
2002   case ISD::SETUGE: LowCC = ISD::SETUGE; break;
2003   }
2004
2005   // Tmp1 = lo(op1) < lo(op2)   // Always unsigned comparison
2006   // Tmp2 = hi(op1) < hi(op2)   // Signedness depends on operands
2007   // dest = hi(op1) == hi(op2) ? Tmp1 : Tmp2;
2008
2009   // NOTE: on targets without efficient SELECT of bools, we can always use
2010   // this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3)
2011   TargetLowering::DAGCombinerInfo DagCombineInfo(DAG, false, true, NULL);
2012   SDOperand Tmp1, Tmp2;
2013   Tmp1 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSLo), LHSLo, RHSLo, LowCC,
2014                            false, DagCombineInfo);
2015   if (!Tmp1.Val)
2016     Tmp1 = DAG.getSetCC(TLI.getSetCCResultType(LHSLo), LHSLo, RHSLo, LowCC);
2017   Tmp2 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSHi), LHSHi, RHSHi,
2018                            CCCode, false, DagCombineInfo);
2019   if (!Tmp2.Val)
2020     Tmp2 = DAG.getNode(ISD::SETCC, TLI.getSetCCResultType(LHSHi), LHSHi, RHSHi,
2021                        DAG.getCondCode(CCCode));
2022
2023   ConstantSDNode *Tmp1C = dyn_cast<ConstantSDNode>(Tmp1.Val);
2024   ConstantSDNode *Tmp2C = dyn_cast<ConstantSDNode>(Tmp2.Val);
2025   if ((Tmp1C && Tmp1C->isNullValue()) ||
2026       (Tmp2C && Tmp2C->isNullValue() &&
2027        (CCCode == ISD::SETLE || CCCode == ISD::SETGE ||
2028         CCCode == ISD::SETUGE || CCCode == ISD::SETULE)) ||
2029       (Tmp2C && Tmp2C->getAPIntValue() == 1 &&
2030        (CCCode == ISD::SETLT || CCCode == ISD::SETGT ||
2031         CCCode == ISD::SETUGT || CCCode == ISD::SETULT))) {
2032     // low part is known false, returns high part.
2033     // For LE / GE, if high part is known false, ignore the low part.
2034     // For LT / GT, if high part is known true, ignore the low part.
2035     NewLHS = Tmp2;
2036     NewRHS = SDOperand();
2037     return;
2038   }
2039
2040   NewLHS = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSHi), LHSHi, RHSHi,
2041                              ISD::SETEQ, false, DagCombineInfo);
2042   if (!NewLHS.Val)
2043     NewLHS = DAG.getSetCC(TLI.getSetCCResultType(LHSHi), LHSHi, RHSHi,
2044                           ISD::SETEQ);
2045   NewLHS = DAG.getNode(ISD::SELECT, Tmp1.getValueType(),
2046                        NewLHS, Tmp1, Tmp2);
2047   NewRHS = SDOperand();
2048 }
2049
2050 SDOperand DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
2051   if (ISD::isNormalStore(N))
2052     return ExpandOp_NormalStore(N, OpNo);
2053
2054   assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
2055   assert(OpNo == 1 && "Can only expand the stored value so far");
2056
2057   MVT VT = N->getOperand(1).getValueType();
2058   MVT NVT = TLI.getTypeToTransformTo(VT);
2059   SDOperand Ch  = N->getChain();
2060   SDOperand Ptr = N->getBasePtr();
2061   int SVOffset = N->getSrcValueOffset();
2062   unsigned Alignment = N->getAlignment();
2063   bool isVolatile = N->isVolatile();
2064   SDOperand Lo, Hi;
2065
2066   assert(NVT.isByteSized() && "Expanded type not byte sized!");
2067
2068   if (N->getMemoryVT().bitsLE(NVT)) {
2069     GetExpandedInteger(N->getValue(), Lo, Hi);
2070     return DAG.getTruncStore(Ch, Lo, Ptr, N->getSrcValue(), SVOffset,
2071                              N->getMemoryVT(), isVolatile, Alignment);
2072   } else if (TLI.isLittleEndian()) {
2073     // Little-endian - low bits are at low addresses.
2074     GetExpandedInteger(N->getValue(), Lo, Hi);
2075
2076     Lo = DAG.getStore(Ch, Lo, Ptr, N->getSrcValue(), SVOffset,
2077                       isVolatile, Alignment);
2078
2079     unsigned ExcessBits =
2080       N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
2081     MVT NEVT = MVT::getIntegerVT(ExcessBits);
2082
2083     // Increment the pointer to the other half.
2084     unsigned IncrementSize = NVT.getSizeInBits()/8;
2085     Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
2086                       DAG.getIntPtrConstant(IncrementSize));
2087     Hi = DAG.getTruncStore(Ch, Hi, Ptr, N->getSrcValue(),
2088                            SVOffset+IncrementSize, NEVT,
2089                            isVolatile, MinAlign(Alignment, IncrementSize));
2090     return DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi);
2091   } else {
2092     // Big-endian - high bits are at low addresses.  Favor aligned stores at
2093     // the cost of some bit-fiddling.
2094     GetExpandedInteger(N->getValue(), Lo, Hi);
2095
2096     MVT EVT = N->getMemoryVT();
2097     unsigned EBytes = EVT.getStoreSizeInBits()/8;
2098     unsigned IncrementSize = NVT.getSizeInBits()/8;
2099     unsigned ExcessBits = (EBytes - IncrementSize)*8;
2100     MVT HiVT = MVT::getIntegerVT(EVT.getSizeInBits() - ExcessBits);
2101
2102     if (ExcessBits < NVT.getSizeInBits()) {
2103       // Transfer high bits from the top of Lo to the bottom of Hi.
2104       Hi = DAG.getNode(ISD::SHL, NVT, Hi,
2105                        DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
2106                                        TLI.getShiftAmountTy()));
2107       Hi = DAG.getNode(ISD::OR, NVT, Hi,
2108                        DAG.getNode(ISD::SRL, NVT, Lo,
2109                                    DAG.getConstant(ExcessBits,
2110                                                    TLI.getShiftAmountTy())));
2111     }
2112
2113     // Store both the high bits and maybe some of the low bits.
2114     Hi = DAG.getTruncStore(Ch, Hi, Ptr, N->getSrcValue(),
2115                            SVOffset, HiVT, isVolatile, Alignment);
2116
2117     // Increment the pointer to the other half.
2118     Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
2119                       DAG.getIntPtrConstant(IncrementSize));
2120     // Store the lowest ExcessBits bits in the second half.
2121     Lo = DAG.getTruncStore(Ch, Lo, Ptr, N->getSrcValue(),
2122                            SVOffset+IncrementSize,
2123                            MVT::getIntegerVT(ExcessBits),
2124                            isVolatile, MinAlign(Alignment, IncrementSize));
2125     return DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi);
2126   }
2127 }