1 //===-- CSKYISelLowering.cpp - CSKY DAG Lowering Implementation ----------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the interfaces that CSKY uses to lower LLVM code into a 10 // selection DAG. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CSKYISelLowering.h" 15 #include "CSKYCallingConv.h" 16 #include "CSKYConstantPoolValue.h" 17 #include "CSKYMachineFunctionInfo.h" 18 #include "CSKYRegisterInfo.h" 19 #include "CSKYSubtarget.h" 20 #include "llvm/ADT/Statistic.h" 21 #include "llvm/CodeGen/CallingConvLower.h" 22 #include "llvm/CodeGen/MachineFrameInfo.h" 23 #include "llvm/CodeGen/MachineJumpTableInfo.h" 24 #include "llvm/Support/Debug.h" 25 26 using namespace llvm; 27 28 #define DEBUG_TYPE "csky-isel-lowering" 29 30 STATISTIC(NumTailCalls, "Number of tail calls"); 31 32 #include "CSKYGenCallingConv.inc" 33 34 static const MCPhysReg GPRArgRegs[] = {CSKY::R0, CSKY::R1, CSKY::R2, CSKY::R3}; 35 36 CSKYTargetLowering::CSKYTargetLowering(const TargetMachine &TM, 37 const CSKYSubtarget &STI) 38 : TargetLowering(TM), Subtarget(STI) { 39 // Register Class 40 addRegisterClass(MVT::i32, &CSKY::GPRRegClass); 41 42 if (STI.useHardFloat()) { 43 if (STI.hasFPUv2SingleFloat()) 44 addRegisterClass(MVT::f32, &CSKY::sFPR32RegClass); 45 else if (STI.hasFPUv3SingleFloat()) 46 addRegisterClass(MVT::f32, &CSKY::FPR32RegClass); 47 48 if (STI.hasFPUv2DoubleFloat()) 49 addRegisterClass(MVT::f64, &CSKY::sFPR64RegClass); 50 else if (STI.hasFPUv3DoubleFloat()) 51 addRegisterClass(MVT::f64, &CSKY::FPR64RegClass); 52 } 53 54 setOperationAction(ISD::ADDCARRY, MVT::i32, Legal); 55 setOperationAction(ISD::SUBCARRY, MVT::i32, Legal); 56 setOperationAction(ISD::BITREVERSE, MVT::i32, Legal); 57 58 setOperationAction(ISD::SREM, MVT::i32, Expand); 59 setOperationAction(ISD::UREM, MVT::i32, Expand); 60 setOperationAction(ISD::UDIVREM, MVT::i32, Expand); 61 setOperationAction(ISD::SDIVREM, MVT::i32, Expand); 62 setOperationAction(ISD::CTTZ, MVT::i32, Expand); 63 setOperationAction(ISD::CTPOP, MVT::i32, Expand); 64 setOperationAction(ISD::ROTR, MVT::i32, Expand); 65 setOperationAction(ISD::SHL_PARTS, MVT::i32, Expand); 66 setOperationAction(ISD::SRL_PARTS, MVT::i32, Expand); 67 setOperationAction(ISD::SRA_PARTS, MVT::i32, Expand); 68 setOperationAction(ISD::UMUL_LOHI, MVT::i32, Expand); 69 setOperationAction(ISD::SMUL_LOHI, MVT::i32, Expand); 70 setOperationAction(ISD::SELECT_CC, MVT::i32, Expand); 71 setOperationAction(ISD::BR_CC, MVT::i32, Expand); 72 setOperationAction(ISD::BR_JT, MVT::Other, Expand); 73 setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Expand); 74 setOperationAction(ISD::STACKSAVE, MVT::Other, Expand); 75 setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand); 76 setOperationAction(ISD::MULHS, MVT::i32, Expand); 77 setOperationAction(ISD::MULHU, MVT::i32, Expand); 78 setOperationAction(ISD::VAARG, MVT::Other, Expand); 79 setOperationAction(ISD::VACOPY, MVT::Other, Expand); 80 setOperationAction(ISD::VAEND, MVT::Other, Expand); 81 82 setLoadExtAction(ISD::EXTLOAD, MVT::i32, MVT::i1, Promote); 83 setLoadExtAction(ISD::SEXTLOAD, MVT::i32, MVT::i1, Promote); 84 setLoadExtAction(ISD::ZEXTLOAD, MVT::i32, MVT::i1, Promote); 85 86 setOperationAction(ISD::GlobalAddress, MVT::i32, Custom); 87 setOperationAction(ISD::ExternalSymbol, MVT::i32, Custom); 88 setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom); 89 setOperationAction(ISD::BlockAddress, MVT::i32, Custom); 90 setOperationAction(ISD::JumpTable, MVT::i32, Custom); 91 setOperationAction(ISD::VASTART, MVT::Other, Custom); 92 93 if (!Subtarget.hasE2()) { 94 setLoadExtAction(ISD::SEXTLOAD, MVT::i32, MVT::i8, Expand); 95 setLoadExtAction(ISD::SEXTLOAD, MVT::i32, MVT::i16, Expand); 96 setOperationAction(ISD::CTLZ, MVT::i32, Expand); 97 setOperationAction(ISD::BSWAP, MVT::i32, Expand); 98 } 99 100 if (!Subtarget.has2E3()) { 101 setOperationAction(ISD::ABS, MVT::i32, Expand); 102 setOperationAction(ISD::BITREVERSE, MVT::i32, Expand); 103 setOperationAction(ISD::SDIV, MVT::i32, Expand); 104 setOperationAction(ISD::UDIV, MVT::i32, Expand); 105 } 106 107 setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Expand); 108 109 // Float 110 111 ISD::CondCode FPCCToExtend[] = { 112 ISD::SETONE, ISD::SETUEQ, ISD::SETUGT, 113 ISD::SETUGE, ISD::SETULT, ISD::SETULE, 114 }; 115 116 ISD::NodeType FPOpToExpand[] = {ISD::FSIN, ISD::FCOS, ISD::FSINCOS, 117 ISD::FPOW, ISD::FREM, ISD::FCOPYSIGN}; 118 119 if (STI.useHardFloat()) { 120 121 MVT AllVTy[] = {MVT::f32, MVT::f64}; 122 123 for (auto VT : AllVTy) { 124 setOperationAction(ISD::FREM, VT, Expand); 125 setOperationAction(ISD::SELECT_CC, VT, Expand); 126 setOperationAction(ISD::BR_CC, VT, Expand); 127 128 for (auto CC : FPCCToExtend) 129 setCondCodeAction(CC, VT, Expand); 130 for (auto Op : FPOpToExpand) 131 setOperationAction(Op, VT, Expand); 132 } 133 134 if (STI.hasFPUv2SingleFloat() || STI.hasFPUv3SingleFloat()) { 135 setOperationAction(ISD::ConstantFP, MVT::f32, Legal); 136 } 137 if (STI.hasFPUv2DoubleFloat() || STI.hasFPUv3DoubleFloat()) { 138 setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f32, Expand); 139 setTruncStoreAction(MVT::f64, MVT::f32, Expand); 140 } 141 } 142 143 // Compute derived properties from the register classes. 144 computeRegisterProperties(STI.getRegisterInfo()); 145 146 setBooleanContents(UndefinedBooleanContent); 147 setBooleanVectorContents(ZeroOrNegativeOneBooleanContent); 148 149 // TODO: Add atomic support fully. 150 setMaxAtomicSizeInBitsSupported(0); 151 152 setStackPointerRegisterToSaveRestore(CSKY::R14); 153 const Align FunctionAlignment(2); 154 setMinFunctionAlignment(FunctionAlignment); 155 setSchedulingPreference(Sched::Source); 156 } 157 158 SDValue CSKYTargetLowering::LowerOperation(SDValue Op, 159 SelectionDAG &DAG) const { 160 switch (Op.getOpcode()) { 161 default: 162 llvm_unreachable("unimplemented op"); 163 case ISD::GlobalAddress: 164 return LowerGlobalAddress(Op, DAG); 165 case ISD::ExternalSymbol: 166 return LowerExternalSymbol(Op, DAG); 167 case ISD::GlobalTLSAddress: 168 return LowerGlobalTLSAddress(Op, DAG); 169 case ISD::JumpTable: 170 return LowerJumpTable(Op, DAG); 171 case ISD::BlockAddress: 172 return LowerBlockAddress(Op, DAG); 173 case ISD::VASTART: 174 return LowerVASTART(Op, DAG); 175 case ISD::FRAMEADDR: 176 return LowerFRAMEADDR(Op, DAG); 177 case ISD::RETURNADDR: 178 return LowerRETURNADDR(Op, DAG); 179 } 180 } 181 182 EVT CSKYTargetLowering::getSetCCResultType(const DataLayout &DL, 183 LLVMContext &Context, EVT VT) const { 184 if (!VT.isVector()) 185 return MVT::i32; 186 187 return VT.changeVectorElementTypeToInteger(); 188 } 189 190 static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val, 191 const CCValAssign &VA, const SDLoc &DL) { 192 EVT LocVT = VA.getLocVT(); 193 194 switch (VA.getLocInfo()) { 195 default: 196 llvm_unreachable("Unexpected CCValAssign::LocInfo"); 197 case CCValAssign::Full: 198 break; 199 case CCValAssign::BCvt: 200 Val = DAG.getNode(ISD::BITCAST, DL, LocVT, Val); 201 break; 202 } 203 return Val; 204 } 205 206 static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val, 207 const CCValAssign &VA, const SDLoc &DL) { 208 switch (VA.getLocInfo()) { 209 default: 210 llvm_unreachable("Unexpected CCValAssign::LocInfo"); 211 case CCValAssign::Full: 212 break; 213 case CCValAssign::BCvt: 214 Val = DAG.getNode(ISD::BITCAST, DL, VA.getValVT(), Val); 215 break; 216 } 217 return Val; 218 } 219 220 static SDValue unpackFromRegLoc(const CSKYSubtarget &Subtarget, 221 SelectionDAG &DAG, SDValue Chain, 222 const CCValAssign &VA, const SDLoc &DL) { 223 MachineFunction &MF = DAG.getMachineFunction(); 224 MachineRegisterInfo &RegInfo = MF.getRegInfo(); 225 EVT LocVT = VA.getLocVT(); 226 SDValue Val; 227 const TargetRegisterClass *RC; 228 229 switch (LocVT.getSimpleVT().SimpleTy) { 230 default: 231 llvm_unreachable("Unexpected register type"); 232 case MVT::i32: 233 RC = &CSKY::GPRRegClass; 234 break; 235 case MVT::f32: 236 RC = Subtarget.hasFPUv2SingleFloat() ? &CSKY::sFPR32RegClass 237 : &CSKY::FPR32RegClass; 238 break; 239 case MVT::f64: 240 RC = Subtarget.hasFPUv2DoubleFloat() ? &CSKY::sFPR64RegClass 241 : &CSKY::FPR64RegClass; 242 break; 243 } 244 245 Register VReg = RegInfo.createVirtualRegister(RC); 246 RegInfo.addLiveIn(VA.getLocReg(), VReg); 247 Val = DAG.getCopyFromReg(Chain, DL, VReg, LocVT); 248 249 return convertLocVTToValVT(DAG, Val, VA, DL); 250 } 251 252 static SDValue unpackFromMemLoc(SelectionDAG &DAG, SDValue Chain, 253 const CCValAssign &VA, const SDLoc &DL) { 254 MachineFunction &MF = DAG.getMachineFunction(); 255 MachineFrameInfo &MFI = MF.getFrameInfo(); 256 EVT LocVT = VA.getLocVT(); 257 EVT ValVT = VA.getValVT(); 258 EVT PtrVT = MVT::getIntegerVT(DAG.getDataLayout().getPointerSizeInBits(0)); 259 int FI = MFI.CreateFixedObject(ValVT.getSizeInBits() / 8, 260 VA.getLocMemOffset(), /*Immutable=*/true); 261 SDValue FIN = DAG.getFrameIndex(FI, PtrVT); 262 SDValue Val; 263 264 ISD::LoadExtType ExtType; 265 switch (VA.getLocInfo()) { 266 default: 267 llvm_unreachable("Unexpected CCValAssign::LocInfo"); 268 case CCValAssign::Full: 269 case CCValAssign::BCvt: 270 ExtType = ISD::NON_EXTLOAD; 271 break; 272 } 273 Val = DAG.getExtLoad( 274 ExtType, DL, LocVT, Chain, FIN, 275 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI), ValVT); 276 return Val; 277 } 278 279 static SDValue unpack64(SelectionDAG &DAG, SDValue Chain, const CCValAssign &VA, 280 const SDLoc &DL) { 281 assert(VA.getLocVT() == MVT::i32 && 282 (VA.getValVT() == MVT::f64 || VA.getValVT() == MVT::i64) && 283 "Unexpected VA"); 284 MachineFunction &MF = DAG.getMachineFunction(); 285 MachineFrameInfo &MFI = MF.getFrameInfo(); 286 MachineRegisterInfo &RegInfo = MF.getRegInfo(); 287 288 if (VA.isMemLoc()) { 289 // f64/i64 is passed on the stack. 290 int FI = MFI.CreateFixedObject(8, VA.getLocMemOffset(), /*Immutable=*/true); 291 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32); 292 return DAG.getLoad(VA.getValVT(), DL, Chain, FIN, 293 MachinePointerInfo::getFixedStack(MF, FI)); 294 } 295 296 assert(VA.isRegLoc() && "Expected register VA assignment"); 297 298 Register LoVReg = RegInfo.createVirtualRegister(&CSKY::GPRRegClass); 299 RegInfo.addLiveIn(VA.getLocReg(), LoVReg); 300 SDValue Lo = DAG.getCopyFromReg(Chain, DL, LoVReg, MVT::i32); 301 SDValue Hi; 302 if (VA.getLocReg() == CSKY::R3) { 303 // Second half of f64/i64 is passed on the stack. 304 int FI = MFI.CreateFixedObject(4, 0, /*Immutable=*/true); 305 SDValue FIN = DAG.getFrameIndex(FI, MVT::i32); 306 Hi = DAG.getLoad(MVT::i32, DL, Chain, FIN, 307 MachinePointerInfo::getFixedStack(MF, FI)); 308 } else { 309 // Second half of f64/i64 is passed in another GPR. 310 Register HiVReg = RegInfo.createVirtualRegister(&CSKY::GPRRegClass); 311 RegInfo.addLiveIn(VA.getLocReg() + 1, HiVReg); 312 Hi = DAG.getCopyFromReg(Chain, DL, HiVReg, MVT::i32); 313 } 314 return DAG.getNode(CSKYISD::BITCAST_FROM_LOHI, DL, VA.getValVT(), Lo, Hi); 315 } 316 317 // Transform physical registers into virtual registers. 318 SDValue CSKYTargetLowering::LowerFormalArguments( 319 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, 320 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL, 321 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const { 322 323 switch (CallConv) { 324 default: 325 report_fatal_error("Unsupported calling convention"); 326 case CallingConv::C: 327 case CallingConv::Fast: 328 break; 329 } 330 331 MachineFunction &MF = DAG.getMachineFunction(); 332 333 // Used with vargs to acumulate store chains. 334 std::vector<SDValue> OutChains; 335 336 // Assign locations to all of the incoming arguments. 337 SmallVector<CCValAssign, 16> ArgLocs; 338 CCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, *DAG.getContext()); 339 340 CCInfo.AnalyzeFormalArguments(Ins, CCAssignFnForCall(CallConv, IsVarArg)); 341 342 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 343 CCValAssign &VA = ArgLocs[i]; 344 SDValue ArgValue; 345 346 bool IsF64OnCSKY = VA.getLocVT() == MVT::i32 && VA.getValVT() == MVT::f64; 347 348 if (IsF64OnCSKY) 349 ArgValue = unpack64(DAG, Chain, VA, DL); 350 else if (VA.isRegLoc()) 351 ArgValue = unpackFromRegLoc(Subtarget, DAG, Chain, VA, DL); 352 else 353 ArgValue = unpackFromMemLoc(DAG, Chain, VA, DL); 354 355 InVals.push_back(ArgValue); 356 } 357 358 if (IsVarArg) { 359 const unsigned XLenInBytes = 4; 360 const MVT XLenVT = MVT::i32; 361 362 ArrayRef<MCPhysReg> ArgRegs = makeArrayRef(GPRArgRegs); 363 unsigned Idx = CCInfo.getFirstUnallocated(ArgRegs); 364 const TargetRegisterClass *RC = &CSKY::GPRRegClass; 365 MachineFrameInfo &MFI = MF.getFrameInfo(); 366 MachineRegisterInfo &RegInfo = MF.getRegInfo(); 367 CSKYMachineFunctionInfo *CSKYFI = MF.getInfo<CSKYMachineFunctionInfo>(); 368 369 // Offset of the first variable argument from stack pointer, and size of 370 // the vararg save area. For now, the varargs save area is either zero or 371 // large enough to hold a0-a4. 372 int VaArgOffset, VarArgsSaveSize; 373 374 // If all registers are allocated, then all varargs must be passed on the 375 // stack and we don't need to save any argregs. 376 if (ArgRegs.size() == Idx) { 377 VaArgOffset = CCInfo.getNextStackOffset(); 378 VarArgsSaveSize = 0; 379 } else { 380 VarArgsSaveSize = XLenInBytes * (ArgRegs.size() - Idx); 381 VaArgOffset = -VarArgsSaveSize; 382 } 383 384 // Record the frame index of the first variable argument 385 // which is a value necessary to VASTART. 386 int FI = MFI.CreateFixedObject(XLenInBytes, VaArgOffset, true); 387 CSKYFI->setVarArgsFrameIndex(FI); 388 389 // Copy the integer registers that may have been used for passing varargs 390 // to the vararg save area. 391 for (unsigned I = Idx; I < ArgRegs.size(); 392 ++I, VaArgOffset += XLenInBytes) { 393 const Register Reg = RegInfo.createVirtualRegister(RC); 394 RegInfo.addLiveIn(ArgRegs[I], Reg); 395 SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, XLenVT); 396 FI = MFI.CreateFixedObject(XLenInBytes, VaArgOffset, true); 397 SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout())); 398 SDValue Store = DAG.getStore(Chain, DL, ArgValue, PtrOff, 399 MachinePointerInfo::getFixedStack(MF, FI)); 400 cast<StoreSDNode>(Store.getNode()) 401 ->getMemOperand() 402 ->setValue((Value *)nullptr); 403 OutChains.push_back(Store); 404 } 405 CSKYFI->setVarArgsSaveSize(VarArgsSaveSize); 406 } 407 408 // All stores are grouped in one node to allow the matching between 409 // the size of Ins and InVals. This only happens for vararg functions. 410 if (!OutChains.empty()) { 411 OutChains.push_back(Chain); 412 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, OutChains); 413 } 414 415 return Chain; 416 } 417 418 bool CSKYTargetLowering::CanLowerReturn( 419 CallingConv::ID CallConv, MachineFunction &MF, bool IsVarArg, 420 const SmallVectorImpl<ISD::OutputArg> &Outs, LLVMContext &Context) const { 421 SmallVector<CCValAssign, 16> CSKYLocs; 422 CCState CCInfo(CallConv, IsVarArg, MF, CSKYLocs, Context); 423 return CCInfo.CheckReturn(Outs, CCAssignFnForReturn(CallConv, IsVarArg)); 424 } 425 426 SDValue 427 CSKYTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv, 428 bool IsVarArg, 429 const SmallVectorImpl<ISD::OutputArg> &Outs, 430 const SmallVectorImpl<SDValue> &OutVals, 431 const SDLoc &DL, SelectionDAG &DAG) const { 432 // Stores the assignment of the return value to a location. 433 SmallVector<CCValAssign, 16> CSKYLocs; 434 435 // Info about the registers and stack slot. 436 CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), CSKYLocs, 437 *DAG.getContext()); 438 CCInfo.AnalyzeReturn(Outs, CCAssignFnForReturn(CallConv, IsVarArg)); 439 440 SDValue Glue; 441 SmallVector<SDValue, 4> RetOps(1, Chain); 442 443 // Copy the result values into the output registers. 444 for (unsigned i = 0, e = CSKYLocs.size(); i < e; ++i) { 445 SDValue Val = OutVals[i]; 446 CCValAssign &VA = CSKYLocs[i]; 447 assert(VA.isRegLoc() && "Can only return in registers!"); 448 449 bool IsF64OnCSKY = VA.getLocVT() == MVT::i32 && VA.getValVT() == MVT::f64; 450 451 if (IsF64OnCSKY) { 452 453 assert(VA.isRegLoc() && "Expected return via registers"); 454 SDValue Split64 = DAG.getNode(CSKYISD::BITCAST_TO_LOHI, DL, 455 DAG.getVTList(MVT::i32, MVT::i32), Val); 456 SDValue Lo = Split64.getValue(0); 457 SDValue Hi = Split64.getValue(1); 458 459 Register RegLo = VA.getLocReg(); 460 assert(RegLo < CSKY::R31 && "Invalid register pair"); 461 Register RegHi = RegLo + 1; 462 463 Chain = DAG.getCopyToReg(Chain, DL, RegLo, Lo, Glue); 464 Glue = Chain.getValue(1); 465 RetOps.push_back(DAG.getRegister(RegLo, MVT::i32)); 466 Chain = DAG.getCopyToReg(Chain, DL, RegHi, Hi, Glue); 467 Glue = Chain.getValue(1); 468 RetOps.push_back(DAG.getRegister(RegHi, MVT::i32)); 469 } else { 470 // Handle a 'normal' return. 471 Val = convertValVTToLocVT(DAG, Val, VA, DL); 472 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), Val, Glue); 473 474 // Guarantee that all emitted copies are stuck together. 475 Glue = Chain.getValue(1); 476 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT())); 477 } 478 } 479 480 RetOps[0] = Chain; // Update chain. 481 482 // Add the glue node if we have it. 483 if (Glue.getNode()) { 484 RetOps.push_back(Glue); 485 } 486 487 // Interrupt service routines use different return instructions. 488 if (DAG.getMachineFunction().getFunction().hasFnAttribute("interrupt")) 489 return DAG.getNode(CSKYISD::NIR, DL, MVT::Other, RetOps); 490 491 return DAG.getNode(CSKYISD::RET, DL, MVT::Other, RetOps); 492 } 493 494 // Lower a call to a callseq_start + CALL + callseq_end chain, and add input 495 // and output parameter nodes. 496 SDValue CSKYTargetLowering::LowerCall(CallLoweringInfo &CLI, 497 SmallVectorImpl<SDValue> &InVals) const { 498 SelectionDAG &DAG = CLI.DAG; 499 SDLoc &DL = CLI.DL; 500 SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs; 501 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals; 502 SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins; 503 SDValue Chain = CLI.Chain; 504 SDValue Callee = CLI.Callee; 505 bool &IsTailCall = CLI.IsTailCall; 506 CallingConv::ID CallConv = CLI.CallConv; 507 bool IsVarArg = CLI.IsVarArg; 508 EVT PtrVT = getPointerTy(DAG.getDataLayout()); 509 MVT XLenVT = MVT::i32; 510 511 MachineFunction &MF = DAG.getMachineFunction(); 512 513 // Analyze the operands of the call, assigning locations to each operand. 514 SmallVector<CCValAssign, 16> ArgLocs; 515 CCState ArgCCInfo(CallConv, IsVarArg, MF, ArgLocs, *DAG.getContext()); 516 517 ArgCCInfo.AnalyzeCallOperands(Outs, CCAssignFnForCall(CallConv, IsVarArg)); 518 519 // Check if it's really possible to do a tail call. 520 if (IsTailCall) 521 IsTailCall = false; // TODO: TailCallOptimization; 522 523 if (IsTailCall) 524 ++NumTailCalls; 525 else if (CLI.CB && CLI.CB->isMustTailCall()) 526 report_fatal_error("failed to perform tail call elimination on a call " 527 "site marked musttail"); 528 529 // Get a count of how many bytes are to be pushed on the stack. 530 unsigned NumBytes = ArgCCInfo.getNextStackOffset(); 531 532 // Create local copies for byval args 533 SmallVector<SDValue, 8> ByValArgs; 534 for (unsigned i = 0, e = Outs.size(); i != e; ++i) { 535 ISD::ArgFlagsTy Flags = Outs[i].Flags; 536 if (!Flags.isByVal()) 537 continue; 538 539 SDValue Arg = OutVals[i]; 540 unsigned Size = Flags.getByValSize(); 541 Align Alignment = Flags.getNonZeroByValAlign(); 542 543 int FI = 544 MF.getFrameInfo().CreateStackObject(Size, Alignment, /*isSS=*/false); 545 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout())); 546 SDValue SizeNode = DAG.getConstant(Size, DL, XLenVT); 547 548 Chain = DAG.getMemcpy(Chain, DL, FIPtr, Arg, SizeNode, Alignment, 549 /*IsVolatile=*/false, 550 /*AlwaysInline=*/false, IsTailCall, 551 MachinePointerInfo(), MachinePointerInfo()); 552 ByValArgs.push_back(FIPtr); 553 } 554 555 if (!IsTailCall) 556 Chain = DAG.getCALLSEQ_START(Chain, NumBytes, 0, CLI.DL); 557 558 // Copy argument values to their designated locations. 559 SmallVector<std::pair<Register, SDValue>, 8> RegsToPass; 560 SmallVector<SDValue, 8> MemOpChains; 561 SDValue StackPtr; 562 for (unsigned i = 0, j = 0, e = ArgLocs.size(); i != e; ++i) { 563 CCValAssign &VA = ArgLocs[i]; 564 SDValue ArgValue = OutVals[i]; 565 ISD::ArgFlagsTy Flags = Outs[i].Flags; 566 567 bool IsF64OnCSKY = VA.getLocVT() == MVT::i32 && VA.getValVT() == MVT::f64; 568 569 if (IsF64OnCSKY && VA.isRegLoc()) { 570 SDValue Split64 = 571 DAG.getNode(CSKYISD::BITCAST_TO_LOHI, DL, 572 DAG.getVTList(MVT::i32, MVT::i32), ArgValue); 573 SDValue Lo = Split64.getValue(0); 574 SDValue Hi = Split64.getValue(1); 575 576 Register RegLo = VA.getLocReg(); 577 RegsToPass.push_back(std::make_pair(RegLo, Lo)); 578 579 if (RegLo == CSKY::R3) { 580 // Second half of f64/i64 is passed on the stack. 581 // Work out the address of the stack slot. 582 if (!StackPtr.getNode()) 583 StackPtr = DAG.getCopyFromReg(Chain, DL, CSKY::R14, PtrVT); 584 // Emit the store. 585 MemOpChains.push_back( 586 DAG.getStore(Chain, DL, Hi, StackPtr, MachinePointerInfo())); 587 } else { 588 // Second half of f64/i64 is passed in another GPR. 589 assert(RegLo < CSKY::R31 && "Invalid register pair"); 590 Register RegHigh = RegLo + 1; 591 RegsToPass.push_back(std::make_pair(RegHigh, Hi)); 592 } 593 continue; 594 } 595 596 ArgValue = convertValVTToLocVT(DAG, ArgValue, VA, DL); 597 598 // Use local copy if it is a byval arg. 599 if (Flags.isByVal()) 600 ArgValue = ByValArgs[j++]; 601 602 if (VA.isRegLoc()) { 603 // Queue up the argument copies and emit them at the end. 604 RegsToPass.push_back(std::make_pair(VA.getLocReg(), ArgValue)); 605 } else { 606 assert(VA.isMemLoc() && "Argument not register or memory"); 607 assert(!IsTailCall && "Tail call not allowed if stack is used " 608 "for passing parameters"); 609 610 // Work out the address of the stack slot. 611 if (!StackPtr.getNode()) 612 StackPtr = DAG.getCopyFromReg(Chain, DL, CSKY::R14, PtrVT); 613 SDValue Address = 614 DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, 615 DAG.getIntPtrConstant(VA.getLocMemOffset(), DL)); 616 617 // Emit the store. 618 MemOpChains.push_back( 619 DAG.getStore(Chain, DL, ArgValue, Address, MachinePointerInfo())); 620 } 621 } 622 623 // Join the stores, which are independent of one another. 624 if (!MemOpChains.empty()) 625 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains); 626 627 SDValue Glue; 628 629 // Build a sequence of copy-to-reg nodes, chained and glued together. 630 for (auto &Reg : RegsToPass) { 631 Chain = DAG.getCopyToReg(Chain, DL, Reg.first, Reg.second, Glue); 632 Glue = Chain.getValue(1); 633 } 634 635 SmallVector<SDValue, 8> Ops; 636 EVT Ty = getPointerTy(DAG.getDataLayout()); 637 bool IsRegCall = false; 638 639 Ops.push_back(Chain); 640 641 if (GlobalAddressSDNode *S = dyn_cast<GlobalAddressSDNode>(Callee)) { 642 const GlobalValue *GV = S->getGlobal(); 643 bool IsLocal = 644 getTargetMachine().shouldAssumeDSOLocal(*GV->getParent(), GV); 645 646 if (isPositionIndependent() || !Subtarget.has2E3()) { 647 IsRegCall = true; 648 Ops.push_back(getAddr<GlobalAddressSDNode, true>(S, DAG, IsLocal)); 649 } else { 650 Ops.push_back(getTargetNode(cast<GlobalAddressSDNode>(Callee), DL, Ty, 651 DAG, CSKYII::MO_None)); 652 Ops.push_back(getTargetConstantPoolValue( 653 cast<GlobalAddressSDNode>(Callee), Ty, DAG, CSKYII::MO_None)); 654 } 655 } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) { 656 bool IsLocal = getTargetMachine().shouldAssumeDSOLocal( 657 *MF.getFunction().getParent(), nullptr); 658 659 if (isPositionIndependent() || !Subtarget.has2E3()) { 660 IsRegCall = true; 661 Ops.push_back(getAddr<ExternalSymbolSDNode, true>(S, DAG, IsLocal)); 662 } else { 663 Ops.push_back(getTargetNode(cast<ExternalSymbolSDNode>(Callee), DL, Ty, 664 DAG, CSKYII::MO_None)); 665 Ops.push_back(getTargetConstantPoolValue( 666 cast<ExternalSymbolSDNode>(Callee), Ty, DAG, CSKYII::MO_None)); 667 } 668 } else { 669 IsRegCall = true; 670 Ops.push_back(Callee); 671 } 672 673 // Add argument registers to the end of the list so that they are 674 // known live into the call. 675 for (auto &Reg : RegsToPass) 676 Ops.push_back(DAG.getRegister(Reg.first, Reg.second.getValueType())); 677 678 if (!IsTailCall) { 679 // Add a register mask operand representing the call-preserved registers. 680 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo(); 681 const uint32_t *Mask = TRI->getCallPreservedMask(MF, CallConv); 682 assert(Mask && "Missing call preserved mask for calling convention"); 683 Ops.push_back(DAG.getRegisterMask(Mask)); 684 } 685 686 // Glue the call to the argument copies, if any. 687 if (Glue.getNode()) 688 Ops.push_back(Glue); 689 690 // Emit the call. 691 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue); 692 693 if (IsTailCall) { 694 MF.getFrameInfo().setHasTailCall(); 695 return DAG.getNode(IsRegCall ? CSKYISD::TAILReg : CSKYISD::TAIL, DL, 696 NodeTys, Ops); 697 } 698 699 Chain = DAG.getNode(IsRegCall ? CSKYISD::CALLReg : CSKYISD::CALL, DL, NodeTys, 700 Ops); 701 DAG.addNoMergeSiteInfo(Chain.getNode(), CLI.NoMerge); 702 Glue = Chain.getValue(1); 703 704 // Mark the end of the call, which is glued to the call itself. 705 Chain = DAG.getCALLSEQ_END(Chain, DAG.getConstant(NumBytes, DL, PtrVT, true), 706 DAG.getConstant(0, DL, PtrVT, true), Glue, DL); 707 Glue = Chain.getValue(1); 708 709 // Assign locations to each value returned by this call. 710 SmallVector<CCValAssign, 16> CSKYLocs; 711 CCState RetCCInfo(CallConv, IsVarArg, MF, CSKYLocs, *DAG.getContext()); 712 RetCCInfo.AnalyzeCallResult(Ins, CCAssignFnForReturn(CallConv, IsVarArg)); 713 714 // Copy all of the result registers out of their specified physreg. 715 for (auto &VA : CSKYLocs) { 716 // Copy the value out 717 SDValue RetValue = 718 DAG.getCopyFromReg(Chain, DL, VA.getLocReg(), VA.getLocVT(), Glue); 719 // Glue the RetValue to the end of the call sequence 720 Chain = RetValue.getValue(1); 721 Glue = RetValue.getValue(2); 722 723 bool IsF64OnCSKY = VA.getLocVT() == MVT::i32 && VA.getValVT() == MVT::f64; 724 725 if (IsF64OnCSKY) { 726 assert(VA.getLocReg() == GPRArgRegs[0] && "Unexpected reg assignment"); 727 SDValue RetValue2 = 728 DAG.getCopyFromReg(Chain, DL, GPRArgRegs[1], MVT::i32, Glue); 729 Chain = RetValue2.getValue(1); 730 Glue = RetValue2.getValue(2); 731 RetValue = DAG.getNode(CSKYISD::BITCAST_FROM_LOHI, DL, VA.getValVT(), 732 RetValue, RetValue2); 733 } 734 735 RetValue = convertLocVTToValVT(DAG, RetValue, VA, DL); 736 737 InVals.push_back(RetValue); 738 } 739 740 return Chain; 741 } 742 743 CCAssignFn *CSKYTargetLowering::CCAssignFnForReturn(CallingConv::ID CC, 744 bool IsVarArg) const { 745 if (IsVarArg || !Subtarget.useHardFloatABI()) 746 return RetCC_CSKY_ABIV2_SOFT; 747 else 748 return RetCC_CSKY_ABIV2_FP; 749 } 750 751 CCAssignFn *CSKYTargetLowering::CCAssignFnForCall(CallingConv::ID CC, 752 bool IsVarArg) const { 753 if (IsVarArg || !Subtarget.useHardFloatABI()) 754 return CC_CSKY_ABIV2_SOFT; 755 else 756 return CC_CSKY_ABIV2_FP; 757 } 758 759 static CSKYCP::CSKYCPModifier getModifier(unsigned Flags) { 760 761 if (Flags == CSKYII::MO_ADDR32) 762 return CSKYCP::ADDR; 763 else if (Flags == CSKYII::MO_GOT32) 764 return CSKYCP::GOT; 765 else if (Flags == CSKYII::MO_GOTOFF) 766 return CSKYCP::GOTOFF; 767 else if (Flags == CSKYII::MO_PLT32) 768 return CSKYCP::PLT; 769 else if (Flags == CSKYII::MO_None) 770 return CSKYCP::NO_MOD; 771 else 772 assert(0 && "unknown CSKYII Modifier"); 773 return CSKYCP::NO_MOD; 774 } 775 776 SDValue CSKYTargetLowering::getTargetConstantPoolValue(GlobalAddressSDNode *N, 777 EVT Ty, 778 SelectionDAG &DAG, 779 unsigned Flags) const { 780 CSKYConstantPoolValue *CPV = CSKYConstantPoolConstant::Create( 781 N->getGlobal(), CSKYCP::CPValue, 0, getModifier(Flags), false); 782 783 return DAG.getTargetConstantPool(CPV, Ty); 784 } 785 786 CSKYTargetLowering::ConstraintType 787 CSKYTargetLowering::getConstraintType(StringRef Constraint) const { 788 if (Constraint.size() == 1) { 789 switch (Constraint[0]) { 790 default: 791 break; 792 case 'a': 793 case 'b': 794 case 'v': 795 case 'w': 796 case 'y': 797 return C_RegisterClass; 798 case 'c': 799 case 'l': 800 case 'h': 801 case 'z': 802 return C_Register; 803 } 804 } 805 return TargetLowering::getConstraintType(Constraint); 806 } 807 808 std::pair<unsigned, const TargetRegisterClass *> 809 CSKYTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, 810 StringRef Constraint, 811 MVT VT) const { 812 if (Constraint.size() == 1) { 813 switch (Constraint[0]) { 814 case 'r': 815 return std::make_pair(0U, &CSKY::GPRRegClass); 816 case 'a': 817 return std::make_pair(0U, &CSKY::mGPRRegClass); 818 case 'b': 819 return std::make_pair(0U, &CSKY::sGPRRegClass); 820 case 'z': 821 return std::make_pair(CSKY::R14, &CSKY::GPRRegClass); 822 case 'c': 823 return std::make_pair(CSKY::C, &CSKY::CARRYRegClass); 824 case 'w': 825 if ((Subtarget.hasFPUv2SingleFloat() || 826 Subtarget.hasFPUv3SingleFloat()) && 827 VT == MVT::f32) 828 return std::make_pair(0U, &CSKY::sFPR32RegClass); 829 if ((Subtarget.hasFPUv2DoubleFloat() || 830 Subtarget.hasFPUv3DoubleFloat()) && 831 VT == MVT::f64) 832 return std::make_pair(0U, &CSKY::sFPR64RegClass); 833 break; 834 case 'v': 835 if (Subtarget.hasFPUv2SingleFloat() && VT == MVT::f32) 836 return std::make_pair(0U, &CSKY::sFPR32RegClass); 837 if (Subtarget.hasFPUv3SingleFloat() && VT == MVT::f32) 838 return std::make_pair(0U, &CSKY::FPR32RegClass); 839 if (Subtarget.hasFPUv2DoubleFloat() && VT == MVT::f64) 840 return std::make_pair(0U, &CSKY::sFPR64RegClass); 841 if (Subtarget.hasFPUv3DoubleFloat() && VT == MVT::f64) 842 return std::make_pair(0U, &CSKY::FPR64RegClass); 843 break; 844 default: 845 break; 846 } 847 } 848 849 if (Constraint == "{c}") 850 return std::make_pair(CSKY::C, &CSKY::CARRYRegClass); 851 852 // Clang will correctly decode the usage of register name aliases into their 853 // official names. However, other frontends like `rustc` do not. This allows 854 // users of these frontends to use the ABI names for registers in LLVM-style 855 // register constraints. 856 unsigned XRegFromAlias = StringSwitch<unsigned>(Constraint.lower()) 857 .Case("{a0}", CSKY::R0) 858 .Case("{a1}", CSKY::R1) 859 .Case("{a2}", CSKY::R2) 860 .Case("{a3}", CSKY::R3) 861 .Case("{l0}", CSKY::R4) 862 .Case("{l1}", CSKY::R5) 863 .Case("{l2}", CSKY::R6) 864 .Case("{l3}", CSKY::R7) 865 .Case("{l4}", CSKY::R8) 866 .Case("{l5}", CSKY::R9) 867 .Case("{l6}", CSKY::R10) 868 .Case("{l7}", CSKY::R11) 869 .Case("{t0}", CSKY::R12) 870 .Case("{t1}", CSKY::R13) 871 .Case("{sp}", CSKY::R14) 872 .Case("{lr}", CSKY::R15) 873 .Case("{l8}", CSKY::R16) 874 .Case("{l9}", CSKY::R17) 875 .Case("{t2}", CSKY::R18) 876 .Case("{t3}", CSKY::R19) 877 .Case("{t4}", CSKY::R20) 878 .Case("{t5}", CSKY::R21) 879 .Case("{t6}", CSKY::R22) 880 .Cases("{t7}", "{fp}", CSKY::R23) 881 .Cases("{t8}", "{top}", CSKY::R24) 882 .Cases("{t9}", "{bsp}", CSKY::R25) 883 .Case("{r26}", CSKY::R26) 884 .Case("{r27}", CSKY::R27) 885 .Cases("{gb}", "{rgb}", "{rdb}", CSKY::R28) 886 .Cases("{tb}", "{rtb}", CSKY::R29) 887 .Case("{svbr}", CSKY::R30) 888 .Case("{tls}", CSKY::R31) 889 .Default(CSKY::NoRegister); 890 891 if (XRegFromAlias != CSKY::NoRegister) 892 return std::make_pair(XRegFromAlias, &CSKY::GPRRegClass); 893 894 // Since TargetLowering::getRegForInlineAsmConstraint uses the name of the 895 // TableGen record rather than the AsmName to choose registers for InlineAsm 896 // constraints, plus we want to match those names to the widest floating point 897 // register type available, manually select floating point registers here. 898 // 899 // The second case is the ABI name of the register, so that frontends can also 900 // use the ABI names in register constraint lists. 901 if (Subtarget.useHardFloat()) { 902 unsigned FReg = StringSwitch<unsigned>(Constraint.lower()) 903 .Cases("{fr0}", "{vr0}", CSKY::F0_32) 904 .Cases("{fr1}", "{vr1}", CSKY::F1_32) 905 .Cases("{fr2}", "{vr2}", CSKY::F2_32) 906 .Cases("{fr3}", "{vr3}", CSKY::F3_32) 907 .Cases("{fr4}", "{vr4}", CSKY::F4_32) 908 .Cases("{fr5}", "{vr5}", CSKY::F5_32) 909 .Cases("{fr6}", "{vr6}", CSKY::F6_32) 910 .Cases("{fr7}", "{vr7}", CSKY::F7_32) 911 .Cases("{fr8}", "{vr8}", CSKY::F8_32) 912 .Cases("{fr9}", "{vr9}", CSKY::F9_32) 913 .Cases("{fr10}", "{vr10}", CSKY::F10_32) 914 .Cases("{fr11}", "{vr11}", CSKY::F11_32) 915 .Cases("{fr12}", "{vr12}", CSKY::F12_32) 916 .Cases("{fr13}", "{vr13}", CSKY::F13_32) 917 .Cases("{fr14}", "{vr14}", CSKY::F14_32) 918 .Cases("{fr15}", "{vr15}", CSKY::F15_32) 919 .Cases("{fr16}", "{vr16}", CSKY::F16_32) 920 .Cases("{fr17}", "{vr17}", CSKY::F17_32) 921 .Cases("{fr18}", "{vr18}", CSKY::F18_32) 922 .Cases("{fr19}", "{vr19}", CSKY::F19_32) 923 .Cases("{fr20}", "{vr20}", CSKY::F20_32) 924 .Cases("{fr21}", "{vr21}", CSKY::F21_32) 925 .Cases("{fr22}", "{vr22}", CSKY::F22_32) 926 .Cases("{fr23}", "{vr23}", CSKY::F23_32) 927 .Cases("{fr24}", "{vr24}", CSKY::F24_32) 928 .Cases("{fr25}", "{vr25}", CSKY::F25_32) 929 .Cases("{fr26}", "{vr26}", CSKY::F26_32) 930 .Cases("{fr27}", "{vr27}", CSKY::F27_32) 931 .Cases("{fr28}", "{vr28}", CSKY::F28_32) 932 .Cases("{fr29}", "{vr29}", CSKY::F29_32) 933 .Cases("{fr30}", "{vr30}", CSKY::F30_32) 934 .Cases("{fr31}", "{vr31}", CSKY::F31_32) 935 .Default(CSKY::NoRegister); 936 if (FReg != CSKY::NoRegister) { 937 assert(CSKY::F0_32 <= FReg && FReg <= CSKY::F31_32 && "Unknown fp-reg"); 938 unsigned RegNo = FReg - CSKY::F0_32; 939 unsigned DReg = CSKY::F0_64 + RegNo; 940 941 if (Subtarget.hasFPUv2DoubleFloat()) 942 return std::make_pair(DReg, &CSKY::sFPR64RegClass); 943 else if (Subtarget.hasFPUv3DoubleFloat()) 944 return std::make_pair(DReg, &CSKY::FPR64RegClass); 945 else if (Subtarget.hasFPUv2SingleFloat()) 946 return std::make_pair(FReg, &CSKY::sFPR32RegClass); 947 else if (Subtarget.hasFPUv3SingleFloat()) 948 return std::make_pair(FReg, &CSKY::FPR32RegClass); 949 } 950 } 951 952 return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT); 953 } 954 955 static MachineBasicBlock * 956 emitSelectPseudo(MachineInstr &MI, MachineBasicBlock *BB, unsigned Opcode) { 957 958 const TargetInstrInfo &TII = *BB->getParent()->getSubtarget().getInstrInfo(); 959 DebugLoc DL = MI.getDebugLoc(); 960 961 // To "insert" a SELECT instruction, we actually have to insert the 962 // diamond control-flow pattern. The incoming instruction knows the 963 // destination vreg to set, the condition code register to branch on, the 964 // true/false values to select between, and a branch opcode to use. 965 const BasicBlock *LLVM_BB = BB->getBasicBlock(); 966 MachineFunction::iterator It = ++BB->getIterator(); 967 968 // thisMBB: 969 // ... 970 // TrueVal = ... 971 // bt32 c, sinkMBB 972 // fallthrough --> copyMBB 973 MachineBasicBlock *thisMBB = BB; 974 MachineFunction *F = BB->getParent(); 975 MachineBasicBlock *copyMBB = F->CreateMachineBasicBlock(LLVM_BB); 976 MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB); 977 F->insert(It, copyMBB); 978 F->insert(It, sinkMBB); 979 980 // Transfer the remainder of BB and its successor edges to sinkMBB. 981 sinkMBB->splice(sinkMBB->begin(), BB, 982 std::next(MachineBasicBlock::iterator(MI)), BB->end()); 983 sinkMBB->transferSuccessorsAndUpdatePHIs(BB); 984 985 // Next, add the true and fallthrough blocks as its successors. 986 BB->addSuccessor(copyMBB); 987 BB->addSuccessor(sinkMBB); 988 989 // bt32 condition, sinkMBB 990 BuildMI(BB, DL, TII.get(Opcode)) 991 .addReg(MI.getOperand(1).getReg()) 992 .addMBB(sinkMBB); 993 994 // copyMBB: 995 // %FalseValue = ... 996 // # fallthrough to sinkMBB 997 BB = copyMBB; 998 999 // Update machine-CFG edges 1000 BB->addSuccessor(sinkMBB); 1001 1002 // sinkMBB: 1003 // %Result = phi [ %TrueValue, thisMBB ], [ %FalseValue, copyMBB ] 1004 // ... 1005 BB = sinkMBB; 1006 1007 BuildMI(*BB, BB->begin(), DL, TII.get(CSKY::PHI), MI.getOperand(0).getReg()) 1008 .addReg(MI.getOperand(2).getReg()) 1009 .addMBB(thisMBB) 1010 .addReg(MI.getOperand(3).getReg()) 1011 .addMBB(copyMBB); 1012 1013 MI.eraseFromParent(); // The pseudo instruction is gone now. 1014 1015 return BB; 1016 } 1017 1018 MachineBasicBlock * 1019 CSKYTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI, 1020 MachineBasicBlock *BB) const { 1021 switch (MI.getOpcode()) { 1022 default: 1023 llvm_unreachable("Unexpected instr type to insert"); 1024 case CSKY::FSELS: 1025 case CSKY::FSELD: 1026 if (Subtarget.hasE2()) 1027 return emitSelectPseudo(MI, BB, CSKY::BT32); 1028 else 1029 return emitSelectPseudo(MI, BB, CSKY::BT16); 1030 case CSKY::ISEL32: 1031 return emitSelectPseudo(MI, BB, CSKY::BT32); 1032 case CSKY::ISEL16: 1033 return emitSelectPseudo(MI, BB, CSKY::BT16); 1034 } 1035 } 1036 1037 SDValue CSKYTargetLowering::getTargetConstantPoolValue(ExternalSymbolSDNode *N, 1038 EVT Ty, 1039 SelectionDAG &DAG, 1040 unsigned Flags) const { 1041 CSKYConstantPoolValue *CPV = 1042 CSKYConstantPoolSymbol::Create(Type::getInt32Ty(*DAG.getContext()), 1043 N->getSymbol(), 0, getModifier(Flags)); 1044 1045 return DAG.getTargetConstantPool(CPV, Ty); 1046 } 1047 1048 SDValue CSKYTargetLowering::getTargetConstantPoolValue(JumpTableSDNode *N, 1049 EVT Ty, 1050 SelectionDAG &DAG, 1051 unsigned Flags) const { 1052 CSKYConstantPoolValue *CPV = 1053 CSKYConstantPoolJT::Create(Type::getInt32Ty(*DAG.getContext()), 1054 N->getIndex(), 0, getModifier(Flags)); 1055 return DAG.getTargetConstantPool(CPV, Ty); 1056 } 1057 1058 SDValue CSKYTargetLowering::getTargetConstantPoolValue(BlockAddressSDNode *N, 1059 EVT Ty, 1060 SelectionDAG &DAG, 1061 unsigned Flags) const { 1062 CSKYConstantPoolValue *CPV = CSKYConstantPoolConstant::Create( 1063 N->getBlockAddress(), CSKYCP::CPBlockAddress, 0, getModifier(Flags), 1064 false); 1065 return DAG.getTargetConstantPool(CPV, Ty); 1066 } 1067 1068 SDValue CSKYTargetLowering::getTargetNode(GlobalAddressSDNode *N, SDLoc DL, 1069 EVT Ty, SelectionDAG &DAG, 1070 unsigned Flags) const { 1071 return DAG.getTargetGlobalAddress(N->getGlobal(), DL, Ty, 0, Flags); 1072 } 1073 1074 SDValue CSKYTargetLowering::getTargetNode(ExternalSymbolSDNode *N, SDLoc DL, 1075 EVT Ty, SelectionDAG &DAG, 1076 unsigned Flags) const { 1077 return DAG.getTargetExternalSymbol(N->getSymbol(), Ty, Flags); 1078 } 1079 1080 SDValue CSKYTargetLowering::getTargetNode(JumpTableSDNode *N, SDLoc DL, EVT Ty, 1081 SelectionDAG &DAG, 1082 unsigned Flags) const { 1083 return DAG.getTargetJumpTable(N->getIndex(), Ty, Flags); 1084 } 1085 1086 SDValue CSKYTargetLowering::getTargetNode(BlockAddressSDNode *N, SDLoc DL, 1087 EVT Ty, SelectionDAG &DAG, 1088 unsigned Flags) const { 1089 return DAG.getTargetBlockAddress(N->getBlockAddress(), Ty, N->getOffset(), 1090 Flags); 1091 } 1092 1093 const char *CSKYTargetLowering::getTargetNodeName(unsigned Opcode) const { 1094 switch (Opcode) { 1095 default: 1096 llvm_unreachable("unknown CSKYISD node"); 1097 case CSKYISD::NIE: 1098 return "CSKYISD::NIE"; 1099 case CSKYISD::NIR: 1100 return "CSKYISD::NIR"; 1101 case CSKYISD::RET: 1102 return "CSKYISD::RET"; 1103 case CSKYISD::CALL: 1104 return "CSKYISD::CALL"; 1105 case CSKYISD::CALLReg: 1106 return "CSKYISD::CALLReg"; 1107 case CSKYISD::TAIL: 1108 return "CSKYISD::TAIL"; 1109 case CSKYISD::TAILReg: 1110 return "CSKYISD::TAILReg"; 1111 case CSKYISD::LOAD_ADDR: 1112 return "CSKYISD::LOAD_ADDR"; 1113 case CSKYISD::BITCAST_TO_LOHI: 1114 return "CSKYISD::BITCAST_TO_LOHI"; 1115 case CSKYISD::BITCAST_FROM_LOHI: 1116 return "CSKYISD::BITCAST_FROM_LOHI"; 1117 } 1118 } 1119 1120 SDValue CSKYTargetLowering::LowerGlobalAddress(SDValue Op, 1121 SelectionDAG &DAG) const { 1122 SDLoc DL(Op); 1123 EVT Ty = Op.getValueType(); 1124 GlobalAddressSDNode *N = cast<GlobalAddressSDNode>(Op); 1125 int64_t Offset = N->getOffset(); 1126 1127 const GlobalValue *GV = N->getGlobal(); 1128 bool IsLocal = getTargetMachine().shouldAssumeDSOLocal(*GV->getParent(), GV); 1129 SDValue Addr = getAddr<GlobalAddressSDNode, false>(N, DAG, IsLocal); 1130 1131 // In order to maximise the opportunity for common subexpression elimination, 1132 // emit a separate ADD node for the global address offset instead of folding 1133 // it in the global address node. Later peephole optimisations may choose to 1134 // fold it back in when profitable. 1135 if (Offset != 0) 1136 return DAG.getNode(ISD::ADD, DL, Ty, Addr, 1137 DAG.getConstant(Offset, DL, MVT::i32)); 1138 return Addr; 1139 } 1140 1141 SDValue CSKYTargetLowering::LowerExternalSymbol(SDValue Op, 1142 SelectionDAG &DAG) const { 1143 ExternalSymbolSDNode *N = cast<ExternalSymbolSDNode>(Op); 1144 1145 return getAddr(N, DAG, false); 1146 } 1147 1148 SDValue CSKYTargetLowering::LowerJumpTable(SDValue Op, 1149 SelectionDAG &DAG) const { 1150 JumpTableSDNode *N = cast<JumpTableSDNode>(Op); 1151 1152 return getAddr<JumpTableSDNode, false>(N, DAG); 1153 } 1154 1155 SDValue CSKYTargetLowering::LowerBlockAddress(SDValue Op, 1156 SelectionDAG &DAG) const { 1157 BlockAddressSDNode *N = cast<BlockAddressSDNode>(Op); 1158 1159 return getAddr(N, DAG); 1160 } 1161 1162 SDValue CSKYTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const { 1163 MachineFunction &MF = DAG.getMachineFunction(); 1164 CSKYMachineFunctionInfo *FuncInfo = MF.getInfo<CSKYMachineFunctionInfo>(); 1165 1166 SDLoc DL(Op); 1167 SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), 1168 getPointerTy(MF.getDataLayout())); 1169 1170 // vastart just stores the address of the VarArgsFrameIndex slot into the 1171 // memory location argument. 1172 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue(); 1173 return DAG.getStore(Op.getOperand(0), DL, FI, Op.getOperand(1), 1174 MachinePointerInfo(SV)); 1175 } 1176 1177 SDValue CSKYTargetLowering::LowerFRAMEADDR(SDValue Op, 1178 SelectionDAG &DAG) const { 1179 const CSKYRegisterInfo &RI = *Subtarget.getRegisterInfo(); 1180 MachineFunction &MF = DAG.getMachineFunction(); 1181 MachineFrameInfo &MFI = MF.getFrameInfo(); 1182 MFI.setFrameAddressIsTaken(true); 1183 1184 EVT VT = Op.getValueType(); 1185 SDLoc dl(Op); 1186 unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue(); 1187 Register FrameReg = RI.getFrameRegister(MF); 1188 SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, VT); 1189 while (Depth--) 1190 FrameAddr = DAG.getLoad(VT, dl, DAG.getEntryNode(), FrameAddr, 1191 MachinePointerInfo()); 1192 return FrameAddr; 1193 } 1194 1195 SDValue CSKYTargetLowering::LowerRETURNADDR(SDValue Op, 1196 SelectionDAG &DAG) const { 1197 const CSKYRegisterInfo &RI = *Subtarget.getRegisterInfo(); 1198 MachineFunction &MF = DAG.getMachineFunction(); 1199 MachineFrameInfo &MFI = MF.getFrameInfo(); 1200 MFI.setReturnAddressIsTaken(true); 1201 1202 if (verifyReturnAddressArgumentIsConstant(Op, DAG)) 1203 return SDValue(); 1204 1205 EVT VT = Op.getValueType(); 1206 SDLoc dl(Op); 1207 unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue(); 1208 if (Depth) { 1209 SDValue FrameAddr = LowerFRAMEADDR(Op, DAG); 1210 SDValue Offset = DAG.getConstant(4, dl, MVT::i32); 1211 return DAG.getLoad(VT, dl, DAG.getEntryNode(), 1212 DAG.getNode(ISD::ADD, dl, VT, FrameAddr, Offset), 1213 MachinePointerInfo()); 1214 } 1215 // Return the value of the return address register, marking it an implicit 1216 // live-in. 1217 unsigned Reg = MF.addLiveIn(RI.getRARegister(), getRegClassFor(MVT::i32)); 1218 return DAG.getCopyFromReg(DAG.getEntryNode(), dl, Reg, VT); 1219 } 1220 1221 Register CSKYTargetLowering::getExceptionPointerRegister( 1222 const Constant *PersonalityFn) const { 1223 return CSKY::R0; 1224 } 1225 1226 Register CSKYTargetLowering::getExceptionSelectorRegister( 1227 const Constant *PersonalityFn) const { 1228 return CSKY::R1; 1229 } 1230 1231 SDValue CSKYTargetLowering::LowerGlobalTLSAddress(SDValue Op, 1232 SelectionDAG &DAG) const { 1233 SDLoc DL(Op); 1234 EVT Ty = Op.getValueType(); 1235 GlobalAddressSDNode *N = cast<GlobalAddressSDNode>(Op); 1236 int64_t Offset = N->getOffset(); 1237 MVT XLenVT = MVT::i32; 1238 1239 TLSModel::Model Model = getTargetMachine().getTLSModel(N->getGlobal()); 1240 SDValue Addr; 1241 switch (Model) { 1242 case TLSModel::LocalExec: 1243 Addr = getStaticTLSAddr(N, DAG, /*UseGOT=*/false); 1244 break; 1245 case TLSModel::InitialExec: 1246 Addr = getStaticTLSAddr(N, DAG, /*UseGOT=*/true); 1247 break; 1248 case TLSModel::LocalDynamic: 1249 case TLSModel::GeneralDynamic: 1250 Addr = getDynamicTLSAddr(N, DAG); 1251 break; 1252 } 1253 1254 // In order to maximise the opportunity for common subexpression elimination, 1255 // emit a separate ADD node for the global address offset instead of folding 1256 // it in the global address node. Later peephole optimisations may choose to 1257 // fold it back in when profitable. 1258 if (Offset != 0) 1259 return DAG.getNode(ISD::ADD, DL, Ty, Addr, 1260 DAG.getConstant(Offset, DL, XLenVT)); 1261 return Addr; 1262 } 1263 1264 SDValue CSKYTargetLowering::getStaticTLSAddr(GlobalAddressSDNode *N, 1265 SelectionDAG &DAG, 1266 bool UseGOT) const { 1267 MachineFunction &MF = DAG.getMachineFunction(); 1268 CSKYMachineFunctionInfo *CFI = MF.getInfo<CSKYMachineFunctionInfo>(); 1269 1270 unsigned CSKYPCLabelIndex = CFI->createPICLabelUId(); 1271 1272 SDLoc DL(N); 1273 EVT Ty = getPointerTy(DAG.getDataLayout()); 1274 1275 CSKYCP::CSKYCPModifier Flag = UseGOT ? CSKYCP::TLSIE : CSKYCP::TLSLE; 1276 bool AddCurrentAddr = UseGOT ? true : false; 1277 unsigned char PCAjust = UseGOT ? 4 : 0; 1278 1279 CSKYConstantPoolValue *CPV = 1280 CSKYConstantPoolConstant::Create(N->getGlobal(), CSKYCP::CPValue, PCAjust, 1281 Flag, AddCurrentAddr, CSKYPCLabelIndex); 1282 SDValue CAddr = DAG.getTargetConstantPool(CPV, Ty); 1283 1284 SDValue Load; 1285 if (UseGOT) { 1286 SDValue PICLabel = DAG.getTargetConstant(CSKYPCLabelIndex, DL, MVT::i32); 1287 auto *LRWGRS = DAG.getMachineNode(CSKY::PseudoTLSLA32, DL, {Ty, Ty}, 1288 {CAddr, PICLabel}); 1289 auto LRWADDGRS = 1290 DAG.getNode(ISD::ADD, DL, Ty, SDValue(LRWGRS, 0), SDValue(LRWGRS, 1)); 1291 Load = DAG.getLoad(Ty, DL, DAG.getEntryNode(), LRWADDGRS, 1292 MachinePointerInfo(N->getGlobal())); 1293 } else { 1294 Load = SDValue(DAG.getMachineNode(CSKY::LRW32, DL, Ty, CAddr), 0); 1295 } 1296 1297 // Add the thread pointer. 1298 SDValue TPReg = DAG.getRegister(CSKY::R31, MVT::i32); 1299 return DAG.getNode(ISD::ADD, DL, Ty, Load, TPReg); 1300 } 1301 1302 SDValue CSKYTargetLowering::getDynamicTLSAddr(GlobalAddressSDNode *N, 1303 SelectionDAG &DAG) const { 1304 MachineFunction &MF = DAG.getMachineFunction(); 1305 CSKYMachineFunctionInfo *CFI = MF.getInfo<CSKYMachineFunctionInfo>(); 1306 1307 unsigned CSKYPCLabelIndex = CFI->createPICLabelUId(); 1308 1309 SDLoc DL(N); 1310 EVT Ty = getPointerTy(DAG.getDataLayout()); 1311 IntegerType *CallTy = Type::getIntNTy(*DAG.getContext(), Ty.getSizeInBits()); 1312 1313 CSKYConstantPoolValue *CPV = 1314 CSKYConstantPoolConstant::Create(N->getGlobal(), CSKYCP::CPValue, 4, 1315 CSKYCP::TLSGD, true, CSKYPCLabelIndex); 1316 SDValue Addr = DAG.getTargetConstantPool(CPV, Ty); 1317 SDValue PICLabel = DAG.getTargetConstant(CSKYPCLabelIndex, DL, MVT::i32); 1318 1319 auto *LRWGRS = 1320 DAG.getMachineNode(CSKY::PseudoTLSLA32, DL, {Ty, Ty}, {Addr, PICLabel}); 1321 1322 auto Load = 1323 DAG.getNode(ISD::ADD, DL, Ty, SDValue(LRWGRS, 0), SDValue(LRWGRS, 1)); 1324 1325 // Prepare argument list to generate call. 1326 ArgListTy Args; 1327 ArgListEntry Entry; 1328 Entry.Node = Load; 1329 Entry.Ty = CallTy; 1330 Args.push_back(Entry); 1331 1332 // Setup call to __tls_get_addr. 1333 TargetLowering::CallLoweringInfo CLI(DAG); 1334 CLI.setDebugLoc(DL) 1335 .setChain(DAG.getEntryNode()) 1336 .setLibCallee(CallingConv::C, CallTy, 1337 DAG.getExternalSymbol("__tls_get_addr", Ty), 1338 std::move(Args)); 1339 SDValue V = LowerCallTo(CLI).first; 1340 1341 return V; 1342 } 1343