Home | History | Annotate | Download | only in Sparc

Lines Matching refs:DAG

1 //===-- SparcISelLowering.cpp - Sparc DAG Lowering Implementation ---------===//
11 // selection DAG.
85 DebugLoc dl, SelectionDAG &DAG) const {
87 MachineFunction &MF = DAG.getMachineFunction();
93 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
94 DAG.getTarget(), RVLocs, *DAG.getContext());
114 Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(),
128 SDValue Val = DAG.getCopyFromReg(Chain, dl, Reg, getPointerTy());
129 Chain = DAG.getCopyToReg(Chain, dl, SP::I0, Val, Flag);
136 SDValue RetAddrOffsetNode = DAG.getConstant(RetAddrOffset, MVT::i32);
139 return DAG.getNode(SPISD::RET_FLAG, dl, MVT::Other, Chain,
141 return DAG.getNode(SPISD::RET_FLAG, dl, MVT::Other, Chain,
153 DebugLoc dl, SelectionDAG &DAG,
157 MachineFunction &MF = DAG.getMachineFunction();
163 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
164 getTargetMachine(), ArgLocs, *DAG.getContext());
175 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
176 SDValue Arg = DAG.getLoad(MVT::i32, dl, Chain, FIPtr,
188 SDValue HiVal = DAG.getCopyFromReg(Chain, dl, VRegHi, MVT::i32);
197 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
198 LoVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr,
204 LoVal = DAG.getCopyFromReg(Chain, dl, loReg, MVT::i32);
207 DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, LoVal, HiVal);
208 WholeValue = DAG.getNode(ISD::BITCAST, dl, MVT::f64, WholeValue);
214 SDValue Arg = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);
216 Arg = DAG.getNode(ISD::BITCAST, dl, MVT::f32, Arg);
218 Arg = DAG.getNode(ISD::AssertSext, dl, MVT::i32, Arg,
219 DAG.getValueType(VA.getLocVT()));
220 Arg = DAG.getNode(ISD::TRUNCATE, dl, VA.getLocVT(), Arg);
237 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
238 SDValue Load = DAG.getLoad(VA.getValVT(), dl, Chain, FIPtr,
248 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
249 SDValue HiVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr,
255 SDValue FIPtr2 = DAG.getFrameIndex(FI2, getPointerTy());
257 SDValue LoVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr2,
262 DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, LoVal, HiVal);
263 WholeValue = DAG.getNode(ISD::BITCAST, dl, MVT::f64, WholeValue);
271 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
274 Load = DAG.getLoad(VA.getValVT(), dl, Chain, FIPtr,
281 FIPtr = DAG.getNode(ISD::ADD, dl, MVT::i32, FIPtr,
282 DAG.getConstant(Offset, MVT::i32));
283 Load = DAG.getExtLoad(LoadOp, dl, MVT::i32, Chain, FIPtr,
286 Load = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), Load);
299 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[0]);
300 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Copy, Chain);
326 SDValue Arg = DAG.getCopyFromReg(DAG.getRoot(), dl, VReg, MVT::i32);
330 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
332 OutChains.push_back(DAG.getStore(DAG.getRoot(), dl, Arg, FIPtr,
340 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
355 DebugLoc dl, SelectionDAG &DAG,
362 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(),
363 DAG.getTarget(), ArgLocs, *DAG.getContext());
372 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
386 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy());
387 SDValue SizeNode = DAG.getConstant(Size, MVT::i32);
389 Chain = DAG.getMemcpy(Chain, dl, FIPtr, Arg, SizeNode, Align,
396 Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(ArgsSize, true));
421 Arg = DAG.getNode(ISD::SIGN_EXTEND, dl, VA.getLocVT(), Arg);
424 Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, VA.getLocVT(), Arg);
427 Arg = DAG.getNode(ISD::ANY_EXTEND, dl, VA.getLocVT(), Arg);
430 Arg = DAG.getNode(ISD::BITCAST, dl, VA.getLocVT(), Arg);
437 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
438 SDValue PtrOff = DAG.getIntPtrConstant(64);
439 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
440 MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff,
454 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
455 SDValue PtrOff = DAG.getIntPtrConstant(Offset);
456 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
457 MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff,
464 SDValue StackPtr = DAG.CreateStackTemporary(MVT::f64, MVT::i32);
465 SDValue Store = DAG.getStore(DAG.getEntryNode(), dl,
469 SDValue Hi = DAG.getLoad(MVT::i32, dl, Store, StackPtr,
472 StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr,
473 DAG.getIntPtrConstant(4));
475 SDValue Lo = DAG.getLoad(MVT::i32, dl, Store, StackPtr,
487 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
488 SDValue PtrOff = DAG.getIntPtrConstant(Offset);
489 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
490 MemOpChains.push_back(DAG.getStore(Chain, dl, Lo, PtrOff,
497 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
498 SDValue PtrOff = DAG.getIntPtrConstant(Offset);
499 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
500 MemOpChains.push_back(DAG.getStore(Chain, dl, Hi, PtrOff,
504 PtrOff = DAG.getIntPtrConstant(Offset+4);
505 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
506 MemOpChains.push_back(DAG.getStore(Chain, dl, Lo, PtrOff,
520 Arg = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Arg);
528 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
529 SDValue PtrOff = DAG.getIntPtrConstant(VA.getLocMemOffset()+StackOffset);
530 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
531 MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff,
539 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
553 Chain = DAG.getCopyToReg(Chain, dl, Reg, RegsToPass[i].second, InFlag);
557 unsigned SRetArgSize = (hasStructRetAttr)? getSRetArgSize(DAG, Callee):0;
563 Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, MVT::i32);
565 Callee = DAG.getTargetExternalSymbol(E->getSymbol(), MVT::i32);
568 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
573 Ops.push_back(DAG.getTargetConstant(SRetArgSize, MVT::i32));
579 Ops.push_back(DAG.getRegister(Reg, RegsToPass[i].second.getValueType()));
584 Chain = DAG.getNode(SPISD::CALL, dl, NodeTys, &Ops[0], Ops.size());
587 Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(ArgsSize, true),
588 DAG.getIntPtrConstant(0, true), InFlag);
593 CCState RVInfo(CallConv, isVarArg, DAG.getMachineFunction(),
594 DAG.getTarget(), RVLocs, *DAG.getContext());
606 Chain = DAG.getCopyFromReg(Chain, dl, Reg,
616 SparcTargetLowering::getSRetArgSize(SelectionDAG &DAG, SDValue Callee) const
623 const Function *Fn = DAG.getMachineFunction().getFunction();
643 /// IntCondCCodeToICC - Convert a DAG integer condition code to a SPARC ICC
661 /// FPCondCCodeToFCC - Convert a DAG floatingp oint condition code to a SPARC
831 /// be zero. Op is expected to be a target specific node. Used by DAG
837 const SelectionDAG &DAG,
846 DAG.ComputeMaskedBits(Op.getOperand(1), Mask, KnownZero, KnownOne,
848 DAG.ComputeMaskedBits(Op.getOperand(0), Mask, KnownZero2, KnownOne2,
883 SelectionDAG &DAG) const {
887 SDValue GA = DAG.getTargetGlobalAddress(GV, dl, MVT::i32);
888 SDValue Hi = DAG.getNode(SPISD::Hi, dl, MVT::i32, GA);
889 SDValue Lo = DAG.getNode(SPISD::Lo, dl, MVT::i32, GA);
892 return DAG.getNode(ISD::ADD, dl, MVT::i32, Lo, Hi);
894 SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, dl,
896 SDValue RelAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, Lo, Hi);
897 SDValue AbsAddr = DAG.getNode(ISD::ADD, dl, MVT::i32,
899 return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
904 SelectionDAG &DAG) const {
909 SDValue CP = DAG.getTargetConstantPool(C, MVT::i32, N->getAlignment());
910 SDValue Hi = DAG.getNode(SPISD::Hi, dl, MVT::i32, CP);
911 SDValue Lo = DAG.getNode(SPISD::Lo, dl, MVT::i32, CP);
913 return DAG.getNode(ISD::ADD, dl, MVT::i32, Lo, Hi);
915 SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, dl,
917 SDValue RelAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, Lo, Hi);
918 SDValue AbsAddr = DAG.getNode(ISD::ADD, dl, MVT::i32,
920 return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
924 static SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) {
928 Op = DAG.getNode(SPISD::FTOI, dl, MVT::f32, Op.getOperand(0));
929 return DAG.getNode(ISD::BITCAST, dl, MVT::i32, Op);
932 static SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
935 SDValue Tmp = DAG.getNode(ISD::BITCAST, dl, MVT::f32, Op.getOperand(0));
937 return DAG.getNode(SPISD::ITOF, dl, Op.getValueType(), Tmp);
940 static SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) {
960 CompareFlag = DAG.getNode(SPISD::CMPICC, dl, VTs, Ops, 2).getValue(1);
964 CompareFlag = DAG.getNode(SPISD::CMPFCC, dl, MVT::Glue, LHS, RHS);
968 return DAG.getNode(Opc, dl, MVT::Other, Chain, Dest,
969 DAG.getConstant(SPCC, MVT::i32), CompareFlag);
972 static SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) {
991 CompareFlag = DAG.getNode(SPISD::CMPICC, dl, VTs, Ops, 2).getValue(1);
995 CompareFlag = DAG.getNode(SPISD::CMPFCC, dl, MVT::Glue, LHS, RHS);
999 return DAG.getNode(Opc, dl, TrueVal.getValueType(), TrueVal, FalseVal,
1000 DAG.getConstant(SPCC, MVT::i32), CompareFlag);
1003 static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
1005 MachineFunction &MF = DAG.getMachineFunction();
1012 DAG.getNode(ISD::ADD, dl, MVT::i32,
1013 DAG.getRegister(SP::I6, MVT::i32),
1014 DAG.getConstant(FuncInfo->getVarArgsFrameOffset(),
1017 return DAG.getStore(Op.getOperand(0), dl, Offset, Op.getOperand(1),
1021 static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) {
1028 SDValue VAList = DAG.getLoad(MVT::i32, dl, InChain, VAListPtr,
1031 SDValue NextPtr = DAG.getNode(ISD::ADD, dl, MVT::i32, VAList,
1032 DAG.getConstant(VT.getSizeInBits()/8,
1035 InChain = DAG.getStore(VAList.getValue(1), dl, NextPtr,
1040 return DAG.getLoad(VT, dl, InChain, VAList, MachinePointerInfo(),
1044 SDValue V = DAG.getLoad(MVT::i64, dl, InChain, VAList, MachinePointerInfo(),
1049 DAG.getNode(ISD::BITCAST, dl, MVT::f64, V),
1052 return DAG.getMergeValues(Ops, 2, dl);
1055 static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) {
1061 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, MVT::i32);
1062 SDValue NewSP = DAG.getNode(ISD::SUB, dl, MVT::i32, SP, Size); // Value
1063 Chain = DAG.getCopyToReg(SP.getValue(1), dl, SPReg, NewSP); // Output chain
1067 SDValue NewVal = DAG.getNode(ISD::ADD, dl, MVT::i32, NewSP,
1068 DAG.getConstant(96, MVT::i32));
1070 return DAG.getMergeValues(Ops, 2, dl);
1074 static SDValue getFLUSHW(SDValue Op, SelectionDAG &DAG) {
1076 SDValue Chain = DAG.getNode(SPISD::FLUSHW,
1077 dl, MVT::Other, DAG.getEntryNode());
1081 static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) {
1082 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
1093 FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, VT);
1096 SDValue Chain = getFLUSHW(Op, DAG);
1097 FrameAddr = DAG.getCopyFromReg(Chain, dl, FrameReg, VT);
1100 SDValue Ptr = DAG.getNode(ISD::ADD,
1102 FrameAddr, DAG.getIntPtrConstant(56));
1103 FrameAddr = DAG.getLoad(MVT::i32, dl,
1112 static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) {
1113 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
1124 RetAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, RetReg, VT);
1127 SDValue Chain = getFLUSHW(Op, DAG);
1128 RetAddr = DAG.getCopyFromReg(Chain, dl, SP::I6, VT);
1131 SDValue Ptr = DAG.getNode(ISD::ADD,
1134 DAG.getIntPtrConstant((i == depth-1)?60:56));
1135 RetAddr = DAG.getLoad(MVT::i32, dl,
1145 LowerOperation(SDValue Op, SelectionDAG &DAG) const {
1148 case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG);
1149 case ISD::FRAMEADDR: return LowerFRAMEADDR(Op, DAG);
1152 case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
1153 case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
1154 case ISD::FP_TO_SINT: return LowerFP_TO_SINT(Op, DAG);
1155 case ISD::SINT_TO_FP: return LowerSINT_TO_FP(Op, DAG);
1156 case ISD::BR_CC: return LowerBR_CC(Op, DAG);
1157 case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG);
1158 case ISD::VASTART: return LowerVASTART(Op, DAG, *this);
1159 case ISD::VAARG: return LowerVAARG(Op, DAG);
1160 case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG);