1 //===-- SPUISelDAGToDAG.cpp - CellSPU pattern matching inst selector ------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines a pattern matching instruction selector for the Cell SPU,
11 // converting from a legalized dag to a SPU-target dag.
13 //===----------------------------------------------------------------------===//
16 #include "SPUTargetMachine.h"
17 #include "SPUISelLowering.h"
18 #include "SPUHazardRecognizers.h"
19 #include "SPUFrameInfo.h"
20 #include "SPURegisterNames.h"
21 #include "SPUTargetMachine.h"
22 #include "llvm/CodeGen/MachineConstantPool.h"
23 #include "llvm/CodeGen/MachineInstrBuilder.h"
24 #include "llvm/CodeGen/MachineFunction.h"
25 #include "llvm/CodeGen/SelectionDAG.h"
26 #include "llvm/CodeGen/SelectionDAGISel.h"
27 #include "llvm/CodeGen/PseudoSourceValue.h"
28 #include "llvm/Target/TargetOptions.h"
29 #include "llvm/ADT/Statistic.h"
30 #include "llvm/Constants.h"
31 #include "llvm/GlobalValue.h"
32 #include "llvm/Intrinsics.h"
33 #include "llvm/Support/Debug.h"
34 #include "llvm/Support/MathExtras.h"
35 #include "llvm/Support/Compiler.h"
40 //! ConstantSDNode predicate for i32 sign-extended, 10-bit immediates
42 isI64IntS10Immediate(ConstantSDNode
*CN
)
44 return isS10Constant(CN
->getSExtValue());
47 //! ConstantSDNode predicate for i32 sign-extended, 10-bit immediates
49 isI32IntS10Immediate(ConstantSDNode
*CN
)
51 return isS10Constant(CN
->getSExtValue());
54 //! ConstantSDNode predicate for i32 unsigned 10-bit immediate values
56 isI32IntU10Immediate(ConstantSDNode
*CN
)
58 return isU10Constant(CN
->getSExtValue());
61 //! ConstantSDNode predicate for i16 sign-extended, 10-bit immediate values
63 isI16IntS10Immediate(ConstantSDNode
*CN
)
65 return isS10Constant(CN
->getSExtValue());
68 //! SDNode predicate for i16 sign-extended, 10-bit immediate values
70 isI16IntS10Immediate(SDNode
*N
)
72 ConstantSDNode
*CN
= dyn_cast
<ConstantSDNode
>(N
);
73 return (CN
!= 0 && isI16IntS10Immediate(CN
));
76 //! ConstantSDNode predicate for i16 unsigned 10-bit immediate values
78 isI16IntU10Immediate(ConstantSDNode
*CN
)
80 return isU10Constant((short) CN
->getZExtValue());
83 //! SDNode predicate for i16 sign-extended, 10-bit immediate values
85 isI16IntU10Immediate(SDNode
*N
)
87 return (N
->getOpcode() == ISD::Constant
88 && isI16IntU10Immediate(cast
<ConstantSDNode
>(N
)));
91 //! ConstantSDNode predicate for signed 16-bit values
93 \arg CN The constant SelectionDAG node holding the value
94 \arg Imm The returned 16-bit value, if returning true
96 This predicate tests the value in \a CN to see whether it can be
97 represented as a 16-bit, sign-extended quantity. Returns true if
101 isIntS16Immediate(ConstantSDNode
*CN
, short &Imm
)
103 MVT vt
= CN
->getValueType(0);
104 Imm
= (short) CN
->getZExtValue();
105 if (vt
.getSimpleVT() >= MVT::i1
&& vt
.getSimpleVT() <= MVT::i16
) {
107 } else if (vt
== MVT::i32
) {
108 int32_t i_val
= (int32_t) CN
->getZExtValue();
109 short s_val
= (short) i_val
;
110 return i_val
== s_val
;
112 int64_t i_val
= (int64_t) CN
->getZExtValue();
113 short s_val
= (short) i_val
;
114 return i_val
== s_val
;
120 //! SDNode predicate for signed 16-bit values.
122 isIntS16Immediate(SDNode
*N
, short &Imm
)
124 return (N
->getOpcode() == ISD::Constant
125 && isIntS16Immediate(cast
<ConstantSDNode
>(N
), Imm
));
128 //! ConstantFPSDNode predicate for representing floats as 16-bit sign ext.
130 isFPS16Immediate(ConstantFPSDNode
*FPN
, short &Imm
)
132 MVT vt
= FPN
->getValueType(0);
133 if (vt
== MVT::f32
) {
134 int val
= FloatToBits(FPN
->getValueAPF().convertToFloat());
135 int sval
= (int) ((val
<< 16) >> 16);
144 isHighLow(const SDValue
&Op
)
146 return (Op
.getOpcode() == SPUISD::IndirectAddr
147 && ((Op
.getOperand(0).getOpcode() == SPUISD::Hi
148 && Op
.getOperand(1).getOpcode() == SPUISD::Lo
)
149 || (Op
.getOperand(0).getOpcode() == SPUISD::Lo
150 && Op
.getOperand(1).getOpcode() == SPUISD::Hi
)));
153 //===------------------------------------------------------------------===//
154 //! MVT to "useful stuff" mapping structure:
156 struct valtype_map_s
{
158 unsigned ldresult_ins
; /// LDRESULT instruction (0 = undefined)
159 bool ldresult_imm
; /// LDRESULT instruction requires immediate?
160 unsigned lrinst
; /// LR instruction
163 const valtype_map_s valtype_map
[] = {
164 { MVT::i8
, SPU::ORBIr8
, true, SPU::LRr8
},
165 { MVT::i16
, SPU::ORHIr16
, true, SPU::LRr16
},
166 { MVT::i32
, SPU::ORIr32
, true, SPU::LRr32
},
167 { MVT::i64
, SPU::ORr64
, false, SPU::LRr64
},
168 { MVT::f32
, SPU::ORf32
, false, SPU::LRf32
},
169 { MVT::f64
, SPU::ORf64
, false, SPU::LRf64
},
170 // vector types... (sigh!)
171 { MVT::v16i8
, 0, false, SPU::LRv16i8
},
172 { MVT::v8i16
, 0, false, SPU::LRv8i16
},
173 { MVT::v4i32
, 0, false, SPU::LRv4i32
},
174 { MVT::v2i64
, 0, false, SPU::LRv2i64
},
175 { MVT::v4f32
, 0, false, SPU::LRv4f32
},
176 { MVT::v2f64
, 0, false, SPU::LRv2f64
}
179 const size_t n_valtype_map
= sizeof(valtype_map
) / sizeof(valtype_map
[0]);
181 const valtype_map_s
*getValueTypeMapEntry(MVT VT
)
183 const valtype_map_s
*retval
= 0;
184 for (size_t i
= 0; i
< n_valtype_map
; ++i
) {
185 if (valtype_map
[i
].VT
== VT
) {
186 retval
= valtype_map
+ i
;
194 cerr
<< "SPUISelDAGToDAG.cpp: getValueTypeMapEntry returns NULL for "
204 //! Generate the carry-generate shuffle mask.
205 SDValue
getCarryGenerateShufMask(SelectionDAG
&DAG
, DebugLoc dl
) {
206 SmallVector
<SDValue
, 16 > ShufBytes
;
208 // Create the shuffle mask for "rotating" the borrow up one register slot
209 // once the borrow is generated.
210 ShufBytes
.push_back(DAG
.getConstant(0x04050607, MVT::i32
));
211 ShufBytes
.push_back(DAG
.getConstant(0x80808080, MVT::i32
));
212 ShufBytes
.push_back(DAG
.getConstant(0x0c0d0e0f, MVT::i32
));
213 ShufBytes
.push_back(DAG
.getConstant(0x80808080, MVT::i32
));
215 return DAG
.getNode(ISD::BUILD_VECTOR
, dl
, MVT::v4i32
,
216 &ShufBytes
[0], ShufBytes
.size());
219 //! Generate the borrow-generate shuffle mask
220 SDValue
getBorrowGenerateShufMask(SelectionDAG
&DAG
, DebugLoc dl
) {
221 SmallVector
<SDValue
, 16 > ShufBytes
;
223 // Create the shuffle mask for "rotating" the borrow up one register slot
224 // once the borrow is generated.
225 ShufBytes
.push_back(DAG
.getConstant(0x04050607, MVT::i32
));
226 ShufBytes
.push_back(DAG
.getConstant(0xc0c0c0c0, MVT::i32
));
227 ShufBytes
.push_back(DAG
.getConstant(0x0c0d0e0f, MVT::i32
));
228 ShufBytes
.push_back(DAG
.getConstant(0xc0c0c0c0, MVT::i32
));
230 return DAG
.getNode(ISD::BUILD_VECTOR
, dl
, MVT::v4i32
,
231 &ShufBytes
[0], ShufBytes
.size());
234 //===------------------------------------------------------------------===//
235 /// SPUDAGToDAGISel - Cell SPU-specific code to select SPU machine
236 /// instructions for SelectionDAG operations.
238 class SPUDAGToDAGISel
:
239 public SelectionDAGISel
241 SPUTargetMachine
&TM
;
242 SPUTargetLowering
&SPUtli
;
243 unsigned GlobalBaseReg
;
246 explicit SPUDAGToDAGISel(SPUTargetMachine
&tm
) :
247 SelectionDAGISel(tm
),
249 SPUtli(*tm
.getTargetLowering())
252 virtual bool runOnFunction(Function
&Fn
) {
253 // Make sure we re-emit a set of the global base reg if necessary
255 SelectionDAGISel::runOnFunction(Fn
);
259 /// getI32Imm - Return a target constant with the specified value, of type
261 inline SDValue
getI32Imm(uint32_t Imm
) {
262 return CurDAG
->getTargetConstant(Imm
, MVT::i32
);
265 /// getI64Imm - Return a target constant with the specified value, of type
267 inline SDValue
getI64Imm(uint64_t Imm
) {
268 return CurDAG
->getTargetConstant(Imm
, MVT::i64
);
271 /// getSmallIPtrImm - Return a target constant of pointer type.
272 inline SDValue
getSmallIPtrImm(unsigned Imm
) {
273 return CurDAG
->getTargetConstant(Imm
, SPUtli
.getPointerTy());
276 SDNode
*emitBuildVector(SDValue build_vec
) {
277 MVT vecVT
= build_vec
.getValueType();
278 MVT eltVT
= vecVT
.getVectorElementType();
279 SDNode
*bvNode
= build_vec
.getNode();
280 DebugLoc dl
= bvNode
->getDebugLoc();
282 // Check to see if this vector can be represented as a CellSPU immediate
283 // constant by invoking all of the instruction selection predicates:
284 if (((vecVT
== MVT::v8i16
) &&
285 (SPU::get_vec_i16imm(bvNode
, *CurDAG
, MVT::i16
).getNode() != 0)) ||
286 ((vecVT
== MVT::v4i32
) &&
287 ((SPU::get_vec_i16imm(bvNode
, *CurDAG
, MVT::i32
).getNode() != 0) ||
288 (SPU::get_ILHUvec_imm(bvNode
, *CurDAG
, MVT::i32
).getNode() != 0) ||
289 (SPU::get_vec_u18imm(bvNode
, *CurDAG
, MVT::i32
).getNode() != 0) ||
290 (SPU::get_v4i32_imm(bvNode
, *CurDAG
).getNode() != 0))) ||
291 ((vecVT
== MVT::v2i64
) &&
292 ((SPU::get_vec_i16imm(bvNode
, *CurDAG
, MVT::i64
).getNode() != 0) ||
293 (SPU::get_ILHUvec_imm(bvNode
, *CurDAG
, MVT::i64
).getNode() != 0) ||
294 (SPU::get_vec_u18imm(bvNode
, *CurDAG
, MVT::i64
).getNode() != 0))))
295 return Select(build_vec
);
297 // No, need to emit a constant pool spill:
298 std::vector
<Constant
*> CV
;
300 for (size_t i
= 0; i
< build_vec
.getNumOperands(); ++i
) {
301 ConstantSDNode
*V
= dyn_cast
<ConstantSDNode
> (build_vec
.getOperand(i
));
302 CV
.push_back(const_cast<ConstantInt
*> (V
->getConstantIntValue()));
305 Constant
*CP
= ConstantVector::get(CV
);
306 SDValue CPIdx
= CurDAG
->getConstantPool(CP
, SPUtli
.getPointerTy());
307 unsigned Alignment
= cast
<ConstantPoolSDNode
>(CPIdx
)->getAlignment();
308 SDValue CGPoolOffset
=
309 SPU::LowerConstantPool(CPIdx
, *CurDAG
,
310 SPUtli
.getSPUTargetMachine());
311 return SelectCode(CurDAG
->getLoad(build_vec
.getValueType(), dl
,
312 CurDAG
->getEntryNode(), CGPoolOffset
,
313 PseudoSourceValue::getConstantPool(), 0,
317 /// Select - Convert the specified operand from a target-independent to a
318 /// target-specific node if it hasn't already been changed.
319 SDNode
*Select(SDValue Op
);
321 //! Emit the instruction sequence for i64 shl
322 SDNode
*SelectSHLi64(SDValue
&Op
, MVT OpVT
);
324 //! Emit the instruction sequence for i64 srl
325 SDNode
*SelectSRLi64(SDValue
&Op
, MVT OpVT
);
327 //! Emit the instruction sequence for i64 sra
328 SDNode
*SelectSRAi64(SDValue
&Op
, MVT OpVT
);
330 //! Emit the necessary sequence for loading i64 constants:
331 SDNode
*SelectI64Constant(SDValue
&Op
, MVT OpVT
, DebugLoc dl
);
333 //! Alternate instruction emit sequence for loading i64 constants
334 SDNode
*SelectI64Constant(uint64_t i64const
, MVT OpVT
, DebugLoc dl
);
336 //! Returns true if the address N is an A-form (local store) address
337 bool SelectAFormAddr(SDValue Op
, SDValue N
, SDValue
&Base
,
340 //! D-form address predicate
341 bool SelectDFormAddr(SDValue Op
, SDValue N
, SDValue
&Base
,
344 /// Alternate D-form address using i7 offset predicate
345 bool SelectDForm2Addr(SDValue Op
, SDValue N
, SDValue
&Disp
,
348 /// D-form address selection workhorse
349 bool DFormAddressPredicate(SDValue Op
, SDValue N
, SDValue
&Disp
,
350 SDValue
&Base
, int minOffset
, int maxOffset
);
352 //! Address predicate if N can be expressed as an indexed [r+r] operation.
353 bool SelectXFormAddr(SDValue Op
, SDValue N
, SDValue
&Base
,
356 /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for
357 /// inline asm expressions.
358 virtual bool SelectInlineAsmMemoryOperand(const SDValue
&Op
,
360 std::vector
<SDValue
> &OutOps
) {
362 switch (ConstraintCode
) {
363 default: return true;
365 if (!SelectDFormAddr(Op
, Op
, Op0
, Op1
)
366 && !SelectAFormAddr(Op
, Op
, Op0
, Op1
))
367 SelectXFormAddr(Op
, Op
, Op0
, Op1
);
369 case 'o': // offsetable
370 if (!SelectDFormAddr(Op
, Op
, Op0
, Op1
)
371 && !SelectAFormAddr(Op
, Op
, Op0
, Op1
)) {
373 Op1
= getSmallIPtrImm(0);
376 case 'v': // not offsetable
378 assert(0 && "InlineAsmMemoryOperand 'v' constraint not handled.");
380 SelectAddrIdxOnly(Op
, Op
, Op0
, Op1
);
385 OutOps
.push_back(Op0
);
386 OutOps
.push_back(Op1
);
390 /// InstructionSelect - This callback is invoked by
391 /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
392 virtual void InstructionSelect();
394 virtual const char *getPassName() const {
395 return "Cell SPU DAG->DAG Pattern Instruction Selection";
398 /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
399 /// this target when scheduling the DAG.
400 virtual ScheduleHazardRecognizer
*CreateTargetHazardRecognizer() {
401 const TargetInstrInfo
*II
= TM
.getInstrInfo();
402 assert(II
&& "No InstrInfo?");
403 return new SPUHazardRecognizer(*II
);
406 // Include the pieces autogenerated from the target description.
407 #include "SPUGenDAGISel.inc"
411 /// InstructionSelect - This callback is invoked by
412 /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
414 SPUDAGToDAGISel::InstructionSelect()
418 // Select target instructions for the DAG.
420 CurDAG
->RemoveDeadNodes();
424 \arg Op The ISD instruction operand
425 \arg N The address to be tested
426 \arg Base The base address
427 \arg Index The base address index
430 SPUDAGToDAGISel::SelectAFormAddr(SDValue Op
, SDValue N
, SDValue
&Base
,
432 // These match the addr256k operand type:
433 MVT OffsVT
= MVT::i16
;
434 SDValue Zero
= CurDAG
->getTargetConstant(0, OffsVT
);
436 switch (N
.getOpcode()) {
438 case ISD::ConstantPool
:
439 case ISD::GlobalAddress
:
440 cerr
<< "SPU SelectAFormAddr: Constant/Pool/Global not lowered.\n";
444 case ISD::TargetConstant
:
445 case ISD::TargetGlobalAddress
:
446 case ISD::TargetJumpTable
:
447 cerr
<< "SPUSelectAFormAddr: Target Constant/Pool/Global not wrapped as "
448 << "A-form address.\n";
452 case SPUISD::AFormAddr
:
453 // Just load from memory if there's only a single use of the location,
454 // otherwise, this will get handled below with D-form offset addresses
456 SDValue Op0
= N
.getOperand(0);
457 switch (Op0
.getOpcode()) {
458 case ISD::TargetConstantPool
:
459 case ISD::TargetJumpTable
:
464 case ISD::TargetGlobalAddress
: {
465 GlobalAddressSDNode
*GSDN
= cast
<GlobalAddressSDNode
>(Op0
);
466 GlobalValue
*GV
= GSDN
->getGlobal();
467 if (GV
->getAlignment() == 16) {
482 SPUDAGToDAGISel::SelectDForm2Addr(SDValue Op
, SDValue N
, SDValue
&Disp
,
484 const int minDForm2Offset
= -(1 << 7);
485 const int maxDForm2Offset
= (1 << 7) - 1;
486 return DFormAddressPredicate(Op
, N
, Disp
, Base
, minDForm2Offset
,
491 \arg Op The ISD instruction (ignored)
492 \arg N The address to be tested
493 \arg Base Base address register/pointer
494 \arg Index Base address index
496 Examine the input address by a base register plus a signed 10-bit
497 displacement, [r+I10] (D-form address).
499 \return true if \a N is a D-form address with \a Base and \a Index set
500 to non-empty SDValue instances.
503 SPUDAGToDAGISel::SelectDFormAddr(SDValue Op
, SDValue N
, SDValue
&Base
,
505 return DFormAddressPredicate(Op
, N
, Base
, Index
,
506 SPUFrameInfo::minFrameOffset(),
507 SPUFrameInfo::maxFrameOffset());
511 SPUDAGToDAGISel::DFormAddressPredicate(SDValue Op
, SDValue N
, SDValue
&Base
,
512 SDValue
&Index
, int minOffset
,
514 unsigned Opc
= N
.getOpcode();
515 MVT PtrTy
= SPUtli
.getPointerTy();
517 if (Opc
== ISD::FrameIndex
) {
518 // Stack frame index must be less than 512 (divided by 16):
519 FrameIndexSDNode
*FIN
= dyn_cast
<FrameIndexSDNode
>(N
);
520 int FI
= int(FIN
->getIndex());
521 DEBUG(cerr
<< "SelectDFormAddr: ISD::FrameIndex = "
523 if (SPUFrameInfo::FItoStackOffset(FI
) < maxOffset
) {
524 Base
= CurDAG
->getTargetConstant(0, PtrTy
);
525 Index
= CurDAG
->getTargetFrameIndex(FI
, PtrTy
);
528 } else if (Opc
== ISD::ADD
) {
529 // Generated by getelementptr
530 const SDValue Op0
= N
.getOperand(0);
531 const SDValue Op1
= N
.getOperand(1);
533 if ((Op0
.getOpcode() == SPUISD::Hi
&& Op1
.getOpcode() == SPUISD::Lo
)
534 || (Op1
.getOpcode() == SPUISD::Hi
&& Op0
.getOpcode() == SPUISD::Lo
)) {
535 Base
= CurDAG
->getTargetConstant(0, PtrTy
);
538 } else if (Op1
.getOpcode() == ISD::Constant
539 || Op1
.getOpcode() == ISD::TargetConstant
) {
540 ConstantSDNode
*CN
= dyn_cast
<ConstantSDNode
>(Op1
);
541 int32_t offset
= int32_t(CN
->getSExtValue());
543 if (Op0
.getOpcode() == ISD::FrameIndex
) {
544 FrameIndexSDNode
*FIN
= dyn_cast
<FrameIndexSDNode
>(Op0
);
545 int FI
= int(FIN
->getIndex());
546 DEBUG(cerr
<< "SelectDFormAddr: ISD::ADD offset = " << offset
547 << " frame index = " << FI
<< "\n");
549 if (SPUFrameInfo::FItoStackOffset(FI
) < maxOffset
) {
550 Base
= CurDAG
->getTargetConstant(offset
, PtrTy
);
551 Index
= CurDAG
->getTargetFrameIndex(FI
, PtrTy
);
554 } else if (offset
> minOffset
&& offset
< maxOffset
) {
555 Base
= CurDAG
->getTargetConstant(offset
, PtrTy
);
559 } else if (Op0
.getOpcode() == ISD::Constant
560 || Op0
.getOpcode() == ISD::TargetConstant
) {
561 ConstantSDNode
*CN
= dyn_cast
<ConstantSDNode
>(Op0
);
562 int32_t offset
= int32_t(CN
->getSExtValue());
564 if (Op1
.getOpcode() == ISD::FrameIndex
) {
565 FrameIndexSDNode
*FIN
= dyn_cast
<FrameIndexSDNode
>(Op1
);
566 int FI
= int(FIN
->getIndex());
567 DEBUG(cerr
<< "SelectDFormAddr: ISD::ADD offset = " << offset
568 << " frame index = " << FI
<< "\n");
570 if (SPUFrameInfo::FItoStackOffset(FI
) < maxOffset
) {
571 Base
= CurDAG
->getTargetConstant(offset
, PtrTy
);
572 Index
= CurDAG
->getTargetFrameIndex(FI
, PtrTy
);
575 } else if (offset
> minOffset
&& offset
< maxOffset
) {
576 Base
= CurDAG
->getTargetConstant(offset
, PtrTy
);
581 } else if (Opc
== SPUISD::IndirectAddr
) {
582 // Indirect with constant offset -> D-Form address
583 const SDValue Op0
= N
.getOperand(0);
584 const SDValue Op1
= N
.getOperand(1);
586 if (Op0
.getOpcode() == SPUISD::Hi
587 && Op1
.getOpcode() == SPUISD::Lo
) {
588 // (SPUindirect (SPUhi <arg>, 0), (SPUlo <arg>, 0))
589 Base
= CurDAG
->getTargetConstant(0, PtrTy
);
592 } else if (isa
<ConstantSDNode
>(Op0
) || isa
<ConstantSDNode
>(Op1
)) {
596 if (isa
<ConstantSDNode
>(Op1
)) {
597 ConstantSDNode
*CN
= cast
<ConstantSDNode
>(Op1
);
598 offset
= int32_t(CN
->getSExtValue());
600 } else if (isa
<ConstantSDNode
>(Op0
)) {
601 ConstantSDNode
*CN
= cast
<ConstantSDNode
>(Op0
);
602 offset
= int32_t(CN
->getSExtValue());
606 if (offset
>= minOffset
&& offset
<= maxOffset
) {
607 Base
= CurDAG
->getTargetConstant(offset
, PtrTy
);
612 } else if (Opc
== SPUISD::AFormAddr
) {
613 Base
= CurDAG
->getTargetConstant(0, N
.getValueType());
616 } else if (Opc
== SPUISD::LDRESULT
) {
617 Base
= CurDAG
->getTargetConstant(0, N
.getValueType());
620 } else if (Opc
== ISD::Register
|| Opc
== ISD::CopyFromReg
) {
621 unsigned OpOpc
= Op
.getOpcode();
623 if (OpOpc
== ISD::STORE
|| OpOpc
== ISD::LOAD
) {
624 // Direct load/store without getelementptr
627 // Get the register from CopyFromReg
628 if (Opc
== ISD::CopyFromReg
)
629 Addr
= N
.getOperand(1);
631 Addr
= N
; // Register
633 Offs
= ((OpOpc
== ISD::STORE
) ? Op
.getOperand(3) : Op
.getOperand(2));
635 if (Offs
.getOpcode() == ISD::Constant
|| Offs
.getOpcode() == ISD::UNDEF
) {
636 if (Offs
.getOpcode() == ISD::UNDEF
)
637 Offs
= CurDAG
->getTargetConstant(0, Offs
.getValueType());
644 /* If otherwise unadorned, default to D-form address with 0 offset: */
645 if (Opc
== ISD::CopyFromReg
) {
646 Index
= N
.getOperand(1);
651 Base
= CurDAG
->getTargetConstant(0, Index
.getValueType());
660 \arg Op The ISD instruction operand
661 \arg N The address operand
662 \arg Base The base pointer operand
663 \arg Index The offset/index operand
665 If the address \a N can be expressed as an A-form or D-form address, returns
666 false. Otherwise, creates two operands, Base and Index that will become the
667 (r)(r) X-form address.
670 SPUDAGToDAGISel::SelectXFormAddr(SDValue Op
, SDValue N
, SDValue
&Base
,
672 if (!SelectAFormAddr(Op
, N
, Base
, Index
)
673 && !SelectDFormAddr(Op
, N
, Base
, Index
)) {
674 // If the address is neither A-form or D-form, punt and use an X-form
676 Base
= N
.getOperand(1);
677 Index
= N
.getOperand(0);
684 //! Convert the operand from a target-independent to a target-specific node
688 SPUDAGToDAGISel::Select(SDValue Op
) {
689 SDNode
*N
= Op
.getNode();
690 unsigned Opc
= N
->getOpcode();
693 MVT OpVT
= Op
.getValueType();
695 DebugLoc dl
= N
->getDebugLoc();
697 if (N
->isMachineOpcode()) {
698 return NULL
; // Already selected.
701 if (Opc
== ISD::FrameIndex
) {
702 int FI
= cast
<FrameIndexSDNode
>(N
)->getIndex();
703 SDValue TFI
= CurDAG
->getTargetFrameIndex(FI
, Op
.getValueType());
704 SDValue Imm0
= CurDAG
->getTargetConstant(0, Op
.getValueType());
713 Ops
[0] = CurDAG
->getRegister(SPU::R1
, Op
.getValueType());
714 Ops
[1] = SDValue(CurDAG
->getTargetNode(SPU::ILAr32
, dl
, Op
.getValueType(),
718 } else if (Opc
== ISD::Constant
&& OpVT
== MVT::i64
) {
719 // Catch the i64 constants that end up here. Note: The backend doesn't
720 // attempt to legalize the constant (it's useless because DAGCombiner
721 // will insert 64-bit constants and we can't stop it).
722 return SelectI64Constant(Op
, OpVT
, Op
.getDebugLoc());
723 } else if ((Opc
== ISD::ZERO_EXTEND
|| Opc
== ISD::ANY_EXTEND
)
724 && OpVT
== MVT::i64
) {
725 SDValue Op0
= Op
.getOperand(0);
726 MVT Op0VT
= Op0
.getValueType();
727 MVT Op0VecVT
= MVT::getVectorVT(Op0VT
, (128 / Op0VT
.getSizeInBits()));
728 MVT OpVecVT
= MVT::getVectorVT(OpVT
, (128 / OpVT
.getSizeInBits()));
731 switch (Op0VT
.getSimpleVT()) {
733 cerr
<< "CellSPU Select: Unhandled zero/any extend MVT\n";
738 shufMask
= CurDAG
->getNode(ISD::BUILD_VECTOR
, dl
, MVT::v4i32
,
739 CurDAG
->getConstant(0x80808080, MVT::i32
),
740 CurDAG
->getConstant(0x00010203, MVT::i32
),
741 CurDAG
->getConstant(0x80808080, MVT::i32
),
742 CurDAG
->getConstant(0x08090a0b, MVT::i32
));
746 shufMask
= CurDAG
->getNode(ISD::BUILD_VECTOR
, dl
, MVT::v4i32
,
747 CurDAG
->getConstant(0x80808080, MVT::i32
),
748 CurDAG
->getConstant(0x80800203, MVT::i32
),
749 CurDAG
->getConstant(0x80808080, MVT::i32
),
750 CurDAG
->getConstant(0x80800a0b, MVT::i32
));
754 shufMask
= CurDAG
->getNode(ISD::BUILD_VECTOR
, dl
, MVT::v4i32
,
755 CurDAG
->getConstant(0x80808080, MVT::i32
),
756 CurDAG
->getConstant(0x80808003, MVT::i32
),
757 CurDAG
->getConstant(0x80808080, MVT::i32
),
758 CurDAG
->getConstant(0x8080800b, MVT::i32
));
762 SDNode
*shufMaskLoad
= emitBuildVector(shufMask
);
763 SDNode
*PromoteScalar
=
764 SelectCode(CurDAG
->getNode(SPUISD::PREFSLOT2VEC
, dl
, Op0VecVT
, Op0
));
766 SDValue zextShuffle
=
767 CurDAG
->getNode(SPUISD::SHUFB
, dl
, OpVecVT
,
768 SDValue(PromoteScalar
, 0),
769 SDValue(PromoteScalar
, 0),
770 SDValue(shufMaskLoad
, 0));
772 // N.B.: BIT_CONVERT replaces and updates the zextShuffle node, so we
773 // re-use it in the VEC2PREFSLOT selection without needing to explicitly
774 // call SelectCode (it's already done for us.)
775 SelectCode(CurDAG
->getNode(ISD::BIT_CONVERT
, dl
, OpVecVT
, zextShuffle
));
776 return SelectCode(CurDAG
->getNode(SPUISD::VEC2PREFSLOT
, dl
, OpVT
,
778 } else if (Opc
== ISD::ADD
&& (OpVT
== MVT::i64
|| OpVT
== MVT::v2i64
)) {
780 emitBuildVector(getCarryGenerateShufMask(*CurDAG
, dl
));
782 return SelectCode(CurDAG
->getNode(SPUISD::ADD64_MARKER
, dl
, OpVT
,
783 Op
.getOperand(0), Op
.getOperand(1),
784 SDValue(CGLoad
, 0)));
785 } else if (Opc
== ISD::SUB
&& (OpVT
== MVT::i64
|| OpVT
== MVT::v2i64
)) {
787 emitBuildVector(getBorrowGenerateShufMask(*CurDAG
, dl
));
789 return SelectCode(CurDAG
->getNode(SPUISD::SUB64_MARKER
, dl
, OpVT
,
790 Op
.getOperand(0), Op
.getOperand(1),
791 SDValue(CGLoad
, 0)));
792 } else if (Opc
== ISD::MUL
&& (OpVT
== MVT::i64
|| OpVT
== MVT::v2i64
)) {
794 emitBuildVector(getCarryGenerateShufMask(*CurDAG
, dl
));
796 return SelectCode(CurDAG
->getNode(SPUISD::MUL64_MARKER
, dl
, OpVT
,
797 Op
.getOperand(0), Op
.getOperand(1),
798 SDValue(CGLoad
, 0)));
799 } else if (Opc
== ISD::TRUNCATE
) {
800 SDValue Op0
= Op
.getOperand(0);
801 if ((Op0
.getOpcode() == ISD::SRA
|| Op0
.getOpcode() == ISD::SRL
)
803 && Op0
.getValueType() == MVT::i64
) {
804 // Catch (truncate:i32 ([sra|srl]:i64 arg, c), where c >= 32
806 // Take advantage of the fact that the upper 32 bits are in the
807 // i32 preferred slot and avoid shuffle gymnastics:
808 ConstantSDNode
*CN
= dyn_cast
<ConstantSDNode
>(Op0
.getOperand(1));
810 unsigned shift_amt
= unsigned(CN
->getZExtValue());
812 if (shift_amt
>= 32) {
814 CurDAG
->getTargetNode(SPU::ORr32_r64
, dl
, OpVT
,
819 // Take care of the additional shift, if present:
820 SDValue shift
= CurDAG
->getTargetConstant(shift_amt
, MVT::i32
);
821 unsigned Opc
= SPU::ROTMAIr32_i32
;
823 if (Op0
.getOpcode() == ISD::SRL
)
826 hi32
= CurDAG
->getTargetNode(Opc
, dl
, OpVT
, SDValue(hi32
, 0),
834 } else if (Opc
== ISD::SHL
) {
835 if (OpVT
== MVT::i64
) {
836 return SelectSHLi64(Op
, OpVT
);
838 } else if (Opc
== ISD::SRL
) {
839 if (OpVT
== MVT::i64
) {
840 return SelectSRLi64(Op
, OpVT
);
842 } else if (Opc
== ISD::SRA
) {
843 if (OpVT
== MVT::i64
) {
844 return SelectSRAi64(Op
, OpVT
);
846 } else if (Opc
== ISD::FNEG
847 && (OpVT
== MVT::f64
|| OpVT
== MVT::v2f64
)) {
848 DebugLoc dl
= Op
.getDebugLoc();
849 // Check if the pattern is a special form of DFNMS:
850 // (fneg (fsub (fmul R64FP:$rA, R64FP:$rB), R64FP:$rC))
851 SDValue Op0
= Op
.getOperand(0);
852 if (Op0
.getOpcode() == ISD::FSUB
) {
853 SDValue Op00
= Op0
.getOperand(0);
854 if (Op00
.getOpcode() == ISD::FMUL
) {
855 unsigned Opc
= SPU::DFNMSf64
;
856 if (OpVT
== MVT::v2f64
)
857 Opc
= SPU::DFNMSv2f64
;
859 return CurDAG
->getTargetNode(Opc
, dl
, OpVT
,
866 SDValue negConst
= CurDAG
->getConstant(0x8000000000000000ULL
, MVT::i64
);
867 SDNode
*signMask
= 0;
868 unsigned Opc
= SPU::XORfneg64
;
870 if (OpVT
== MVT::f64
) {
871 signMask
= SelectI64Constant(negConst
, MVT::i64
, dl
);
872 } else if (OpVT
== MVT::v2f64
) {
873 Opc
= SPU::XORfnegvec
;
874 signMask
= emitBuildVector(CurDAG
->getNode(ISD::BUILD_VECTOR
, dl
,
876 negConst
, negConst
));
879 return CurDAG
->getTargetNode(Opc
, dl
, OpVT
,
880 Op
.getOperand(0), SDValue(signMask
, 0));
881 } else if (Opc
== ISD::FABS
) {
882 if (OpVT
== MVT::f64
) {
883 SDNode
*signMask
= SelectI64Constant(0x7fffffffffffffffULL
, MVT::i64
, dl
);
884 return CurDAG
->getTargetNode(SPU::ANDfabs64
, dl
, OpVT
,
885 Op
.getOperand(0), SDValue(signMask
, 0));
886 } else if (OpVT
== MVT::v2f64
) {
887 SDValue absConst
= CurDAG
->getConstant(0x7fffffffffffffffULL
, MVT::i64
);
888 SDValue absVec
= CurDAG
->getNode(ISD::BUILD_VECTOR
, dl
, MVT::v2i64
,
890 SDNode
*signMask
= emitBuildVector(absVec
);
891 return CurDAG
->getTargetNode(SPU::ANDfabsvec
, dl
, OpVT
,
892 Op
.getOperand(0), SDValue(signMask
, 0));
894 } else if (Opc
== SPUISD::LDRESULT
) {
895 // Custom select instructions for LDRESULT
896 MVT VT
= N
->getValueType(0);
897 SDValue Arg
= N
->getOperand(0);
898 SDValue Chain
= N
->getOperand(1);
900 const valtype_map_s
*vtm
= getValueTypeMapEntry(VT
);
902 if (vtm
->ldresult_ins
== 0) {
903 cerr
<< "LDRESULT for unsupported type: "
909 Opc
= vtm
->ldresult_ins
;
910 if (vtm
->ldresult_imm
) {
911 SDValue Zero
= CurDAG
->getTargetConstant(0, VT
);
913 Result
= CurDAG
->getTargetNode(Opc
, dl
, VT
, MVT::Other
, Arg
, Zero
, Chain
);
915 Result
= CurDAG
->getTargetNode(Opc
, dl
, VT
, MVT::Other
, Arg
, Arg
, Chain
);
919 } else if (Opc
== SPUISD::IndirectAddr
) {
920 // Look at the operands: SelectCode() will catch the cases that aren't
921 // specifically handled here.
923 // SPUInstrInfo catches the following patterns:
924 // (SPUindirect (SPUhi ...), (SPUlo ...))
925 // (SPUindirect $sp, imm)
926 MVT VT
= Op
.getValueType();
927 SDValue Op0
= N
->getOperand(0);
928 SDValue Op1
= N
->getOperand(1);
931 if ((Op0
.getOpcode() != SPUISD::Hi
&& Op1
.getOpcode() != SPUISD::Lo
)
932 || (Op0
.getOpcode() == ISD::Register
933 && ((RN
= dyn_cast
<RegisterSDNode
>(Op0
.getNode())) != 0
934 && RN
->getReg() != SPU::R1
))) {
936 if (Op1
.getOpcode() == ISD::Constant
) {
937 ConstantSDNode
*CN
= cast
<ConstantSDNode
>(Op1
);
938 Op1
= CurDAG
->getTargetConstant(CN
->getSExtValue(), VT
);
939 NewOpc
= (isI32IntS10Immediate(CN
) ? SPU::AIr32
: SPU::Ar32
);
949 return CurDAG
->SelectNodeTo(N
, NewOpc
, OpVT
, Ops
, n_ops
);
951 return CurDAG
->getTargetNode(NewOpc
, dl
, OpVT
, Ops
, n_ops
);
953 return SelectCode(Op
);
957 * Emit the instruction sequence for i64 left shifts. The basic algorithm
958 * is to fill the bottom two word slots with zeros so that zeros are shifted
959 * in as the entire quadword is shifted left.
961 * \note This code could also be used to implement v2i64 shl.
963 * @param Op The shl operand
964 * @param OpVT Op's machine value value type (doesn't need to be passed, but
965 * makes life easier.)
966 * @return The SDNode with the entire instruction sequence
969 SPUDAGToDAGISel::SelectSHLi64(SDValue
&Op
, MVT OpVT
) {
970 SDValue Op0
= Op
.getOperand(0);
971 MVT VecVT
= MVT::getVectorVT(OpVT
, (128 / OpVT
.getSizeInBits()));
972 SDValue ShiftAmt
= Op
.getOperand(1);
973 MVT ShiftAmtVT
= ShiftAmt
.getValueType();
974 SDNode
*VecOp0
, *SelMask
, *ZeroFill
, *Shift
= 0;
976 DebugLoc dl
= Op
.getDebugLoc();
978 VecOp0
= CurDAG
->getTargetNode(SPU::ORv2i64_i64
, dl
, VecVT
, Op0
);
979 SelMaskVal
= CurDAG
->getTargetConstant(0xff00ULL
, MVT::i16
);
980 SelMask
= CurDAG
->getTargetNode(SPU::FSMBIv2i64
, dl
, VecVT
, SelMaskVal
);
981 ZeroFill
= CurDAG
->getTargetNode(SPU::ILv2i64
, dl
, VecVT
,
982 CurDAG
->getTargetConstant(0, OpVT
));
983 VecOp0
= CurDAG
->getTargetNode(SPU::SELBv2i64
, dl
, VecVT
,
984 SDValue(ZeroFill
, 0),
986 SDValue(SelMask
, 0));
988 if (ConstantSDNode
*CN
= dyn_cast
<ConstantSDNode
>(ShiftAmt
)) {
989 unsigned bytes
= unsigned(CN
->getZExtValue()) >> 3;
990 unsigned bits
= unsigned(CN
->getZExtValue()) & 7;
994 CurDAG
->getTargetNode(SPU::SHLQBYIv2i64
, dl
, VecVT
,
996 CurDAG
->getTargetConstant(bytes
, ShiftAmtVT
));
1001 CurDAG
->getTargetNode(SPU::SHLQBIIv2i64
, dl
, VecVT
,
1002 SDValue((Shift
!= 0 ? Shift
: VecOp0
), 0),
1003 CurDAG
->getTargetConstant(bits
, ShiftAmtVT
));
1007 CurDAG
->getTargetNode(SPU::ROTMIr32
, dl
, ShiftAmtVT
,
1009 CurDAG
->getTargetConstant(3, ShiftAmtVT
));
1011 CurDAG
->getTargetNode(SPU::ANDIr32
, dl
, ShiftAmtVT
,
1013 CurDAG
->getTargetConstant(7, ShiftAmtVT
));
1015 CurDAG
->getTargetNode(SPU::SHLQBYv2i64
, dl
, VecVT
,
1016 SDValue(VecOp0
, 0), SDValue(Bytes
, 0));
1018 CurDAG
->getTargetNode(SPU::SHLQBIv2i64
, dl
, VecVT
,
1019 SDValue(Shift
, 0), SDValue(Bits
, 0));
1022 return CurDAG
->getTargetNode(SPU::ORi64_v2i64
, dl
, OpVT
, SDValue(Shift
, 0));
1026 * Emit the instruction sequence for i64 logical right shifts.
1028 * @param Op The shl operand
1029 * @param OpVT Op's machine value value type (doesn't need to be passed, but
1030 * makes life easier.)
1031 * @return The SDNode with the entire instruction sequence
1034 SPUDAGToDAGISel::SelectSRLi64(SDValue
&Op
, MVT OpVT
) {
1035 SDValue Op0
= Op
.getOperand(0);
1036 MVT VecVT
= MVT::getVectorVT(OpVT
, (128 / OpVT
.getSizeInBits()));
1037 SDValue ShiftAmt
= Op
.getOperand(1);
1038 MVT ShiftAmtVT
= ShiftAmt
.getValueType();
1039 SDNode
*VecOp0
, *Shift
= 0;
1040 DebugLoc dl
= Op
.getDebugLoc();
1042 VecOp0
= CurDAG
->getTargetNode(SPU::ORv2i64_i64
, dl
, VecVT
, Op0
);
1044 if (ConstantSDNode
*CN
= dyn_cast
<ConstantSDNode
>(ShiftAmt
)) {
1045 unsigned bytes
= unsigned(CN
->getZExtValue()) >> 3;
1046 unsigned bits
= unsigned(CN
->getZExtValue()) & 7;
1050 CurDAG
->getTargetNode(SPU::ROTQMBYIv2i64
, dl
, VecVT
,
1052 CurDAG
->getTargetConstant(bytes
, ShiftAmtVT
));
1057 CurDAG
->getTargetNode(SPU::ROTQMBIIv2i64
, dl
, VecVT
,
1058 SDValue((Shift
!= 0 ? Shift
: VecOp0
), 0),
1059 CurDAG
->getTargetConstant(bits
, ShiftAmtVT
));
1063 CurDAG
->getTargetNode(SPU::ROTMIr32
, dl
, ShiftAmtVT
,
1065 CurDAG
->getTargetConstant(3, ShiftAmtVT
));
1067 CurDAG
->getTargetNode(SPU::ANDIr32
, dl
, ShiftAmtVT
,
1069 CurDAG
->getTargetConstant(7, ShiftAmtVT
));
1071 // Ensure that the shift amounts are negated!
1072 Bytes
= CurDAG
->getTargetNode(SPU::SFIr32
, dl
, ShiftAmtVT
,
1074 CurDAG
->getTargetConstant(0, ShiftAmtVT
));
1076 Bits
= CurDAG
->getTargetNode(SPU::SFIr32
, dl
, ShiftAmtVT
,
1078 CurDAG
->getTargetConstant(0, ShiftAmtVT
));
1081 CurDAG
->getTargetNode(SPU::ROTQMBYv2i64
, dl
, VecVT
,
1082 SDValue(VecOp0
, 0), SDValue(Bytes
, 0));
1084 CurDAG
->getTargetNode(SPU::ROTQMBIv2i64
, dl
, VecVT
,
1085 SDValue(Shift
, 0), SDValue(Bits
, 0));
1088 return CurDAG
->getTargetNode(SPU::ORi64_v2i64
, dl
, OpVT
, SDValue(Shift
, 0));
1092 * Emit the instruction sequence for i64 arithmetic right shifts.
1094 * @param Op The shl operand
1095 * @param OpVT Op's machine value value type (doesn't need to be passed, but
1096 * makes life easier.)
1097 * @return The SDNode with the entire instruction sequence
1100 SPUDAGToDAGISel::SelectSRAi64(SDValue
&Op
, MVT OpVT
) {
1101 // Promote Op0 to vector
1102 MVT VecVT
= MVT::getVectorVT(OpVT
, (128 / OpVT
.getSizeInBits()));
1103 SDValue ShiftAmt
= Op
.getOperand(1);
1104 MVT ShiftAmtVT
= ShiftAmt
.getValueType();
1105 DebugLoc dl
= Op
.getDebugLoc();
1108 CurDAG
->getTargetNode(SPU::ORv2i64_i64
, dl
, VecVT
, Op
.getOperand(0));
1110 SDValue SignRotAmt
= CurDAG
->getTargetConstant(31, ShiftAmtVT
);
1112 CurDAG
->getTargetNode(SPU::ROTMAIv2i64_i32
, dl
, MVT::v2i64
,
1113 SDValue(VecOp0
, 0), SignRotAmt
);
1114 SDNode
*UpperHalfSign
=
1115 CurDAG
->getTargetNode(SPU::ORi32_v4i32
, dl
, MVT::i32
, SDValue(SignRot
, 0));
1117 SDNode
*UpperHalfSignMask
=
1118 CurDAG
->getTargetNode(SPU::FSM64r32
, dl
, VecVT
, SDValue(UpperHalfSign
, 0));
1119 SDNode
*UpperLowerMask
=
1120 CurDAG
->getTargetNode(SPU::FSMBIv2i64
, dl
, VecVT
,
1121 CurDAG
->getTargetConstant(0xff00ULL
, MVT::i16
));
1122 SDNode
*UpperLowerSelect
=
1123 CurDAG
->getTargetNode(SPU::SELBv2i64
, dl
, VecVT
,
1124 SDValue(UpperHalfSignMask
, 0),
1126 SDValue(UpperLowerMask
, 0));
1130 if (ConstantSDNode
*CN
= dyn_cast
<ConstantSDNode
>(ShiftAmt
)) {
1131 unsigned bytes
= unsigned(CN
->getZExtValue()) >> 3;
1132 unsigned bits
= unsigned(CN
->getZExtValue()) & 7;
1137 CurDAG
->getTargetNode(SPU::ROTQBYIv2i64
, dl
, VecVT
,
1138 SDValue(UpperLowerSelect
, 0),
1139 CurDAG
->getTargetConstant(bytes
, ShiftAmtVT
));
1145 CurDAG
->getTargetNode(SPU::ROTQBIIv2i64
, dl
, VecVT
,
1146 SDValue((Shift
!= 0 ? Shift
: UpperLowerSelect
), 0),
1147 CurDAG
->getTargetConstant(bits
, ShiftAmtVT
));
1151 CurDAG
->getTargetNode(SPU::SFIr32
, dl
, ShiftAmtVT
,
1152 ShiftAmt
, CurDAG
->getTargetConstant(0, ShiftAmtVT
));
1155 CurDAG
->getTargetNode(SPU::ROTQBYBIv2i64_r32
, dl
, VecVT
,
1156 SDValue(UpperLowerSelect
, 0), SDValue(NegShift
, 0));
1158 CurDAG
->getTargetNode(SPU::ROTQBIv2i64
, dl
, VecVT
,
1159 SDValue(Shift
, 0), SDValue(NegShift
, 0));
1162 return CurDAG
->getTargetNode(SPU::ORi64_v2i64
, dl
, OpVT
, SDValue(Shift
, 0));
1166 Do the necessary magic necessary to load a i64 constant
1168 SDNode
*SPUDAGToDAGISel::SelectI64Constant(SDValue
& Op
, MVT OpVT
,
1170 ConstantSDNode
*CN
= cast
<ConstantSDNode
>(Op
.getNode());
1171 return SelectI64Constant(CN
->getZExtValue(), OpVT
, dl
);
1174 SDNode
*SPUDAGToDAGISel::SelectI64Constant(uint64_t Value64
, MVT OpVT
,
1176 MVT OpVecVT
= MVT::getVectorVT(OpVT
, 2);
1178 SPU::LowerV2I64Splat(OpVecVT
, *CurDAG
, Value64
, dl
);
1180 // Here's where it gets interesting, because we have to parse out the
1181 // subtree handed back in i64vec:
1183 if (i64vec
.getOpcode() == ISD::BIT_CONVERT
) {
1184 // The degenerate case where the upper and lower bits in the splat are
1186 SDValue Op0
= i64vec
.getOperand(0);
1188 ReplaceUses(i64vec
, Op0
);
1189 return CurDAG
->getTargetNode(SPU::ORi64_v2i64
, dl
, OpVT
,
1190 SDValue(emitBuildVector(Op0
), 0));
1191 } else if (i64vec
.getOpcode() == SPUISD::SHUFB
) {
1192 SDValue lhs
= i64vec
.getOperand(0);
1193 SDValue rhs
= i64vec
.getOperand(1);
1194 SDValue shufmask
= i64vec
.getOperand(2);
1196 if (lhs
.getOpcode() == ISD::BIT_CONVERT
) {
1197 ReplaceUses(lhs
, lhs
.getOperand(0));
1198 lhs
= lhs
.getOperand(0);
1201 SDNode
*lhsNode
= (lhs
.getNode()->isMachineOpcode()
1203 : emitBuildVector(lhs
));
1205 if (rhs
.getOpcode() == ISD::BIT_CONVERT
) {
1206 ReplaceUses(rhs
, rhs
.getOperand(0));
1207 rhs
= rhs
.getOperand(0);
1210 SDNode
*rhsNode
= (rhs
.getNode()->isMachineOpcode()
1212 : emitBuildVector(rhs
));
1214 if (shufmask
.getOpcode() == ISD::BIT_CONVERT
) {
1215 ReplaceUses(shufmask
, shufmask
.getOperand(0));
1216 shufmask
= shufmask
.getOperand(0);
1219 SDNode
*shufMaskNode
= (shufmask
.getNode()->isMachineOpcode()
1220 ? shufmask
.getNode()
1221 : emitBuildVector(shufmask
));
1224 Select(CurDAG
->getNode(SPUISD::SHUFB
, dl
, OpVecVT
,
1225 SDValue(lhsNode
, 0), SDValue(rhsNode
, 0),
1226 SDValue(shufMaskNode
, 0)));
1228 return CurDAG
->getTargetNode(SPU::ORi64_v2i64
, dl
, OpVT
,
1229 SDValue(shufNode
, 0));
1230 } else if (i64vec
.getOpcode() == ISD::BUILD_VECTOR
) {
1231 return CurDAG
->getTargetNode(SPU::ORi64_v2i64
, dl
, OpVT
,
1232 SDValue(emitBuildVector(i64vec
), 0));
1234 cerr
<< "SPUDAGToDAGISel::SelectI64Constant: Unhandled i64vec condition\n";
1239 /// createSPUISelDag - This pass converts a legalized DAG into a
1240 /// SPU-specific DAG, ready for instruction scheduling.
1242 FunctionPass
*llvm::createSPUISelDag(SPUTargetMachine
&TM
) {
1243 return new SPUDAGToDAGISel(TM
);