LLVM 24.0.0git
SparcISelLowering.cpp
Go to the documentation of this file.
1//===-- SparcISelLowering.cpp - Sparc DAG Lowering Implementation ---------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the interfaces that Sparc uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#include "SparcISelLowering.h"
17#include "SparcRegisterInfo.h"
19#include "SparcTargetMachine.h"
35#include "llvm/IR/Function.h"
36#include "llvm/IR/IRBuilder.h"
37#include "llvm/IR/Module.h"
40using namespace llvm;
41
42
43//===----------------------------------------------------------------------===//
44// Calling Convention Implementation
45//===----------------------------------------------------------------------===//
46
47static bool CC_Sparc_Assign_SRet(unsigned &ValNo, MVT &ValVT,
48 MVT &LocVT, CCValAssign::LocInfo &LocInfo,
49 ISD::ArgFlagsTy &ArgFlags, CCState &State)
50{
51 assert (ArgFlags.isSRet());
52
53 // Assign SRet argument.
54 State.addLoc(CCValAssign::getCustomMem(ValNo, ValVT,
55 0,
56 LocVT, LocInfo));
57 return true;
58}
59
60static bool CC_Sparc_Assign_Split_64(unsigned &ValNo, MVT &ValVT,
61 MVT &LocVT, CCValAssign::LocInfo &LocInfo,
62 ISD::ArgFlagsTy &ArgFlags, CCState &State)
63{
64 static const MCPhysReg RegList[] = {
65 SP::I0, SP::I1, SP::I2, SP::I3, SP::I4, SP::I5
66 };
67 // Try to get first reg.
68 if (Register Reg = State.AllocateReg(RegList)) {
69 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
70 } else {
71 // Assign whole thing in stack.
72 State.addLoc(CCValAssign::getCustomMem(
73 ValNo, ValVT, State.AllocateStack(8, Align(4)), LocVT, LocInfo));
74 return true;
75 }
76
77 // Try to get second reg.
78 if (Register Reg = State.AllocateReg(RegList))
79 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
80 else
81 State.addLoc(CCValAssign::getCustomMem(
82 ValNo, ValVT, State.AllocateStack(4, Align(4)), LocVT, LocInfo));
83 return true;
84}
85
86static bool CC_Sparc_Assign_Ret_Split_64(unsigned &ValNo, MVT &ValVT,
87 MVT &LocVT, CCValAssign::LocInfo &LocInfo,
88 ISD::ArgFlagsTy &ArgFlags, CCState &State)
89{
90 static const MCPhysReg RegList[] = {
91 SP::I0, SP::I1, SP::I2, SP::I3, SP::I4, SP::I5
92 };
93
94 // Try to get first reg.
95 if (Register Reg = State.AllocateReg(RegList))
96 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
97 else
98 return false;
99
100 // Try to get second reg.
101 if (Register Reg = State.AllocateReg(RegList))
102 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
103 else
104 return false;
105
106 return true;
107}
108
109// Allocate a full-sized argument for the 64-bit ABI.
110static bool Analyze_CC_Sparc64_Full(bool IsReturn, unsigned &ValNo, MVT &ValVT,
111 MVT &LocVT, CCValAssign::LocInfo &LocInfo,
112 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
113 assert((LocVT == MVT::f32 || LocVT == MVT::f128
114 || LocVT.getSizeInBits() == 64) &&
115 "Can't handle non-64 bits locations");
116
117 // Stack space is allocated for all arguments starting from [%fp+BIAS+128].
118 unsigned size = (LocVT == MVT::f128) ? 16 : 8;
119 Align alignment =
120 (LocVT == MVT::f128 || ArgFlags.isSplit()) ? Align(16) : Align(8);
121 unsigned Offset = State.AllocateStack(size, alignment);
122 unsigned Reg = 0;
123
124 if (LocVT == MVT::i64 && Offset < 6*8)
125 // Promote integers to %i0-%i5.
126 Reg = SP::I0 + Offset/8;
127 else if (LocVT == MVT::f64 && Offset < 16*8)
128 // Promote doubles to %d0-%d30. (Which LLVM calls D0-D15).
129 Reg = SP::D0 + Offset/8;
130 else if (LocVT == MVT::f32 && Offset < 16*8)
131 // Promote floats to %f1, %f3, ...
132 Reg = SP::F1 + Offset/4;
133 else if (LocVT == MVT::f128 && Offset < 16*8)
134 // Promote long doubles to %q0-%q28. (Which LLVM calls Q0-Q7).
135 Reg = SP::Q0 + Offset/16;
136
137 // Promote to register when possible, otherwise use the stack slot.
138 if (Reg) {
139 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
140 return true;
141 }
142
143 // Bail out if this is a return CC and we run out of registers to place
144 // values into.
145 if (IsReturn)
146 return false;
147
148 // This argument goes on the stack in an 8-byte slot.
149 // When passing floats, LocVT is smaller than 8 bytes. Adjust the offset to
150 // the right-aligned float. The first 4 bytes of the stack slot are undefined.
151 if (LocVT == MVT::f32)
152 Offset += 4;
153
154 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo));
155 return true;
156}
157
158// Allocate a half-sized argument for the 64-bit ABI.
159//
160// This is used when passing { float, int } structs by value in registers.
161static bool Analyze_CC_Sparc64_Half(bool IsReturn, unsigned &ValNo, MVT &ValVT,
162 MVT &LocVT, CCValAssign::LocInfo &LocInfo,
163 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
164 assert(LocVT.getSizeInBits() == 32 && "Can't handle non-32 bits locations");
165 unsigned Offset = State.AllocateStack(4, Align(4));
166
167 if (LocVT == MVT::f32 && Offset < 16*8) {
168 // Promote floats to %f0-%f31.
169 State.addLoc(CCValAssign::getReg(ValNo, ValVT, SP::F0 + Offset/4,
170 LocVT, LocInfo));
171 return true;
172 }
173
174 if (LocVT == MVT::i32 && Offset < 6*8) {
175 // Promote integers to %i0-%i5, using half the register.
176 unsigned Reg = SP::I0 + Offset/8;
177 LocVT = MVT::i64;
178 LocInfo = CCValAssign::AExt;
179
180 // Set the Custom bit if this i32 goes in the high bits of a register.
181 if (Offset % 8 == 0)
182 State.addLoc(CCValAssign::getCustomReg(ValNo, ValVT, Reg,
183 LocVT, LocInfo));
184 else
185 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
186 return true;
187 }
188
189 // Bail out if this is a return CC and we run out of registers to place
190 // values into.
191 if (IsReturn)
192 return false;
193
194 State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo));
195 return true;
196}
197
198static bool CC_Sparc64_Full(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
199 CCValAssign::LocInfo &LocInfo,
200 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
201 return Analyze_CC_Sparc64_Full(false, ValNo, ValVT, LocVT, LocInfo, ArgFlags,
202 State);
203}
204
205static bool CC_Sparc64_Half(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
206 CCValAssign::LocInfo &LocInfo,
207 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
208 return Analyze_CC_Sparc64_Half(false, ValNo, ValVT, LocVT, LocInfo, ArgFlags,
209 State);
210}
211
212static bool RetCC_Sparc64_Full(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
213 CCValAssign::LocInfo &LocInfo,
214 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
215 return Analyze_CC_Sparc64_Full(true, ValNo, ValVT, LocVT, LocInfo, ArgFlags,
216 State);
217}
218
219static bool RetCC_Sparc64_Half(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
220 CCValAssign::LocInfo &LocInfo,
221 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
222 return Analyze_CC_Sparc64_Half(true, ValNo, ValVT, LocVT, LocInfo, ArgFlags,
223 State);
224}
225
226#define GET_CALLING_CONV_IMPL
227#include "SparcGenCallingConv.inc"
228
229// The calling conventions in SparcCallingConv.td are described in terms of the
230// callee's register window. This function translates registers to the
231// corresponding caller window %o register.
232static unsigned toCallerWindow(unsigned Reg) {
233 static_assert(SP::I0 + 7 == SP::I7 && SP::O0 + 7 == SP::O7,
234 "Unexpected enum");
235 if (Reg >= SP::I0 && Reg <= SP::I7)
236 return Reg - SP::I0 + SP::O0;
237 return Reg;
238}
239
241 CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg,
242 const SmallVectorImpl<ISD::OutputArg> &Outs, LLVMContext &Context,
243 const Type *RetTy) const {
245 CCState CCInfo(CallConv, isVarArg, MF, RVLocs, Context);
246 return CCInfo.CheckReturn(Outs, Subtarget->is64Bit() ? RetCC_Sparc64
247 : RetCC_Sparc32);
248}
249
252 bool IsVarArg,
254 const SmallVectorImpl<SDValue> &OutVals,
255 const SDLoc &DL, SelectionDAG &DAG) const {
256 if (Subtarget->is64Bit())
257 return LowerReturn_64(Chain, CallConv, IsVarArg, Outs, OutVals, DL, DAG);
258 return LowerReturn_32(Chain, CallConv, IsVarArg, Outs, OutVals, DL, DAG);
259}
260
263 bool IsVarArg,
265 const SmallVectorImpl<SDValue> &OutVals,
266 const SDLoc &DL, SelectionDAG &DAG) const {
268
269 // CCValAssign - represent the assignment of the return value to locations.
271
272 // CCState - Info about the registers and stack slot.
273 CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), RVLocs,
274 *DAG.getContext());
275
276 // Analyze return values.
277 CCInfo.AnalyzeReturn(Outs, RetCC_Sparc32);
278
279 SDValue Glue;
280 SmallVector<SDValue, 4> RetOps(1, Chain);
281 // Make room for the return address offset.
282 RetOps.push_back(SDValue());
283
284 // Copy the result values into the output registers.
285 for (unsigned i = 0, realRVLocIdx = 0;
286 i != RVLocs.size();
287 ++i, ++realRVLocIdx) {
288 CCValAssign &VA = RVLocs[i];
289 assert(VA.isRegLoc() && "Can only return in registers!");
290
291 SDValue Arg = OutVals[realRVLocIdx];
292
293 if (VA.needsCustom()) {
294 assert(VA.getLocVT() == MVT::v2i32);
295 // Legalize ret v2i32 -> ret 2 x i32 (Basically: do what would
296 // happen by default if this wasn't a legal type)
297
298 SDValue Part0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32,
299 Arg,
301 SDValue Part1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i32,
302 Arg,
304
305 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), Part0, Glue);
306 Glue = Chain.getValue(1);
307 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
308 VA = RVLocs[++i]; // skip ahead to next loc
309 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), Part1,
310 Glue);
311 } else
312 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), Arg, Glue);
313
314 // Guarantee that all emitted copies are stuck together with flags.
315 Glue = Chain.getValue(1);
316 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
317 }
318
319 unsigned RetAddrOffset = 8; // Call Inst + Delay Slot
320 // If the function returns a struct, copy the SRetReturnReg to I0
321 if (MF.getFunction().hasStructRetAttr()) {
323 Register Reg = SFI->getSRetReturnReg();
324 if (!Reg)
325 llvm_unreachable("sret virtual register not created in the entry block");
326 auto PtrVT = getPointerTy(DAG.getDataLayout());
327 SDValue Val = DAG.getCopyFromReg(Chain, DL, Reg, PtrVT);
328 Chain = DAG.getCopyToReg(Chain, DL, SP::I0, Val, Glue);
329 Glue = Chain.getValue(1);
330 RetOps.push_back(DAG.getRegister(SP::I0, PtrVT));
331
332 // A zero-sized return value, e.g. an empty struct or union, is returned
333 // without an unimp instruction after the call, so there is nothing for the
334 // return to skip over.
335 Type *RetType = MF.getFunction().getParamStructRetType(0);
336 if (!RetType->isEmptyTy())
337 RetAddrOffset = 12; // CallInst + Delay Slot + Unimp
338 }
339
340 RetOps[0] = Chain; // Update chain.
341 RetOps[1] = DAG.getConstant(RetAddrOffset, DL, MVT::i32);
342
343 // Add the glue if we have it.
344 if (Glue.getNode())
345 RetOps.push_back(Glue);
346
347 return DAG.getNode(SPISD::RET_GLUE, DL, MVT::Other, RetOps);
348}
349
350// Lower return values for the 64-bit ABI.
351// Return values are passed the exactly the same way as function arguments.
354 bool IsVarArg,
356 const SmallVectorImpl<SDValue> &OutVals,
357 const SDLoc &DL, SelectionDAG &DAG) const {
358 // CCValAssign - represent the assignment of the return value to locations.
360
361 // CCState - Info about the registers and stack slot.
362 CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), RVLocs,
363 *DAG.getContext());
364
365 // Analyze return values.
366 CCInfo.AnalyzeReturn(Outs, RetCC_Sparc64);
367
368 SDValue Glue;
369 SmallVector<SDValue, 4> RetOps(1, Chain);
370
371 // The second operand on the return instruction is the return address offset.
372 // The return address is always %i7+8 with the 64-bit ABI.
373 RetOps.push_back(DAG.getConstant(8, DL, MVT::i32));
374
375 // Copy the result values into the output registers.
376 for (unsigned i = 0; i != RVLocs.size(); ++i) {
377 CCValAssign &VA = RVLocs[i];
378 assert(VA.isRegLoc() && "Can only return in registers!");
379 SDValue OutVal = OutVals[i];
380
381 // Integer return values must be sign or zero extended by the callee.
382 switch (VA.getLocInfo()) {
383 case CCValAssign::Full: break;
385 OutVal = DAG.getNode(ISD::SIGN_EXTEND, DL, VA.getLocVT(), OutVal);
386 break;
388 OutVal = DAG.getNode(ISD::ZERO_EXTEND, DL, VA.getLocVT(), OutVal);
389 break;
391 OutVal = DAG.getNode(ISD::ANY_EXTEND, DL, VA.getLocVT(), OutVal);
392 break;
393 default:
394 llvm_unreachable("Unknown loc info!");
395 }
396
397 // The custom bit on an i32 return value indicates that it should be passed
398 // in the high bits of the register.
399 if (VA.getValVT() == MVT::i32 && VA.needsCustom()) {
400 OutVal = DAG.getNode(ISD::SHL, DL, MVT::i64, OutVal,
401 DAG.getConstant(32, DL, MVT::i32));
402
403 // The next value may go in the low bits of the same register.
404 // Handle both at once.
405 if (i+1 < RVLocs.size() && RVLocs[i+1].getLocReg() == VA.getLocReg()) {
406 SDValue NV = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, OutVals[i+1]);
407 OutVal = DAG.getNode(ISD::OR, DL, MVT::i64, OutVal, NV);
408 // Skip the next value, it's already done.
409 ++i;
410 }
411 }
412
413 Chain = DAG.getCopyToReg(Chain, DL, VA.getLocReg(), OutVal, Glue);
414
415 // Guarantee that all emitted copies are stuck together with flags.
416 Glue = Chain.getValue(1);
417 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
418 }
419
420 RetOps[0] = Chain; // Update chain.
421
422 // Add the flag if we have it.
423 if (Glue.getNode())
424 RetOps.push_back(Glue);
425
426 return DAG.getNode(SPISD::RET_GLUE, DL, MVT::Other, RetOps);
427}
428
430 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
431 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL,
432 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
433 if (Subtarget->is64Bit())
434 return LowerFormalArguments_64(Chain, CallConv, IsVarArg, Ins,
435 DL, DAG, InVals);
436 return LowerFormalArguments_32(Chain, CallConv, IsVarArg, Ins,
437 DL, DAG, InVals);
438}
439
440/// LowerFormalArguments32 - V8 uses a very simple ABI, where all values are
441/// passed in either one or two GPRs, including FP values. TODO: we should
442/// pass FP values in FP registers for fastcc functions.
444 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
445 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
446 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
448 MachineRegisterInfo &RegInfo = MF.getRegInfo();
450 EVT PtrVT = getPointerTy(DAG.getDataLayout());
451
452 // Assign locations to all of the incoming arguments.
454 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), ArgLocs,
455 *DAG.getContext());
456 CCInfo.AnalyzeFormalArguments(Ins, CC_Sparc32);
457
458 const unsigned StackOffset = 92;
459 bool IsLittleEndian = DAG.getDataLayout().isLittleEndian();
460
461 unsigned InIdx = 0;
462 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i, ++InIdx) {
463 CCValAssign &VA = ArgLocs[i];
464 EVT LocVT = VA.getLocVT();
465
466 if (Ins[InIdx].Flags.isSRet()) {
467 if (InIdx != 0)
468 report_fatal_error("sparc only supports sret on the first parameter");
469 // Get SRet from [%fp+64].
470 int FrameIdx = MF.getFrameInfo().CreateFixedObject(4, 64, true);
471 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
472 SDValue Arg =
473 DAG.getLoad(MVT::i32, dl, Chain, FIPtr, MachinePointerInfo());
474 InVals.push_back(Arg);
475 continue;
476 }
477
478 SDValue Arg;
479 if (VA.isRegLoc()) {
480 if (VA.needsCustom()) {
481 assert(VA.getLocVT() == MVT::f64 || VA.getLocVT() == MVT::v2i32);
482
483 Register VRegHi = RegInfo.createVirtualRegister(&SP::IntRegsRegClass);
484 MF.getRegInfo().addLiveIn(VA.getLocReg(), VRegHi);
485 SDValue HiVal = DAG.getCopyFromReg(Chain, dl, VRegHi, MVT::i32);
486
487 assert(i+1 < e);
488 CCValAssign &NextVA = ArgLocs[++i];
489
490 SDValue LoVal;
491 if (NextVA.isMemLoc()) {
492 int FrameIdx = MF.getFrameInfo().
493 CreateFixedObject(4, StackOffset+NextVA.getLocMemOffset(),true);
494 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
495 LoVal = DAG.getLoad(MVT::i32, dl, Chain, FIPtr, MachinePointerInfo());
496 } else {
497 Register loReg = MF.addLiveIn(NextVA.getLocReg(),
498 &SP::IntRegsRegClass);
499 LoVal = DAG.getCopyFromReg(Chain, dl, loReg, MVT::i32);
500 }
501
502 if (IsLittleEndian)
503 std::swap(LoVal, HiVal);
504
505 SDValue WholeValue =
506 DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, LoVal, HiVal);
507 WholeValue = DAG.getNode(ISD::BITCAST, dl, VA.getLocVT(), WholeValue);
508 InVals.push_back(WholeValue);
509 continue;
510 }
511 Register VReg = RegInfo.createVirtualRegister(&SP::IntRegsRegClass);
512 MF.getRegInfo().addLiveIn(VA.getLocReg(), VReg);
513 Arg = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);
514 if (VA.getLocInfo() != CCValAssign::Indirect) {
515 if (VA.getLocVT() == MVT::f32)
516 Arg = DAG.getNode(ISD::BITCAST, dl, MVT::f32, Arg);
517 else if (VA.getLocVT() != MVT::i32) {
518 Arg = DAG.getNode(ISD::AssertSext, dl, MVT::i32, Arg,
519 DAG.getValueType(VA.getLocVT()));
520 Arg = DAG.getNode(ISD::TRUNCATE, dl, VA.getLocVT(), Arg);
521 }
522 InVals.push_back(Arg);
523 continue;
524 }
525 } else {
526 assert(VA.isMemLoc());
527
528 unsigned Offset = VA.getLocMemOffset() + StackOffset;
529
530 if (VA.needsCustom()) {
531 assert(VA.getValVT() == MVT::f64 || VA.getValVT() == MVT::v2i32);
532 // If it is double-word aligned, just load.
533 if (Offset % 8 == 0) {
534 int FI = MF.getFrameInfo().CreateFixedObject(8, Offset, true);
535 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
536 SDValue Load = DAG.getLoad(VA.getValVT(), dl, Chain, FIPtr,
538 InVals.push_back(Load);
539 continue;
540 }
541
542 int FI = MF.getFrameInfo().CreateFixedObject(4, Offset, true);
543 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
544 SDValue HiVal =
545 DAG.getLoad(MVT::i32, dl, Chain, FIPtr, MachinePointerInfo());
546 int FI2 = MF.getFrameInfo().CreateFixedObject(4, Offset + 4, true);
547 SDValue FIPtr2 = DAG.getFrameIndex(FI2, PtrVT);
548
549 SDValue LoVal =
550 DAG.getLoad(MVT::i32, dl, Chain, FIPtr2, MachinePointerInfo());
551
552 if (IsLittleEndian)
553 std::swap(LoVal, HiVal);
554
555 SDValue WholeValue =
556 DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, LoVal, HiVal);
557 WholeValue = DAG.getNode(ISD::BITCAST, dl, VA.getValVT(), WholeValue);
558 InVals.push_back(WholeValue);
559 continue;
560 }
561
562 int FI = MF.getFrameInfo().CreateFixedObject(LocVT.getSizeInBits() / 8,
563 Offset, true);
564 SDValue FIPtr = DAG.getFrameIndex(FI, PtrVT);
565 SDValue Load = DAG.getLoad(LocVT, dl, Chain, FIPtr,
567 if (VA.getLocInfo() != CCValAssign::Indirect) {
568 InVals.push_back(Load);
569 continue;
570 }
571 Arg = Load;
572 }
573
575
576 SDValue ArgValue =
577 DAG.getLoad(VA.getValVT(), dl, Chain, Arg, MachinePointerInfo());
578 InVals.push_back(ArgValue);
579
580 unsigned ArgIndex = Ins[InIdx].OrigArgIndex;
581 assert(Ins[InIdx].PartOffset == 0);
582 while (i + 1 != e && Ins[InIdx + 1].OrigArgIndex == ArgIndex) {
583 CCValAssign &PartVA = ArgLocs[i + 1];
584 unsigned PartOffset = Ins[InIdx + 1].PartOffset;
586 ArgValue, TypeSize::getFixed(PartOffset), dl);
587 InVals.push_back(DAG.getLoad(PartVA.getValVT(), dl, Chain, Address,
589 ++i;
590 ++InIdx;
591 }
592 }
593
594 if (MF.getFunction().hasStructRetAttr()) {
595 // Copy the SRet Argument to SRetReturnReg.
597 Register Reg = SFI->getSRetReturnReg();
598 if (!Reg) {
599 Reg = MF.getRegInfo().createVirtualRegister(&SP::IntRegsRegClass);
600 SFI->setSRetReturnReg(Reg);
601 }
602 SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[0]);
603 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Copy, Chain);
604 }
605
606 // Store remaining ArgRegs to the stack if this is a varargs function.
607 if (isVarArg) {
608 static const MCPhysReg ArgRegs[] = {
609 SP::I0, SP::I1, SP::I2, SP::I3, SP::I4, SP::I5
610 };
611 unsigned NumAllocated = CCInfo.getFirstUnallocated(ArgRegs);
612 const MCPhysReg *CurArgReg = ArgRegs+NumAllocated, *ArgRegEnd = ArgRegs+6;
613 unsigned ArgOffset = CCInfo.getStackSize();
614 if (NumAllocated == 6)
615 ArgOffset += StackOffset;
616 else {
617 assert(!ArgOffset);
618 ArgOffset = 68+4*NumAllocated;
619 }
620
621 // Remember the vararg offset for the va_start implementation.
622 FuncInfo->setVarArgsFrameOffset(ArgOffset);
623
624 std::vector<SDValue> OutChains;
625
626 for (; CurArgReg != ArgRegEnd; ++CurArgReg) {
627 Register VReg = RegInfo.createVirtualRegister(&SP::IntRegsRegClass);
628 MF.getRegInfo().addLiveIn(*CurArgReg, VReg);
629 SDValue Arg = DAG.getCopyFromReg(DAG.getRoot(), dl, VReg, MVT::i32);
630
631 int FrameIdx = MF.getFrameInfo().CreateFixedObject(4, ArgOffset,
632 true);
633 SDValue FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32);
634
635 OutChains.push_back(
636 DAG.getStore(DAG.getRoot(), dl, Arg, FIPtr, MachinePointerInfo()));
637 ArgOffset += 4;
638 }
639
640 if (!OutChains.empty()) {
641 OutChains.push_back(Chain);
642 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
643 }
644 }
645
646 return Chain;
647}
648
649// Lower formal arguments for the 64 bit ABI.
651 SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
652 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL,
653 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
655
656 // Analyze arguments according to CC_Sparc64.
658 CCState CCInfo(CallConv, IsVarArg, DAG.getMachineFunction(), ArgLocs,
659 *DAG.getContext());
660 CCInfo.AnalyzeFormalArguments(Ins, CC_Sparc64);
661
662 // The argument array begins at %fp+BIAS+128, after the register save area.
663 const unsigned ArgArea = 128;
664
665 for (const CCValAssign &VA : ArgLocs) {
666 if (VA.isRegLoc()) {
667 // This argument is passed in a register.
668 // All integer register arguments are promoted by the caller to i64.
669
670 // Create a virtual register for the promoted live-in value.
671 Register VReg = MF.addLiveIn(VA.getLocReg(),
672 getRegClassFor(VA.getLocVT()));
673 SDValue Arg = DAG.getCopyFromReg(Chain, DL, VReg, VA.getLocVT());
674
675 // Get the high bits for i32 struct elements.
676 if (VA.getValVT() == MVT::i32 && VA.needsCustom())
677 Arg = DAG.getNode(ISD::SRL, DL, VA.getLocVT(), Arg,
678 DAG.getConstant(32, DL, MVT::i32));
679
680 // The caller promoted the argument, so insert an Assert?ext SDNode so we
681 // won't promote the value again in this function.
682 switch (VA.getLocInfo()) {
684 Arg = DAG.getNode(ISD::AssertSext, DL, VA.getLocVT(), Arg,
685 DAG.getValueType(VA.getValVT()));
686 break;
688 Arg = DAG.getNode(ISD::AssertZext, DL, VA.getLocVT(), Arg,
689 DAG.getValueType(VA.getValVT()));
690 break;
691 default:
692 break;
693 }
694
695 // Truncate the register down to the argument type.
696 if (VA.isExtInLoc())
697 Arg = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), Arg);
698
699 InVals.push_back(Arg);
700 continue;
701 }
702
703 // The registers are exhausted. This argument was passed on the stack.
704 assert(VA.isMemLoc());
705 // The CC_Sparc64_Full/Half functions compute stack offsets relative to the
706 // beginning of the arguments area at %fp+BIAS+128.
707 unsigned Offset = VA.getLocMemOffset() + ArgArea;
708 unsigned ValSize = VA.getValVT().getSizeInBits() / 8;
709 // Adjust offset for extended arguments, SPARC is big-endian.
710 // The caller will have written the full slot with extended bytes, but we
711 // prefer our own extending loads.
712 if (VA.isExtInLoc())
713 Offset += 8 - ValSize;
714 int FI = MF.getFrameInfo().CreateFixedObject(ValSize, Offset, true);
715 InVals.push_back(
716 DAG.getLoad(VA.getValVT(), DL, Chain,
719 }
720
721 if (!IsVarArg)
722 return Chain;
723
724 // This function takes variable arguments, some of which may have been passed
725 // in registers %i0-%i5. Variable floating point arguments are never passed
726 // in floating point registers. They go on %i0-%i5 or on the stack like
727 // integer arguments.
728 //
729 // The va_start intrinsic needs to know the offset to the first variable
730 // argument.
731 unsigned ArgOffset = CCInfo.getStackSize();
733 // Skip the 128 bytes of register save area.
734 FuncInfo->setVarArgsFrameOffset(ArgOffset + ArgArea +
735 Subtarget->getStackPointerBias());
736
737 // Save the variable arguments that were passed in registers.
738 // The caller is required to reserve stack space for 6 arguments regardless
739 // of how many arguments were actually passed.
740 SmallVector<SDValue, 8> OutChains;
741 for (; ArgOffset < 6*8; ArgOffset += 8) {
742 Register VReg = MF.addLiveIn(SP::I0 + ArgOffset/8, &SP::I64RegsRegClass);
743 SDValue VArg = DAG.getCopyFromReg(Chain, DL, VReg, MVT::i64);
744 int FI = MF.getFrameInfo().CreateFixedObject(8, ArgOffset + ArgArea, true);
745 auto PtrVT = getPointerTy(MF.getDataLayout());
746 OutChains.push_back(
747 DAG.getStore(Chain, DL, VArg, DAG.getFrameIndex(FI, PtrVT),
749 }
750
751 if (!OutChains.empty())
752 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, OutChains);
753
754 return Chain;
755}
756
757// Check whether any of the argument registers are reserved
759 const MachineFunction &MF) {
760 // The register window design means that outgoing parameters at O*
761 // will appear in the callee as I*.
762 // Be conservative and check both sides of the register names.
763 bool Outgoing =
764 llvm::any_of(SP::GPROutgoingArgRegClass, [TRI, &MF](MCPhysReg r) {
765 return TRI->isReservedReg(MF, r);
766 });
767 bool Incoming =
768 llvm::any_of(SP::GPRIncomingArgRegClass, [TRI, &MF](MCPhysReg r) {
769 return TRI->isReservedReg(MF, r);
770 });
771 return Outgoing || Incoming;
772}
773
775 const Function &F = MF.getFunction();
776 F.getContext().diagnose(DiagnosticInfoUnsupported{
777 F, ("SPARC doesn't support"
778 " function calls if any of the argument registers is reserved.")});
779}
780
783 SmallVectorImpl<SDValue> &InVals) const {
784 if (Subtarget->is64Bit())
785 return LowerCall_64(CLI, InVals);
786 return LowerCall_32(CLI, InVals);
787}
788
789static bool hasReturnsTwiceAttr(SelectionDAG &DAG, SDValue Callee,
790 const CallBase *Call) {
791 if (Call)
792 return Call->hasFnAttr(Attribute::ReturnsTwice);
793
794 const Function *CalleeFn = nullptr;
796 CalleeFn = dyn_cast<Function>(G->getGlobal());
797 } else if (ExternalSymbolSDNode *E =
799 const Function &Fn = DAG.getMachineFunction().getFunction();
800 const Module *M = Fn.getParent();
801 const char *CalleeName = E->getSymbol();
802 CalleeFn = M->getFunction(CalleeName);
803 }
804
805 if (!CalleeFn)
806 return false;
807 return CalleeFn->hasFnAttribute(Attribute::ReturnsTwice);
808}
809
810/// IsEligibleForTailCallOptimization - Check whether the call is eligible
811/// for tail call optimization.
813 CCState &CCInfo, CallLoweringInfo &CLI, MachineFunction &MF) const {
814
815 auto &Outs = CLI.Outs;
816 auto &Caller = MF.getFunction();
817
818 // Do not tail call opt functions with "disable-tail-calls" attribute.
819 if (Caller.getFnAttribute("disable-tail-calls").getValueAsString() == "true")
820 return false;
821
822 // Do not tail call opt if the stack is used to pass parameters.
823 // 64-bit targets have a slightly higher limit since the ABI requires
824 // to allocate some space even when all the parameters fit inside registers.
825 unsigned StackSizeLimit = Subtarget->is64Bit() ? 48 : 0;
826 if (CCInfo.getStackSize() > StackSizeLimit)
827 return false;
828
829 // Do not tail call opt if either the callee or caller returns
830 // a struct and the other does not.
831 if (!Outs.empty() && Caller.hasStructRetAttr() != Outs[0].Flags.isSRet())
832 return false;
833
834 // Byval parameters hand the function a pointer directly into the stack area
835 // we want to reuse during a tail call.
836 for (auto &Arg : Outs)
837 if (Arg.Flags.isByVal())
838 return false;
839
840 return true;
841}
842
843// Lower a call for the 32-bit ABI.
846 SmallVectorImpl<SDValue> &InVals) const {
847 SelectionDAG &DAG = CLI.DAG;
848 SDLoc &dl = CLI.DL;
850 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
852 SDValue Chain = CLI.Chain;
853 SDValue Callee = CLI.Callee;
854 bool &isTailCall = CLI.IsTailCall;
855 CallingConv::ID CallConv = CLI.CallConv;
856 bool isVarArg = CLI.IsVarArg;
858 LLVMContext &Ctx = *DAG.getContext();
859 EVT PtrVT = getPointerTy(MF.getDataLayout());
860
861 // Analyze operands of the call, assigning locations to each operand.
863 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), ArgLocs,
864 *DAG.getContext());
865 CCInfo.AnalyzeCallOperands(Outs, CC_Sparc32);
866
867 isTailCall = isTailCall && IsEligibleForTailCallOptimization(
868 CCInfo, CLI, DAG.getMachineFunction());
869
870 // Get the size of the outgoing arguments stack space requirement.
871 unsigned ArgsSize = CCInfo.getStackSize();
872
873 // Keep stack frames 8-byte aligned.
874 ArgsSize = (ArgsSize+7) & ~7;
875
877
878 // Create local copies for byval args.
879 SmallVector<SDValue, 8> ByValArgs;
880 for (unsigned i = 0, e = Outs.size(); i != e; ++i) {
881 ISD::ArgFlagsTy Flags = Outs[i].Flags;
882 if (!Flags.isByVal())
883 continue;
884
885 SDValue Arg = OutVals[i];
886 unsigned Size = Flags.getByValSize();
887 Align Alignment = Flags.getNonZeroByValAlign();
888
889 if (Size > 0U) {
890 int FI = MFI.CreateStackObject(Size, Alignment, false);
891 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
892 SDValue SizeNode = DAG.getConstant(Size, dl, MVT::i32);
893
894 Chain =
895 DAG.getMemcpy(Chain, dl, FIPtr, Arg, SizeNode, Alignment, Alignment,
896 false, // isVolatile,
897 (Size <= 32), // AlwaysInline if size <= 32,
898 /*CI=*/nullptr, std::nullopt, MachinePointerInfo(),
900 ByValArgs.push_back(FIPtr);
901 }
902 else {
903 SDValue nullVal;
904 ByValArgs.push_back(nullVal);
905 }
906 }
907
908 assert(!isTailCall || ArgsSize == 0);
909
910 if (!isTailCall)
911 Chain = DAG.getCALLSEQ_START(Chain, ArgsSize, 0, dl);
912
914 SmallVector<SDValue, 8> MemOpChains;
915
916 const unsigned StackOffset = 92;
917 bool hasStructRetAttr = false;
918 unsigned SRetArgSize = 0;
919 // Walk the register/memloc assignments, inserting copies/loads.
920 for (unsigned i = 0, realArgIdx = 0, byvalArgIdx = 0, e = ArgLocs.size();
921 i != e;
922 ++i, ++realArgIdx) {
923 CCValAssign &VA = ArgLocs[i];
924 SDValue Arg = OutVals[realArgIdx];
925
926 ISD::ArgFlagsTy Flags = Outs[realArgIdx].Flags;
927
928 // Use local copy if it is a byval arg.
929 if (Flags.isByVal()) {
930 Arg = ByValArgs[byvalArgIdx++];
931 if (!Arg) {
932 continue;
933 }
934 }
935
936 // Promote the value if needed.
937 switch (VA.getLocInfo()) {
938 default: llvm_unreachable("Unknown loc info!");
941 break;
943 Arg = DAG.getNode(ISD::SIGN_EXTEND, dl, VA.getLocVT(), Arg);
944 break;
946 Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, VA.getLocVT(), Arg);
947 break;
949 Arg = DAG.getNode(ISD::ANY_EXTEND, dl, VA.getLocVT(), Arg);
950 break;
952 Arg = DAG.getNode(ISD::BITCAST, dl, VA.getLocVT(), Arg);
953 break;
954 }
955
956 if (Flags.isSRet()) {
957 assert(VA.needsCustom());
958
959 if (isTailCall)
960 continue;
961
962 // store SRet argument in %sp+64
963 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
964 SDValue PtrOff = DAG.getIntPtrConstant(64, dl);
965 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
966 MemOpChains.push_back(
967 DAG.getStore(Chain, dl, Arg, PtrOff, MachinePointerInfo()));
968 hasStructRetAttr = true;
969 // sret only allowed on first argument
970 assert(Outs[realArgIdx].OrigArgIndex == 0);
971 SRetArgSize =
972 DAG.getDataLayout().getTypeAllocSize(CLI.getArgs()[0].IndirectType);
973 continue;
974 }
975
976 if (VA.needsCustom()) {
977 assert(VA.getLocVT() == MVT::f64 || VA.getLocVT() == MVT::v2i32);
978
979 if (VA.isMemLoc()) {
980 unsigned Offset = VA.getLocMemOffset() + StackOffset;
981 // if it is double-word aligned, just store.
982 if (Offset % 8 == 0) {
983 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
984 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl);
985 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
986 MemOpChains.push_back(
987 DAG.getStore(Chain, dl, Arg, PtrOff, MachinePointerInfo()));
988 continue;
989 }
990 }
991
992 if (VA.getLocVT() == MVT::f64) {
993 // Move from the float value from float registers into the
994 // integer registers.
996 Arg = bitcastConstantFPToInt(C, dl, DAG);
997 else
998 Arg = DAG.getNode(ISD::BITCAST, dl, MVT::v2i32, Arg);
999 }
1000
1001 SDValue Part0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
1002 Arg,
1003 DAG.getConstant(0, dl, getVectorIdxTy(DAG.getDataLayout())));
1004 SDValue Part1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
1005 Arg,
1006 DAG.getConstant(1, dl, getVectorIdxTy(DAG.getDataLayout())));
1007
1008 if (VA.isRegLoc()) {
1009 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Part0));
1010 assert(i+1 != e);
1011 CCValAssign &NextVA = ArgLocs[++i];
1012 if (NextVA.isRegLoc()) {
1013 RegsToPass.push_back(std::make_pair(NextVA.getLocReg(), Part1));
1014 } else {
1015 // Store the second part in stack.
1016 unsigned Offset = NextVA.getLocMemOffset() + StackOffset;
1017 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
1018 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl);
1019 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
1020 MemOpChains.push_back(
1021 DAG.getStore(Chain, dl, Part1, PtrOff, MachinePointerInfo()));
1022 }
1023 } else {
1024 unsigned Offset = VA.getLocMemOffset() + StackOffset;
1025 // Store the first part.
1026 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
1027 SDValue PtrOff = DAG.getIntPtrConstant(Offset, dl);
1028 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
1029 MemOpChains.push_back(
1030 DAG.getStore(Chain, dl, Part0, PtrOff, MachinePointerInfo()));
1031 // Store the second part.
1032 PtrOff = DAG.getIntPtrConstant(Offset + 4, dl);
1033 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
1034 MemOpChains.push_back(
1035 DAG.getStore(Chain, dl, Part1, PtrOff, MachinePointerInfo()));
1036 }
1037 continue;
1038 }
1039
1040 if (VA.getLocInfo() == CCValAssign::Indirect) {
1041 // Store the argument in a stack slot and pass its address.
1042 unsigned ArgIndex = Outs[realArgIdx].OrigArgIndex;
1043 assert(Outs[realArgIdx].PartOffset == 0);
1044
1045 EVT SlotVT;
1046 if (i + 1 != e && Outs[realArgIdx + 1].OrigArgIndex == ArgIndex) {
1047 Type *OrigArgType = CLI.Args[ArgIndex].Ty;
1048 EVT OrigArgVT = getValueType(MF.getDataLayout(), OrigArgType);
1049 MVT PartVT =
1050 getRegisterTypeForCallingConv(Ctx, CLI.CallConv, OrigArgVT);
1051 unsigned N =
1052 getNumRegistersForCallingConv(Ctx, CLI.CallConv, OrigArgVT);
1053 SlotVT = EVT::getIntegerVT(Ctx, PartVT.getSizeInBits() * N);
1054 } else {
1055 SlotVT = Outs[realArgIdx].VT;
1056 }
1057
1058 SDValue SpillSlot = DAG.CreateStackTemporary(SlotVT);
1059 int FI = cast<FrameIndexSDNode>(SpillSlot)->getIndex();
1060 MemOpChains.push_back(
1061 DAG.getStore(Chain, dl, Arg, SpillSlot,
1063 // If the original argument was split (e.g. f128), we need
1064 // to store all parts of it here (and pass just one address).
1065 while (i + 1 != e && Outs[realArgIdx + 1].OrigArgIndex == ArgIndex) {
1066 SDValue PartValue = OutVals[realArgIdx + 1];
1067 unsigned PartOffset = Outs[realArgIdx + 1].PartOffset;
1069 DAG.getFrameIndex(FI, PtrVT), TypeSize::getFixed(PartOffset), dl);
1070 MemOpChains.push_back(
1071 DAG.getStore(Chain, dl, PartValue, Address,
1073 assert((PartOffset + PartValue.getValueType().getStoreSize() <=
1074 SlotVT.getStoreSize()) &&
1075 "Not enough space for argument part!");
1076 ++i;
1077 ++realArgIdx;
1078 }
1079
1080 Arg = SpillSlot;
1081 }
1082
1083 // Arguments that can be passed on register must be kept at
1084 // RegsToPass vector
1085 if (VA.isRegLoc()) {
1086 if (VA.getLocVT() != MVT::f32) {
1087 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
1088 continue;
1089 }
1090 Arg = DAG.getNode(ISD::BITCAST, dl, MVT::i32, Arg);
1091 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
1092 continue;
1093 }
1094
1095 assert(VA.isMemLoc());
1096
1097 // Create a store off the stack pointer for this argument.
1098 SDValue StackPtr = DAG.getRegister(SP::O6, MVT::i32);
1100 dl);
1101 PtrOff = DAG.getNode(ISD::ADD, dl, MVT::i32, StackPtr, PtrOff);
1102 MemOpChains.push_back(
1103 DAG.getStore(Chain, dl, Arg, PtrOff, MachinePointerInfo()));
1104 }
1105
1106
1107 // Emit all stores, make sure the occur before any copies into physregs.
1108 if (!MemOpChains.empty())
1109 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, MemOpChains);
1110
1111 // Build a sequence of copy-to-reg nodes chained together with token
1112 // chain and flag operands which copy the outgoing args into registers.
1113 // The InGlue in necessary since all emitted instructions must be
1114 // stuck together.
1115 SDValue InGlue;
1116 for (const auto &[OrigReg, N] : RegsToPass) {
1117 Register Reg = isTailCall ? OrigReg : toCallerWindow(OrigReg);
1118 Chain = DAG.getCopyToReg(Chain, dl, Reg, N, InGlue);
1119 InGlue = Chain.getValue(1);
1120 }
1121
1122 bool hasReturnsTwice = hasReturnsTwiceAttr(DAG, Callee, CLI.CB);
1123
1124 // If the callee is a GlobalAddress node (quite common, every direct call is)
1125 // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
1126 // Likewise ExternalSymbol -> TargetExternalSymbol.
1128 Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, MVT::i32, 0);
1130 Callee = DAG.getTargetExternalSymbol(E->getSymbol(), MVT::i32);
1131
1132 // Returns a chain & a flag for retval copy to use
1133 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
1135 Ops.push_back(Chain);
1136 Ops.push_back(Callee);
1137 if (hasStructRetAttr)
1138 Ops.push_back(DAG.getTargetConstant(SRetArgSize, dl, MVT::i32));
1139 for (const auto &[OrigReg, N] : RegsToPass) {
1140 Register Reg = isTailCall ? OrigReg : toCallerWindow(OrigReg);
1141 Ops.push_back(DAG.getRegister(Reg, N.getValueType()));
1142 }
1143
1144 // Add a register mask operand representing the call-preserved registers.
1145 const SparcRegisterInfo *TRI = Subtarget->getRegisterInfo();
1146 const uint32_t *Mask =
1147 ((hasReturnsTwice)
1148 ? TRI->getRTCallPreservedMask(CallConv)
1149 : TRI->getCallPreservedMask(DAG.getMachineFunction(), CallConv));
1150
1151 if (isAnyArgRegReserved(TRI, MF))
1153
1154 assert(Mask && "Missing call preserved mask for calling convention");
1155 Ops.push_back(DAG.getRegisterMask(Mask));
1156
1157 if (InGlue.getNode())
1158 Ops.push_back(InGlue);
1159
1160 if (isTailCall) {
1162 return DAG.getNode(SPISD::TAIL_CALL, dl, MVT::Other, Ops);
1163 }
1164
1165 Chain = DAG.getNode(SPISD::CALL, dl, NodeTys, Ops);
1166 InGlue = Chain.getValue(1);
1167
1168 Chain = DAG.getCALLSEQ_END(Chain, ArgsSize, 0, InGlue, dl);
1169 InGlue = Chain.getValue(1);
1170
1171 // Assign locations to each value returned by this call.
1173 CCState RVInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs,
1174 *DAG.getContext());
1175
1176 RVInfo.AnalyzeCallResult(Ins, RetCC_Sparc32);
1177
1178 // Copy all of the result registers out of their specified physreg.
1179 for (unsigned i = 0; i != RVLocs.size(); ++i) {
1180 assert(RVLocs[i].isRegLoc() && "Can only return in registers!");
1181 if (RVLocs[i].getLocVT() == MVT::v2i32) {
1182 SDValue Vec = DAG.getNode(ISD::UNDEF, dl, MVT::v2i32);
1184 Chain, dl, toCallerWindow(RVLocs[i++].getLocReg()), MVT::i32, InGlue);
1185 Chain = Lo.getValue(1);
1186 InGlue = Lo.getValue(2);
1187 Vec = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v2i32, Vec, Lo,
1188 DAG.getConstant(0, dl, MVT::i32));
1190 Chain, dl, toCallerWindow(RVLocs[i].getLocReg()), MVT::i32, InGlue);
1191 Chain = Hi.getValue(1);
1192 InGlue = Hi.getValue(2);
1193 Vec = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v2i32, Vec, Hi,
1194 DAG.getConstant(1, dl, MVT::i32));
1195 InVals.push_back(Vec);
1196 } else {
1197 Chain =
1198 DAG.getCopyFromReg(Chain, dl, toCallerWindow(RVLocs[i].getLocReg()),
1199 RVLocs[i].getValVT(), InGlue)
1200 .getValue(1);
1201 InGlue = Chain.getValue(2);
1202 InVals.push_back(Chain.getValue(0));
1203 }
1204 }
1205
1206 return Chain;
1207}
1208
1209// FIXME? Maybe this could be a TableGen attribute on some registers and
1210// this table could be generated automatically from RegInfo.
1212 const MachineFunction &MF) const {
1214 .Case("i0", SP::I0).Case("i1", SP::I1).Case("i2", SP::I2).Case("i3", SP::I3)
1215 .Case("i4", SP::I4).Case("i5", SP::I5).Case("i6", SP::I6).Case("i7", SP::I7)
1216 .Case("o0", SP::O0).Case("o1", SP::O1).Case("o2", SP::O2).Case("o3", SP::O3)
1217 .Case("o4", SP::O4).Case("o5", SP::O5).Case("o6", SP::O6).Case("o7", SP::O7)
1218 .Case("l0", SP::L0).Case("l1", SP::L1).Case("l2", SP::L2).Case("l3", SP::L3)
1219 .Case("l4", SP::L4).Case("l5", SP::L5).Case("l6", SP::L6).Case("l7", SP::L7)
1220 .Case("g0", SP::G0).Case("g1", SP::G1).Case("g2", SP::G2).Case("g3", SP::G3)
1221 .Case("g4", SP::G4).Case("g5", SP::G5).Case("g6", SP::G6).Case("g7", SP::G7)
1222 .Default(0);
1223
1224 // If we're directly referencing register names
1225 // (e.g in GCC C extension `register int r asm("g1");`),
1226 // make sure that said register is in the reserve list.
1227 const SparcRegisterInfo *TRI = Subtarget->getRegisterInfo();
1228 if (!TRI->isReservedReg(MF, Reg))
1229 Reg = Register();
1230
1231 return Reg;
1232}
1233
1234// Fixup floating point arguments in the ... part of a varargs call.
1235//
1236// The SPARC v9 ABI requires that floating point arguments are treated the same
1237// as integers when calling a varargs function. This does not apply to the
1238// fixed arguments that are part of the function's prototype.
1239//
1240// This function post-processes a CCValAssign array created by
1241// AnalyzeCallOperands().
1244 for (CCValAssign &VA : ArgLocs) {
1245 MVT ValTy = VA.getLocVT();
1246 // FIXME: What about f32 arguments? C promotes them to f64 when calling
1247 // varargs functions.
1248 if (!VA.isRegLoc() || (ValTy != MVT::f64 && ValTy != MVT::f128))
1249 continue;
1250 // The fixed arguments to a varargs function still go in FP registers.
1251 if (!Outs[VA.getValNo()].Flags.isVarArg())
1252 continue;
1253
1254 // This floating point argument should be reassigned.
1255 // Determine the offset into the argument array.
1256 Register firstReg = (ValTy == MVT::f64) ? SP::D0 : SP::Q0;
1257 unsigned argSize = (ValTy == MVT::f64) ? 8 : 16;
1258 unsigned Offset = argSize * (VA.getLocReg() - firstReg);
1259 assert(Offset < 16*8 && "Offset out of range, bad register enum?");
1260
1261 if (Offset < 6*8) {
1262 // This argument should go in %i0-%i5.
1263 unsigned IReg = SP::I0 + Offset/8;
1264 if (ValTy == MVT::f64)
1265 // Full register, just bitconvert into i64.
1266 VA = CCValAssign::getReg(VA.getValNo(), VA.getValVT(), IReg, MVT::i64,
1268 else {
1269 assert(ValTy == MVT::f128 && "Unexpected type!");
1270 // Full register, just bitconvert into i128 -- We will lower this into
1271 // two i64s in LowerCall_64.
1272 VA = CCValAssign::getCustomReg(VA.getValNo(), VA.getValVT(), IReg,
1273 MVT::i128, CCValAssign::BCvt);
1274 }
1275 } else {
1276 // This needs to go to memory, we're out of integer registers.
1277 VA = CCValAssign::getMem(VA.getValNo(), VA.getValVT(), Offset,
1278 VA.getLocVT(), VA.getLocInfo());
1279 }
1280 }
1281}
1282
1283// Lower a call for the 64-bit ABI.
1284SDValue
1286 SmallVectorImpl<SDValue> &InVals) const {
1287 SelectionDAG &DAG = CLI.DAG;
1288 SDLoc DL = CLI.DL;
1289 SDValue Chain = CLI.Chain;
1290 auto PtrVT = getPointerTy(DAG.getDataLayout());
1292
1293 // Analyze operands of the call, assigning locations to each operand.
1295 CCState CCInfo(CLI.CallConv, CLI.IsVarArg, DAG.getMachineFunction(), ArgLocs,
1296 *DAG.getContext());
1297 CCInfo.AnalyzeCallOperands(CLI.Outs, CC_Sparc64);
1298
1300 CCInfo, CLI, DAG.getMachineFunction());
1301
1302 // Get the size of the outgoing arguments stack space requirement.
1303 // The stack offset computed by CC_Sparc64 includes all arguments.
1304 // Called functions expect 6 argument words to exist in the stack frame, used
1305 // or not.
1306 unsigned StackReserved = 6 * 8u;
1307 unsigned ArgsSize = std::max<unsigned>(StackReserved, CCInfo.getStackSize());
1308
1309 // Keep stack frames 16-byte aligned.
1310 ArgsSize = alignTo(ArgsSize, 16);
1311
1312 // Varargs calls require special treatment.
1313 if (CLI.IsVarArg)
1314 fixupVariableFloatArgs(ArgLocs, CLI.Outs);
1315
1316 assert(!CLI.IsTailCall || ArgsSize == StackReserved);
1317
1318 // Adjust the stack pointer to make room for the arguments.
1319 // FIXME: Use hasReservedCallFrame to avoid %sp adjustments around all calls
1320 // with more than 6 arguments.
1321 if (!CLI.IsTailCall)
1322 Chain = DAG.getCALLSEQ_START(Chain, ArgsSize, 0, DL);
1323
1324 // Collect the set of registers to pass to the function and their values.
1325 // This will be emitted as a sequence of CopyToReg nodes glued to the call
1326 // instruction.
1328
1329 // Collect chains from all the memory opeations that copy arguments to the
1330 // stack. They must follow the stack pointer adjustment above and precede the
1331 // call instruction itself.
1332 SmallVector<SDValue, 8> MemOpChains;
1333
1334 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
1335 const CCValAssign &VA = ArgLocs[i];
1336 SDValue Arg = CLI.OutVals[i];
1337
1338 // Promote the value if needed.
1339 switch (VA.getLocInfo()) {
1340 default:
1341 llvm_unreachable("Unknown location info!");
1342 case CCValAssign::Full:
1343 break;
1344 case CCValAssign::SExt:
1345 Arg = DAG.getNode(ISD::SIGN_EXTEND, DL, VA.getLocVT(), Arg);
1346 break;
1347 case CCValAssign::ZExt:
1348 Arg = DAG.getNode(ISD::ZERO_EXTEND, DL, VA.getLocVT(), Arg);
1349 break;
1350 case CCValAssign::AExt:
1351 Arg = DAG.getNode(ISD::ANY_EXTEND, DL, VA.getLocVT(), Arg);
1352 break;
1353 case CCValAssign::BCvt:
1354 // fixupVariableFloatArgs() may create bitcasts from f128 to i128. But
1355 // SPARC does not support i128 natively. Lower it into two i64, see below.
1356 if (!VA.needsCustom() || VA.getValVT() != MVT::f128
1357 || VA.getLocVT() != MVT::i128)
1358 Arg = DAG.getNode(ISD::BITCAST, DL, VA.getLocVT(), Arg);
1359 break;
1360 }
1361
1362 if (VA.isRegLoc()) {
1363 if (VA.needsCustom() && VA.getValVT() == MVT::f128
1364 && VA.getLocVT() == MVT::i128) {
1365 // Store and reload into the integer register reg and reg+1.
1366 unsigned Offset = 8 * (VA.getLocReg() - SP::I0);
1367 unsigned StackOffset = Offset + Subtarget->getStackPointerBias() + 128;
1368 SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT);
1369 SDValue HiPtrOff = DAG.getIntPtrConstant(StackOffset, DL);
1370 HiPtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, HiPtrOff);
1371 SDValue LoPtrOff = DAG.getIntPtrConstant(StackOffset + 8, DL);
1372 LoPtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, LoPtrOff);
1373
1374 // Store to %sp+BIAS+128+Offset
1375 SDValue Store =
1376 DAG.getStore(Chain, DL, Arg, HiPtrOff, MachinePointerInfo());
1377 // Load into Reg and Reg+1
1378 SDValue Hi64 =
1379 DAG.getLoad(MVT::i64, DL, Store, HiPtrOff, MachinePointerInfo());
1380 SDValue Lo64 =
1381 DAG.getLoad(MVT::i64, DL, Store, LoPtrOff, MachinePointerInfo());
1382
1383 Register HiReg = VA.getLocReg();
1384 Register LoReg = VA.getLocReg() + 1;
1385 if (!CLI.IsTailCall) {
1386 HiReg = toCallerWindow(HiReg);
1387 LoReg = toCallerWindow(LoReg);
1388 }
1389
1390 RegsToPass.push_back(std::make_pair(HiReg, Hi64));
1391 RegsToPass.push_back(std::make_pair(LoReg, Lo64));
1392 continue;
1393 }
1394
1395 // The custom bit on an i32 return value indicates that it should be
1396 // passed in the high bits of the register.
1397 if (VA.getValVT() == MVT::i32 && VA.needsCustom()) {
1398 Arg = DAG.getNode(ISD::SHL, DL, MVT::i64, Arg,
1399 DAG.getConstant(32, DL, MVT::i32));
1400
1401 // The next value may go in the low bits of the same register.
1402 // Handle both at once.
1403 if (i+1 < ArgLocs.size() && ArgLocs[i+1].isRegLoc() &&
1404 ArgLocs[i+1].getLocReg() == VA.getLocReg()) {
1405 SDValue NV = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64,
1406 CLI.OutVals[i+1]);
1407 Arg = DAG.getNode(ISD::OR, DL, MVT::i64, Arg, NV);
1408 // Skip the next value, it's already done.
1409 ++i;
1410 }
1411 }
1412
1413 Register Reg = VA.getLocReg();
1414 if (!CLI.IsTailCall)
1415 Reg = toCallerWindow(Reg);
1416 RegsToPass.push_back(std::make_pair(Reg, Arg));
1417 continue;
1418 }
1419
1420 assert(VA.isMemLoc());
1421
1422 // Create a store off the stack pointer for this argument.
1423 SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT);
1424 // The argument area starts at %fp+BIAS+128 in the callee frame,
1425 // %sp+BIAS+128 in ours.
1426 SDValue PtrOff = DAG.getIntPtrConstant(VA.getLocMemOffset() +
1427 Subtarget->getStackPointerBias() +
1428 128, DL);
1429 PtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, PtrOff);
1430 MemOpChains.push_back(
1431 DAG.getStore(Chain, DL, Arg, PtrOff, MachinePointerInfo()));
1432 }
1433
1434 // Emit all stores, make sure they occur before the call.
1435 if (!MemOpChains.empty())
1436 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains);
1437
1438 // Build a sequence of CopyToReg nodes glued together with token chain and
1439 // glue operands which copy the outgoing args into registers. The InGlue is
1440 // necessary since all emitted instructions must be stuck together in order
1441 // to pass the live physical registers.
1442 SDValue InGlue;
1443 for (const auto &[Reg, N] : RegsToPass) {
1444 Chain = DAG.getCopyToReg(Chain, DL, Reg, N, InGlue);
1445 InGlue = Chain.getValue(1);
1446 }
1447
1448 // If the callee is a GlobalAddress node (quite common, every direct call is)
1449 // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
1450 // Likewise ExternalSymbol -> TargetExternalSymbol.
1451 SDValue Callee = CLI.Callee;
1452 bool hasReturnsTwice = hasReturnsTwiceAttr(DAG, Callee, CLI.CB);
1454 Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL, PtrVT, 0);
1456 Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT);
1457
1458 // Build the operands for the call instruction itself.
1460 Ops.push_back(Chain);
1461 Ops.push_back(Callee);
1462 for (const auto &[Reg, N] : RegsToPass)
1463 Ops.push_back(DAG.getRegister(Reg, N.getValueType()));
1464
1465 // Add a register mask operand representing the call-preserved registers.
1466 const SparcRegisterInfo *TRI = Subtarget->getRegisterInfo();
1467 const uint32_t *Mask =
1468 ((hasReturnsTwice) ? TRI->getRTCallPreservedMask(CLI.CallConv)
1469 : TRI->getCallPreservedMask(DAG.getMachineFunction(),
1470 CLI.CallConv));
1471
1472 if (isAnyArgRegReserved(TRI, MF))
1474
1475 assert(Mask && "Missing call preserved mask for calling convention");
1476 Ops.push_back(DAG.getRegisterMask(Mask));
1477
1478 // Make sure the CopyToReg nodes are glued to the call instruction which
1479 // consumes the registers.
1480 if (InGlue.getNode())
1481 Ops.push_back(InGlue);
1482
1483 // Now the call itself.
1484 if (CLI.IsTailCall) {
1486 return DAG.getNode(SPISD::TAIL_CALL, DL, MVT::Other, Ops);
1487 }
1488 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
1489 Chain = DAG.getNode(SPISD::CALL, DL, NodeTys, Ops);
1490 InGlue = Chain.getValue(1);
1491
1492 // Revert the stack pointer immediately after the call.
1493 Chain = DAG.getCALLSEQ_END(Chain, ArgsSize, 0, InGlue, DL);
1494 InGlue = Chain.getValue(1);
1495
1496 // Now extract the return values. This is more or less the same as
1497 // LowerFormalArguments_64.
1498
1499 // Assign locations to each value returned by this call.
1501 CCState RVInfo(CLI.CallConv, CLI.IsVarArg, DAG.getMachineFunction(), RVLocs,
1502 *DAG.getContext());
1503
1504 // Set inreg flag manually for codegen generated library calls that
1505 // return float.
1506 if (CLI.Ins.size() == 1 && CLI.Ins[0].VT == MVT::f32 && !CLI.CB)
1507 CLI.Ins[0].Flags.setInReg();
1508
1509 RVInfo.AnalyzeCallResult(CLI.Ins, RetCC_Sparc64);
1510
1511 // Copy all of the result registers out of their specified physreg.
1512 for (unsigned i = 0; i != RVLocs.size(); ++i) {
1513 CCValAssign &VA = RVLocs[i];
1514 assert(VA.isRegLoc() && "Can only return in registers!");
1515 unsigned Reg = toCallerWindow(VA.getLocReg());
1516
1517 // When returning 'inreg {i32, i32 }', two consecutive i32 arguments can
1518 // reside in the same register in the high and low bits. Reuse the
1519 // CopyFromReg previous node to avoid duplicate copies.
1520 SDValue RV;
1521 if (RegisterSDNode *SrcReg = dyn_cast<RegisterSDNode>(Chain.getOperand(1)))
1522 if (SrcReg->getReg() == Reg && Chain->getOpcode() == ISD::CopyFromReg)
1523 RV = Chain.getValue(0);
1524
1525 // But usually we'll create a new CopyFromReg for a different register.
1526 if (!RV.getNode()) {
1527 RV = DAG.getCopyFromReg(Chain, DL, Reg, RVLocs[i].getLocVT(), InGlue);
1528 Chain = RV.getValue(1);
1529 InGlue = Chain.getValue(2);
1530 }
1531
1532 // Get the high bits for i32 struct elements.
1533 if (VA.getValVT() == MVT::i32 && VA.needsCustom())
1534 RV = DAG.getNode(ISD::SRL, DL, VA.getLocVT(), RV,
1535 DAG.getConstant(32, DL, MVT::i32));
1536
1537 // The callee promoted the return value, so insert an Assert?ext SDNode so
1538 // we won't promote the value again in this function.
1539 switch (VA.getLocInfo()) {
1540 case CCValAssign::SExt:
1541 RV = DAG.getNode(ISD::AssertSext, DL, VA.getLocVT(), RV,
1542 DAG.getValueType(VA.getValVT()));
1543 break;
1544 case CCValAssign::ZExt:
1545 RV = DAG.getNode(ISD::AssertZext, DL, VA.getLocVT(), RV,
1546 DAG.getValueType(VA.getValVT()));
1547 break;
1548 default:
1549 break;
1550 }
1551
1552 // Truncate the register down to the return value type.
1553 if (VA.isExtInLoc())
1554 RV = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), RV);
1555
1556 InVals.push_back(RV);
1557 }
1558
1559 return Chain;
1560}
1561
1562//===----------------------------------------------------------------------===//
1563// TargetLowering Implementation
1564//===----------------------------------------------------------------------===//
1565
1568 if (AI->getOperation() == AtomicRMWInst::Xchg &&
1569 AI->getType()->getPrimitiveSizeInBits() == 32)
1570 return AtomicExpansionKind::None; // Uses xchg instruction
1571
1573}
1574
1575/// intCondCCodeToRcond - Convert a DAG integer condition code to a SPARC
1576/// rcond condition.
1578 switch (CC) {
1579 default:
1580 llvm_unreachable("Unknown/unsigned integer condition code!");
1581 case ISD::SETEQ:
1582 return SPCC::REG_Z;
1583 case ISD::SETNE:
1584 return SPCC::REG_NZ;
1585 case ISD::SETLT:
1586 return SPCC::REG_LZ;
1587 case ISD::SETGT:
1588 return SPCC::REG_GZ;
1589 case ISD::SETLE:
1590 return SPCC::REG_LEZ;
1591 case ISD::SETGE:
1592 return SPCC::REG_GEZ;
1593 }
1594}
1595
1596/// IntCondCCodeToICC - Convert a DAG integer condition code to a SPARC ICC
1597/// condition.
1599 switch (CC) {
1600 default: llvm_unreachable("Unknown integer condition code!");
1601 case ISD::SETEQ: return SPCC::ICC_E;
1602 case ISD::SETNE: return SPCC::ICC_NE;
1603 case ISD::SETLT: return SPCC::ICC_L;
1604 case ISD::SETGT: return SPCC::ICC_G;
1605 case ISD::SETLE: return SPCC::ICC_LE;
1606 case ISD::SETGE: return SPCC::ICC_GE;
1607 case ISD::SETULT: return SPCC::ICC_CS;
1608 case ISD::SETULE: return SPCC::ICC_LEU;
1609 case ISD::SETUGT: return SPCC::ICC_GU;
1610 case ISD::SETUGE: return SPCC::ICC_CC;
1611 }
1612}
1613
1614/// FPCondCCodeToFCC - Convert a DAG floatingp oint condition code to a SPARC
1615/// FCC condition.
1617 switch (CC) {
1618 default: llvm_unreachable("Unknown fp condition code!");
1619 case ISD::SETEQ:
1620 case ISD::SETOEQ: return SPCC::FCC_E;
1621 case ISD::SETNE:
1622 case ISD::SETUNE: return SPCC::FCC_NE;
1623 case ISD::SETLT:
1624 case ISD::SETOLT: return SPCC::FCC_L;
1625 case ISD::SETGT:
1626 case ISD::SETOGT: return SPCC::FCC_G;
1627 case ISD::SETLE:
1628 case ISD::SETOLE: return SPCC::FCC_LE;
1629 case ISD::SETGE:
1630 case ISD::SETOGE: return SPCC::FCC_GE;
1631 case ISD::SETULT: return SPCC::FCC_UL;
1632 case ISD::SETULE: return SPCC::FCC_ULE;
1633 case ISD::SETUGT: return SPCC::FCC_UG;
1634 case ISD::SETUGE: return SPCC::FCC_UGE;
1635 case ISD::SETUO: return SPCC::FCC_U;
1636 case ISD::SETO: return SPCC::FCC_O;
1637 case ISD::SETONE: return SPCC::FCC_LG;
1638 case ISD::SETUEQ: return SPCC::FCC_UE;
1639 }
1640}
1641
1643 const SparcSubtarget &STI)
1644 : TargetLowering(TM, STI), Subtarget(&STI) {
1645 MVT PtrVT = MVT::getIntegerVT(TM.getPointerSizeInBits(0));
1646
1647 // Instructions which use registers as conditionals examine all the
1648 // bits (as does the pseudo SELECT_CC expansion). I don't think it
1649 // matters much whether it's ZeroOrOneBooleanContent, or
1650 // ZeroOrNegativeOneBooleanContent, so, arbitrarily choose the
1651 // former.
1654
1655 // Set up the register classes.
1656 addRegisterClass(MVT::i32, &SP::IntRegsRegClass);
1657 if (!Subtarget->useSoftFloat()) {
1658 addRegisterClass(MVT::f32, &SP::FPRegsRegClass);
1659 addRegisterClass(MVT::f64, &SP::DFPRegsRegClass);
1660 addRegisterClass(MVT::f128, &SP::QFPRegsRegClass);
1661 }
1662 if (Subtarget->is64Bit()) {
1663 addRegisterClass(MVT::i64, &SP::I64RegsRegClass);
1664 } else {
1665 // On 32bit sparc, we define a double-register 32bit register
1666 // class, as well. This is modeled in LLVM as a 2-vector of i32.
1667 addRegisterClass(MVT::v2i32, &SP::IntPairRegClass);
1668
1669 // ...but almost all operations must be expanded, so set that as
1670 // the default.
1671 for (unsigned Op = 0; Op < ISD::BUILTIN_OP_END; ++Op) {
1672 setOperationAction(Op, MVT::v2i32, Expand);
1673 }
1674 // Truncating/extending stores/loads are also not supported.
1676 setLoadExtAction(ISD::SEXTLOAD, VT, MVT::v2i32, Expand);
1677 setLoadExtAction(ISD::ZEXTLOAD, VT, MVT::v2i32, Expand);
1678 setLoadExtAction(ISD::EXTLOAD, VT, MVT::v2i32, Expand);
1679
1680 setLoadExtAction(ISD::SEXTLOAD, MVT::v2i32, VT, Expand);
1681 setLoadExtAction(ISD::ZEXTLOAD, MVT::v2i32, VT, Expand);
1682 setLoadExtAction(ISD::EXTLOAD, MVT::v2i32, VT, Expand);
1683
1684 setTruncStoreAction(VT, MVT::v2i32, Expand);
1685 setTruncStoreAction(MVT::v2i32, VT, Expand);
1686 }
1687 // However, load and store *are* legal.
1688 setOperationAction(ISD::LOAD, MVT::v2i32, Legal);
1689 setOperationAction(ISD::STORE, MVT::v2i32, Legal);
1692
1693 // And we need to promote i64 loads/stores into vector load/store
1696
1697 // Sadly, this doesn't work:
1698 // AddPromotedToType(ISD::LOAD, MVT::i64, MVT::v2i32);
1699 // AddPromotedToType(ISD::STORE, MVT::i64, MVT::v2i32);
1700 }
1701
1702 // Turn FP extload into load/fpextend
1703 for (MVT VT : MVT::fp_valuetypes()) {
1704 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f16, Expand);
1705 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f32, Expand);
1706 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f64, Expand);
1707 }
1708
1709 // Sparc doesn't have i1 sign extending load
1710 for (MVT VT : MVT::integer_valuetypes())
1711 setLoadExtAction(ISD::SEXTLOAD, VT, MVT::i1, Promote);
1712
1713 // Turn FP truncstore into trunc + store.
1714 setTruncStoreAction(MVT::f32, MVT::f16, Expand);
1715 setTruncStoreAction(MVT::f64, MVT::f16, Expand);
1716 setTruncStoreAction(MVT::f64, MVT::f32, Expand);
1717 setTruncStoreAction(MVT::f128, MVT::f16, Expand);
1718 setTruncStoreAction(MVT::f128, MVT::f32, Expand);
1719 setTruncStoreAction(MVT::f128, MVT::f64, Expand);
1720
1721 // Custom legalize GlobalAddress nodes into LO/HI parts.
1726
1727 // Sparc doesn't have sext_inreg, replace them with shl/sra
1731
1732 // Sparc has no REM or DIVREM operations.
1737
1738 // ... nor does SparcV9.
1739 if (Subtarget->is64Bit()) {
1744 }
1745
1746 // Custom expand fp<->sint
1751
1752 // Custom Expand fp<->uint
1757
1758 // Lower f16 conversion operations into library calls
1765
1767 Subtarget->isVIS3() ? Legal : Expand);
1769 Subtarget->isVIS3() ? Legal : Expand);
1770
1771 // Sparc has no select or setcc: expand to SELECT_CC.
1776
1781
1782 // Sparc doesn't have BRCOND either, it has BR_CC.
1784 setOperationAction(ISD::BRIND, MVT::Other, Expand);
1785 setOperationAction(ISD::BR_JT, MVT::Other, Expand);
1790
1795
1800
1801 if (Subtarget->isVIS3()) {
1804 }
1805
1806 if (Subtarget->is64Bit()) {
1808 Subtarget->isVIS3() ? Legal : Expand);
1810 Subtarget->isVIS3() ? Legal : Expand);
1815
1817 Subtarget->usePopc() ? Legal : Expand);
1819 setOperationAction(ISD::ROTL , MVT::i64, Expand);
1820 setOperationAction(ISD::ROTR , MVT::i64, Expand);
1822 }
1823
1824 // ATOMICs.
1825 // Atomics are supported on SparcV9. 32-bit atomics are also
1826 // supported by some Leon SparcV8 variants. Otherwise, atomics
1827 // are unsupported.
1828 if (Subtarget->isV9()) {
1829 // TODO: we _ought_ to be able to support 64-bit atomics on 32-bit sparcv9,
1830 // but it hasn't been implemented in the backend yet.
1831 if (Subtarget->is64Bit())
1833 else
1835 } else if (Subtarget->hasLeonCasa())
1837 else
1839
1841
1843
1845
1846 // Custom Lower Atomic LOAD/STORE
1849
1850 if (Subtarget->is64Bit()) {
1855 }
1856
1857 if (!Subtarget->isV9()) {
1858 // SparcV8 does not have FNEGD and FABSD.
1861 }
1862
1863 setOperationAction(ISD::FSIN , MVT::f128, Expand);
1864 setOperationAction(ISD::FCOS , MVT::f128, Expand);
1867 setOperationAction(ISD::FMA , MVT::f128, Expand);
1868 setOperationAction(ISD::FSIN , MVT::f64, Expand);
1869 setOperationAction(ISD::FCOS , MVT::f64, Expand);
1872 setOperationAction(ISD::FMA, MVT::f64,
1873 Subtarget->isUA2007() ? Legal : Expand);
1874 setOperationAction(ISD::FSIN , MVT::f32, Expand);
1875 setOperationAction(ISD::FCOS , MVT::f32, Expand);
1878 setOperationAction(ISD::FMA, MVT::f32,
1879 Subtarget->isUA2007() ? Legal : Expand);
1880 setOperationAction(ISD::ROTL , MVT::i32, Expand);
1881 setOperationAction(ISD::ROTR , MVT::i32, Expand);
1882 setOperationAction(ISD::BSWAP, MVT::i32, Subtarget->isV9() ? Custom : Expand);
1886 setOperationAction(ISD::FPOW , MVT::f128, Expand);
1887 setOperationAction(ISD::FPOW , MVT::f64, Expand);
1888 setOperationAction(ISD::FPOW , MVT::f32, Expand);
1889
1893
1894 // Expands to [SU]MUL_LOHI.
1898
1899 if (Subtarget->useSoftMulDiv()) {
1900 // .umul works for both signed and unsigned
1905 }
1906
1907 if (Subtarget->is64Bit()) {
1911 Subtarget->isVIS3() ? Legal : Expand);
1913 Subtarget->isVIS3() ? Legal : Expand);
1914
1918 }
1919
1920 // VASTART needs to be custom lowered to use the VarArgsFrameIndex.
1921 setOperationAction(ISD::VASTART , MVT::Other, Custom);
1922 // VAARG needs to be lowered to not do unaligned accesses for doubles.
1923 setOperationAction(ISD::VAARG , MVT::Other, Custom);
1924
1925 setOperationAction(ISD::TRAP , MVT::Other, Legal);
1927
1928 // Use the default implementation.
1929 setOperationAction(ISD::VACOPY , MVT::Other, Expand);
1930 setOperationAction(ISD::VAEND , MVT::Other, Expand);
1935
1937
1939 Subtarget->usePopc() ? Legal : Expand);
1940
1941 if (Subtarget->isV9() && Subtarget->hasHardQuad()) {
1942 setOperationAction(ISD::LOAD, MVT::f128, Legal);
1943 setOperationAction(ISD::STORE, MVT::f128, Legal);
1944 } else {
1945 setOperationAction(ISD::LOAD, MVT::f128, Custom);
1947 }
1948
1949 if (Subtarget->hasHardQuad()) {
1950 setOperationAction(ISD::FADD, MVT::f128, Legal);
1951 setOperationAction(ISD::FSUB, MVT::f128, Legal);
1952 setOperationAction(ISD::FMUL, MVT::f128, Legal);
1953 setOperationAction(ISD::FDIV, MVT::f128, Legal);
1954 setOperationAction(ISD::FSQRT, MVT::f128, Legal);
1957 if (Subtarget->isV9()) {
1958 setOperationAction(ISD::FNEG, MVT::f128, Legal);
1959 setOperationAction(ISD::FABS, MVT::f128, Legal);
1960 } else {
1961 setOperationAction(ISD::FNEG, MVT::f128, Custom);
1962 setOperationAction(ISD::FABS, MVT::f128, Custom);
1963 }
1964 } else {
1965 // Custom legalize f128 operations.
1966
1967 setOperationAction(ISD::FADD, MVT::f128, Custom);
1968 setOperationAction(ISD::FSUB, MVT::f128, Custom);
1969 setOperationAction(ISD::FMUL, MVT::f128, Custom);
1970 setOperationAction(ISD::FDIV, MVT::f128, Custom);
1972 setOperationAction(ISD::FNEG, MVT::f128, Custom);
1973 setOperationAction(ISD::FABS, MVT::f128, Custom);
1974
1978 }
1979
1980 if (Subtarget->fixAllFDIVSQRT()) {
1981 // Promote FDIVS and FSQRTS to FDIVD and FSQRTD instructions instead as
1982 // the former instructions generate errata on LEON processors.
1985 }
1986
1987 if (Subtarget->hasNoFMULS()) {
1989 }
1990
1991 // Custom combine bitcast between f64 and v2i32
1992 if (!Subtarget->is64Bit())
1994
1995 if (Subtarget->isV9())
1997
1998 if (Subtarget->hasLeonCycleCounter())
2000
2001 if (Subtarget->isVIS3()) {
2006
2007 setOperationAction(ISD::CTTZ, MVT::i32,
2008 Subtarget->is64Bit() ? Promote : Expand);
2011 Subtarget->is64Bit() ? Promote : Expand);
2013 } else if (Subtarget->usePopc()) {
2018
2023 } else {
2027 Subtarget->is64Bit() ? Promote : LibCall);
2029
2030 // FIXME here we don't have any ISA extensions that could help us, so to
2031 // prevent large expansions those should be made into LibCalls.
2036 }
2037
2039
2040 // Some processors have no branch predictor and have pipelines longer than
2041 // what can be covered by the delay slot. This results in a stall, so mark
2042 // branches to be expensive on those processors.
2043 setJumpIsExpensive(Subtarget->hasNoPredictor());
2044 // The high cost of branching means that using conditional moves will
2045 // still be profitable even if the condition is predictable.
2047
2049
2050 computeRegisterProperties(Subtarget->getRegisterInfo());
2051}
2052
2054 return Subtarget->useSoftFloat();
2055}
2056
2058 EVT VT) const {
2059 if (!VT.isVector())
2060 return MVT::i32;
2062}
2063
2064/// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to
2065/// be zero. Op is expected to be a target specific node. Used by DAG
2066/// combiner.
2068 (const SDValue Op,
2070 const APInt &DemandedElts,
2071 const SelectionDAG &DAG,
2072 unsigned Depth) const {
2073 KnownBits Known2;
2074 Known.resetAll();
2075
2076 switch (Op.getOpcode()) {
2077 default: break;
2078 case SPISD::SELECT_ICC:
2079 case SPISD::SELECT_XCC:
2080 case SPISD::SELECT_FCC:
2081 Known = DAG.computeKnownBits(Op.getOperand(1), Depth + 1);
2082 Known2 = DAG.computeKnownBits(Op.getOperand(0), Depth + 1);
2083
2084 // Only known if known in both the LHS and RHS.
2085 Known = Known.intersectWith(Known2);
2086 break;
2087 }
2088}
2089
2090// Look at LHS/RHS/CC and see if they are a lowered setcc instruction. If so
2091// set LHS/RHS and SPCC to the LHS/RHS of the setcc and SPCC to the condition.
2093 ISD::CondCode CC, unsigned &SPCC) {
2094 if (isNullConstant(RHS) && CC == ISD::SETNE &&
2095 (((LHS.getOpcode() == SPISD::SELECT_ICC ||
2096 LHS.getOpcode() == SPISD::SELECT_XCC) &&
2097 LHS.getOperand(3).getOpcode() == SPISD::CMPICC) ||
2098 (LHS.getOpcode() == SPISD::SELECT_FCC &&
2099 (LHS.getOperand(3).getOpcode() == SPISD::CMPFCC ||
2100 LHS.getOperand(3).getOpcode() == SPISD::CMPFCC_V9))) &&
2101 isOneConstant(LHS.getOperand(0)) && isNullConstant(LHS.getOperand(1))) {
2102 SDValue CMPCC = LHS.getOperand(3);
2103 SPCC = LHS.getConstantOperandVal(2);
2104 LHS = CMPCC.getOperand(0);
2105 RHS = CMPCC.getOperand(1);
2106 }
2107}
2108
2109// Convert to a target node and set target flags.
2111 SelectionDAG &DAG) const {
2113 return DAG.getTargetGlobalAddress(GA->getGlobal(),
2114 SDLoc(GA),
2115 GA->getValueType(0),
2116 GA->getOffset(), TF);
2117
2119 return DAG.getTargetConstantPool(CP->getConstVal(), CP->getValueType(0),
2120 CP->getAlign(), CP->getOffset(), TF);
2121
2123 return DAG.getTargetBlockAddress(BA->getBlockAddress(),
2124 Op.getValueType(),
2125 0,
2126 TF);
2127
2129 return DAG.getTargetExternalSymbol(ES->getSymbol(),
2130 ES->getValueType(0), TF);
2131
2132 llvm_unreachable("Unhandled address SDNode");
2133}
2134
2135// Split Op into high and low parts according to HiTF and LoTF.
2136// Return an ADD node combining the parts.
2138 unsigned HiTF, unsigned LoTF,
2139 SelectionDAG &DAG) const {
2140 SDLoc DL(Op);
2141 EVT VT = Op.getValueType();
2142 SDValue Hi = DAG.getNode(SPISD::Hi, DL, VT, withTargetFlags(Op, HiTF, DAG));
2143 SDValue Lo = DAG.getNode(SPISD::Lo, DL, VT, withTargetFlags(Op, LoTF, DAG));
2144 return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo);
2145}
2146
2147// Build SDNodes for producing an address from a GlobalAddress, ConstantPool,
2148// or ExternalSymbol SDNode.
2150 SDLoc DL(Op);
2151 EVT VT = getPointerTy(DAG.getDataLayout());
2152
2153 // Handle PIC mode first. SPARC needs a got load for every variable!
2154 if (isPositionIndependent()) {
2155 const Module *M = DAG.getMachineFunction().getFunction().getParent();
2156 PICLevel::Level picLevel = M->getPICLevel();
2157 SDValue Idx;
2158
2159 if (picLevel == PICLevel::SmallPIC) {
2160 // This is the pic13 code model, the GOT is known to be smaller than 8KiB.
2161 Idx = DAG.getNode(SPISD::Lo, DL, Op.getValueType(),
2162 withTargetFlags(Op, ELF::R_SPARC_GOT13, DAG));
2163 } else {
2164 // This is the pic32 code model, the GOT is known to be smaller than 4GB.
2165 Idx = makeHiLoPair(Op, ELF::R_SPARC_GOT22, ELF::R_SPARC_GOT10, DAG);
2166 }
2167
2168 SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, VT);
2169 SDValue AbsAddr = DAG.getNode(ISD::ADD, DL, VT, GlobalBase, Idx);
2170 // GLOBAL_BASE_REG codegen'ed with call. Inform MFI that this
2171 // function has calls.
2173 MFI.setHasCalls(true);
2174 return DAG.getLoad(VT, DL, DAG.getEntryNode(), AbsAddr,
2176 }
2177
2178 // This is one of the absolute code models.
2179 switch(getTargetMachine().getCodeModel()) {
2180 default:
2181 llvm_unreachable("Unsupported absolute code model");
2182 case CodeModel::Small:
2183 // abs32.
2184 return makeHiLoPair(Op, ELF::R_SPARC_HI22, ELF::R_SPARC_LO10, DAG);
2185 case CodeModel::Medium: {
2186 // abs44.
2187 SDValue H44 = makeHiLoPair(Op, ELF::R_SPARC_H44, ELF::R_SPARC_M44, DAG);
2188 H44 = DAG.getNode(ISD::SHL, DL, VT, H44, DAG.getConstant(12, DL, MVT::i32));
2189 SDValue L44 = withTargetFlags(Op, ELF::R_SPARC_L44, DAG);
2190 L44 = DAG.getNode(SPISD::Lo, DL, VT, L44);
2191 return DAG.getNode(ISD::ADD, DL, VT, H44, L44);
2192 }
2193 case CodeModel::Large: {
2194 // abs64.
2195 SDValue Hi = makeHiLoPair(Op, ELF::R_SPARC_HH22, ELF::R_SPARC_HM10, DAG);
2196 Hi = DAG.getNode(ISD::SHL, DL, VT, Hi, DAG.getConstant(32, DL, MVT::i32));
2197 SDValue Lo = makeHiLoPair(Op, ELF::R_SPARC_HI22, ELF::R_SPARC_LO10, DAG);
2198 return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo);
2199 }
2200 }
2201}
2202
2207
2212
2217
2219 SelectionDAG &DAG) const {
2220
2222 if (DAG.getTarget().useEmulatedTLS())
2223 return LowerToTLSEmulatedModel(GA, DAG);
2224
2225 SDLoc DL(GA);
2226 const GlobalValue *GV = GA->getGlobal();
2227 EVT PtrVT = getPointerTy(DAG.getDataLayout());
2228
2230
2231 if (model == TLSModel::GeneralDynamic || model == TLSModel::LocalDynamic) {
2232 unsigned HiTF =
2233 ((model == TLSModel::GeneralDynamic) ? ELF::R_SPARC_TLS_GD_HI22
2234 : ELF::R_SPARC_TLS_LDM_HI22);
2235 unsigned LoTF =
2236 ((model == TLSModel::GeneralDynamic) ? ELF::R_SPARC_TLS_GD_LO10
2237 : ELF::R_SPARC_TLS_LDM_LO10);
2238 unsigned addTF =
2239 ((model == TLSModel::GeneralDynamic) ? ELF::R_SPARC_TLS_GD_ADD
2240 : ELF::R_SPARC_TLS_LDM_ADD);
2241 unsigned callTF =
2242 ((model == TLSModel::GeneralDynamic) ? ELF::R_SPARC_TLS_GD_CALL
2243 : ELF::R_SPARC_TLS_LDM_CALL);
2244
2245 SDValue HiLo = makeHiLoPair(Op, HiTF, LoTF, DAG);
2246 SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
2247 SDValue Argument = DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Base, HiLo,
2248 withTargetFlags(Op, addTF, DAG));
2249
2250 SDValue Chain = DAG.getEntryNode();
2251 SDValue InGlue;
2252
2253 Chain = DAG.getCALLSEQ_START(Chain, 0, 0, DL);
2254 Chain = DAG.getCopyToReg(Chain, DL, SP::O0, Argument, InGlue);
2255 InGlue = Chain.getValue(1);
2256 SDValue Callee = DAG.getTargetExternalSymbol("__tls_get_addr", PtrVT);
2257 SDValue Symbol = withTargetFlags(Op, callTF, DAG);
2258
2259 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
2260 const uint32_t *Mask = Subtarget->getRegisterInfo()->getCallPreservedMask(
2262 assert(Mask && "Missing call preserved mask for calling convention");
2263 SDValue Ops[] = {Chain,
2264 Callee,
2265 Symbol,
2266 DAG.getRegister(SP::O0, PtrVT),
2267 DAG.getRegisterMask(Mask),
2268 InGlue};
2269 Chain = DAG.getNode(SPISD::TLS_CALL, DL, NodeTys, Ops);
2270 InGlue = Chain.getValue(1);
2271 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
2272 InGlue = Chain.getValue(1);
2273 SDValue Ret = DAG.getCopyFromReg(Chain, DL, SP::O0, PtrVT, InGlue);
2274
2275 if (model != TLSModel::LocalDynamic)
2276 return Ret;
2277
2278 SDValue Hi =
2279 DAG.getNode(SPISD::Hi, DL, PtrVT,
2280 withTargetFlags(Op, ELF::R_SPARC_TLS_LDO_HIX22, DAG));
2281 SDValue Lo =
2282 DAG.getNode(SPISD::Lo, DL, PtrVT,
2283 withTargetFlags(Op, ELF::R_SPARC_TLS_LDO_LOX10, DAG));
2284 HiLo = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
2285 return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Ret, HiLo,
2286 withTargetFlags(Op, ELF::R_SPARC_TLS_LDO_ADD, DAG));
2287 }
2288
2289 if (model == TLSModel::InitialExec) {
2290 unsigned ldTF = ((PtrVT == MVT::i64) ? ELF::R_SPARC_TLS_IE_LDX
2291 : ELF::R_SPARC_TLS_IE_LD);
2292
2293 SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
2294
2295 // GLOBAL_BASE_REG codegen'ed with call. Inform MFI that this
2296 // function has calls.
2298 MFI.setHasCalls(true);
2299
2300 SDValue TGA = makeHiLoPair(Op, ELF::R_SPARC_TLS_IE_HI22,
2301 ELF::R_SPARC_TLS_IE_LO10, DAG);
2302 SDValue Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Base, TGA);
2303 SDValue Offset = DAG.getNode(SPISD::TLS_LD,
2304 DL, PtrVT, Ptr,
2305 withTargetFlags(Op, ldTF, DAG));
2306 return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT,
2307 DAG.getRegister(SP::G7, PtrVT), Offset,
2308 withTargetFlags(Op, ELF::R_SPARC_TLS_IE_ADD, DAG));
2309 }
2310
2311 assert(model == TLSModel::LocalExec);
2312 SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT,
2313 withTargetFlags(Op, ELF::R_SPARC_TLS_LE_HIX22, DAG));
2314 SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT,
2315 withTargetFlags(Op, ELF::R_SPARC_TLS_LE_LOX10, DAG));
2316 SDValue Offset = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
2317
2318 return DAG.getNode(ISD::ADD, DL, PtrVT,
2319 DAG.getRegister(SP::G7, PtrVT), Offset);
2320}
2321
2323 ArgListTy &Args, SDValue Arg,
2324 const SDLoc &DL,
2325 SelectionDAG &DAG) const {
2327 EVT ArgVT = Arg.getValueType();
2328 Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
2329
2330 if (ArgTy->isFP128Ty()) {
2331 // Create a stack object and pass the pointer to the library function.
2332 int FI = MFI.CreateStackObject(16, Align(8), false);
2333 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
2334 Chain = DAG.getStore(Chain, DL, Arg, FIPtr, MachinePointerInfo(), Align(8));
2335 Args.emplace_back(FIPtr, PointerType::getUnqual(ArgTy->getContext()));
2336 } else {
2337 Args.emplace_back(Arg, ArgTy);
2338 }
2339 return Chain;
2340}
2341
2343 RTLIB::Libcall LibFunc,
2344 unsigned numArgs) const {
2345 RTLIB::LibcallImpl LibFuncImpl = DAG.getLibcalls().getLibcallImpl(LibFunc);
2346 if (LibFuncImpl == RTLIB::Unsupported)
2347 return SDValue();
2348
2349 ArgListTy Args;
2350
2352 auto PtrVT = getPointerTy(DAG.getDataLayout());
2353
2354 SDValue Callee = DAG.getExternalSymbol(LibFuncImpl, PtrVT);
2355 Type *RetTy = Op.getValueType().getTypeForEVT(*DAG.getContext());
2356 Type *RetTyABI = RetTy;
2357 SDValue Chain = DAG.getEntryNode();
2358 SDValue RetPtr;
2359
2360 if (RetTy->isFP128Ty()) {
2361 // Create a Stack Object to receive the return value of type f128.
2362 int RetFI = MFI.CreateStackObject(16, Align(8), false);
2363 RetPtr = DAG.getFrameIndex(RetFI, PtrVT);
2364 ArgListEntry Entry(RetPtr, PointerType::getUnqual(RetTy->getContext()));
2365 if (!Subtarget->is64Bit()) {
2366 Entry.IsSRet = true;
2367 Entry.IndirectType = RetTy;
2368 }
2369 Entry.IsReturned = false;
2370 Args.push_back(Entry);
2371 RetTyABI = Type::getVoidTy(*DAG.getContext());
2372 }
2373
2374 assert(Op->getNumOperands() >= numArgs && "Not enough operands!");
2375 for (unsigned i = 0, e = numArgs; i != e; ++i) {
2376 Chain = LowerF128_LibCallArg(Chain, Args, Op.getOperand(i), SDLoc(Op), DAG);
2377 }
2378
2381 CLI.setDebugLoc(SDLoc(Op)).setChain(Chain).setCallee(CC, RetTyABI, Callee,
2382 std::move(Args));
2383
2384 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
2385
2386 // chain is in second result.
2387 if (RetTyABI == RetTy)
2388 return CallInfo.first;
2389
2390 assert (RetTy->isFP128Ty() && "Unexpected return type!");
2391
2392 Chain = CallInfo.second;
2393
2394 // Load RetPtr to get the return value.
2395 return DAG.getLoad(Op.getValueType(), SDLoc(Op), Chain, RetPtr,
2397}
2398
2400 unsigned &SPCC, const SDLoc &DL,
2401 SelectionDAG &DAG) const {
2402
2403 const char *LibCall = nullptr;
2404 bool is64Bit = Subtarget->is64Bit();
2405 switch(SPCC) {
2406 default: llvm_unreachable("Unhandled conditional code!");
2407 case SPCC::FCC_E : LibCall = is64Bit? "_Qp_feq" : "_Q_feq"; break;
2408 case SPCC::FCC_NE : LibCall = is64Bit? "_Qp_fne" : "_Q_fne"; break;
2409 case SPCC::FCC_L : LibCall = is64Bit? "_Qp_flt" : "_Q_flt"; break;
2410 case SPCC::FCC_G : LibCall = is64Bit? "_Qp_fgt" : "_Q_fgt"; break;
2411 case SPCC::FCC_LE : LibCall = is64Bit? "_Qp_fle" : "_Q_fle"; break;
2412 case SPCC::FCC_GE : LibCall = is64Bit? "_Qp_fge" : "_Q_fge"; break;
2413 case SPCC::FCC_UL :
2414 case SPCC::FCC_ULE:
2415 case SPCC::FCC_UG :
2416 case SPCC::FCC_UGE:
2417 case SPCC::FCC_U :
2418 case SPCC::FCC_O :
2419 case SPCC::FCC_LG :
2420 case SPCC::FCC_UE : LibCall = is64Bit? "_Qp_cmp" : "_Q_cmp"; break;
2421 }
2422
2423 auto PtrVT = getPointerTy(DAG.getDataLayout());
2424 SDValue Callee = DAG.getExternalSymbol(LibCall, PtrVT);
2425 Type *RetTy = Type::getInt32Ty(*DAG.getContext());
2426 ArgListTy Args;
2427 SDValue Chain = DAG.getEntryNode();
2428 Chain = LowerF128_LibCallArg(Chain, Args, LHS, DL, DAG);
2429 Chain = LowerF128_LibCallArg(Chain, Args, RHS, DL, DAG);
2430
2432 CLI.setDebugLoc(DL).setChain(Chain)
2433 .setCallee(CallingConv::C, RetTy, Callee, std::move(Args));
2434
2435 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
2436
2437 // result is in first, and chain is in second result.
2438 SDValue Result = CallInfo.first;
2439
2440 switch(SPCC) {
2441 default: {
2442 SDValue RHS = DAG.getConstant(0, DL, Result.getValueType());
2444 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2445 }
2446 case SPCC::FCC_UL : {
2447 SDValue Mask = DAG.getConstant(1, DL, Result.getValueType());
2448 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Mask);
2449 SDValue RHS = DAG.getConstant(0, DL, Result.getValueType());
2451 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2452 }
2453 case SPCC::FCC_ULE: {
2454 SDValue RHS = DAG.getConstant(2, DL, Result.getValueType());
2456 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2457 }
2458 case SPCC::FCC_UG : {
2459 SDValue RHS = DAG.getConstant(1, DL, Result.getValueType());
2460 SPCC = SPCC::ICC_G;
2461 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2462 }
2463 case SPCC::FCC_UGE: {
2464 SDValue RHS = DAG.getConstant(1, DL, Result.getValueType());
2466 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2467 }
2468
2469 case SPCC::FCC_U : {
2470 SDValue RHS = DAG.getConstant(3, DL, Result.getValueType());
2471 SPCC = SPCC::ICC_E;
2472 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2473 }
2474 case SPCC::FCC_O : {
2475 SDValue RHS = DAG.getConstant(3, DL, Result.getValueType());
2477 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2478 }
2479 case SPCC::FCC_LG : {
2480 SDValue Mask = DAG.getConstant(3, DL, Result.getValueType());
2481 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Mask);
2482 SDValue RHS = DAG.getConstant(0, DL, Result.getValueType());
2484 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2485 }
2486 case SPCC::FCC_UE : {
2487 SDValue Mask = DAG.getConstant(3, DL, Result.getValueType());
2488 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Mask);
2489 SDValue RHS = DAG.getConstant(0, DL, Result.getValueType());
2490 SPCC = SPCC::ICC_E;
2491 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2492 }
2493 }
2494}
2495
2496static SDValue
2498 const SparcTargetLowering &TLI) {
2499
2500 if (Op.getOperand(0).getValueType() == MVT::f64)
2501 return TLI.LowerF128Op(Op, DAG, RTLIB::FPEXT_F64_F128, 1);
2502
2503 if (Op.getOperand(0).getValueType() == MVT::f32)
2504 return TLI.LowerF128Op(Op, DAG, RTLIB::FPEXT_F32_F128, 1);
2505
2506 llvm_unreachable("fpextend with non-float operand!");
2507 return SDValue();
2508}
2509
2510static SDValue
2512 const SparcTargetLowering &TLI) {
2513 // FP_ROUND on f64 and f32 are legal.
2514 if (Op.getOperand(0).getValueType() != MVT::f128)
2515 return Op;
2516
2517 if (Op.getValueType() == MVT::f64)
2518 return TLI.LowerF128Op(Op, DAG, RTLIB::FPROUND_F128_F64, 1);
2519 if (Op.getValueType() == MVT::f32)
2520 return TLI.LowerF128Op(Op, DAG, RTLIB::FPROUND_F128_F32, 1);
2521
2522 llvm_unreachable("fpround to non-float!");
2523 return SDValue();
2524}
2525
2527 const SparcTargetLowering &TLI,
2528 bool hasHardQuad) {
2529 SDLoc dl(Op);
2530 EVT VT = Op.getValueType();
2531 assert(VT == MVT::i32 || VT == MVT::i64);
2532
2533 // Expand f128 operations to fp128 abi calls.
2534 if (Op.getOperand(0).getValueType() == MVT::f128
2535 && (!hasHardQuad || !TLI.isTypeLegal(VT))) {
2536 RTLIB::Libcall LibFunc =
2537 VT == MVT::i32 ? RTLIB::FPTOSINT_F128_I32 : RTLIB::FPTOSINT_F128_I64;
2538 return TLI.LowerF128Op(Op, DAG, LibFunc, 1);
2539 }
2540
2541 // Expand if the resulting type is illegal.
2542 if (!TLI.isTypeLegal(VT))
2543 return SDValue();
2544
2545 // Otherwise, Convert the fp value to integer in an FP register.
2546 if (VT == MVT::i32)
2547 Op = DAG.getNode(SPISD::FTOI, dl, MVT::f32, Op.getOperand(0));
2548 else
2549 Op = DAG.getNode(SPISD::FTOX, dl, MVT::f64, Op.getOperand(0));
2550
2551 return DAG.getNode(ISD::BITCAST, dl, VT, Op);
2552}
2553
2555 const SparcTargetLowering &TLI,
2556 bool hasHardQuad) {
2557 SDLoc dl(Op);
2558 EVT OpVT = Op.getOperand(0).getValueType();
2559 assert(OpVT == MVT::i32 || (OpVT == MVT::i64));
2560
2561 EVT floatVT = (OpVT == MVT::i32) ? MVT::f32 : MVT::f64;
2562
2563 // Expand f128 operations to fp128 ABI calls.
2564 if (Op.getValueType() == MVT::f128
2565 && (!hasHardQuad || !TLI.isTypeLegal(OpVT))) {
2566 RTLIB::Libcall LibFunc =
2567 OpVT == MVT::i32 ? RTLIB::SINTTOFP_I32_F128 : RTLIB::SINTTOFP_I64_F128;
2568 return TLI.LowerF128Op(Op, DAG, LibFunc, 1);
2569 }
2570
2571 // Expand if the operand type is illegal.
2572 if (!TLI.isTypeLegal(OpVT))
2573 return SDValue();
2574
2575 // Otherwise, Convert the int value to FP in an FP register.
2576 SDValue Tmp = DAG.getNode(ISD::BITCAST, dl, floatVT, Op.getOperand(0));
2577 unsigned opcode = (OpVT == MVT::i32)? SPISD::ITOF : SPISD::XTOF;
2578 return DAG.getNode(opcode, dl, Op.getValueType(), Tmp);
2579}
2580
2582 const SparcTargetLowering &TLI,
2583 bool hasHardQuad) {
2584 EVT VT = Op.getValueType();
2585
2586 // Expand if it does not involve f128 or the target has support for
2587 // quad floating point instructions and the resulting type is legal.
2588 if (Op.getOperand(0).getValueType() != MVT::f128 ||
2589 (hasHardQuad && TLI.isTypeLegal(VT)))
2590 return SDValue();
2591
2592 assert(VT == MVT::i32 || VT == MVT::i64);
2593
2594 return TLI.LowerF128Op(
2595 Op, DAG,
2596 VT == MVT::i32 ? RTLIB::FPTOUINT_F128_I32 : RTLIB::FPTOUINT_F128_I64, 1);
2597}
2598
2600 const SparcTargetLowering &TLI,
2601 bool hasHardQuad) {
2602 EVT OpVT = Op.getOperand(0).getValueType();
2603 assert(OpVT == MVT::i32 || OpVT == MVT::i64);
2604
2605 // Expand if it does not involve f128 or the target has support for
2606 // quad floating point instructions and the operand type is legal.
2607 if (Op.getValueType() != MVT::f128 || (hasHardQuad && TLI.isTypeLegal(OpVT)))
2608 return SDValue();
2609
2610 return TLI.LowerF128Op(Op, DAG,
2611 OpVT == MVT::i32 ? RTLIB::UINTTOFP_I32_F128
2612 : RTLIB::UINTTOFP_I64_F128,
2613 1);
2614}
2615
2617 const SparcTargetLowering &TLI, bool hasHardQuad,
2618 bool isV9, bool is64Bit) {
2619 SDValue Chain = Op.getOperand(0);
2620 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(1))->get();
2621 SDValue LHS = Op.getOperand(2);
2622 SDValue RHS = Op.getOperand(3);
2623 SDValue Dest = Op.getOperand(4);
2624 SDLoc dl(Op);
2625 unsigned Opc, SPCC = ~0U;
2626
2627 // If this is a br_cc of a "setcc", and if the setcc got lowered into
2628 // an CMP[IF]CC/SELECT_[IF]CC pair, find the original compared values.
2630 assert(LHS.getValueType() == RHS.getValueType());
2631
2632 // Get the condition flag.
2633 SDValue CompareFlag;
2634 if (LHS.getValueType().isInteger()) {
2635 // On V9 processors running in 64-bit mode, if CC compares two `i64`s
2636 // and the RHS is zero we might be able to use a specialized branch.
2637 if (is64Bit && isV9 && LHS.getValueType() == MVT::i64 &&
2639 return DAG.getNode(SPISD::BR_REG, dl, MVT::Other, Chain, Dest,
2640 DAG.getConstant(intCondCCodeToRcond(CC), dl, MVT::i32),
2641 LHS);
2642
2643 CompareFlag = DAG.getNode(SPISD::CMPICC, dl, MVT::Glue, LHS, RHS);
2644 if (SPCC == ~0U) SPCC = IntCondCCodeToICC(CC);
2645 if (isV9)
2646 // 32-bit compares use the icc flags, 64-bit uses the xcc flags.
2647 Opc = LHS.getValueType() == MVT::i32 ? SPISD::BPICC : SPISD::BPXCC;
2648 else
2649 // Non-v9 targets don't have xcc.
2650 Opc = SPISD::BRICC;
2651 } else {
2652 if (!hasHardQuad && LHS.getValueType() == MVT::f128) {
2653 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
2654 CompareFlag = TLI.LowerF128Compare(LHS, RHS, SPCC, dl, DAG);
2655 Opc = isV9 ? SPISD::BPICC : SPISD::BRICC;
2656 } else {
2657 unsigned CmpOpc = isV9 ? SPISD::CMPFCC_V9 : SPISD::CMPFCC;
2658 CompareFlag = DAG.getNode(CmpOpc, dl, MVT::Glue, LHS, RHS);
2659 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
2660 Opc = isV9 ? SPISD::BRFCC_V9 : SPISD::BRFCC;
2661 }
2662 }
2663 return DAG.getNode(Opc, dl, MVT::Other, Chain, Dest,
2664 DAG.getConstant(SPCC, dl, MVT::i32), CompareFlag);
2665}
2666
2668 const SparcTargetLowering &TLI, bool hasHardQuad,
2669 bool isV9, bool is64Bit) {
2670 SDValue LHS = Op.getOperand(0);
2671 SDValue RHS = Op.getOperand(1);
2672 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get();
2673 SDValue TrueVal = Op.getOperand(2);
2674 SDValue FalseVal = Op.getOperand(3);
2675 SDLoc dl(Op);
2676 unsigned Opc, SPCC = ~0U;
2677
2678 // If this is a select_cc of a "setcc", and if the setcc got lowered into
2679 // an CMP[IF]CC/SELECT_[IF]CC pair, find the original compared values.
2681 assert(LHS.getValueType() == RHS.getValueType());
2682
2683 SDValue CompareFlag;
2684 if (LHS.getValueType().isInteger()) {
2685 // On V9 processors running in 64-bit mode, if CC compares two `i64`s
2686 // and the RHS is zero we might be able to use a specialized select.
2687 // All SELECT_CC between any two scalar integer types are eligible for
2688 // lowering to specialized instructions. Additionally, f32 and f64 types
2689 // are also eligible, but for f128 we can only use the specialized
2690 // instruction when we have hardquad.
2691 EVT ValType = TrueVal.getValueType();
2692 bool IsEligibleType = ValType.isScalarInteger() || ValType == MVT::f32 ||
2693 ValType == MVT::f64 ||
2694 (ValType == MVT::f128 && hasHardQuad);
2695 if (is64Bit && isV9 && LHS.getValueType() == MVT::i64 &&
2696 isNullConstant(RHS) && !ISD::isUnsignedIntSetCC(CC) && IsEligibleType)
2697 return DAG.getNode(
2698 SPISD::SELECT_REG, dl, TrueVal.getValueType(), TrueVal, FalseVal,
2699 DAG.getConstant(intCondCCodeToRcond(CC), dl, MVT::i32), LHS);
2700
2701 CompareFlag = DAG.getNode(SPISD::CMPICC, dl, MVT::Glue, LHS, RHS);
2702 Opc = LHS.getValueType() == MVT::i32 ?
2703 SPISD::SELECT_ICC : SPISD::SELECT_XCC;
2704 if (SPCC == ~0U) SPCC = IntCondCCodeToICC(CC);
2705 } else {
2706 if (!hasHardQuad && LHS.getValueType() == MVT::f128) {
2707 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
2708 CompareFlag = TLI.LowerF128Compare(LHS, RHS, SPCC, dl, DAG);
2709 Opc = SPISD::SELECT_ICC;
2710 } else {
2711 unsigned CmpOpc = isV9 ? SPISD::CMPFCC_V9 : SPISD::CMPFCC;
2712 CompareFlag = DAG.getNode(CmpOpc, dl, MVT::Glue, LHS, RHS);
2713 Opc = SPISD::SELECT_FCC;
2714 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
2715 }
2716 }
2717 return DAG.getNode(Opc, dl, TrueVal.getValueType(), TrueVal, FalseVal,
2718 DAG.getConstant(SPCC, dl, MVT::i32), CompareFlag);
2719}
2720
2722 const SparcTargetLowering &TLI) {
2725 auto PtrVT = TLI.getPointerTy(DAG.getDataLayout());
2726
2727 // Need frame address to find the address of VarArgsFrameIndex.
2729
2730 // vastart just stores the address of the VarArgsFrameIndex slot into the
2731 // memory location argument.
2732 SDLoc DL(Op);
2733 SDValue Offset =
2734 DAG.getNode(ISD::ADD, DL, PtrVT, DAG.getRegister(SP::I6, PtrVT),
2735 DAG.getIntPtrConstant(FuncInfo->getVarArgsFrameOffset(), DL));
2736 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
2737 return DAG.getStore(Op.getOperand(0), DL, Offset, Op.getOperand(1),
2738 MachinePointerInfo(SV));
2739}
2740
2742 SDNode *Node = Op.getNode();
2743 EVT VT = Node->getValueType(0);
2744 SDValue InChain = Node->getOperand(0);
2745 SDValue VAListPtr = Node->getOperand(1);
2746 EVT PtrVT = VAListPtr.getValueType();
2747 const Value *SV = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2748 SDLoc DL(Node);
2749 SDValue VAList =
2750 DAG.getLoad(PtrVT, DL, InChain, VAListPtr, MachinePointerInfo(SV));
2751 // Increment the pointer, VAList, to the next vaarg.
2752 SDValue NextPtr = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
2754 DL));
2755 // Store the incremented VAList to the legalized pointer.
2756 InChain = DAG.getStore(VAList.getValue(1), DL, NextPtr, VAListPtr,
2757 MachinePointerInfo(SV));
2758 // Load the actual argument out of the pointer VAList.
2759 // We can't count on greater alignment than the word size.
2760 return DAG.getLoad(
2761 VT, DL, InChain, VAList, MachinePointerInfo(),
2762 Align(std::min(PtrVT.getFixedSizeInBits(), VT.getFixedSizeInBits()) / 8));
2763}
2764
2766 const SparcSubtarget &Subtarget) {
2767 SDValue Chain = Op.getOperand(0);
2768 EVT VT = Op->getValueType(0);
2769 SDLoc DL(Op);
2770
2771 MCRegister SPReg = SP::O6;
2772 SDValue SP = DAG.getCopyFromReg(Chain, DL, SPReg, VT);
2773
2774 // Unbias the stack pointer register.
2775 unsigned OffsetToStackStart = Subtarget.getStackPointerBias();
2776 // Move past the register save area: 8 in registers + 8 local registers.
2777 OffsetToStackStart += 16 * (Subtarget.is64Bit() ? 8 : 4);
2778 // Move past the struct return address slot (4 bytes) on SPARC 32-bit.
2779 if (!Subtarget.is64Bit())
2780 OffsetToStackStart += 4;
2781
2782 SDValue StackAddr = DAG.getNode(ISD::ADD, DL, VT, SP,
2783 DAG.getConstant(OffsetToStackStart, DL, VT));
2784 return DAG.getMergeValues({StackAddr, Chain}, DL);
2785}
2786
2788 const SparcSubtarget *Subtarget) {
2789 SDValue Chain = Op.getOperand(0);
2790 SDValue Size = Op.getOperand(1);
2791 SDValue Alignment = Op.getOperand(2);
2792 MaybeAlign MaybeAlignment =
2793 cast<ConstantSDNode>(Alignment)->getMaybeAlignValue();
2794 EVT VT = Size->getValueType(0);
2795 SDLoc dl(Op);
2796
2797 unsigned SPReg = SP::O6;
2798 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
2799
2800 // The resultant pointer needs to be above the register spill area
2801 // at the bottom of the stack.
2802 unsigned regSpillArea;
2803 if (Subtarget->is64Bit()) {
2804 regSpillArea = 128;
2805 } else {
2806 // On Sparc32, the size of the spill area is 92. Unfortunately,
2807 // that's only 4-byte aligned, not 8-byte aligned (the stack
2808 // pointer is 8-byte aligned). So, if the user asked for an 8-byte
2809 // aligned dynamic allocation, we actually need to add 96 to the
2810 // bottom of the stack, instead of 92, to ensure 8-byte alignment.
2811
2812 // That also means adding 4 to the size of the allocation --
2813 // before applying the 8-byte rounding. Unfortunately, we the
2814 // value we get here has already had rounding applied. So, we need
2815 // to add 8, instead, wasting a bit more memory.
2816
2817 // Further, this only actually needs to be done if the required
2818 // alignment is > 4, but, we've lost that info by this point, too,
2819 // so we always apply it.
2820
2821 // (An alternative approach would be to always reserve 96 bytes
2822 // instead of the required 92, but then we'd waste 4 extra bytes
2823 // in every frame, not just those with dynamic stack allocations)
2824
2825 // TODO: modify code in SelectionDAGBuilder to make this less sad.
2826
2827 Size = DAG.getNode(ISD::ADD, dl, VT, Size,
2828 DAG.getConstant(8, dl, VT));
2829 regSpillArea = 96;
2830 }
2831
2832 int64_t Bias = Subtarget->getStackPointerBias();
2833
2834 // Debias and increment SP past the reserved spill area.
2835 // We need the SP to point to the first usable region before calculating
2836 // anything to prevent any of the pointers from becoming out of alignment when
2837 // we rebias the SP later on.
2838 SDValue StartOfUsableStack = DAG.getNode(
2839 ISD::ADD, dl, VT, SP, DAG.getConstant(regSpillArea + Bias, dl, VT));
2840 SDValue AllocatedPtr =
2841 DAG.getNode(ISD::SUB, dl, VT, StartOfUsableStack, Size);
2842
2843 bool IsOveraligned = MaybeAlignment.has_value();
2844 SDValue AlignedPtr =
2845 IsOveraligned
2846 ? DAG.getNode(ISD::AND, dl, VT, AllocatedPtr,
2847 DAG.getSignedConstant(-MaybeAlignment->value(), dl, VT))
2848 : AllocatedPtr;
2849
2850 // Now that we are done, restore the bias and reserved spill area.
2851 SDValue NewSP = DAG.getNode(ISD::SUB, dl, VT, AlignedPtr,
2852 DAG.getConstant(regSpillArea + Bias, dl, VT));
2853 Chain = DAG.getCopyToReg(SP.getValue(1), dl, SPReg, NewSP);
2854 SDValue Ops[2] = {AlignedPtr, Chain};
2855 return DAG.getMergeValues(Ops, dl);
2856}
2857
2858
2860 SDLoc dl(Op);
2861 SDValue Chain = DAG.getNode(SPISD::FLUSHW,
2862 dl, MVT::Other, DAG.getEntryNode());
2863 return Chain;
2864}
2865
2867 const SparcSubtarget *Subtarget,
2868 bool AlwaysFlush = false) {
2870 MFI.setFrameAddressIsTaken(true);
2871
2872 EVT VT = Op.getValueType();
2873 SDLoc dl(Op);
2874 unsigned FrameReg = SP::I6;
2875 unsigned stackBias = Subtarget->getStackPointerBias();
2876
2877 SDValue FrameAddr;
2878 SDValue Chain;
2879
2880 // flush first to make sure the windowed registers' values are in stack
2881 Chain = (depth || AlwaysFlush) ? getFLUSHW(Op, DAG) : DAG.getEntryNode();
2882
2883 FrameAddr = DAG.getCopyFromReg(Chain, dl, FrameReg, VT);
2884
2885 unsigned Offset = (Subtarget->is64Bit()) ? (stackBias + 112) : 56;
2886
2887 while (depth--) {
2888 SDValue Ptr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr,
2889 DAG.getIntPtrConstant(Offset, dl));
2890 FrameAddr = DAG.getLoad(VT, dl, Chain, Ptr, MachinePointerInfo());
2891 }
2892 if (Subtarget->is64Bit())
2893 FrameAddr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr,
2894 DAG.getIntPtrConstant(stackBias, dl));
2895 return FrameAddr;
2896}
2897
2898
2900 const SparcSubtarget *Subtarget) {
2901
2902 uint64_t depth = Op.getConstantOperandVal(0);
2903
2904 return getFRAMEADDR(depth, Op, DAG, Subtarget);
2905
2906}
2907
2909 const SparcTargetLowering &TLI,
2910 const SparcSubtarget *Subtarget) {
2912 MachineFrameInfo &MFI = MF.getFrameInfo();
2913 MFI.setReturnAddressIsTaken(true);
2914
2915 EVT VT = Op.getValueType();
2916 SDLoc dl(Op);
2917 uint64_t depth = Op.getConstantOperandVal(0);
2918
2919 SDValue RetAddr;
2920 if (depth == 0) {
2921 auto PtrVT = TLI.getPointerTy(DAG.getDataLayout());
2922 Register RetReg = MF.addLiveIn(SP::I7, TLI.getRegClassFor(PtrVT));
2923 RetAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, RetReg, VT);
2924 return RetAddr;
2925 }
2926
2927 // Need frame address to find return address of the caller.
2928 SDValue FrameAddr = getFRAMEADDR(depth - 1, Op, DAG, Subtarget, true);
2929
2930 unsigned Offset = (Subtarget->is64Bit()) ? 120 : 60;
2931 SDValue Ptr = DAG.getNode(ISD::ADD,
2932 dl, VT,
2933 FrameAddr,
2934 DAG.getIntPtrConstant(Offset, dl));
2935 RetAddr = DAG.getLoad(VT, dl, DAG.getEntryNode(), Ptr, MachinePointerInfo());
2936
2937 return RetAddr;
2938}
2939
2940static SDValue LowerF64Op(SDValue SrcReg64, const SDLoc &dl, SelectionDAG &DAG,
2941 unsigned opcode) {
2942 assert(SrcReg64.getValueType() == MVT::f64 && "LowerF64Op called on non-double!");
2943 assert(opcode == ISD::FNEG || opcode == ISD::FABS);
2944
2945 // Lower fneg/fabs on f64 to fneg/fabs on f32.
2946 // fneg f64 => fneg f32:sub_even, fmov f32:sub_odd.
2947 // fabs f64 => fabs f32:sub_even, fmov f32:sub_odd.
2948
2949 // Note: in little-endian, the floating-point value is stored in the
2950 // registers are in the opposite order, so the subreg with the sign
2951 // bit is the highest-numbered (odd), rather than the
2952 // lowest-numbered (even).
2953
2954 SDValue Hi32 = DAG.getTargetExtractSubreg(SP::sub_even, dl, MVT::f32,
2955 SrcReg64);
2956 SDValue Lo32 = DAG.getTargetExtractSubreg(SP::sub_odd, dl, MVT::f32,
2957 SrcReg64);
2958
2959 if (DAG.getDataLayout().isLittleEndian())
2960 Lo32 = DAG.getNode(opcode, dl, MVT::f32, Lo32);
2961 else
2962 Hi32 = DAG.getNode(opcode, dl, MVT::f32, Hi32);
2963
2964 SDValue DstReg64 = SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF,
2965 dl, MVT::f64), 0);
2966 DstReg64 = DAG.getTargetInsertSubreg(SP::sub_even, dl, MVT::f64,
2967 DstReg64, Hi32);
2968 DstReg64 = DAG.getTargetInsertSubreg(SP::sub_odd, dl, MVT::f64,
2969 DstReg64, Lo32);
2970 return DstReg64;
2971}
2972
2973// Lower a f128 load into two f64 loads.
2975{
2976 SDLoc dl(Op);
2977 LoadSDNode *LdNode = cast<LoadSDNode>(Op.getNode());
2978 assert(LdNode->getOffset().isUndef() && "Unexpected node type");
2979
2980 Align Alignment = commonAlignment(LdNode->getBaseAlign(), 8);
2981
2982 SDValue Hi64 =
2983 DAG.getLoad(MVT::f64, dl, LdNode->getChain(), LdNode->getBasePtr(),
2984 LdNode->getPointerInfo(), Alignment);
2985 EVT addrVT = LdNode->getBasePtr().getValueType();
2986 SDValue LoPtr = DAG.getNode(ISD::ADD, dl, addrVT,
2987 LdNode->getBasePtr(),
2988 DAG.getConstant(8, dl, addrVT));
2989 SDValue Lo64 = DAG.getLoad(MVT::f64, dl, LdNode->getChain(), LoPtr,
2990 LdNode->getPointerInfo().getWithOffset(8),
2991 Alignment);
2992
2993 SDValue SubRegEven = DAG.getTargetConstant(SP::sub_even64, dl, MVT::i32);
2994 SDValue SubRegOdd = DAG.getTargetConstant(SP::sub_odd64, dl, MVT::i32);
2995
2996 SDNode *InFP128 = DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF,
2997 dl, MVT::f128);
2998 InFP128 = DAG.getMachineNode(TargetOpcode::INSERT_SUBREG, dl,
2999 MVT::f128,
3000 SDValue(InFP128, 0),
3001 Hi64,
3002 SubRegEven);
3003 InFP128 = DAG.getMachineNode(TargetOpcode::INSERT_SUBREG, dl,
3004 MVT::f128,
3005 SDValue(InFP128, 0),
3006 Lo64,
3007 SubRegOdd);
3008 SDValue OutChains[2] = { SDValue(Hi64.getNode(), 1),
3009 SDValue(Lo64.getNode(), 1) };
3010 SDValue OutChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
3011 SDValue Ops[2] = {SDValue(InFP128,0), OutChain};
3012 return DAG.getMergeValues(Ops, dl);
3013}
3014
3016 // We don't have an in-register bswap, so expand bswap(x) into
3017 // load(store-swapped(x)). The reason the swap is done during the store is
3018 // that on some implementations (mainly older ones) ASI-tagged memory
3019 // operations are not pipelined, and generally stores finish faster than
3020 // loads.
3021
3023 MachineFrameInfo &MFI = MF.getFrameInfo();
3024 MVT PtrVT = getPointerTy(DAG.getDataLayout());
3025 SDValue Chain = DAG.getEntryNode();
3026 bool IsLittleEndian = DAG.getDataLayout().isLittleEndian();
3027 SDLoc DL(Op);
3028
3029 SDValue BSwapOp = Op.getOperand(0);
3030 EVT VT = BSwapOp.getValueType();
3031 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
3032 Align Al = DAG.getDataLayout().getPrefTypeAlign(Ty);
3033
3034 // Create a stack object to serve as temporary storage.
3035 int TmpFI = MFI.CreateStackObject(VT.getStoreSize(), Al, false);
3036 SDValue TmpPtr = DAG.getFrameIndex(TmpFI, PtrVT);
3037
3038 // Store-swap the value, then load it back.
3039 SDValue Ops[] = {Chain, BSwapOp, TmpPtr, DAG.getValueType(VT)};
3041 IsLittleEndian ? SPISD::STORE_BIG : SPISD::STORE_LITTLE, DL,
3042 DAG.getVTList(MVT::Other), Ops, VT,
3043 MachinePointerInfo::getFixedStack(MF, TmpFI), std::nullopt,
3045 return DAG.getLoad(VT, DL, ST, TmpPtr,
3047}
3048
3050{
3051 LoadSDNode *LdNode = cast<LoadSDNode>(Op.getNode());
3052
3053 EVT MemVT = LdNode->getMemoryVT();
3054 if (MemVT == MVT::f128)
3055 return LowerF128Load(Op, DAG);
3056
3057 return Op;
3058}
3059
3060// Lower a f128 store into two f64 stores.
3062 SDLoc dl(Op);
3063 StoreSDNode *StNode = cast<StoreSDNode>(Op.getNode());
3064 assert(StNode->getOffset().isUndef() && "Unexpected node type");
3065
3066 SDValue SubRegEven = DAG.getTargetConstant(SP::sub_even64, dl, MVT::i32);
3067 SDValue SubRegOdd = DAG.getTargetConstant(SP::sub_odd64, dl, MVT::i32);
3068
3069 SDNode *Hi64 = DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG,
3070 dl,
3071 MVT::f64,
3072 StNode->getValue(),
3073 SubRegEven);
3074 SDNode *Lo64 = DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG,
3075 dl,
3076 MVT::f64,
3077 StNode->getValue(),
3078 SubRegOdd);
3079
3080 Align Alignment = commonAlignment(StNode->getBaseAlign(), 8);
3081
3082 SDValue OutChains[2];
3083 OutChains[0] =
3084 DAG.getStore(StNode->getChain(), dl, SDValue(Hi64, 0),
3085 StNode->getBasePtr(), StNode->getPointerInfo(),
3086 Alignment);
3087 EVT addrVT = StNode->getBasePtr().getValueType();
3088 SDValue LoPtr = DAG.getNode(ISD::ADD, dl, addrVT,
3089 StNode->getBasePtr(),
3090 DAG.getConstant(8, dl, addrVT));
3091 OutChains[1] = DAG.getStore(StNode->getChain(), dl, SDValue(Lo64, 0), LoPtr,
3092 StNode->getPointerInfo().getWithOffset(8),
3093 Alignment);
3094 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
3095}
3096
3098{
3099 SDLoc dl(Op);
3100 StoreSDNode *St = cast<StoreSDNode>(Op.getNode());
3101
3102 EVT MemVT = St->getMemoryVT();
3103 if (MemVT == MVT::f128)
3104 return LowerF128Store(Op, DAG);
3105
3106 if (MemVT == MVT::i64) {
3107 // Custom handling for i64 stores: turn it into a bitcast and a
3108 // v2i32 store.
3109 SDValue Val = DAG.getNode(ISD::BITCAST, dl, MVT::v2i32, St->getValue());
3110 SDValue Chain = DAG.getStore(
3111 St->getChain(), dl, Val, St->getBasePtr(), St->getPointerInfo(),
3112 St->getBaseAlign(), St->getMemOperand()->getFlags(), St->getAAInfo());
3113 return Chain;
3114 }
3115
3116 return SDValue();
3117}
3118
3120 assert((Op.getOpcode() == ISD::FNEG || Op.getOpcode() == ISD::FABS)
3121 && "invalid opcode");
3122
3123 SDLoc dl(Op);
3124
3125 if (Op.getValueType() == MVT::f64)
3126 return LowerF64Op(Op.getOperand(0), dl, DAG, Op.getOpcode());
3127 if (Op.getValueType() != MVT::f128)
3128 return Op;
3129
3130 // Lower fabs/fneg on f128 to fabs/fneg on f64
3131 // fabs/fneg f128 => fabs/fneg f64:sub_even64, fmov f64:sub_odd64
3132 // (As with LowerF64Op, on little-endian, we need to negate the odd
3133 // subreg)
3134
3135 SDValue SrcReg128 = Op.getOperand(0);
3136 SDValue Hi64 = DAG.getTargetExtractSubreg(SP::sub_even64, dl, MVT::f64,
3137 SrcReg128);
3138 SDValue Lo64 = DAG.getTargetExtractSubreg(SP::sub_odd64, dl, MVT::f64,
3139 SrcReg128);
3140
3141 if (DAG.getDataLayout().isLittleEndian()) {
3142 if (isV9)
3143 Lo64 = DAG.getNode(Op.getOpcode(), dl, MVT::f64, Lo64);
3144 else
3145 Lo64 = LowerF64Op(Lo64, dl, DAG, Op.getOpcode());
3146 } else {
3147 if (isV9)
3148 Hi64 = DAG.getNode(Op.getOpcode(), dl, MVT::f64, Hi64);
3149 else
3150 Hi64 = LowerF64Op(Hi64, dl, DAG, Op.getOpcode());
3151 }
3152
3153 SDValue DstReg128 = SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF,
3154 dl, MVT::f128), 0);
3155 DstReg128 = DAG.getTargetInsertSubreg(SP::sub_even64, dl, MVT::f128,
3156 DstReg128, Hi64);
3157 DstReg128 = DAG.getTargetInsertSubreg(SP::sub_odd64, dl, MVT::f128,
3158 DstReg128, Lo64);
3159 return DstReg128;
3160}
3161
3163 if (isStrongerThanMonotonic(cast<AtomicSDNode>(Op)->getSuccessOrdering())) {
3164 // Expand with a fence.
3165 return SDValue();
3166 }
3167
3168 // Monotonic load/stores are legal.
3169 return Op;
3170}
3171
3173 SelectionDAG &DAG) const {
3174 unsigned IntNo = Op.getConstantOperandVal(0);
3175 switch (IntNo) {
3176 default: return SDValue(); // Don't custom lower most intrinsics.
3177 case Intrinsic::thread_pointer: {
3178 EVT PtrVT = getPointerTy(DAG.getDataLayout());
3179 return DAG.getRegister(SP::G7, PtrVT);
3180 }
3181 }
3182}
3183
3186
3187 bool hasHardQuad = Subtarget->hasHardQuad();
3188 bool isV9 = Subtarget->isV9();
3189 bool is64Bit = Subtarget->is64Bit();
3190
3191 switch (Op.getOpcode()) {
3192 default: llvm_unreachable("Should not custom lower this!");
3193
3194 case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG, *this,
3195 Subtarget);
3196 case ISD::FRAMEADDR: return LowerFRAMEADDR(Op, DAG,
3197 Subtarget);
3199 case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
3200 case ISD::BlockAddress: return LowerBlockAddress(Op, DAG);
3201 case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
3202 case ISD::FP_TO_SINT: return LowerFP_TO_SINT(Op, DAG, *this,
3203 hasHardQuad);
3204 case ISD::SINT_TO_FP: return LowerSINT_TO_FP(Op, DAG, *this,
3205 hasHardQuad);
3206 case ISD::FP_TO_UINT: return LowerFP_TO_UINT(Op, DAG, *this,
3207 hasHardQuad);
3208 case ISD::UINT_TO_FP: return LowerUINT_TO_FP(Op, DAG, *this,
3209 hasHardQuad);
3210 case ISD::BR_CC:
3211 return LowerBR_CC(Op, DAG, *this, hasHardQuad, isV9, is64Bit);
3212 case ISD::SELECT_CC:
3213 return LowerSELECT_CC(Op, DAG, *this, hasHardQuad, isV9, is64Bit);
3214 case ISD::VASTART: return LowerVASTART(Op, DAG, *this);
3215 case ISD::VAARG: return LowerVAARG(Op, DAG);
3217 Subtarget);
3218 case ISD::STACKADDRESS:
3219 return LowerSTACKADDRESS(Op, DAG, *Subtarget);
3220
3221 case ISD::BSWAP:
3222 return LowerBSWAP(Op, DAG);
3223
3224 case ISD::LOAD: return LowerLOAD(Op, DAG);
3225 case ISD::STORE: return LowerSTORE(Op, DAG);
3226 case ISD::FADD:
3227 return LowerF128Op(Op, DAG, RTLIB::ADD_F128, 2);
3228 case ISD::FSUB:
3229 return LowerF128Op(Op, DAG, RTLIB::SUB_F128, 2);
3230 case ISD::FMUL:
3231 return LowerF128Op(Op, DAG, RTLIB::MUL_F128, 2);
3232 case ISD::FDIV:
3233 return LowerF128Op(Op, DAG, RTLIB::DIV_F128, 2);
3234 case ISD::FSQRT:
3235 return LowerF128Op(Op, DAG, RTLIB::SQRT_F128, 1);
3236 case ISD::FABS:
3237 case ISD::FNEG: return LowerFNEGorFABS(Op, DAG, isV9);
3238 case ISD::FP_EXTEND: return LowerF128_FPEXTEND(Op, DAG, *this);
3239 case ISD::FP_ROUND: return LowerF128_FPROUND(Op, DAG, *this);
3240 case ISD::ATOMIC_LOAD:
3241 case ISD::ATOMIC_STORE: return LowerATOMIC_LOAD_STORE(Op, DAG);
3243 }
3244}
3245
3247 const SDLoc &DL,
3248 SelectionDAG &DAG) const {
3249 APInt V = C->getValueAPF().bitcastToAPInt();
3250 SDValue Lo = DAG.getConstant(V.zextOrTrunc(32), DL, MVT::i32);
3251 SDValue Hi = DAG.getConstant(V.lshr(32).zextOrTrunc(32), DL, MVT::i32);
3252 if (DAG.getDataLayout().isLittleEndian())
3253 std::swap(Lo, Hi);
3254 return DAG.getBuildVector(MVT::v2i32, DL, {Hi, Lo});
3255}
3256
3258 DAGCombinerInfo &DCI) const {
3259 SDLoc dl(N);
3260 SDValue Src = N->getOperand(0);
3261
3262 if (isa<ConstantFPSDNode>(Src) && N->getSimpleValueType(0) == MVT::v2i32 &&
3263 Src.getSimpleValueType() == MVT::f64)
3265
3266 return SDValue();
3267}
3268
3270 DAGCombinerInfo &DCI) const {
3271 SDLoc DL(N);
3272 SelectionDAG &DAG = DCI.DAG;
3273 SDValue Op = N->getOperand(0);
3274 EVT VT = N->getValueType(0);
3275 auto *LN = dyn_cast<LoadSDNode>(Op.getNode());
3276
3277 bool IsLittleEndian = DAG.getDataLayout().isLittleEndian();
3278 bool IsAlignedLoad = LN && ISD::isNormalLoad(Op.getNode()) &&
3279 LN->getAlign() >= VT.getScalarStoreSize();
3280
3281 // Turn BSWAP (aligned-LOAD) -> ld*a #ASI_P(_L) on V9.
3282 if (Subtarget->isV9() && IsAlignedLoad && Op.getNode()->hasOneUse() &&
3283 (VT == MVT::i16 || VT == MVT::i32 ||
3284 (Subtarget->is64Bit() && VT == MVT::i64))) {
3285 SDValue Load = Op;
3286 auto *LD = cast<LoadSDNode>(Load);
3287
3288 // Create the byte-swapping load.
3289 SDValue Ops[] = {LD->getChain(), LD->getBasePtr(), DAG.getValueType(VT)};
3290
3291 SDValue BSLoad = DAG.getMemIntrinsicNode(
3292 IsLittleEndian ? SPISD::LOAD_BIG : SPISD::LOAD_LITTLE, DL,
3293 DAG.getVTList(VT == MVT::i64 ? MVT::i64 : MVT::i32, MVT::Other), Ops,
3294 LD->getMemoryVT(), LD->getMemOperand());
3295
3296 // If this is an i16 load, insert the truncate.
3297 SDValue ResVal = BSLoad;
3298 if (VT == MVT::i16)
3299 ResVal = DAG.getNode(ISD::TRUNCATE, DL, MVT::i16, BSLoad);
3300
3301 return DCI.CombineTo(N, ResVal);
3302 }
3303
3304 return SDValue();
3305}
3306
3308 DAGCombinerInfo &DCI) const {
3309 SDLoc DL(N);
3310 SelectionDAG &DAG = DCI.DAG;
3311 SDValue Op = N->getOperand(1);
3312 EVT VT = Op.getValueType();
3313 EVT MemVT = cast<StoreSDNode>(N)->getMemoryVT();
3314 unsigned Opcode = Op.getOpcode();
3315 auto *SN = dyn_cast<StoreSDNode>(N);
3316
3317 bool IsLittleEndian = DAG.getDataLayout().isLittleEndian();
3318 bool IsAlignedStore = SN && SN->getAlign() >= MemVT.getScalarStoreSize();
3319
3320 // Turn aligned-STORE (BSWAP) -> st*a #ASI_P(_L) on V9.
3321 if (Subtarget->isV9() && Opcode == ISD::BSWAP && Op.getNode()->hasOneUse() &&
3322 IsAlignedStore &&
3323 (VT == MVT::i16 || VT == MVT::i32 ||
3324 (Subtarget->is64Bit() && VT == MVT::i64))) {
3325
3326 // st*a can only handle simple types and it makes no sense to store less
3327 // than two bytes in byte-reversed order.
3328 if (MemVT.getSizeInBits() < 16)
3329 return SDValue();
3330
3331 SDValue BSwapOp = Op.getOperand(0);
3332 // Do an any-extend to 32-bits if this is a half-word input.
3333 if (BSwapOp.getValueType() == MVT::i16)
3334 BSwapOp = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, BSwapOp);
3335
3336 // If the type of BSWAP operand is wider than stored memory width
3337 // it needs to be shifted to the right side before st*a.
3338 if (VT.bitsGT(MemVT)) {
3339 unsigned Shift = VT.getSizeInBits() - MemVT.getSizeInBits();
3340 BSwapOp = DAG.getNode(ISD::SRL, DL, VT, BSwapOp,
3341 DAG.getShiftAmountConstant(Shift, VT, DL));
3342 }
3343
3344 SDValue Ops[] = {N->getOperand(0), BSwapOp, N->getOperand(2),
3345 DAG.getValueType(MemVT)};
3346 return DAG.getMemIntrinsicNode(
3347 IsLittleEndian ? SPISD::STORE_BIG : SPISD::STORE_LITTLE, DL,
3348 DAG.getVTList(MVT::Other), Ops, cast<StoreSDNode>(N)->getMemoryVT(),
3349 cast<StoreSDNode>(N)->getMemOperand());
3350 }
3351
3352 return SDValue();
3353}
3354
3356 DAGCombinerInfo &DCI) const {
3357 switch (N->getOpcode()) {
3358 default:
3359 break;
3360 case ISD::BITCAST:
3361 return PerformBITCASTCombine(N, DCI);
3362 case ISD::BSWAP:
3363 return PerformBSWAPCombine(N, DCI);
3364 case ISD::STORE:
3365 return PerformSTORECombine(N, DCI);
3366 }
3367 return SDValue();
3368}
3369
3372 MachineBasicBlock *BB) const {
3373 switch (MI.getOpcode()) {
3374 default: llvm_unreachable("Unknown SELECT_CC!");
3375 case SP::SELECT_CC_Int_ICC:
3376 case SP::SELECT_CC_FP_ICC:
3377 case SP::SELECT_CC_DFP_ICC:
3378 case SP::SELECT_CC_QFP_ICC:
3379 if (Subtarget->isV9())
3380 return expandSelectCC(MI, BB, SP::BPICC);
3381 return expandSelectCC(MI, BB, SP::BCOND);
3382 case SP::SELECT_CC_Int_XCC:
3383 case SP::SELECT_CC_FP_XCC:
3384 case SP::SELECT_CC_DFP_XCC:
3385 case SP::SELECT_CC_QFP_XCC:
3386 return expandSelectCC(MI, BB, SP::BPXCC);
3387 case SP::SELECT_CC_Int_FCC:
3388 case SP::SELECT_CC_FP_FCC:
3389 case SP::SELECT_CC_DFP_FCC:
3390 case SP::SELECT_CC_QFP_FCC:
3391 if (Subtarget->isV9())
3392 return expandSelectCC(MI, BB, SP::FBCOND_V9);
3393 return expandSelectCC(MI, BB, SP::FBCOND);
3394 }
3395}
3396
3399 unsigned BROpcode) const {
3400 const TargetInstrInfo &TII = *Subtarget->getInstrInfo();
3401 DebugLoc dl = MI.getDebugLoc();
3402 unsigned CC = (SPCC::CondCodes)MI.getOperand(3).getImm();
3403
3404 // To "insert" a SELECT_CC instruction, we actually have to insert the
3405 // triangle control-flow pattern. The incoming instruction knows the
3406 // destination vreg to set, the condition code register to branch on, the
3407 // true/false values to select between, and the condition code for the branch.
3408 //
3409 // We produce the following control flow:
3410 // ThisMBB
3411 // | \
3412 // | IfFalseMBB
3413 // | /
3414 // SinkMBB
3415 const BasicBlock *LLVM_BB = BB->getBasicBlock();
3417
3418 MachineBasicBlock *ThisMBB = BB;
3419 MachineFunction *F = BB->getParent();
3420 MachineBasicBlock *IfFalseMBB = F->CreateMachineBasicBlock(LLVM_BB);
3421 MachineBasicBlock *SinkMBB = F->CreateMachineBasicBlock(LLVM_BB);
3422 F->insert(It, IfFalseMBB);
3423 F->insert(It, SinkMBB);
3424
3425 // Transfer the remainder of ThisMBB and its successor edges to SinkMBB.
3426 SinkMBB->splice(SinkMBB->begin(), ThisMBB,
3427 std::next(MachineBasicBlock::iterator(MI)), ThisMBB->end());
3428 SinkMBB->transferSuccessorsAndUpdatePHIs(ThisMBB);
3429
3430 // Set the new successors for ThisMBB.
3431 ThisMBB->addSuccessor(IfFalseMBB);
3432 ThisMBB->addSuccessor(SinkMBB);
3433
3434 BuildMI(ThisMBB, dl, TII.get(BROpcode))
3435 .addMBB(SinkMBB)
3436 .addImm(CC);
3437
3438 // IfFalseMBB just falls through to SinkMBB.
3439 IfFalseMBB->addSuccessor(SinkMBB);
3440
3441 // %Result = phi [ %TrueValue, ThisMBB ], [ %FalseValue, IfFalseMBB ]
3442 BuildMI(*SinkMBB, SinkMBB->begin(), dl, TII.get(SP::PHI),
3443 MI.getOperand(0).getReg())
3444 .addReg(MI.getOperand(1).getReg())
3445 .addMBB(ThisMBB)
3446 .addReg(MI.getOperand(2).getReg())
3447 .addMBB(IfFalseMBB);
3448
3449 MI.eraseFromParent(); // The pseudo instruction is gone now.
3450 return SinkMBB;
3451}
3452
3453//===----------------------------------------------------------------------===//
3454// Sparc Inline Assembly Support
3455//===----------------------------------------------------------------------===//
3456
3457/// getConstraintType - Given a constraint letter, return the type of
3458/// constraint it is for this target.
3461 if (Constraint.size() == 1) {
3462 switch (Constraint[0]) {
3463 default: break;
3464 case 'r':
3465 case 'f':
3466 case 'e':
3467 return C_RegisterClass;
3468 case 'I': // SIMM13
3469 return C_Immediate;
3470 }
3471 }
3472
3473 return TargetLowering::getConstraintType(Constraint);
3474}
3475
3478 const char *constraint) const {
3480 Value *CallOperandVal = info.CallOperandVal;
3481 // If we don't have a value, we can't do a match,
3482 // but allow it at the lowest weight.
3483 if (!CallOperandVal)
3484 return CW_Default;
3485
3486 // Look at the constraint type.
3487 switch (*constraint) {
3488 default:
3490 break;
3491 case 'I': // SIMM13
3492 if (ConstantInt *C = dyn_cast<ConstantInt>(info.CallOperandVal)) {
3493 if (isInt<13>(C->getSExtValue()))
3494 weight = CW_Constant;
3495 }
3496 break;
3497 }
3498 return weight;
3499}
3500
3501/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
3502/// vector. If it is invalid, don't add anything to Ops.
3504 SDValue Op, StringRef Constraint, std::vector<SDValue> &Ops,
3505 SelectionDAG &DAG) const {
3506 SDValue Result;
3507
3508 // Only support length 1 constraints for now.
3509 if (Constraint.size() > 1)
3510 return;
3511
3512 char ConstraintLetter = Constraint[0];
3513 switch (ConstraintLetter) {
3514 default: break;
3515 case 'I':
3517 if (isInt<13>(C->getSExtValue())) {
3518 Result = DAG.getSignedTargetConstant(C->getSExtValue(), SDLoc(Op),
3519 Op.getValueType());
3520 break;
3521 }
3522 return;
3523 }
3524 }
3525
3526 if (Result.getNode()) {
3527 Ops.push_back(Result);
3528 return;
3529 }
3531}
3532
3533std::pair<unsigned, const TargetRegisterClass *>
3535 StringRef Constraint,
3536 MVT VT) const {
3537 if (Constraint.empty())
3538 return std::make_pair(0U, nullptr);
3539
3540 if (Constraint.size() == 1) {
3541 switch (Constraint[0]) {
3542 case 'r':
3543 if (VT == MVT::v2i32)
3544 return std::make_pair(0U, &SP::IntPairRegClass);
3545 else if (Subtarget->is64Bit())
3546 return std::make_pair(0U, &SP::I64RegsRegClass);
3547 else
3548 return std::make_pair(0U, &SP::IntRegsRegClass);
3549 case 'f':
3550 if (VT == MVT::f32 || VT == MVT::i32)
3551 return std::make_pair(0U, &SP::FPRegsRegClass);
3552 else if (VT == MVT::f64 || VT == MVT::i64)
3553 return std::make_pair(0U, &SP::LowDFPRegsRegClass);
3554 else if (VT == MVT::f128)
3555 return std::make_pair(0U, &SP::LowQFPRegsRegClass);
3556 // This will generate an error message
3557 return std::make_pair(0U, nullptr);
3558 case 'e':
3559 if (VT == MVT::f32 || VT == MVT::i32)
3560 return std::make_pair(0U, &SP::FPRegsRegClass);
3561 else if (VT == MVT::f64 || VT == MVT::i64 )
3562 return std::make_pair(0U, &SP::DFPRegsRegClass);
3563 else if (VT == MVT::f128)
3564 return std::make_pair(0U, &SP::QFPRegsRegClass);
3565 // This will generate an error message
3566 return std::make_pair(0U, nullptr);
3567 }
3568 }
3569
3570 if (Constraint.front() != '{')
3571 return std::make_pair(0U, nullptr);
3572
3573 assert(Constraint.back() == '}' && "Not a brace enclosed constraint?");
3574 StringRef RegName(Constraint.data() + 1, Constraint.size() - 2);
3575 if (RegName.empty())
3576 return std::make_pair(0U, nullptr);
3577
3578 unsigned long long RegNo;
3579 // Handle numbered register aliases.
3580 if (RegName[0] == 'r' &&
3581 getAsUnsignedInteger(RegName.begin() + 1, 10, RegNo)) {
3582 // r0-r7 -> g0-g7
3583 // r8-r15 -> o0-o7
3584 // r16-r23 -> l0-l7
3585 // r24-r31 -> i0-i7
3586 if (RegNo > 31)
3587 return std::make_pair(0U, nullptr);
3588 const char RegTypes[] = {'g', 'o', 'l', 'i'};
3589 char RegType = RegTypes[RegNo / 8];
3590 char RegIndex = '0' + (RegNo % 8);
3591 char Tmp[] = {'{', RegType, RegIndex, '}', 0};
3592 return getRegForInlineAsmConstraint(TRI, Tmp, VT);
3593 }
3594
3595 // Rewrite the fN constraint according to the value type if needed.
3596 if (VT != MVT::f32 && VT != MVT::Other && RegName[0] == 'f' &&
3597 getAsUnsignedInteger(RegName.begin() + 1, 10, RegNo)) {
3598 if (VT == MVT::f64 && (RegNo % 2 == 0)) {
3600 TRI, StringRef("{d" + utostr(RegNo / 2) + "}"), VT);
3601 } else if (VT == MVT::f128 && (RegNo % 4 == 0)) {
3603 TRI, StringRef("{q" + utostr(RegNo / 4) + "}"), VT);
3604 } else {
3605 return std::make_pair(0U, nullptr);
3606 }
3607 }
3608
3609 auto ResultPair =
3611 if (!ResultPair.second)
3612 return std::make_pair(0U, nullptr);
3613
3614 // Force the use of I64Regs over IntRegs for 64-bit values.
3615 if (Subtarget->is64Bit() && VT == MVT::i64) {
3616 assert(ResultPair.second == &SP::IntRegsRegClass &&
3617 "Unexpected register class");
3618 return std::make_pair(ResultPair.first, &SP::I64RegsRegClass);
3619 }
3620
3621 return ResultPair;
3622}
3623
3624bool
3626 // The Sparc target isn't yet aware of offsets.
3627 return false;
3628}
3629
3632 SelectionDAG &DAG) const {
3633
3634 SDLoc dl(N);
3635
3636 RTLIB::Libcall libCall = RTLIB::UNKNOWN_LIBCALL;
3637
3638 switch (N->getOpcode()) {
3639 default:
3640 llvm_unreachable("Do not know how to custom type legalize this operation!");
3641
3642 case ISD::FP_TO_SINT:
3643 case ISD::FP_TO_UINT:
3644 // Custom lower only if it involves f128 or i64.
3645 if (N->getOperand(0).getValueType() != MVT::f128
3646 || N->getValueType(0) != MVT::i64)
3647 return;
3648 libCall = ((N->getOpcode() == ISD::FP_TO_SINT)
3649 ? RTLIB::FPTOSINT_F128_I64
3650 : RTLIB::FPTOUINT_F128_I64);
3651
3652 Results.push_back(LowerF128Op(SDValue(N, 0), DAG, libCall, 1));
3653 return;
3654 case ISD::READCYCLECOUNTER: {
3655 assert(Subtarget->hasLeonCycleCounter());
3656 SDValue Lo = DAG.getCopyFromReg(N->getOperand(0), dl, SP::ASR23, MVT::i32);
3657 SDValue Hi = DAG.getCopyFromReg(Lo, dl, SP::G0, MVT::i32);
3658 SDValue Ops[] = { Lo, Hi };
3659 SDValue Pair = DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, Ops);
3660 Results.push_back(Pair);
3661 Results.push_back(N->getOperand(0));
3662 return;
3663 }
3664 case ISD::SINT_TO_FP:
3665 case ISD::UINT_TO_FP:
3666 // Custom lower only if it involves f128 or i64.
3667 if (N->getValueType(0) != MVT::f128
3668 || N->getOperand(0).getValueType() != MVT::i64)
3669 return;
3670
3671 libCall = ((N->getOpcode() == ISD::SINT_TO_FP)
3672 ? RTLIB::SINTTOFP_I64_F128
3673 : RTLIB::UINTTOFP_I64_F128);
3674
3675 Results.push_back(LowerF128Op(SDValue(N, 0), DAG, libCall, 1));
3676 return;
3677 case ISD::LOAD: {
3679 // Custom handling only for i64: turn i64 load into a v2i32 load,
3680 // and a bitcast.
3681 if (Ld->getValueType(0) != MVT::i64 || Ld->getMemoryVT() != MVT::i64)
3682 return;
3683
3684 SDLoc dl(N);
3685 SDValue LoadRes = DAG.getExtLoad(
3686 Ld->getExtensionType(), dl, MVT::v2i32, Ld->getChain(),
3687 Ld->getBasePtr(), Ld->getPointerInfo(), MVT::v2i32, Ld->getBaseAlign(),
3688 Ld->getMemOperand()->getFlags(), Ld->getAAInfo());
3689
3690 SDValue Res = DAG.getNode(ISD::BITCAST, dl, MVT::i64, LoadRes);
3691 Results.push_back(Res);
3692 Results.push_back(LoadRes.getValue(1));
3693 return;
3694 }
3695 }
3696}
3697
3698// Override to enable LOAD_STACK_GUARD lowering on Linux.
3700 if (!Subtarget->getTargetTriple().isOSLinux())
3702 return true;
3703}
3704
3706 if (Subtarget->isVIS3())
3707 return VT == MVT::f32 || VT == MVT::f64;
3708 return false;
3709}
3710
3712 bool ForCodeSize) const {
3713 if (VT != MVT::f32 && VT != MVT::f64)
3714 return false;
3715 if (Subtarget->isVIS() && Imm.isZero())
3716 return true;
3717 if (Subtarget->isVIS3())
3718 return Imm.isExactlyValue(+0.5) || Imm.isExactlyValue(-0.5) ||
3719 Imm.getExactLog2Abs() == -1;
3720 return false;
3721}
3722
3723bool SparcTargetLowering::isCtlzFast() const { return Subtarget->isVIS3(); }
3724
3726 // We lack native cttz, however,
3727 // On 64-bit targets it is cheap to implement it in terms of popc.
3728 if (Subtarget->is64Bit() && Subtarget->usePopc())
3729 return true;
3730 // Otherwise, implementing cttz in terms of ctlz is still cheap.
3731 return isCheapToSpeculateCtlz(Ty);
3732}
3733
3735 EVT VT) const {
3736 return Subtarget->isUA2007() && !Subtarget->useSoftFloat();
3737}
3738
3740 SDNode *Node) const {
3741 assert(MI.getOpcode() == SP::SUBCCrr || MI.getOpcode() == SP::SUBCCri);
3742 // If the result is dead, replace it with %g0.
3743 if (!Node->hasAnyUseOfValue(0))
3744 MI.getOperand(0).setReg(SP::G0);
3745}
3746
3748 Instruction *Inst,
3749 AtomicOrdering Ord) const {
3750 bool HasStoreSemantics =
3752 if (HasStoreSemantics && isReleaseOrStronger(Ord))
3753 return Builder.CreateFence(AtomicOrdering::Release);
3754 return nullptr;
3755}
3756
3758 Instruction *Inst,
3759 AtomicOrdering Ord) const {
3760 // V8 loads already come with implicit acquire barrier so there's no need to
3761 // emit it again.
3762 bool HasLoadSemantics = isa<AtomicCmpXchgInst, AtomicRMWInst, LoadInst>(Inst);
3763 if (Subtarget->isV9() && HasLoadSemantics && isAcquireOrStronger(Ord))
3764 return Builder.CreateFence(AtomicOrdering::Acquire);
3765
3766 // SC plain stores would need a trailing full barrier.
3768 return Builder.CreateFence(Ord);
3769 return nullptr;
3770}
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
static LPCC::CondCode IntCondCCodeToICC(SDValue CC, const SDLoc &DL, SDValue &RHS, SelectionDAG &DAG)
lazy value info
#define F(x, y, z)
Definition MD5.cpp:54
#define G(x, y, z)
Definition MD5.cpp:55
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
static CodeModel::Model getCodeModel(const PPCSubtarget &S, const TargetMachine &TM, const MachineOperand &MO)
static constexpr MCPhysReg SPReg
static SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
static bool CC_Sparc_Assign_Ret_Split_64(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
static bool CC_Sparc_Assign_Split_64(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static SDValue getFRAMEADDR(uint64_t depth, SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget, bool AlwaysFlush=false)
static unsigned toCallerWindow(unsigned Reg)
static SDValue LowerSTACKADDRESS(SDValue Op, SelectionDAG &DAG, const SparcSubtarget &Subtarget)
static SDValue LowerF128Store(SDValue Op, SelectionDAG &DAG)
static SPCC::CondCodes intCondCCodeToRcond(ISD::CondCode CC)
intCondCCodeToRcond - Convert a DAG integer condition code to a SPARC rcond condition.
static SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG)
static void fixupVariableFloatArgs(SmallVectorImpl< CCValAssign > &ArgLocs, ArrayRef< ISD::OutputArg > Outs)
static SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondCode CC)
FPCondCCodeToFCC - Convert a DAG floatingp oint condition code to a SPARC FCC condition.
static bool isAnyArgRegReserved(const SparcRegisterInfo *TRI, const MachineFunction &MF)
static SDValue getFLUSHW(SDValue Op, SelectionDAG &DAG)
static bool hasReturnsTwiceAttr(SelectionDAG &DAG, SDValue Callee, const CallBase *Call)
static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
static SDValue LowerF128_FPROUND(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI)
static SDValue LowerF64Op(SDValue SrcReg64, const SDLoc &dl, SelectionDAG &DAG, unsigned opcode)
static bool RetCC_Sparc64_Full(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad, bool isV9, bool is64Bit)
static void emitReservedArgRegCallError(const MachineFunction &MF)
static SDValue LowerATOMIC_LOAD_STORE(SDValue Op, SelectionDAG &DAG)
static bool RetCC_Sparc64_Half(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad, bool isV9, bool is64Bit)
static SDValue LowerF128_FPEXTEND(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI)
static SDValue LowerFNEGorFABS(SDValue Op, SelectionDAG &DAG, bool isV9)
static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG)
static bool CC_Sparc64_Half(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static bool CC_Sparc64_Full(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static bool CC_Sparc_Assign_SRet(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static bool Analyze_CC_Sparc64_Half(bool IsReturn, unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static SDValue LowerF128Load(SDValue Op, SelectionDAG &DAG)
static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, const SparcSubtarget *Subtarget)
static SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG)
static void LookThroughSetCC(SDValue &LHS, SDValue &RHS, ISD::CondCode CC, unsigned &SPCC)
static bool Analyze_CC_Sparc64_Full(bool IsReturn, unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
static SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
This file contains some functions that are useful when dealing with strings.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
This file describes how to lower LLVM code to machine code.
static bool is64Bit(const char *name)
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
an instruction that atomically reads a memory location, combines it with another value,...
BinOp getOperation() const
LLVM Basic Block Representation.
Definition BasicBlock.h:62
CCState - This class holds information needed while lowering arguments and return values.
unsigned getFirstUnallocated(ArrayRef< MCPhysReg > Regs) const
getFirstUnallocated - Return the index of the first unallocated register in the set,...
LLVM_ABI void AnalyzeCallResult(const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn Fn)
AnalyzeCallResult - Analyze the return values of a call, incorporating info about the passed values i...
LLVM_ABI bool CheckReturn(const SmallVectorImpl< ISD::OutputArg > &Outs, CCAssignFn Fn)
CheckReturn - Analyze the return values of a function, returning true if the return can be performed ...
LLVM_ABI void AnalyzeReturn(const SmallVectorImpl< ISD::OutputArg > &Outs, CCAssignFn Fn)
AnalyzeReturn - Analyze the returned values of a return, incorporating info about the result values i...
LLVM_ABI void AnalyzeCallOperands(const SmallVectorImpl< ISD::OutputArg > &Outs, CCAssignFn Fn)
AnalyzeCallOperands - Analyze the outgoing arguments to a call, incorporating info about the passed v...
uint64_t getStackSize() const
Returns the size of the currently allocated portion of the stack.
LLVM_ABI void AnalyzeFormalArguments(const SmallVectorImpl< ISD::InputArg > &Ins, CCAssignFn Fn)
AnalyzeFormalArguments - Analyze an array of argument values, incorporating info about the formals in...
CCValAssign - Represent assignment of one arg/retval to a location.
Register getLocReg() const
LocInfo getLocInfo() const
static CCValAssign getReg(unsigned ValNo, MVT ValVT, MCRegister Reg, MVT LocVT, LocInfo HTP, bool IsCustom=false)
static CCValAssign getCustomReg(unsigned ValNo, MVT ValVT, MCRegister Reg, MVT LocVT, LocInfo HTP)
static CCValAssign getMem(unsigned ValNo, MVT ValVT, int64_t Offset, MVT LocVT, LocInfo HTP, bool IsCustom=false)
bool needsCustom() const
bool isExtInLoc() const
int64_t getLocMemOffset() const
static CCValAssign getCustomMem(unsigned ValNo, MVT ValVT, int64_t Offset, MVT LocVT, LocInfo HTP)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This is the shared class of boolean and integer constants.
Definition Constants.h:87
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:217
LLVM_ABI TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
A debug info location.
Definition DebugLoc.h:126
Diagnostic information for unsupported feature in backend.
const Function & getFunction() const
Definition Function.h:166
bool hasStructRetAttr() const
Determine if the function returns a structure through first or second pointer argument.
Definition Function.h:672
Type * getParamStructRetType(unsigned ArgNo) const
Extract the sret type for a parameter.
Definition Function.h:477
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:727
const GlobalValue * getGlobal() const
Module * getParent()
Get the module that this global value is contained inside of...
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This class is used to represent ISD::LOAD nodes.
const SDValue & getBasePtr() const
const SDValue & getOffset() const
ISD::LoadExtType getExtensionType() const
Return whether this is a plain node, or one of the varieties of value-extending loads.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
Machine Value Type.
static auto integer_fixedlen_vector_valuetypes()
static auto integer_valuetypes()
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static MVT getIntegerVT(unsigned BitWidth)
static auto fp_valuetypes()
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
void setFrameAddressIsTaken(bool T)
void setHasTailCall(bool V=true)
void setReturnAddressIsTaken(bool s)
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Register addLiveIn(MCRegister PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
Representation of each machine instruction.
@ MOStore
The memory access writes data.
Flags getFlags() const
Return the raw flags of the source value,.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
void addLiveIn(MCRegister Reg, Register vreg=Register())
addLiveIn - Add the specified register as a live-in.
Align getBaseAlign() const
Returns alignment and volatility of the memory access.
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
const SDValue & getChain() const
EVT getMemoryVT() const
Return the type of the in-memory value.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
const SDValue & getOperand(unsigned i) const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, unsigned TargetFlags=0)
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
SDValue getCopyToReg(SDValue Chain, const SDLoc &dl, Register Reg, SDValue N)
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
SDValue getCALLSEQ_END(SDValue Chain, SDValue Op1, SDValue Op2, SDValue InGlue, const SDLoc &DL)
Return a new CALLSEQ_END node, which always must have a glue result (to ensure it's not CSE'd).
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
SDValue getCopyFromReg(SDValue Chain, const SDLoc &dl, Register Reg, EVT VT)
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
SDValue getSignedTargetConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
SDValue getCALLSEQ_START(SDValue Chain, uint64_t InSize, uint64_t OutSize, const SDLoc &DL)
Return a new CALLSEQ_START node, that starts new call frame, in which InSize bytes are set up inside ...
LLVM_ABI SDValue getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand)
A convenience function for creating TargetInstrInfo::EXTRACT_SUBREG nodes.
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
SDValue getTargetBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, unsigned TargetFlags=0)
MachineFunction & getMachineFunction() const
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
LLVMContext * getContext() const
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
SDValue getTargetConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offset=0, unsigned TargetFlags=0)
LLVM_ABI SDValue getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand, SDValue Subreg)
A convenience function for creating TargetInstrInfo::INSERT_SUBREG nodes.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
int64_t getStackPointerBias() const
The 64-bit ABI uses biased stack and frame pointers, so the stack frame of the current function is th...
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
This callback is invoked when a node result type is illegal for the target, and the operation was reg...
SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const
bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, LLVMContext &Context, const Type *RetTy) const override
This hook should be implemented to check whether the return values described by the Outs array can fi...
bool useSoftFloat() const override
SDValue bitcastConstantFPToInt(ConstantFPSDNode *C, const SDLoc &DL, SelectionDAG &DAG) const
MachineBasicBlock * expandSelectCC(MachineInstr &MI, MachineBasicBlock *BB, unsigned BROpcode) const
bool isFPImmLegal(const APFloat &Imm, EVT VT, bool ForCodeSize) const override
Returns true if the target can instruction select the specified FP immediate natively.
ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const override
Examine constraint string and operand type and determine a weight value.
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
bool isCtlzFast() const override
Return true if ctlz instruction is fast.
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower the incoming (formal) arguments, described by the Ins array,...
ConstraintType getConstraintType(StringRef Constraint) const override
getConstraintType - Given a constraint letter, return the type of constraint it is for this target.
SDValue PerformSTORECombine(SDNode *N, DAGCombinerInfo &DCI) const
SDValue LowerFormalArguments_32(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const
LowerFormalArguments32 - V8 uses a very simple ABI, where all values are passed in either one or two ...
bool isCheapToSpeculateCtlz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower calls into the specified DAG.
bool isCheapToSpeculateCttz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
bool IsEligibleForTailCallOptimization(CCState &CCInfo, CallLoweringInfo &CLI, MachineFunction &MF) const
IsEligibleForTailCallOptimization - Check whether the call is eligible for tail call optimization.
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override
Return true if folding a constant offset with the given GlobalAddress is legal.
bool isFNegFree(EVT VT) const override
Return true if an fneg operation is free to the point where it is never worthwhile to replace it with...
SDValue LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args, SDValue Arg, const SDLoc &DL, SelectionDAG &DAG) const
SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF, SelectionDAG &DAG) const
SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
Instruction * emitLeadingFence(IRBuilderBase &Builder, Instruction *Inst, AtomicOrdering Ord) const override
Inserts in the IR a target-specific intrinsic specifying a fence.
void AdjustInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const override
This method should be implemented by targets that mark instructions with the 'hasPostISelHook' flag.
void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const override
computeKnownBitsForTargetNode - Determine which of the bits specified in Mask are known to be either ...
SDValue LowerCall_64(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT VT) const override
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &dl, SelectionDAG &DAG) const override
This hook must be implemented to lower outgoing return values, described by the Outs array,...
Instruction * emitTrailingFence(IRBuilderBase &Builder, Instruction *Inst, AtomicOrdering Ord) const override
SDValue makeAddress(SDValue Op, SelectionDAG &DAG) const
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const
SDValue LowerReturn_32(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &DL, SelectionDAG &DAG) const
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
SDValue PerformBITCASTCombine(SDNode *N, DAGCombinerInfo &DCI) const
SDValue LowerReturn_64(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &DL, SelectionDAG &DAG) const
SDValue LowerF128Op(SDValue Op, SelectionDAG &DAG, RTLIB::Libcall LibFunc, unsigned numArgs) const
SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
getSetCCResultType - Return the ISD::SETCC ValueType
SDValue LowerCall_32(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const
bool useLoadStackGuardNode(const Module &M) const override
Override to support customized stack guard loading.
AtomicExpansionKind shouldExpandAtomicRMWInIR(const AtomicRMWInst *AI) const override
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
This callback is invoked for operations that are unsupported by the target, which are registered to u...
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const
SDValue LowerFormalArguments_64(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const
SparcTargetLowering(const TargetMachine &TM, const SparcSubtarget &STI)
SDValue LowerBSWAP(SDValue Op, SelectionDAG &DAG) const
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const override
LowerAsmOperandForConstraint - Lower the specified operand into the Ops vector.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
SDValue PerformBSWAPCombine(SDNode *N, DAGCombinerInfo &DCI) const
SDValue LowerF128Compare(SDValue LHS, SDValue RHS, unsigned &SPCC, const SDLoc &DL, SelectionDAG &DAG) const
StackOffset holds a fixed and a scalable offset in bytes.
Definition TypeSize.h:30
This class is used to represent ISD::STORE nodes.
const SDValue & getBasePtr() const
const SDValue & getOffset() const
const SDValue & getValue() const
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
char back() const
Get the last character in the string.
Definition StringRef.h:153
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
char front() const
Get the first character in the string.
Definition StringRef.h:147
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
TargetInstrInfo - Interface to description of machine instruction set.
void setBooleanVectorContents(BooleanContent Ty)
Specify how the target extends the result of a vector boolean value from a vector of i1 to a wider ty...
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
Indicate that the specified operation does not work with the specified type and indicate what to do a...
bool PredictableSelectIsExpensive
Tells the code generator that select is more expensive than a branch if the branch is usually predict...
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
virtual const TargetRegisterClass * getRegClassFor(MVT VT, bool isDivergent=false) const
Return the register class that should be used for the specified value type.
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
const TargetMachine & getTargetMachine() const
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
bool isJumpExpensive() const
Return true if Flow Control is an expensive operation that should be avoided.
void setMaxAtomicSizeInBitsSupported(unsigned SizeInBits)
Set the maximum atomic operation size supported by the backend.
void setMinFunctionAlignment(Align Alignment)
Set the target's minimum function alignment.
void setBooleanContents(BooleanContent Ty)
Specify how the target extends the result of integer and floating point boolean values from i1 to a w...
void computeRegisterProperties(const TargetRegisterInfo *TRI)
Once all of the register classes are added, this allows us to compute derived properties we expose.
void addRegisterClass(MVT VT, const TargetRegisterClass *RC)
Add the specified register class as an available regclass for the specified value type.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified truncating store does not work with the specified type and indicate what ...
void setMinCmpXchgSizeInBits(unsigned SizeInBits)
Sets the minimum cmpxchg or ll/sc size supported by the backend.
void setStackPointerRegisterToSaveRestore(Register R)
If set to a physical register, this specifies the register that llvm.savestack/llvm....
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
void setTargetDAGCombine(ArrayRef< ISD::NodeType > NTs)
Targets should invoke this method for each target independent node that they want to provide a custom...
void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified load with extension does not work with the specified type and indicate wh...
std::vector< ArgListEntry > ArgListTy
void setJumpIsExpensive(bool isExpensive=true)
Tells the code generator not to expand logic operations on comparison predicates into separate sequen...
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA, SelectionDAG &DAG) const
Lower TLS global address SDNode for target independent emulated TLS model.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
bool isPositionIndependent() const
virtual ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const
Examine constraint string and operand type and determine a weight value.
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
TargetLowering(const TargetLowering &)=delete
virtual bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
Primary interface to the complete machine description for the target machine.
TLSModel::Model getTLSModel(const GlobalValue *GV) const
Returns the TLS model which should be used for the given global variable.
bool useEmulatedTLS() const
Returns true if this target uses emulated TLS.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
Definition Type.cpp:180
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
bool isFP128Ty() const
Return true if this is 'fp128'.
Definition Type.h:164
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
self_iterator getIterator()
Definition ilist_node.h:123
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:829
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:127
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:789
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:863
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:520
@ GlobalAddress
Definition ISDOpcodes.h:88
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:890
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
Definition ISDOpcodes.h:280
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:89
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:798
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ BRIND
BRIND - Indirect branch.
@ BR_JT
BR_JT - Jumptable branch.
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:806
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:706
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:578
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ DEBUGTRAP
DEBUGTRAP - Trap intended to get the attention of a debugger.
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:821
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:898
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:988
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:110
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:936
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:567
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:797
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:969
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:866
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ BRCOND
BRCOND - Conditional branch.
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:843
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:536
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
bool isUnsignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs an unsigned comparison when used with intege...
bool isNormalLoad(const SDNode *N)
Returns true if the specified node is a non-extending and unindexed load.
@ FCC_ULE
Definition Sparc.h:74
@ FCC_UG
Definition Sparc.h:64
@ ICC_G
Definition Sparc.h:46
@ REG_LEZ
Definition Sparc.h:97
@ ICC_L
Definition Sparc.h:49
@ FCC_NE
Definition Sparc.h:68
@ ICC_CS
Definition Sparc.h:53
@ FCC_LG
Definition Sparc.h:67
@ ICC_LEU
Definition Sparc.h:51
@ FCC_LE
Definition Sparc.h:73
@ ICC_LE
Definition Sparc.h:47
@ FCC_U
Definition Sparc.h:62
@ ICC_GE
Definition Sparc.h:48
@ FCC_E
Definition Sparc.h:69
@ REG_LZ
Definition Sparc.h:98
@ FCC_L
Definition Sparc.h:65
@ ICC_GU
Definition Sparc.h:50
@ FCC_O
Definition Sparc.h:75
@ ICC_NE
Definition Sparc.h:44
@ FCC_UE
Definition Sparc.h:70
@ REG_NZ
Definition Sparc.h:99
@ ICC_E
Definition Sparc.h:45
@ FCC_GE
Definition Sparc.h:71
@ FCC_UGE
Definition Sparc.h:72
@ REG_Z
Definition Sparc.h:96
@ ICC_CC
Definition Sparc.h:52
@ REG_GEZ
Definition Sparc.h:101
@ FCC_G
Definition Sparc.h:63
@ FCC_UL
Definition Sparc.h:66
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1669
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
Definition MathExtras.h:166
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
@ Known
Known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool isStrongerThanMonotonic(AtomicOrdering AO)
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
std::string utostr(uint64_t X, bool isNeg=false)
bool isReleaseOrStronger(AtomicOrdering AO)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
AtomicOrdering
Atomic ordering for LLVM's memory model.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
DWARFExpression::Operation Op
bool isAcquireOrStronger(AtomicOrdering AO)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool getAsUnsignedInteger(StringRef Str, unsigned Radix, unsigned long long &Result)
Helper functions for StringRef::getAsInteger.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Extended Value Type.
Definition ValueTypes.h:35
EVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
Definition ValueTypes.h:90
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:425
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:404
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
This class contains a discriminated union of information about pointers in memory operands,...
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getGOT(MachineFunction &MF)
Return a MachinePointerInfo record that refers to a GOT entry.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
This contains information for each constraint that we are lowering.
This structure contains all information that is necessary for lowering calls.
SmallVector< ISD::InputArg, 32 > Ins
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
SmallVector< ISD::OutputArg, 32 > Outs
CallLoweringInfo & setChain(SDValue InChain)
CallLoweringInfo & setCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList, AttributeSet ResultAttrs={})
LLVM_ABI SDValue CombineTo(SDNode *N, ArrayRef< SDValue > To, bool AddTo=true)