1 //===-- SparcISelLowering.cpp - Sparc DAG Lowering Implementation ---------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the interfaces that Sparc uses to lower LLVM code into a 11 // selection DAG. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "SparcISelLowering.h" 16 #include "MCTargetDesc/SparcMCExpr.h" 17 #include "SparcMachineFunctionInfo.h" 18 #include "SparcRegisterInfo.h" 19 #include "SparcTargetMachine.h" 20 #include "SparcTargetObjectFile.h" 21 #include "llvm/CodeGen/CallingConvLower.h" 22 #include "llvm/CodeGen/MachineFrameInfo.h" 23 #include "llvm/CodeGen/MachineFunction.h" 24 #include "llvm/CodeGen/MachineInstrBuilder.h" 25 #include "llvm/CodeGen/MachineRegisterInfo.h" 26 #include "llvm/CodeGen/SelectionDAG.h" 27 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 28 #include "llvm/IR/DerivedTypes.h" 29 #include "llvm/IR/Function.h" 30 #include "llvm/IR/Module.h" 31 #include "llvm/Support/ErrorHandling.h" 32 using namespace llvm; 33 34 35 //===----------------------------------------------------------------------===// 36 // Calling Convention Implementation 37 //===----------------------------------------------------------------------===// 38 39 static bool CC_Sparc_Assign_SRet(unsigned &ValNo, MVT &ValVT, 40 MVT &LocVT, CCValAssign::LocInfo &LocInfo, 41 ISD::ArgFlagsTy &ArgFlags, CCState &State) 42 { 43 assert (ArgFlags.isSRet()); 44 45 // Assign SRet argument. 46 State.addLoc(CCValAssign::getCustomMem(ValNo, ValVT, 47 0, 48 LocVT, LocInfo)); 49 return true; 50 } 51 52 static bool CC_Sparc_Assign_Split_64(unsigned &ValNo, MVT &ValVT, 53 MVT &LocVT, CCValAssign::LocInfo &LocInfo, 54 ISD::ArgFlagsTy &ArgFlags, CCState &State) 55 { 56 static const MCPhysReg RegList[] = { 57 SP::I0, SP::I1, SP::I2, SP::I3, SP::I4, SP::I5 58 }; 59 // Try to get first reg. 60 if (unsigned Reg = State.AllocateReg(RegList)) { 61 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 62 } else { 63 // Assign whole thing in stack. 64 State.addLoc(CCValAssign::getCustomMem(ValNo, ValVT, 65 State.AllocateStack(8,4), 66 LocVT, LocInfo)); 67 return true; 68 } 69 70 // Try to get second reg. 71 if (unsigned Reg = State.AllocateReg(RegList)) 72 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 73 else 74 State.addLoc(CCValAssign::getCustomMem(ValNo, ValVT, 75 State.AllocateStack(4,4), 76 LocVT, LocInfo)); 77 return true; 78 } 79 80 static bool CC_Sparc_Assign_Ret_Split_64(unsigned &ValNo, MVT &ValVT, 81 MVT &LocVT, CCValAssign::LocInfo &LocInfo, 82 ISD::ArgFlagsTy &ArgFlags, CCState &State) 83 { 84 static const MCPhysReg RegList[] = { 85 SP::I0, SP::I1, SP::I2, SP::I3, SP::I4, SP::I5 86 }; 87 88 // Try to get first reg. 89 if (unsigned Reg = State.AllocateReg(RegList)) 90 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 91 else 92 return false; 93 94 // Try to get second reg. 95 if (unsigned Reg = State.AllocateReg(RegList)) 96 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 97 else 98 return false; 99 100 return true; 101 } 102 103 // Allocate a full-sized argument for the 64-bit ABI. 104 static bool CC_Sparc64_Full(unsigned &ValNo, MVT &ValVT, 105 MVT &LocVT, CCValAssign::LocInfo &LocInfo, 106 ISD::ArgFlagsTy &ArgFlags, CCState &State) { 107 assert((LocVT == MVT::f32 || LocVT == MVT::f128 108 || LocVT.getSizeInBits() == 64) && 109 "Can't handle non-64 bits locations"); 110 111 // Stack space is allocated for all arguments starting from [%fp+BIAS+128]. 112 unsigned size = (LocVT == MVT::f128) ? 16 : 8; 113 unsigned alignment = (LocVT == MVT::f128) ? 16 : 8; 114 unsigned Offset = State.AllocateStack(size, alignment); 115 unsigned Reg = 0; 116 117 if (LocVT == MVT::i64 && Offset < 6*8) 118 // Promote integers to %i0-%i5. 119 Reg = SP::I0 + Offset/8; 120 else if (LocVT == MVT::f64 && Offset < 16*8) 121 // Promote doubles to %d0-%d30. (Which LLVM calls D0-D15). 122 Reg = SP::D0 + Offset/8; 123 else if (LocVT == MVT::f32 && Offset < 16*8) 124 // Promote floats to %f1, %f3, ... 125 Reg = SP::F1 + Offset/4; 126 else if (LocVT == MVT::f128 && Offset < 16*8) 127 // Promote long doubles to %q0-%q28. (Which LLVM calls Q0-Q7). 128 Reg = SP::Q0 + Offset/16; 129 130 // Promote to register when possible, otherwise use the stack slot. 131 if (Reg) { 132 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 133 return true; 134 } 135 136 // This argument goes on the stack in an 8-byte slot. 137 // When passing floats, LocVT is smaller than 8 bytes. Adjust the offset to 138 // the right-aligned float. The first 4 bytes of the stack slot are undefined. 139 if (LocVT == MVT::f32) 140 Offset += 4; 141 142 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo)); 143 return true; 144 } 145 146 // Allocate a half-sized argument for the 64-bit ABI. 147 // 148 // This is used when passing { float, int } structs by value in registers. 149 static bool CC_Sparc64_Half(unsigned &ValNo, MVT &ValVT, 150 MVT &LocVT, CCValAssign::LocInfo &LocInfo, 151 ISD::ArgFlagsTy &ArgFlags, CCState &State) { 152 assert(LocVT.getSizeInBits() == 32 && "Can't handle non-32 bits locations"); 153 unsigned Offset = State.AllocateStack(4, 4); 154 155 if (LocVT == MVT::f32 && Offset < 16*8) { 156 // Promote floats to %f0-%f31. 157 State.addLoc(CCValAssign::getReg(ValNo, ValVT, SP::F0 + Offset/4, 158 LocVT, LocInfo)); 159 return true; 160 } 161 162 if (LocVT == MVT::i32 && Offset < 6*8) { 163 // Promote integers to %i0-%i5, using half the register. 164 unsigned Reg = SP::I0 + Offset/8; 165 LocVT = MVT::i64; 166 LocInfo = CCValAssign::AExt; 167 168 // Set the Custom bit if this i32 goes in the high bits of a register. 169 if (Offset % 8 == 0) 170 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, 171 LocVT, LocInfo)); 172 else 173 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 174 return true; 175 } 176 177 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo)); 178 return true; 179 } 180 181 #include "SparcGenCallingConv.inc" 182 183 // The calling conventions in SparcCallingConv.td are described in terms of the 184 // callee's register window. This function translates registers to the 185 // corresponding caller window %o register. 186 static unsigned toCallerWindow(unsigned Reg) { 187 assert(SP::I0 + 7 == SP::I7 && SP::O0 + 7 == SP::O7 && "Unexpected enum"); 188 if (Reg >= SP::I0 && Reg <= SP::I7) 189 return Reg - SP::I0 + SP::O0; 190 return Reg; 191 } 192 193 SDValue 194 SparcTargetLowering::LowerReturn(SDValue Chain, 195 CallingConv::ID CallConv, bool IsVarArg, 196 const SmallVectorImpl<ISD::OutputArg> &Outs, 197 const SmallVectorImpl<SDValue> &OutVals, 198 SDLoc DL, SelectionDAG &DAG) const { 199 if (Subtarget->is64Bit()) 200 return LowerReturn_64(Chain, CallConv, IsVarArg, Outs, OutVals, DL, DAG); 201 return LowerReturn_32(Chain, CallConv, IsVarArg, Outs, OutVals, DL, DAG); 202 } 203 204 SDValue 205 SparcTargetLowering::LowerReturn_32(SDValue Chain, 206 CallingConv::ID CallConv, bool IsVarArg, 207 const SmallVectorImpl<ISD::OutputArg> &Outs, 208 const SmallVectorImpl<SDValue> &OutVals, 209 SDLoc DL, SelectionDAG &DAG) const { 210 MachineFunction &MF = DAG.getMachineFunction(); 211 212 // CCValAssign - represent the assignment of the return value to locations. 213 SmallVector<CCValAssign, 16> RVLocs; 214 215 // CCState - Info about the registers and stack slot. 216 CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), RVLocs, 217 *DAG.getContext()); 218 219 // Analyze return values. 220 CCInfo.AnalyzeReturn(Outs, RetCC_Sparc32); 221 222 SDValue Flag; 223 SmallVector<SDValue, 4> RetOps(1, Chain); 224 // Make room for the return address offset. 225 RetOps.push_back(SDValue()); 226 227 // Copy the result values into the output registers. 228 for (unsigned i = 0, realRVLocIdx = 0; 229 i != RVLocs.size(); 230 ++i, ++realRVLocIdx) { 231 CCValAssign &VA = RVLocs[i]; 232 assert(VA.isRegLoc() && "Can only return in registers!"); 233 234 SDValue Arg = OutVals[realRVLocIdx]; 235 236 if (VA.needsCustom()) { 237 assert(VA.getLocVT() == MVT::v2i32); 238 // Legalize ret v2i32 -> ret 2 x i32 (Basically: do what would 239 // happen by default if this wasn't a legal type) 240 241 SDValue Part0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32, 242 Arg, 243 DAG.getConstant(0, DL, getVectorIdxTy(DAG.getDataLayout()))); 244 SDValue Part1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32, 245 Arg, 246 DAG.getConstant(1, DL, getVectorIdxTy(DAG.getDataLayout()))); 247 248 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), Part0, Flag); 249 Flag = Chain.getValue(1); 250 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT())); 251 VA = RVLocs[++i]; // skip ahead to next loc 252 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), Part1, 253 Flag); 254 } else 255 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), Arg, Flag); 256 257 // Guarantee that all emitted copies are stuck together with flags. 258 Flag = Chain.getValue(1); 259 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT())); 260 } 261 262 unsigned RetAddrOffset = 8; // Call Inst + Delay Slot 263 // If the function returns a struct, copy the SRetReturnReg to I0 264 if (MF.getFunction()->hasStructRetAttr()) { 265 SparcMachineFunctionInfo *SFI = MF.getInfo<SparcMachineFunctionInfo>(); 266 unsigned Reg = SFI->getSRetReturnReg(); 267 if (!Reg) 268 llvm_unreachable("sret virtual register not created in the entry block"); 269 auto PtrVT = getPointerTy(DAG.getDataLayout()); 270 SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, PtrVT); 271 Chain = DAG.getCopyToReg(Chain, DL, SP::I0, Val, Flag); 272 Flag = Chain.getValue(1); 273 RetOps.push_back(DAG.getRegister(SP::I0, PtrVT)); 274 RetAddrOffset = 12; // CallInst + Delay Slot + Unimp 275 } 276 277 RetOps[0] = Chain; // Update chain. 278 RetOps[1] = DAG.getConstant(RetAddrOffset, DL, MVT::i32); 279 280 // Add the flag if we have it. 281 if (Flag.getNode()) 282 RetOps.push_back(Flag); 283 284 return DAG.getNode(SPISD::RET_FLAG, DL, MVT::Other, RetOps); 285 } 286 287 // Lower return values for the 64-bit ABI. 288 // Return values are passed the exactly the same way as function arguments. 289 SDValue 290 SparcTargetLowering::LowerReturn_64(SDValue Chain, 291 CallingConv::ID CallConv, bool IsVarArg, 292 const SmallVectorImpl<ISD::OutputArg> &Outs, 293 const SmallVectorImpl<SDValue> &OutVals, 294 SDLoc DL, SelectionDAG &DAG) const { 295 // CCValAssign - represent the assignment of the return value to locations. 296 SmallVector<CCValAssign, 16> RVLocs; 297 298 // CCState - Info about the registers and stack slot. 299 CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), RVLocs, 300 *DAG.getContext()); 301 302 // Analyze return values. 303 CCInfo.AnalyzeReturn(Outs, RetCC_Sparc64); 304 305 SDValue Flag; 306 SmallVector<SDValue, 4> RetOps(1, Chain); 307 308 // The second operand on the return instruction is the return address offset. 309 // The return address is always %i7+8 with the 64-bit ABI. 310 RetOps.push_back(DAG.getConstant(8, DL, MVT::i32)); 311 312 // Copy the result values into the output registers. 313 for (unsigned i = 0; i != RVLocs.size(); ++i) { 314 CCValAssign &VA = RVLocs[i]; 315 assert(VA.isRegLoc() && "Can only return in registers!"); 316 SDValue OutVal = OutVals[i]; 317 318 // Integer return values must be sign or zero extended by the callee. 319 switch (VA.getLocInfo()) { 320 case CCValAssign::Full: break; 321 case CCValAssign::SExt: 322 OutVal = DAG.getNode(ISD::SIGN_EXTEND, DL, VA.getLocVT(), OutVal); 323 break; 324 case CCValAssign::ZExt: 325 OutVal = DAG.getNode(ISD::ZERO_EXTEND, DL, VA.getLocVT(), OutVal); 326 break; 327 case CCValAssign::AExt: 328 OutVal = DAG.getNode(ISD::ANY_EXTEND, DL, VA.getLocVT(), OutVal); 329 break; 330 default: 331 llvm_unreachable("Unknown loc info!"); 332 } 333 334 // The custom bit on an i32 return value indicates that it should be passed 335 // in the high bits of the register. 336 if (VA.getValVT() == MVT::i32 && VA.needsCustom()) { 337 OutVal = DAG.getNode(ISD::SHL, DL, MVT::i64, OutVal, 338 DAG.getConstant(32, DL, MVT::i32)); 339 340 // The next value may go in the low bits of the same register. 341 // Handle both at once. 342 if (i+1 < RVLocs.size() && RVLocs[i+1].getLocReg() == VA.getLocReg()) { 343 SDValue NV = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, OutVals[i+1]); 344 OutVal = DAG.getNode(ISD::OR, DL, MVT::i64, OutVal, NV); 345 // Skip the next value, it's already done. 346 ++i; 347 } 348 } 349 350 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), OutVal, Flag); 351 352 // Guarantee that all emitted copies are stuck together with flags. 353 Flag = Chain.getValue(1); 354 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT())); 355 } 356 357 RetOps[0] = Chain; // Update chain. 358 359 // Add the flag if we have it. 360 if (Flag.getNode()) 361 RetOps.push_back(Flag); 362 363 return DAG.getNode(SPISD::RET_FLAG, DL, MVT::Other, RetOps); 364 } 365 366 SDValue SparcTargetLowering:: 367 LowerFormalArguments(SDValue Chain, 368 CallingConv::ID CallConv, 369 bool IsVarArg, 370 const SmallVectorImpl<ISD::InputArg> &Ins, 371 SDLoc DL, 372 SelectionDAG &DAG, 373 SmallVectorImpl<SDValue> &InVals) const { 374 if (Subtarget->is64Bit()) 375 return LowerFormalArguments_64(Chain, CallConv, IsVarArg, Ins, 376 DL, DAG, InVals); 377 return LowerFormalArguments_32(Chain, CallConv, IsVarArg, Ins, 378 DL, DAG, InVals); 379 } 380 381 /// LowerFormalArguments32 - V8 uses a very simple ABI, where all values are 382 /// passed in either one or two GPRs, including FP values. TODO: we should 383 /// pass FP values in FP registers for fastcc functions. 384 SDValue SparcTargetLowering:: 385 LowerFormalArguments_32(SDValue Chain, 386 CallingConv::ID CallConv, 387 bool isVarArg, 388 const SmallVectorImpl<ISD::InputArg> &Ins, 389 SDLoc dl, 390 SelectionDAG &DAG, 391 SmallVectorImpl<SDValue> &InVals) const { 392 MachineFunction &MF = DAG.getMachineFunction(); 393 MachineRegisterInfo &RegInfo = MF.getRegInfo(); 394 SparcMachineFunctionInfo *FuncInfo = MF.getInfo<SparcMachineFunctionInfo>(); 395 396 // Assign locations to all of the incoming arguments. 397 SmallVector<CCValAssign, 16> ArgLocs; 398 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), ArgLocs, 399 *DAG.getContext()); 400 CCInfo.AnalyzeFormalArguments(Ins, CC_Sparc32); 401 402 const unsigned StackOffset = 92; 403 bool IsLittleEndian = DAG.getDataLayout().isLittleEndian(); 404 405 unsigned InIdx = 0; 406 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i, ++InIdx) { 407 CCValAssign &VA = ArgLocs[i]; 408 409 if (Ins[InIdx].Flags.isSRet()) { 410 if (InIdx != 0) 411 report_fatal_error("sparc only supports sret on the first parameter"); 412 // Get SRet from [%fp+64]. 413 int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, 64, true); 414 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); 415 SDValue Arg = DAG.getLoad(MVT::i32, dl, Chain, FIPtr, 416 MachinePointerInfo(), 417 false, false, false, 0); 418 InVals.push_back(Arg); 419 continue; 420 } 421 422 if (VA.isRegLoc()) { 423 if (VA.needsCustom()) { 424 assert(VA.getLocVT() == MVT::f64 || VA.getLocVT() == MVT::v2i32); 425 426 unsigned VRegHi = RegInfo.createVirtualRegister(&SP::IntRegsRegClass); 427 MF.getRegInfo().addLiveIn(VA.getLocReg(), VRegHi); 428 SDValue HiVal = DAG.getCopyFromReg(Chain, dl, VRegHi, MVT::i32); 429 430 assert(i+1 < e); 431 CCValAssign &NextVA = ArgLocs[++i]; 432 433 SDValue LoVal; 434 if (NextVA.isMemLoc()) { 435 int FrameIdx = MF.getFrameInfo()-> 436 CreateFixedObject(4, StackOffset+NextVA.getLocMemOffset(),true); 437 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); 438 LoVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr, 439 MachinePointerInfo(), 440 false, false, false, 0); 441 } else { 442 unsigned loReg = MF.addLiveIn(NextVA.getLocReg(), 443 &SP::IntRegsRegClass); 444 LoVal = DAG.getCopyFromReg(Chain, dl, loReg, MVT::i32); 445 } 446 447 if (IsLittleEndian) 448 std::swap(LoVal, HiVal); 449 450 SDValue WholeValue = 451 DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, LoVal, HiVal); 452 WholeValue = DAG.getNode(ISD::BITCAST, dl, VA.getLocVT(), WholeValue); 453 InVals.push_back(WholeValue); 454 continue; 455 } 456 unsigned VReg = RegInfo.createVirtualRegister(&SP::IntRegsRegClass); 457 MF.getRegInfo().addLiveIn(VA.getLocReg(), VReg); 458 SDValue Arg = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32); 459 if (VA.getLocVT() == MVT::f32) 460 Arg = DAG.getNode(ISD::BITCAST, dl, MVT::f32, Arg); 461 else if (VA.getLocVT() != MVT::i32) { 462 Arg = DAG.getNode(ISD::AssertSext, dl, MVT::i32, Arg, 463 DAG.getValueType(VA.getLocVT())); 464 Arg = DAG.getNode(ISD::TRUNCATE, dl, VA.getLocVT(), Arg); 465 } 466 InVals.push_back(Arg); 467 continue; 468 } 469 470 assert(VA.isMemLoc()); 471 472 unsigned Offset = VA.getLocMemOffset()+StackOffset; 473 auto PtrVT = getPointerTy(DAG.getDataLayout()); 474 475 if (VA.needsCustom()) { 476 assert(VA.getValVT() == MVT::f64 || VA.getValVT() == MVT::v2i32); 477 // If it is double-word aligned, just load. 478 if (Offset % 8 == 0) { 479 int FI = MF.getFrameInfo()->CreateFixedObject(8, 480 Offset, 481 true); 482 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT); 483 SDValue Load = DAG.getLoad(VA.getValVT(), dl, Chain, FIPtr, 484 MachinePointerInfo(), 485 false,false, false, 0); 486 InVals.push_back(Load); 487 continue; 488 } 489 490 int FI = MF.getFrameInfo()->CreateFixedObject(4, 491 Offset, 492 true); 493 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT); 494 SDValue HiVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr, 495 MachinePointerInfo(), 496 false, false, false, 0); 497 int FI2 = MF.getFrameInfo()->CreateFixedObject(4, 498 Offset+4, 499 true); 500 SDValue FIPtr2 = DAG.getFrameIndex(FI2, PtrVT); 501 502 SDValue LoVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr2, 503 MachinePointerInfo(), 504 false, false, false, 0); 505 506 if (IsLittleEndian) 507 std::swap(LoVal, HiVal); 508 509 SDValue WholeValue = 510 DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, LoVal, HiVal); 511 WholeValue = DAG.getNode(ISD::BITCAST, dl, VA.getValVT(), WholeValue); 512 InVals.push_back(WholeValue); 513 continue; 514 } 515 516 int FI = MF.getFrameInfo()->CreateFixedObject(4, 517 Offset, 518 true); 519 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT); 520 SDValue Load ; 521 if (VA.getValVT() == MVT::i32 || VA.getValVT() == MVT::f32) { 522 Load = DAG.getLoad(VA.getValVT(), dl, Chain, FIPtr, 523 MachinePointerInfo(), 524 false, false, false, 0); 525 } else if (VA.getValVT() == MVT::f128) { 526 report_fatal_error("SPARCv8 does not handle f128 in calls; " 527 "pass indirectly"); 528 } else { 529 // We shouldn't see any other value types here. 530 llvm_unreachable("Unexpected ValVT encountered in frame lowering."); 531 } 532 InVals.push_back(Load); 533 } 534 535 if (MF.getFunction()->hasStructRetAttr()) { 536 // Copy the SRet Argument to SRetReturnReg. 537 SparcMachineFunctionInfo *SFI = MF.getInfo<SparcMachineFunctionInfo>(); 538 unsigned Reg = SFI->getSRetReturnReg(); 539 if (!Reg) { 540 Reg = MF.getRegInfo().createVirtualRegister(&SP::IntRegsRegClass); 541 SFI->setSRetReturnReg(Reg); 542 } 543 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[0]); 544 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Copy, Chain); 545 } 546 547 // Store remaining ArgRegs to the stack if this is a varargs function. 548 if (isVarArg) { 549 static const MCPhysReg ArgRegs[] = { 550 SP::I0, SP::I1, SP::I2, SP::I3, SP::I4, SP::I5 551 }; 552 unsigned NumAllocated = CCInfo.getFirstUnallocated(ArgRegs); 553 const MCPhysReg *CurArgReg = ArgRegs+NumAllocated, *ArgRegEnd = ArgRegs+6; 554 unsigned ArgOffset = CCInfo.getNextStackOffset(); 555 if (NumAllocated == 6) 556 ArgOffset += StackOffset; 557 else { 558 assert(!ArgOffset); 559 ArgOffset = 68+4*NumAllocated; 560 } 561 562 // Remember the vararg offset for the va_start implementation. 563 FuncInfo->setVarArgsFrameOffset(ArgOffset); 564 565 std::vector<SDValue> OutChains; 566 567 for (; CurArgReg != ArgRegEnd; ++CurArgReg) { 568 unsigned VReg = RegInfo.createVirtualRegister(&SP::IntRegsRegClass); 569 MF.getRegInfo().addLiveIn(*CurArgReg, VReg); 570 SDValue Arg = DAG.getCopyFromReg(DAG.getRoot(), dl, VReg, MVT::i32); 571 572 int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset, 573 true); 574 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); 575 576 OutChains.push_back(DAG.getStore(DAG.getRoot(), dl, Arg, FIPtr, 577 MachinePointerInfo(), 578 false, false, 0)); 579 ArgOffset += 4; 580 } 581 582 if (!OutChains.empty()) { 583 OutChains.push_back(Chain); 584 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 585 } 586 } 587 588 return Chain; 589 } 590 591 // Lower formal arguments for the 64 bit ABI. 592 SDValue SparcTargetLowering:: 593 LowerFormalArguments_64(SDValue Chain, 594 CallingConv::ID CallConv, 595 bool IsVarArg, 596 const SmallVectorImpl<ISD::InputArg> &Ins, 597 SDLoc DL, 598 SelectionDAG &DAG, 599 SmallVectorImpl<SDValue> &InVals) const { 600 MachineFunction &MF = DAG.getMachineFunction(); 601 602 // Analyze arguments according to CC_Sparc64. 603 SmallVector<CCValAssign, 16> ArgLocs; 604 CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), ArgLocs, 605 *DAG.getContext()); 606 CCInfo.AnalyzeFormalArguments(Ins, CC_Sparc64); 607 608 // The argument array begins at %fp+BIAS+128, after the register save area. 609 const unsigned ArgArea = 128; 610 611 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 612 CCValAssign &VA = ArgLocs[i]; 613 if (VA.isRegLoc()) { 614 // This argument is passed in a register. 615 // All integer register arguments are promoted by the caller to i64. 616 617 // Create a virtual register for the promoted live-in value. 618 unsigned VReg = MF.addLiveIn(VA.getLocReg(), 619 getRegClassFor(VA.getLocVT())); 620 SDValue Arg = DAG.getCopyFromReg(Chain, DL, VReg, VA.getLocVT()); 621 622 // Get the high bits for i32 struct elements. 623 if (VA.getValVT() == MVT::i32 && VA.needsCustom()) 624 Arg = DAG.getNode(ISD::SRL, DL, VA.getLocVT(), Arg, 625 DAG.getConstant(32, DL, MVT::i32)); 626 627 // The caller promoted the argument, so insert an Assert?ext SDNode so we 628 // won't promote the value again in this function. 629 switch (VA.getLocInfo()) { 630 case CCValAssign::SExt: 631 Arg = DAG.getNode(ISD::AssertSext, DL, VA.getLocVT(), Arg, 632 DAG.getValueType(VA.getValVT())); 633 break; 634 case CCValAssign::ZExt: 635 Arg = DAG.getNode(ISD::AssertZext, DL, VA.getLocVT(), Arg, 636 DAG.getValueType(VA.getValVT())); 637 break; 638 default: 639 break; 640 } 641 642 // Truncate the register down to the argument type. 643 if (VA.isExtInLoc()) 644 Arg = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), Arg); 645 646 InVals.push_back(Arg); 647 continue; 648 } 649 650 // The registers are exhausted. This argument was passed on the stack. 651 assert(VA.isMemLoc()); 652 // The CC_Sparc64_Full/Half functions compute stack offsets relative to the 653 // beginning of the arguments area at %fp+BIAS+128. 654 unsigned Offset = VA.getLocMemOffset() + ArgArea; 655 unsigned ValSize = VA.getValVT().getSizeInBits() / 8; 656 // Adjust offset for extended arguments, SPARC is big-endian. 657 // The caller will have written the full slot with extended bytes, but we 658 // prefer our own extending loads. 659 if (VA.isExtInLoc()) 660 Offset += 8 - ValSize; 661 int FI = MF.getFrameInfo()->CreateFixedObject(ValSize, Offset, true); 662 InVals.push_back(DAG.getLoad( 663 VA.getValVT(), DL, Chain, 664 DAG.getFrameIndex(FI, getPointerTy(MF.getDataLayout())), 665 MachinePointerInfo::getFixedStack(MF, FI), false, false, false, 0)); 666 } 667 668 if (!IsVarArg) 669 return Chain; 670 671 // This function takes variable arguments, some of which may have been passed 672 // in registers %i0-%i5. Variable floating point arguments are never passed 673 // in floating point registers. They go on %i0-%i5 or on the stack like 674 // integer arguments. 675 // 676 // The va_start intrinsic needs to know the offset to the first variable 677 // argument. 678 unsigned ArgOffset = CCInfo.getNextStackOffset(); 679 SparcMachineFunctionInfo *FuncInfo = MF.getInfo<SparcMachineFunctionInfo>(); 680 // Skip the 128 bytes of register save area. 681 FuncInfo->setVarArgsFrameOffset(ArgOffset + ArgArea + 682 Subtarget->getStackPointerBias()); 683 684 // Save the variable arguments that were passed in registers. 685 // The caller is required to reserve stack space for 6 arguments regardless 686 // of how many arguments were actually passed. 687 SmallVector<SDValue, 8> OutChains; 688 for (; ArgOffset < 6*8; ArgOffset += 8) { 689 unsigned VReg = MF.addLiveIn(SP::I0 + ArgOffset/8, &SP::I64RegsRegClass); 690 SDValue VArg = DAG.getCopyFromReg(Chain, DL, VReg, MVT::i64); 691 int FI = MF.getFrameInfo()->CreateFixedObject(8, ArgOffset + ArgArea, true); 692 auto PtrVT = getPointerTy(MF.getDataLayout()); 693 OutChains.push_back(DAG.getStore( 694 Chain, DL, VArg, DAG.getFrameIndex(FI, PtrVT), 695 MachinePointerInfo::getFixedStack(MF, FI), false, false, 0)); 696 } 697 698 if (!OutChains.empty()) 699 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, OutChains); 700 701 return Chain; 702 } 703 704 SDValue 705 SparcTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, 706 SmallVectorImpl<SDValue> &InVals) const { 707 if (Subtarget->is64Bit()) 708 return LowerCall_64(CLI, InVals); 709 return LowerCall_32(CLI, InVals); 710 } 711 712 static bool hasReturnsTwiceAttr(SelectionDAG &DAG, SDValue Callee, 713 ImmutableCallSite *CS) { 714 if (CS) 715 return CS->hasFnAttr(Attribute::ReturnsTwice); 716 717 const Function *CalleeFn = nullptr; 718 if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { 719 CalleeFn = dyn_cast<Function>(G->getGlobal()); 720 } else if (ExternalSymbolSDNode *E = 721 dyn_cast<ExternalSymbolSDNode>(Callee)) { 722 const Function *Fn = DAG.getMachineFunction().getFunction(); 723 const Module *M = Fn->getParent(); 724 const char *CalleeName = E->getSymbol(); 725 CalleeFn = M->getFunction(CalleeName); 726 } 727 728 if (!CalleeFn) 729 return false; 730 return CalleeFn->hasFnAttribute(Attribute::ReturnsTwice); 731 } 732 733 // Lower a call for the 32-bit ABI. 734 SDValue 735 SparcTargetLowering::LowerCall_32(TargetLowering::CallLoweringInfo &CLI, 736 SmallVectorImpl<SDValue> &InVals) const { 737 SelectionDAG &DAG = CLI.DAG; 738 SDLoc &dl = CLI.DL; 739 SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs; 740 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals; 741 SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins; 742 SDValue Chain = CLI.Chain; 743 SDValue Callee = CLI.Callee; 744 bool &isTailCall = CLI.IsTailCall; 745 CallingConv::ID CallConv = CLI.CallConv; 746 bool isVarArg = CLI.IsVarArg; 747 748 // Sparc target does not yet support tail call optimization. 749 isTailCall = false; 750 751 // Analyze operands of the call, assigning locations to each operand. 752 SmallVector<CCValAssign, 16> ArgLocs; 753 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), ArgLocs, 754 *DAG.getContext()); 755 CCInfo.AnalyzeCallOperands(Outs, CC_Sparc32); 756 757 // Get the size of the outgoing arguments stack space requirement. 758 unsigned ArgsSize = CCInfo.getNextStackOffset(); 759 760 // Keep stack frames 8-byte aligned. 761 ArgsSize = (ArgsSize+7) & ~7; 762 763 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); 764 765 // Create local copies for byval args. 766 SmallVector<SDValue, 8> ByValArgs; 767 for (unsigned i = 0, e = Outs.size(); i != e; ++i) { 768 ISD::ArgFlagsTy Flags = Outs[i].Flags; 769 if (!Flags.isByVal()) 770 continue; 771 772 SDValue Arg = OutVals[i]; 773 unsigned Size = Flags.getByValSize(); 774 unsigned Align = Flags.getByValAlign(); 775 776 int FI = MFI->CreateStackObject(Size, Align, false); 777 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout())); 778 SDValue SizeNode = DAG.getConstant(Size, dl, MVT::i32); 779 780 Chain = DAG.getMemcpy(Chain, dl, FIPtr, Arg, SizeNode, Align, 781 false, // isVolatile, 782 (Size <= 32), // AlwaysInline if size <= 32, 783 false, // isTailCall 784 MachinePointerInfo(), MachinePointerInfo()); 785 ByValArgs.push_back(FIPtr); 786 } 787 788 Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(ArgsSize, dl, true), 789 dl); 790 791 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass; 792 SmallVector<SDValue, 8> MemOpChains; 793 794 const unsigned StackOffset = 92; 795 bool hasStructRetAttr = false; 796 // Walk the register/memloc assignments, inserting copies/loads. 797 for (unsigned i = 0, realArgIdx = 0, byvalArgIdx = 0, e = ArgLocs.size(); 798 i != e; 799 ++i, ++realArgIdx) { 800 CCValAssign &VA = ArgLocs[i]; 801 SDValue Arg = OutVals[realArgIdx]; 802 803 ISD::ArgFlagsTy Flags = Outs[realArgIdx].Flags; 804 805 // Use local copy if it is a byval arg. 806 if (Flags.isByVal()) 807 Arg = ByValArgs[byvalArgIdx++]; 808 809 // Promote the value if needed. 810 switch (VA.getLocInfo()) { 811 default: llvm_unreachable("Unknown loc info!"); 812 case CCValAssign::Full: break; 813 case CCValAssign::SExt: 814 Arg = DAG.getNode(ISD::SIGN_EXTEND, dl, VA.getLocVT(), Arg); 815 break; 816 case CCValAssign::ZExt: 817 Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, VA.getLocVT(), Arg); 818 break; 819 case CCValAssign::AExt: 820 Arg = DAG.getNode(ISD::ANY_EXTEND, dl, VA.getLocVT(), Arg); 821 break; 822 case CCValAssign::BCvt: 823 Arg = DAG.getNode(ISD::BITCAST, dl, VA.getLocVT(), Arg); 824 break; 825 } 826 827 if (Flags.isSRet()) { 828 assert(VA.needsCustom()); 829 // store SRet argument in %sp+64 830 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32); 831 SDValue PtrOff = DAG.getIntPtrConstant(64, dl); 832 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff); 833 MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff, 834 MachinePointerInfo(), 835 false, false, 0)); 836 hasStructRetAttr = true; 837 continue; 838 } 839 840 if (VA.needsCustom()) { 841 assert(VA.getLocVT() == MVT::f64 || VA.getLocVT() == MVT::v2i32); 842 843 if (VA.isMemLoc()) { 844 unsigned Offset = VA.getLocMemOffset() + StackOffset; 845 // if it is double-word aligned, just store. 846 if (Offset % 8 == 0) { 847 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32); 848 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl); 849 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff); 850 MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff, 851 MachinePointerInfo(), 852 false, false, 0)); 853 continue; 854 } 855 } 856 857 if (VA.getLocVT() == MVT::f64) { 858 // Move from the float value from float registers into the 859 // integer registers. 860 861 // TODO: The f64 -> v2i32 conversion is super-inefficient for 862 // constants: it sticks them in the constant pool, then loads 863 // to a fp register, then stores to temp memory, then loads to 864 // integer registers. 865 Arg = DAG.getNode(ISD::BITCAST, dl, MVT::v2i32, Arg); 866 } 867 868 SDValue Part0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32, 869 Arg, 870 DAG.getConstant(0, dl, getVectorIdxTy(DAG.getDataLayout()))); 871 SDValue Part1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32, 872 Arg, 873 DAG.getConstant(1, dl, getVectorIdxTy(DAG.getDataLayout()))); 874 875 if (VA.isRegLoc()) { 876 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Part0)); 877 assert(i+1 != e); 878 CCValAssign &NextVA = ArgLocs[++i]; 879 if (NextVA.isRegLoc()) { 880 RegsToPass.push_back(std::make_pair(NextVA.getLocReg(), Part1)); 881 } else { 882 // Store the second part in stack. 883 unsigned Offset = NextVA.getLocMemOffset() + StackOffset; 884 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32); 885 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl); 886 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff); 887 MemOpChains.push_back(DAG.getStore(Chain, dl, Part1, PtrOff, 888 MachinePointerInfo(), 889 false, false, 0)); 890 } 891 } else { 892 unsigned Offset = VA.getLocMemOffset() + StackOffset; 893 // Store the first part. 894 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32); 895 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl); 896 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff); 897 MemOpChains.push_back(DAG.getStore(Chain, dl, Part0, PtrOff, 898 MachinePointerInfo(), 899 false, false, 0)); 900 // Store the second part. 901 PtrOff = DAG.getIntPtrConstant(Offset + 4, dl); 902 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff); 903 MemOpChains.push_back(DAG.getStore(Chain, dl, Part1, PtrOff, 904 MachinePointerInfo(), 905 false, false, 0)); 906 } 907 continue; 908 } 909 910 // Arguments that can be passed on register must be kept at 911 // RegsToPass vector 912 if (VA.isRegLoc()) { 913 if (VA.getLocVT() != MVT::f32) { 914 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg)); 915 continue; 916 } 917 Arg = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Arg); 918 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg)); 919 continue; 920 } 921 922 assert(VA.isMemLoc()); 923 924 // Create a store off the stack pointer for this argument. 925 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32); 926 SDValue PtrOff = DAG.getIntPtrConstant(VA.getLocMemOffset() + StackOffset, 927 dl); 928 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff); 929 MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff, 930 MachinePointerInfo(), 931 false, false, 0)); 932 } 933 934 935 // Emit all stores, make sure the occur before any copies into physregs. 936 if (!MemOpChains.empty()) 937 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, MemOpChains); 938 939 // Build a sequence of copy-to-reg nodes chained together with token 940 // chain and flag operands which copy the outgoing args into registers. 941 // The InFlag in necessary since all emitted instructions must be 942 // stuck together. 943 SDValue InFlag; 944 for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) { 945 unsigned Reg = toCallerWindow(RegsToPass[i].first); 946 Chain = DAG.getCopyToReg(Chain, dl, Reg, RegsToPass[i].second, InFlag); 947 InFlag = Chain.getValue(1); 948 } 949 950 unsigned SRetArgSize = (hasStructRetAttr)? getSRetArgSize(DAG, Callee):0; 951 bool hasReturnsTwice = hasReturnsTwiceAttr(DAG, Callee, CLI.CS); 952 953 // If the callee is a GlobalAddress node (quite common, every direct call is) 954 // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. 955 // Likewise ExternalSymbol -> TargetExternalSymbol. 956 unsigned TF = ((getTargetMachine().getRelocationModel() == Reloc::PIC_) 957 ? SparcMCExpr::VK_Sparc_WPLT30 : 0); 958 if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) 959 Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, MVT::i32, 0, TF); 960 else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee)) 961 Callee = DAG.getTargetExternalSymbol(E->getSymbol(), MVT::i32, TF); 962 963 // Returns a chain & a flag for retval copy to use 964 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue); 965 SmallVector<SDValue, 8> Ops; 966 Ops.push_back(Chain); 967 Ops.push_back(Callee); 968 if (hasStructRetAttr) 969 Ops.push_back(DAG.getTargetConstant(SRetArgSize, dl, MVT::i32)); 970 for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) 971 Ops.push_back(DAG.getRegister(toCallerWindow(RegsToPass[i].first), 972 RegsToPass[i].second.getValueType())); 973 974 // Add a register mask operand representing the call-preserved registers. 975 const SparcRegisterInfo *TRI = Subtarget->getRegisterInfo(); 976 const uint32_t *Mask = 977 ((hasReturnsTwice) 978 ? TRI->getRTCallPreservedMask(CallConv) 979 : TRI->getCallPreservedMask(DAG.getMachineFunction(), CallConv)); 980 assert(Mask && "Missing call preserved mask for calling convention"); 981 Ops.push_back(DAG.getRegisterMask(Mask)); 982 983 if (InFlag.getNode()) 984 Ops.push_back(InFlag); 985 986 Chain = DAG.getNode(SPISD::CALL, dl, NodeTys, Ops); 987 InFlag = Chain.getValue(1); 988 989 Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(ArgsSize, dl, true), 990 DAG.getIntPtrConstant(0, dl, true), InFlag, dl); 991 InFlag = Chain.getValue(1); 992 993 // Assign locations to each value returned by this call. 994 SmallVector<CCValAssign, 16> RVLocs; 995 CCState RVInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs, 996 *DAG.getContext()); 997 998 RVInfo.AnalyzeCallResult(Ins, RetCC_Sparc32); 999 1000 // Copy all of the result registers out of their specified physreg. 1001 for (unsigned i = 0; i != RVLocs.size(); ++i) { 1002 if (RVLocs[i].getLocVT() == MVT::v2i32) { 1003 SDValue Vec = DAG.getNode(ISD::UNDEF, dl, MVT::v2i32); 1004 SDValue Lo = DAG.getCopyFromReg( 1005 Chain, dl, toCallerWindow(RVLocs[i++].getLocReg()), MVT::i32, InFlag); 1006 Chain = Lo.getValue(1); 1007 InFlag = Lo.getValue(2); 1008 Vec = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v2i32, Vec, Lo, 1009 DAG.getConstant(0, dl, MVT::i32)); 1010 SDValue Hi = DAG.getCopyFromReg( 1011 Chain, dl, toCallerWindow(RVLocs[i].getLocReg()), MVT::i32, InFlag); 1012 Chain = Hi.getValue(1); 1013 InFlag = Hi.getValue(2); 1014 Vec = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v2i32, Vec, Hi, 1015 DAG.getConstant(1, dl, MVT::i32)); 1016 InVals.push_back(Vec); 1017 } else { 1018 Chain = 1019 DAG.getCopyFromReg(Chain, dl, toCallerWindow(RVLocs[i].getLocReg()), 1020 RVLocs[i].getValVT(), InFlag) 1021 .getValue(1); 1022 InFlag = Chain.getValue(2); 1023 InVals.push_back(Chain.getValue(0)); 1024 } 1025 } 1026 1027 return Chain; 1028 } 1029 1030 // This functions returns true if CalleeName is a ABI function that returns 1031 // a long double (fp128). 1032 static bool isFP128ABICall(const char *CalleeName) 1033 { 1034 static const char *const ABICalls[] = 1035 { "_Q_add", "_Q_sub", "_Q_mul", "_Q_div", 1036 "_Q_sqrt", "_Q_neg", 1037 "_Q_itoq", "_Q_stoq", "_Q_dtoq", "_Q_utoq", 1038 "_Q_lltoq", "_Q_ulltoq", 1039 nullptr 1040 }; 1041 for (const char * const *I = ABICalls; *I != nullptr; ++I) 1042 if (strcmp(CalleeName, *I) == 0) 1043 return true; 1044 return false; 1045 } 1046 1047 unsigned 1048 SparcTargetLowering::getSRetArgSize(SelectionDAG &DAG, SDValue Callee) const 1049 { 1050 const Function *CalleeFn = nullptr; 1051 if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { 1052 CalleeFn = dyn_cast<Function>(G->getGlobal()); 1053 } else if (ExternalSymbolSDNode *E = 1054 dyn_cast<ExternalSymbolSDNode>(Callee)) { 1055 const Function *Fn = DAG.getMachineFunction().getFunction(); 1056 const Module *M = Fn->getParent(); 1057 const char *CalleeName = E->getSymbol(); 1058 CalleeFn = M->getFunction(CalleeName); 1059 if (!CalleeFn && isFP128ABICall(CalleeName)) 1060 return 16; // Return sizeof(fp128) 1061 } 1062 1063 if (!CalleeFn) 1064 return 0; 1065 1066 // It would be nice to check for the sret attribute on CalleeFn here, 1067 // but since it is not part of the function type, any check will misfire. 1068 1069 PointerType *Ty = cast<PointerType>(CalleeFn->arg_begin()->getType()); 1070 Type *ElementTy = Ty->getElementType(); 1071 return DAG.getDataLayout().getTypeAllocSize(ElementTy); 1072 } 1073 1074 1075 // Fixup floating point arguments in the ... part of a varargs call. 1076 // 1077 // The SPARC v9 ABI requires that floating point arguments are treated the same 1078 // as integers when calling a varargs function. This does not apply to the 1079 // fixed arguments that are part of the function's prototype. 1080 // 1081 // This function post-processes a CCValAssign array created by 1082 // AnalyzeCallOperands(). 1083 static void fixupVariableFloatArgs(SmallVectorImpl<CCValAssign> &ArgLocs, 1084 ArrayRef<ISD::OutputArg> Outs) { 1085 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 1086 const CCValAssign &VA = ArgLocs[i]; 1087 MVT ValTy = VA.getLocVT(); 1088 // FIXME: What about f32 arguments? C promotes them to f64 when calling 1089 // varargs functions. 1090 if (!VA.isRegLoc() || (ValTy != MVT::f64 && ValTy != MVT::f128)) 1091 continue; 1092 // The fixed arguments to a varargs function still go in FP registers. 1093 if (Outs[VA.getValNo()].IsFixed) 1094 continue; 1095 1096 // This floating point argument should be reassigned. 1097 CCValAssign NewVA; 1098 1099 // Determine the offset into the argument array. 1100 unsigned firstReg = (ValTy == MVT::f64) ? SP::D0 : SP::Q0; 1101 unsigned argSize = (ValTy == MVT::f64) ? 8 : 16; 1102 unsigned Offset = argSize * (VA.getLocReg() - firstReg); 1103 assert(Offset < 16*8 && "Offset out of range, bad register enum?"); 1104 1105 if (Offset < 6*8) { 1106 // This argument should go in %i0-%i5. 1107 unsigned IReg = SP::I0 + Offset/8; 1108 if (ValTy == MVT::f64) 1109 // Full register, just bitconvert into i64. 1110 NewVA = CCValAssign::getReg(VA.getValNo(), VA.getValVT(), 1111 IReg, MVT::i64, CCValAssign::BCvt); 1112 else { 1113 assert(ValTy == MVT::f128 && "Unexpected type!"); 1114 // Full register, just bitconvert into i128 -- We will lower this into 1115 // two i64s in LowerCall_64. 1116 NewVA = CCValAssign::getCustomReg(VA.getValNo(), VA.getValVT(), 1117 IReg, MVT::i128, CCValAssign::BCvt); 1118 } 1119 } else { 1120 // This needs to go to memory, we're out of integer registers. 1121 NewVA = CCValAssign::getMem(VA.getValNo(), VA.getValVT(), 1122 Offset, VA.getLocVT(), VA.getLocInfo()); 1123 } 1124 ArgLocs[i] = NewVA; 1125 } 1126 } 1127 1128 // Lower a call for the 64-bit ABI. 1129 SDValue 1130 SparcTargetLowering::LowerCall_64(TargetLowering::CallLoweringInfo &CLI, 1131 SmallVectorImpl<SDValue> &InVals) const { 1132 SelectionDAG &DAG = CLI.DAG; 1133 SDLoc DL = CLI.DL; 1134 SDValue Chain = CLI.Chain; 1135 auto PtrVT = getPointerTy(DAG.getDataLayout()); 1136 1137 // Sparc target does not yet support tail call optimization. 1138 CLI.IsTailCall = false; 1139 1140 // Analyze operands of the call, assigning locations to each operand. 1141 SmallVector<CCValAssign, 16> ArgLocs; 1142 CCState CCInfo(CLI.CallConv, CLI.IsVarArg, DAG.getMachineFunction(), ArgLocs, 1143 *DAG.getContext()); 1144 CCInfo.AnalyzeCallOperands(CLI.Outs, CC_Sparc64); 1145 1146 // Get the size of the outgoing arguments stack space requirement. 1147 // The stack offset computed by CC_Sparc64 includes all arguments. 1148 // Called functions expect 6 argument words to exist in the stack frame, used 1149 // or not. 1150 unsigned ArgsSize = std::max(6*8u, CCInfo.getNextStackOffset()); 1151 1152 // Keep stack frames 16-byte aligned. 1153 ArgsSize = alignTo(ArgsSize, 16); 1154 1155 // Varargs calls require special treatment. 1156 if (CLI.IsVarArg) 1157 fixupVariableFloatArgs(ArgLocs, CLI.Outs); 1158 1159 // Adjust the stack pointer to make room for the arguments. 1160 // FIXME: Use hasReservedCallFrame to avoid %sp adjustments around all calls 1161 // with more than 6 arguments. 1162 Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(ArgsSize, DL, true), 1163 DL); 1164 1165 // Collect the set of registers to pass to the function and their values. 1166 // This will be emitted as a sequence of CopyToReg nodes glued to the call 1167 // instruction. 1168 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass; 1169 1170 // Collect chains from all the memory opeations that copy arguments to the 1171 // stack. They must follow the stack pointer adjustment above and precede the 1172 // call instruction itself. 1173 SmallVector<SDValue, 8> MemOpChains; 1174 1175 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 1176 const CCValAssign &VA = ArgLocs[i]; 1177 SDValue Arg = CLI.OutVals[i]; 1178 1179 // Promote the value if needed. 1180 switch (VA.getLocInfo()) { 1181 default: 1182 llvm_unreachable("Unknown location info!"); 1183 case CCValAssign::Full: 1184 break; 1185 case CCValAssign::SExt: 1186 Arg = DAG.getNode(ISD::SIGN_EXTEND, DL, VA.getLocVT(), Arg); 1187 break; 1188 case CCValAssign::ZExt: 1189 Arg = DAG.getNode(ISD::ZERO_EXTEND, DL, VA.getLocVT(), Arg); 1190 break; 1191 case CCValAssign::AExt: 1192 Arg = DAG.getNode(ISD::ANY_EXTEND, DL, VA.getLocVT(), Arg); 1193 break; 1194 case CCValAssign::BCvt: 1195 // fixupVariableFloatArgs() may create bitcasts from f128 to i128. But 1196 // SPARC does not support i128 natively. Lower it into two i64, see below. 1197 if (!VA.needsCustom() || VA.getValVT() != MVT::f128 1198 || VA.getLocVT() != MVT::i128) 1199 Arg = DAG.getNode(ISD::BITCAST, DL, VA.getLocVT(), Arg); 1200 break; 1201 } 1202 1203 if (VA.isRegLoc()) { 1204 if (VA.needsCustom() && VA.getValVT() == MVT::f128 1205 && VA.getLocVT() == MVT::i128) { 1206 // Store and reload into the interger register reg and reg+1. 1207 unsigned Offset = 8 * (VA.getLocReg() - SP::I0); 1208 unsigned StackOffset = Offset + Subtarget->getStackPointerBias() + 128; 1209 SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT); 1210 SDValue HiPtrOff = DAG.getIntPtrConstant(StackOffset, DL); 1211 HiPtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, HiPtrOff); 1212 SDValue LoPtrOff = DAG.getIntPtrConstant(StackOffset + 8, DL); 1213 LoPtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, LoPtrOff); 1214 1215 // Store to %sp+BIAS+128+Offset 1216 SDValue Store = DAG.getStore(Chain, DL, Arg, HiPtrOff, 1217 MachinePointerInfo(), 1218 false, false, 0); 1219 // Load into Reg and Reg+1 1220 SDValue Hi64 = DAG.getLoad(MVT::i64, DL, Store, HiPtrOff, 1221 MachinePointerInfo(), 1222 false, false, false, 0); 1223 SDValue Lo64 = DAG.getLoad(MVT::i64, DL, Store, LoPtrOff, 1224 MachinePointerInfo(), 1225 false, false, false, 0); 1226 RegsToPass.push_back(std::make_pair(toCallerWindow(VA.getLocReg()), 1227 Hi64)); 1228 RegsToPass.push_back(std::make_pair(toCallerWindow(VA.getLocReg()+1), 1229 Lo64)); 1230 continue; 1231 } 1232 1233 // The custom bit on an i32 return value indicates that it should be 1234 // passed in the high bits of the register. 1235 if (VA.getValVT() == MVT::i32 && VA.needsCustom()) { 1236 Arg = DAG.getNode(ISD::SHL, DL, MVT::i64, Arg, 1237 DAG.getConstant(32, DL, MVT::i32)); 1238 1239 // The next value may go in the low bits of the same register. 1240 // Handle both at once. 1241 if (i+1 < ArgLocs.size() && ArgLocs[i+1].isRegLoc() && 1242 ArgLocs[i+1].getLocReg() == VA.getLocReg()) { 1243 SDValue NV = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, 1244 CLI.OutVals[i+1]); 1245 Arg = DAG.getNode(ISD::OR, DL, MVT::i64, Arg, NV); 1246 // Skip the next value, it's already done. 1247 ++i; 1248 } 1249 } 1250 RegsToPass.push_back(std::make_pair(toCallerWindow(VA.getLocReg()), Arg)); 1251 continue; 1252 } 1253 1254 assert(VA.isMemLoc()); 1255 1256 // Create a store off the stack pointer for this argument. 1257 SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT); 1258 // The argument area starts at %fp+BIAS+128 in the callee frame, 1259 // %sp+BIAS+128 in ours. 1260 SDValue PtrOff = DAG.getIntPtrConstant(VA.getLocMemOffset() + 1261 Subtarget->getStackPointerBias() + 1262 128, DL); 1263 PtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, PtrOff); 1264 MemOpChains.push_back(DAG.getStore(Chain, DL, Arg, PtrOff, 1265 MachinePointerInfo(), 1266 false, false, 0)); 1267 } 1268 1269 // Emit all stores, make sure they occur before the call. 1270 if (!MemOpChains.empty()) 1271 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains); 1272 1273 // Build a sequence of CopyToReg nodes glued together with token chain and 1274 // glue operands which copy the outgoing args into registers. The InGlue is 1275 // necessary since all emitted instructions must be stuck together in order 1276 // to pass the live physical registers. 1277 SDValue InGlue; 1278 for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) { 1279 Chain = DAG.getCopyToReg(Chain, DL, 1280 RegsToPass[i].first, RegsToPass[i].second, InGlue); 1281 InGlue = Chain.getValue(1); 1282 } 1283 1284 // If the callee is a GlobalAddress node (quite common, every direct call is) 1285 // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. 1286 // Likewise ExternalSymbol -> TargetExternalSymbol. 1287 SDValue Callee = CLI.Callee; 1288 bool hasReturnsTwice = hasReturnsTwiceAttr(DAG, Callee, CLI.CS); 1289 unsigned TF = ((getTargetMachine().getRelocationModel() == Reloc::PIC_) 1290 ? SparcMCExpr::VK_Sparc_WPLT30 : 0); 1291 if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) 1292 Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL, PtrVT, 0, TF); 1293 else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee)) 1294 Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT, TF); 1295 1296 // Build the operands for the call instruction itself. 1297 SmallVector<SDValue, 8> Ops; 1298 Ops.push_back(Chain); 1299 Ops.push_back(Callee); 1300 for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) 1301 Ops.push_back(DAG.getRegister(RegsToPass[i].first, 1302 RegsToPass[i].second.getValueType())); 1303 1304 // Add a register mask operand representing the call-preserved registers. 1305 const SparcRegisterInfo *TRI = Subtarget->getRegisterInfo(); 1306 const uint32_t *Mask = 1307 ((hasReturnsTwice) ? TRI->getRTCallPreservedMask(CLI.CallConv) 1308 : TRI->getCallPreservedMask(DAG.getMachineFunction(), 1309 CLI.CallConv)); 1310 assert(Mask && "Missing call preserved mask for calling convention"); 1311 Ops.push_back(DAG.getRegisterMask(Mask)); 1312 1313 // Make sure the CopyToReg nodes are glued to the call instruction which 1314 // consumes the registers. 1315 if (InGlue.getNode()) 1316 Ops.push_back(InGlue); 1317 1318 // Now the call itself. 1319 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue); 1320 Chain = DAG.getNode(SPISD::CALL, DL, NodeTys, Ops); 1321 InGlue = Chain.getValue(1); 1322 1323 // Revert the stack pointer immediately after the call. 1324 Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(ArgsSize, DL, true), 1325 DAG.getIntPtrConstant(0, DL, true), InGlue, DL); 1326 InGlue = Chain.getValue(1); 1327 1328 // Now extract the return values. This is more or less the same as 1329 // LowerFormalArguments_64. 1330 1331 // Assign locations to each value returned by this call. 1332 SmallVector<CCValAssign, 16> RVLocs; 1333 CCState RVInfo(CLI.CallConv, CLI.IsVarArg, DAG.getMachineFunction(), RVLocs, 1334 *DAG.getContext()); 1335 1336 // Set inreg flag manually for codegen generated library calls that 1337 // return float. 1338 if (CLI.Ins.size() == 1 && CLI.Ins[0].VT == MVT::f32 && CLI.CS == nullptr) 1339 CLI.Ins[0].Flags.setInReg(); 1340 1341 RVInfo.AnalyzeCallResult(CLI.Ins, RetCC_Sparc64); 1342 1343 // Copy all of the result registers out of their specified physreg. 1344 for (unsigned i = 0; i != RVLocs.size(); ++i) { 1345 CCValAssign &VA = RVLocs[i]; 1346 unsigned Reg = toCallerWindow(VA.getLocReg()); 1347 1348 // When returning 'inreg {i32, i32 }', two consecutive i32 arguments can 1349 // reside in the same register in the high and low bits. Reuse the 1350 // CopyFromReg previous node to avoid duplicate copies. 1351 SDValue RV; 1352 if (RegisterSDNode *SrcReg = dyn_cast<RegisterSDNode>(Chain.getOperand(1))) 1353 if (SrcReg->getReg() == Reg && Chain->getOpcode() == ISD::CopyFromReg) 1354 RV = Chain.getValue(0); 1355 1356 // But usually we'll create a new CopyFromReg for a different register. 1357 if (!RV.getNode()) { 1358 RV = DAG.getCopyFromReg(Chain, DL, Reg, RVLocs[i].getLocVT(), InGlue); 1359 Chain = RV.getValue(1); 1360 InGlue = Chain.getValue(2); 1361 } 1362 1363 // Get the high bits for i32 struct elements. 1364 if (VA.getValVT() == MVT::i32 && VA.needsCustom()) 1365 RV = DAG.getNode(ISD::SRL, DL, VA.getLocVT(), RV, 1366 DAG.getConstant(32, DL, MVT::i32)); 1367 1368 // The callee promoted the return value, so insert an Assert?ext SDNode so 1369 // we won't promote the value again in this function. 1370 switch (VA.getLocInfo()) { 1371 case CCValAssign::SExt: 1372 RV = DAG.getNode(ISD::AssertSext, DL, VA.getLocVT(), RV, 1373 DAG.getValueType(VA.getValVT())); 1374 break; 1375 case CCValAssign::ZExt: 1376 RV = DAG.getNode(ISD::AssertZext, DL, VA.getLocVT(), RV, 1377 DAG.getValueType(VA.getValVT())); 1378 break; 1379 default: 1380 break; 1381 } 1382 1383 // Truncate the register down to the return value type. 1384 if (VA.isExtInLoc()) 1385 RV = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), RV); 1386 1387 InVals.push_back(RV); 1388 } 1389 1390 return Chain; 1391 } 1392 1393 //===----------------------------------------------------------------------===// 1394 // TargetLowering Implementation 1395 //===----------------------------------------------------------------------===// 1396 1397 TargetLowering::AtomicExpansionKind SparcTargetLowering::shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const { 1398 if (AI->getOperation() == AtomicRMWInst::Xchg && 1399 AI->getType()->getPrimitiveSizeInBits() == 32) 1400 return AtomicExpansionKind::None; // Uses xchg instruction 1401 1402 return AtomicExpansionKind::CmpXChg; 1403 } 1404 1405 /// IntCondCCodeToICC - Convert a DAG integer condition code to a SPARC ICC 1406 /// condition. 1407 static SPCC::CondCodes IntCondCCodeToICC(ISD::CondCode CC) { 1408 switch (CC) { 1409 default: llvm_unreachable("Unknown integer condition code!"); 1410 case ISD::SETEQ: return SPCC::ICC_E; 1411 case ISD::SETNE: return SPCC::ICC_NE; 1412 case ISD::SETLT: return SPCC::ICC_L; 1413 case ISD::SETGT: return SPCC::ICC_G; 1414 case ISD::SETLE: return SPCC::ICC_LE; 1415 case ISD::SETGE: return SPCC::ICC_GE; 1416 case ISD::SETULT: return SPCC::ICC_CS; 1417 case ISD::SETULE: return SPCC::ICC_LEU; 1418 case ISD::SETUGT: return SPCC::ICC_GU; 1419 case ISD::SETUGE: return SPCC::ICC_CC; 1420 } 1421 } 1422 1423 /// FPCondCCodeToFCC - Convert a DAG floatingp oint condition code to a SPARC 1424 /// FCC condition. 1425 static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondCode CC) { 1426 switch (CC) { 1427 default: llvm_unreachable("Unknown fp condition code!"); 1428 case ISD::SETEQ: 1429 case ISD::SETOEQ: return SPCC::FCC_E; 1430 case ISD::SETNE: 1431 case ISD::SETUNE: return SPCC::FCC_NE; 1432 case ISD::SETLT: 1433 case ISD::SETOLT: return SPCC::FCC_L; 1434 case ISD::SETGT: 1435 case ISD::SETOGT: return SPCC::FCC_G; 1436 case ISD::SETLE: 1437 case ISD::SETOLE: return SPCC::FCC_LE; 1438 case ISD::SETGE: 1439 case ISD::SETOGE: return SPCC::FCC_GE; 1440 case ISD::SETULT: return SPCC::FCC_UL; 1441 case ISD::SETULE: return SPCC::FCC_ULE; 1442 case ISD::SETUGT: return SPCC::FCC_UG; 1443 case ISD::SETUGE: return SPCC::FCC_UGE; 1444 case ISD::SETUO: return SPCC::FCC_U; 1445 case ISD::SETO: return SPCC::FCC_O; 1446 case ISD::SETONE: return SPCC::FCC_LG; 1447 case ISD::SETUEQ: return SPCC::FCC_UE; 1448 } 1449 } 1450 1451 SparcTargetLowering::SparcTargetLowering(TargetMachine &TM, 1452 const SparcSubtarget &STI) 1453 : TargetLowering(TM), Subtarget(&STI) { 1454 MVT PtrVT = MVT::getIntegerVT(8 * TM.getPointerSize()); 1455 1456 // Instructions which use registers as conditionals examine all the 1457 // bits (as does the pseudo SELECT_CC expansion). I don't think it 1458 // matters much whether it's ZeroOrOneBooleanContent, or 1459 // ZeroOrNegativeOneBooleanContent, so, arbitrarily choose the 1460 // former. 1461 setBooleanContents(ZeroOrOneBooleanContent); 1462 setBooleanVectorContents(ZeroOrOneBooleanContent); 1463 1464 // Set up the register classes. 1465 addRegisterClass(MVT::i32, &SP::IntRegsRegClass); 1466 addRegisterClass(MVT::f32, &SP::FPRegsRegClass); 1467 addRegisterClass(MVT::f64, &SP::DFPRegsRegClass); 1468 addRegisterClass(MVT::f128, &SP::QFPRegsRegClass); 1469 if (Subtarget->is64Bit()) { 1470 addRegisterClass(MVT::i64, &SP::I64RegsRegClass); 1471 } else { 1472 // On 32bit sparc, we define a double-register 32bit register 1473 // class, as well. This is modeled in LLVM as a 2-vector of i32. 1474 addRegisterClass(MVT::v2i32, &SP::IntPairRegClass); 1475 1476 // ...but almost all operations must be expanded, so set that as 1477 // the default. 1478 for (unsigned Op = 0; Op < ISD::BUILTIN_OP_END; ++Op) { 1479 setOperationAction(Op, MVT::v2i32, Expand); 1480 } 1481 // Truncating/extending stores/loads are also not supported. 1482 for (MVT VT : MVT::integer_vector_valuetypes()) { 1483 setLoadExtAction(ISD::SEXTLOAD, VT, MVT::v2i32, Expand); 1484 setLoadExtAction(ISD::ZEXTLOAD, VT, MVT::v2i32, Expand); 1485 setLoadExtAction(ISD::EXTLOAD, VT, MVT::v2i32, Expand); 1486 1487 setLoadExtAction(ISD::SEXTLOAD, MVT::v2i32, VT, Expand); 1488 setLoadExtAction(ISD::ZEXTLOAD, MVT::v2i32, VT, Expand); 1489 setLoadExtAction(ISD::EXTLOAD, MVT::v2i32, VT, Expand); 1490 1491 setTruncStoreAction(VT, MVT::v2i32, Expand); 1492 setTruncStoreAction(MVT::v2i32, VT, Expand); 1493 } 1494 // However, load and store *are* legal. 1495 setOperationAction(ISD::LOAD, MVT::v2i32, Legal); 1496 setOperationAction(ISD::STORE, MVT::v2i32, Legal); 1497 setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2i32, Legal); 1498 setOperationAction(ISD::BUILD_VECTOR, MVT::v2i32, Legal); 1499 1500 // And we need to promote i64 loads/stores into vector load/store 1501 setOperationAction(ISD::LOAD, MVT::i64, Custom); 1502 setOperationAction(ISD::STORE, MVT::i64, Custom); 1503 1504 // Sadly, this doesn't work: 1505 // AddPromotedToType(ISD::LOAD, MVT::i64, MVT::v2i32); 1506 // AddPromotedToType(ISD::STORE, MVT::i64, MVT::v2i32); 1507 } 1508 1509 // Turn FP extload into load/fextend 1510 for (MVT VT : MVT::fp_valuetypes()) { 1511 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f32, Expand); 1512 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f64, Expand); 1513 } 1514 1515 // Sparc doesn't have i1 sign extending load 1516 for (MVT VT : MVT::integer_valuetypes()) 1517 setLoadExtAction(ISD::SEXTLOAD, VT, MVT::i1, Promote); 1518 1519 // Turn FP truncstore into trunc + store. 1520 setTruncStoreAction(MVT::f64, MVT::f32, Expand); 1521 setTruncStoreAction(MVT::f128, MVT::f32, Expand); 1522 setTruncStoreAction(MVT::f128, MVT::f64, Expand); 1523 1524 // Custom legalize GlobalAddress nodes into LO/HI parts. 1525 setOperationAction(ISD::GlobalAddress, PtrVT, Custom); 1526 setOperationAction(ISD::GlobalTLSAddress, PtrVT, Custom); 1527 setOperationAction(ISD::ConstantPool, PtrVT, Custom); 1528 setOperationAction(ISD::BlockAddress, PtrVT, Custom); 1529 1530 // Sparc doesn't have sext_inreg, replace them with shl/sra 1531 setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Expand); 1532 setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8 , Expand); 1533 setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1 , Expand); 1534 1535 // Sparc has no REM or DIVREM operations. 1536 setOperationAction(ISD::UREM, MVT::i32, Expand); 1537 setOperationAction(ISD::SREM, MVT::i32, Expand); 1538 setOperationAction(ISD::SDIVREM, MVT::i32, Expand); 1539 setOperationAction(ISD::UDIVREM, MVT::i32, Expand); 1540 1541 // ... nor does SparcV9. 1542 if (Subtarget->is64Bit()) { 1543 setOperationAction(ISD::UREM, MVT::i64, Expand); 1544 setOperationAction(ISD::SREM, MVT::i64, Expand); 1545 setOperationAction(ISD::SDIVREM, MVT::i64, Expand); 1546 setOperationAction(ISD::UDIVREM, MVT::i64, Expand); 1547 } 1548 1549 // Custom expand fp<->sint 1550 setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom); 1551 setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom); 1552 setOperationAction(ISD::FP_TO_SINT, MVT::i64, Custom); 1553 setOperationAction(ISD::SINT_TO_FP, MVT::i64, Custom); 1554 1555 // Custom Expand fp<->uint 1556 setOperationAction(ISD::FP_TO_UINT, MVT::i32, Custom); 1557 setOperationAction(ISD::UINT_TO_FP, MVT::i32, Custom); 1558 setOperationAction(ISD::FP_TO_UINT, MVT::i64, Custom); 1559 setOperationAction(ISD::UINT_TO_FP, MVT::i64, Custom); 1560 1561 setOperationAction(ISD::BITCAST, MVT::f32, Expand); 1562 setOperationAction(ISD::BITCAST, MVT::i32, Expand); 1563 1564 // Sparc has no select or setcc: expand to SELECT_CC. 1565 setOperationAction(ISD::SELECT, MVT::i32, Expand); 1566 setOperationAction(ISD::SELECT, MVT::f32, Expand); 1567 setOperationAction(ISD::SELECT, MVT::f64, Expand); 1568 setOperationAction(ISD::SELECT, MVT::f128, Expand); 1569 1570 setOperationAction(ISD::SETCC, MVT::i32, Expand); 1571 setOperationAction(ISD::SETCC, MVT::f32, Expand); 1572 setOperationAction(ISD::SETCC, MVT::f64, Expand); 1573 setOperationAction(ISD::SETCC, MVT::f128, Expand); 1574 1575 // Sparc doesn't have BRCOND either, it has BR_CC. 1576 setOperationAction(ISD::BRCOND, MVT::Other, Expand); 1577 setOperationAction(ISD::BRIND, MVT::Other, Expand); 1578 setOperationAction(ISD::BR_JT, MVT::Other, Expand); 1579 setOperationAction(ISD::BR_CC, MVT::i32, Custom); 1580 setOperationAction(ISD::BR_CC, MVT::f32, Custom); 1581 setOperationAction(ISD::BR_CC, MVT::f64, Custom); 1582 setOperationAction(ISD::BR_CC, MVT::f128, Custom); 1583 1584 setOperationAction(ISD::SELECT_CC, MVT::i32, Custom); 1585 setOperationAction(ISD::SELECT_CC, MVT::f32, Custom); 1586 setOperationAction(ISD::SELECT_CC, MVT::f64, Custom); 1587 setOperationAction(ISD::SELECT_CC, MVT::f128, Custom); 1588 1589 if (Subtarget->is64Bit()) { 1590 setOperationAction(ISD::ADDC, MVT::i64, Custom); 1591 setOperationAction(ISD::ADDE, MVT::i64, Custom); 1592 setOperationAction(ISD::SUBC, MVT::i64, Custom); 1593 setOperationAction(ISD::SUBE, MVT::i64, Custom); 1594 setOperationAction(ISD::BITCAST, MVT::f64, Expand); 1595 setOperationAction(ISD::BITCAST, MVT::i64, Expand); 1596 setOperationAction(ISD::SELECT, MVT::i64, Expand); 1597 setOperationAction(ISD::SETCC, MVT::i64, Expand); 1598 setOperationAction(ISD::BR_CC, MVT::i64, Custom); 1599 setOperationAction(ISD::SELECT_CC, MVT::i64, Custom); 1600 1601 setOperationAction(ISD::CTPOP, MVT::i64, 1602 Subtarget->usePopc() ? Legal : Expand); 1603 setOperationAction(ISD::CTTZ , MVT::i64, Expand); 1604 setOperationAction(ISD::CTLZ , MVT::i64, Expand); 1605 setOperationAction(ISD::BSWAP, MVT::i64, Expand); 1606 setOperationAction(ISD::ROTL , MVT::i64, Expand); 1607 setOperationAction(ISD::ROTR , MVT::i64, Expand); 1608 setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Custom); 1609 } 1610 1611 // ATOMICs. 1612 // Atomics are only supported on Sparcv9. (32bit atomics are also 1613 // supported by the Leon sparcv8 variant, but we don't support that 1614 // yet.) 1615 if (Subtarget->isV9()) 1616 setMaxAtomicSizeInBitsSupported(64); 1617 else 1618 setMaxAtomicSizeInBitsSupported(0); 1619 1620 setOperationAction(ISD::ATOMIC_SWAP, MVT::i32, Legal); 1621 setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i32, 1622 (Subtarget->isV9() ? Legal: Expand)); 1623 1624 1625 setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Legal); 1626 1627 // Custom Lower Atomic LOAD/STORE 1628 setOperationAction(ISD::ATOMIC_LOAD, MVT::i32, Custom); 1629 setOperationAction(ISD::ATOMIC_STORE, MVT::i32, Custom); 1630 1631 if (Subtarget->is64Bit()) { 1632 setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i64, Legal); 1633 setOperationAction(ISD::ATOMIC_SWAP, MVT::i64, Legal); 1634 setOperationAction(ISD::ATOMIC_LOAD, MVT::i64, Custom); 1635 setOperationAction(ISD::ATOMIC_STORE, MVT::i64, Custom); 1636 } 1637 1638 if (!Subtarget->isV9()) { 1639 // SparcV8 does not have FNEGD and FABSD. 1640 setOperationAction(ISD::FNEG, MVT::f64, Custom); 1641 setOperationAction(ISD::FABS, MVT::f64, Custom); 1642 } 1643 1644 setOperationAction(ISD::FSIN , MVT::f128, Expand); 1645 setOperationAction(ISD::FCOS , MVT::f128, Expand); 1646 setOperationAction(ISD::FSINCOS, MVT::f128, Expand); 1647 setOperationAction(ISD::FREM , MVT::f128, Expand); 1648 setOperationAction(ISD::FMA , MVT::f128, Expand); 1649 setOperationAction(ISD::FSIN , MVT::f64, Expand); 1650 setOperationAction(ISD::FCOS , MVT::f64, Expand); 1651 setOperationAction(ISD::FSINCOS, MVT::f64, Expand); 1652 setOperationAction(ISD::FREM , MVT::f64, Expand); 1653 setOperationAction(ISD::FMA , MVT::f64, Expand); 1654 setOperationAction(ISD::FSIN , MVT::f32, Expand); 1655 setOperationAction(ISD::FCOS , MVT::f32, Expand); 1656 setOperationAction(ISD::FSINCOS, MVT::f32, Expand); 1657 setOperationAction(ISD::FREM , MVT::f32, Expand); 1658 setOperationAction(ISD::FMA , MVT::f32, Expand); 1659 setOperationAction(ISD::CTTZ , MVT::i32, Expand); 1660 setOperationAction(ISD::CTLZ , MVT::i32, Expand); 1661 setOperationAction(ISD::ROTL , MVT::i32, Expand); 1662 setOperationAction(ISD::ROTR , MVT::i32, Expand); 1663 setOperationAction(ISD::BSWAP, MVT::i32, Expand); 1664 setOperationAction(ISD::FCOPYSIGN, MVT::f128, Expand); 1665 setOperationAction(ISD::FCOPYSIGN, MVT::f64, Expand); 1666 setOperationAction(ISD::FCOPYSIGN, MVT::f32, Expand); 1667 setOperationAction(ISD::FPOW , MVT::f128, Expand); 1668 setOperationAction(ISD::FPOW , MVT::f64, Expand); 1669 setOperationAction(ISD::FPOW , MVT::f32, Expand); 1670 1671 setOperationAction(ISD::SHL_PARTS, MVT::i32, Expand); 1672 setOperationAction(ISD::SRA_PARTS, MVT::i32, Expand); 1673 setOperationAction(ISD::SRL_PARTS, MVT::i32, Expand); 1674 1675 // FIXME: Sparc provides these multiplies, but we don't have them yet. 1676 setOperationAction(ISD::UMUL_LOHI, MVT::i32, Expand); 1677 setOperationAction(ISD::SMUL_LOHI, MVT::i32, Expand); 1678 1679 if (Subtarget->is64Bit()) { 1680 setOperationAction(ISD::UMUL_LOHI, MVT::i64, Expand); 1681 setOperationAction(ISD::SMUL_LOHI, MVT::i64, Expand); 1682 setOperationAction(ISD::MULHU, MVT::i64, Expand); 1683 setOperationAction(ISD::MULHS, MVT::i64, Expand); 1684 1685 setOperationAction(ISD::UMULO, MVT::i64, Custom); 1686 setOperationAction(ISD::SMULO, MVT::i64, Custom); 1687 1688 setOperationAction(ISD::SHL_PARTS, MVT::i64, Expand); 1689 setOperationAction(ISD::SRA_PARTS, MVT::i64, Expand); 1690 setOperationAction(ISD::SRL_PARTS, MVT::i64, Expand); 1691 } 1692 1693 // VASTART needs to be custom lowered to use the VarArgsFrameIndex. 1694 setOperationAction(ISD::VASTART , MVT::Other, Custom); 1695 // VAARG needs to be lowered to not do unaligned accesses for doubles. 1696 setOperationAction(ISD::VAARG , MVT::Other, Custom); 1697 1698 setOperationAction(ISD::TRAP , MVT::Other, Legal); 1699 1700 // Use the default implementation. 1701 setOperationAction(ISD::VACOPY , MVT::Other, Expand); 1702 setOperationAction(ISD::VAEND , MVT::Other, Expand); 1703 setOperationAction(ISD::STACKSAVE , MVT::Other, Expand); 1704 setOperationAction(ISD::STACKRESTORE , MVT::Other, Expand); 1705 setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32 , Custom); 1706 1707 setStackPointerRegisterToSaveRestore(SP::O6); 1708 1709 setOperationAction(ISD::CTPOP, MVT::i32, 1710 Subtarget->usePopc() ? Legal : Expand); 1711 1712 if (Subtarget->isV9() && Subtarget->hasHardQuad()) { 1713 setOperationAction(ISD::LOAD, MVT::f128, Legal); 1714 setOperationAction(ISD::STORE, MVT::f128, Legal); 1715 } else { 1716 setOperationAction(ISD::LOAD, MVT::f128, Custom); 1717 setOperationAction(ISD::STORE, MVT::f128, Custom); 1718 } 1719 1720 if (Subtarget->hasHardQuad()) { 1721 setOperationAction(ISD::FADD, MVT::f128, Legal); 1722 setOperationAction(ISD::FSUB, MVT::f128, Legal); 1723 setOperationAction(ISD::FMUL, MVT::f128, Legal); 1724 setOperationAction(ISD::FDIV, MVT::f128, Legal); 1725 setOperationAction(ISD::FSQRT, MVT::f128, Legal); 1726 setOperationAction(ISD::FP_EXTEND, MVT::f128, Legal); 1727 setOperationAction(ISD::FP_ROUND, MVT::f64, Legal); 1728 if (Subtarget->isV9()) { 1729 setOperationAction(ISD::FNEG, MVT::f128, Legal); 1730 setOperationAction(ISD::FABS, MVT::f128, Legal); 1731 } else { 1732 setOperationAction(ISD::FNEG, MVT::f128, Custom); 1733 setOperationAction(ISD::FABS, MVT::f128, Custom); 1734 } 1735 1736 if (!Subtarget->is64Bit()) { 1737 setLibcallName(RTLIB::FPTOSINT_F128_I64, "_Q_qtoll"); 1738 setLibcallName(RTLIB::FPTOUINT_F128_I64, "_Q_qtoull"); 1739 setLibcallName(RTLIB::SINTTOFP_I64_F128, "_Q_lltoq"); 1740 setLibcallName(RTLIB::UINTTOFP_I64_F128, "_Q_ulltoq"); 1741 } 1742 1743 } else { 1744 // Custom legalize f128 operations. 1745 1746 setOperationAction(ISD::FADD, MVT::f128, Custom); 1747 setOperationAction(ISD::FSUB, MVT::f128, Custom); 1748 setOperationAction(ISD::FMUL, MVT::f128, Custom); 1749 setOperationAction(ISD::FDIV, MVT::f128, Custom); 1750 setOperationAction(ISD::FSQRT, MVT::f128, Custom); 1751 setOperationAction(ISD::FNEG, MVT::f128, Custom); 1752 setOperationAction(ISD::FABS, MVT::f128, Custom); 1753 1754 setOperationAction(ISD::FP_EXTEND, MVT::f128, Custom); 1755 setOperationAction(ISD::FP_ROUND, MVT::f64, Custom); 1756 setOperationAction(ISD::FP_ROUND, MVT::f32, Custom); 1757 1758 // Setup Runtime library names. 1759 if (Subtarget->is64Bit()) { 1760 setLibcallName(RTLIB::ADD_F128, "_Qp_add"); 1761 setLibcallName(RTLIB::SUB_F128, "_Qp_sub"); 1762 setLibcallName(RTLIB::MUL_F128, "_Qp_mul"); 1763 setLibcallName(RTLIB::DIV_F128, "_Qp_div"); 1764 setLibcallName(RTLIB::SQRT_F128, "_Qp_sqrt"); 1765 setLibcallName(RTLIB::FPTOSINT_F128_I32, "_Qp_qtoi"); 1766 setLibcallName(RTLIB::FPTOUINT_F128_I32, "_Qp_qtoui"); 1767 setLibcallName(RTLIB::SINTTOFP_I32_F128, "_Qp_itoq"); 1768 setLibcallName(RTLIB::UINTTOFP_I32_F128, "_Qp_uitoq"); 1769 setLibcallName(RTLIB::FPTOSINT_F128_I64, "_Qp_qtox"); 1770 setLibcallName(RTLIB::FPTOUINT_F128_I64, "_Qp_qtoux"); 1771 setLibcallName(RTLIB::SINTTOFP_I64_F128, "_Qp_xtoq"); 1772 setLibcallName(RTLIB::UINTTOFP_I64_F128, "_Qp_uxtoq"); 1773 setLibcallName(RTLIB::FPEXT_F32_F128, "_Qp_stoq"); 1774 setLibcallName(RTLIB::FPEXT_F64_F128, "_Qp_dtoq"); 1775 setLibcallName(RTLIB::FPROUND_F128_F32, "_Qp_qtos"); 1776 setLibcallName(RTLIB::FPROUND_F128_F64, "_Qp_qtod"); 1777 } else { 1778 setLibcallName(RTLIB::ADD_F128, "_Q_add"); 1779 setLibcallName(RTLIB::SUB_F128, "_Q_sub"); 1780 setLibcallName(RTLIB::MUL_F128, "_Q_mul"); 1781 setLibcallName(RTLIB::DIV_F128, "_Q_div"); 1782 setLibcallName(RTLIB::SQRT_F128, "_Q_sqrt"); 1783 setLibcallName(RTLIB::FPTOSINT_F128_I32, "_Q_qtoi"); 1784 setLibcallName(RTLIB::FPTOUINT_F128_I32, "_Q_qtou"); 1785 setLibcallName(RTLIB::SINTTOFP_I32_F128, "_Q_itoq"); 1786 setLibcallName(RTLIB::UINTTOFP_I32_F128, "_Q_utoq"); 1787 setLibcallName(RTLIB::FPTOSINT_F128_I64, "_Q_qtoll"); 1788 setLibcallName(RTLIB::FPTOUINT_F128_I64, "_Q_qtoull"); 1789 setLibcallName(RTLIB::SINTTOFP_I64_F128, "_Q_lltoq"); 1790 setLibcallName(RTLIB::UINTTOFP_I64_F128, "_Q_ulltoq"); 1791 setLibcallName(RTLIB::FPEXT_F32_F128, "_Q_stoq"); 1792 setLibcallName(RTLIB::FPEXT_F64_F128, "_Q_dtoq"); 1793 setLibcallName(RTLIB::FPROUND_F128_F32, "_Q_qtos"); 1794 setLibcallName(RTLIB::FPROUND_F128_F64, "_Q_qtod"); 1795 } 1796 } 1797 1798 setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom); 1799 1800 setMinFunctionAlignment(2); 1801 1802 computeRegisterProperties(Subtarget->getRegisterInfo()); 1803 } 1804 1805 const char *SparcTargetLowering::getTargetNodeName(unsigned Opcode) const { 1806 switch ((SPISD::NodeType)Opcode) { 1807 case SPISD::FIRST_NUMBER: break; 1808 case SPISD::CMPICC: return "SPISD::CMPICC"; 1809 case SPISD::CMPFCC: return "SPISD::CMPFCC"; 1810 case SPISD::BRICC: return "SPISD::BRICC"; 1811 case SPISD::BRXCC: return "SPISD::BRXCC"; 1812 case SPISD::BRFCC: return "SPISD::BRFCC"; 1813 case SPISD::SELECT_ICC: return "SPISD::SELECT_ICC"; 1814 case SPISD::SELECT_XCC: return "SPISD::SELECT_XCC"; 1815 case SPISD::SELECT_FCC: return "SPISD::SELECT_FCC"; 1816 case SPISD::Hi: return "SPISD::Hi"; 1817 case SPISD::Lo: return "SPISD::Lo"; 1818 case SPISD::FTOI: return "SPISD::FTOI"; 1819 case SPISD::ITOF: return "SPISD::ITOF"; 1820 case SPISD::FTOX: return "SPISD::FTOX"; 1821 case SPISD::XTOF: return "SPISD::XTOF"; 1822 case SPISD::CALL: return "SPISD::CALL"; 1823 case SPISD::RET_FLAG: return "SPISD::RET_FLAG"; 1824 case SPISD::GLOBAL_BASE_REG: return "SPISD::GLOBAL_BASE_REG"; 1825 case SPISD::FLUSHW: return "SPISD::FLUSHW"; 1826 case SPISD::TLS_ADD: return "SPISD::TLS_ADD"; 1827 case SPISD::TLS_LD: return "SPISD::TLS_LD"; 1828 case SPISD::TLS_CALL: return "SPISD::TLS_CALL"; 1829 } 1830 return nullptr; 1831 } 1832 1833 EVT SparcTargetLowering::getSetCCResultType(const DataLayout &, LLVMContext &, 1834 EVT VT) const { 1835 if (!VT.isVector()) 1836 return MVT::i32; 1837 return VT.changeVectorElementTypeToInteger(); 1838 } 1839 1840 /// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to 1841 /// be zero. Op is expected to be a target specific node. Used by DAG 1842 /// combiner. 1843 void SparcTargetLowering::computeKnownBitsForTargetNode 1844 (const SDValue Op, 1845 APInt &KnownZero, 1846 APInt &KnownOne, 1847 const SelectionDAG &DAG, 1848 unsigned Depth) const { 1849 APInt KnownZero2, KnownOne2; 1850 KnownZero = KnownOne = APInt(KnownZero.getBitWidth(), 0); 1851 1852 switch (Op.getOpcode()) { 1853 default: break; 1854 case SPISD::SELECT_ICC: 1855 case SPISD::SELECT_XCC: 1856 case SPISD::SELECT_FCC: 1857 DAG.computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1); 1858 DAG.computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1); 1859 1860 // Only known if known in both the LHS and RHS. 1861 KnownOne &= KnownOne2; 1862 KnownZero &= KnownZero2; 1863 break; 1864 } 1865 } 1866 1867 // Look at LHS/RHS/CC and see if they are a lowered setcc instruction. If so 1868 // set LHS/RHS and SPCC to the LHS/RHS of the setcc and SPCC to the condition. 1869 static void LookThroughSetCC(SDValue &LHS, SDValue &RHS, 1870 ISD::CondCode CC, unsigned &SPCC) { 1871 if (isNullConstant(RHS) && 1872 CC == ISD::SETNE && 1873 (((LHS.getOpcode() == SPISD::SELECT_ICC || 1874 LHS.getOpcode() == SPISD::SELECT_XCC) && 1875 LHS.getOperand(3).getOpcode() == SPISD::CMPICC) || 1876 (LHS.getOpcode() == SPISD::SELECT_FCC && 1877 LHS.getOperand(3).getOpcode() == SPISD::CMPFCC)) && 1878 isOneConstant(LHS.getOperand(0)) && 1879 isNullConstant(LHS.getOperand(1))) { 1880 SDValue CMPCC = LHS.getOperand(3); 1881 SPCC = cast<ConstantSDNode>(LHS.getOperand(2))->getZExtValue(); 1882 LHS = CMPCC.getOperand(0); 1883 RHS = CMPCC.getOperand(1); 1884 } 1885 } 1886 1887 // Convert to a target node and set target flags. 1888 SDValue SparcTargetLowering::withTargetFlags(SDValue Op, unsigned TF, 1889 SelectionDAG &DAG) const { 1890 if (const GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Op)) 1891 return DAG.getTargetGlobalAddress(GA->getGlobal(), 1892 SDLoc(GA), 1893 GA->getValueType(0), 1894 GA->getOffset(), TF); 1895 1896 if (const ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(Op)) 1897 return DAG.getTargetConstantPool(CP->getConstVal(), 1898 CP->getValueType(0), 1899 CP->getAlignment(), 1900 CP->getOffset(), TF); 1901 1902 if (const BlockAddressSDNode *BA = dyn_cast<BlockAddressSDNode>(Op)) 1903 return DAG.getTargetBlockAddress(BA->getBlockAddress(), 1904 Op.getValueType(), 1905 0, 1906 TF); 1907 1908 if (const ExternalSymbolSDNode *ES = dyn_cast<ExternalSymbolSDNode>(Op)) 1909 return DAG.getTargetExternalSymbol(ES->getSymbol(), 1910 ES->getValueType(0), TF); 1911 1912 llvm_unreachable("Unhandled address SDNode"); 1913 } 1914 1915 // Split Op into high and low parts according to HiTF and LoTF. 1916 // Return an ADD node combining the parts. 1917 SDValue SparcTargetLowering::makeHiLoPair(SDValue Op, 1918 unsigned HiTF, unsigned LoTF, 1919 SelectionDAG &DAG) const { 1920 SDLoc DL(Op); 1921 EVT VT = Op.getValueType(); 1922 SDValue Hi = DAG.getNode(SPISD::Hi, DL, VT, withTargetFlags(Op, HiTF, DAG)); 1923 SDValue Lo = DAG.getNode(SPISD::Lo, DL, VT, withTargetFlags(Op, LoTF, DAG)); 1924 return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo); 1925 } 1926 1927 // Build SDNodes for producing an address from a GlobalAddress, ConstantPool, 1928 // or ExternalSymbol SDNode. 1929 SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const { 1930 SDLoc DL(Op); 1931 EVT VT = getPointerTy(DAG.getDataLayout()); 1932 1933 // Handle PIC mode first. 1934 if (getTargetMachine().getRelocationModel() == Reloc::PIC_) { 1935 // This is the pic32 code model, the GOT is known to be smaller than 4GB. 1936 SDValue HiLo = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_GOT22, 1937 SparcMCExpr::VK_Sparc_GOT10, DAG); 1938 SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, VT); 1939 SDValue AbsAddr = DAG.getNode(ISD::ADD, DL, VT, GlobalBase, HiLo); 1940 // GLOBAL_BASE_REG codegen'ed with call. Inform MFI that this 1941 // function has calls. 1942 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); 1943 MFI->setHasCalls(true); 1944 return DAG.getLoad(VT, DL, DAG.getEntryNode(), AbsAddr, 1945 MachinePointerInfo::getGOT(DAG.getMachineFunction()), 1946 false, false, false, 0); 1947 } 1948 1949 // This is one of the absolute code models. 1950 switch(getTargetMachine().getCodeModel()) { 1951 default: 1952 llvm_unreachable("Unsupported absolute code model"); 1953 case CodeModel::Small: 1954 // abs32. 1955 return makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HI, 1956 SparcMCExpr::VK_Sparc_LO, DAG); 1957 case CodeModel::Medium: { 1958 // abs44. 1959 SDValue H44 = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_H44, 1960 SparcMCExpr::VK_Sparc_M44, DAG); 1961 H44 = DAG.getNode(ISD::SHL, DL, VT, H44, DAG.getConstant(12, DL, MVT::i32)); 1962 SDValue L44 = withTargetFlags(Op, SparcMCExpr::VK_Sparc_L44, DAG); 1963 L44 = DAG.getNode(SPISD::Lo, DL, VT, L44); 1964 return DAG.getNode(ISD::ADD, DL, VT, H44, L44); 1965 } 1966 case CodeModel::Large: { 1967 // abs64. 1968 SDValue Hi = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HH, 1969 SparcMCExpr::VK_Sparc_HM, DAG); 1970 Hi = DAG.getNode(ISD::SHL, DL, VT, Hi, DAG.getConstant(32, DL, MVT::i32)); 1971 SDValue Lo = makeHiLoPair(Op, SparcMCExpr::VK_Sparc_HI, 1972 SparcMCExpr::VK_Sparc_LO, DAG); 1973 return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo); 1974 } 1975 } 1976 } 1977 1978 SDValue SparcTargetLowering::LowerGlobalAddress(SDValue Op, 1979 SelectionDAG &DAG) const { 1980 return makeAddress(Op, DAG); 1981 } 1982 1983 SDValue SparcTargetLowering::LowerConstantPool(SDValue Op, 1984 SelectionDAG &DAG) const { 1985 return makeAddress(Op, DAG); 1986 } 1987 1988 SDValue SparcTargetLowering::LowerBlockAddress(SDValue Op, 1989 SelectionDAG &DAG) const { 1990 return makeAddress(Op, DAG); 1991 } 1992 1993 SDValue SparcTargetLowering::LowerGlobalTLSAddress(SDValue Op, 1994 SelectionDAG &DAG) const { 1995 1996 GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op); 1997 if (DAG.getTarget().Options.EmulatedTLS) 1998 return LowerToTLSEmulatedModel(GA, DAG); 1999 2000 SDLoc DL(GA); 2001 const GlobalValue *GV = GA->getGlobal(); 2002 EVT PtrVT = getPointerTy(DAG.getDataLayout()); 2003 2004 TLSModel::Model model = getTargetMachine().getTLSModel(GV); 2005 2006 if (model == TLSModel::GeneralDynamic || model == TLSModel::LocalDynamic) { 2007 unsigned HiTF = ((model == TLSModel::GeneralDynamic) 2008 ? SparcMCExpr::VK_Sparc_TLS_GD_HI22 2009 : SparcMCExpr::VK_Sparc_TLS_LDM_HI22); 2010 unsigned LoTF = ((model == TLSModel::GeneralDynamic) 2011 ? SparcMCExpr::VK_Sparc_TLS_GD_LO10 2012 : SparcMCExpr::VK_Sparc_TLS_LDM_LO10); 2013 unsigned addTF = ((model == TLSModel::GeneralDynamic) 2014 ? SparcMCExpr::VK_Sparc_TLS_GD_ADD 2015 : SparcMCExpr::VK_Sparc_TLS_LDM_ADD); 2016 unsigned callTF = ((model == TLSModel::GeneralDynamic) 2017 ? SparcMCExpr::VK_Sparc_TLS_GD_CALL 2018 : SparcMCExpr::VK_Sparc_TLS_LDM_CALL); 2019 2020 SDValue HiLo = makeHiLoPair(Op, HiTF, LoTF, DAG); 2021 SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT); 2022 SDValue Argument = DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Base, HiLo, 2023 withTargetFlags(Op, addTF, DAG)); 2024 2025 SDValue Chain = DAG.getEntryNode(); 2026 SDValue InFlag; 2027 2028 Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(1, DL, true), DL); 2029 Chain = DAG.getCopyToReg(Chain, DL, SP::O0, Argument, InFlag); 2030 InFlag = Chain.getValue(1); 2031 SDValue Callee = DAG.getTargetExternalSymbol("__tls_get_addr", PtrVT); 2032 SDValue Symbol = withTargetFlags(Op, callTF, DAG); 2033 2034 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue); 2035 SmallVector<SDValue, 4> Ops; 2036 Ops.push_back(Chain); 2037 Ops.push_back(Callee); 2038 Ops.push_back(Symbol); 2039 Ops.push_back(DAG.getRegister(SP::O0, PtrVT)); 2040 const uint32_t *Mask = Subtarget->getRegisterInfo()->getCallPreservedMask( 2041 DAG.getMachineFunction(), CallingConv::C); 2042 assert(Mask && "Missing call preserved mask for calling convention"); 2043 Ops.push_back(DAG.getRegisterMask(Mask)); 2044 Ops.push_back(InFlag); 2045 Chain = DAG.getNode(SPISD::TLS_CALL, DL, NodeTys, Ops); 2046 InFlag = Chain.getValue(1); 2047 Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(1, DL, true), 2048 DAG.getIntPtrConstant(0, DL, true), InFlag, DL); 2049 InFlag = Chain.getValue(1); 2050 SDValue Ret = DAG.getCopyFromReg(Chain, DL, SP::O0, PtrVT, InFlag); 2051 2052 if (model != TLSModel::LocalDynamic) 2053 return Ret; 2054 2055 SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT, 2056 withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LDO_HIX22, DAG)); 2057 SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT, 2058 withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LDO_LOX10, DAG)); 2059 HiLo = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo); 2060 return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Ret, HiLo, 2061 withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LDO_ADD, DAG)); 2062 } 2063 2064 if (model == TLSModel::InitialExec) { 2065 unsigned ldTF = ((PtrVT == MVT::i64)? SparcMCExpr::VK_Sparc_TLS_IE_LDX 2066 : SparcMCExpr::VK_Sparc_TLS_IE_LD); 2067 2068 SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT); 2069 2070 // GLOBAL_BASE_REG codegen'ed with call. Inform MFI that this 2071 // function has calls. 2072 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); 2073 MFI->setHasCalls(true); 2074 2075 SDValue TGA = makeHiLoPair(Op, 2076 SparcMCExpr::VK_Sparc_TLS_IE_HI22, 2077 SparcMCExpr::VK_Sparc_TLS_IE_LO10, DAG); 2078 SDValue Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Base, TGA); 2079 SDValue Offset = DAG.getNode(SPISD::TLS_LD, 2080 DL, PtrVT, Ptr, 2081 withTargetFlags(Op, ldTF, DAG)); 2082 return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, 2083 DAG.getRegister(SP::G7, PtrVT), Offset, 2084 withTargetFlags(Op, 2085 SparcMCExpr::VK_Sparc_TLS_IE_ADD, DAG)); 2086 } 2087 2088 assert(model == TLSModel::LocalExec); 2089 SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT, 2090 withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LE_HIX22, DAG)); 2091 SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT, 2092 withTargetFlags(Op, SparcMCExpr::VK_Sparc_TLS_LE_LOX10, DAG)); 2093 SDValue Offset = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo); 2094 2095 return DAG.getNode(ISD::ADD, DL, PtrVT, 2096 DAG.getRegister(SP::G7, PtrVT), Offset); 2097 } 2098 2099 SDValue 2100 SparcTargetLowering::LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args, 2101 SDValue Arg, SDLoc DL, 2102 SelectionDAG &DAG) const { 2103 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); 2104 EVT ArgVT = Arg.getValueType(); 2105 Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext()); 2106 2107 ArgListEntry Entry; 2108 Entry.Node = Arg; 2109 Entry.Ty = ArgTy; 2110 2111 if (ArgTy->isFP128Ty()) { 2112 // Create a stack object and pass the pointer to the library function. 2113 int FI = MFI->CreateStackObject(16, 8, false); 2114 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout())); 2115 Chain = DAG.getStore(Chain, 2116 DL, 2117 Entry.Node, 2118 FIPtr, 2119 MachinePointerInfo(), 2120 false, 2121 false, 2122 8); 2123 2124 Entry.Node = FIPtr; 2125 Entry.Ty = PointerType::getUnqual(ArgTy); 2126 } 2127 Args.push_back(Entry); 2128 return Chain; 2129 } 2130 2131 SDValue 2132 SparcTargetLowering::LowerF128Op(SDValue Op, SelectionDAG &DAG, 2133 const char *LibFuncName, 2134 unsigned numArgs) const { 2135 2136 ArgListTy Args; 2137 2138 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); 2139 auto PtrVT = getPointerTy(DAG.getDataLayout()); 2140 2141 SDValue Callee = DAG.getExternalSymbol(LibFuncName, PtrVT); 2142 Type *RetTy = Op.getValueType().getTypeForEVT(*DAG.getContext()); 2143 Type *RetTyABI = RetTy; 2144 SDValue Chain = DAG.getEntryNode(); 2145 SDValue RetPtr; 2146 2147 if (RetTy->isFP128Ty()) { 2148 // Create a Stack Object to receive the return value of type f128. 2149 ArgListEntry Entry; 2150 int RetFI = MFI->CreateStackObject(16, 8, false); 2151 RetPtr = DAG.getFrameIndex(RetFI, PtrVT); 2152 Entry.Node = RetPtr; 2153 Entry.Ty = PointerType::getUnqual(RetTy); 2154 if (!Subtarget->is64Bit()) 2155 Entry.isSRet = true; 2156 Entry.isReturned = false; 2157 Args.push_back(Entry); 2158 RetTyABI = Type::getVoidTy(*DAG.getContext()); 2159 } 2160 2161 assert(Op->getNumOperands() >= numArgs && "Not enough operands!"); 2162 for (unsigned i = 0, e = numArgs; i != e; ++i) { 2163 Chain = LowerF128_LibCallArg(Chain, Args, Op.getOperand(i), SDLoc(Op), DAG); 2164 } 2165 TargetLowering::CallLoweringInfo CLI(DAG); 2166 CLI.setDebugLoc(SDLoc(Op)).setChain(Chain) 2167 .setCallee(CallingConv::C, RetTyABI, Callee, std::move(Args), 0); 2168 2169 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI); 2170 2171 // chain is in second result. 2172 if (RetTyABI == RetTy) 2173 return CallInfo.first; 2174 2175 assert (RetTy->isFP128Ty() && "Unexpected return type!"); 2176 2177 Chain = CallInfo.second; 2178 2179 // Load RetPtr to get the return value. 2180 return DAG.getLoad(Op.getValueType(), 2181 SDLoc(Op), 2182 Chain, 2183 RetPtr, 2184 MachinePointerInfo(), 2185 false, false, false, 8); 2186 } 2187 2188 SDValue 2189 SparcTargetLowering::LowerF128Compare(SDValue LHS, SDValue RHS, 2190 unsigned &SPCC, 2191 SDLoc DL, 2192 SelectionDAG &DAG) const { 2193 2194 const char *LibCall = nullptr; 2195 bool is64Bit = Subtarget->is64Bit(); 2196 switch(SPCC) { 2197 default: llvm_unreachable("Unhandled conditional code!"); 2198 case SPCC::FCC_E : LibCall = is64Bit? "_Qp_feq" : "_Q_feq"; break; 2199 case SPCC::FCC_NE : LibCall = is64Bit? "_Qp_fne" : "_Q_fne"; break; 2200 case SPCC::FCC_L : LibCall = is64Bit? "_Qp_flt" : "_Q_flt"; break; 2201 case SPCC::FCC_G : LibCall = is64Bit? "_Qp_fgt" : "_Q_fgt"; break; 2202 case SPCC::FCC_LE : LibCall = is64Bit? "_Qp_fle" : "_Q_fle"; break; 2203 case SPCC::FCC_GE : LibCall = is64Bit? "_Qp_fge" : "_Q_fge"; break; 2204 case SPCC::FCC_UL : 2205 case SPCC::FCC_ULE: 2206 case SPCC::FCC_UG : 2207 case SPCC::FCC_UGE: 2208 case SPCC::FCC_U : 2209 case SPCC::FCC_O : 2210 case SPCC::FCC_LG : 2211 case SPCC::FCC_UE : LibCall = is64Bit? "_Qp_cmp" : "_Q_cmp"; break; 2212 } 2213 2214 auto PtrVT = getPointerTy(DAG.getDataLayout()); 2215 SDValue Callee = DAG.getExternalSymbol(LibCall, PtrVT); 2216 Type *RetTy = Type::getInt32Ty(*DAG.getContext()); 2217 ArgListTy Args; 2218 SDValue Chain = DAG.getEntryNode(); 2219 Chain = LowerF128_LibCallArg(Chain, Args, LHS, DL, DAG); 2220 Chain = LowerF128_LibCallArg(Chain, Args, RHS, DL, DAG); 2221 2222 TargetLowering::CallLoweringInfo CLI(DAG); 2223 CLI.setDebugLoc(DL).setChain(Chain) 2224 .setCallee(CallingConv::C, RetTy, Callee, std::move(Args), 0); 2225 2226 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI); 2227 2228 // result is in first, and chain is in second result. 2229 SDValue Result = CallInfo.first; 2230 2231 switch(SPCC) { 2232 default: { 2233 SDValue RHS = DAG.getTargetConstant(0, DL, Result.getValueType()); 2234 SPCC = SPCC::ICC_NE; 2235 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2236 } 2237 case SPCC::FCC_UL : { 2238 SDValue Mask = DAG.getTargetConstant(1, DL, Result.getValueType()); 2239 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Mask); 2240 SDValue RHS = DAG.getTargetConstant(0, DL, Result.getValueType()); 2241 SPCC = SPCC::ICC_NE; 2242 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2243 } 2244 case SPCC::FCC_ULE: { 2245 SDValue RHS = DAG.getTargetConstant(2, DL, Result.getValueType()); 2246 SPCC = SPCC::ICC_NE; 2247 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2248 } 2249 case SPCC::FCC_UG : { 2250 SDValue RHS = DAG.getTargetConstant(1, DL, Result.getValueType()); 2251 SPCC = SPCC::ICC_G; 2252 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2253 } 2254 case SPCC::FCC_UGE: { 2255 SDValue RHS = DAG.getTargetConstant(1, DL, Result.getValueType()); 2256 SPCC = SPCC::ICC_NE; 2257 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2258 } 2259 2260 case SPCC::FCC_U : { 2261 SDValue RHS = DAG.getTargetConstant(3, DL, Result.getValueType()); 2262 SPCC = SPCC::ICC_E; 2263 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2264 } 2265 case SPCC::FCC_O : { 2266 SDValue RHS = DAG.getTargetConstant(3, DL, Result.getValueType()); 2267 SPCC = SPCC::ICC_NE; 2268 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2269 } 2270 case SPCC::FCC_LG : { 2271 SDValue Mask = DAG.getTargetConstant(3, DL, Result.getValueType()); 2272 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Mask); 2273 SDValue RHS = DAG.getTargetConstant(0, DL, Result.getValueType()); 2274 SPCC = SPCC::ICC_NE; 2275 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2276 } 2277 case SPCC::FCC_UE : { 2278 SDValue Mask = DAG.getTargetConstant(3, DL, Result.getValueType()); 2279 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Mask); 2280 SDValue RHS = DAG.getTargetConstant(0, DL, Result.getValueType()); 2281 SPCC = SPCC::ICC_E; 2282 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS); 2283 } 2284 } 2285 } 2286 2287 static SDValue 2288 LowerF128_FPEXTEND(SDValue Op, SelectionDAG &DAG, 2289 const SparcTargetLowering &TLI) { 2290 2291 if (Op.getOperand(0).getValueType() == MVT::f64) 2292 return TLI.LowerF128Op(Op, DAG, 2293 TLI.getLibcallName(RTLIB::FPEXT_F64_F128), 1); 2294 2295 if (Op.getOperand(0).getValueType() == MVT::f32) 2296 return TLI.LowerF128Op(Op, DAG, 2297 TLI.getLibcallName(RTLIB::FPEXT_F32_F128), 1); 2298 2299 llvm_unreachable("fpextend with non-float operand!"); 2300 return SDValue(); 2301 } 2302 2303 static SDValue 2304 LowerF128_FPROUND(SDValue Op, SelectionDAG &DAG, 2305 const SparcTargetLowering &TLI) { 2306 // FP_ROUND on f64 and f32 are legal. 2307 if (Op.getOperand(0).getValueType() != MVT::f128) 2308 return Op; 2309 2310 if (Op.getValueType() == MVT::f64) 2311 return TLI.LowerF128Op(Op, DAG, 2312 TLI.getLibcallName(RTLIB::FPROUND_F128_F64), 1); 2313 if (Op.getValueType() == MVT::f32) 2314 return TLI.LowerF128Op(Op, DAG, 2315 TLI.getLibcallName(RTLIB::FPROUND_F128_F32), 1); 2316 2317 llvm_unreachable("fpround to non-float!"); 2318 return SDValue(); 2319 } 2320 2321 static SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG, 2322 const SparcTargetLowering &TLI, 2323 bool hasHardQuad) { 2324 SDLoc dl(Op); 2325 EVT VT = Op.getValueType(); 2326 assert(VT == MVT::i32 || VT == MVT::i64); 2327 2328 // Expand f128 operations to fp128 abi calls. 2329 if (Op.getOperand(0).getValueType() == MVT::f128 2330 && (!hasHardQuad || !TLI.isTypeLegal(VT))) { 2331 const char *libName = TLI.getLibcallName(VT == MVT::i32 2332 ? RTLIB::FPTOSINT_F128_I32 2333 : RTLIB::FPTOSINT_F128_I64); 2334 return TLI.LowerF128Op(Op, DAG, libName, 1); 2335 } 2336 2337 // Expand if the resulting type is illegal. 2338 if (!TLI.isTypeLegal(VT)) 2339 return SDValue(); 2340 2341 // Otherwise, Convert the fp value to integer in an FP register. 2342 if (VT == MVT::i32) 2343 Op = DAG.getNode(SPISD::FTOI, dl, MVT::f32, Op.getOperand(0)); 2344 else 2345 Op = DAG.getNode(SPISD::FTOX, dl, MVT::f64, Op.getOperand(0)); 2346 2347 return DAG.getNode(ISD::BITCAST, dl, VT, Op); 2348 } 2349 2350 static SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG, 2351 const SparcTargetLowering &TLI, 2352 bool hasHardQuad) { 2353 SDLoc dl(Op); 2354 EVT OpVT = Op.getOperand(0).getValueType(); 2355 assert(OpVT == MVT::i32 || (OpVT == MVT::i64)); 2356 2357 EVT floatVT = (OpVT == MVT::i32) ? MVT::f32 : MVT::f64; 2358 2359 // Expand f128 operations to fp128 ABI calls. 2360 if (Op.getValueType() == MVT::f128 2361 && (!hasHardQuad || !TLI.isTypeLegal(OpVT))) { 2362 const char *libName = TLI.getLibcallName(OpVT == MVT::i32 2363 ? RTLIB::SINTTOFP_I32_F128 2364 : RTLIB::SINTTOFP_I64_F128); 2365 return TLI.LowerF128Op(Op, DAG, libName, 1); 2366 } 2367 2368 // Expand if the operand type is illegal. 2369 if (!TLI.isTypeLegal(OpVT)) 2370 return SDValue(); 2371 2372 // Otherwise, Convert the int value to FP in an FP register. 2373 SDValue Tmp = DAG.getNode(ISD::BITCAST, dl, floatVT, Op.getOperand(0)); 2374 unsigned opcode = (OpVT == MVT::i32)? SPISD::ITOF : SPISD::XTOF; 2375 return DAG.getNode(opcode, dl, Op.getValueType(), Tmp); 2376 } 2377 2378 static SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG, 2379 const SparcTargetLowering &TLI, 2380 bool hasHardQuad) { 2381 SDLoc dl(Op); 2382 EVT VT = Op.getValueType(); 2383 2384 // Expand if it does not involve f128 or the target has support for 2385 // quad floating point instructions and the resulting type is legal. 2386 if (Op.getOperand(0).getValueType() != MVT::f128 || 2387 (hasHardQuad && TLI.isTypeLegal(VT))) 2388 return SDValue(); 2389 2390 assert(VT == MVT::i32 || VT == MVT::i64); 2391 2392 return TLI.LowerF128Op(Op, DAG, 2393 TLI.getLibcallName(VT == MVT::i32 2394 ? RTLIB::FPTOUINT_F128_I32 2395 : RTLIB::FPTOUINT_F128_I64), 2396 1); 2397 } 2398 2399 static SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG, 2400 const SparcTargetLowering &TLI, 2401 bool hasHardQuad) { 2402 SDLoc dl(Op); 2403 EVT OpVT = Op.getOperand(0).getValueType(); 2404 assert(OpVT == MVT::i32 || OpVT == MVT::i64); 2405 2406 // Expand if it does not involve f128 or the target has support for 2407 // quad floating point instructions and the operand type is legal. 2408 if (Op.getValueType() != MVT::f128 || (hasHardQuad && TLI.isTypeLegal(OpVT))) 2409 return SDValue(); 2410 2411 return TLI.LowerF128Op(Op, DAG, 2412 TLI.getLibcallName(OpVT == MVT::i32 2413 ? RTLIB::UINTTOFP_I32_F128 2414 : RTLIB::UINTTOFP_I64_F128), 2415 1); 2416 } 2417 2418 static SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG, 2419 const SparcTargetLowering &TLI, 2420 bool hasHardQuad) { 2421 SDValue Chain = Op.getOperand(0); 2422 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(1))->get(); 2423 SDValue LHS = Op.getOperand(2); 2424 SDValue RHS = Op.getOperand(3); 2425 SDValue Dest = Op.getOperand(4); 2426 SDLoc dl(Op); 2427 unsigned Opc, SPCC = ~0U; 2428 2429 // If this is a br_cc of a "setcc", and if the setcc got lowered into 2430 // an CMP[IF]CC/SELECT_[IF]CC pair, find the original compared values. 2431 LookThroughSetCC(LHS, RHS, CC, SPCC); 2432 2433 // Get the condition flag. 2434 SDValue CompareFlag; 2435 if (LHS.getValueType().isInteger()) { 2436 CompareFlag = DAG.getNode(SPISD::CMPICC, dl, MVT::Glue, LHS, RHS); 2437 if (SPCC == ~0U) SPCC = IntCondCCodeToICC(CC); 2438 // 32-bit compares use the icc flags, 64-bit uses the xcc flags. 2439 Opc = LHS.getValueType() == MVT::i32 ? SPISD::BRICC : SPISD::BRXCC; 2440 } else { 2441 if (!hasHardQuad && LHS.getValueType() == MVT::f128) { 2442 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC); 2443 CompareFlag = TLI.LowerF128Compare(LHS, RHS, SPCC, dl, DAG); 2444 Opc = SPISD::BRICC; 2445 } else { 2446 CompareFlag = DAG.getNode(SPISD::CMPFCC, dl, MVT::Glue, LHS, RHS); 2447 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC); 2448 Opc = SPISD::BRFCC; 2449 } 2450 } 2451 return DAG.getNode(Opc, dl, MVT::Other, Chain, Dest, 2452 DAG.getConstant(SPCC, dl, MVT::i32), CompareFlag); 2453 } 2454 2455 static SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG, 2456 const SparcTargetLowering &TLI, 2457 bool hasHardQuad) { 2458 SDValue LHS = Op.getOperand(0); 2459 SDValue RHS = Op.getOperand(1); 2460 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get(); 2461 SDValue TrueVal = Op.getOperand(2); 2462 SDValue FalseVal = Op.getOperand(3); 2463 SDLoc dl(Op); 2464 unsigned Opc, SPCC = ~0U; 2465 2466 // If this is a select_cc of a "setcc", and if the setcc got lowered into 2467 // an CMP[IF]CC/SELECT_[IF]CC pair, find the original compared values. 2468 LookThroughSetCC(LHS, RHS, CC, SPCC); 2469 2470 SDValue CompareFlag; 2471 if (LHS.getValueType().isInteger()) { 2472 CompareFlag = DAG.getNode(SPISD::CMPICC, dl, MVT::Glue, LHS, RHS); 2473 Opc = LHS.getValueType() == MVT::i32 ? 2474 SPISD::SELECT_ICC : SPISD::SELECT_XCC; 2475 if (SPCC == ~0U) SPCC = IntCondCCodeToICC(CC); 2476 } else { 2477 if (!hasHardQuad && LHS.getValueType() == MVT::f128) { 2478 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC); 2479 CompareFlag = TLI.LowerF128Compare(LHS, RHS, SPCC, dl, DAG); 2480 Opc = SPISD::SELECT_ICC; 2481 } else { 2482 CompareFlag = DAG.getNode(SPISD::CMPFCC, dl, MVT::Glue, LHS, RHS); 2483 Opc = SPISD::SELECT_FCC; 2484 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC); 2485 } 2486 } 2487 return DAG.getNode(Opc, dl, TrueVal.getValueType(), TrueVal, FalseVal, 2488 DAG.getConstant(SPCC, dl, MVT::i32), CompareFlag); 2489 } 2490 2491 static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG, 2492 const SparcTargetLowering &TLI) { 2493 MachineFunction &MF = DAG.getMachineFunction(); 2494 SparcMachineFunctionInfo *FuncInfo = MF.getInfo<SparcMachineFunctionInfo>(); 2495 auto PtrVT = TLI.getPointerTy(DAG.getDataLayout()); 2496 2497 // Need frame address to find the address of VarArgsFrameIndex. 2498 MF.getFrameInfo()->setFrameAddressIsTaken(true); 2499 2500 // vastart just stores the address of the VarArgsFrameIndex slot into the 2501 // memory location argument. 2502 SDLoc DL(Op); 2503 SDValue Offset = 2504 DAG.getNode(ISD::ADD, DL, PtrVT, DAG.getRegister(SP::I6, PtrVT), 2505 DAG.getIntPtrConstant(FuncInfo->getVarArgsFrameOffset(), DL)); 2506 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue(); 2507 return DAG.getStore(Op.getOperand(0), DL, Offset, Op.getOperand(1), 2508 MachinePointerInfo(SV), false, false, 0); 2509 } 2510 2511 static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) { 2512 SDNode *Node = Op.getNode(); 2513 EVT VT = Node->getValueType(0); 2514 SDValue InChain = Node->getOperand(0); 2515 SDValue VAListPtr = Node->getOperand(1); 2516 EVT PtrVT = VAListPtr.getValueType(); 2517 const Value *SV = cast<SrcValueSDNode>(Node->getOperand(2))->getValue(); 2518 SDLoc DL(Node); 2519 SDValue VAList = DAG.getLoad(PtrVT, DL, InChain, VAListPtr, 2520 MachinePointerInfo(SV), false, false, false, 0); 2521 // Increment the pointer, VAList, to the next vaarg. 2522 SDValue NextPtr = DAG.getNode(ISD::ADD, DL, PtrVT, VAList, 2523 DAG.getIntPtrConstant(VT.getSizeInBits()/8, 2524 DL)); 2525 // Store the incremented VAList to the legalized pointer. 2526 InChain = DAG.getStore(VAList.getValue(1), DL, NextPtr, 2527 VAListPtr, MachinePointerInfo(SV), false, false, 0); 2528 // Load the actual argument out of the pointer VAList. 2529 // We can't count on greater alignment than the word size. 2530 return DAG.getLoad(VT, DL, InChain, VAList, MachinePointerInfo(), 2531 false, false, false, 2532 std::min(PtrVT.getSizeInBits(), VT.getSizeInBits())/8); 2533 } 2534 2535 static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG, 2536 const SparcSubtarget *Subtarget) { 2537 SDValue Chain = Op.getOperand(0); // Legalize the chain. 2538 SDValue Size = Op.getOperand(1); // Legalize the size. 2539 EVT VT = Size->getValueType(0); 2540 SDLoc dl(Op); 2541 2542 unsigned SPReg = SP::O6; 2543 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT); 2544 SDValue NewSP = DAG.getNode(ISD::SUB, dl, VT, SP, Size); // Value 2545 Chain = DAG.getCopyToReg(SP.getValue(1), dl, SPReg, NewSP); // Output chain 2546 2547 // The resultant pointer is actually 16 words from the bottom of the stack, 2548 // to provide a register spill area. 2549 unsigned regSpillArea = Subtarget->is64Bit() ? 128 : 96; 2550 regSpillArea += Subtarget->getStackPointerBias(); 2551 2552 SDValue NewVal = DAG.getNode(ISD::ADD, dl, VT, NewSP, 2553 DAG.getConstant(regSpillArea, dl, VT)); 2554 SDValue Ops[2] = { NewVal, Chain }; 2555 return DAG.getMergeValues(Ops, dl); 2556 } 2557 2558 2559 static SDValue getFLUSHW(SDValue Op, SelectionDAG &DAG) { 2560 SDLoc dl(Op); 2561 SDValue Chain = DAG.getNode(SPISD::FLUSHW, 2562 dl, MVT::Other, DAG.getEntryNode()); 2563 return Chain; 2564 } 2565 2566 static SDValue getFRAMEADDR(uint64_t depth, SDValue Op, SelectionDAG &DAG, 2567 const SparcSubtarget *Subtarget) { 2568 MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); 2569 MFI->setFrameAddressIsTaken(true); 2570 2571 EVT VT = Op.getValueType(); 2572 SDLoc dl(Op); 2573 unsigned FrameReg = SP::I6; 2574 unsigned stackBias = Subtarget->getStackPointerBias(); 2575 2576 SDValue FrameAddr; 2577 2578 if (depth == 0) { 2579 FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, VT); 2580 if (Subtarget->is64Bit()) 2581 FrameAddr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr, 2582 DAG.getIntPtrConstant(stackBias, dl)); 2583 return FrameAddr; 2584 } 2585 2586 // flush first to make sure the windowed registers' values are in stack 2587 SDValue Chain = getFLUSHW(Op, DAG); 2588 FrameAddr = DAG.getCopyFromReg(Chain, dl, FrameReg, VT); 2589 2590 unsigned Offset = (Subtarget->is64Bit()) ? (stackBias + 112) : 56; 2591 2592 while (depth--) { 2593 SDValue Ptr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr, 2594 DAG.getIntPtrConstant(Offset, dl)); 2595 FrameAddr = DAG.getLoad(VT, dl, Chain, Ptr, MachinePointerInfo(), 2596 false, false, false, 0); 2597 } 2598 if (Subtarget->is64Bit()) 2599 FrameAddr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr, 2600 DAG.getIntPtrConstant(stackBias, dl)); 2601 return FrameAddr; 2602 } 2603 2604 2605 static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG, 2606 const SparcSubtarget *Subtarget) { 2607 2608 uint64_t depth = Op.getConstantOperandVal(0); 2609 2610 return getFRAMEADDR(depth, Op, DAG, Subtarget); 2611 2612 } 2613 2614 static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG, 2615 const SparcTargetLowering &TLI, 2616 const SparcSubtarget *Subtarget) { 2617 MachineFunction &MF = DAG.getMachineFunction(); 2618 MachineFrameInfo *MFI = MF.getFrameInfo(); 2619 MFI->setReturnAddressIsTaken(true); 2620 2621 if (TLI.verifyReturnAddressArgumentIsConstant(Op, DAG)) 2622 return SDValue(); 2623 2624 EVT VT = Op.getValueType(); 2625 SDLoc dl(Op); 2626 uint64_t depth = Op.getConstantOperandVal(0); 2627 2628 SDValue RetAddr; 2629 if (depth == 0) { 2630 auto PtrVT = TLI.getPointerTy(DAG.getDataLayout()); 2631 unsigned RetReg = MF.addLiveIn(SP::I7, TLI.getRegClassFor(PtrVT)); 2632 RetAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, RetReg, VT); 2633 return RetAddr; 2634 } 2635 2636 // Need frame address to find return address of the caller. 2637 SDValue FrameAddr = getFRAMEADDR(depth - 1, Op, DAG, Subtarget); 2638 2639 unsigned Offset = (Subtarget->is64Bit()) ? 120 : 60; 2640 SDValue Ptr = DAG.getNode(ISD::ADD, 2641 dl, VT, 2642 FrameAddr, 2643 DAG.getIntPtrConstant(Offset, dl)); 2644 RetAddr = DAG.getLoad(VT, dl, DAG.getEntryNode(), Ptr, 2645 MachinePointerInfo(), false, false, false, 0); 2646 2647 return RetAddr; 2648 } 2649 2650 static SDValue LowerF64Op(SDValue SrcReg64, SDLoc dl, SelectionDAG &DAG, unsigned opcode) 2651 { 2652 assert(SrcReg64.getValueType() == MVT::f64 && "LowerF64Op called on non-double!"); 2653 assert(opcode == ISD::FNEG || opcode == ISD::FABS); 2654 2655 // Lower fneg/fabs on f64 to fneg/fabs on f32. 2656 // fneg f64 => fneg f32:sub_even, fmov f32:sub_odd. 2657 // fabs f64 => fabs f32:sub_even, fmov f32:sub_odd. 2658 2659 // Note: in little-endian, the floating-point value is stored in the 2660 // registers are in the opposite order, so the subreg with the sign 2661 // bit is the highest-numbered (odd), rather than the 2662 // lowest-numbered (even). 2663 2664 SDValue Hi32 = DAG.getTargetExtractSubreg(SP::sub_even, dl, MVT::f32, 2665 SrcReg64); 2666 SDValue Lo32 = DAG.getTargetExtractSubreg(SP::sub_odd, dl, MVT::f32, 2667 SrcReg64); 2668 2669 if (DAG.getDataLayout().isLittleEndian()) 2670 Lo32 = DAG.getNode(opcode, dl, MVT::f32, Lo32); 2671 else 2672 Hi32 = DAG.getNode(opcode, dl, MVT::f32, Hi32); 2673 2674 SDValue DstReg64 = SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF, 2675 dl, MVT::f64), 0); 2676 DstReg64 = DAG.getTargetInsertSubreg(SP::sub_even, dl, MVT::f64, 2677 DstReg64, Hi32); 2678 DstReg64 = DAG.getTargetInsertSubreg(SP::sub_odd, dl, MVT::f64, 2679 DstReg64, Lo32); 2680 return DstReg64; 2681 } 2682 2683 // Lower a f128 load into two f64 loads. 2684 static SDValue LowerF128Load(SDValue Op, SelectionDAG &DAG) 2685 { 2686 SDLoc dl(Op); 2687 LoadSDNode *LdNode = dyn_cast<LoadSDNode>(Op.getNode()); 2688 assert(LdNode && LdNode->getOffset().isUndef() 2689 && "Unexpected node type"); 2690 2691 unsigned alignment = LdNode->getAlignment(); 2692 if (alignment > 8) 2693 alignment = 8; 2694 2695 SDValue Hi64 = DAG.getLoad(MVT::f64, 2696 dl, 2697 LdNode->getChain(), 2698 LdNode->getBasePtr(), 2699 LdNode->getPointerInfo(), 2700 false, false, false, alignment); 2701 EVT addrVT = LdNode->getBasePtr().getValueType(); 2702 SDValue LoPtr = DAG.getNode(ISD::ADD, dl, addrVT, 2703 LdNode->getBasePtr(), 2704 DAG.getConstant(8, dl, addrVT)); 2705 SDValue Lo64 = DAG.getLoad(MVT::f64, 2706 dl, 2707 LdNode->getChain(), 2708 LoPtr, 2709 LdNode->getPointerInfo(), 2710 false, false, false, alignment); 2711 2712 SDValue SubRegEven = DAG.getTargetConstant(SP::sub_even64, dl, MVT::i32); 2713 SDValue SubRegOdd = DAG.getTargetConstant(SP::sub_odd64, dl, MVT::i32); 2714 2715 SDNode *InFP128 = DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF, 2716 dl, MVT::f128); 2717 InFP128 = DAG.getMachineNode(TargetOpcode::INSERT_SUBREG, dl, 2718 MVT::f128, 2719 SDValue(InFP128, 0), 2720 Hi64, 2721 SubRegEven); 2722 InFP128 = DAG.getMachineNode(TargetOpcode::INSERT_SUBREG, dl, 2723 MVT::f128, 2724 SDValue(InFP128, 0), 2725 Lo64, 2726 SubRegOdd); 2727 SDValue OutChains[2] = { SDValue(Hi64.getNode(), 1), 2728 SDValue(Lo64.getNode(), 1) }; 2729 SDValue OutChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 2730 SDValue Ops[2] = {SDValue(InFP128,0), OutChain}; 2731 return DAG.getMergeValues(Ops, dl); 2732 } 2733 2734 static SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) 2735 { 2736 LoadSDNode *LdNode = cast<LoadSDNode>(Op.getNode()); 2737 2738 EVT MemVT = LdNode->getMemoryVT(); 2739 if (MemVT == MVT::f128) 2740 return LowerF128Load(Op, DAG); 2741 2742 return Op; 2743 } 2744 2745 // Lower a f128 store into two f64 stores. 2746 static SDValue LowerF128Store(SDValue Op, SelectionDAG &DAG) { 2747 SDLoc dl(Op); 2748 StoreSDNode *StNode = dyn_cast<StoreSDNode>(Op.getNode()); 2749 assert(StNode && StNode->getOffset().isUndef() 2750 && "Unexpected node type"); 2751 SDValue SubRegEven = DAG.getTargetConstant(SP::sub_even64, dl, MVT::i32); 2752 SDValue SubRegOdd = DAG.getTargetConstant(SP::sub_odd64, dl, MVT::i32); 2753 2754 SDNode *Hi64 = DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, 2755 dl, 2756 MVT::f64, 2757 StNode->getValue(), 2758 SubRegEven); 2759 SDNode *Lo64 = DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG, 2760 dl, 2761 MVT::f64, 2762 StNode->getValue(), 2763 SubRegOdd); 2764 2765 unsigned alignment = StNode->getAlignment(); 2766 if (alignment > 8) 2767 alignment = 8; 2768 2769 SDValue OutChains[2]; 2770 OutChains[0] = DAG.getStore(StNode->getChain(), 2771 dl, 2772 SDValue(Hi64, 0), 2773 StNode->getBasePtr(), 2774 MachinePointerInfo(), 2775 false, false, alignment); 2776 EVT addrVT = StNode->getBasePtr().getValueType(); 2777 SDValue LoPtr = DAG.getNode(ISD::ADD, dl, addrVT, 2778 StNode->getBasePtr(), 2779 DAG.getConstant(8, dl, addrVT)); 2780 OutChains[1] = DAG.getStore(StNode->getChain(), 2781 dl, 2782 SDValue(Lo64, 0), 2783 LoPtr, 2784 MachinePointerInfo(), 2785 false, false, alignment); 2786 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 2787 } 2788 2789 static SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) 2790 { 2791 SDLoc dl(Op); 2792 StoreSDNode *St = cast<StoreSDNode>(Op.getNode()); 2793 2794 EVT MemVT = St->getMemoryVT(); 2795 if (MemVT == MVT::f128) 2796 return LowerF128Store(Op, DAG); 2797 2798 if (MemVT == MVT::i64) { 2799 // Custom handling for i64 stores: turn it into a bitcast and a 2800 // v2i32 store. 2801 SDValue Val = DAG.getNode(ISD::BITCAST, dl, MVT::v2i32, St->getValue()); 2802 SDValue Chain = DAG.getStore( 2803 St->getChain(), dl, Val, St->getBasePtr(), St->getPointerInfo(), 2804 St->isVolatile(), St->isNonTemporal(), St->getAlignment(), 2805 St->getAAInfo()); 2806 return Chain; 2807 } 2808 2809 return SDValue(); 2810 } 2811 2812 static SDValue LowerFNEGorFABS(SDValue Op, SelectionDAG &DAG, bool isV9) { 2813 assert((Op.getOpcode() == ISD::FNEG || Op.getOpcode() == ISD::FABS) 2814 && "invalid opcode"); 2815 2816 SDLoc dl(Op); 2817 2818 if (Op.getValueType() == MVT::f64) 2819 return LowerF64Op(Op.getOperand(0), dl, DAG, Op.getOpcode()); 2820 if (Op.getValueType() != MVT::f128) 2821 return Op; 2822 2823 // Lower fabs/fneg on f128 to fabs/fneg on f64 2824 // fabs/fneg f128 => fabs/fneg f64:sub_even64, fmov f64:sub_odd64 2825 // (As with LowerF64Op, on little-endian, we need to negate the odd 2826 // subreg) 2827 2828 SDValue SrcReg128 = Op.getOperand(0); 2829 SDValue Hi64 = DAG.getTargetExtractSubreg(SP::sub_even64, dl, MVT::f64, 2830 SrcReg128); 2831 SDValue Lo64 = DAG.getTargetExtractSubreg(SP::sub_odd64, dl, MVT::f64, 2832 SrcReg128); 2833 2834 if (DAG.getDataLayout().isLittleEndian()) { 2835 if (isV9) 2836 Lo64 = DAG.getNode(Op.getOpcode(), dl, MVT::f64, Lo64); 2837 else 2838 Lo64 = LowerF64Op(Lo64, dl, DAG, Op.getOpcode()); 2839 } else { 2840 if (isV9) 2841 Hi64 = DAG.getNode(Op.getOpcode(), dl, MVT::f64, Hi64); 2842 else 2843 Hi64 = LowerF64Op(Hi64, dl, DAG, Op.getOpcode()); 2844 } 2845 2846 SDValue DstReg128 = SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF, 2847 dl, MVT::f128), 0); 2848 DstReg128 = DAG.getTargetInsertSubreg(SP::sub_even64, dl, MVT::f128, 2849 DstReg128, Hi64); 2850 DstReg128 = DAG.getTargetInsertSubreg(SP::sub_odd64, dl, MVT::f128, 2851 DstReg128, Lo64); 2852 return DstReg128; 2853 } 2854 2855 static SDValue LowerADDC_ADDE_SUBC_SUBE(SDValue Op, SelectionDAG &DAG) { 2856 2857 if (Op.getValueType() != MVT::i64) 2858 return Op; 2859 2860 SDLoc dl(Op); 2861 SDValue Src1 = Op.getOperand(0); 2862 SDValue Src1Lo = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src1); 2863 SDValue Src1Hi = DAG.getNode(ISD::SRL, dl, MVT::i64, Src1, 2864 DAG.getConstant(32, dl, MVT::i64)); 2865 Src1Hi = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src1Hi); 2866 2867 SDValue Src2 = Op.getOperand(1); 2868 SDValue Src2Lo = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src2); 2869 SDValue Src2Hi = DAG.getNode(ISD::SRL, dl, MVT::i64, Src2, 2870 DAG.getConstant(32, dl, MVT::i64)); 2871 Src2Hi = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src2Hi); 2872 2873 2874 bool hasChain = false; 2875 unsigned hiOpc = Op.getOpcode(); 2876 switch (Op.getOpcode()) { 2877 default: llvm_unreachable("Invalid opcode"); 2878 case ISD::ADDC: hiOpc = ISD::ADDE; break; 2879 case ISD::ADDE: hasChain = true; break; 2880 case ISD::SUBC: hiOpc = ISD::SUBE; break; 2881 case ISD::SUBE: hasChain = true; break; 2882 } 2883 SDValue Lo; 2884 SDVTList VTs = DAG.getVTList(MVT::i32, MVT::Glue); 2885 if (hasChain) { 2886 Lo = DAG.getNode(Op.getOpcode(), dl, VTs, Src1Lo, Src2Lo, 2887 Op.getOperand(2)); 2888 } else { 2889 Lo = DAG.getNode(Op.getOpcode(), dl, VTs, Src1Lo, Src2Lo); 2890 } 2891 SDValue Hi = DAG.getNode(hiOpc, dl, VTs, Src1Hi, Src2Hi, Lo.getValue(1)); 2892 SDValue Carry = Hi.getValue(1); 2893 2894 Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i64, Lo); 2895 Hi = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i64, Hi); 2896 Hi = DAG.getNode(ISD::SHL, dl, MVT::i64, Hi, 2897 DAG.getConstant(32, dl, MVT::i64)); 2898 2899 SDValue Dst = DAG.getNode(ISD::OR, dl, MVT::i64, Hi, Lo); 2900 SDValue Ops[2] = { Dst, Carry }; 2901 return DAG.getMergeValues(Ops, dl); 2902 } 2903 2904 // Custom lower UMULO/SMULO for SPARC. This code is similar to ExpandNode() 2905 // in LegalizeDAG.cpp except the order of arguments to the library function. 2906 static SDValue LowerUMULO_SMULO(SDValue Op, SelectionDAG &DAG, 2907 const SparcTargetLowering &TLI) 2908 { 2909 unsigned opcode = Op.getOpcode(); 2910 assert((opcode == ISD::UMULO || opcode == ISD::SMULO) && "Invalid Opcode."); 2911 2912 bool isSigned = (opcode == ISD::SMULO); 2913 EVT VT = MVT::i64; 2914 EVT WideVT = MVT::i128; 2915 SDLoc dl(Op); 2916 SDValue LHS = Op.getOperand(0); 2917 2918 if (LHS.getValueType() != VT) 2919 return Op; 2920 2921 SDValue ShiftAmt = DAG.getConstant(63, dl, VT); 2922 2923 SDValue RHS = Op.getOperand(1); 2924 SDValue HiLHS = DAG.getNode(ISD::SRA, dl, VT, LHS, ShiftAmt); 2925 SDValue HiRHS = DAG.getNode(ISD::SRA, dl, MVT::i64, RHS, ShiftAmt); 2926 SDValue Args[] = { HiLHS, LHS, HiRHS, RHS }; 2927 2928 SDValue MulResult = TLI.makeLibCall(DAG, 2929 RTLIB::MUL_I128, WideVT, 2930 Args, isSigned, dl).first; 2931 SDValue BottomHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, 2932 MulResult, DAG.getIntPtrConstant(0, dl)); 2933 SDValue TopHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, 2934 MulResult, DAG.getIntPtrConstant(1, dl)); 2935 if (isSigned) { 2936 SDValue Tmp1 = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, ShiftAmt); 2937 TopHalf = DAG.getSetCC(dl, MVT::i32, TopHalf, Tmp1, ISD::SETNE); 2938 } else { 2939 TopHalf = DAG.getSetCC(dl, MVT::i32, TopHalf, DAG.getConstant(0, dl, VT), 2940 ISD::SETNE); 2941 } 2942 // MulResult is a node with an illegal type. Because such things are not 2943 // generally permitted during this phase of legalization, ensure that 2944 // nothing is left using the node. The above EXTRACT_ELEMENT nodes should have 2945 // been folded. 2946 assert(MulResult->use_empty() && "Illegally typed node still in use!"); 2947 2948 SDValue Ops[2] = { BottomHalf, TopHalf } ; 2949 return DAG.getMergeValues(Ops, dl); 2950 } 2951 2952 static SDValue LowerATOMIC_LOAD_STORE(SDValue Op, SelectionDAG &DAG) { 2953 if (isStrongerThanMonotonic(cast<AtomicSDNode>(Op)->getOrdering())) 2954 // Expand with a fence. 2955 return SDValue(); 2956 2957 // Monotonic load/stores are legal. 2958 return Op; 2959 } 2960 2961 SDValue SparcTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, 2962 SelectionDAG &DAG) const { 2963 unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue(); 2964 SDLoc dl(Op); 2965 switch (IntNo) { 2966 default: return SDValue(); // Don't custom lower most intrinsics. 2967 case Intrinsic::thread_pointer: { 2968 EVT PtrVT = getPointerTy(DAG.getDataLayout()); 2969 return DAG.getRegister(SP::G7, PtrVT); 2970 } 2971 } 2972 } 2973 2974 SDValue SparcTargetLowering:: 2975 LowerOperation(SDValue Op, SelectionDAG &DAG) const { 2976 2977 bool hasHardQuad = Subtarget->hasHardQuad(); 2978 bool isV9 = Subtarget->isV9(); 2979 2980 switch (Op.getOpcode()) { 2981 default: llvm_unreachable("Should not custom lower this!"); 2982 2983 case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG, *this, 2984 Subtarget); 2985 case ISD::FRAMEADDR: return LowerFRAMEADDR(Op, DAG, 2986 Subtarget); 2987 case ISD::GlobalTLSAddress: return LowerGlobalTLSAddress(Op, DAG); 2988 case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG); 2989 case ISD::BlockAddress: return LowerBlockAddress(Op, DAG); 2990 case ISD::ConstantPool: return LowerConstantPool(Op, DAG); 2991 case ISD::FP_TO_SINT: return LowerFP_TO_SINT(Op, DAG, *this, 2992 hasHardQuad); 2993 case ISD::SINT_TO_FP: return LowerSINT_TO_FP(Op, DAG, *this, 2994 hasHardQuad); 2995 case ISD::FP_TO_UINT: return LowerFP_TO_UINT(Op, DAG, *this, 2996 hasHardQuad); 2997 case ISD::UINT_TO_FP: return LowerUINT_TO_FP(Op, DAG, *this, 2998 hasHardQuad); 2999 case ISD::BR_CC: return LowerBR_CC(Op, DAG, *this, 3000 hasHardQuad); 3001 case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG, *this, 3002 hasHardQuad); 3003 case ISD::VASTART: return LowerVASTART(Op, DAG, *this); 3004 case ISD::VAARG: return LowerVAARG(Op, DAG); 3005 case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG, 3006 Subtarget); 3007 3008 case ISD::LOAD: return LowerLOAD(Op, DAG); 3009 case ISD::STORE: return LowerSTORE(Op, DAG); 3010 case ISD::FADD: return LowerF128Op(Op, DAG, 3011 getLibcallName(RTLIB::ADD_F128), 2); 3012 case ISD::FSUB: return LowerF128Op(Op, DAG, 3013 getLibcallName(RTLIB::SUB_F128), 2); 3014 case ISD::FMUL: return LowerF128Op(Op, DAG, 3015 getLibcallName(RTLIB::MUL_F128), 2); 3016 case ISD::FDIV: return LowerF128Op(Op, DAG, 3017 getLibcallName(RTLIB::DIV_F128), 2); 3018 case ISD::FSQRT: return LowerF128Op(Op, DAG, 3019 getLibcallName(RTLIB::SQRT_F128),1); 3020 case ISD::FABS: 3021 case ISD::FNEG: return LowerFNEGorFABS(Op, DAG, isV9); 3022 case ISD::FP_EXTEND: return LowerF128_FPEXTEND(Op, DAG, *this); 3023 case ISD::FP_ROUND: return LowerF128_FPROUND(Op, DAG, *this); 3024 case ISD::ADDC: 3025 case ISD::ADDE: 3026 case ISD::SUBC: 3027 case ISD::SUBE: return LowerADDC_ADDE_SUBC_SUBE(Op, DAG); 3028 case ISD::UMULO: 3029 case ISD::SMULO: return LowerUMULO_SMULO(Op, DAG, *this); 3030 case ISD::ATOMIC_LOAD: 3031 case ISD::ATOMIC_STORE: return LowerATOMIC_LOAD_STORE(Op, DAG); 3032 case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG); 3033 } 3034 } 3035 3036 MachineBasicBlock * 3037 SparcTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI, 3038 MachineBasicBlock *BB) const { 3039 switch (MI->getOpcode()) { 3040 default: llvm_unreachable("Unknown SELECT_CC!"); 3041 case SP::SELECT_CC_Int_ICC: 3042 case SP::SELECT_CC_FP_ICC: 3043 case SP::SELECT_CC_DFP_ICC: 3044 case SP::SELECT_CC_QFP_ICC: 3045 return expandSelectCC(MI, BB, SP::BCOND); 3046 case SP::SELECT_CC_Int_FCC: 3047 case SP::SELECT_CC_FP_FCC: 3048 case SP::SELECT_CC_DFP_FCC: 3049 case SP::SELECT_CC_QFP_FCC: 3050 return expandSelectCC(MI, BB, SP::FBCOND); 3051 } 3052 } 3053 3054 MachineBasicBlock* 3055 SparcTargetLowering::expandSelectCC(MachineInstr *MI, 3056 MachineBasicBlock *BB, 3057 unsigned BROpcode) const { 3058 const TargetInstrInfo &TII = *Subtarget->getInstrInfo(); 3059 DebugLoc dl = MI->getDebugLoc(); 3060 unsigned CC = (SPCC::CondCodes)MI->getOperand(3).getImm(); 3061 3062 // To "insert" a SELECT_CC instruction, we actually have to insert the diamond 3063 // control-flow pattern. The incoming instruction knows the destination vreg 3064 // to set, the condition code register to branch on, the true/false values to 3065 // select between, and a branch opcode to use. 3066 const BasicBlock *LLVM_BB = BB->getBasicBlock(); 3067 MachineFunction::iterator It = ++BB->getIterator(); 3068 3069 // thisMBB: 3070 // ... 3071 // TrueVal = ... 3072 // [f]bCC copy1MBB 3073 // fallthrough --> copy0MBB 3074 MachineBasicBlock *thisMBB = BB; 3075 MachineFunction *F = BB->getParent(); 3076 MachineBasicBlock *copy0MBB = F->CreateMachineBasicBlock(LLVM_BB); 3077 MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB); 3078 F->insert(It, copy0MBB); 3079 F->insert(It, sinkMBB); 3080 3081 // Transfer the remainder of BB and its successor edges to sinkMBB. 3082 sinkMBB->splice(sinkMBB->begin(), BB, 3083 std::next(MachineBasicBlock::iterator(MI)), 3084 BB->end()); 3085 sinkMBB->transferSuccessorsAndUpdatePHIs(BB); 3086 3087 // Add the true and fallthrough blocks as its successors. 3088 BB->addSuccessor(copy0MBB); 3089 BB->addSuccessor(sinkMBB); 3090 3091 BuildMI(BB, dl, TII.get(BROpcode)).addMBB(sinkMBB).addImm(CC); 3092 3093 // copy0MBB: 3094 // %FalseValue = ... 3095 // # fallthrough to sinkMBB 3096 BB = copy0MBB; 3097 3098 // Update machine-CFG edges 3099 BB->addSuccessor(sinkMBB); 3100 3101 // sinkMBB: 3102 // %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ] 3103 // ... 3104 BB = sinkMBB; 3105 BuildMI(*BB, BB->begin(), dl, TII.get(SP::PHI), MI->getOperand(0).getReg()) 3106 .addReg(MI->getOperand(2).getReg()).addMBB(copy0MBB) 3107 .addReg(MI->getOperand(1).getReg()).addMBB(thisMBB); 3108 3109 MI->eraseFromParent(); // The pseudo instruction is gone now. 3110 return BB; 3111 } 3112 3113 //===----------------------------------------------------------------------===// 3114 // Sparc Inline Assembly Support 3115 //===----------------------------------------------------------------------===// 3116 3117 /// getConstraintType - Given a constraint letter, return the type of 3118 /// constraint it is for this target. 3119 SparcTargetLowering::ConstraintType 3120 SparcTargetLowering::getConstraintType(StringRef Constraint) const { 3121 if (Constraint.size() == 1) { 3122 switch (Constraint[0]) { 3123 default: break; 3124 case 'r': return C_RegisterClass; 3125 case 'I': // SIMM13 3126 return C_Other; 3127 } 3128 } 3129 3130 return TargetLowering::getConstraintType(Constraint); 3131 } 3132 3133 TargetLowering::ConstraintWeight SparcTargetLowering:: 3134 getSingleConstraintMatchWeight(AsmOperandInfo &info, 3135 const char *constraint) const { 3136 ConstraintWeight weight = CW_Invalid; 3137 Value *CallOperandVal = info.CallOperandVal; 3138 // If we don't have a value, we can't do a match, 3139 // but allow it at the lowest weight. 3140 if (!CallOperandVal) 3141 return CW_Default; 3142 3143 // Look at the constraint type. 3144 switch (*constraint) { 3145 default: 3146 weight = TargetLowering::getSingleConstraintMatchWeight(info, constraint); 3147 break; 3148 case 'I': // SIMM13 3149 if (ConstantInt *C = dyn_cast<ConstantInt>(info.CallOperandVal)) { 3150 if (isInt<13>(C->getSExtValue())) 3151 weight = CW_Constant; 3152 } 3153 break; 3154 } 3155 return weight; 3156 } 3157 3158 /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops 3159 /// vector. If it is invalid, don't add anything to Ops. 3160 void SparcTargetLowering:: 3161 LowerAsmOperandForConstraint(SDValue Op, 3162 std::string &Constraint, 3163 std::vector<SDValue> &Ops, 3164 SelectionDAG &DAG) const { 3165 SDValue Result(nullptr, 0); 3166 3167 // Only support length 1 constraints for now. 3168 if (Constraint.length() > 1) 3169 return; 3170 3171 char ConstraintLetter = Constraint[0]; 3172 switch (ConstraintLetter) { 3173 default: break; 3174 case 'I': 3175 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) { 3176 if (isInt<13>(C->getSExtValue())) { 3177 Result = DAG.getTargetConstant(C->getSExtValue(), SDLoc(Op), 3178 Op.getValueType()); 3179 break; 3180 } 3181 return; 3182 } 3183 } 3184 3185 if (Result.getNode()) { 3186 Ops.push_back(Result); 3187 return; 3188 } 3189 TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG); 3190 } 3191 3192 std::pair<unsigned, const TargetRegisterClass *> 3193 SparcTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, 3194 StringRef Constraint, 3195 MVT VT) const { 3196 if (Constraint.size() == 1) { 3197 switch (Constraint[0]) { 3198 case 'r': 3199 if (VT == MVT::v2i32) 3200 return std::make_pair(0U, &SP::IntPairRegClass); 3201 else 3202 return std::make_pair(0U, &SP::IntRegsRegClass); 3203 } 3204 } else if (!Constraint.empty() && Constraint.size() <= 5 3205 && Constraint[0] == '{' && *(Constraint.end()-1) == '}') { 3206 // constraint = '{r<d>}' 3207 // Remove the braces from around the name. 3208 StringRef name(Constraint.data()+1, Constraint.size()-2); 3209 // Handle register aliases: 3210 // r0-r7 -> g0-g7 3211 // r8-r15 -> o0-o7 3212 // r16-r23 -> l0-l7 3213 // r24-r31 -> i0-i7 3214 uint64_t intVal = 0; 3215 if (name.substr(0, 1).equals("r") 3216 && !name.substr(1).getAsInteger(10, intVal) && intVal <= 31) { 3217 const char regTypes[] = { 'g', 'o', 'l', 'i' }; 3218 char regType = regTypes[intVal/8]; 3219 char regIdx = '0' + (intVal % 8); 3220 char tmp[] = { '{', regType, regIdx, '}', 0 }; 3221 std::string newConstraint = std::string(tmp); 3222 return TargetLowering::getRegForInlineAsmConstraint(TRI, newConstraint, 3223 VT); 3224 } 3225 } 3226 3227 return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT); 3228 } 3229 3230 bool 3231 SparcTargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const { 3232 // The Sparc target isn't yet aware of offsets. 3233 return false; 3234 } 3235 3236 void SparcTargetLowering::ReplaceNodeResults(SDNode *N, 3237 SmallVectorImpl<SDValue>& Results, 3238 SelectionDAG &DAG) const { 3239 3240 SDLoc dl(N); 3241 3242 RTLIB::Libcall libCall = RTLIB::UNKNOWN_LIBCALL; 3243 3244 switch (N->getOpcode()) { 3245 default: 3246 llvm_unreachable("Do not know how to custom type legalize this operation!"); 3247 3248 case ISD::FP_TO_SINT: 3249 case ISD::FP_TO_UINT: 3250 // Custom lower only if it involves f128 or i64. 3251 if (N->getOperand(0).getValueType() != MVT::f128 3252 || N->getValueType(0) != MVT::i64) 3253 return; 3254 libCall = ((N->getOpcode() == ISD::FP_TO_SINT) 3255 ? RTLIB::FPTOSINT_F128_I64 3256 : RTLIB::FPTOUINT_F128_I64); 3257 3258 Results.push_back(LowerF128Op(SDValue(N, 0), 3259 DAG, 3260 getLibcallName(libCall), 3261 1)); 3262 return; 3263 3264 case ISD::SINT_TO_FP: 3265 case ISD::UINT_TO_FP: 3266 // Custom lower only if it involves f128 or i64. 3267 if (N->getValueType(0) != MVT::f128 3268 || N->getOperand(0).getValueType() != MVT::i64) 3269 return; 3270 3271 libCall = ((N->getOpcode() == ISD::SINT_TO_FP) 3272 ? RTLIB::SINTTOFP_I64_F128 3273 : RTLIB::UINTTOFP_I64_F128); 3274 3275 Results.push_back(LowerF128Op(SDValue(N, 0), 3276 DAG, 3277 getLibcallName(libCall), 3278 1)); 3279 return; 3280 case ISD::LOAD: { 3281 LoadSDNode *Ld = cast<LoadSDNode>(N); 3282 // Custom handling only for i64: turn i64 load into a v2i32 load, 3283 // and a bitcast. 3284 if (Ld->getValueType(0) != MVT::i64 || Ld->getMemoryVT() != MVT::i64) 3285 return; 3286 3287 SDLoc dl(N); 3288 SDValue LoadRes = DAG.getExtLoad( 3289 Ld->getExtensionType(), dl, MVT::v2i32, 3290 Ld->getChain(), Ld->getBasePtr(), Ld->getPointerInfo(), 3291 MVT::v2i32, Ld->isVolatile(), Ld->isNonTemporal(), 3292 Ld->isInvariant(), Ld->getAlignment(), Ld->getAAInfo()); 3293 3294 SDValue Res = DAG.getNode(ISD::BITCAST, dl, MVT::i64, LoadRes); 3295 Results.push_back(Res); 3296 Results.push_back(LoadRes.getValue(1)); 3297 return; 3298 } 3299 } 3300 } 3301 3302 // Override to enable LOAD_STACK_GUARD lowering on Linux. 3303 bool SparcTargetLowering::useLoadStackGuardNode() const { 3304 if (!Subtarget->isTargetLinux()) 3305 return TargetLowering::useLoadStackGuardNode(); 3306 return true; 3307 } 3308 3309 // Override to disable global variable loading on Linux. 3310 void SparcTargetLowering::insertSSPDeclarations(Module &M) const { 3311 if (!Subtarget->isTargetLinux()) 3312 return TargetLowering::insertSSPDeclarations(M); 3313 } 3314