1 //===-- M68kISelLowering.cpp - M68k DAG Lowering Impl -----------*- C++ -*-===// 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 /// \file 10 /// This file defines the interfaces that M68k uses to lower LLVM code into a 11 /// selection DAG. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #include "M68kISelLowering.h" 16 #include "M68kCallingConv.h" 17 #include "M68kMachineFunction.h" 18 #include "M68kSubtarget.h" 19 #include "M68kTargetMachine.h" 20 #include "M68kTargetObjectFile.h" 21 22 #include "llvm/ADT/Statistic.h" 23 #include "llvm/CodeGen/CallingConvLower.h" 24 #include "llvm/CodeGen/MachineFrameInfo.h" 25 #include "llvm/CodeGen/MachineFunction.h" 26 #include "llvm/CodeGen/MachineInstrBuilder.h" 27 #include "llvm/CodeGen/MachineJumpTableInfo.h" 28 #include "llvm/CodeGen/MachineRegisterInfo.h" 29 #include "llvm/CodeGen/SelectionDAG.h" 30 #include "llvm/CodeGen/ValueTypes.h" 31 #include "llvm/IR/CallingConv.h" 32 #include "llvm/IR/DerivedTypes.h" 33 #include "llvm/IR/GlobalVariable.h" 34 #include "llvm/Support/CommandLine.h" 35 #include "llvm/Support/Debug.h" 36 #include "llvm/Support/ErrorHandling.h" 37 #include "llvm/Support/KnownBits.h" 38 #include "llvm/Support/raw_ostream.h" 39 40 using namespace llvm; 41 42 #define DEBUG_TYPE "M68k-isel" 43 44 STATISTIC(NumTailCalls, "Number of tail calls"); 45 46 M68kTargetLowering::M68kTargetLowering(const M68kTargetMachine &TM, 47 const M68kSubtarget &STI) 48 : TargetLowering(TM), Subtarget(STI), TM(TM) { 49 50 MVT PtrVT = MVT::i32; 51 52 setBooleanContents(ZeroOrOneBooleanContent); 53 54 auto *RegInfo = Subtarget.getRegisterInfo(); 55 setStackPointerRegisterToSaveRestore(RegInfo->getStackRegister()); 56 57 // Set up the register classes. 58 addRegisterClass(MVT::i8, &M68k::DR8RegClass); 59 addRegisterClass(MVT::i16, &M68k::XR16RegClass); 60 addRegisterClass(MVT::i32, &M68k::XR32RegClass); 61 62 for (auto VT : MVT::integer_valuetypes()) { 63 setLoadExtAction(ISD::SEXTLOAD, VT, MVT::i1, Promote); 64 setLoadExtAction(ISD::ZEXTLOAD, VT, MVT::i1, Promote); 65 setLoadExtAction(ISD::EXTLOAD, VT, MVT::i1, Promote); 66 } 67 68 // We don't accept any truncstore of integer registers. 69 setTruncStoreAction(MVT::i64, MVT::i32, Expand); 70 setTruncStoreAction(MVT::i64, MVT::i16, Expand); 71 setTruncStoreAction(MVT::i64, MVT::i8, Expand); 72 setTruncStoreAction(MVT::i32, MVT::i16, Expand); 73 setTruncStoreAction(MVT::i32, MVT::i8, Expand); 74 setTruncStoreAction(MVT::i16, MVT::i8, Expand); 75 76 setOperationAction({ISD::MUL, ISD::SDIV, ISD::UDIV}, MVT::i8, Promote); 77 setOperationAction({ISD::MUL, ISD::SDIV, ISD::UDIV}, MVT::i16, Legal); 78 if (Subtarget.atLeastM68020()) 79 setOperationAction({ISD::MUL, ISD::SDIV, ISD::UDIV}, MVT::i32, Legal); 80 else 81 setOperationAction({ISD::MUL, ISD::SDIV, ISD::UDIV}, MVT::i32, LibCall); 82 setOperationAction(ISD::MUL, MVT::i64, LibCall); 83 84 for (auto OP : 85 {ISD::SREM, ISD::UREM, ISD::UDIVREM, ISD::SDIVREM, 86 ISD::MULHS, ISD::MULHU, ISD::UMUL_LOHI, ISD::SMUL_LOHI}) { 87 setOperationAction(OP, MVT::i8, Promote); 88 setOperationAction(OP, MVT::i16, Legal); 89 setOperationAction(OP, MVT::i32, LibCall); 90 } 91 92 for (auto OP : {ISD::UMUL_LOHI, ISD::SMUL_LOHI}) { 93 setOperationAction(OP, MVT::i8, Expand); 94 setOperationAction(OP, MVT::i16, Expand); 95 } 96 97 // FIXME It would be better to use a custom lowering 98 for (auto OP : {ISD::SMULO, ISD::UMULO}) { 99 setOperationAction(OP, MVT::i8, Expand); 100 setOperationAction(OP, MVT::i16, Expand); 101 setOperationAction(OP, MVT::i32, Expand); 102 } 103 104 for (auto OP : {ISD::SHL_PARTS, ISD::SRA_PARTS, ISD::SRL_PARTS}) 105 setOperationAction(OP, MVT::i32, Custom); 106 107 // Add/Sub overflow ops with MVT::Glues are lowered to CCR dependences. 108 for (auto VT : {MVT::i8, MVT::i16, MVT::i32}) { 109 setOperationAction(ISD::ADDC, VT, Custom); 110 setOperationAction(ISD::ADDE, VT, Custom); 111 setOperationAction(ISD::SUBC, VT, Custom); 112 setOperationAction(ISD::SUBE, VT, Custom); 113 } 114 115 // SADDO and friends are legal with this setup, i hope 116 for (auto VT : {MVT::i8, MVT::i16, MVT::i32}) { 117 setOperationAction(ISD::SADDO, VT, Custom); 118 setOperationAction(ISD::UADDO, VT, Custom); 119 setOperationAction(ISD::SSUBO, VT, Custom); 120 setOperationAction(ISD::USUBO, VT, Custom); 121 } 122 123 setOperationAction(ISD::BR_JT, MVT::Other, Expand); 124 setOperationAction(ISD::BRCOND, MVT::Other, Custom); 125 126 for (auto VT : {MVT::i8, MVT::i16, MVT::i32}) { 127 setOperationAction(ISD::BR_CC, VT, Expand); 128 setOperationAction(ISD::SELECT, VT, Custom); 129 setOperationAction(ISD::SELECT_CC, VT, Expand); 130 setOperationAction(ISD::SETCC, VT, Custom); 131 setOperationAction(ISD::SETCCCARRY, VT, Custom); 132 } 133 134 for (auto VT : {MVT::i8, MVT::i16, MVT::i32}) { 135 setOperationAction(ISD::BSWAP, VT, Expand); 136 setOperationAction(ISD::CTTZ, VT, Expand); 137 setOperationAction(ISD::CTLZ, VT, Expand); 138 setOperationAction(ISD::CTPOP, VT, Expand); 139 } 140 141 setOperationAction(ISD::ConstantPool, MVT::i32, Custom); 142 setOperationAction(ISD::JumpTable, MVT::i32, Custom); 143 setOperationAction(ISD::GlobalAddress, MVT::i32, Custom); 144 setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom); 145 setOperationAction(ISD::ExternalSymbol, MVT::i32, Custom); 146 setOperationAction(ISD::BlockAddress, MVT::i32, Custom); 147 148 setOperationAction(ISD::VASTART, MVT::Other, Custom); 149 setOperationAction(ISD::VAEND, MVT::Other, Expand); 150 setOperationAction(ISD::VAARG, MVT::Other, Expand); 151 setOperationAction(ISD::VACOPY, MVT::Other, Expand); 152 153 setOperationAction(ISD::STACKSAVE, MVT::Other, Expand); 154 setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand); 155 156 setOperationAction(ISD::DYNAMIC_STACKALLOC, PtrVT, Custom); 157 158 computeRegisterProperties(STI.getRegisterInfo()); 159 160 // We lower the `atomic-compare-and-swap` to `__sync_val_compare_and_swap` 161 // for subtarget < M68020 162 setMaxAtomicSizeInBitsSupported(32); 163 setOperationAction(ISD::ATOMIC_CMP_SWAP, {MVT::i8, MVT::i16, MVT::i32}, 164 Subtarget.atLeastM68020() ? Legal : LibCall); 165 166 setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Custom); 167 168 // M68k does not have native read-modify-write support, so expand all of them 169 // to `__sync_fetch_*` for target < M68020, otherwise expand to CmpxChg. 170 // See `shouldExpandAtomicRMWInIR` below. 171 setOperationAction( 172 { 173 ISD::ATOMIC_LOAD_ADD, 174 ISD::ATOMIC_LOAD_SUB, 175 ISD::ATOMIC_LOAD_AND, 176 ISD::ATOMIC_LOAD_OR, 177 ISD::ATOMIC_LOAD_XOR, 178 ISD::ATOMIC_LOAD_NAND, 179 ISD::ATOMIC_LOAD_MIN, 180 ISD::ATOMIC_LOAD_MAX, 181 ISD::ATOMIC_LOAD_UMIN, 182 ISD::ATOMIC_LOAD_UMAX, 183 ISD::ATOMIC_SWAP, 184 }, 185 {MVT::i8, MVT::i16, MVT::i32}, LibCall); 186 187 setMinFunctionAlignment(Align(2)); 188 } 189 190 TargetLoweringBase::AtomicExpansionKind 191 M68kTargetLowering::shouldExpandAtomicRMWInIR(AtomicRMWInst *RMW) const { 192 return Subtarget.atLeastM68020() 193 ? TargetLoweringBase::AtomicExpansionKind::CmpXChg 194 : TargetLoweringBase::AtomicExpansionKind::None; 195 } 196 197 Register 198 M68kTargetLowering::getExceptionPointerRegister(const Constant *) const { 199 return M68k::D0; 200 } 201 202 Register 203 M68kTargetLowering::getExceptionSelectorRegister(const Constant *) const { 204 return M68k::D1; 205 } 206 207 unsigned 208 M68kTargetLowering::getInlineAsmMemConstraint(StringRef ConstraintCode) const { 209 return StringSwitch<unsigned>(ConstraintCode) 210 .Case("Q", InlineAsm::Constraint_Q) 211 .Case("U", InlineAsm::Constraint_Um) // We borrow Constraint_Um for 'U'. 212 .Default(TargetLowering::getInlineAsmMemConstraint(ConstraintCode)); 213 } 214 215 EVT M68kTargetLowering::getSetCCResultType(const DataLayout &DL, 216 LLVMContext &Context, EVT VT) const { 217 // M68k SETcc producess either 0x00 or 0xFF 218 return MVT::i8; 219 } 220 221 MVT M68kTargetLowering::getScalarShiftAmountTy(const DataLayout &DL, 222 EVT Ty) const { 223 if (Ty.isSimple()) { 224 return Ty.getSimpleVT(); 225 } 226 return MVT::getIntegerVT(DL.getPointerSizeInBits(0)); 227 } 228 229 #include "M68kGenCallingConv.inc" 230 231 enum StructReturnType { NotStructReturn, RegStructReturn, StackStructReturn }; 232 233 static StructReturnType 234 callIsStructReturn(const SmallVectorImpl<ISD::OutputArg> &Outs) { 235 if (Outs.empty()) 236 return NotStructReturn; 237 238 const ISD::ArgFlagsTy &Flags = Outs[0].Flags; 239 if (!Flags.isSRet()) 240 return NotStructReturn; 241 if (Flags.isInReg()) 242 return RegStructReturn; 243 return StackStructReturn; 244 } 245 246 /// Determines whether a function uses struct return semantics. 247 static StructReturnType 248 argsAreStructReturn(const SmallVectorImpl<ISD::InputArg> &Ins) { 249 if (Ins.empty()) 250 return NotStructReturn; 251 252 const ISD::ArgFlagsTy &Flags = Ins[0].Flags; 253 if (!Flags.isSRet()) 254 return NotStructReturn; 255 if (Flags.isInReg()) 256 return RegStructReturn; 257 return StackStructReturn; 258 } 259 260 /// Make a copy of an aggregate at address specified by "Src" to address 261 /// "Dst" with size and alignment information specified by the specific 262 /// parameter attribute. The copy will be passed as a byval function parameter. 263 static SDValue CreateCopyOfByValArgument(SDValue Src, SDValue Dst, 264 SDValue Chain, ISD::ArgFlagsTy Flags, 265 SelectionDAG &DAG, const SDLoc &DL) { 266 SDValue SizeNode = DAG.getConstant(Flags.getByValSize(), DL, MVT::i32); 267 268 return DAG.getMemcpy( 269 Chain, DL, Dst, Src, SizeNode, Flags.getNonZeroByValAlign(), 270 /*isVolatile=*/false, /*AlwaysInline=*/true, 271 /*isTailCall=*/false, MachinePointerInfo(), MachinePointerInfo()); 272 } 273 274 /// Return true if the calling convention is one that we can guarantee TCO for. 275 static bool canGuaranteeTCO(CallingConv::ID CC) { return false; } 276 277 /// Return true if we might ever do TCO for calls with this calling convention. 278 static bool mayTailCallThisCC(CallingConv::ID CC) { 279 switch (CC) { 280 // C calling conventions: 281 case CallingConv::C: 282 return true; 283 default: 284 return canGuaranteeTCO(CC); 285 } 286 } 287 288 /// Return true if the function is being made into a tailcall target by 289 /// changing its ABI. 290 static bool shouldGuaranteeTCO(CallingConv::ID CC, bool GuaranteedTailCallOpt) { 291 return GuaranteedTailCallOpt && canGuaranteeTCO(CC); 292 } 293 294 /// Return true if the given stack call argument is already available in the 295 /// same position (relatively) of the caller's incoming argument stack. 296 static bool MatchingStackOffset(SDValue Arg, unsigned Offset, 297 ISD::ArgFlagsTy Flags, MachineFrameInfo &MFI, 298 const MachineRegisterInfo *MRI, 299 const M68kInstrInfo *TII, 300 const CCValAssign &VA) { 301 unsigned Bytes = Arg.getValueType().getSizeInBits() / 8; 302 303 for (;;) { 304 // Look through nodes that don't alter the bits of the incoming value. 305 unsigned Op = Arg.getOpcode(); 306 if (Op == ISD::ZERO_EXTEND || Op == ISD::ANY_EXTEND || Op == ISD::BITCAST) { 307 Arg = Arg.getOperand(0); 308 continue; 309 } 310 if (Op == ISD::TRUNCATE) { 311 const SDValue &TruncInput = Arg.getOperand(0); 312 if (TruncInput.getOpcode() == ISD::AssertZext && 313 cast<VTSDNode>(TruncInput.getOperand(1))->getVT() == 314 Arg.getValueType()) { 315 Arg = TruncInput.getOperand(0); 316 continue; 317 } 318 } 319 break; 320 } 321 322 int FI = INT_MAX; 323 if (Arg.getOpcode() == ISD::CopyFromReg) { 324 Register VR = cast<RegisterSDNode>(Arg.getOperand(1))->getReg(); 325 if (!Register::isVirtualRegister(VR)) 326 return false; 327 MachineInstr *Def = MRI->getVRegDef(VR); 328 if (!Def) 329 return false; 330 if (!Flags.isByVal()) { 331 if (!TII->isLoadFromStackSlot(*Def, FI)) 332 return false; 333 } else { 334 unsigned Opcode = Def->getOpcode(); 335 if ((Opcode == M68k::LEA32p || Opcode == M68k::LEA32f) && 336 Def->getOperand(1).isFI()) { 337 FI = Def->getOperand(1).getIndex(); 338 Bytes = Flags.getByValSize(); 339 } else 340 return false; 341 } 342 } else if (auto *Ld = dyn_cast<LoadSDNode>(Arg)) { 343 if (Flags.isByVal()) 344 // ByVal argument is passed in as a pointer but it's now being 345 // dereferenced. e.g. 346 // define @foo(%struct.X* %A) { 347 // tail call @bar(%struct.X* byval %A) 348 // } 349 return false; 350 SDValue Ptr = Ld->getBasePtr(); 351 FrameIndexSDNode *FINode = dyn_cast<FrameIndexSDNode>(Ptr); 352 if (!FINode) 353 return false; 354 FI = FINode->getIndex(); 355 } else if (Arg.getOpcode() == ISD::FrameIndex && Flags.isByVal()) { 356 FrameIndexSDNode *FINode = cast<FrameIndexSDNode>(Arg); 357 FI = FINode->getIndex(); 358 Bytes = Flags.getByValSize(); 359 } else 360 return false; 361 362 assert(FI != INT_MAX); 363 if (!MFI.isFixedObjectIndex(FI)) 364 return false; 365 366 if (Offset != MFI.getObjectOffset(FI)) 367 return false; 368 369 if (VA.getLocVT().getSizeInBits() > Arg.getValueType().getSizeInBits()) { 370 // If the argument location is wider than the argument type, check that any 371 // extension flags match. 372 if (Flags.isZExt() != MFI.isObjectZExt(FI) || 373 Flags.isSExt() != MFI.isObjectSExt(FI)) { 374 return false; 375 } 376 } 377 378 return Bytes == MFI.getObjectSize(FI); 379 } 380 381 SDValue 382 M68kTargetLowering::getReturnAddressFrameIndex(SelectionDAG &DAG) const { 383 MachineFunction &MF = DAG.getMachineFunction(); 384 M68kMachineFunctionInfo *FuncInfo = MF.getInfo<M68kMachineFunctionInfo>(); 385 int ReturnAddrIndex = FuncInfo->getRAIndex(); 386 387 if (ReturnAddrIndex == 0) { 388 // Set up a frame object for the return address. 389 unsigned SlotSize = Subtarget.getSlotSize(); 390 ReturnAddrIndex = MF.getFrameInfo().CreateFixedObject( 391 SlotSize, -(int64_t)SlotSize, false); 392 FuncInfo->setRAIndex(ReturnAddrIndex); 393 } 394 395 return DAG.getFrameIndex(ReturnAddrIndex, getPointerTy(DAG.getDataLayout())); 396 } 397 398 SDValue M68kTargetLowering::EmitTailCallLoadRetAddr(SelectionDAG &DAG, 399 SDValue &OutRetAddr, 400 SDValue Chain, 401 bool IsTailCall, int FPDiff, 402 const SDLoc &DL) const { 403 EVT VT = getPointerTy(DAG.getDataLayout()); 404 OutRetAddr = getReturnAddressFrameIndex(DAG); 405 406 // Load the "old" Return address. 407 OutRetAddr = DAG.getLoad(VT, DL, Chain, OutRetAddr, MachinePointerInfo()); 408 return SDValue(OutRetAddr.getNode(), 1); 409 } 410 411 SDValue M68kTargetLowering::EmitTailCallStoreRetAddr( 412 SelectionDAG &DAG, MachineFunction &MF, SDValue Chain, SDValue RetFI, 413 EVT PtrVT, unsigned SlotSize, int FPDiff, const SDLoc &DL) const { 414 if (!FPDiff) 415 return Chain; 416 417 // Calculate the new stack slot for the return address. 418 int NewFO = MF.getFrameInfo().CreateFixedObject( 419 SlotSize, (int64_t)FPDiff - SlotSize, false); 420 421 SDValue NewFI = DAG.getFrameIndex(NewFO, PtrVT); 422 // Store the return address to the appropriate stack slot. 423 Chain = DAG.getStore( 424 Chain, DL, RetFI, NewFI, 425 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), NewFO)); 426 return Chain; 427 } 428 429 SDValue 430 M68kTargetLowering::LowerMemArgument(SDValue Chain, CallingConv::ID CallConv, 431 const SmallVectorImpl<ISD::InputArg> &Ins, 432 const SDLoc &DL, SelectionDAG &DAG, 433 const CCValAssign &VA, 434 MachineFrameInfo &MFI, 435 unsigned ArgIdx) const { 436 // Create the nodes corresponding to a load from this parameter slot. 437 ISD::ArgFlagsTy Flags = Ins[ArgIdx].Flags; 438 EVT ValVT; 439 440 // If value is passed by pointer we have address passed instead of the value 441 // itself. 442 if (VA.getLocInfo() == CCValAssign::Indirect) 443 ValVT = VA.getLocVT(); 444 else 445 ValVT = VA.getValVT(); 446 447 // Because we are dealing with BE architecture we need to offset loading of 448 // partial types 449 int Offset = VA.getLocMemOffset(); 450 if (VA.getValVT() == MVT::i8) { 451 Offset += 3; 452 } else if (VA.getValVT() == MVT::i16) { 453 Offset += 2; 454 } 455 456 // TODO Interrupt handlers 457 // Calculate SP offset of interrupt parameter, re-arrange the slot normally 458 // taken by a return address. 459 460 // FIXME For now, all byval parameter objects are marked mutable. This can 461 // be changed with more analysis. In case of tail call optimization mark all 462 // arguments mutable. Since they could be overwritten by lowering of arguments 463 // in case of a tail call. 464 bool AlwaysUseMutable = shouldGuaranteeTCO( 465 CallConv, DAG.getTarget().Options.GuaranteedTailCallOpt); 466 bool IsImmutable = !AlwaysUseMutable && !Flags.isByVal(); 467 468 if (Flags.isByVal()) { 469 unsigned Bytes = Flags.getByValSize(); 470 if (Bytes == 0) 471 Bytes = 1; // Don't create zero-sized stack objects. 472 int FI = MFI.CreateFixedObject(Bytes, Offset, IsImmutable); 473 // TODO Interrupt handlers 474 // Adjust SP offset of interrupt parameter. 475 return DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout())); 476 } else { 477 int FI = 478 MFI.CreateFixedObject(ValVT.getSizeInBits() / 8, Offset, IsImmutable); 479 480 // Set SExt or ZExt flag. 481 if (VA.getLocInfo() == CCValAssign::ZExt) { 482 MFI.setObjectZExt(FI, true); 483 } else if (VA.getLocInfo() == CCValAssign::SExt) { 484 MFI.setObjectSExt(FI, true); 485 } 486 487 // TODO Interrupt handlers 488 // Adjust SP offset of interrupt parameter. 489 490 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout())); 491 SDValue Val = DAG.getLoad( 492 ValVT, DL, Chain, FIN, 493 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI)); 494 return VA.isExtInLoc() ? DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), Val) 495 : Val; 496 } 497 } 498 499 SDValue M68kTargetLowering::LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, 500 SDValue Arg, const SDLoc &DL, 501 SelectionDAG &DAG, 502 const CCValAssign &VA, 503 ISD::ArgFlagsTy Flags) const { 504 unsigned LocMemOffset = VA.getLocMemOffset(); 505 SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset, DL); 506 PtrOff = DAG.getNode(ISD::ADD, DL, getPointerTy(DAG.getDataLayout()), 507 StackPtr, PtrOff); 508 if (Flags.isByVal()) 509 return CreateCopyOfByValArgument(Arg, PtrOff, Chain, Flags, DAG, DL); 510 511 return DAG.getStore( 512 Chain, DL, Arg, PtrOff, 513 MachinePointerInfo::getStack(DAG.getMachineFunction(), LocMemOffset)); 514 } 515 516 //===----------------------------------------------------------------------===// 517 // Call 518 //===----------------------------------------------------------------------===// 519 520 SDValue M68kTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, 521 SmallVectorImpl<SDValue> &InVals) const { 522 SelectionDAG &DAG = CLI.DAG; 523 SDLoc &DL = CLI.DL; 524 SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs; 525 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals; 526 SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins; 527 SDValue Chain = CLI.Chain; 528 SDValue Callee = CLI.Callee; 529 CallingConv::ID CallConv = CLI.CallConv; 530 bool &IsTailCall = CLI.IsTailCall; 531 bool IsVarArg = CLI.IsVarArg; 532 533 MachineFunction &MF = DAG.getMachineFunction(); 534 StructReturnType SR = callIsStructReturn(Outs); 535 bool IsSibcall = false; 536 M68kMachineFunctionInfo *MFI = MF.getInfo<M68kMachineFunctionInfo>(); 537 // const M68kRegisterInfo *TRI = Subtarget.getRegisterInfo(); 538 539 if (CallConv == CallingConv::M68k_INTR) 540 report_fatal_error("M68k interrupts may not be called directly"); 541 542 auto Attr = MF.getFunction().getFnAttribute("disable-tail-calls"); 543 if (Attr.getValueAsBool()) 544 IsTailCall = false; 545 546 // FIXME Add tailcalls support 547 548 bool IsMustTail = CLI.CB && CLI.CB->isMustTailCall(); 549 if (IsMustTail) { 550 // Force this to be a tail call. The verifier rules are enough to ensure 551 // that we can lower this successfully without moving the return address 552 // around. 553 IsTailCall = true; 554 } else if (IsTailCall) { 555 // Check if it's really possible to do a tail call. 556 IsTailCall = IsEligibleForTailCallOptimization( 557 Callee, CallConv, IsVarArg, SR != NotStructReturn, 558 MF.getFunction().hasStructRetAttr(), CLI.RetTy, Outs, OutVals, Ins, 559 DAG); 560 561 // Sibcalls are automatically detected tailcalls which do not require 562 // ABI changes. 563 if (!MF.getTarget().Options.GuaranteedTailCallOpt && IsTailCall) 564 IsSibcall = true; 565 566 if (IsTailCall) 567 ++NumTailCalls; 568 } 569 570 assert(!(IsVarArg && canGuaranteeTCO(CallConv)) && 571 "Var args not supported with calling convention fastcc"); 572 573 // Analyze operands of the call, assigning locations to each operand. 574 SmallVector<CCValAssign, 16> ArgLocs; 575 SmallVector<Type *, 4> ArgTypes; 576 for (const auto &Arg : CLI.getArgs()) 577 ArgTypes.emplace_back(Arg.Ty); 578 M68kCCState CCInfo(ArgTypes, CallConv, IsVarArg, MF, ArgLocs, 579 *DAG.getContext()); 580 CCInfo.AnalyzeCallOperands(Outs, CC_M68k); 581 582 // Get a count of how many bytes are to be pushed on the stack. 583 unsigned NumBytes = CCInfo.getAlignedCallFrameSize(); 584 if (IsSibcall) { 585 // This is a sibcall. The memory operands are available in caller's 586 // own caller's stack. 587 NumBytes = 0; 588 } else if (MF.getTarget().Options.GuaranteedTailCallOpt && 589 canGuaranteeTCO(CallConv)) { 590 NumBytes = GetAlignedArgumentStackSize(NumBytes, DAG); 591 } 592 593 int FPDiff = 0; 594 if (IsTailCall && !IsSibcall && !IsMustTail) { 595 // Lower arguments at fp - stackoffset + fpdiff. 596 unsigned NumBytesCallerPushed = MFI->getBytesToPopOnReturn(); 597 598 FPDiff = NumBytesCallerPushed - NumBytes; 599 600 // Set the delta of movement of the returnaddr stackslot. 601 // But only set if delta is greater than previous delta. 602 if (FPDiff < MFI->getTCReturnAddrDelta()) 603 MFI->setTCReturnAddrDelta(FPDiff); 604 } 605 606 unsigned NumBytesToPush = NumBytes; 607 unsigned NumBytesToPop = NumBytes; 608 609 // If we have an inalloca argument, all stack space has already been allocated 610 // for us and be right at the top of the stack. We don't support multiple 611 // arguments passed in memory when using inalloca. 612 if (!Outs.empty() && Outs.back().Flags.isInAlloca()) { 613 NumBytesToPush = 0; 614 if (!ArgLocs.back().isMemLoc()) 615 report_fatal_error("cannot use inalloca attribute on a register " 616 "parameter"); 617 if (ArgLocs.back().getLocMemOffset() != 0) 618 report_fatal_error("any parameter with the inalloca attribute must be " 619 "the only memory argument"); 620 } 621 622 if (!IsSibcall) 623 Chain = DAG.getCALLSEQ_START(Chain, NumBytesToPush, 624 NumBytes - NumBytesToPush, DL); 625 626 SDValue RetFI; 627 // Load return address for tail calls. 628 if (IsTailCall && FPDiff) 629 Chain = EmitTailCallLoadRetAddr(DAG, RetFI, Chain, IsTailCall, FPDiff, DL); 630 631 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass; 632 SmallVector<SDValue, 8> MemOpChains; 633 SDValue StackPtr; 634 635 // Walk the register/memloc assignments, inserting copies/loads. In the case 636 // of tail call optimization arguments are handle later. 637 const M68kRegisterInfo *RegInfo = Subtarget.getRegisterInfo(); 638 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 639 ISD::ArgFlagsTy Flags = Outs[i].Flags; 640 641 // Skip inalloca arguments, they have already been written. 642 if (Flags.isInAlloca()) 643 continue; 644 645 CCValAssign &VA = ArgLocs[i]; 646 EVT RegVT = VA.getLocVT(); 647 SDValue Arg = OutVals[i]; 648 bool IsByVal = Flags.isByVal(); 649 650 // Promote the value if needed. 651 switch (VA.getLocInfo()) { 652 default: 653 llvm_unreachable("Unknown loc info!"); 654 case CCValAssign::Full: 655 break; 656 case CCValAssign::SExt: 657 Arg = DAG.getNode(ISD::SIGN_EXTEND, DL, RegVT, Arg); 658 break; 659 case CCValAssign::ZExt: 660 Arg = DAG.getNode(ISD::ZERO_EXTEND, DL, RegVT, Arg); 661 break; 662 case CCValAssign::AExt: 663 Arg = DAG.getNode(ISD::ANY_EXTEND, DL, RegVT, Arg); 664 break; 665 case CCValAssign::BCvt: 666 Arg = DAG.getBitcast(RegVT, Arg); 667 break; 668 case CCValAssign::Indirect: { 669 // Store the argument. 670 SDValue SpillSlot = DAG.CreateStackTemporary(VA.getValVT()); 671 int FI = cast<FrameIndexSDNode>(SpillSlot)->getIndex(); 672 Chain = DAG.getStore( 673 Chain, DL, Arg, SpillSlot, 674 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI)); 675 Arg = SpillSlot; 676 break; 677 } 678 } 679 680 if (VA.isRegLoc()) { 681 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg)); 682 } else if (!IsSibcall && (!IsTailCall || IsByVal)) { 683 assert(VA.isMemLoc()); 684 if (!StackPtr.getNode()) { 685 StackPtr = DAG.getCopyFromReg(Chain, DL, RegInfo->getStackRegister(), 686 getPointerTy(DAG.getDataLayout())); 687 } 688 MemOpChains.push_back( 689 LowerMemOpCallTo(Chain, StackPtr, Arg, DL, DAG, VA, Flags)); 690 } 691 } 692 693 if (!MemOpChains.empty()) 694 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains); 695 696 // FIXME Make sure PIC style GOT works as expected 697 // The only time GOT is really needed is for Medium-PIC static data 698 // otherwise we are happy with pc-rel or static references 699 700 if (IsVarArg && IsMustTail) { 701 const auto &Forwards = MFI->getForwardedMustTailRegParms(); 702 for (const auto &F : Forwards) { 703 SDValue Val = DAG.getCopyFromReg(Chain, DL, F.VReg, F.VT); 704 RegsToPass.push_back(std::make_pair(unsigned(F.PReg), Val)); 705 } 706 } 707 708 // For tail calls lower the arguments to the 'real' stack slots. Sibcalls 709 // don't need this because the eligibility check rejects calls that require 710 // shuffling arguments passed in memory. 711 if (!IsSibcall && IsTailCall) { 712 // Force all the incoming stack arguments to be loaded from the stack 713 // before any new outgoing arguments are stored to the stack, because the 714 // outgoing stack slots may alias the incoming argument stack slots, and 715 // the alias isn't otherwise explicit. This is slightly more conservative 716 // than necessary, because it means that each store effectively depends 717 // on every argument instead of just those arguments it would clobber. 718 SDValue ArgChain = DAG.getStackArgumentTokenFactor(Chain); 719 720 SmallVector<SDValue, 8> MemOpChains2; 721 SDValue FIN; 722 int FI = 0; 723 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 724 CCValAssign &VA = ArgLocs[i]; 725 if (VA.isRegLoc()) 726 continue; 727 assert(VA.isMemLoc()); 728 SDValue Arg = OutVals[i]; 729 ISD::ArgFlagsTy Flags = Outs[i].Flags; 730 // Skip inalloca arguments. They don't require any work. 731 if (Flags.isInAlloca()) 732 continue; 733 // Create frame index. 734 int32_t Offset = VA.getLocMemOffset() + FPDiff; 735 uint32_t OpSize = (VA.getLocVT().getSizeInBits() + 7) / 8; 736 FI = MF.getFrameInfo().CreateFixedObject(OpSize, Offset, true); 737 FIN = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout())); 738 739 if (Flags.isByVal()) { 740 // Copy relative to framepointer. 741 SDValue Source = DAG.getIntPtrConstant(VA.getLocMemOffset(), DL); 742 if (!StackPtr.getNode()) { 743 StackPtr = DAG.getCopyFromReg(Chain, DL, RegInfo->getStackRegister(), 744 getPointerTy(DAG.getDataLayout())); 745 } 746 Source = DAG.getNode(ISD::ADD, DL, getPointerTy(DAG.getDataLayout()), 747 StackPtr, Source); 748 749 MemOpChains2.push_back( 750 CreateCopyOfByValArgument(Source, FIN, ArgChain, Flags, DAG, DL)); 751 } else { 752 // Store relative to framepointer. 753 MemOpChains2.push_back(DAG.getStore( 754 ArgChain, DL, Arg, FIN, 755 MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI))); 756 } 757 } 758 759 if (!MemOpChains2.empty()) 760 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains2); 761 762 // Store the return address to the appropriate stack slot. 763 Chain = EmitTailCallStoreRetAddr(DAG, MF, Chain, RetFI, 764 getPointerTy(DAG.getDataLayout()), 765 Subtarget.getSlotSize(), FPDiff, DL); 766 } 767 768 // Build a sequence of copy-to-reg nodes chained together with token chain 769 // and flag operands which copy the outgoing args into registers. 770 SDValue InGlue; 771 for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) { 772 Chain = DAG.getCopyToReg(Chain, DL, RegsToPass[i].first, 773 RegsToPass[i].second, InGlue); 774 InGlue = Chain.getValue(1); 775 } 776 777 if (Callee->getOpcode() == ISD::GlobalAddress) { 778 // If the callee is a GlobalAddress node (quite common, every direct call 779 // is) turn it into a TargetGlobalAddress node so that legalize doesn't hack 780 // it. 781 GlobalAddressSDNode *G = cast<GlobalAddressSDNode>(Callee); 782 783 // We should use extra load for direct calls to dllimported functions in 784 // non-JIT mode. 785 const GlobalValue *GV = G->getGlobal(); 786 if (!GV->hasDLLImportStorageClass()) { 787 unsigned char OpFlags = Subtarget.classifyGlobalFunctionReference(GV); 788 789 Callee = DAG.getTargetGlobalAddress( 790 GV, DL, getPointerTy(DAG.getDataLayout()), G->getOffset(), OpFlags); 791 792 if (OpFlags == M68kII::MO_GOTPCREL) { 793 794 // Add a wrapper. 795 Callee = DAG.getNode(M68kISD::WrapperPC, DL, 796 getPointerTy(DAG.getDataLayout()), Callee); 797 798 // Add extra indirection 799 Callee = DAG.getLoad( 800 getPointerTy(DAG.getDataLayout()), DL, DAG.getEntryNode(), Callee, 801 MachinePointerInfo::getGOT(DAG.getMachineFunction())); 802 } 803 } 804 } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) { 805 const Module *Mod = DAG.getMachineFunction().getFunction().getParent(); 806 unsigned char OpFlags = 807 Subtarget.classifyGlobalFunctionReference(nullptr, *Mod); 808 809 Callee = DAG.getTargetExternalSymbol( 810 S->getSymbol(), getPointerTy(DAG.getDataLayout()), OpFlags); 811 } 812 813 // Returns a chain & a flag for retval copy to use. 814 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue); 815 SmallVector<SDValue, 8> Ops; 816 817 if (!IsSibcall && IsTailCall) { 818 Chain = DAG.getCALLSEQ_END(Chain, NumBytesToPop, 0, InGlue, DL); 819 InGlue = Chain.getValue(1); 820 } 821 822 Ops.push_back(Chain); 823 Ops.push_back(Callee); 824 825 if (IsTailCall) 826 Ops.push_back(DAG.getConstant(FPDiff, DL, MVT::i32)); 827 828 // Add argument registers to the end of the list so that they are known live 829 // into the call. 830 for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) 831 Ops.push_back(DAG.getRegister(RegsToPass[i].first, 832 RegsToPass[i].second.getValueType())); 833 834 // Add a register mask operand representing the call-preserved registers. 835 const uint32_t *Mask = RegInfo->getCallPreservedMask(MF, CallConv); 836 assert(Mask && "Missing call preserved mask for calling convention"); 837 838 Ops.push_back(DAG.getRegisterMask(Mask)); 839 840 if (InGlue.getNode()) 841 Ops.push_back(InGlue); 842 843 if (IsTailCall) { 844 MF.getFrameInfo().setHasTailCall(); 845 return DAG.getNode(M68kISD::TC_RETURN, DL, NodeTys, Ops); 846 } 847 848 Chain = DAG.getNode(M68kISD::CALL, DL, NodeTys, Ops); 849 InGlue = Chain.getValue(1); 850 851 // Create the CALLSEQ_END node. 852 unsigned NumBytesForCalleeToPop; 853 if (M68k::isCalleePop(CallConv, IsVarArg, 854 DAG.getTarget().Options.GuaranteedTailCallOpt)) { 855 NumBytesForCalleeToPop = NumBytes; // Callee pops everything 856 } else if (!canGuaranteeTCO(CallConv) && SR == StackStructReturn) { 857 // If this is a call to a struct-return function, the callee 858 // pops the hidden struct pointer, so we have to push it back. 859 NumBytesForCalleeToPop = 4; 860 } else { 861 NumBytesForCalleeToPop = 0; // Callee pops nothing. 862 } 863 864 if (CLI.DoesNotReturn && !getTargetMachine().Options.TrapUnreachable) { 865 // No need to reset the stack after the call if the call doesn't return. To 866 // make the MI verify, we'll pretend the callee does it for us. 867 NumBytesForCalleeToPop = NumBytes; 868 } 869 870 // Returns a flag for retval copy to use. 871 if (!IsSibcall) { 872 Chain = DAG.getCALLSEQ_END(Chain, NumBytesToPop, NumBytesForCalleeToPop, 873 InGlue, DL); 874 InGlue = Chain.getValue(1); 875 } 876 877 // Handle result values, copying them out of physregs into vregs that we 878 // return. 879 return LowerCallResult(Chain, InGlue, CallConv, IsVarArg, Ins, DL, DAG, 880 InVals); 881 } 882 883 SDValue M68kTargetLowering::LowerCallResult( 884 SDValue Chain, SDValue InGlue, CallingConv::ID CallConv, bool IsVarArg, 885 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL, 886 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const { 887 888 // Assign locations to each value returned by this call. 889 SmallVector<CCValAssign, 16> RVLocs; 890 CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), RVLocs, 891 *DAG.getContext()); 892 CCInfo.AnalyzeCallResult(Ins, RetCC_M68k); 893 894 // Copy all of the result registers out of their specified physreg. 895 for (unsigned i = 0, e = RVLocs.size(); i != e; ++i) { 896 CCValAssign &VA = RVLocs[i]; 897 EVT CopyVT = VA.getLocVT(); 898 899 /// ??? is this correct? 900 Chain = DAG.getCopyFromReg(Chain, DL, VA.getLocReg(), CopyVT, InGlue) 901 .getValue(1); 902 SDValue Val = Chain.getValue(0); 903 904 if (VA.isExtInLoc() && VA.getValVT().getScalarType() == MVT::i1) 905 Val = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), Val); 906 907 InGlue = Chain.getValue(2); 908 InVals.push_back(Val); 909 } 910 911 return Chain; 912 } 913 914 //===----------------------------------------------------------------------===// 915 // Formal Arguments Calling Convention Implementation 916 //===----------------------------------------------------------------------===// 917 918 SDValue M68kTargetLowering::LowerFormalArguments( 919 SDValue Chain, CallingConv::ID CCID, bool IsVarArg, 920 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL, 921 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const { 922 MachineFunction &MF = DAG.getMachineFunction(); 923 M68kMachineFunctionInfo *MMFI = MF.getInfo<M68kMachineFunctionInfo>(); 924 // const TargetFrameLowering &TFL = *Subtarget.getFrameLowering(); 925 926 MachineFrameInfo &MFI = MF.getFrameInfo(); 927 928 // Assign locations to all of the incoming arguments. 929 SmallVector<CCValAssign, 16> ArgLocs; 930 SmallVector<Type *, 4> ArgTypes; 931 for (const Argument &Arg : MF.getFunction().args()) 932 ArgTypes.emplace_back(Arg.getType()); 933 M68kCCState CCInfo(ArgTypes, CCID, IsVarArg, MF, ArgLocs, *DAG.getContext()); 934 935 CCInfo.AnalyzeFormalArguments(Ins, CC_M68k); 936 937 unsigned LastVal = ~0U; 938 SDValue ArgValue; 939 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 940 CCValAssign &VA = ArgLocs[i]; 941 assert(VA.getValNo() != LastVal && "Same value in different locations"); 942 943 LastVal = VA.getValNo(); 944 945 if (VA.isRegLoc()) { 946 EVT RegVT = VA.getLocVT(); 947 const TargetRegisterClass *RC; 948 if (RegVT == MVT::i32) 949 RC = &M68k::XR32RegClass; 950 else 951 llvm_unreachable("Unknown argument type!"); 952 953 Register Reg = MF.addLiveIn(VA.getLocReg(), RC); 954 ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegVT); 955 956 // If this is an 8 or 16-bit value, it is really passed promoted to 32 957 // bits. Insert an assert[sz]ext to capture this, then truncate to the 958 // right size. 959 if (VA.getLocInfo() == CCValAssign::SExt) { 960 ArgValue = DAG.getNode(ISD::AssertSext, DL, RegVT, ArgValue, 961 DAG.getValueType(VA.getValVT())); 962 } else if (VA.getLocInfo() == CCValAssign::ZExt) { 963 ArgValue = DAG.getNode(ISD::AssertZext, DL, RegVT, ArgValue, 964 DAG.getValueType(VA.getValVT())); 965 } else if (VA.getLocInfo() == CCValAssign::BCvt) { 966 ArgValue = DAG.getBitcast(VA.getValVT(), ArgValue); 967 } 968 969 if (VA.isExtInLoc()) { 970 ArgValue = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), ArgValue); 971 } 972 } else { 973 assert(VA.isMemLoc()); 974 ArgValue = LowerMemArgument(Chain, CCID, Ins, DL, DAG, VA, MFI, i); 975 } 976 977 // If value is passed via pointer - do a load. 978 // TODO Make sure this handling on indirect arguments is correct 979 if (VA.getLocInfo() == CCValAssign::Indirect) 980 ArgValue = 981 DAG.getLoad(VA.getValVT(), DL, Chain, ArgValue, MachinePointerInfo()); 982 983 InVals.push_back(ArgValue); 984 } 985 986 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 987 // Swift calling convention does not require we copy the sret argument 988 // into %D0 for the return. We don't set SRetReturnReg for Swift. 989 if (CCID == CallingConv::Swift) 990 continue; 991 992 // ABI require that for returning structs by value we copy the sret argument 993 // into %D0 for the return. Save the argument into a virtual register so 994 // that we can access it from the return points. 995 if (Ins[i].Flags.isSRet()) { 996 unsigned Reg = MMFI->getSRetReturnReg(); 997 if (!Reg) { 998 MVT PtrTy = getPointerTy(DAG.getDataLayout()); 999 Reg = MF.getRegInfo().createVirtualRegister(getRegClassFor(PtrTy)); 1000 MMFI->setSRetReturnReg(Reg); 1001 } 1002 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), DL, Reg, InVals[i]); 1003 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Copy, Chain); 1004 break; 1005 } 1006 } 1007 1008 unsigned StackSize = CCInfo.getStackSize(); 1009 // Align stack specially for tail calls. 1010 if (shouldGuaranteeTCO(CCID, MF.getTarget().Options.GuaranteedTailCallOpt)) 1011 StackSize = GetAlignedArgumentStackSize(StackSize, DAG); 1012 1013 // If the function takes variable number of arguments, make a frame index for 1014 // the start of the first vararg value... for expansion of llvm.va_start. We 1015 // can skip this if there are no va_start calls. 1016 if (MFI.hasVAStart()) { 1017 MMFI->setVarArgsFrameIndex(MFI.CreateFixedObject(1, StackSize, true)); 1018 } 1019 1020 if (IsVarArg && MFI.hasMustTailInVarArgFunc()) { 1021 // We forward some GPRs and some vector types. 1022 SmallVector<MVT, 2> RegParmTypes; 1023 MVT IntVT = MVT::i32; 1024 RegParmTypes.push_back(IntVT); 1025 1026 // Compute the set of forwarded registers. The rest are scratch. 1027 // ??? what is this for? 1028 SmallVectorImpl<ForwardedRegister> &Forwards = 1029 MMFI->getForwardedMustTailRegParms(); 1030 CCInfo.analyzeMustTailForwardedRegisters(Forwards, RegParmTypes, CC_M68k); 1031 1032 // Copy all forwards from physical to virtual registers. 1033 for (ForwardedRegister &F : Forwards) { 1034 // FIXME Can we use a less constrained schedule? 1035 SDValue RegVal = DAG.getCopyFromReg(Chain, DL, F.VReg, F.VT); 1036 F.VReg = MF.getRegInfo().createVirtualRegister(getRegClassFor(F.VT)); 1037 Chain = DAG.getCopyToReg(Chain, DL, F.VReg, RegVal); 1038 } 1039 } 1040 1041 // Some CCs need callee pop. 1042 if (M68k::isCalleePop(CCID, IsVarArg, 1043 MF.getTarget().Options.GuaranteedTailCallOpt)) { 1044 MMFI->setBytesToPopOnReturn(StackSize); // Callee pops everything. 1045 } else { 1046 MMFI->setBytesToPopOnReturn(0); // Callee pops nothing. 1047 // If this is an sret function, the return should pop the hidden pointer. 1048 if (!canGuaranteeTCO(CCID) && argsAreStructReturn(Ins) == StackStructReturn) 1049 MMFI->setBytesToPopOnReturn(4); 1050 } 1051 1052 MMFI->setArgumentStackSize(StackSize); 1053 1054 return Chain; 1055 } 1056 1057 //===----------------------------------------------------------------------===// 1058 // Return Value Calling Convention Implementation 1059 //===----------------------------------------------------------------------===// 1060 1061 bool M68kTargetLowering::CanLowerReturn( 1062 CallingConv::ID CCID, MachineFunction &MF, bool IsVarArg, 1063 const SmallVectorImpl<ISD::OutputArg> &Outs, LLVMContext &Context) const { 1064 SmallVector<CCValAssign, 16> RVLocs; 1065 CCState CCInfo(CCID, IsVarArg, MF, RVLocs, Context); 1066 return CCInfo.CheckReturn(Outs, RetCC_M68k); 1067 } 1068 1069 SDValue 1070 M68kTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CCID, 1071 bool IsVarArg, 1072 const SmallVectorImpl<ISD::OutputArg> &Outs, 1073 const SmallVectorImpl<SDValue> &OutVals, 1074 const SDLoc &DL, SelectionDAG &DAG) const { 1075 MachineFunction &MF = DAG.getMachineFunction(); 1076 M68kMachineFunctionInfo *MFI = MF.getInfo<M68kMachineFunctionInfo>(); 1077 1078 SmallVector<CCValAssign, 16> RVLocs; 1079 CCState CCInfo(CCID, IsVarArg, MF, RVLocs, *DAG.getContext()); 1080 CCInfo.AnalyzeReturn(Outs, RetCC_M68k); 1081 1082 SDValue Glue; 1083 SmallVector<SDValue, 6> RetOps; 1084 // Operand #0 = Chain (updated below) 1085 RetOps.push_back(Chain); 1086 // Operand #1 = Bytes To Pop 1087 RetOps.push_back( 1088 DAG.getTargetConstant(MFI->getBytesToPopOnReturn(), DL, MVT::i32)); 1089 1090 // Copy the result values into the output registers. 1091 for (unsigned i = 0, e = RVLocs.size(); i != e; ++i) { 1092 CCValAssign &VA = RVLocs[i]; 1093 assert(VA.isRegLoc() && "Can only return in registers!"); 1094 SDValue ValToCopy = OutVals[i]; 1095 EVT ValVT = ValToCopy.getValueType(); 1096 1097 // Promote values to the appropriate types. 1098 if (VA.getLocInfo() == CCValAssign::SExt) 1099 ValToCopy = DAG.getNode(ISD::SIGN_EXTEND, DL, VA.getLocVT(), ValToCopy); 1100 else if (VA.getLocInfo() == CCValAssign::ZExt) 1101 ValToCopy = DAG.getNode(ISD::ZERO_EXTEND, DL, VA.getLocVT(), ValToCopy); 1102 else if (VA.getLocInfo() == CCValAssign::AExt) { 1103 if (ValVT.isVector() && ValVT.getVectorElementType() == MVT::i1) 1104 ValToCopy = DAG.getNode(ISD::SIGN_EXTEND, DL, VA.getLocVT(), ValToCopy); 1105 else 1106 ValToCopy = DAG.getNode(ISD::ANY_EXTEND, DL, VA.getLocVT(), ValToCopy); 1107 } else if (VA.getLocInfo() == CCValAssign::BCvt) 1108 ValToCopy = DAG.getBitcast(VA.getLocVT(), ValToCopy); 1109 1110 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), ValToCopy, Glue); 1111 Glue = Chain.getValue(1); 1112 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT())); 1113 } 1114 1115 // Swift calling convention does not require we copy the sret argument 1116 // into %d0 for the return, and SRetReturnReg is not set for Swift. 1117 1118 // ABI require that for returning structs by value we copy the sret argument 1119 // into %D0 for the return. Save the argument into a virtual register so that 1120 // we can access it from the return points. 1121 // 1122 // Checking Function.hasStructRetAttr() here is insufficient because the IR 1123 // may not have an explicit sret argument. If MFI.CanLowerReturn is 1124 // false, then an sret argument may be implicitly inserted in the SelDAG. In 1125 // either case MFI->setSRetReturnReg() will have been called. 1126 if (unsigned SRetReg = MFI->getSRetReturnReg()) { 1127 // ??? Can i just move this to the top and escape this explanation? 1128 // When we have both sret and another return value, we should use the 1129 // original Chain stored in RetOps[0], instead of the current Chain updated 1130 // in the above loop. If we only have sret, RetOps[0] equals to Chain. 1131 1132 // For the case of sret and another return value, we have 1133 // Chain_0 at the function entry 1134 // Chain_1 = getCopyToReg(Chain_0) in the above loop 1135 // If we use Chain_1 in getCopyFromReg, we will have 1136 // Val = getCopyFromReg(Chain_1) 1137 // Chain_2 = getCopyToReg(Chain_1, Val) from below 1138 1139 // getCopyToReg(Chain_0) will be glued together with 1140 // getCopyToReg(Chain_1, Val) into Unit A, getCopyFromReg(Chain_1) will be 1141 // in Unit B, and we will have cyclic dependency between Unit A and Unit B: 1142 // Data dependency from Unit B to Unit A due to usage of Val in 1143 // getCopyToReg(Chain_1, Val) 1144 // Chain dependency from Unit A to Unit B 1145 1146 // So here, we use RetOps[0] (i.e Chain_0) for getCopyFromReg. 1147 SDValue Val = DAG.getCopyFromReg(RetOps[0], DL, SRetReg, 1148 getPointerTy(MF.getDataLayout())); 1149 1150 // ??? How will this work if CC does not use registers for args passing? 1151 // ??? What if I return multiple structs? 1152 unsigned RetValReg = M68k::D0; 1153 Chain = DAG.getCopyToReg(Chain, DL, RetValReg, Val, Glue); 1154 Glue = Chain.getValue(1); 1155 1156 RetOps.push_back( 1157 DAG.getRegister(RetValReg, getPointerTy(DAG.getDataLayout()))); 1158 } 1159 1160 RetOps[0] = Chain; // Update chain. 1161 1162 // Add the glue if we have it. 1163 if (Glue.getNode()) 1164 RetOps.push_back(Glue); 1165 1166 return DAG.getNode(M68kISD::RET, DL, MVT::Other, RetOps); 1167 } 1168 1169 //===----------------------------------------------------------------------===// 1170 // Fast Calling Convention (tail call) implementation 1171 //===----------------------------------------------------------------------===// 1172 1173 // Like std call, callee cleans arguments, convention except that ECX is 1174 // reserved for storing the tail called function address. Only 2 registers are 1175 // free for argument passing (inreg). Tail call optimization is performed 1176 // provided: 1177 // * tailcallopt is enabled 1178 // * caller/callee are fastcc 1179 // On M68k_64 architecture with GOT-style position independent code only 1180 // local (within module) calls are supported at the moment. To keep the stack 1181 // aligned according to platform abi the function GetAlignedArgumentStackSize 1182 // ensures that argument delta is always multiples of stack alignment. (Dynamic 1183 // linkers need this - darwin's dyld for example) If a tail called function 1184 // callee has more arguments than the caller the caller needs to make sure that 1185 // there is room to move the RETADDR to. This is achieved by reserving an area 1186 // the size of the argument delta right after the original RETADDR, but before 1187 // the saved framepointer or the spilled registers e.g. caller(arg1, arg2) 1188 // calls callee(arg1, arg2,arg3,arg4) stack layout: 1189 // arg1 1190 // arg2 1191 // RETADDR 1192 // [ new RETADDR 1193 // move area ] 1194 // (possible EBP) 1195 // ESI 1196 // EDI 1197 // local1 .. 1198 1199 /// Make the stack size align e.g 16n + 12 aligned for a 16-byte align 1200 /// requirement. 1201 unsigned 1202 M68kTargetLowering::GetAlignedArgumentStackSize(unsigned StackSize, 1203 SelectionDAG &DAG) const { 1204 const TargetFrameLowering &TFI = *Subtarget.getFrameLowering(); 1205 unsigned StackAlignment = TFI.getStackAlignment(); 1206 uint64_t AlignMask = StackAlignment - 1; 1207 int64_t Offset = StackSize; 1208 unsigned SlotSize = Subtarget.getSlotSize(); 1209 if ((Offset & AlignMask) <= (StackAlignment - SlotSize)) { 1210 // Number smaller than 12 so just add the difference. 1211 Offset += ((StackAlignment - SlotSize) - (Offset & AlignMask)); 1212 } else { 1213 // Mask out lower bits, add stackalignment once plus the 12 bytes. 1214 Offset = 1215 ((~AlignMask) & Offset) + StackAlignment + (StackAlignment - SlotSize); 1216 } 1217 return Offset; 1218 } 1219 1220 /// Check whether the call is eligible for tail call optimization. Targets 1221 /// that want to do tail call optimization should implement this function. 1222 bool M68kTargetLowering::IsEligibleForTailCallOptimization( 1223 SDValue Callee, CallingConv::ID CalleeCC, bool IsVarArg, 1224 bool IsCalleeStructRet, bool IsCallerStructRet, Type *RetTy, 1225 const SmallVectorImpl<ISD::OutputArg> &Outs, 1226 const SmallVectorImpl<SDValue> &OutVals, 1227 const SmallVectorImpl<ISD::InputArg> &Ins, SelectionDAG &DAG) const { 1228 if (!mayTailCallThisCC(CalleeCC)) 1229 return false; 1230 1231 // If -tailcallopt is specified, make fastcc functions tail-callable. 1232 MachineFunction &MF = DAG.getMachineFunction(); 1233 const auto &CallerF = MF.getFunction(); 1234 1235 CallingConv::ID CallerCC = CallerF.getCallingConv(); 1236 bool CCMatch = CallerCC == CalleeCC; 1237 1238 if (DAG.getTarget().Options.GuaranteedTailCallOpt) { 1239 if (canGuaranteeTCO(CalleeCC) && CCMatch) 1240 return true; 1241 return false; 1242 } 1243 1244 // Look for obvious safe cases to perform tail call optimization that do not 1245 // require ABI changes. This is what gcc calls sibcall. 1246 1247 // Can't do sibcall if stack needs to be dynamically re-aligned. PEI needs to 1248 // emit a special epilogue. 1249 const M68kRegisterInfo *RegInfo = Subtarget.getRegisterInfo(); 1250 if (RegInfo->hasStackRealignment(MF)) 1251 return false; 1252 1253 // Also avoid sibcall optimization if either caller or callee uses struct 1254 // return semantics. 1255 if (IsCalleeStructRet || IsCallerStructRet) 1256 return false; 1257 1258 // Do not sibcall optimize vararg calls unless all arguments are passed via 1259 // registers. 1260 LLVMContext &C = *DAG.getContext(); 1261 if (IsVarArg && !Outs.empty()) { 1262 1263 SmallVector<CCValAssign, 16> ArgLocs; 1264 CCState CCInfo(CalleeCC, IsVarArg, MF, ArgLocs, C); 1265 1266 CCInfo.AnalyzeCallOperands(Outs, CC_M68k); 1267 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) 1268 if (!ArgLocs[i].isRegLoc()) 1269 return false; 1270 } 1271 1272 // Check that the call results are passed in the same way. 1273 if (!CCState::resultsCompatible(CalleeCC, CallerCC, MF, C, Ins, RetCC_M68k, 1274 RetCC_M68k)) 1275 return false; 1276 1277 // The callee has to preserve all registers the caller needs to preserve. 1278 const M68kRegisterInfo *TRI = Subtarget.getRegisterInfo(); 1279 const uint32_t *CallerPreserved = TRI->getCallPreservedMask(MF, CallerCC); 1280 if (!CCMatch) { 1281 const uint32_t *CalleePreserved = TRI->getCallPreservedMask(MF, CalleeCC); 1282 if (!TRI->regmaskSubsetEqual(CallerPreserved, CalleePreserved)) 1283 return false; 1284 } 1285 1286 unsigned StackArgsSize = 0; 1287 1288 // If the callee takes no arguments then go on to check the results of the 1289 // call. 1290 if (!Outs.empty()) { 1291 // Check if stack adjustment is needed. For now, do not do this if any 1292 // argument is passed on the stack. 1293 SmallVector<CCValAssign, 16> ArgLocs; 1294 CCState CCInfo(CalleeCC, IsVarArg, MF, ArgLocs, C); 1295 1296 CCInfo.AnalyzeCallOperands(Outs, CC_M68k); 1297 StackArgsSize = CCInfo.getStackSize(); 1298 1299 if (StackArgsSize) { 1300 // Check if the arguments are already laid out in the right way as 1301 // the caller's fixed stack objects. 1302 MachineFrameInfo &MFI = MF.getFrameInfo(); 1303 const MachineRegisterInfo *MRI = &MF.getRegInfo(); 1304 const M68kInstrInfo *TII = Subtarget.getInstrInfo(); 1305 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 1306 CCValAssign &VA = ArgLocs[i]; 1307 SDValue Arg = OutVals[i]; 1308 ISD::ArgFlagsTy Flags = Outs[i].Flags; 1309 if (VA.getLocInfo() == CCValAssign::Indirect) 1310 return false; 1311 if (!VA.isRegLoc()) { 1312 if (!MatchingStackOffset(Arg, VA.getLocMemOffset(), Flags, MFI, MRI, 1313 TII, VA)) 1314 return false; 1315 } 1316 } 1317 } 1318 1319 bool PositionIndependent = isPositionIndependent(); 1320 // If the tailcall address may be in a register, then make sure it's 1321 // possible to register allocate for it. The call address can 1322 // only target %A0 or %A1 since the tail call must be scheduled after 1323 // callee-saved registers are restored. These happen to be the same 1324 // registers used to pass 'inreg' arguments so watch out for those. 1325 if ((!isa<GlobalAddressSDNode>(Callee) && 1326 !isa<ExternalSymbolSDNode>(Callee)) || 1327 PositionIndependent) { 1328 unsigned NumInRegs = 0; 1329 // In PIC we need an extra register to formulate the address computation 1330 // for the callee. 1331 unsigned MaxInRegs = PositionIndependent ? 1 : 2; 1332 1333 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 1334 CCValAssign &VA = ArgLocs[i]; 1335 if (!VA.isRegLoc()) 1336 continue; 1337 Register Reg = VA.getLocReg(); 1338 switch (Reg) { 1339 default: 1340 break; 1341 case M68k::A0: 1342 case M68k::A1: 1343 if (++NumInRegs == MaxInRegs) 1344 return false; 1345 break; 1346 } 1347 } 1348 } 1349 1350 const MachineRegisterInfo &MRI = MF.getRegInfo(); 1351 if (!parametersInCSRMatch(MRI, CallerPreserved, ArgLocs, OutVals)) 1352 return false; 1353 } 1354 1355 bool CalleeWillPop = M68k::isCalleePop( 1356 CalleeCC, IsVarArg, MF.getTarget().Options.GuaranteedTailCallOpt); 1357 1358 if (unsigned BytesToPop = 1359 MF.getInfo<M68kMachineFunctionInfo>()->getBytesToPopOnReturn()) { 1360 // If we have bytes to pop, the callee must pop them. 1361 bool CalleePopMatches = CalleeWillPop && BytesToPop == StackArgsSize; 1362 if (!CalleePopMatches) 1363 return false; 1364 } else if (CalleeWillPop && StackArgsSize > 0) { 1365 // If we don't have bytes to pop, make sure the callee doesn't pop any. 1366 return false; 1367 } 1368 1369 return true; 1370 } 1371 1372 //===----------------------------------------------------------------------===// 1373 // Custom Lower 1374 //===----------------------------------------------------------------------===// 1375 1376 SDValue M68kTargetLowering::LowerOperation(SDValue Op, 1377 SelectionDAG &DAG) const { 1378 switch (Op.getOpcode()) { 1379 default: 1380 llvm_unreachable("Should not custom lower this!"); 1381 case ISD::SADDO: 1382 case ISD::UADDO: 1383 case ISD::SSUBO: 1384 case ISD::USUBO: 1385 case ISD::SMULO: 1386 case ISD::UMULO: 1387 return LowerXALUO(Op, DAG); 1388 case ISD::SETCC: 1389 return LowerSETCC(Op, DAG); 1390 case ISD::SETCCCARRY: 1391 return LowerSETCCCARRY(Op, DAG); 1392 case ISD::SELECT: 1393 return LowerSELECT(Op, DAG); 1394 case ISD::BRCOND: 1395 return LowerBRCOND(Op, DAG); 1396 case ISD::ADDC: 1397 case ISD::ADDE: 1398 case ISD::SUBC: 1399 case ISD::SUBE: 1400 return LowerADDC_ADDE_SUBC_SUBE(Op, DAG); 1401 case ISD::ConstantPool: 1402 return LowerConstantPool(Op, DAG); 1403 case ISD::GlobalAddress: 1404 return LowerGlobalAddress(Op, DAG); 1405 case ISD::ExternalSymbol: 1406 return LowerExternalSymbol(Op, DAG); 1407 case ISD::BlockAddress: 1408 return LowerBlockAddress(Op, DAG); 1409 case ISD::JumpTable: 1410 return LowerJumpTable(Op, DAG); 1411 case ISD::VASTART: 1412 return LowerVASTART(Op, DAG); 1413 case ISD::DYNAMIC_STACKALLOC: 1414 return LowerDYNAMIC_STACKALLOC(Op, DAG); 1415 case ISD::SHL_PARTS: 1416 return LowerShiftLeftParts(Op, DAG); 1417 case ISD::SRA_PARTS: 1418 return LowerShiftRightParts(Op, DAG, true); 1419 case ISD::SRL_PARTS: 1420 return LowerShiftRightParts(Op, DAG, false); 1421 case ISD::ATOMIC_FENCE: 1422 return LowerATOMICFENCE(Op, DAG); 1423 case ISD::GlobalTLSAddress: 1424 return LowerGlobalTLSAddress(Op, DAG); 1425 } 1426 } 1427 1428 SDValue M68kTargetLowering::LowerExternalSymbolCall(SelectionDAG &DAG, 1429 SDLoc Loc, 1430 llvm::StringRef SymbolName, 1431 ArgListTy &&ArgList) const { 1432 PointerType *PtrTy = PointerType::get(*DAG.getContext(), 0); 1433 CallLoweringInfo CLI(DAG); 1434 CLI.setDebugLoc(Loc) 1435 .setChain(DAG.getEntryNode()) 1436 .setLibCallee(CallingConv::C, PtrTy, 1437 DAG.getExternalSymbol(SymbolName.data(), 1438 getPointerMemTy(DAG.getDataLayout())), 1439 std::move(ArgList)); 1440 return LowerCallTo(CLI).first; 1441 } 1442 1443 SDValue M68kTargetLowering::getTLSGetAddr(GlobalAddressSDNode *GA, 1444 SelectionDAG &DAG, 1445 unsigned TargetFlags) const { 1446 SDValue GOT = DAG.getGLOBAL_OFFSET_TABLE(MVT::i32); 1447 SDValue TGA = DAG.getTargetGlobalAddress( 1448 GA->getGlobal(), GA, GA->getValueType(0), GA->getOffset(), TargetFlags); 1449 SDValue Arg = DAG.getNode(ISD::ADD, SDLoc(GA), MVT::i32, GOT, TGA); 1450 1451 PointerType *PtrTy = PointerType::get(*DAG.getContext(), 0); 1452 1453 ArgListTy Args; 1454 ArgListEntry Entry; 1455 Entry.Node = Arg; 1456 Entry.Ty = PtrTy; 1457 Args.push_back(Entry); 1458 return LowerExternalSymbolCall(DAG, SDLoc(GA), "__tls_get_addr", 1459 std::move(Args)); 1460 } 1461 1462 SDValue M68kTargetLowering::getM68kReadTp(SDLoc Loc, SelectionDAG &DAG) const { 1463 return LowerExternalSymbolCall(DAG, Loc, "__m68k_read_tp", ArgListTy()); 1464 } 1465 1466 SDValue M68kTargetLowering::LowerTLSGeneralDynamic(GlobalAddressSDNode *GA, 1467 SelectionDAG &DAG) const { 1468 return getTLSGetAddr(GA, DAG, M68kII::MO_TLSGD); 1469 } 1470 1471 SDValue M68kTargetLowering::LowerTLSLocalDynamic(GlobalAddressSDNode *GA, 1472 SelectionDAG &DAG) const { 1473 SDValue Addr = getTLSGetAddr(GA, DAG, M68kII::MO_TLSLDM); 1474 SDValue TGA = 1475 DAG.getTargetGlobalAddress(GA->getGlobal(), GA, GA->getValueType(0), 1476 GA->getOffset(), M68kII::MO_TLSLD); 1477 return DAG.getNode(ISD::ADD, SDLoc(GA), MVT::i32, TGA, Addr); 1478 } 1479 1480 SDValue M68kTargetLowering::LowerTLSInitialExec(GlobalAddressSDNode *GA, 1481 SelectionDAG &DAG) const { 1482 SDValue GOT = DAG.getGLOBAL_OFFSET_TABLE(MVT::i32); 1483 SDValue Tp = getM68kReadTp(SDLoc(GA), DAG); 1484 SDValue TGA = 1485 DAG.getTargetGlobalAddress(GA->getGlobal(), GA, GA->getValueType(0), 1486 GA->getOffset(), M68kII::MO_TLSIE); 1487 SDValue Addr = DAG.getNode(ISD::ADD, SDLoc(GA), MVT::i32, TGA, GOT); 1488 SDValue Offset = 1489 DAG.getLoad(MVT::i32, SDLoc(GA), DAG.getEntryNode(), Addr, 1490 MachinePointerInfo::getGOT(DAG.getMachineFunction())); 1491 1492 return DAG.getNode(ISD::ADD, SDLoc(GA), MVT::i32, Offset, Tp); 1493 } 1494 1495 SDValue M68kTargetLowering::LowerTLSLocalExec(GlobalAddressSDNode *GA, 1496 SelectionDAG &DAG) const { 1497 SDValue Tp = getM68kReadTp(SDLoc(GA), DAG); 1498 SDValue TGA = 1499 DAG.getTargetGlobalAddress(GA->getGlobal(), GA, GA->getValueType(0), 1500 GA->getOffset(), M68kII::MO_TLSLE); 1501 return DAG.getNode(ISD::ADD, SDLoc(GA), MVT::i32, TGA, Tp); 1502 } 1503 1504 SDValue M68kTargetLowering::LowerGlobalTLSAddress(SDValue Op, 1505 SelectionDAG &DAG) const { 1506 assert(Subtarget.isTargetELF()); 1507 1508 auto *GA = cast<GlobalAddressSDNode>(Op); 1509 TLSModel::Model AccessModel = DAG.getTarget().getTLSModel(GA->getGlobal()); 1510 1511 switch (AccessModel) { 1512 case TLSModel::GeneralDynamic: 1513 return LowerTLSGeneralDynamic(GA, DAG); 1514 case TLSModel::LocalDynamic: 1515 return LowerTLSLocalDynamic(GA, DAG); 1516 case TLSModel::InitialExec: 1517 return LowerTLSInitialExec(GA, DAG); 1518 case TLSModel::LocalExec: 1519 return LowerTLSLocalExec(GA, DAG); 1520 } 1521 1522 llvm_unreachable("Unexpected TLS access model type"); 1523 } 1524 1525 bool M68kTargetLowering::decomposeMulByConstant(LLVMContext &Context, EVT VT, 1526 SDValue C) const { 1527 // Shifts and add instructions in M68000 and M68010 support 1528 // up to 32 bits, but mul only has 16-bit variant. So it's almost 1529 // certainly beneficial to lower 8/16/32-bit mul to their 1530 // add / shifts counterparts. But for 64-bits mul, it might be 1531 // safer to just leave it to compiler runtime implementations. 1532 return VT.bitsLE(MVT::i32) || Subtarget.atLeastM68020(); 1533 } 1534 1535 SDValue M68kTargetLowering::LowerXALUO(SDValue Op, SelectionDAG &DAG) const { 1536 // Lower the "add/sub/mul with overflow" instruction into a regular ins plus 1537 // a "setcc" instruction that checks the overflow flag. The "brcond" lowering 1538 // looks for this combo and may remove the "setcc" instruction if the "setcc" 1539 // has only one use. 1540 SDNode *N = Op.getNode(); 1541 SDValue LHS = N->getOperand(0); 1542 SDValue RHS = N->getOperand(1); 1543 unsigned BaseOp = 0; 1544 unsigned Cond = 0; 1545 SDLoc DL(Op); 1546 switch (Op.getOpcode()) { 1547 default: 1548 llvm_unreachable("Unknown ovf instruction!"); 1549 case ISD::SADDO: 1550 BaseOp = M68kISD::ADD; 1551 Cond = M68k::COND_VS; 1552 break; 1553 case ISD::UADDO: 1554 BaseOp = M68kISD::ADD; 1555 Cond = M68k::COND_CS; 1556 break; 1557 case ISD::SSUBO: 1558 BaseOp = M68kISD::SUB; 1559 Cond = M68k::COND_VS; 1560 break; 1561 case ISD::USUBO: 1562 BaseOp = M68kISD::SUB; 1563 Cond = M68k::COND_CS; 1564 break; 1565 } 1566 1567 // Also sets CCR. 1568 SDVTList VTs = DAG.getVTList(N->getValueType(0), MVT::i8); 1569 SDValue Arith = DAG.getNode(BaseOp, DL, VTs, LHS, RHS); 1570 SDValue SetCC = DAG.getNode(M68kISD::SETCC, DL, N->getValueType(1), 1571 DAG.getConstant(Cond, DL, MVT::i8), 1572 SDValue(Arith.getNode(), 1)); 1573 1574 return DAG.getNode(ISD::MERGE_VALUES, DL, N->getVTList(), Arith, SetCC); 1575 } 1576 1577 /// Create a BTST (Bit Test) node - Test bit \p BitNo in \p Src and set 1578 /// condition according to equal/not-equal condition code \p CC. 1579 static SDValue getBitTestCondition(SDValue Src, SDValue BitNo, ISD::CondCode CC, 1580 const SDLoc &DL, SelectionDAG &DAG) { 1581 // If Src is i8, promote it to i32 with any_extend. There is no i8 BTST 1582 // instruction. Since the shift amount is in-range-or-undefined, we know 1583 // that doing a bittest on the i32 value is ok. 1584 if (Src.getValueType() == MVT::i8 || Src.getValueType() == MVT::i16) 1585 Src = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, Src); 1586 1587 // If the operand types disagree, extend the shift amount to match. Since 1588 // BTST ignores high bits (like shifts) we can use anyextend. 1589 if (Src.getValueType() != BitNo.getValueType()) 1590 BitNo = DAG.getNode(ISD::ANY_EXTEND, DL, Src.getValueType(), BitNo); 1591 1592 SDValue BTST = DAG.getNode(M68kISD::BTST, DL, MVT::i32, Src, BitNo); 1593 1594 // NOTE BTST sets CCR.Z flag 1595 M68k::CondCode Cond = CC == ISD::SETEQ ? M68k::COND_NE : M68k::COND_EQ; 1596 return DAG.getNode(M68kISD::SETCC, DL, MVT::i8, 1597 DAG.getConstant(Cond, DL, MVT::i8), BTST); 1598 } 1599 1600 /// Result of 'and' is compared against zero. Change to a BTST node if possible. 1601 static SDValue LowerAndToBTST(SDValue And, ISD::CondCode CC, const SDLoc &DL, 1602 SelectionDAG &DAG) { 1603 SDValue Op0 = And.getOperand(0); 1604 SDValue Op1 = And.getOperand(1); 1605 if (Op0.getOpcode() == ISD::TRUNCATE) 1606 Op0 = Op0.getOperand(0); 1607 if (Op1.getOpcode() == ISD::TRUNCATE) 1608 Op1 = Op1.getOperand(0); 1609 1610 SDValue LHS, RHS; 1611 if (Op1.getOpcode() == ISD::SHL) 1612 std::swap(Op0, Op1); 1613 if (Op0.getOpcode() == ISD::SHL) { 1614 if (isOneConstant(Op0.getOperand(0))) { 1615 // If we looked past a truncate, check that it's only truncating away 1616 // known zeros. 1617 unsigned BitWidth = Op0.getValueSizeInBits(); 1618 unsigned AndBitWidth = And.getValueSizeInBits(); 1619 if (BitWidth > AndBitWidth) { 1620 auto Known = DAG.computeKnownBits(Op0); 1621 if (Known.countMinLeadingZeros() < BitWidth - AndBitWidth) 1622 return SDValue(); 1623 } 1624 LHS = Op1; 1625 RHS = Op0.getOperand(1); 1626 } 1627 } else if (auto *AndRHS = dyn_cast<ConstantSDNode>(Op1)) { 1628 uint64_t AndRHSVal = AndRHS->getZExtValue(); 1629 SDValue AndLHS = Op0; 1630 1631 if (AndRHSVal == 1 && AndLHS.getOpcode() == ISD::SRL) { 1632 LHS = AndLHS.getOperand(0); 1633 RHS = AndLHS.getOperand(1); 1634 } 1635 1636 // Use BTST if the immediate can't be encoded in a TEST instruction. 1637 if (!isUInt<32>(AndRHSVal) && isPowerOf2_64(AndRHSVal)) { 1638 LHS = AndLHS; 1639 RHS = DAG.getConstant(Log2_64_Ceil(AndRHSVal), DL, LHS.getValueType()); 1640 } 1641 } 1642 1643 if (LHS.getNode()) 1644 return getBitTestCondition(LHS, RHS, CC, DL, DAG); 1645 1646 return SDValue(); 1647 } 1648 1649 static M68k::CondCode TranslateIntegerM68kCC(ISD::CondCode SetCCOpcode) { 1650 switch (SetCCOpcode) { 1651 default: 1652 llvm_unreachable("Invalid integer condition!"); 1653 case ISD::SETEQ: 1654 return M68k::COND_EQ; 1655 case ISD::SETGT: 1656 return M68k::COND_GT; 1657 case ISD::SETGE: 1658 return M68k::COND_GE; 1659 case ISD::SETLT: 1660 return M68k::COND_LT; 1661 case ISD::SETLE: 1662 return M68k::COND_LE; 1663 case ISD::SETNE: 1664 return M68k::COND_NE; 1665 case ISD::SETULT: 1666 return M68k::COND_CS; 1667 case ISD::SETUGE: 1668 return M68k::COND_CC; 1669 case ISD::SETUGT: 1670 return M68k::COND_HI; 1671 case ISD::SETULE: 1672 return M68k::COND_LS; 1673 } 1674 } 1675 1676 /// Do a one-to-one translation of a ISD::CondCode to the M68k-specific 1677 /// condition code, returning the condition code and the LHS/RHS of the 1678 /// comparison to make. 1679 static unsigned TranslateM68kCC(ISD::CondCode SetCCOpcode, const SDLoc &DL, 1680 bool IsFP, SDValue &LHS, SDValue &RHS, 1681 SelectionDAG &DAG) { 1682 if (!IsFP) { 1683 if (ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS)) { 1684 if (SetCCOpcode == ISD::SETGT && RHSC->isAllOnes()) { 1685 // X > -1 -> X == 0, jump !sign. 1686 RHS = DAG.getConstant(0, DL, RHS.getValueType()); 1687 return M68k::COND_PL; 1688 } 1689 if (SetCCOpcode == ISD::SETLT && RHSC->isZero()) { 1690 // X < 0 -> X == 0, jump on sign. 1691 return M68k::COND_MI; 1692 } 1693 if (SetCCOpcode == ISD::SETLT && RHSC->getZExtValue() == 1) { 1694 // X < 1 -> X <= 0 1695 RHS = DAG.getConstant(0, DL, RHS.getValueType()); 1696 return M68k::COND_LE; 1697 } 1698 } 1699 1700 return TranslateIntegerM68kCC(SetCCOpcode); 1701 } 1702 1703 // First determine if it is required or is profitable to flip the operands. 1704 1705 // If LHS is a foldable load, but RHS is not, flip the condition. 1706 if (ISD::isNON_EXTLoad(LHS.getNode()) && !ISD::isNON_EXTLoad(RHS.getNode())) { 1707 SetCCOpcode = getSetCCSwappedOperands(SetCCOpcode); 1708 std::swap(LHS, RHS); 1709 } 1710 1711 switch (SetCCOpcode) { 1712 default: 1713 break; 1714 case ISD::SETOLT: 1715 case ISD::SETOLE: 1716 case ISD::SETUGT: 1717 case ISD::SETUGE: 1718 std::swap(LHS, RHS); 1719 break; 1720 } 1721 1722 // On a floating point condition, the flags are set as follows: 1723 // ZF PF CF op 1724 // 0 | 0 | 0 | X > Y 1725 // 0 | 0 | 1 | X < Y 1726 // 1 | 0 | 0 | X == Y 1727 // 1 | 1 | 1 | unordered 1728 switch (SetCCOpcode) { 1729 default: 1730 llvm_unreachable("Condcode should be pre-legalized away"); 1731 case ISD::SETUEQ: 1732 case ISD::SETEQ: 1733 return M68k::COND_EQ; 1734 case ISD::SETOLT: // flipped 1735 case ISD::SETOGT: 1736 case ISD::SETGT: 1737 return M68k::COND_HI; 1738 case ISD::SETOLE: // flipped 1739 case ISD::SETOGE: 1740 case ISD::SETGE: 1741 return M68k::COND_CC; 1742 case ISD::SETUGT: // flipped 1743 case ISD::SETULT: 1744 case ISD::SETLT: 1745 return M68k::COND_CS; 1746 case ISD::SETUGE: // flipped 1747 case ISD::SETULE: 1748 case ISD::SETLE: 1749 return M68k::COND_LS; 1750 case ISD::SETONE: 1751 case ISD::SETNE: 1752 return M68k::COND_NE; 1753 case ISD::SETOEQ: 1754 case ISD::SETUNE: 1755 return M68k::COND_INVALID; 1756 } 1757 } 1758 1759 // Convert (truncate (srl X, N) to i1) to (bt X, N) 1760 static SDValue LowerTruncateToBTST(SDValue Op, ISD::CondCode CC, 1761 const SDLoc &DL, SelectionDAG &DAG) { 1762 1763 assert(Op.getOpcode() == ISD::TRUNCATE && Op.getValueType() == MVT::i1 && 1764 "Expected TRUNCATE to i1 node"); 1765 1766 if (Op.getOperand(0).getOpcode() != ISD::SRL) 1767 return SDValue(); 1768 1769 SDValue ShiftRight = Op.getOperand(0); 1770 return getBitTestCondition(ShiftRight.getOperand(0), ShiftRight.getOperand(1), 1771 CC, DL, DAG); 1772 } 1773 1774 /// \brief return true if \c Op has a use that doesn't just read flags. 1775 static bool hasNonFlagsUse(SDValue Op) { 1776 for (SDNode::use_iterator UI = Op->use_begin(), UE = Op->use_end(); UI != UE; 1777 ++UI) { 1778 SDNode *User = *UI; 1779 unsigned UOpNo = UI.getOperandNo(); 1780 if (User->getOpcode() == ISD::TRUNCATE && User->hasOneUse()) { 1781 // Look pass truncate. 1782 UOpNo = User->use_begin().getOperandNo(); 1783 User = *User->use_begin(); 1784 } 1785 1786 if (User->getOpcode() != ISD::BRCOND && User->getOpcode() != ISD::SETCC && 1787 !(User->getOpcode() == ISD::SELECT && UOpNo == 0)) 1788 return true; 1789 } 1790 return false; 1791 } 1792 1793 SDValue M68kTargetLowering::EmitTest(SDValue Op, unsigned M68kCC, 1794 const SDLoc &DL, SelectionDAG &DAG) const { 1795 1796 // CF and OF aren't always set the way we want. Determine which 1797 // of these we need. 1798 bool NeedCF = false; 1799 bool NeedOF = false; 1800 switch (M68kCC) { 1801 default: 1802 break; 1803 case M68k::COND_HI: 1804 case M68k::COND_CC: 1805 case M68k::COND_CS: 1806 case M68k::COND_LS: 1807 NeedCF = true; 1808 break; 1809 case M68k::COND_GT: 1810 case M68k::COND_GE: 1811 case M68k::COND_LT: 1812 case M68k::COND_LE: 1813 case M68k::COND_VS: 1814 case M68k::COND_VC: { 1815 // Check if we really need to set the 1816 // Overflow flag. If NoSignedWrap is present 1817 // that is not actually needed. 1818 switch (Op->getOpcode()) { 1819 case ISD::ADD: 1820 case ISD::SUB: 1821 case ISD::MUL: 1822 case ISD::SHL: { 1823 if (Op.getNode()->getFlags().hasNoSignedWrap()) 1824 break; 1825 [[fallthrough]]; 1826 } 1827 default: 1828 NeedOF = true; 1829 break; 1830 } 1831 break; 1832 } 1833 } 1834 // See if we can use the CCR value from the operand instead of 1835 // doing a separate TEST. TEST always sets OF and CF to 0, so unless 1836 // we prove that the arithmetic won't overflow, we can't use OF or CF. 1837 if (Op.getResNo() != 0 || NeedOF || NeedCF) { 1838 // Emit a CMP with 0, which is the TEST pattern. 1839 return DAG.getNode(M68kISD::CMP, DL, MVT::i8, 1840 DAG.getConstant(0, DL, Op.getValueType()), Op); 1841 } 1842 unsigned Opcode = 0; 1843 unsigned NumOperands = 0; 1844 1845 // Truncate operations may prevent the merge of the SETCC instruction 1846 // and the arithmetic instruction before it. Attempt to truncate the operands 1847 // of the arithmetic instruction and use a reduced bit-width instruction. 1848 bool NeedTruncation = false; 1849 SDValue ArithOp = Op; 1850 if (Op->getOpcode() == ISD::TRUNCATE && Op->hasOneUse()) { 1851 SDValue Arith = Op->getOperand(0); 1852 // Both the trunc and the arithmetic op need to have one user each. 1853 if (Arith->hasOneUse()) 1854 switch (Arith.getOpcode()) { 1855 default: 1856 break; 1857 case ISD::ADD: 1858 case ISD::SUB: 1859 case ISD::AND: 1860 case ISD::OR: 1861 case ISD::XOR: { 1862 NeedTruncation = true; 1863 ArithOp = Arith; 1864 } 1865 } 1866 } 1867 1868 // NOTICE: In the code below we use ArithOp to hold the arithmetic operation 1869 // which may be the result of a CAST. We use the variable 'Op', which is the 1870 // non-casted variable when we check for possible users. 1871 switch (ArithOp.getOpcode()) { 1872 case ISD::ADD: 1873 Opcode = M68kISD::ADD; 1874 NumOperands = 2; 1875 break; 1876 case ISD::SHL: 1877 case ISD::SRL: 1878 // If we have a constant logical shift that's only used in a comparison 1879 // against zero turn it into an equivalent AND. This allows turning it into 1880 // a TEST instruction later. 1881 if ((M68kCC == M68k::COND_EQ || M68kCC == M68k::COND_NE) && 1882 Op->hasOneUse() && isa<ConstantSDNode>(Op->getOperand(1)) && 1883 !hasNonFlagsUse(Op)) { 1884 EVT VT = Op.getValueType(); 1885 unsigned BitWidth = VT.getSizeInBits(); 1886 unsigned ShAmt = Op->getConstantOperandVal(1); 1887 if (ShAmt >= BitWidth) // Avoid undefined shifts. 1888 break; 1889 APInt Mask = ArithOp.getOpcode() == ISD::SRL 1890 ? APInt::getHighBitsSet(BitWidth, BitWidth - ShAmt) 1891 : APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt); 1892 if (!Mask.isSignedIntN(32)) // Avoid large immediates. 1893 break; 1894 Op = DAG.getNode(ISD::AND, DL, VT, Op->getOperand(0), 1895 DAG.getConstant(Mask, DL, VT)); 1896 } 1897 break; 1898 1899 case ISD::AND: 1900 // If the primary 'and' result isn't used, don't bother using 1901 // M68kISD::AND, because a TEST instruction will be better. 1902 if (!hasNonFlagsUse(Op)) { 1903 SDValue Op0 = ArithOp->getOperand(0); 1904 SDValue Op1 = ArithOp->getOperand(1); 1905 EVT VT = ArithOp.getValueType(); 1906 bool IsAndn = isBitwiseNot(Op0) || isBitwiseNot(Op1); 1907 bool IsLegalAndnType = VT == MVT::i32 || VT == MVT::i64; 1908 1909 // But if we can combine this into an ANDN operation, then create an AND 1910 // now and allow it to be pattern matched into an ANDN. 1911 if (/*!Subtarget.hasBMI() ||*/ !IsAndn || !IsLegalAndnType) 1912 break; 1913 } 1914 [[fallthrough]]; 1915 case ISD::SUB: 1916 case ISD::OR: 1917 case ISD::XOR: 1918 // Due to the ISEL shortcoming noted above, be conservative if this op is 1919 // likely to be selected as part of a load-modify-store instruction. 1920 for (const auto *U : Op.getNode()->uses()) 1921 if (U->getOpcode() == ISD::STORE) 1922 goto default_case; 1923 1924 // Otherwise use a regular CCR-setting instruction. 1925 switch (ArithOp.getOpcode()) { 1926 default: 1927 llvm_unreachable("unexpected operator!"); 1928 case ISD::SUB: 1929 Opcode = M68kISD::SUB; 1930 break; 1931 case ISD::XOR: 1932 Opcode = M68kISD::XOR; 1933 break; 1934 case ISD::AND: 1935 Opcode = M68kISD::AND; 1936 break; 1937 case ISD::OR: 1938 Opcode = M68kISD::OR; 1939 break; 1940 } 1941 1942 NumOperands = 2; 1943 break; 1944 case M68kISD::ADD: 1945 case M68kISD::SUB: 1946 case M68kISD::OR: 1947 case M68kISD::XOR: 1948 case M68kISD::AND: 1949 return SDValue(Op.getNode(), 1); 1950 default: 1951 default_case: 1952 break; 1953 } 1954 1955 // If we found that truncation is beneficial, perform the truncation and 1956 // update 'Op'. 1957 if (NeedTruncation) { 1958 EVT VT = Op.getValueType(); 1959 SDValue WideVal = Op->getOperand(0); 1960 EVT WideVT = WideVal.getValueType(); 1961 unsigned ConvertedOp = 0; 1962 // Use a target machine opcode to prevent further DAGCombine 1963 // optimizations that may separate the arithmetic operations 1964 // from the setcc node. 1965 switch (WideVal.getOpcode()) { 1966 default: 1967 break; 1968 case ISD::ADD: 1969 ConvertedOp = M68kISD::ADD; 1970 break; 1971 case ISD::SUB: 1972 ConvertedOp = M68kISD::SUB; 1973 break; 1974 case ISD::AND: 1975 ConvertedOp = M68kISD::AND; 1976 break; 1977 case ISD::OR: 1978 ConvertedOp = M68kISD::OR; 1979 break; 1980 case ISD::XOR: 1981 ConvertedOp = M68kISD::XOR; 1982 break; 1983 } 1984 1985 if (ConvertedOp) { 1986 const TargetLowering &TLI = DAG.getTargetLoweringInfo(); 1987 if (TLI.isOperationLegal(WideVal.getOpcode(), WideVT)) { 1988 SDValue V0 = DAG.getNode(ISD::TRUNCATE, DL, VT, WideVal.getOperand(0)); 1989 SDValue V1 = DAG.getNode(ISD::TRUNCATE, DL, VT, WideVal.getOperand(1)); 1990 Op = DAG.getNode(ConvertedOp, DL, VT, V0, V1); 1991 } 1992 } 1993 } 1994 1995 if (Opcode == 0) { 1996 // Emit a CMP with 0, which is the TEST pattern. 1997 return DAG.getNode(M68kISD::CMP, DL, MVT::i8, 1998 DAG.getConstant(0, DL, Op.getValueType()), Op); 1999 } 2000 SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::i8); 2001 SmallVector<SDValue, 4> Ops(Op->op_begin(), Op->op_begin() + NumOperands); 2002 2003 SDValue New = DAG.getNode(Opcode, DL, VTs, Ops); 2004 DAG.ReplaceAllUsesWith(Op, New); 2005 return SDValue(New.getNode(), 1); 2006 } 2007 2008 /// \brief Return true if the condition is an unsigned comparison operation. 2009 static bool isM68kCCUnsigned(unsigned M68kCC) { 2010 switch (M68kCC) { 2011 default: 2012 llvm_unreachable("Invalid integer condition!"); 2013 case M68k::COND_EQ: 2014 case M68k::COND_NE: 2015 case M68k::COND_CS: 2016 case M68k::COND_HI: 2017 case M68k::COND_LS: 2018 case M68k::COND_CC: 2019 return true; 2020 case M68k::COND_GT: 2021 case M68k::COND_GE: 2022 case M68k::COND_LT: 2023 case M68k::COND_LE: 2024 return false; 2025 } 2026 } 2027 2028 SDValue M68kTargetLowering::EmitCmp(SDValue Op0, SDValue Op1, unsigned M68kCC, 2029 const SDLoc &DL, SelectionDAG &DAG) const { 2030 if (isNullConstant(Op1)) 2031 return EmitTest(Op0, M68kCC, DL, DAG); 2032 2033 assert(!(isa<ConstantSDNode>(Op1) && Op0.getValueType() == MVT::i1) && 2034 "Unexpected comparison operation for MVT::i1 operands"); 2035 2036 if ((Op0.getValueType() == MVT::i8 || Op0.getValueType() == MVT::i16 || 2037 Op0.getValueType() == MVT::i32 || Op0.getValueType() == MVT::i64)) { 2038 // Only promote the compare up to I32 if it is a 16 bit operation 2039 // with an immediate. 16 bit immediates are to be avoided. 2040 if ((Op0.getValueType() == MVT::i16 && 2041 (isa<ConstantSDNode>(Op0) || isa<ConstantSDNode>(Op1))) && 2042 !DAG.getMachineFunction().getFunction().hasMinSize()) { 2043 unsigned ExtendOp = 2044 isM68kCCUnsigned(M68kCC) ? ISD::ZERO_EXTEND : ISD::SIGN_EXTEND; 2045 Op0 = DAG.getNode(ExtendOp, DL, MVT::i32, Op0); 2046 Op1 = DAG.getNode(ExtendOp, DL, MVT::i32, Op1); 2047 } 2048 // Use SUB instead of CMP to enable CSE between SUB and CMP. 2049 SDVTList VTs = DAG.getVTList(Op0.getValueType(), MVT::i8); 2050 SDValue Sub = DAG.getNode(M68kISD::SUB, DL, VTs, Op0, Op1); 2051 return SDValue(Sub.getNode(), 1); 2052 } 2053 return DAG.getNode(M68kISD::CMP, DL, MVT::i8, Op0, Op1); 2054 } 2055 2056 /// Result of 'and' or 'trunc to i1' is compared against zero. 2057 /// Change to a BTST node if possible. 2058 SDValue M68kTargetLowering::LowerToBTST(SDValue Op, ISD::CondCode CC, 2059 const SDLoc &DL, 2060 SelectionDAG &DAG) const { 2061 if (Op.getOpcode() == ISD::AND) 2062 return LowerAndToBTST(Op, CC, DL, DAG); 2063 if (Op.getOpcode() == ISD::TRUNCATE && Op.getValueType() == MVT::i1) 2064 return LowerTruncateToBTST(Op, CC, DL, DAG); 2065 return SDValue(); 2066 } 2067 2068 SDValue M68kTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const { 2069 MVT VT = Op.getSimpleValueType(); 2070 assert(VT == MVT::i8 && "SetCC type must be 8-bit integer"); 2071 2072 SDValue Op0 = Op.getOperand(0); 2073 SDValue Op1 = Op.getOperand(1); 2074 SDLoc DL(Op); 2075 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get(); 2076 2077 // Optimize to BTST if possible. 2078 // Lower (X & (1 << N)) == 0 to BTST(X, N). 2079 // Lower ((X >>u N) & 1) != 0 to BTST(X, N). 2080 // Lower ((X >>s N) & 1) != 0 to BTST(X, N). 2081 // Lower (trunc (X >> N) to i1) to BTST(X, N). 2082 if (Op0.hasOneUse() && isNullConstant(Op1) && 2083 (CC == ISD::SETEQ || CC == ISD::SETNE)) { 2084 if (SDValue NewSetCC = LowerToBTST(Op0, CC, DL, DAG)) { 2085 if (VT == MVT::i1) 2086 return DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, NewSetCC); 2087 return NewSetCC; 2088 } 2089 } 2090 2091 // Look for X == 0, X == 1, X != 0, or X != 1. We can simplify some forms of 2092 // these. 2093 if ((isOneConstant(Op1) || isNullConstant(Op1)) && 2094 (CC == ISD::SETEQ || CC == ISD::SETNE)) { 2095 2096 // If the input is a setcc, then reuse the input setcc or use a new one with 2097 // the inverted condition. 2098 if (Op0.getOpcode() == M68kISD::SETCC) { 2099 M68k::CondCode CCode = (M68k::CondCode)Op0.getConstantOperandVal(0); 2100 bool Invert = (CC == ISD::SETNE) ^ isNullConstant(Op1); 2101 if (!Invert) 2102 return Op0; 2103 2104 CCode = M68k::GetOppositeBranchCondition(CCode); 2105 SDValue SetCC = 2106 DAG.getNode(M68kISD::SETCC, DL, MVT::i8, 2107 DAG.getConstant(CCode, DL, MVT::i8), Op0.getOperand(1)); 2108 if (VT == MVT::i1) 2109 return DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, SetCC); 2110 return SetCC; 2111 } 2112 } 2113 if (Op0.getValueType() == MVT::i1 && (CC == ISD::SETEQ || CC == ISD::SETNE)) { 2114 if (isOneConstant(Op1)) { 2115 ISD::CondCode NewCC = ISD::GlobalISel::getSetCCInverse(CC, true); 2116 return DAG.getSetCC(DL, VT, Op0, DAG.getConstant(0, DL, MVT::i1), NewCC); 2117 } 2118 if (!isNullConstant(Op1)) { 2119 SDValue Xor = DAG.getNode(ISD::XOR, DL, MVT::i1, Op0, Op1); 2120 return DAG.getSetCC(DL, VT, Xor, DAG.getConstant(0, DL, MVT::i1), CC); 2121 } 2122 } 2123 2124 bool IsFP = Op1.getSimpleValueType().isFloatingPoint(); 2125 unsigned M68kCC = TranslateM68kCC(CC, DL, IsFP, Op0, Op1, DAG); 2126 if (M68kCC == M68k::COND_INVALID) 2127 return SDValue(); 2128 2129 SDValue CCR = EmitCmp(Op0, Op1, M68kCC, DL, DAG); 2130 return DAG.getNode(M68kISD::SETCC, DL, MVT::i8, 2131 DAG.getConstant(M68kCC, DL, MVT::i8), CCR); 2132 } 2133 2134 SDValue M68kTargetLowering::LowerSETCCCARRY(SDValue Op, 2135 SelectionDAG &DAG) const { 2136 SDValue LHS = Op.getOperand(0); 2137 SDValue RHS = Op.getOperand(1); 2138 SDValue Carry = Op.getOperand(2); 2139 SDValue Cond = Op.getOperand(3); 2140 SDLoc DL(Op); 2141 2142 assert(LHS.getSimpleValueType().isInteger() && "SETCCCARRY is integer only."); 2143 M68k::CondCode CC = TranslateIntegerM68kCC(cast<CondCodeSDNode>(Cond)->get()); 2144 2145 EVT CarryVT = Carry.getValueType(); 2146 APInt NegOne = APInt::getAllOnes(CarryVT.getScalarSizeInBits()); 2147 Carry = DAG.getNode(M68kISD::ADD, DL, DAG.getVTList(CarryVT, MVT::i32), Carry, 2148 DAG.getConstant(NegOne, DL, CarryVT)); 2149 2150 SDVTList VTs = DAG.getVTList(LHS.getValueType(), MVT::i32); 2151 SDValue Cmp = 2152 DAG.getNode(M68kISD::SUBX, DL, VTs, LHS, RHS, Carry.getValue(1)); 2153 2154 return DAG.getNode(M68kISD::SETCC, DL, MVT::i8, 2155 DAG.getConstant(CC, DL, MVT::i8), Cmp.getValue(1)); 2156 } 2157 2158 /// Return true if opcode is a M68k logical comparison. 2159 static bool isM68kLogicalCmp(SDValue Op) { 2160 unsigned Opc = Op.getNode()->getOpcode(); 2161 if (Opc == M68kISD::CMP) 2162 return true; 2163 if (Op.getResNo() == 1 && 2164 (Opc == M68kISD::ADD || Opc == M68kISD::SUB || Opc == M68kISD::ADDX || 2165 Opc == M68kISD::SUBX || Opc == M68kISD::SMUL || Opc == M68kISD::UMUL || 2166 Opc == M68kISD::OR || Opc == M68kISD::XOR || Opc == M68kISD::AND)) 2167 return true; 2168 2169 if (Op.getResNo() == 2 && Opc == M68kISD::UMUL) 2170 return true; 2171 2172 return false; 2173 } 2174 2175 static bool isTruncWithZeroHighBitsInput(SDValue V, SelectionDAG &DAG) { 2176 if (V.getOpcode() != ISD::TRUNCATE) 2177 return false; 2178 2179 SDValue VOp0 = V.getOperand(0); 2180 unsigned InBits = VOp0.getValueSizeInBits(); 2181 unsigned Bits = V.getValueSizeInBits(); 2182 return DAG.MaskedValueIsZero(VOp0, 2183 APInt::getHighBitsSet(InBits, InBits - Bits)); 2184 } 2185 2186 SDValue M68kTargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const { 2187 bool addTest = true; 2188 SDValue Cond = Op.getOperand(0); 2189 SDValue Op1 = Op.getOperand(1); 2190 SDValue Op2 = Op.getOperand(2); 2191 SDLoc DL(Op); 2192 SDValue CC; 2193 2194 if (Cond.getOpcode() == ISD::SETCC) { 2195 if (SDValue NewCond = LowerSETCC(Cond, DAG)) 2196 Cond = NewCond; 2197 } 2198 2199 // (select (x == 0), -1, y) -> (sign_bit (x - 1)) | y 2200 // (select (x == 0), y, -1) -> ~(sign_bit (x - 1)) | y 2201 // (select (x != 0), y, -1) -> (sign_bit (x - 1)) | y 2202 // (select (x != 0), -1, y) -> ~(sign_bit (x - 1)) | y 2203 if (Cond.getOpcode() == M68kISD::SETCC && 2204 Cond.getOperand(1).getOpcode() == M68kISD::CMP && 2205 isNullConstant(Cond.getOperand(1).getOperand(0))) { 2206 SDValue Cmp = Cond.getOperand(1); 2207 2208 unsigned CondCode = 2209 cast<ConstantSDNode>(Cond.getOperand(0))->getZExtValue(); 2210 2211 if ((isAllOnesConstant(Op1) || isAllOnesConstant(Op2)) && 2212 (CondCode == M68k::COND_EQ || CondCode == M68k::COND_NE)) { 2213 SDValue Y = isAllOnesConstant(Op2) ? Op1 : Op2; 2214 2215 SDValue CmpOp0 = Cmp.getOperand(1); 2216 // Apply further optimizations for special cases 2217 // (select (x != 0), -1, 0) -> neg & sbb 2218 // (select (x == 0), 0, -1) -> neg & sbb 2219 if (isNullConstant(Y) && 2220 (isAllOnesConstant(Op1) == (CondCode == M68k::COND_NE))) { 2221 2222 SDVTList VTs = DAG.getVTList(CmpOp0.getValueType(), MVT::i32); 2223 2224 SDValue Neg = 2225 DAG.getNode(M68kISD::SUB, DL, VTs, 2226 DAG.getConstant(0, DL, CmpOp0.getValueType()), CmpOp0); 2227 2228 SDValue Res = DAG.getNode(M68kISD::SETCC_CARRY, DL, Op.getValueType(), 2229 DAG.getConstant(M68k::COND_CS, DL, MVT::i8), 2230 SDValue(Neg.getNode(), 1)); 2231 return Res; 2232 } 2233 2234 Cmp = DAG.getNode(M68kISD::CMP, DL, MVT::i8, 2235 DAG.getConstant(1, DL, CmpOp0.getValueType()), CmpOp0); 2236 2237 SDValue Res = // Res = 0 or -1. 2238 DAG.getNode(M68kISD::SETCC_CARRY, DL, Op.getValueType(), 2239 DAG.getConstant(M68k::COND_CS, DL, MVT::i8), Cmp); 2240 2241 if (isAllOnesConstant(Op1) != (CondCode == M68k::COND_EQ)) 2242 Res = DAG.getNOT(DL, Res, Res.getValueType()); 2243 2244 if (!isNullConstant(Op2)) 2245 Res = DAG.getNode(ISD::OR, DL, Res.getValueType(), Res, Y); 2246 return Res; 2247 } 2248 } 2249 2250 // Look past (and (setcc_carry (cmp ...)), 1). 2251 if (Cond.getOpcode() == ISD::AND && 2252 Cond.getOperand(0).getOpcode() == M68kISD::SETCC_CARRY && 2253 isOneConstant(Cond.getOperand(1))) 2254 Cond = Cond.getOperand(0); 2255 2256 // If condition flag is set by a M68kISD::CMP, then use it as the condition 2257 // setting operand in place of the M68kISD::SETCC. 2258 unsigned CondOpcode = Cond.getOpcode(); 2259 if (CondOpcode == M68kISD::SETCC || CondOpcode == M68kISD::SETCC_CARRY) { 2260 CC = Cond.getOperand(0); 2261 2262 SDValue Cmp = Cond.getOperand(1); 2263 unsigned Opc = Cmp.getOpcode(); 2264 2265 bool IllegalFPCMov = false; 2266 2267 if ((isM68kLogicalCmp(Cmp) && !IllegalFPCMov) || Opc == M68kISD::BTST) { 2268 Cond = Cmp; 2269 addTest = false; 2270 } 2271 } else if (CondOpcode == ISD::USUBO || CondOpcode == ISD::SSUBO || 2272 CondOpcode == ISD::UADDO || CondOpcode == ISD::SADDO || 2273 CondOpcode == ISD::UMULO || CondOpcode == ISD::SMULO) { 2274 SDValue LHS = Cond.getOperand(0); 2275 SDValue RHS = Cond.getOperand(1); 2276 unsigned MxOpcode; 2277 unsigned MxCond; 2278 SDVTList VTs; 2279 switch (CondOpcode) { 2280 case ISD::UADDO: 2281 MxOpcode = M68kISD::ADD; 2282 MxCond = M68k::COND_CS; 2283 break; 2284 case ISD::SADDO: 2285 MxOpcode = M68kISD::ADD; 2286 MxCond = M68k::COND_VS; 2287 break; 2288 case ISD::USUBO: 2289 MxOpcode = M68kISD::SUB; 2290 MxCond = M68k::COND_CS; 2291 break; 2292 case ISD::SSUBO: 2293 MxOpcode = M68kISD::SUB; 2294 MxCond = M68k::COND_VS; 2295 break; 2296 case ISD::UMULO: 2297 MxOpcode = M68kISD::UMUL; 2298 MxCond = M68k::COND_VS; 2299 break; 2300 case ISD::SMULO: 2301 MxOpcode = M68kISD::SMUL; 2302 MxCond = M68k::COND_VS; 2303 break; 2304 default: 2305 llvm_unreachable("unexpected overflowing operator"); 2306 } 2307 if (CondOpcode == ISD::UMULO) 2308 VTs = DAG.getVTList(LHS.getValueType(), LHS.getValueType(), MVT::i32); 2309 else 2310 VTs = DAG.getVTList(LHS.getValueType(), MVT::i32); 2311 2312 SDValue MxOp = DAG.getNode(MxOpcode, DL, VTs, LHS, RHS); 2313 2314 if (CondOpcode == ISD::UMULO) 2315 Cond = MxOp.getValue(2); 2316 else 2317 Cond = MxOp.getValue(1); 2318 2319 CC = DAG.getConstant(MxCond, DL, MVT::i8); 2320 addTest = false; 2321 } 2322 2323 if (addTest) { 2324 // Look past the truncate if the high bits are known zero. 2325 if (isTruncWithZeroHighBitsInput(Cond, DAG)) 2326 Cond = Cond.getOperand(0); 2327 2328 // We know the result of AND is compared against zero. Try to match 2329 // it to BT. 2330 if (Cond.getOpcode() == ISD::AND && Cond.hasOneUse()) { 2331 if (SDValue NewSetCC = LowerToBTST(Cond, ISD::SETNE, DL, DAG)) { 2332 CC = NewSetCC.getOperand(0); 2333 Cond = NewSetCC.getOperand(1); 2334 addTest = false; 2335 } 2336 } 2337 } 2338 2339 if (addTest) { 2340 CC = DAG.getConstant(M68k::COND_NE, DL, MVT::i8); 2341 Cond = EmitTest(Cond, M68k::COND_NE, DL, DAG); 2342 } 2343 2344 // a < b ? -1 : 0 -> RES = ~setcc_carry 2345 // a < b ? 0 : -1 -> RES = setcc_carry 2346 // a >= b ? -1 : 0 -> RES = setcc_carry 2347 // a >= b ? 0 : -1 -> RES = ~setcc_carry 2348 if (Cond.getOpcode() == M68kISD::SUB) { 2349 unsigned CondCode = cast<ConstantSDNode>(CC)->getZExtValue(); 2350 2351 if ((CondCode == M68k::COND_CC || CondCode == M68k::COND_CS) && 2352 (isAllOnesConstant(Op1) || isAllOnesConstant(Op2)) && 2353 (isNullConstant(Op1) || isNullConstant(Op2))) { 2354 SDValue Res = 2355 DAG.getNode(M68kISD::SETCC_CARRY, DL, Op.getValueType(), 2356 DAG.getConstant(M68k::COND_CS, DL, MVT::i8), Cond); 2357 if (isAllOnesConstant(Op1) != (CondCode == M68k::COND_CS)) 2358 return DAG.getNOT(DL, Res, Res.getValueType()); 2359 return Res; 2360 } 2361 } 2362 2363 // M68k doesn't have an i8 cmov. If both operands are the result of a 2364 // truncate widen the cmov and push the truncate through. This avoids 2365 // introducing a new branch during isel and doesn't add any extensions. 2366 if (Op.getValueType() == MVT::i8 && Op1.getOpcode() == ISD::TRUNCATE && 2367 Op2.getOpcode() == ISD::TRUNCATE) { 2368 SDValue T1 = Op1.getOperand(0), T2 = Op2.getOperand(0); 2369 if (T1.getValueType() == T2.getValueType() && 2370 // Block CopyFromReg so partial register stalls are avoided. 2371 T1.getOpcode() != ISD::CopyFromReg && 2372 T2.getOpcode() != ISD::CopyFromReg) { 2373 SDVTList VTs = DAG.getVTList(T1.getValueType(), MVT::Glue); 2374 SDValue Cmov = DAG.getNode(M68kISD::CMOV, DL, VTs, T2, T1, CC, Cond); 2375 return DAG.getNode(ISD::TRUNCATE, DL, Op.getValueType(), Cmov); 2376 } 2377 } 2378 2379 // M68kISD::CMOV means set the result (which is operand 1) to the RHS if 2380 // condition is true. 2381 SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::Glue); 2382 SDValue Ops[] = {Op2, Op1, CC, Cond}; 2383 return DAG.getNode(M68kISD::CMOV, DL, VTs, Ops); 2384 } 2385 2386 /// Return true if node is an ISD::AND or ISD::OR of two M68k::SETcc nodes 2387 /// each of which has no other use apart from the AND / OR. 2388 static bool isAndOrOfSetCCs(SDValue Op, unsigned &Opc) { 2389 Opc = Op.getOpcode(); 2390 if (Opc != ISD::OR && Opc != ISD::AND) 2391 return false; 2392 return (M68k::IsSETCC(Op.getOperand(0).getOpcode()) && 2393 Op.getOperand(0).hasOneUse() && 2394 M68k::IsSETCC(Op.getOperand(1).getOpcode()) && 2395 Op.getOperand(1).hasOneUse()); 2396 } 2397 2398 /// Return true if node is an ISD::XOR of a M68kISD::SETCC and 1 and that the 2399 /// SETCC node has a single use. 2400 static bool isXor1OfSetCC(SDValue Op) { 2401 if (Op.getOpcode() != ISD::XOR) 2402 return false; 2403 if (isOneConstant(Op.getOperand(1))) 2404 return Op.getOperand(0).getOpcode() == M68kISD::SETCC && 2405 Op.getOperand(0).hasOneUse(); 2406 return false; 2407 } 2408 2409 SDValue M68kTargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const { 2410 bool AddTest = true; 2411 SDValue Chain = Op.getOperand(0); 2412 SDValue Cond = Op.getOperand(1); 2413 SDValue Dest = Op.getOperand(2); 2414 SDLoc DL(Op); 2415 SDValue CC; 2416 bool Inverted = false; 2417 2418 if (Cond.getOpcode() == ISD::SETCC) { 2419 // Check for setcc([su]{add,sub}o == 0). 2420 if (cast<CondCodeSDNode>(Cond.getOperand(2))->get() == ISD::SETEQ && 2421 isNullConstant(Cond.getOperand(1)) && 2422 Cond.getOperand(0).getResNo() == 1 && 2423 (Cond.getOperand(0).getOpcode() == ISD::SADDO || 2424 Cond.getOperand(0).getOpcode() == ISD::UADDO || 2425 Cond.getOperand(0).getOpcode() == ISD::SSUBO || 2426 Cond.getOperand(0).getOpcode() == ISD::USUBO)) { 2427 Inverted = true; 2428 Cond = Cond.getOperand(0); 2429 } else { 2430 if (SDValue NewCond = LowerSETCC(Cond, DAG)) 2431 Cond = NewCond; 2432 } 2433 } 2434 2435 // Look pass (and (setcc_carry (cmp ...)), 1). 2436 if (Cond.getOpcode() == ISD::AND && 2437 Cond.getOperand(0).getOpcode() == M68kISD::SETCC_CARRY && 2438 isOneConstant(Cond.getOperand(1))) 2439 Cond = Cond.getOperand(0); 2440 2441 // If condition flag is set by a M68kISD::CMP, then use it as the condition 2442 // setting operand in place of the M68kISD::SETCC. 2443 unsigned CondOpcode = Cond.getOpcode(); 2444 if (CondOpcode == M68kISD::SETCC || CondOpcode == M68kISD::SETCC_CARRY) { 2445 CC = Cond.getOperand(0); 2446 2447 SDValue Cmp = Cond.getOperand(1); 2448 unsigned Opc = Cmp.getOpcode(); 2449 2450 if (isM68kLogicalCmp(Cmp) || Opc == M68kISD::BTST) { 2451 Cond = Cmp; 2452 AddTest = false; 2453 } else { 2454 switch (cast<ConstantSDNode>(CC)->getZExtValue()) { 2455 default: 2456 break; 2457 case M68k::COND_VS: 2458 case M68k::COND_CS: 2459 // These can only come from an arithmetic instruction with overflow, 2460 // e.g. SADDO, UADDO. 2461 Cond = Cond.getNode()->getOperand(1); 2462 AddTest = false; 2463 break; 2464 } 2465 } 2466 } 2467 CondOpcode = Cond.getOpcode(); 2468 if (CondOpcode == ISD::UADDO || CondOpcode == ISD::SADDO || 2469 CondOpcode == ISD::USUBO || CondOpcode == ISD::SSUBO) { 2470 SDValue LHS = Cond.getOperand(0); 2471 SDValue RHS = Cond.getOperand(1); 2472 unsigned MxOpcode; 2473 unsigned MxCond; 2474 SDVTList VTs; 2475 // Keep this in sync with LowerXALUO, otherwise we might create redundant 2476 // instructions that can't be removed afterwards (i.e. M68kISD::ADD and 2477 // M68kISD::INC). 2478 switch (CondOpcode) { 2479 case ISD::UADDO: 2480 MxOpcode = M68kISD::ADD; 2481 MxCond = M68k::COND_CS; 2482 break; 2483 case ISD::SADDO: 2484 MxOpcode = M68kISD::ADD; 2485 MxCond = M68k::COND_VS; 2486 break; 2487 case ISD::USUBO: 2488 MxOpcode = M68kISD::SUB; 2489 MxCond = M68k::COND_CS; 2490 break; 2491 case ISD::SSUBO: 2492 MxOpcode = M68kISD::SUB; 2493 MxCond = M68k::COND_VS; 2494 break; 2495 case ISD::UMULO: 2496 MxOpcode = M68kISD::UMUL; 2497 MxCond = M68k::COND_VS; 2498 break; 2499 case ISD::SMULO: 2500 MxOpcode = M68kISD::SMUL; 2501 MxCond = M68k::COND_VS; 2502 break; 2503 default: 2504 llvm_unreachable("unexpected overflowing operator"); 2505 } 2506 2507 if (Inverted) 2508 MxCond = M68k::GetOppositeBranchCondition((M68k::CondCode)MxCond); 2509 2510 if (CondOpcode == ISD::UMULO) 2511 VTs = DAG.getVTList(LHS.getValueType(), LHS.getValueType(), MVT::i8); 2512 else 2513 VTs = DAG.getVTList(LHS.getValueType(), MVT::i8); 2514 2515 SDValue MxOp = DAG.getNode(MxOpcode, DL, VTs, LHS, RHS); 2516 2517 if (CondOpcode == ISD::UMULO) 2518 Cond = MxOp.getValue(2); 2519 else 2520 Cond = MxOp.getValue(1); 2521 2522 CC = DAG.getConstant(MxCond, DL, MVT::i8); 2523 AddTest = false; 2524 } else { 2525 unsigned CondOpc; 2526 if (Cond.hasOneUse() && isAndOrOfSetCCs(Cond, CondOpc)) { 2527 SDValue Cmp = Cond.getOperand(0).getOperand(1); 2528 if (CondOpc == ISD::OR) { 2529 // Also, recognize the pattern generated by an FCMP_UNE. We can emit 2530 // two branches instead of an explicit OR instruction with a 2531 // separate test. 2532 if (Cmp == Cond.getOperand(1).getOperand(1) && isM68kLogicalCmp(Cmp)) { 2533 CC = Cond.getOperand(0).getOperand(0); 2534 Chain = DAG.getNode(M68kISD::BRCOND, DL, Op.getValueType(), Chain, 2535 Dest, CC, Cmp); 2536 CC = Cond.getOperand(1).getOperand(0); 2537 Cond = Cmp; 2538 AddTest = false; 2539 } 2540 } else { // ISD::AND 2541 // Also, recognize the pattern generated by an FCMP_OEQ. We can emit 2542 // two branches instead of an explicit AND instruction with a 2543 // separate test. However, we only do this if this block doesn't 2544 // have a fall-through edge, because this requires an explicit 2545 // jmp when the condition is false. 2546 if (Cmp == Cond.getOperand(1).getOperand(1) && isM68kLogicalCmp(Cmp) && 2547 Op.getNode()->hasOneUse()) { 2548 M68k::CondCode CCode = 2549 (M68k::CondCode)Cond.getOperand(0).getConstantOperandVal(0); 2550 CCode = M68k::GetOppositeBranchCondition(CCode); 2551 CC = DAG.getConstant(CCode, DL, MVT::i8); 2552 SDNode *User = *Op.getNode()->use_begin(); 2553 // Look for an unconditional branch following this conditional branch. 2554 // We need this because we need to reverse the successors in order 2555 // to implement FCMP_OEQ. 2556 if (User->getOpcode() == ISD::BR) { 2557 SDValue FalseBB = User->getOperand(1); 2558 SDNode *NewBR = 2559 DAG.UpdateNodeOperands(User, User->getOperand(0), Dest); 2560 assert(NewBR == User); 2561 (void)NewBR; 2562 Dest = FalseBB; 2563 2564 Chain = DAG.getNode(M68kISD::BRCOND, DL, Op.getValueType(), Chain, 2565 Dest, CC, Cmp); 2566 M68k::CondCode CCode = 2567 (M68k::CondCode)Cond.getOperand(1).getConstantOperandVal(0); 2568 CCode = M68k::GetOppositeBranchCondition(CCode); 2569 CC = DAG.getConstant(CCode, DL, MVT::i8); 2570 Cond = Cmp; 2571 AddTest = false; 2572 } 2573 } 2574 } 2575 } else if (Cond.hasOneUse() && isXor1OfSetCC(Cond)) { 2576 // Recognize for xorb (setcc), 1 patterns. The xor inverts the condition. 2577 // It should be transformed during dag combiner except when the condition 2578 // is set by a arithmetics with overflow node. 2579 M68k::CondCode CCode = 2580 (M68k::CondCode)Cond.getOperand(0).getConstantOperandVal(0); 2581 CCode = M68k::GetOppositeBranchCondition(CCode); 2582 CC = DAG.getConstant(CCode, DL, MVT::i8); 2583 Cond = Cond.getOperand(0).getOperand(1); 2584 AddTest = false; 2585 } 2586 } 2587 2588 if (AddTest) { 2589 // Look pass the truncate if the high bits are known zero. 2590 if (isTruncWithZeroHighBitsInput(Cond, DAG)) 2591 Cond = Cond.getOperand(0); 2592 2593 // We know the result is compared against zero. Try to match it to BT. 2594 if (Cond.hasOneUse()) { 2595 if (SDValue NewSetCC = LowerToBTST(Cond, ISD::SETNE, DL, DAG)) { 2596 CC = NewSetCC.getOperand(0); 2597 Cond = NewSetCC.getOperand(1); 2598 AddTest = false; 2599 } 2600 } 2601 } 2602 2603 if (AddTest) { 2604 M68k::CondCode MxCond = Inverted ? M68k::COND_EQ : M68k::COND_NE; 2605 CC = DAG.getConstant(MxCond, DL, MVT::i8); 2606 Cond = EmitTest(Cond, MxCond, DL, DAG); 2607 } 2608 return DAG.getNode(M68kISD::BRCOND, DL, Op.getValueType(), Chain, Dest, CC, 2609 Cond); 2610 } 2611 2612 SDValue M68kTargetLowering::LowerADDC_ADDE_SUBC_SUBE(SDValue Op, 2613 SelectionDAG &DAG) const { 2614 MVT VT = Op.getNode()->getSimpleValueType(0); 2615 2616 // Let legalize expand this if it isn't a legal type yet. 2617 if (!DAG.getTargetLoweringInfo().isTypeLegal(VT)) 2618 return SDValue(); 2619 2620 SDVTList VTs = DAG.getVTList(VT, MVT::i8); 2621 2622 unsigned Opc; 2623 bool ExtraOp = false; 2624 switch (Op.getOpcode()) { 2625 default: 2626 llvm_unreachable("Invalid code"); 2627 case ISD::ADDC: 2628 Opc = M68kISD::ADD; 2629 break; 2630 case ISD::ADDE: 2631 Opc = M68kISD::ADDX; 2632 ExtraOp = true; 2633 break; 2634 case ISD::SUBC: 2635 Opc = M68kISD::SUB; 2636 break; 2637 case ISD::SUBE: 2638 Opc = M68kISD::SUBX; 2639 ExtraOp = true; 2640 break; 2641 } 2642 2643 if (!ExtraOp) 2644 return DAG.getNode(Opc, SDLoc(Op), VTs, Op.getOperand(0), Op.getOperand(1)); 2645 return DAG.getNode(Opc, SDLoc(Op), VTs, Op.getOperand(0), Op.getOperand(1), 2646 Op.getOperand(2)); 2647 } 2648 2649 // ConstantPool, JumpTable, GlobalAddress, and ExternalSymbol are lowered as 2650 // their target countpart wrapped in the M68kISD::Wrapper node. Suppose N is 2651 // one of the above mentioned nodes. It has to be wrapped because otherwise 2652 // Select(N) returns N. So the raw TargetGlobalAddress nodes, etc. can only 2653 // be used to form addressing mode. These wrapped nodes will be selected 2654 // into MOV32ri. 2655 SDValue M68kTargetLowering::LowerConstantPool(SDValue Op, 2656 SelectionDAG &DAG) const { 2657 ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op); 2658 2659 // In PIC mode (unless we're in PCRel PIC mode) we add an offset to the 2660 // global base reg. 2661 unsigned char OpFlag = Subtarget.classifyLocalReference(nullptr); 2662 2663 unsigned WrapperKind = M68kISD::Wrapper; 2664 if (M68kII::isPCRelGlobalReference(OpFlag)) { 2665 WrapperKind = M68kISD::WrapperPC; 2666 } 2667 2668 MVT PtrVT = getPointerTy(DAG.getDataLayout()); 2669 SDValue Result = DAG.getTargetConstantPool( 2670 CP->getConstVal(), PtrVT, CP->getAlign(), CP->getOffset(), OpFlag); 2671 2672 SDLoc DL(CP); 2673 Result = DAG.getNode(WrapperKind, DL, PtrVT, Result); 2674 2675 // With PIC, the address is actually $g + Offset. 2676 if (M68kII::isGlobalRelativeToPICBase(OpFlag)) { 2677 Result = DAG.getNode(ISD::ADD, DL, PtrVT, 2678 DAG.getNode(M68kISD::GLOBAL_BASE_REG, SDLoc(), PtrVT), 2679 Result); 2680 } 2681 2682 return Result; 2683 } 2684 2685 SDValue M68kTargetLowering::LowerExternalSymbol(SDValue Op, 2686 SelectionDAG &DAG) const { 2687 const char *Sym = cast<ExternalSymbolSDNode>(Op)->getSymbol(); 2688 2689 // In PIC mode (unless we're in PCRel PIC mode) we add an offset to the 2690 // global base reg. 2691 const Module *Mod = DAG.getMachineFunction().getFunction().getParent(); 2692 unsigned char OpFlag = Subtarget.classifyExternalReference(*Mod); 2693 2694 unsigned WrapperKind = M68kISD::Wrapper; 2695 if (M68kII::isPCRelGlobalReference(OpFlag)) { 2696 WrapperKind = M68kISD::WrapperPC; 2697 } 2698 2699 auto PtrVT = getPointerTy(DAG.getDataLayout()); 2700 SDValue Result = DAG.getTargetExternalSymbol(Sym, PtrVT, OpFlag); 2701 2702 SDLoc DL(Op); 2703 Result = DAG.getNode(WrapperKind, DL, PtrVT, Result); 2704 2705 // With PIC, the address is actually $g + Offset. 2706 if (M68kII::isGlobalRelativeToPICBase(OpFlag)) { 2707 Result = DAG.getNode(ISD::ADD, DL, PtrVT, 2708 DAG.getNode(M68kISD::GLOBAL_BASE_REG, SDLoc(), PtrVT), 2709 Result); 2710 } 2711 2712 // For symbols that require a load from a stub to get the address, emit the 2713 // load. 2714 if (M68kII::isGlobalStubReference(OpFlag)) { 2715 Result = DAG.getLoad(PtrVT, DL, DAG.getEntryNode(), Result, 2716 MachinePointerInfo::getGOT(DAG.getMachineFunction())); 2717 } 2718 2719 return Result; 2720 } 2721 2722 SDValue M68kTargetLowering::LowerBlockAddress(SDValue Op, 2723 SelectionDAG &DAG) const { 2724 unsigned char OpFlags = Subtarget.classifyBlockAddressReference(); 2725 const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress(); 2726 int64_t Offset = cast<BlockAddressSDNode>(Op)->getOffset(); 2727 SDLoc DL(Op); 2728 auto PtrVT = getPointerTy(DAG.getDataLayout()); 2729 2730 // Create the TargetBlockAddressAddress node. 2731 SDValue Result = DAG.getTargetBlockAddress(BA, PtrVT, Offset, OpFlags); 2732 2733 if (M68kII::isPCRelBlockReference(OpFlags)) { 2734 Result = DAG.getNode(M68kISD::WrapperPC, DL, PtrVT, Result); 2735 } else { 2736 Result = DAG.getNode(M68kISD::Wrapper, DL, PtrVT, Result); 2737 } 2738 2739 // With PIC, the address is actually $g + Offset. 2740 if (M68kII::isGlobalRelativeToPICBase(OpFlags)) { 2741 Result = 2742 DAG.getNode(ISD::ADD, DL, PtrVT, 2743 DAG.getNode(M68kISD::GLOBAL_BASE_REG, DL, PtrVT), Result); 2744 } 2745 2746 return Result; 2747 } 2748 2749 SDValue M68kTargetLowering::LowerGlobalAddress(const GlobalValue *GV, 2750 const SDLoc &DL, int64_t Offset, 2751 SelectionDAG &DAG) const { 2752 unsigned char OpFlags = Subtarget.classifyGlobalReference(GV); 2753 auto PtrVT = getPointerTy(DAG.getDataLayout()); 2754 2755 // Create the TargetGlobalAddress node, folding in the constant 2756 // offset if it is legal. 2757 SDValue Result; 2758 if (M68kII::isDirectGlobalReference(OpFlags)) { 2759 Result = DAG.getTargetGlobalAddress(GV, DL, PtrVT, Offset); 2760 Offset = 0; 2761 } else { 2762 Result = DAG.getTargetGlobalAddress(GV, DL, PtrVT, 0, OpFlags); 2763 } 2764 2765 if (M68kII::isPCRelGlobalReference(OpFlags)) 2766 Result = DAG.getNode(M68kISD::WrapperPC, DL, PtrVT, Result); 2767 else 2768 Result = DAG.getNode(M68kISD::Wrapper, DL, PtrVT, Result); 2769 2770 // With PIC, the address is actually $g + Offset. 2771 if (M68kII::isGlobalRelativeToPICBase(OpFlags)) { 2772 Result = 2773 DAG.getNode(ISD::ADD, DL, PtrVT, 2774 DAG.getNode(M68kISD::GLOBAL_BASE_REG, DL, PtrVT), Result); 2775 } 2776 2777 // For globals that require a load from a stub to get the address, emit the 2778 // load. 2779 if (M68kII::isGlobalStubReference(OpFlags)) { 2780 Result = DAG.getLoad(PtrVT, DL, DAG.getEntryNode(), Result, 2781 MachinePointerInfo::getGOT(DAG.getMachineFunction())); 2782 } 2783 2784 // If there was a non-zero offset that we didn't fold, create an explicit 2785 // addition for it. 2786 if (Offset != 0) { 2787 Result = DAG.getNode(ISD::ADD, DL, PtrVT, Result, 2788 DAG.getConstant(Offset, DL, PtrVT)); 2789 } 2790 2791 return Result; 2792 } 2793 2794 SDValue M68kTargetLowering::LowerGlobalAddress(SDValue Op, 2795 SelectionDAG &DAG) const { 2796 const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal(); 2797 int64_t Offset = cast<GlobalAddressSDNode>(Op)->getOffset(); 2798 return LowerGlobalAddress(GV, SDLoc(Op), Offset, DAG); 2799 } 2800 2801 //===----------------------------------------------------------------------===// 2802 // Custom Lower Jump Table 2803 //===----------------------------------------------------------------------===// 2804 2805 SDValue M68kTargetLowering::LowerJumpTable(SDValue Op, 2806 SelectionDAG &DAG) const { 2807 JumpTableSDNode *JT = cast<JumpTableSDNode>(Op); 2808 2809 // In PIC mode (unless we're in PCRel PIC mode) we add an offset to the 2810 // global base reg. 2811 unsigned char OpFlag = Subtarget.classifyLocalReference(nullptr); 2812 2813 unsigned WrapperKind = M68kISD::Wrapper; 2814 if (M68kII::isPCRelGlobalReference(OpFlag)) { 2815 WrapperKind = M68kISD::WrapperPC; 2816 } 2817 2818 auto PtrVT = getPointerTy(DAG.getDataLayout()); 2819 SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, OpFlag); 2820 SDLoc DL(JT); 2821 Result = DAG.getNode(WrapperKind, DL, PtrVT, Result); 2822 2823 // With PIC, the address is actually $g + Offset. 2824 if (M68kII::isGlobalRelativeToPICBase(OpFlag)) { 2825 Result = DAG.getNode(ISD::ADD, DL, PtrVT, 2826 DAG.getNode(M68kISD::GLOBAL_BASE_REG, SDLoc(), PtrVT), 2827 Result); 2828 } 2829 2830 return Result; 2831 } 2832 2833 unsigned M68kTargetLowering::getJumpTableEncoding() const { 2834 return Subtarget.getJumpTableEncoding(); 2835 } 2836 2837 const MCExpr *M68kTargetLowering::LowerCustomJumpTableEntry( 2838 const MachineJumpTableInfo *MJTI, const MachineBasicBlock *MBB, 2839 unsigned uid, MCContext &Ctx) const { 2840 return MCSymbolRefExpr::create(MBB->getSymbol(), MCSymbolRefExpr::VK_GOTOFF, 2841 Ctx); 2842 } 2843 2844 SDValue M68kTargetLowering::getPICJumpTableRelocBase(SDValue Table, 2845 SelectionDAG &DAG) const { 2846 if (getJumpTableEncoding() == MachineJumpTableInfo::EK_Custom32) 2847 return DAG.getNode(M68kISD::GLOBAL_BASE_REG, SDLoc(), 2848 getPointerTy(DAG.getDataLayout())); 2849 2850 // MachineJumpTableInfo::EK_LabelDifference32 entry 2851 return Table; 2852 } 2853 2854 // NOTE This only used for MachineJumpTableInfo::EK_LabelDifference32 entries 2855 const MCExpr *M68kTargetLowering::getPICJumpTableRelocBaseExpr( 2856 const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const { 2857 return MCSymbolRefExpr::create(MF->getJTISymbol(JTI, Ctx), Ctx); 2858 } 2859 2860 M68kTargetLowering::ConstraintType 2861 M68kTargetLowering::getConstraintType(StringRef Constraint) const { 2862 if (Constraint.size() > 0) { 2863 switch (Constraint[0]) { 2864 case 'a': 2865 case 'd': 2866 return C_RegisterClass; 2867 case 'I': 2868 case 'J': 2869 case 'K': 2870 case 'L': 2871 case 'M': 2872 case 'N': 2873 case 'O': 2874 case 'P': 2875 return C_Immediate; 2876 case 'C': 2877 if (Constraint.size() == 2) 2878 switch (Constraint[1]) { 2879 case '0': 2880 case 'i': 2881 case 'j': 2882 return C_Immediate; 2883 default: 2884 break; 2885 } 2886 break; 2887 case 'Q': 2888 case 'U': 2889 return C_Memory; 2890 default: 2891 break; 2892 } 2893 } 2894 2895 return TargetLowering::getConstraintType(Constraint); 2896 } 2897 2898 void M68kTargetLowering::LowerAsmOperandForConstraint(SDValue Op, 2899 std::string &Constraint, 2900 std::vector<SDValue> &Ops, 2901 SelectionDAG &DAG) const { 2902 SDValue Result; 2903 2904 if (Constraint.size() == 1) { 2905 // Constant constraints 2906 switch (Constraint[0]) { 2907 case 'I': 2908 case 'J': 2909 case 'K': 2910 case 'L': 2911 case 'M': 2912 case 'N': 2913 case 'O': 2914 case 'P': { 2915 auto *C = dyn_cast<ConstantSDNode>(Op); 2916 if (!C) 2917 return; 2918 2919 int64_t Val = C->getSExtValue(); 2920 switch (Constraint[0]) { 2921 case 'I': // constant integer in the range [1,8] 2922 if (Val > 0 && Val <= 8) 2923 break; 2924 return; 2925 case 'J': // constant signed 16-bit integer 2926 if (isInt<16>(Val)) 2927 break; 2928 return; 2929 case 'K': // constant that is NOT in the range of [-0x80, 0x80) 2930 if (Val < -0x80 || Val >= 0x80) 2931 break; 2932 return; 2933 case 'L': // constant integer in the range [-8,-1] 2934 if (Val < 0 && Val >= -8) 2935 break; 2936 return; 2937 case 'M': // constant that is NOT in the range of [-0x100, 0x100] 2938 if (Val < -0x100 || Val >= 0x100) 2939 break; 2940 return; 2941 case 'N': // constant integer in the range [24,31] 2942 if (Val >= 24 && Val <= 31) 2943 break; 2944 return; 2945 case 'O': // constant integer 16 2946 if (Val == 16) 2947 break; 2948 return; 2949 case 'P': // constant integer in the range [8,15] 2950 if (Val >= 8 && Val <= 15) 2951 break; 2952 return; 2953 default: 2954 llvm_unreachable("Unhandled constant constraint"); 2955 } 2956 2957 Result = DAG.getTargetConstant(Val, SDLoc(Op), Op.getValueType()); 2958 break; 2959 } 2960 default: 2961 break; 2962 } 2963 } 2964 2965 if (Constraint.size() == 2) { 2966 switch (Constraint[0]) { 2967 case 'C': 2968 // Constant constraints start with 'C' 2969 switch (Constraint[1]) { 2970 case '0': 2971 case 'i': 2972 case 'j': { 2973 auto *C = dyn_cast<ConstantSDNode>(Op); 2974 if (!C) 2975 break; 2976 2977 int64_t Val = C->getSExtValue(); 2978 switch (Constraint[1]) { 2979 case '0': // constant integer 0 2980 if (!Val) 2981 break; 2982 return; 2983 case 'i': // constant integer 2984 break; 2985 case 'j': // integer constant that doesn't fit in 16 bits 2986 if (!isInt<16>(C->getSExtValue())) 2987 break; 2988 return; 2989 default: 2990 llvm_unreachable("Unhandled constant constraint"); 2991 } 2992 2993 Result = DAG.getTargetConstant(Val, SDLoc(Op), Op.getValueType()); 2994 break; 2995 } 2996 default: 2997 break; 2998 } 2999 break; 3000 default: 3001 break; 3002 } 3003 } 3004 3005 if (Result.getNode()) { 3006 Ops.push_back(Result); 3007 return; 3008 } 3009 3010 TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG); 3011 } 3012 3013 std::pair<unsigned, const TargetRegisterClass *> 3014 M68kTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, 3015 StringRef Constraint, 3016 MVT VT) const { 3017 if (Constraint.size() == 1) { 3018 switch (Constraint[0]) { 3019 case 'r': 3020 case 'd': 3021 switch (VT.SimpleTy) { 3022 case MVT::i8: 3023 return std::make_pair(0U, &M68k::DR8RegClass); 3024 case MVT::i16: 3025 return std::make_pair(0U, &M68k::DR16RegClass); 3026 case MVT::i32: 3027 return std::make_pair(0U, &M68k::DR32RegClass); 3028 default: 3029 break; 3030 } 3031 break; 3032 case 'a': 3033 switch (VT.SimpleTy) { 3034 case MVT::i16: 3035 return std::make_pair(0U, &M68k::AR16RegClass); 3036 case MVT::i32: 3037 return std::make_pair(0U, &M68k::AR32RegClass); 3038 default: 3039 break; 3040 } 3041 break; 3042 default: 3043 break; 3044 } 3045 } 3046 3047 return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT); 3048 } 3049 3050 /// Determines whether the callee is required to pop its own arguments. 3051 /// Callee pop is necessary to support tail calls. 3052 bool M68k::isCalleePop(CallingConv::ID CallingConv, bool IsVarArg, 3053 bool GuaranteeTCO) { 3054 return false; 3055 } 3056 3057 // Return true if it is OK for this CMOV pseudo-opcode to be cascaded 3058 // together with other CMOV pseudo-opcodes into a single basic-block with 3059 // conditional jump around it. 3060 static bool isCMOVPseudo(MachineInstr &MI) { 3061 switch (MI.getOpcode()) { 3062 case M68k::CMOV8d: 3063 case M68k::CMOV16d: 3064 case M68k::CMOV32r: 3065 return true; 3066 3067 default: 3068 return false; 3069 } 3070 } 3071 3072 // The CCR operand of SelectItr might be missing a kill marker 3073 // because there were multiple uses of CCR, and ISel didn't know 3074 // which to mark. Figure out whether SelectItr should have had a 3075 // kill marker, and set it if it should. Returns the correct kill 3076 // marker value. 3077 static bool checkAndUpdateCCRKill(MachineBasicBlock::iterator SelectItr, 3078 MachineBasicBlock *BB, 3079 const TargetRegisterInfo *TRI) { 3080 // Scan forward through BB for a use/def of CCR. 3081 MachineBasicBlock::iterator miI(std::next(SelectItr)); 3082 for (MachineBasicBlock::iterator miE = BB->end(); miI != miE; ++miI) { 3083 const MachineInstr &mi = *miI; 3084 if (mi.readsRegister(M68k::CCR)) 3085 return false; 3086 if (mi.definesRegister(M68k::CCR)) 3087 break; // Should have kill-flag - update below. 3088 } 3089 3090 // If we hit the end of the block, check whether CCR is live into a 3091 // successor. 3092 if (miI == BB->end()) 3093 for (const auto *SBB : BB->successors()) 3094 if (SBB->isLiveIn(M68k::CCR)) 3095 return false; 3096 3097 // We found a def, or hit the end of the basic block and CCR wasn't live 3098 // out. SelectMI should have a kill flag on CCR. 3099 SelectItr->addRegisterKilled(M68k::CCR, TRI); 3100 return true; 3101 } 3102 3103 MachineBasicBlock * 3104 M68kTargetLowering::EmitLoweredSelect(MachineInstr &MI, 3105 MachineBasicBlock *MBB) const { 3106 const TargetInstrInfo *TII = Subtarget.getInstrInfo(); 3107 DebugLoc DL = MI.getDebugLoc(); 3108 3109 // To "insert" a SELECT_CC instruction, we actually have to insert the 3110 // diamond control-flow pattern. The incoming instruction knows the 3111 // destination vreg to set, the condition code register to branch on, the 3112 // true/false values to select between, and a branch opcode to use. 3113 const BasicBlock *BB = MBB->getBasicBlock(); 3114 MachineFunction::iterator It = ++MBB->getIterator(); 3115 3116 // ThisMBB: 3117 // ... 3118 // TrueVal = ... 3119 // cmp ccX, r1, r2 3120 // bcc Copy1MBB 3121 // fallthrough --> Copy0MBB 3122 MachineBasicBlock *ThisMBB = MBB; 3123 MachineFunction *F = MBB->getParent(); 3124 3125 // This code lowers all pseudo-CMOV instructions. Generally it lowers these 3126 // as described above, by inserting a MBB, and then making a PHI at the join 3127 // point to select the true and false operands of the CMOV in the PHI. 3128 // 3129 // The code also handles two different cases of multiple CMOV opcodes 3130 // in a row. 3131 // 3132 // Case 1: 3133 // In this case, there are multiple CMOVs in a row, all which are based on 3134 // the same condition setting (or the exact opposite condition setting). 3135 // In this case we can lower all the CMOVs using a single inserted MBB, and 3136 // then make a number of PHIs at the join point to model the CMOVs. The only 3137 // trickiness here, is that in a case like: 3138 // 3139 // t2 = CMOV cond1 t1, f1 3140 // t3 = CMOV cond1 t2, f2 3141 // 3142 // when rewriting this into PHIs, we have to perform some renaming on the 3143 // temps since you cannot have a PHI operand refer to a PHI result earlier 3144 // in the same block. The "simple" but wrong lowering would be: 3145 // 3146 // t2 = PHI t1(BB1), f1(BB2) 3147 // t3 = PHI t2(BB1), f2(BB2) 3148 // 3149 // but clearly t2 is not defined in BB1, so that is incorrect. The proper 3150 // renaming is to note that on the path through BB1, t2 is really just a 3151 // copy of t1, and do that renaming, properly generating: 3152 // 3153 // t2 = PHI t1(BB1), f1(BB2) 3154 // t3 = PHI t1(BB1), f2(BB2) 3155 // 3156 // Case 2, we lower cascaded CMOVs such as 3157 // 3158 // (CMOV (CMOV F, T, cc1), T, cc2) 3159 // 3160 // to two successives branches. 3161 MachineInstr *CascadedCMOV = nullptr; 3162 MachineInstr *LastCMOV = &MI; 3163 M68k::CondCode CC = M68k::CondCode(MI.getOperand(3).getImm()); 3164 M68k::CondCode OppCC = M68k::GetOppositeBranchCondition(CC); 3165 MachineBasicBlock::iterator NextMIIt = 3166 std::next(MachineBasicBlock::iterator(MI)); 3167 3168 // Check for case 1, where there are multiple CMOVs with the same condition 3169 // first. Of the two cases of multiple CMOV lowerings, case 1 reduces the 3170 // number of jumps the most. 3171 3172 if (isCMOVPseudo(MI)) { 3173 // See if we have a string of CMOVS with the same condition. 3174 while (NextMIIt != MBB->end() && isCMOVPseudo(*NextMIIt) && 3175 (NextMIIt->getOperand(3).getImm() == CC || 3176 NextMIIt->getOperand(3).getImm() == OppCC)) { 3177 LastCMOV = &*NextMIIt; 3178 ++NextMIIt; 3179 } 3180 } 3181 3182 // This checks for case 2, but only do this if we didn't already find 3183 // case 1, as indicated by LastCMOV == MI. 3184 if (LastCMOV == &MI && NextMIIt != MBB->end() && 3185 NextMIIt->getOpcode() == MI.getOpcode() && 3186 NextMIIt->getOperand(2).getReg() == MI.getOperand(2).getReg() && 3187 NextMIIt->getOperand(1).getReg() == MI.getOperand(0).getReg() && 3188 NextMIIt->getOperand(1).isKill()) { 3189 CascadedCMOV = &*NextMIIt; 3190 } 3191 3192 MachineBasicBlock *Jcc1MBB = nullptr; 3193 3194 // If we have a cascaded CMOV, we lower it to two successive branches to 3195 // the same block. CCR is used by both, so mark it as live in the second. 3196 if (CascadedCMOV) { 3197 Jcc1MBB = F->CreateMachineBasicBlock(BB); 3198 F->insert(It, Jcc1MBB); 3199 Jcc1MBB->addLiveIn(M68k::CCR); 3200 } 3201 3202 MachineBasicBlock *Copy0MBB = F->CreateMachineBasicBlock(BB); 3203 MachineBasicBlock *SinkMBB = F->CreateMachineBasicBlock(BB); 3204 F->insert(It, Copy0MBB); 3205 F->insert(It, SinkMBB); 3206 3207 // If the CCR register isn't dead in the terminator, then claim that it's 3208 // live into the sink and copy blocks. 3209 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo(); 3210 3211 MachineInstr *LastCCRSUser = CascadedCMOV ? CascadedCMOV : LastCMOV; 3212 if (!LastCCRSUser->killsRegister(M68k::CCR) && 3213 !checkAndUpdateCCRKill(LastCCRSUser, MBB, TRI)) { 3214 Copy0MBB->addLiveIn(M68k::CCR); 3215 SinkMBB->addLiveIn(M68k::CCR); 3216 } 3217 3218 // Transfer the remainder of MBB and its successor edges to SinkMBB. 3219 SinkMBB->splice(SinkMBB->begin(), MBB, 3220 std::next(MachineBasicBlock::iterator(LastCMOV)), MBB->end()); 3221 SinkMBB->transferSuccessorsAndUpdatePHIs(MBB); 3222 3223 // Add the true and fallthrough blocks as its successors. 3224 if (CascadedCMOV) { 3225 // The fallthrough block may be Jcc1MBB, if we have a cascaded CMOV. 3226 MBB->addSuccessor(Jcc1MBB); 3227 3228 // In that case, Jcc1MBB will itself fallthrough the Copy0MBB, and 3229 // jump to the SinkMBB. 3230 Jcc1MBB->addSuccessor(Copy0MBB); 3231 Jcc1MBB->addSuccessor(SinkMBB); 3232 } else { 3233 MBB->addSuccessor(Copy0MBB); 3234 } 3235 3236 // The true block target of the first (or only) branch is always SinkMBB. 3237 MBB->addSuccessor(SinkMBB); 3238 3239 // Create the conditional branch instruction. 3240 unsigned Opc = M68k::GetCondBranchFromCond(CC); 3241 BuildMI(MBB, DL, TII->get(Opc)).addMBB(SinkMBB); 3242 3243 if (CascadedCMOV) { 3244 unsigned Opc2 = M68k::GetCondBranchFromCond( 3245 (M68k::CondCode)CascadedCMOV->getOperand(3).getImm()); 3246 BuildMI(Jcc1MBB, DL, TII->get(Opc2)).addMBB(SinkMBB); 3247 } 3248 3249 // Copy0MBB: 3250 // %FalseValue = ... 3251 // # fallthrough to SinkMBB 3252 Copy0MBB->addSuccessor(SinkMBB); 3253 3254 // SinkMBB: 3255 // %Result = phi [ %FalseValue, Copy0MBB ], [ %TrueValue, ThisMBB ] 3256 // ... 3257 MachineBasicBlock::iterator MIItBegin = MachineBasicBlock::iterator(MI); 3258 MachineBasicBlock::iterator MIItEnd = 3259 std::next(MachineBasicBlock::iterator(LastCMOV)); 3260 MachineBasicBlock::iterator SinkInsertionPoint = SinkMBB->begin(); 3261 DenseMap<unsigned, std::pair<unsigned, unsigned>> RegRewriteTable; 3262 MachineInstrBuilder MIB; 3263 3264 // As we are creating the PHIs, we have to be careful if there is more than 3265 // one. Later CMOVs may reference the results of earlier CMOVs, but later 3266 // PHIs have to reference the individual true/false inputs from earlier PHIs. 3267 // That also means that PHI construction must work forward from earlier to 3268 // later, and that the code must maintain a mapping from earlier PHI's 3269 // destination registers, and the registers that went into the PHI. 3270 3271 for (MachineBasicBlock::iterator MIIt = MIItBegin; MIIt != MIItEnd; ++MIIt) { 3272 Register DestReg = MIIt->getOperand(0).getReg(); 3273 Register Op1Reg = MIIt->getOperand(1).getReg(); 3274 Register Op2Reg = MIIt->getOperand(2).getReg(); 3275 3276 // If this CMOV we are generating is the opposite condition from 3277 // the jump we generated, then we have to swap the operands for the 3278 // PHI that is going to be generated. 3279 if (MIIt->getOperand(3).getImm() == OppCC) 3280 std::swap(Op1Reg, Op2Reg); 3281 3282 if (RegRewriteTable.find(Op1Reg) != RegRewriteTable.end()) 3283 Op1Reg = RegRewriteTable[Op1Reg].first; 3284 3285 if (RegRewriteTable.find(Op2Reg) != RegRewriteTable.end()) 3286 Op2Reg = RegRewriteTable[Op2Reg].second; 3287 3288 MIB = 3289 BuildMI(*SinkMBB, SinkInsertionPoint, DL, TII->get(M68k::PHI), DestReg) 3290 .addReg(Op1Reg) 3291 .addMBB(Copy0MBB) 3292 .addReg(Op2Reg) 3293 .addMBB(ThisMBB); 3294 3295 // Add this PHI to the rewrite table. 3296 RegRewriteTable[DestReg] = std::make_pair(Op1Reg, Op2Reg); 3297 } 3298 3299 // If we have a cascaded CMOV, the second Jcc provides the same incoming 3300 // value as the first Jcc (the True operand of the SELECT_CC/CMOV nodes). 3301 if (CascadedCMOV) { 3302 MIB.addReg(MI.getOperand(2).getReg()).addMBB(Jcc1MBB); 3303 // Copy the PHI result to the register defined by the second CMOV. 3304 BuildMI(*SinkMBB, std::next(MachineBasicBlock::iterator(MIB.getInstr())), 3305 DL, TII->get(TargetOpcode::COPY), 3306 CascadedCMOV->getOperand(0).getReg()) 3307 .addReg(MI.getOperand(0).getReg()); 3308 CascadedCMOV->eraseFromParent(); 3309 } 3310 3311 // Now remove the CMOV(s). 3312 for (MachineBasicBlock::iterator MIIt = MIItBegin; MIIt != MIItEnd;) 3313 (MIIt++)->eraseFromParent(); 3314 3315 return SinkMBB; 3316 } 3317 3318 MachineBasicBlock * 3319 M68kTargetLowering::EmitLoweredSegAlloca(MachineInstr &MI, 3320 MachineBasicBlock *BB) const { 3321 llvm_unreachable("Cannot lower Segmented Stack Alloca with stack-split on"); 3322 } 3323 3324 MachineBasicBlock * 3325 M68kTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI, 3326 MachineBasicBlock *BB) const { 3327 switch (MI.getOpcode()) { 3328 default: 3329 llvm_unreachable("Unexpected instr type to insert"); 3330 case M68k::CMOV8d: 3331 case M68k::CMOV16d: 3332 case M68k::CMOV32r: 3333 return EmitLoweredSelect(MI, BB); 3334 case M68k::SALLOCA: 3335 return EmitLoweredSegAlloca(MI, BB); 3336 } 3337 } 3338 3339 SDValue M68kTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const { 3340 MachineFunction &MF = DAG.getMachineFunction(); 3341 auto PtrVT = getPointerTy(MF.getDataLayout()); 3342 M68kMachineFunctionInfo *FuncInfo = MF.getInfo<M68kMachineFunctionInfo>(); 3343 3344 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue(); 3345 SDLoc DL(Op); 3346 3347 // vastart just stores the address of the VarArgsFrameIndex slot into the 3348 // memory location argument. 3349 SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT); 3350 return DAG.getStore(Op.getOperand(0), DL, FR, Op.getOperand(1), 3351 MachinePointerInfo(SV)); 3352 } 3353 3354 SDValue M68kTargetLowering::LowerATOMICFENCE(SDValue Op, 3355 SelectionDAG &DAG) const { 3356 // Lower to a memory barrier created from inline asm. 3357 const TargetLowering &TLI = DAG.getTargetLoweringInfo(); 3358 LLVMContext &Ctx = *DAG.getContext(); 3359 3360 const unsigned Flags = InlineAsm::Extra_MayLoad | InlineAsm::Extra_MayStore | 3361 InlineAsm::Extra_HasSideEffects; 3362 const SDValue AsmOperands[4] = { 3363 Op.getOperand(0), // Input chain 3364 DAG.getTargetExternalSymbol( 3365 "", TLI.getProgramPointerTy( 3366 DAG.getDataLayout())), // Empty inline asm string 3367 DAG.getMDNode(MDNode::get(Ctx, {})), // (empty) srcloc 3368 DAG.getTargetConstant(Flags, SDLoc(Op), 3369 TLI.getPointerTy(DAG.getDataLayout())), // Flags 3370 }; 3371 3372 return DAG.getNode(ISD::INLINEASM, SDLoc(Op), 3373 DAG.getVTList(MVT::Other, MVT::Glue), AsmOperands); 3374 } 3375 3376 // Lower dynamic stack allocation to _alloca call for Cygwin/Mingw targets. 3377 // Calls to _alloca are needed to probe the stack when allocating more than 4k 3378 // bytes in one go. Touching the stack at 4K increments is necessary to ensure 3379 // that the guard pages used by the OS virtual memory manager are allocated in 3380 // correct sequence. 3381 SDValue M68kTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op, 3382 SelectionDAG &DAG) const { 3383 MachineFunction &MF = DAG.getMachineFunction(); 3384 bool SplitStack = MF.shouldSplitStack(); 3385 3386 SDLoc DL(Op); 3387 3388 // Get the inputs. 3389 SDNode *Node = Op.getNode(); 3390 SDValue Chain = Op.getOperand(0); 3391 SDValue Size = Op.getOperand(1); 3392 unsigned Align = cast<ConstantSDNode>(Op.getOperand(2))->getZExtValue(); 3393 EVT VT = Node->getValueType(0); 3394 3395 // Chain the dynamic stack allocation so that it doesn't modify the stack 3396 // pointer when other instructions are using the stack. 3397 Chain = DAG.getCALLSEQ_START(Chain, 0, 0, DL); 3398 3399 SDValue Result; 3400 if (SplitStack) { 3401 auto &MRI = MF.getRegInfo(); 3402 auto SPTy = getPointerTy(DAG.getDataLayout()); 3403 auto *ARClass = getRegClassFor(SPTy); 3404 Register Vreg = MRI.createVirtualRegister(ARClass); 3405 Chain = DAG.getCopyToReg(Chain, DL, Vreg, Size); 3406 Result = DAG.getNode(M68kISD::SEG_ALLOCA, DL, SPTy, Chain, 3407 DAG.getRegister(Vreg, SPTy)); 3408 } else { 3409 auto &TLI = DAG.getTargetLoweringInfo(); 3410 Register SPReg = TLI.getStackPointerRegisterToSaveRestore(); 3411 assert(SPReg && "Target cannot require DYNAMIC_STACKALLOC expansion and" 3412 " not tell us which reg is the stack pointer!"); 3413 3414 SDValue SP = DAG.getCopyFromReg(Chain, DL, SPReg, VT); 3415 Chain = SP.getValue(1); 3416 const TargetFrameLowering &TFI = *Subtarget.getFrameLowering(); 3417 unsigned StackAlign = TFI.getStackAlignment(); 3418 Result = DAG.getNode(ISD::SUB, DL, VT, SP, Size); // Value 3419 if (Align > StackAlign) 3420 Result = DAG.getNode(ISD::AND, DL, VT, Result, 3421 DAG.getConstant(-(uint64_t)Align, DL, VT)); 3422 Chain = DAG.getCopyToReg(Chain, DL, SPReg, Result); // Output chain 3423 } 3424 3425 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, SDValue(), DL); 3426 3427 SDValue Ops[2] = {Result, Chain}; 3428 return DAG.getMergeValues(Ops, DL); 3429 } 3430 3431 SDValue M68kTargetLowering::LowerShiftLeftParts(SDValue Op, 3432 SelectionDAG &DAG) const { 3433 SDLoc DL(Op); 3434 SDValue Lo = Op.getOperand(0); 3435 SDValue Hi = Op.getOperand(1); 3436 SDValue Shamt = Op.getOperand(2); 3437 EVT VT = Lo.getValueType(); 3438 3439 // if Shamt - register size < 0: // Shamt < register size 3440 // Lo = Lo << Shamt 3441 // Hi = (Hi << Shamt) | ((Lo >>u 1) >>u (register size - 1 ^ Shamt)) 3442 // else: 3443 // Lo = 0 3444 // Hi = Lo << (Shamt - register size) 3445 3446 SDValue Zero = DAG.getConstant(0, DL, VT); 3447 SDValue One = DAG.getConstant(1, DL, VT); 3448 SDValue MinusRegisterSize = DAG.getConstant(-32, DL, VT); 3449 SDValue RegisterSizeMinus1 = DAG.getConstant(32 - 1, DL, VT); 3450 SDValue ShamtMinusRegisterSize = 3451 DAG.getNode(ISD::ADD, DL, VT, Shamt, MinusRegisterSize); 3452 SDValue RegisterSizeMinus1Shamt = 3453 DAG.getNode(ISD::XOR, DL, VT, RegisterSizeMinus1, Shamt); 3454 3455 SDValue LoTrue = DAG.getNode(ISD::SHL, DL, VT, Lo, Shamt); 3456 SDValue ShiftRight1Lo = DAG.getNode(ISD::SRL, DL, VT, Lo, One); 3457 SDValue ShiftRightLo = 3458 DAG.getNode(ISD::SRL, DL, VT, ShiftRight1Lo, RegisterSizeMinus1Shamt); 3459 SDValue ShiftLeftHi = DAG.getNode(ISD::SHL, DL, VT, Hi, Shamt); 3460 SDValue HiTrue = DAG.getNode(ISD::OR, DL, VT, ShiftLeftHi, ShiftRightLo); 3461 SDValue HiFalse = DAG.getNode(ISD::SHL, DL, VT, Lo, ShamtMinusRegisterSize); 3462 3463 SDValue CC = 3464 DAG.getSetCC(DL, MVT::i8, ShamtMinusRegisterSize, Zero, ISD::SETLT); 3465 3466 Lo = DAG.getNode(ISD::SELECT, DL, VT, CC, LoTrue, Zero); 3467 Hi = DAG.getNode(ISD::SELECT, DL, VT, CC, HiTrue, HiFalse); 3468 3469 return DAG.getMergeValues({Lo, Hi}, DL); 3470 } 3471 3472 SDValue M68kTargetLowering::LowerShiftRightParts(SDValue Op, SelectionDAG &DAG, 3473 bool IsSRA) const { 3474 SDLoc DL(Op); 3475 SDValue Lo = Op.getOperand(0); 3476 SDValue Hi = Op.getOperand(1); 3477 SDValue Shamt = Op.getOperand(2); 3478 EVT VT = Lo.getValueType(); 3479 3480 // SRA expansion: 3481 // if Shamt - register size < 0: // Shamt < register size 3482 // Lo = (Lo >>u Shamt) | ((Hi << 1) << (register size - 1 ^ Shamt)) 3483 // Hi = Hi >>s Shamt 3484 // else: 3485 // Lo = Hi >>s (Shamt - register size); 3486 // Hi = Hi >>s (register size - 1) 3487 // 3488 // SRL expansion: 3489 // if Shamt - register size < 0: // Shamt < register size 3490 // Lo = (Lo >>u Shamt) | ((Hi << 1) << (register size - 1 ^ Shamt)) 3491 // Hi = Hi >>u Shamt 3492 // else: 3493 // Lo = Hi >>u (Shamt - register size); 3494 // Hi = 0; 3495 3496 unsigned ShiftRightOp = IsSRA ? ISD::SRA : ISD::SRL; 3497 3498 SDValue Zero = DAG.getConstant(0, DL, VT); 3499 SDValue One = DAG.getConstant(1, DL, VT); 3500 SDValue MinusRegisterSize = DAG.getConstant(-32, DL, VT); 3501 SDValue RegisterSizeMinus1 = DAG.getConstant(32 - 1, DL, VT); 3502 SDValue ShamtMinusRegisterSize = 3503 DAG.getNode(ISD::ADD, DL, VT, Shamt, MinusRegisterSize); 3504 SDValue RegisterSizeMinus1Shamt = 3505 DAG.getNode(ISD::XOR, DL, VT, RegisterSizeMinus1, Shamt); 3506 3507 SDValue ShiftRightLo = DAG.getNode(ISD::SRL, DL, VT, Lo, Shamt); 3508 SDValue ShiftLeftHi1 = DAG.getNode(ISD::SHL, DL, VT, Hi, One); 3509 SDValue ShiftLeftHi = 3510 DAG.getNode(ISD::SHL, DL, VT, ShiftLeftHi1, RegisterSizeMinus1Shamt); 3511 SDValue LoTrue = DAG.getNode(ISD::OR, DL, VT, ShiftRightLo, ShiftLeftHi); 3512 SDValue HiTrue = DAG.getNode(ShiftRightOp, DL, VT, Hi, Shamt); 3513 SDValue LoFalse = 3514 DAG.getNode(ShiftRightOp, DL, VT, Hi, ShamtMinusRegisterSize); 3515 SDValue HiFalse = 3516 IsSRA ? DAG.getNode(ISD::SRA, DL, VT, Hi, RegisterSizeMinus1) : Zero; 3517 3518 SDValue CC = 3519 DAG.getSetCC(DL, MVT::i8, ShamtMinusRegisterSize, Zero, ISD::SETLT); 3520 3521 Lo = DAG.getNode(ISD::SELECT, DL, VT, CC, LoTrue, LoFalse); 3522 Hi = DAG.getNode(ISD::SELECT, DL, VT, CC, HiTrue, HiFalse); 3523 3524 return DAG.getMergeValues({Lo, Hi}, DL); 3525 } 3526 3527 //===----------------------------------------------------------------------===// 3528 // DAG Combine 3529 //===----------------------------------------------------------------------===// 3530 3531 static SDValue getSETCC(M68k::CondCode Cond, SDValue CCR, const SDLoc &dl, 3532 SelectionDAG &DAG) { 3533 return DAG.getNode(M68kISD::SETCC, dl, MVT::i8, 3534 DAG.getConstant(Cond, dl, MVT::i8), CCR); 3535 } 3536 // When legalizing carry, we create carries via add X, -1 3537 // If that comes from an actual carry, via setcc, we use the 3538 // carry directly. 3539 static SDValue combineCarryThroughADD(SDValue CCR) { 3540 if (CCR.getOpcode() == M68kISD::ADD) { 3541 if (isAllOnesConstant(CCR.getOperand(1))) { 3542 SDValue Carry = CCR.getOperand(0); 3543 while (Carry.getOpcode() == ISD::TRUNCATE || 3544 Carry.getOpcode() == ISD::ZERO_EXTEND || 3545 Carry.getOpcode() == ISD::SIGN_EXTEND || 3546 Carry.getOpcode() == ISD::ANY_EXTEND || 3547 (Carry.getOpcode() == ISD::AND && 3548 isOneConstant(Carry.getOperand(1)))) 3549 Carry = Carry.getOperand(0); 3550 if (Carry.getOpcode() == M68kISD::SETCC || 3551 Carry.getOpcode() == M68kISD::SETCC_CARRY) { 3552 if (Carry.getConstantOperandVal(0) == M68k::COND_CS) 3553 return Carry.getOperand(1); 3554 } 3555 } 3556 } 3557 3558 return SDValue(); 3559 } 3560 3561 /// Optimize a CCR definition used according to the condition code \p CC into 3562 /// a simpler CCR value, potentially returning a new \p CC and replacing uses 3563 /// of chain values. 3564 static SDValue combineSetCCCCR(SDValue CCR, M68k::CondCode &CC, 3565 SelectionDAG &DAG, 3566 const M68kSubtarget &Subtarget) { 3567 if (CC == M68k::COND_CS) 3568 if (SDValue Flags = combineCarryThroughADD(CCR)) 3569 return Flags; 3570 3571 return SDValue(); 3572 } 3573 3574 // Optimize RES = M68kISD::SETCC CONDCODE, CCR_INPUT 3575 static SDValue combineM68kSetCC(SDNode *N, SelectionDAG &DAG, 3576 const M68kSubtarget &Subtarget) { 3577 SDLoc DL(N); 3578 M68k::CondCode CC = M68k::CondCode(N->getConstantOperandVal(0)); 3579 SDValue CCR = N->getOperand(1); 3580 3581 // Try to simplify the CCR and condition code operands. 3582 if (SDValue Flags = combineSetCCCCR(CCR, CC, DAG, Subtarget)) 3583 return getSETCC(CC, Flags, DL, DAG); 3584 3585 return SDValue(); 3586 } 3587 static SDValue combineM68kBrCond(SDNode *N, SelectionDAG &DAG, 3588 const M68kSubtarget &Subtarget) { 3589 SDLoc DL(N); 3590 M68k::CondCode CC = M68k::CondCode(N->getConstantOperandVal(2)); 3591 SDValue CCR = N->getOperand(3); 3592 3593 // Try to simplify the CCR and condition code operands. 3594 // Make sure to not keep references to operands, as combineSetCCCCR can 3595 // RAUW them under us. 3596 if (SDValue Flags = combineSetCCCCR(CCR, CC, DAG, Subtarget)) { 3597 SDValue Cond = DAG.getConstant(CC, DL, MVT::i8); 3598 return DAG.getNode(M68kISD::BRCOND, DL, N->getVTList(), N->getOperand(0), 3599 N->getOperand(1), Cond, Flags); 3600 } 3601 3602 return SDValue(); 3603 } 3604 3605 static SDValue combineSUBX(SDNode *N, SelectionDAG &DAG) { 3606 if (SDValue Flags = combineCarryThroughADD(N->getOperand(2))) { 3607 MVT VT = N->getSimpleValueType(0); 3608 SDVTList VTs = DAG.getVTList(VT, MVT::i32); 3609 return DAG.getNode(M68kISD::SUBX, SDLoc(N), VTs, N->getOperand(0), 3610 N->getOperand(1), Flags); 3611 } 3612 3613 return SDValue(); 3614 } 3615 3616 // Optimize RES, CCR = M68kISD::ADDX LHS, RHS, CCR 3617 static SDValue combineADDX(SDNode *N, SelectionDAG &DAG, 3618 TargetLowering::DAGCombinerInfo &DCI) { 3619 if (SDValue Flags = combineCarryThroughADD(N->getOperand(2))) { 3620 MVT VT = N->getSimpleValueType(0); 3621 SDVTList VTs = DAG.getVTList(VT, MVT::i32); 3622 return DAG.getNode(M68kISD::ADDX, SDLoc(N), VTs, N->getOperand(0), 3623 N->getOperand(1), Flags); 3624 } 3625 3626 return SDValue(); 3627 } 3628 3629 SDValue M68kTargetLowering::PerformDAGCombine(SDNode *N, 3630 DAGCombinerInfo &DCI) const { 3631 SelectionDAG &DAG = DCI.DAG; 3632 switch (N->getOpcode()) { 3633 case M68kISD::SUBX: 3634 return combineSUBX(N, DAG); 3635 case M68kISD::ADDX: 3636 return combineADDX(N, DAG, DCI); 3637 case M68kISD::SETCC: 3638 return combineM68kSetCC(N, DAG, Subtarget); 3639 case M68kISD::BRCOND: 3640 return combineM68kBrCond(N, DAG, Subtarget); 3641 } 3642 3643 return SDValue(); 3644 } 3645 3646 //===----------------------------------------------------------------------===// 3647 // M68kISD Node Names 3648 //===----------------------------------------------------------------------===// 3649 const char *M68kTargetLowering::getTargetNodeName(unsigned Opcode) const { 3650 switch (Opcode) { 3651 case M68kISD::CALL: 3652 return "M68kISD::CALL"; 3653 case M68kISD::TAIL_CALL: 3654 return "M68kISD::TAIL_CALL"; 3655 case M68kISD::RET: 3656 return "M68kISD::RET"; 3657 case M68kISD::TC_RETURN: 3658 return "M68kISD::TC_RETURN"; 3659 case M68kISD::ADD: 3660 return "M68kISD::ADD"; 3661 case M68kISD::SUB: 3662 return "M68kISD::SUB"; 3663 case M68kISD::ADDX: 3664 return "M68kISD::ADDX"; 3665 case M68kISD::SUBX: 3666 return "M68kISD::SUBX"; 3667 case M68kISD::SMUL: 3668 return "M68kISD::SMUL"; 3669 case M68kISD::UMUL: 3670 return "M68kISD::UMUL"; 3671 case M68kISD::OR: 3672 return "M68kISD::OR"; 3673 case M68kISD::XOR: 3674 return "M68kISD::XOR"; 3675 case M68kISD::AND: 3676 return "M68kISD::AND"; 3677 case M68kISD::CMP: 3678 return "M68kISD::CMP"; 3679 case M68kISD::BTST: 3680 return "M68kISD::BTST"; 3681 case M68kISD::SELECT: 3682 return "M68kISD::SELECT"; 3683 case M68kISD::CMOV: 3684 return "M68kISD::CMOV"; 3685 case M68kISD::BRCOND: 3686 return "M68kISD::BRCOND"; 3687 case M68kISD::SETCC: 3688 return "M68kISD::SETCC"; 3689 case M68kISD::SETCC_CARRY: 3690 return "M68kISD::SETCC_CARRY"; 3691 case M68kISD::GLOBAL_BASE_REG: 3692 return "M68kISD::GLOBAL_BASE_REG"; 3693 case M68kISD::Wrapper: 3694 return "M68kISD::Wrapper"; 3695 case M68kISD::WrapperPC: 3696 return "M68kISD::WrapperPC"; 3697 case M68kISD::SEG_ALLOCA: 3698 return "M68kISD::SEG_ALLOCA"; 3699 default: 3700 return NULL; 3701 } 3702 } 3703 3704 CCAssignFn *M68kTargetLowering::getCCAssignFn(CallingConv::ID CC, bool Return, 3705 bool IsVarArg) const { 3706 if (Return) 3707 return RetCC_M68k_C; 3708 else 3709 return CC_M68k_C; 3710 } 3711