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 {
1213 StringRef Name(RegName);
1214 Name.consume_front("%");
1216 .Cases({"r24", "i0"}, SP::I0)
1217 .Cases({"r25", "i1"}, SP::I1)
1218 .Cases({"r26", "i2"}, SP::I2)
1219 .Cases({"r27", "i3"}, SP::I3)
1220 .Cases({"r28", "i4"}, SP::I4)
1221 .Cases({"r29", "i5"}, SP::I5)
1222 .Cases({"r30", "i6", "fp"}, SP::I6)
1223 .Cases({"r31", "i7"}, SP::I7)
1224 .Cases({"r8", "o0"}, SP::O0)
1225 .Cases({"r9", "o1"}, SP::O1)
1226 .Cases({"r10", "o2"}, SP::O2)
1227 .Cases({"r11", "o3"}, SP::O3)
1228 .Cases({"r12", "o4"}, SP::O4)
1229 .Cases({"r13", "o5"}, SP::O5)
1230 .Cases({"r14", "o6", "sp"}, SP::O6)
1231 .Cases({"r15", "o7"}, SP::O7)
1232 .Cases({"r16", "l0"}, SP::L0)
1233 .Cases({"r17", "l1"}, SP::L1)
1234 .Cases({"r18", "l2"}, SP::L2)
1235 .Cases({"r19", "l3"}, SP::L3)
1236 .Cases({"r20", "l4"}, SP::L4)
1237 .Cases({"r21", "l5"}, SP::L5)
1238 .Cases({"r22", "l6"}, SP::L6)
1239 .Cases({"r23", "l7"}, SP::L7)
1240 .Cases({"r0", "g0"}, SP::G0)
1241 .Cases({"r1", "g1"}, SP::G1)
1242 .Cases({"r2", "g2"}, SP::G2)
1243 .Cases({"r3", "g3"}, SP::G3)
1244 .Cases({"r4", "g4"}, SP::G4)
1245 .Cases({"r5", "g5"}, SP::G5)
1246 .Cases({"r6", "g6"}, SP::G6)
1247 .Cases({"r7", "g7"}, SP::G7)
1248 .Default(0);
1249
1250 // If we're directly referencing register names
1251 // (e.g in GCC C extension `register int r asm("g1");`),
1252 // make sure that said register is in the reserve list.
1253 const SparcRegisterInfo *TRI = Subtarget->getRegisterInfo();
1254 if (!TRI->isReservedReg(MF, Reg))
1255 Reg = Register();
1256
1257 return Reg;
1258}
1259
1260// Fixup floating point arguments in the ... part of a varargs call.
1261//
1262// The SPARC v9 ABI requires that floating point arguments are treated the same
1263// as integers when calling a varargs function. This does not apply to the
1264// fixed arguments that are part of the function's prototype.
1265//
1266// This function post-processes a CCValAssign array created by
1267// AnalyzeCallOperands().
1270 for (CCValAssign &VA : ArgLocs) {
1271 MVT ValTy = VA.getLocVT();
1272 // FIXME: What about f32 arguments? C promotes them to f64 when calling
1273 // varargs functions.
1274 if (!VA.isRegLoc() || (ValTy != MVT::f64 && ValTy != MVT::f128))
1275 continue;
1276 // The fixed arguments to a varargs function still go in FP registers.
1277 if (!Outs[VA.getValNo()].Flags.isVarArg())
1278 continue;
1279
1280 // This floating point argument should be reassigned.
1281 // Determine the offset into the argument array.
1282 Register firstReg = (ValTy == MVT::f64) ? SP::D0 : SP::Q0;
1283 unsigned argSize = (ValTy == MVT::f64) ? 8 : 16;
1284 unsigned Offset = argSize * (VA.getLocReg() - firstReg);
1285 assert(Offset < 16*8 && "Offset out of range, bad register enum?");
1286
1287 if (Offset < 6*8) {
1288 // This argument should go in %i0-%i5.
1289 unsigned IReg = SP::I0 + Offset/8;
1290 if (ValTy == MVT::f64)
1291 // Full register, just bitconvert into i64.
1292 VA = CCValAssign::getReg(VA.getValNo(), VA.getValVT(), IReg, MVT::i64,
1294 else {
1295 assert(ValTy == MVT::f128 && "Unexpected type!");
1296 // Full register, just bitconvert into i128 -- We will lower this into
1297 // two i64s in LowerCall_64.
1298 VA = CCValAssign::getCustomReg(VA.getValNo(), VA.getValVT(), IReg,
1299 MVT::i128, CCValAssign::BCvt);
1300 }
1301 } else {
1302 // This needs to go to memory, we're out of integer registers.
1303 VA = CCValAssign::getMem(VA.getValNo(), VA.getValVT(), Offset,
1304 VA.getLocVT(), VA.getLocInfo());
1305 }
1306 }
1307}
1308
1309// Lower a call for the 64-bit ABI.
1310SDValue
1312 SmallVectorImpl<SDValue> &InVals) const {
1313 SelectionDAG &DAG = CLI.DAG;
1314 SDLoc DL = CLI.DL;
1315 SDValue Chain = CLI.Chain;
1316 auto PtrVT = getPointerTy(DAG.getDataLayout());
1318
1319 // Analyze operands of the call, assigning locations to each operand.
1321 CCState CCInfo(CLI.CallConv, CLI.IsVarArg, DAG.getMachineFunction(), ArgLocs,
1322 *DAG.getContext());
1323 CCInfo.AnalyzeCallOperands(CLI.Outs, CC_Sparc64);
1324
1326 CCInfo, CLI, DAG.getMachineFunction());
1327
1328 // Get the size of the outgoing arguments stack space requirement.
1329 // The stack offset computed by CC_Sparc64 includes all arguments.
1330 // Called functions expect 6 argument words to exist in the stack frame, used
1331 // or not.
1332 unsigned StackReserved = 6 * 8u;
1333 unsigned ArgsSize = std::max<unsigned>(StackReserved, CCInfo.getStackSize());
1334
1335 // Keep stack frames 16-byte aligned.
1336 ArgsSize = alignTo(ArgsSize, 16);
1337
1338 // Varargs calls require special treatment.
1339 if (CLI.IsVarArg)
1340 fixupVariableFloatArgs(ArgLocs, CLI.Outs);
1341
1342 assert(!CLI.IsTailCall || ArgsSize == StackReserved);
1343
1344 // Adjust the stack pointer to make room for the arguments.
1345 // FIXME: Use hasReservedCallFrame to avoid %sp adjustments around all calls
1346 // with more than 6 arguments.
1347 if (!CLI.IsTailCall)
1348 Chain = DAG.getCALLSEQ_START(Chain, ArgsSize, 0, DL);
1349
1350 // Collect the set of registers to pass to the function and their values.
1351 // This will be emitted as a sequence of CopyToReg nodes glued to the call
1352 // instruction.
1354
1355 // Collect chains from all the memory opeations that copy arguments to the
1356 // stack. They must follow the stack pointer adjustment above and precede the
1357 // call instruction itself.
1358 SmallVector<SDValue, 8> MemOpChains;
1359
1360 for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
1361 const CCValAssign &VA = ArgLocs[i];
1362 SDValue Arg = CLI.OutVals[i];
1363
1364 // Promote the value if needed.
1365 switch (VA.getLocInfo()) {
1366 default:
1367 llvm_unreachable("Unknown location info!");
1368 case CCValAssign::Full:
1369 break;
1370 case CCValAssign::SExt:
1371 Arg = DAG.getNode(ISD::SIGN_EXTEND, DL, VA.getLocVT(), Arg);
1372 break;
1373 case CCValAssign::ZExt:
1374 Arg = DAG.getNode(ISD::ZERO_EXTEND, DL, VA.getLocVT(), Arg);
1375 break;
1376 case CCValAssign::AExt:
1377 Arg = DAG.getNode(ISD::ANY_EXTEND, DL, VA.getLocVT(), Arg);
1378 break;
1379 case CCValAssign::BCvt:
1380 // fixupVariableFloatArgs() may create bitcasts from f128 to i128. But
1381 // SPARC does not support i128 natively. Lower it into two i64, see below.
1382 if (!VA.needsCustom() || VA.getValVT() != MVT::f128
1383 || VA.getLocVT() != MVT::i128)
1384 Arg = DAG.getNode(ISD::BITCAST, DL, VA.getLocVT(), Arg);
1385 break;
1386 }
1387
1388 if (VA.isRegLoc()) {
1389 if (VA.needsCustom() && VA.getValVT() == MVT::f128
1390 && VA.getLocVT() == MVT::i128) {
1391 // Store and reload into the integer register reg and reg+1.
1392 unsigned Offset = 8 * (VA.getLocReg() - SP::I0);
1393 unsigned StackOffset = Offset + Subtarget->getStackPointerBias() + 128;
1394 SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT);
1395 SDValue HiPtrOff = DAG.getIntPtrConstant(StackOffset, DL);
1396 HiPtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, HiPtrOff);
1397 SDValue LoPtrOff = DAG.getIntPtrConstant(StackOffset + 8, DL);
1398 LoPtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, LoPtrOff);
1399
1400 // Store to %sp+BIAS+128+Offset
1401 SDValue Store =
1402 DAG.getStore(Chain, DL, Arg, HiPtrOff, MachinePointerInfo());
1403 // Load into Reg and Reg+1
1404 SDValue Hi64 =
1405 DAG.getLoad(MVT::i64, DL, Store, HiPtrOff, MachinePointerInfo());
1406 SDValue Lo64 =
1407 DAG.getLoad(MVT::i64, DL, Store, LoPtrOff, MachinePointerInfo());
1408
1409 Register HiReg = VA.getLocReg();
1410 Register LoReg = VA.getLocReg() + 1;
1411 if (!CLI.IsTailCall) {
1412 HiReg = toCallerWindow(HiReg);
1413 LoReg = toCallerWindow(LoReg);
1414 }
1415
1416 RegsToPass.push_back(std::make_pair(HiReg, Hi64));
1417 RegsToPass.push_back(std::make_pair(LoReg, Lo64));
1418 continue;
1419 }
1420
1421 // The custom bit on an i32 return value indicates that it should be
1422 // passed in the high bits of the register.
1423 if (VA.getValVT() == MVT::i32 && VA.needsCustom()) {
1424 Arg = DAG.getNode(ISD::SHL, DL, MVT::i64, Arg,
1425 DAG.getConstant(32, DL, MVT::i32));
1426
1427 // The next value may go in the low bits of the same register.
1428 // Handle both at once.
1429 if (i+1 < ArgLocs.size() && ArgLocs[i+1].isRegLoc() &&
1430 ArgLocs[i+1].getLocReg() == VA.getLocReg()) {
1431 SDValue NV = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64,
1432 CLI.OutVals[i+1]);
1433 Arg = DAG.getNode(ISD::OR, DL, MVT::i64, Arg, NV);
1434 // Skip the next value, it's already done.
1435 ++i;
1436 }
1437 }
1438
1439 Register Reg = VA.getLocReg();
1440 if (!CLI.IsTailCall)
1441 Reg = toCallerWindow(Reg);
1442 RegsToPass.push_back(std::make_pair(Reg, Arg));
1443 continue;
1444 }
1445
1446 assert(VA.isMemLoc());
1447
1448 // Create a store off the stack pointer for this argument.
1449 SDValue StackPtr = DAG.getRegister(SP::O6, PtrVT);
1450 // The argument area starts at %fp+BIAS+128 in the callee frame,
1451 // %sp+BIAS+128 in ours.
1452 SDValue PtrOff = DAG.getIntPtrConstant(VA.getLocMemOffset() +
1453 Subtarget->getStackPointerBias() +
1454 128, DL);
1455 PtrOff = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, PtrOff);
1456 MemOpChains.push_back(
1457 DAG.getStore(Chain, DL, Arg, PtrOff, MachinePointerInfo()));
1458 }
1459
1460 // Emit all stores, make sure they occur before the call.
1461 if (!MemOpChains.empty())
1462 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains);
1463
1464 // Build a sequence of CopyToReg nodes glued together with token chain and
1465 // glue operands which copy the outgoing args into registers. The InGlue is
1466 // necessary since all emitted instructions must be stuck together in order
1467 // to pass the live physical registers.
1468 SDValue InGlue;
1469 for (const auto &[Reg, N] : RegsToPass) {
1470 Chain = DAG.getCopyToReg(Chain, DL, Reg, N, InGlue);
1471 InGlue = Chain.getValue(1);
1472 }
1473
1474 // If the callee is a GlobalAddress node (quite common, every direct call is)
1475 // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
1476 // Likewise ExternalSymbol -> TargetExternalSymbol.
1477 SDValue Callee = CLI.Callee;
1478 bool hasReturnsTwice = hasReturnsTwiceAttr(DAG, Callee, CLI.CB);
1480 Callee = DAG.getTargetGlobalAddress(G->getGlobal(), DL, PtrVT, 0);
1482 Callee = DAG.getTargetExternalSymbol(E->getSymbol(), PtrVT);
1483
1484 // Build the operands for the call instruction itself.
1486 Ops.push_back(Chain);
1487 Ops.push_back(Callee);
1488 for (const auto &[Reg, N] : RegsToPass)
1489 Ops.push_back(DAG.getRegister(Reg, N.getValueType()));
1490
1491 // Add a register mask operand representing the call-preserved registers.
1492 const SparcRegisterInfo *TRI = Subtarget->getRegisterInfo();
1493 const uint32_t *Mask =
1494 ((hasReturnsTwice) ? TRI->getRTCallPreservedMask(CLI.CallConv)
1495 : TRI->getCallPreservedMask(DAG.getMachineFunction(),
1496 CLI.CallConv));
1497
1498 if (isAnyArgRegReserved(TRI, MF))
1500
1501 assert(Mask && "Missing call preserved mask for calling convention");
1502 Ops.push_back(DAG.getRegisterMask(Mask));
1503
1504 // Make sure the CopyToReg nodes are glued to the call instruction which
1505 // consumes the registers.
1506 if (InGlue.getNode())
1507 Ops.push_back(InGlue);
1508
1509 // Now the call itself.
1510 if (CLI.IsTailCall) {
1512 return DAG.getNode(SPISD::TAIL_CALL, DL, MVT::Other, Ops);
1513 }
1514 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
1515 Chain = DAG.getNode(SPISD::CALL, DL, NodeTys, Ops);
1516 InGlue = Chain.getValue(1);
1517
1518 // Revert the stack pointer immediately after the call.
1519 Chain = DAG.getCALLSEQ_END(Chain, ArgsSize, 0, InGlue, DL);
1520 InGlue = Chain.getValue(1);
1521
1522 // Now extract the return values. This is more or less the same as
1523 // LowerFormalArguments_64.
1524
1525 // Assign locations to each value returned by this call.
1527 CCState RVInfo(CLI.CallConv, CLI.IsVarArg, DAG.getMachineFunction(), RVLocs,
1528 *DAG.getContext());
1529
1530 // Set inreg flag manually for codegen generated library calls that
1531 // return float.
1532 if (CLI.Ins.size() == 1 && CLI.Ins[0].VT == MVT::f32 && !CLI.CB)
1533 CLI.Ins[0].Flags.setInReg();
1534
1535 RVInfo.AnalyzeCallResult(CLI.Ins, RetCC_Sparc64);
1536
1537 // Copy all of the result registers out of their specified physreg.
1538 for (unsigned i = 0; i != RVLocs.size(); ++i) {
1539 CCValAssign &VA = RVLocs[i];
1540 assert(VA.isRegLoc() && "Can only return in registers!");
1541 unsigned Reg = toCallerWindow(VA.getLocReg());
1542
1543 // When returning 'inreg {i32, i32 }', two consecutive i32 arguments can
1544 // reside in the same register in the high and low bits. Reuse the
1545 // CopyFromReg previous node to avoid duplicate copies.
1546 SDValue RV;
1547 if (RegisterSDNode *SrcReg = dyn_cast<RegisterSDNode>(Chain.getOperand(1)))
1548 if (SrcReg->getReg() == Reg && Chain->getOpcode() == ISD::CopyFromReg)
1549 RV = Chain.getValue(0);
1550
1551 // But usually we'll create a new CopyFromReg for a different register.
1552 if (!RV.getNode()) {
1553 RV = DAG.getCopyFromReg(Chain, DL, Reg, RVLocs[i].getLocVT(), InGlue);
1554 Chain = RV.getValue(1);
1555 InGlue = Chain.getValue(2);
1556 }
1557
1558 // Get the high bits for i32 struct elements.
1559 if (VA.getValVT() == MVT::i32 && VA.needsCustom())
1560 RV = DAG.getNode(ISD::SRL, DL, VA.getLocVT(), RV,
1561 DAG.getConstant(32, DL, MVT::i32));
1562
1563 // The callee promoted the return value, so insert an Assert?ext SDNode so
1564 // we won't promote the value again in this function.
1565 switch (VA.getLocInfo()) {
1566 case CCValAssign::SExt:
1567 RV = DAG.getNode(ISD::AssertSext, DL, VA.getLocVT(), RV,
1568 DAG.getValueType(VA.getValVT()));
1569 break;
1570 case CCValAssign::ZExt:
1571 RV = DAG.getNode(ISD::AssertZext, DL, VA.getLocVT(), RV,
1572 DAG.getValueType(VA.getValVT()));
1573 break;
1574 default:
1575 break;
1576 }
1577
1578 // Truncate the register down to the return value type.
1579 if (VA.isExtInLoc())
1580 RV = DAG.getNode(ISD::TRUNCATE, DL, VA.getValVT(), RV);
1581
1582 InVals.push_back(RV);
1583 }
1584
1585 return Chain;
1586}
1587
1588//===----------------------------------------------------------------------===//
1589// TargetLowering Implementation
1590//===----------------------------------------------------------------------===//
1591
1594 if (AI->getOperation() == AtomicRMWInst::Xchg &&
1595 AI->getType()->getPrimitiveSizeInBits() == 32)
1596 return AtomicExpansionKind::None; // Uses xchg instruction
1597
1599}
1600
1601/// intCondCCodeToRcond - Convert a DAG integer condition code to a SPARC
1602/// rcond condition.
1604 switch (CC) {
1605 default:
1606 llvm_unreachable("Unknown/unsigned integer condition code!");
1607 case ISD::SETEQ:
1608 return SPCC::REG_Z;
1609 case ISD::SETNE:
1610 return SPCC::REG_NZ;
1611 case ISD::SETLT:
1612 return SPCC::REG_LZ;
1613 case ISD::SETGT:
1614 return SPCC::REG_GZ;
1615 case ISD::SETLE:
1616 return SPCC::REG_LEZ;
1617 case ISD::SETGE:
1618 return SPCC::REG_GEZ;
1619 }
1620}
1621
1622/// IntCondCCodeToICC - Convert a DAG integer condition code to a SPARC ICC
1623/// condition.
1625 switch (CC) {
1626 default: llvm_unreachable("Unknown integer condition code!");
1627 case ISD::SETEQ: return SPCC::ICC_E;
1628 case ISD::SETNE: return SPCC::ICC_NE;
1629 case ISD::SETLT: return SPCC::ICC_L;
1630 case ISD::SETGT: return SPCC::ICC_G;
1631 case ISD::SETLE: return SPCC::ICC_LE;
1632 case ISD::SETGE: return SPCC::ICC_GE;
1633 case ISD::SETULT: return SPCC::ICC_CS;
1634 case ISD::SETULE: return SPCC::ICC_LEU;
1635 case ISD::SETUGT: return SPCC::ICC_GU;
1636 case ISD::SETUGE: return SPCC::ICC_CC;
1637 }
1638}
1639
1640/// FPCondCCodeToFCC - Convert a DAG floatingp oint condition code to a SPARC
1641/// FCC condition.
1643 switch (CC) {
1644 default: llvm_unreachable("Unknown fp condition code!");
1645 case ISD::SETEQ:
1646 case ISD::SETOEQ: return SPCC::FCC_E;
1647 case ISD::SETNE:
1648 case ISD::SETUNE: return SPCC::FCC_NE;
1649 case ISD::SETLT:
1650 case ISD::SETOLT: return SPCC::FCC_L;
1651 case ISD::SETGT:
1652 case ISD::SETOGT: return SPCC::FCC_G;
1653 case ISD::SETLE:
1654 case ISD::SETOLE: return SPCC::FCC_LE;
1655 case ISD::SETGE:
1656 case ISD::SETOGE: return SPCC::FCC_GE;
1657 case ISD::SETULT: return SPCC::FCC_UL;
1658 case ISD::SETULE: return SPCC::FCC_ULE;
1659 case ISD::SETUGT: return SPCC::FCC_UG;
1660 case ISD::SETUGE: return SPCC::FCC_UGE;
1661 case ISD::SETUO: return SPCC::FCC_U;
1662 case ISD::SETO: return SPCC::FCC_O;
1663 case ISD::SETONE: return SPCC::FCC_LG;
1664 case ISD::SETUEQ: return SPCC::FCC_UE;
1665 }
1666}
1667
1669 const SparcSubtarget &STI)
1670 : TargetLowering(TM, STI), Subtarget(&STI) {
1671 MVT PtrVT = Subtarget->is64Bit() ? MVT::i64 : MVT::i32;
1672
1673 // Instructions which use registers as conditionals examine all the
1674 // bits (as does the pseudo SELECT_CC expansion). I don't think it
1675 // matters much whether it's ZeroOrOneBooleanContent, or
1676 // ZeroOrNegativeOneBooleanContent, so, arbitrarily choose the
1677 // former.
1680
1681 // Set up the register classes.
1682 addRegisterClass(MVT::i32, &SP::IntRegsRegClass);
1683 if (!Subtarget->useSoftFloat()) {
1684 addRegisterClass(MVT::f32, &SP::FPRegsRegClass);
1685 addRegisterClass(MVT::f64, &SP::DFPRegsRegClass);
1686 addRegisterClass(MVT::f128, &SP::QFPRegsRegClass);
1687 }
1688 if (Subtarget->is64Bit()) {
1689 addRegisterClass(MVT::i64, &SP::I64RegsRegClass);
1690 } else {
1691 // On 32bit sparc, we define a double-register 32bit register
1692 // class, as well. This is modeled in LLVM as a 2-vector of i32.
1693 addRegisterClass(MVT::v2i32, &SP::IntPairRegClass);
1694
1695 // ...but almost all operations must be expanded, so set that as
1696 // the default.
1697 for (unsigned Op = 0; Op < ISD::BUILTIN_OP_END; ++Op) {
1698 setOperationAction(Op, MVT::v2i32, Expand);
1699 }
1700 // Truncating/extending stores/loads are also not supported.
1702 setLoadExtAction(ISD::SEXTLOAD, VT, MVT::v2i32, Expand);
1703 setLoadExtAction(ISD::ZEXTLOAD, VT, MVT::v2i32, Expand);
1704 setLoadExtAction(ISD::EXTLOAD, VT, MVT::v2i32, Expand);
1705
1706 setLoadExtAction(ISD::SEXTLOAD, MVT::v2i32, VT, Expand);
1707 setLoadExtAction(ISD::ZEXTLOAD, MVT::v2i32, VT, Expand);
1708 setLoadExtAction(ISD::EXTLOAD, MVT::v2i32, VT, Expand);
1709
1710 setTruncStoreAction(VT, MVT::v2i32, Expand);
1711 setTruncStoreAction(MVT::v2i32, VT, Expand);
1712 }
1713 // However, load and store *are* legal.
1714 setOperationAction(ISD::LOAD, MVT::v2i32, Legal);
1715 setOperationAction(ISD::STORE, MVT::v2i32, Legal);
1718
1719 // And we need to promote i64 loads/stores into vector load/store
1722
1723 // Sadly, this doesn't work:
1724 // AddPromotedToType(ISD::LOAD, MVT::i64, MVT::v2i32);
1725 // AddPromotedToType(ISD::STORE, MVT::i64, MVT::v2i32);
1726 }
1727
1728 // Turn FP extload into load/fpextend
1729 for (MVT VT : MVT::fp_valuetypes()) {
1730 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f16, Expand);
1731 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f32, Expand);
1732 setLoadExtAction(ISD::EXTLOAD, VT, MVT::f64, Expand);
1733 }
1734
1735 // Sparc doesn't have i1 sign extending load
1736 for (MVT VT : MVT::integer_valuetypes())
1737 setLoadExtAction(ISD::SEXTLOAD, VT, MVT::i1, Promote);
1738
1739 // Turn FP truncstore into trunc + store.
1740 setTruncStoreAction(MVT::f32, MVT::f16, Expand);
1741 setTruncStoreAction(MVT::f64, MVT::f16, Expand);
1742 setTruncStoreAction(MVT::f64, MVT::f32, Expand);
1743 setTruncStoreAction(MVT::f128, MVT::f16, Expand);
1744 setTruncStoreAction(MVT::f128, MVT::f32, Expand);
1745 setTruncStoreAction(MVT::f128, MVT::f64, Expand);
1746
1747 // Custom legalize GlobalAddress nodes into LO/HI parts.
1752
1753 // Sparc doesn't have sext_inreg, replace them with shl/sra
1757
1758 // Sparc has no REM or DIVREM operations.
1763
1764 // ... nor does SparcV9.
1765 if (Subtarget->is64Bit()) {
1770 }
1771
1772 // Custom expand fp<->sint
1777
1778 // Custom Expand fp<->uint
1783
1784 // Lower f16 conversion operations into library calls
1791
1793 Subtarget->isVIS3() ? Legal : Expand);
1795 Subtarget->isVIS3() ? Legal : Expand);
1796
1797 // Sparc has no select or setcc: expand to SELECT_CC.
1802
1807
1808 // Sparc doesn't have BRCOND either, it has BR_CC.
1810 setOperationAction(ISD::BRIND, MVT::Other, Expand);
1811 setOperationAction(ISD::BR_JT, MVT::Other, Expand);
1816
1821
1826
1827 if (Subtarget->isVIS3()) {
1830 }
1831
1832 if (Subtarget->is64Bit()) {
1834 Subtarget->isVIS3() ? Legal : Expand);
1836 Subtarget->isVIS3() ? Legal : Expand);
1841
1843 Subtarget->usePopc() ? Legal : Expand);
1845 setOperationAction(ISD::ROTL , MVT::i64, Expand);
1846 setOperationAction(ISD::ROTR , MVT::i64, Expand);
1848 }
1849
1850 // ATOMICs.
1851 // Atomics are supported on SparcV9. 32-bit atomics are also
1852 // supported by some Leon SparcV8 variants. Otherwise, atomics
1853 // are unsupported.
1854 if (Subtarget->isV9()) {
1855 // TODO: we _ought_ to be able to support 64-bit atomics on 32-bit sparcv9,
1856 // but it hasn't been implemented in the backend yet.
1857 if (Subtarget->is64Bit())
1859 else
1861 } else if (Subtarget->hasLeonCasa())
1863 else
1865
1867
1869
1871
1872 // Custom Lower Atomic LOAD/STORE
1875
1876 if (Subtarget->is64Bit()) {
1881 }
1882
1883 if (!Subtarget->isV9()) {
1884 // SparcV8 does not have FNEGD and FABSD.
1887 }
1888
1889 setOperationAction(ISD::FSIN , MVT::f128, Expand);
1890 setOperationAction(ISD::FCOS , MVT::f128, Expand);
1893 setOperationAction(ISD::FMA , MVT::f128, Expand);
1894 setOperationAction(ISD::FSIN , MVT::f64, Expand);
1895 setOperationAction(ISD::FCOS , MVT::f64, Expand);
1898 setOperationAction(ISD::FMA, MVT::f64,
1899 Subtarget->isUA2007() ? Legal : Expand);
1900 setOperationAction(ISD::FSIN , MVT::f32, Expand);
1901 setOperationAction(ISD::FCOS , MVT::f32, Expand);
1904 setOperationAction(ISD::FMA, MVT::f32,
1905 Subtarget->isUA2007() ? Legal : Expand);
1906 setOperationAction(ISD::ROTL , MVT::i32, Expand);
1907 setOperationAction(ISD::ROTR , MVT::i32, Expand);
1908 setOperationAction(ISD::BSWAP, MVT::i32, Subtarget->isV9() ? Custom : Expand);
1912 setOperationAction(ISD::FPOW , MVT::f128, Expand);
1913 setOperationAction(ISD::FPOW , MVT::f64, Expand);
1914 setOperationAction(ISD::FPOW , MVT::f32, Expand);
1915
1919
1920 // Expands to [SU]MUL_LOHI.
1924
1925 if (Subtarget->useSoftMulDiv()) {
1926 // .umul works for both signed and unsigned
1931 }
1932
1933 if (Subtarget->is64Bit()) {
1937 Subtarget->isVIS3() ? Legal : Expand);
1939 Subtarget->isVIS3() ? Legal : Expand);
1940
1944 }
1945
1946 // VASTART needs to be custom lowered to use the VarArgsFrameIndex.
1947 setOperationAction(ISD::VASTART , MVT::Other, Custom);
1948 // VAARG needs to be lowered to not do unaligned accesses for doubles.
1949 setOperationAction(ISD::VAARG , MVT::Other, Custom);
1950
1951 setOperationAction(ISD::TRAP , MVT::Other, Legal);
1953
1954 // Use the default implementation.
1955 setOperationAction(ISD::VACOPY , MVT::Other, Expand);
1956 setOperationAction(ISD::VAEND , MVT::Other, Expand);
1961
1963
1965 Subtarget->usePopc() ? Legal : Expand);
1966
1967 if (Subtarget->isV9() && Subtarget->hasHardQuad()) {
1968 setOperationAction(ISD::LOAD, MVT::f128, Legal);
1969 setOperationAction(ISD::STORE, MVT::f128, Legal);
1970 } else {
1971 setOperationAction(ISD::LOAD, MVT::f128, Custom);
1973 }
1974
1975 if (Subtarget->hasHardQuad()) {
1976 setOperationAction(ISD::FADD, MVT::f128, Legal);
1977 setOperationAction(ISD::FSUB, MVT::f128, Legal);
1978 setOperationAction(ISD::FMUL, MVT::f128, Legal);
1979 setOperationAction(ISD::FDIV, MVT::f128, Legal);
1980 setOperationAction(ISD::FSQRT, MVT::f128, Legal);
1983 if (Subtarget->isV9()) {
1984 setOperationAction(ISD::FNEG, MVT::f128, Legal);
1985 setOperationAction(ISD::FABS, MVT::f128, Legal);
1986 } else {
1987 setOperationAction(ISD::FNEG, MVT::f128, Custom);
1988 setOperationAction(ISD::FABS, MVT::f128, Custom);
1989 }
1990 } else {
1991 // Custom legalize f128 operations.
1992
1993 setOperationAction(ISD::FADD, MVT::f128, Custom);
1994 setOperationAction(ISD::FSUB, MVT::f128, Custom);
1995 setOperationAction(ISD::FMUL, MVT::f128, Custom);
1996 setOperationAction(ISD::FDIV, MVT::f128, Custom);
1998 setOperationAction(ISD::FNEG, MVT::f128, Custom);
1999 setOperationAction(ISD::FABS, MVT::f128, Custom);
2000
2004 }
2005
2006 if (Subtarget->fixAllFDIVSQRT()) {
2007 // Promote FDIVS and FSQRTS to FDIVD and FSQRTD instructions instead as
2008 // the former instructions generate errata on LEON processors.
2011 }
2012
2013 if (Subtarget->hasNoFMULS()) {
2015 }
2016
2017 // Custom combine bitcast between f64 and v2i32
2018 if (!Subtarget->is64Bit())
2020
2021 if (Subtarget->isV9())
2023
2024 if (Subtarget->hasLeonCycleCounter())
2026
2027 if (Subtarget->isVIS3()) {
2032
2033 setOperationAction(ISD::CTTZ, MVT::i32,
2034 Subtarget->is64Bit() ? Promote : Expand);
2037 Subtarget->is64Bit() ? Promote : Expand);
2039 } else if (Subtarget->usePopc()) {
2044
2049 } else {
2053 Subtarget->is64Bit() ? Promote : LibCall);
2055
2056 // FIXME here we don't have any ISA extensions that could help us, so to
2057 // prevent large expansions those should be made into LibCalls.
2062 }
2063
2065
2066 // Some processors have no branch predictor and have pipelines longer than
2067 // what can be covered by the delay slot. This results in a stall, so mark
2068 // branches to be expensive on those processors.
2069 setJumpIsExpensive(Subtarget->hasNoPredictor());
2070 // The high cost of branching means that using conditional moves will
2071 // still be profitable even if the condition is predictable.
2073
2075
2076 computeRegisterProperties(Subtarget->getRegisterInfo());
2077}
2078
2080 return Subtarget->useSoftFloat();
2081}
2082
2084 EVT VT) const {
2085 if (!VT.isVector())
2086 return MVT::i32;
2088}
2089
2090/// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to
2091/// be zero. Op is expected to be a target specific node. Used by DAG
2092/// combiner.
2094 (const SDValue Op,
2096 const APInt &DemandedElts,
2097 const SelectionDAG &DAG,
2098 unsigned Depth) const {
2099 KnownBits Known2;
2100 Known.resetAll();
2101
2102 switch (Op.getOpcode()) {
2103 default: break;
2104 case SPISD::SELECT_ICC:
2105 case SPISD::SELECT_XCC:
2106 case SPISD::SELECT_FCC:
2107 Known = DAG.computeKnownBits(Op.getOperand(1), Depth + 1);
2108 Known2 = DAG.computeKnownBits(Op.getOperand(0), Depth + 1);
2109
2110 // Only known if known in both the LHS and RHS.
2111 Known = Known.intersectWith(Known2);
2112 break;
2113 }
2114}
2115
2116// Look at LHS/RHS/CC and see if they are a lowered setcc instruction. If so
2117// set LHS/RHS and SPCC to the LHS/RHS of the setcc and SPCC to the condition.
2119 ISD::CondCode CC, unsigned &SPCC) {
2120 if (isNullConstant(RHS) && CC == ISD::SETNE &&
2121 (((LHS.getOpcode() == SPISD::SELECT_ICC ||
2122 LHS.getOpcode() == SPISD::SELECT_XCC) &&
2123 LHS.getOperand(3).getOpcode() == SPISD::CMPICC) ||
2124 (LHS.getOpcode() == SPISD::SELECT_FCC &&
2125 (LHS.getOperand(3).getOpcode() == SPISD::CMPFCC ||
2126 LHS.getOperand(3).getOpcode() == SPISD::CMPFCC_V9))) &&
2127 isOneConstant(LHS.getOperand(0)) && isNullConstant(LHS.getOperand(1))) {
2128 SDValue CMPCC = LHS.getOperand(3);
2129 SPCC = LHS.getConstantOperandVal(2);
2130 LHS = CMPCC.getOperand(0);
2131 RHS = CMPCC.getOperand(1);
2132 }
2133}
2134
2135// Convert to a target node and set target flags.
2137 SelectionDAG &DAG) const {
2139 return DAG.getTargetGlobalAddress(GA->getGlobal(),
2140 SDLoc(GA),
2141 GA->getValueType(0),
2142 GA->getOffset(), TF);
2143
2145 return DAG.getTargetConstantPool(CP->getConstVal(), CP->getValueType(0),
2146 CP->getAlign(), CP->getOffset(), TF);
2147
2149 return DAG.getTargetBlockAddress(BA->getBlockAddress(),
2150 Op.getValueType(),
2151 0,
2152 TF);
2153
2155 return DAG.getTargetExternalSymbol(ES->getSymbol(),
2156 ES->getValueType(0), TF);
2157
2158 llvm_unreachable("Unhandled address SDNode");
2159}
2160
2161// Split Op into high and low parts according to HiTF and LoTF.
2162// Return an ADD node combining the parts.
2164 unsigned HiTF, unsigned LoTF,
2165 SelectionDAG &DAG) const {
2166 SDLoc DL(Op);
2167 EVT VT = Op.getValueType();
2168 SDValue Hi = DAG.getNode(SPISD::Hi, DL, VT, withTargetFlags(Op, HiTF, DAG));
2169 SDValue Lo = DAG.getNode(SPISD::Lo, DL, VT, withTargetFlags(Op, LoTF, DAG));
2170 return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo);
2171}
2172
2173// Build SDNodes for producing an address from a GlobalAddress, ConstantPool,
2174// or ExternalSymbol SDNode.
2176 SDLoc DL(Op);
2177 EVT VT = getPointerTy(DAG.getDataLayout());
2178
2179 // Handle PIC mode first.
2180 if (isPositionIndependent()) {
2181 const Module *M = DAG.getMachineFunction().getFunction().getParent();
2182 PICLevel::Level picLevel = M->getPICLevel();
2183
2184 SDValue GlobalBase = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, VT);
2185 // GLOBAL_BASE_REG codegen'ed with call. Inform MFI that this
2186 // function has calls.
2188 MFI.setHasCalls(true);
2189
2190 if (picLevel == PICLevel::SmallPIC) {
2191 // This is the pic13 code model, the GOT is known to be smaller than 8KiB.
2192 // There is no 13-bit form of the GOTDATA_OP relocations, so always load
2193 // the address from the GOT.
2194 SDValue Idx = DAG.getNode(SPISD::Lo, DL, Op.getValueType(),
2195 withTargetFlags(Op, ELF::R_SPARC_GOT13, DAG));
2196 SDValue AbsAddr = DAG.getNode(ISD::ADD, DL, VT, GlobalBase, Idx);
2197 return DAG.getLoad(VT, DL, DAG.getEntryNode(), AbsAddr,
2199 }
2200
2201 // This is the pic32 code model, the GOT is known to be smaller than 4GB.
2202 // Use the GOTDATA_OP sequence:
2203 //
2204 // sethi %gdop_hix22(sym), %r1
2205 // xor %r1, %gdop_lox10(sym), %r1
2206 // ld[x] [%gotbase + %r1], %r2, %gdop(sym)
2207 //
2208 // The three relocations tell the linker this is a GOT load of sym's
2209 // address. If sym binds locally, the linker rewrites the sethi/xor to
2210 // produce sym's offset from the GOT and turns the load into an add, so
2211 // nothing is read from the GOT at run time. This matches GCC and matters
2212 // for code that runs before dynamic relocations are applied, such as the
2213 // dynamic linker's own startup code.
2214 SDValue Hi =
2215 DAG.getNode(SPISD::Hi, DL, VT,
2216 withTargetFlags(Op, ELF::R_SPARC_GOTDATA_OP_HIX22, DAG));
2217 SDValue Lo =
2218 DAG.getNode(SPISD::Lo, DL, VT,
2219 withTargetFlags(Op, ELF::R_SPARC_GOTDATA_OP_LOX10, DAG));
2220 SDValue Idx = DAG.getNode(ISD::XOR, DL, VT, Hi, Lo);
2221 SDValue AbsAddr = DAG.getNode(ISD::ADD, DL, VT, GlobalBase, Idx);
2222 // Attach a GOT memory operand, as for the plain GOT load above, so that
2223 // the load is still known to be invariant and can be hoisted, CSE'd and
2224 // rematerialized.
2225 SDValue Ops[] = {DAG.getEntryNode(), AbsAddr,
2226 withTargetFlags(Op, ELF::R_SPARC_GOTDATA_OP, DAG)};
2227 return DAG.getMemIntrinsicNode(
2228 SPISD::LOAD_GDOP, DL, DAG.getVTList(VT, MVT::Other), Ops, VT,
2230 /*Alignment=*/std::nullopt, MachineMemOperand::MOLoad);
2231 }
2232
2233 // This is one of the absolute code models.
2234 switch(getTargetMachine().getCodeModel()) {
2235 default:
2236 llvm_unreachable("Unsupported absolute code model");
2237 case CodeModel::Small:
2238 // abs32.
2239 return makeHiLoPair(Op, ELF::R_SPARC_HI22, ELF::R_SPARC_LO10, DAG);
2240 case CodeModel::Medium: {
2241 // abs44.
2242 SDValue H44 = makeHiLoPair(Op, ELF::R_SPARC_H44, ELF::R_SPARC_M44, DAG);
2243 H44 = DAG.getNode(ISD::SHL, DL, VT, H44, DAG.getConstant(12, DL, MVT::i32));
2244 SDValue L44 = withTargetFlags(Op, ELF::R_SPARC_L44, DAG);
2245 L44 = DAG.getNode(SPISD::Lo, DL, VT, L44);
2246 return DAG.getNode(ISD::ADD, DL, VT, H44, L44);
2247 }
2248 case CodeModel::Large: {
2249 // abs64.
2250 SDValue Hi = makeHiLoPair(Op, ELF::R_SPARC_HH22, ELF::R_SPARC_HM10, DAG);
2251 Hi = DAG.getNode(ISD::SHL, DL, VT, Hi, DAG.getConstant(32, DL, MVT::i32));
2252 SDValue Lo = makeHiLoPair(Op, ELF::R_SPARC_HI22, ELF::R_SPARC_LO10, DAG);
2253 return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo);
2254 }
2255 }
2256}
2257
2262
2267
2272
2274 SelectionDAG &DAG) const {
2275
2277 if (DAG.getTarget().useEmulatedTLS())
2278 return LowerToTLSEmulatedModel(GA, DAG);
2279
2280 SDLoc DL(GA);
2281 const GlobalValue *GV = GA->getGlobal();
2282 EVT PtrVT = getPointerTy(DAG.getDataLayout());
2283
2285
2286 if (model == TLSModel::GeneralDynamic || model == TLSModel::LocalDynamic) {
2287 unsigned HiTF =
2288 ((model == TLSModel::GeneralDynamic) ? ELF::R_SPARC_TLS_GD_HI22
2289 : ELF::R_SPARC_TLS_LDM_HI22);
2290 unsigned LoTF =
2291 ((model == TLSModel::GeneralDynamic) ? ELF::R_SPARC_TLS_GD_LO10
2292 : ELF::R_SPARC_TLS_LDM_LO10);
2293 unsigned addTF =
2294 ((model == TLSModel::GeneralDynamic) ? ELF::R_SPARC_TLS_GD_ADD
2295 : ELF::R_SPARC_TLS_LDM_ADD);
2296 unsigned callTF =
2297 ((model == TLSModel::GeneralDynamic) ? ELF::R_SPARC_TLS_GD_CALL
2298 : ELF::R_SPARC_TLS_LDM_CALL);
2299
2300 SDValue HiLo = makeHiLoPair(Op, HiTF, LoTF, DAG);
2301 SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
2302 SDValue Argument = DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Base, HiLo,
2303 withTargetFlags(Op, addTF, DAG));
2304
2305 SDValue Chain = DAG.getEntryNode();
2306 SDValue InGlue;
2307
2308 Chain = DAG.getCALLSEQ_START(Chain, 0, 0, DL);
2309 Chain = DAG.getCopyToReg(Chain, DL, SP::O0, Argument, InGlue);
2310 InGlue = Chain.getValue(1);
2311 SDValue Callee = DAG.getTargetExternalSymbol("__tls_get_addr", PtrVT);
2312 SDValue Symbol = withTargetFlags(Op, callTF, DAG);
2313
2314 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
2315 const uint32_t *Mask = Subtarget->getRegisterInfo()->getCallPreservedMask(
2317 assert(Mask && "Missing call preserved mask for calling convention");
2318 SDValue Ops[] = {Chain,
2319 Callee,
2320 Symbol,
2321 DAG.getRegister(SP::O0, PtrVT),
2322 DAG.getRegisterMask(Mask),
2323 InGlue};
2324 Chain = DAG.getNode(SPISD::TLS_CALL, DL, NodeTys, Ops);
2325 InGlue = Chain.getValue(1);
2326 Chain = DAG.getCALLSEQ_END(Chain, 0, 0, InGlue, DL);
2327 InGlue = Chain.getValue(1);
2328 SDValue Ret = DAG.getCopyFromReg(Chain, DL, SP::O0, PtrVT, InGlue);
2329
2330 if (model != TLSModel::LocalDynamic)
2331 return Ret;
2332
2333 SDValue Hi =
2334 DAG.getNode(SPISD::Hi, DL, PtrVT,
2335 withTargetFlags(Op, ELF::R_SPARC_TLS_LDO_HIX22, DAG));
2336 SDValue Lo =
2337 DAG.getNode(SPISD::Lo, DL, PtrVT,
2338 withTargetFlags(Op, ELF::R_SPARC_TLS_LDO_LOX10, DAG));
2339 HiLo = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
2340 return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT, Ret, HiLo,
2341 withTargetFlags(Op, ELF::R_SPARC_TLS_LDO_ADD, DAG));
2342 }
2343
2344 if (model == TLSModel::InitialExec) {
2345 unsigned ldTF = ((PtrVT == MVT::i64) ? ELF::R_SPARC_TLS_IE_LDX
2346 : ELF::R_SPARC_TLS_IE_LD);
2347
2348 SDValue Base = DAG.getNode(SPISD::GLOBAL_BASE_REG, DL, PtrVT);
2349
2350 // GLOBAL_BASE_REG codegen'ed with call. Inform MFI that this
2351 // function has calls.
2353 MFI.setHasCalls(true);
2354
2355 SDValue TGA = makeHiLoPair(Op, ELF::R_SPARC_TLS_IE_HI22,
2356 ELF::R_SPARC_TLS_IE_LO10, DAG);
2357 SDValue Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Base, TGA);
2358 SDValue Ops[] = {DAG.getEntryNode(), Ptr, withTargetFlags(Op, ldTF, DAG)};
2360 SPISD::TLS_LD, DL, DAG.getVTList(PtrVT, MVT::Other), Ops, PtrVT,
2362 /*Alignment=*/std::nullopt, MachineMemOperand::MOLoad);
2363 return DAG.getNode(SPISD::TLS_ADD, DL, PtrVT,
2364 DAG.getRegister(SP::G7, PtrVT), Offset,
2365 withTargetFlags(Op, ELF::R_SPARC_TLS_IE_ADD, DAG));
2366 }
2367
2368 assert(model == TLSModel::LocalExec);
2369 SDValue Hi = DAG.getNode(SPISD::Hi, DL, PtrVT,
2370 withTargetFlags(Op, ELF::R_SPARC_TLS_LE_HIX22, DAG));
2371 SDValue Lo = DAG.getNode(SPISD::Lo, DL, PtrVT,
2372 withTargetFlags(Op, ELF::R_SPARC_TLS_LE_LOX10, DAG));
2373 SDValue Offset = DAG.getNode(ISD::XOR, DL, PtrVT, Hi, Lo);
2374
2375 return DAG.getNode(ISD::ADD, DL, PtrVT,
2376 DAG.getRegister(SP::G7, PtrVT), Offset);
2377}
2378
2380 ArgListTy &Args, SDValue Arg,
2381 const SDLoc &DL,
2382 SelectionDAG &DAG) const {
2384 EVT ArgVT = Arg.getValueType();
2385 Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
2386
2387 if (ArgTy->isFP128Ty()) {
2388 // Create a stack object and pass the pointer to the library function.
2389 int FI = MFI.CreateStackObject(16, Align(8), false);
2390 SDValue FIPtr = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));
2391 Chain = DAG.getStore(Chain, DL, Arg, FIPtr, MachinePointerInfo(), Align(8));
2392 Args.emplace_back(FIPtr, PointerType::getUnqual(ArgTy->getContext()));
2393 } else {
2394 Args.emplace_back(Arg, ArgTy);
2395 }
2396 return Chain;
2397}
2398
2400 RTLIB::Libcall LibFunc,
2401 unsigned numArgs) const {
2402 RTLIB::LibcallImpl LibFuncImpl = DAG.getLibcalls().getLibcallImpl(LibFunc);
2403 if (LibFuncImpl == RTLIB::Unsupported)
2404 return SDValue();
2405
2406 ArgListTy Args;
2407
2409 auto PtrVT = getPointerTy(DAG.getDataLayout());
2410
2411 SDValue Callee = DAG.getExternalSymbol(LibFuncImpl, PtrVT);
2412 Type *RetTy = Op.getValueType().getTypeForEVT(*DAG.getContext());
2413 Type *RetTyABI = RetTy;
2414 SDValue Chain = DAG.getEntryNode();
2415 SDValue RetPtr;
2416
2417 if (RetTy->isFP128Ty()) {
2418 // Create a Stack Object to receive the return value of type f128.
2419 int RetFI = MFI.CreateStackObject(16, Align(8), false);
2420 RetPtr = DAG.getFrameIndex(RetFI, PtrVT);
2421 ArgListEntry Entry(RetPtr, PointerType::getUnqual(RetTy->getContext()));
2422 if (!Subtarget->is64Bit()) {
2423 Entry.IsSRet = true;
2424 Entry.IndirectType = RetTy;
2425 }
2426 Entry.IsReturned = false;
2427 Args.push_back(Entry);
2428 RetTyABI = Type::getVoidTy(*DAG.getContext());
2429 }
2430
2431 assert(Op->getNumOperands() >= numArgs && "Not enough operands!");
2432 for (unsigned i = 0, e = numArgs; i != e; ++i) {
2433 Chain = LowerF128_LibCallArg(Chain, Args, Op.getOperand(i), SDLoc(Op), DAG);
2434 }
2435
2438 CLI.setDebugLoc(SDLoc(Op)).setChain(Chain).setCallee(CC, RetTyABI, Callee,
2439 std::move(Args));
2440
2441 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
2442
2443 // chain is in second result.
2444 if (RetTyABI == RetTy)
2445 return CallInfo.first;
2446
2447 assert (RetTy->isFP128Ty() && "Unexpected return type!");
2448
2449 Chain = CallInfo.second;
2450
2451 // Load RetPtr to get the return value.
2452 return DAG.getLoad(Op.getValueType(), SDLoc(Op), Chain, RetPtr,
2454}
2455
2457 unsigned &SPCC, const SDLoc &DL,
2458 SelectionDAG &DAG) const {
2459
2460 const char *LibCall = nullptr;
2461 bool is64Bit = Subtarget->is64Bit();
2462 switch(SPCC) {
2463 default: llvm_unreachable("Unhandled conditional code!");
2464 case SPCC::FCC_E : LibCall = is64Bit? "_Qp_feq" : "_Q_feq"; break;
2465 case SPCC::FCC_NE : LibCall = is64Bit? "_Qp_fne" : "_Q_fne"; break;
2466 case SPCC::FCC_L : LibCall = is64Bit? "_Qp_flt" : "_Q_flt"; break;
2467 case SPCC::FCC_G : LibCall = is64Bit? "_Qp_fgt" : "_Q_fgt"; break;
2468 case SPCC::FCC_LE : LibCall = is64Bit? "_Qp_fle" : "_Q_fle"; break;
2469 case SPCC::FCC_GE : LibCall = is64Bit? "_Qp_fge" : "_Q_fge"; break;
2470 case SPCC::FCC_UL :
2471 case SPCC::FCC_ULE:
2472 case SPCC::FCC_UG :
2473 case SPCC::FCC_UGE:
2474 case SPCC::FCC_U :
2475 case SPCC::FCC_O :
2476 case SPCC::FCC_LG :
2477 case SPCC::FCC_UE : LibCall = is64Bit? "_Qp_cmp" : "_Q_cmp"; break;
2478 }
2479
2480 auto PtrVT = getPointerTy(DAG.getDataLayout());
2481 SDValue Callee = DAG.getExternalSymbol(LibCall, PtrVT);
2482 Type *RetTy = Type::getInt32Ty(*DAG.getContext());
2483 ArgListTy Args;
2484 SDValue Chain = DAG.getEntryNode();
2485 Chain = LowerF128_LibCallArg(Chain, Args, LHS, DL, DAG);
2486 Chain = LowerF128_LibCallArg(Chain, Args, RHS, DL, DAG);
2487
2489 CLI.setDebugLoc(DL).setChain(Chain)
2490 .setCallee(CallingConv::C, RetTy, Callee, std::move(Args));
2491
2492 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
2493
2494 // result is in first, and chain is in second result.
2495 SDValue Result = CallInfo.first;
2496
2497 switch(SPCC) {
2498 default: {
2499 SDValue RHS = DAG.getConstant(0, DL, Result.getValueType());
2501 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2502 }
2503 case SPCC::FCC_UL : {
2504 SDValue Mask = DAG.getConstant(1, DL, Result.getValueType());
2505 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Mask);
2506 SDValue RHS = DAG.getConstant(0, DL, Result.getValueType());
2508 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2509 }
2510 case SPCC::FCC_ULE: {
2511 SDValue RHS = DAG.getConstant(2, DL, Result.getValueType());
2513 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2514 }
2515 case SPCC::FCC_UG : {
2516 SDValue RHS = DAG.getConstant(1, DL, Result.getValueType());
2517 SPCC = SPCC::ICC_G;
2518 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2519 }
2520 case SPCC::FCC_UGE: {
2521 SDValue RHS = DAG.getConstant(1, DL, Result.getValueType());
2523 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2524 }
2525
2526 case SPCC::FCC_U : {
2527 SDValue RHS = DAG.getConstant(3, DL, Result.getValueType());
2528 SPCC = SPCC::ICC_E;
2529 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2530 }
2531 case SPCC::FCC_O : {
2532 SDValue RHS = DAG.getConstant(3, DL, Result.getValueType());
2534 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2535 }
2536 case SPCC::FCC_LG : {
2537 SDValue One = DAG.getConstant(1, DL, Result.getValueType());
2538 SDValue Two = DAG.getConstant(2, DL, Result.getValueType());
2539 Result = DAG.getNode(ISD::ADD, DL, Result.getValueType(), Result, One);
2540 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Two);
2541 SDValue RHS = DAG.getConstant(0, DL, Result.getValueType());
2543 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2544 }
2545 case SPCC::FCC_UE : {
2546 SDValue One = DAG.getConstant(1, DL, Result.getValueType());
2547 SDValue Two = DAG.getConstant(2, DL, Result.getValueType());
2548 Result = DAG.getNode(ISD::ADD, DL, Result.getValueType(), Result, One);
2549 Result = DAG.getNode(ISD::AND, DL, Result.getValueType(), Result, Two);
2550 SDValue RHS = DAG.getConstant(0, DL, Result.getValueType());
2551 SPCC = SPCC::ICC_E;
2552 return DAG.getNode(SPISD::CMPICC, DL, MVT::Glue, Result, RHS);
2553 }
2554 }
2555}
2556
2557static SDValue
2559 const SparcTargetLowering &TLI) {
2560
2561 if (Op.getOperand(0).getValueType() == MVT::f64)
2562 return TLI.LowerF128Op(Op, DAG, RTLIB::FPEXT_F64_F128, 1);
2563
2564 if (Op.getOperand(0).getValueType() == MVT::f32)
2565 return TLI.LowerF128Op(Op, DAG, RTLIB::FPEXT_F32_F128, 1);
2566
2567 llvm_unreachable("fpextend with non-float operand!");
2568 return SDValue();
2569}
2570
2571static SDValue
2573 const SparcTargetLowering &TLI) {
2574 // FP_ROUND on f64 and f32 are legal.
2575 if (Op.getOperand(0).getValueType() != MVT::f128)
2576 return Op;
2577
2578 if (Op.getValueType() == MVT::f64)
2579 return TLI.LowerF128Op(Op, DAG, RTLIB::FPROUND_F128_F64, 1);
2580 if (Op.getValueType() == MVT::f32)
2581 return TLI.LowerF128Op(Op, DAG, RTLIB::FPROUND_F128_F32, 1);
2582
2583 llvm_unreachable("fpround to non-float!");
2584 return SDValue();
2585}
2586
2588 const SparcTargetLowering &TLI,
2589 bool hasHardQuad) {
2590 SDLoc dl(Op);
2591 EVT VT = Op.getValueType();
2592 assert(VT == MVT::i32 || VT == MVT::i64);
2593
2594 // Expand f128 operations to fp128 abi calls.
2595 if (Op.getOperand(0).getValueType() == MVT::f128
2596 && (!hasHardQuad || !TLI.isTypeLegal(VT))) {
2597 RTLIB::Libcall LibFunc =
2598 VT == MVT::i32 ? RTLIB::FPTOSINT_F128_I32 : RTLIB::FPTOSINT_F128_I64;
2599 return TLI.LowerF128Op(Op, DAG, LibFunc, 1);
2600 }
2601
2602 // Expand if the resulting type is illegal.
2603 if (!TLI.isTypeLegal(VT))
2604 return SDValue();
2605
2606 // Otherwise, Convert the fp value to integer in an FP register.
2607 if (VT == MVT::i32)
2608 Op = DAG.getNode(SPISD::FTOI, dl, MVT::f32, Op.getOperand(0));
2609 else
2610 Op = DAG.getNode(SPISD::FTOX, dl, MVT::f64, Op.getOperand(0));
2611
2612 return DAG.getNode(ISD::BITCAST, dl, VT, Op);
2613}
2614
2616 const SparcTargetLowering &TLI,
2617 bool hasHardQuad) {
2618 SDLoc dl(Op);
2619 EVT OpVT = Op.getOperand(0).getValueType();
2620 assert(OpVT == MVT::i32 || (OpVT == MVT::i64));
2621
2622 EVT floatVT = (OpVT == MVT::i32) ? MVT::f32 : MVT::f64;
2623
2624 // Expand f128 operations to fp128 ABI calls.
2625 if (Op.getValueType() == MVT::f128
2626 && (!hasHardQuad || !TLI.isTypeLegal(OpVT))) {
2627 RTLIB::Libcall LibFunc =
2628 OpVT == MVT::i32 ? RTLIB::SINTTOFP_I32_F128 : RTLIB::SINTTOFP_I64_F128;
2629 return TLI.LowerF128Op(Op, DAG, LibFunc, 1);
2630 }
2631
2632 // Expand if the operand type is illegal.
2633 if (!TLI.isTypeLegal(OpVT))
2634 return SDValue();
2635
2636 // Otherwise, Convert the int value to FP in an FP register.
2637 SDValue Tmp = DAG.getNode(ISD::BITCAST, dl, floatVT, Op.getOperand(0));
2638 unsigned opcode = (OpVT == MVT::i32)? SPISD::ITOF : SPISD::XTOF;
2639 return DAG.getNode(opcode, dl, Op.getValueType(), Tmp);
2640}
2641
2643 const SparcTargetLowering &TLI,
2644 bool hasHardQuad) {
2645 EVT VT = Op.getValueType();
2646
2647 // Expand if it does not involve f128 or the target has support for
2648 // quad floating point instructions and the resulting type is legal.
2649 if (Op.getOperand(0).getValueType() != MVT::f128 ||
2650 (hasHardQuad && TLI.isTypeLegal(VT)))
2651 return SDValue();
2652
2653 assert(VT == MVT::i32 || VT == MVT::i64);
2654
2655 return TLI.LowerF128Op(
2656 Op, DAG,
2657 VT == MVT::i32 ? RTLIB::FPTOUINT_F128_I32 : RTLIB::FPTOUINT_F128_I64, 1);
2658}
2659
2661 const SparcTargetLowering &TLI,
2662 bool hasHardQuad) {
2663 EVT OpVT = Op.getOperand(0).getValueType();
2664 assert(OpVT == MVT::i32 || OpVT == MVT::i64);
2665
2666 // Expand if it does not involve f128 or the target has support for
2667 // quad floating point instructions and the operand type is legal.
2668 if (Op.getValueType() != MVT::f128 || (hasHardQuad && TLI.isTypeLegal(OpVT)))
2669 return SDValue();
2670
2671 return TLI.LowerF128Op(Op, DAG,
2672 OpVT == MVT::i32 ? RTLIB::UINTTOFP_I32_F128
2673 : RTLIB::UINTTOFP_I64_F128,
2674 1);
2675}
2676
2678 const SparcTargetLowering &TLI, bool hasHardQuad,
2679 bool isV9, bool is64Bit) {
2680 SDValue Chain = Op.getOperand(0);
2681 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(1))->get();
2682 SDValue LHS = Op.getOperand(2);
2683 SDValue RHS = Op.getOperand(3);
2684 SDValue Dest = Op.getOperand(4);
2685 SDLoc dl(Op);
2686 unsigned Opc, SPCC = ~0U;
2687
2688 // If this is a br_cc of a "setcc", and if the setcc got lowered into
2689 // an CMP[IF]CC/SELECT_[IF]CC pair, find the original compared values.
2691 assert(LHS.getValueType() == RHS.getValueType());
2692
2693 // Get the condition flag.
2694 SDValue CompareFlag;
2695 if (LHS.getValueType().isInteger()) {
2696 // On V9 processors running in 64-bit mode, if CC compares two `i64`s
2697 // and the RHS is zero we might be able to use a specialized branch.
2698 if (is64Bit && isV9 && LHS.getValueType() == MVT::i64 &&
2700 return DAG.getNode(SPISD::BR_REG, dl, MVT::Other, Chain, Dest,
2701 DAG.getConstant(intCondCCodeToRcond(CC), dl, MVT::i32),
2702 LHS);
2703
2704 CompareFlag = DAG.getNode(SPISD::CMPICC, dl, MVT::Glue, LHS, RHS);
2705 if (SPCC == ~0U) SPCC = IntCondCCodeToICC(CC);
2706 if (isV9)
2707 // 32-bit compares use the icc flags, 64-bit uses the xcc flags.
2708 Opc = LHS.getValueType() == MVT::i32 ? SPISD::BPICC : SPISD::BPXCC;
2709 else
2710 // Non-v9 targets don't have xcc.
2711 Opc = SPISD::BRICC;
2712 } else {
2713 if (!hasHardQuad && LHS.getValueType() == MVT::f128) {
2714 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
2715 CompareFlag = TLI.LowerF128Compare(LHS, RHS, SPCC, dl, DAG);
2716 Opc = isV9 ? SPISD::BPICC : SPISD::BRICC;
2717 } else {
2718 unsigned CmpOpc = isV9 ? SPISD::CMPFCC_V9 : SPISD::CMPFCC;
2719 CompareFlag = DAG.getNode(CmpOpc, dl, MVT::Glue, LHS, RHS);
2720 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
2721 Opc = isV9 ? SPISD::BRFCC_V9 : SPISD::BRFCC;
2722 }
2723 }
2724 return DAG.getNode(Opc, dl, MVT::Other, Chain, Dest,
2725 DAG.getConstant(SPCC, dl, MVT::i32), CompareFlag);
2726}
2727
2729 const SparcTargetLowering &TLI, bool hasHardQuad,
2730 bool isV9, bool is64Bit) {
2731 SDValue LHS = Op.getOperand(0);
2732 SDValue RHS = Op.getOperand(1);
2733 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get();
2734 SDValue TrueVal = Op.getOperand(2);
2735 SDValue FalseVal = Op.getOperand(3);
2736 SDLoc dl(Op);
2737 unsigned Opc, SPCC = ~0U;
2738
2739 // If this is a select_cc of a "setcc", and if the setcc got lowered into
2740 // an CMP[IF]CC/SELECT_[IF]CC pair, find the original compared values.
2742 assert(LHS.getValueType() == RHS.getValueType());
2743
2744 SDValue CompareFlag;
2745 if (LHS.getValueType().isInteger()) {
2746 // On V9 processors running in 64-bit mode, if CC compares two `i64`s
2747 // and the RHS is zero we might be able to use a specialized select.
2748 // All SELECT_CC between any two scalar integer types are eligible for
2749 // lowering to specialized instructions. Additionally, f32 and f64 types
2750 // are also eligible, but for f128 we can only use the specialized
2751 // instruction when we have hardquad.
2752 EVT ValType = TrueVal.getValueType();
2753 bool IsEligibleType = ValType.isScalarInteger() || ValType == MVT::f32 ||
2754 ValType == MVT::f64 ||
2755 (ValType == MVT::f128 && hasHardQuad);
2756 if (is64Bit && isV9 && LHS.getValueType() == MVT::i64 &&
2757 isNullConstant(RHS) && !ISD::isUnsignedIntSetCC(CC) && IsEligibleType)
2758 return DAG.getNode(
2759 SPISD::SELECT_REG, dl, TrueVal.getValueType(), TrueVal, FalseVal,
2760 DAG.getConstant(intCondCCodeToRcond(CC), dl, MVT::i32), LHS);
2761
2762 CompareFlag = DAG.getNode(SPISD::CMPICC, dl, MVT::Glue, LHS, RHS);
2763 Opc = LHS.getValueType() == MVT::i32 ?
2764 SPISD::SELECT_ICC : SPISD::SELECT_XCC;
2765 if (SPCC == ~0U) SPCC = IntCondCCodeToICC(CC);
2766 } else {
2767 if (!hasHardQuad && LHS.getValueType() == MVT::f128) {
2768 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
2769 CompareFlag = TLI.LowerF128Compare(LHS, RHS, SPCC, dl, DAG);
2770 Opc = SPISD::SELECT_ICC;
2771 } else {
2772 unsigned CmpOpc = isV9 ? SPISD::CMPFCC_V9 : SPISD::CMPFCC;
2773 CompareFlag = DAG.getNode(CmpOpc, dl, MVT::Glue, LHS, RHS);
2774 Opc = SPISD::SELECT_FCC;
2775 if (SPCC == ~0U) SPCC = FPCondCCodeToFCC(CC);
2776 }
2777 }
2778 return DAG.getNode(Opc, dl, TrueVal.getValueType(), TrueVal, FalseVal,
2779 DAG.getConstant(SPCC, dl, MVT::i32), CompareFlag);
2780}
2781
2783 const SparcTargetLowering &TLI) {
2786 auto PtrVT = TLI.getPointerTy(DAG.getDataLayout());
2787
2788 // Need frame address to find the address of VarArgsFrameIndex.
2790
2791 // vastart just stores the address of the VarArgsFrameIndex slot into the
2792 // memory location argument.
2793 SDLoc DL(Op);
2794 SDValue Offset =
2795 DAG.getNode(ISD::ADD, DL, PtrVT, DAG.getRegister(SP::I6, PtrVT),
2796 DAG.getIntPtrConstant(FuncInfo->getVarArgsFrameOffset(), DL));
2797 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
2798 return DAG.getStore(Op.getOperand(0), DL, Offset, Op.getOperand(1),
2799 MachinePointerInfo(SV));
2800}
2801
2803 SDNode *Node = Op.getNode();
2804 EVT VT = Node->getValueType(0);
2805 SDValue InChain = Node->getOperand(0);
2806 SDValue VAListPtr = Node->getOperand(1);
2807 EVT PtrVT = VAListPtr.getValueType();
2808 const Value *SV = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2809 SDLoc DL(Node);
2810 SDValue VAList =
2811 DAG.getLoad(PtrVT, DL, InChain, VAListPtr, MachinePointerInfo(SV));
2812 // Increment the pointer, VAList, to the next vaarg.
2813 SDValue NextPtr = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
2815 DL));
2816 // Store the incremented VAList to the legalized pointer.
2817 InChain = DAG.getStore(VAList.getValue(1), DL, NextPtr, VAListPtr,
2818 MachinePointerInfo(SV));
2819 // Load the actual argument out of the pointer VAList.
2820 // We can't count on greater alignment than the word size.
2821 return DAG.getLoad(
2822 VT, DL, InChain, VAList, MachinePointerInfo(),
2823 Align(std::min(PtrVT.getFixedSizeInBits(), VT.getFixedSizeInBits()) / 8));
2824}
2825
2827 const SparcSubtarget &Subtarget) {
2828 SDValue Chain = Op.getOperand(0);
2829 EVT VT = Op->getValueType(0);
2830 SDLoc DL(Op);
2831
2832 MCRegister SPReg = SP::O6;
2833 SDValue SP = DAG.getCopyFromReg(Chain, DL, SPReg, VT);
2834
2835 // Unbias the stack pointer register.
2836 unsigned OffsetToStackStart = Subtarget.getStackPointerBias();
2837 // Move past the register save area: 8 in registers + 8 local registers.
2838 OffsetToStackStart += 16 * (Subtarget.is64Bit() ? 8 : 4);
2839 // Move past the struct return address slot (4 bytes) on SPARC 32-bit.
2840 if (!Subtarget.is64Bit())
2841 OffsetToStackStart += 4;
2842
2843 SDValue StackAddr = DAG.getNode(ISD::ADD, DL, VT, SP,
2844 DAG.getConstant(OffsetToStackStart, DL, VT));
2845 return DAG.getMergeValues({StackAddr, Chain}, DL);
2846}
2847
2849 const SparcSubtarget *Subtarget) {
2850 SDValue Chain = Op.getOperand(0);
2851 SDValue Size = Op.getOperand(1);
2852 SDValue Alignment = Op.getOperand(2);
2853 MaybeAlign MaybeAlignment =
2854 cast<ConstantSDNode>(Alignment)->getMaybeAlignValue();
2855 EVT VT = Size->getValueType(0);
2856 SDLoc dl(Op);
2857
2858 unsigned SPReg = SP::O6;
2859 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
2860
2861 // The resultant pointer needs to be above the register spill area
2862 // at the bottom of the stack.
2863 unsigned regSpillArea;
2864 if (Subtarget->is64Bit()) {
2865 regSpillArea = 128;
2866 } else {
2867 // On Sparc32, the size of the spill area is 92. Unfortunately,
2868 // that's only 4-byte aligned, not 8-byte aligned (the stack
2869 // pointer is 8-byte aligned). So, if the user asked for an 8-byte
2870 // aligned dynamic allocation, we actually need to add 96 to the
2871 // bottom of the stack, instead of 92, to ensure 8-byte alignment.
2872
2873 // That also means adding 4 to the size of the allocation --
2874 // before applying the 8-byte rounding. Unfortunately, we the
2875 // value we get here has already had rounding applied. So, we need
2876 // to add 8, instead, wasting a bit more memory.
2877
2878 // Further, this only actually needs to be done if the required
2879 // alignment is > 4, but, we've lost that info by this point, too,
2880 // so we always apply it.
2881
2882 // (An alternative approach would be to always reserve 96 bytes
2883 // instead of the required 92, but then we'd waste 4 extra bytes
2884 // in every frame, not just those with dynamic stack allocations)
2885
2886 // TODO: modify code in SelectionDAGBuilder to make this less sad.
2887
2888 Size = DAG.getNode(ISD::ADD, dl, VT, Size,
2889 DAG.getConstant(8, dl, VT));
2890 regSpillArea = 96;
2891 }
2892
2893 int64_t Bias = Subtarget->getStackPointerBias();
2894
2895 // Debias and increment SP past the reserved spill area.
2896 // We need the SP to point to the first usable region before calculating
2897 // anything to prevent any of the pointers from becoming out of alignment when
2898 // we rebias the SP later on.
2899 SDValue StartOfUsableStack = DAG.getNode(
2900 ISD::ADD, dl, VT, SP, DAG.getConstant(regSpillArea + Bias, dl, VT));
2901 SDValue AllocatedPtr =
2902 DAG.getNode(ISD::SUB, dl, VT, StartOfUsableStack, Size);
2903
2904 bool IsOveraligned = MaybeAlignment.has_value();
2905 SDValue AlignedPtr =
2906 IsOveraligned
2907 ? DAG.getNode(ISD::AND, dl, VT, AllocatedPtr,
2908 DAG.getSignedConstant(-MaybeAlignment->value(), dl, VT))
2909 : AllocatedPtr;
2910
2911 // Now that we are done, restore the bias and reserved spill area.
2912 SDValue NewSP = DAG.getNode(ISD::SUB, dl, VT, AlignedPtr,
2913 DAG.getConstant(regSpillArea + Bias, dl, VT));
2914 Chain = DAG.getCopyToReg(SP.getValue(1), dl, SPReg, NewSP);
2915 SDValue Ops[2] = {AlignedPtr, Chain};
2916 return DAG.getMergeValues(Ops, dl);
2917}
2918
2919
2921 SDLoc dl(Op);
2922 SDValue Chain = DAG.getNode(SPISD::FLUSHW,
2923 dl, MVT::Other, DAG.getEntryNode());
2924 return Chain;
2925}
2926
2928 const SparcSubtarget *Subtarget,
2929 bool AlwaysFlush = false) {
2931 MFI.setFrameAddressIsTaken(true);
2932
2933 EVT VT = Op.getValueType();
2934 SDLoc dl(Op);
2935 unsigned FrameReg = SP::I6;
2936 unsigned stackBias = Subtarget->getStackPointerBias();
2937
2938 SDValue FrameAddr;
2939 SDValue Chain;
2940
2941 // flush first to make sure the windowed registers' values are in stack
2942 Chain = (depth || AlwaysFlush) ? getFLUSHW(Op, DAG) : DAG.getEntryNode();
2943
2944 FrameAddr = DAG.getCopyFromReg(Chain, dl, FrameReg, VT);
2945
2946 unsigned Offset = (Subtarget->is64Bit()) ? (stackBias + 112) : 56;
2947
2948 while (depth--) {
2949 SDValue Ptr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr,
2950 DAG.getIntPtrConstant(Offset, dl));
2951 FrameAddr = DAG.getLoad(VT, dl, Chain, Ptr, MachinePointerInfo());
2952 }
2953 if (Subtarget->is64Bit())
2954 FrameAddr = DAG.getNode(ISD::ADD, dl, VT, FrameAddr,
2955 DAG.getIntPtrConstant(stackBias, dl));
2956 return FrameAddr;
2957}
2958
2959
2961 const SparcSubtarget *Subtarget) {
2962
2963 uint64_t depth = Op.getConstantOperandVal(0);
2964
2965 return getFRAMEADDR(depth, Op, DAG, Subtarget);
2966
2967}
2968
2970 const SparcTargetLowering &TLI,
2971 const SparcSubtarget *Subtarget) {
2973 MachineFrameInfo &MFI = MF.getFrameInfo();
2974 MFI.setReturnAddressIsTaken(true);
2975
2976 EVT VT = Op.getValueType();
2977 SDLoc dl(Op);
2978 uint64_t depth = Op.getConstantOperandVal(0);
2979
2980 SDValue RetAddr;
2981 if (depth == 0) {
2982 auto PtrVT = TLI.getPointerTy(DAG.getDataLayout());
2983 Register RetReg = MF.addLiveIn(SP::I7, TLI.getRegClassFor(PtrVT));
2984 RetAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, RetReg, VT);
2985 return RetAddr;
2986 }
2987
2988 // Need frame address to find return address of the caller.
2989 SDValue FrameAddr = getFRAMEADDR(depth - 1, Op, DAG, Subtarget, true);
2990
2991 unsigned Offset = (Subtarget->is64Bit()) ? 120 : 60;
2992 SDValue Ptr = DAG.getNode(ISD::ADD,
2993 dl, VT,
2994 FrameAddr,
2995 DAG.getIntPtrConstant(Offset, dl));
2996 RetAddr = DAG.getLoad(VT, dl, DAG.getEntryNode(), Ptr, MachinePointerInfo());
2997
2998 return RetAddr;
2999}
3000
3001static SDValue LowerF64Op(SDValue SrcReg64, const SDLoc &dl, SelectionDAG &DAG,
3002 unsigned opcode) {
3003 assert(SrcReg64.getValueType() == MVT::f64 && "LowerF64Op called on non-double!");
3004 assert(opcode == ISD::FNEG || opcode == ISD::FABS);
3005
3006 // Lower fneg/fabs on f64 to fneg/fabs on f32.
3007 // fneg f64 => fneg f32:sub_even, fmov f32:sub_odd.
3008 // fabs f64 => fabs f32:sub_even, fmov f32:sub_odd.
3009
3010 // Note: in little-endian, the floating-point value is stored in the
3011 // registers are in the opposite order, so the subreg with the sign
3012 // bit is the highest-numbered (odd), rather than the
3013 // lowest-numbered (even).
3014
3015 SDValue Hi32 = DAG.getTargetExtractSubreg(SP::sub_even, dl, MVT::f32,
3016 SrcReg64);
3017 SDValue Lo32 = DAG.getTargetExtractSubreg(SP::sub_odd, dl, MVT::f32,
3018 SrcReg64);
3019
3020 if (DAG.getDataLayout().isLittleEndian())
3021 Lo32 = DAG.getNode(opcode, dl, MVT::f32, Lo32);
3022 else
3023 Hi32 = DAG.getNode(opcode, dl, MVT::f32, Hi32);
3024
3025 SDValue DstReg64 = SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF,
3026 dl, MVT::f64), 0);
3027 DstReg64 = DAG.getTargetInsertSubreg(SP::sub_even, dl, MVT::f64,
3028 DstReg64, Hi32);
3029 DstReg64 = DAG.getTargetInsertSubreg(SP::sub_odd, dl, MVT::f64,
3030 DstReg64, Lo32);
3031 return DstReg64;
3032}
3033
3034// Lower a f128 load into two f64 loads.
3036{
3037 SDLoc dl(Op);
3038 LoadSDNode *LdNode = cast<LoadSDNode>(Op.getNode());
3039 assert(LdNode->getOffset().isUndef() && "Unexpected node type");
3040
3041 Align Alignment = commonAlignment(LdNode->getBaseAlign(), 8);
3042
3043 SDValue Hi64 =
3044 DAG.getLoad(MVT::f64, dl, LdNode->getChain(), LdNode->getBasePtr(),
3045 LdNode->getPointerInfo(), Alignment);
3046 EVT addrVT = LdNode->getBasePtr().getValueType();
3047 SDValue LoPtr = DAG.getNode(ISD::ADD, dl, addrVT,
3048 LdNode->getBasePtr(),
3049 DAG.getConstant(8, dl, addrVT));
3050 SDValue Lo64 = DAG.getLoad(MVT::f64, dl, LdNode->getChain(), LoPtr,
3051 LdNode->getPointerInfo().getWithOffset(8),
3052 Alignment);
3053
3054 SDValue SubRegEven = DAG.getTargetConstant(SP::sub_even64, dl, MVT::i32);
3055 SDValue SubRegOdd = DAG.getTargetConstant(SP::sub_odd64, dl, MVT::i32);
3056
3057 SDNode *InFP128 = DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF,
3058 dl, MVT::f128);
3059 InFP128 = DAG.getMachineNode(TargetOpcode::INSERT_SUBREG, dl,
3060 MVT::f128,
3061 SDValue(InFP128, 0),
3062 Hi64,
3063 SubRegEven);
3064 InFP128 = DAG.getMachineNode(TargetOpcode::INSERT_SUBREG, dl,
3065 MVT::f128,
3066 SDValue(InFP128, 0),
3067 Lo64,
3068 SubRegOdd);
3069 SDValue OutChains[2] = { SDValue(Hi64.getNode(), 1),
3070 SDValue(Lo64.getNode(), 1) };
3071 SDValue OutChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
3072 SDValue Ops[2] = {SDValue(InFP128,0), OutChain};
3073 return DAG.getMergeValues(Ops, dl);
3074}
3075
3077 // We don't have an in-register bswap, so expand bswap(x) into
3078 // load(store-swapped(x)). The reason the swap is done during the store is
3079 // that on some implementations (mainly older ones) ASI-tagged memory
3080 // operations are not pipelined, and generally stores finish faster than
3081 // loads.
3082
3084 MachineFrameInfo &MFI = MF.getFrameInfo();
3085 MVT PtrVT = getPointerTy(DAG.getDataLayout());
3086 SDValue Chain = DAG.getEntryNode();
3087 bool IsLittleEndian = DAG.getDataLayout().isLittleEndian();
3088 SDLoc DL(Op);
3089
3090 SDValue BSwapOp = Op.getOperand(0);
3091 EVT VT = BSwapOp.getValueType();
3092 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
3093 Align Al = DAG.getDataLayout().getPrefTypeAlign(Ty);
3094
3095 // Create a stack object to serve as temporary storage.
3096 int TmpFI = MFI.CreateStackObject(VT.getStoreSize(), Al, false);
3097 SDValue TmpPtr = DAG.getFrameIndex(TmpFI, PtrVT);
3098
3099 // Store-swap the value, then load it back.
3100 SDValue Ops[] = {Chain, BSwapOp, TmpPtr, DAG.getValueType(VT)};
3102 IsLittleEndian ? SPISD::STORE_BIG : SPISD::STORE_LITTLE, DL,
3103 DAG.getVTList(MVT::Other), Ops, VT,
3104 MachinePointerInfo::getFixedStack(MF, TmpFI), std::nullopt,
3106 return DAG.getLoad(VT, DL, ST, TmpPtr,
3108}
3109
3111{
3112 LoadSDNode *LdNode = cast<LoadSDNode>(Op.getNode());
3113
3114 EVT MemVT = LdNode->getMemoryVT();
3115 if (MemVT == MVT::f128)
3116 return LowerF128Load(Op, DAG);
3117
3118 return Op;
3119}
3120
3121// Lower a f128 store into two f64 stores.
3123 SDLoc dl(Op);
3124 StoreSDNode *StNode = cast<StoreSDNode>(Op.getNode());
3125 assert(StNode->getOffset().isUndef() && "Unexpected node type");
3126
3127 SDValue SubRegEven = DAG.getTargetConstant(SP::sub_even64, dl, MVT::i32);
3128 SDValue SubRegOdd = DAG.getTargetConstant(SP::sub_odd64, dl, MVT::i32);
3129
3130 SDNode *Hi64 = DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG,
3131 dl,
3132 MVT::f64,
3133 StNode->getValue(),
3134 SubRegEven);
3135 SDNode *Lo64 = DAG.getMachineNode(TargetOpcode::EXTRACT_SUBREG,
3136 dl,
3137 MVT::f64,
3138 StNode->getValue(),
3139 SubRegOdd);
3140
3141 Align Alignment = commonAlignment(StNode->getBaseAlign(), 8);
3142
3143 SDValue OutChains[2];
3144 OutChains[0] =
3145 DAG.getStore(StNode->getChain(), dl, SDValue(Hi64, 0),
3146 StNode->getBasePtr(), StNode->getPointerInfo(),
3147 Alignment);
3148 EVT addrVT = StNode->getBasePtr().getValueType();
3149 SDValue LoPtr = DAG.getNode(ISD::ADD, dl, addrVT,
3150 StNode->getBasePtr(),
3151 DAG.getConstant(8, dl, addrVT));
3152 OutChains[1] = DAG.getStore(StNode->getChain(), dl, SDValue(Lo64, 0), LoPtr,
3153 StNode->getPointerInfo().getWithOffset(8),
3154 Alignment);
3155 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
3156}
3157
3159{
3160 SDLoc dl(Op);
3161 StoreSDNode *St = cast<StoreSDNode>(Op.getNode());
3162
3163 EVT MemVT = St->getMemoryVT();
3164 if (MemVT == MVT::f128)
3165 return LowerF128Store(Op, DAG);
3166
3167 if (MemVT == MVT::i64) {
3168 // Custom handling for i64 stores: turn it into a bitcast and a
3169 // v2i32 store.
3170 SDValue Val = DAG.getNode(ISD::BITCAST, dl, MVT::v2i32, St->getValue());
3171 SDValue Chain = DAG.getStore(
3172 St->getChain(), dl, Val, St->getBasePtr(), St->getPointerInfo(),
3173 St->getBaseAlign(), St->getMemOperand()->getFlags(), St->getAAInfo());
3174 return Chain;
3175 }
3176
3177 return SDValue();
3178}
3179
3181 assert((Op.getOpcode() == ISD::FNEG || Op.getOpcode() == ISD::FABS)
3182 && "invalid opcode");
3183
3184 SDLoc dl(Op);
3185
3186 if (Op.getValueType() == MVT::f64)
3187 return LowerF64Op(Op.getOperand(0), dl, DAG, Op.getOpcode());
3188 if (Op.getValueType() != MVT::f128)
3189 return Op;
3190
3191 // Lower fabs/fneg on f128 to fabs/fneg on f64
3192 // fabs/fneg f128 => fabs/fneg f64:sub_even64, fmov f64:sub_odd64
3193 // (As with LowerF64Op, on little-endian, we need to negate the odd
3194 // subreg)
3195
3196 SDValue SrcReg128 = Op.getOperand(0);
3197 SDValue Hi64 = DAG.getTargetExtractSubreg(SP::sub_even64, dl, MVT::f64,
3198 SrcReg128);
3199 SDValue Lo64 = DAG.getTargetExtractSubreg(SP::sub_odd64, dl, MVT::f64,
3200 SrcReg128);
3201
3202 if (DAG.getDataLayout().isLittleEndian()) {
3203 if (isV9)
3204 Lo64 = DAG.getNode(Op.getOpcode(), dl, MVT::f64, Lo64);
3205 else
3206 Lo64 = LowerF64Op(Lo64, dl, DAG, Op.getOpcode());
3207 } else {
3208 if (isV9)
3209 Hi64 = DAG.getNode(Op.getOpcode(), dl, MVT::f64, Hi64);
3210 else
3211 Hi64 = LowerF64Op(Hi64, dl, DAG, Op.getOpcode());
3212 }
3213
3214 SDValue DstReg128 = SDValue(DAG.getMachineNode(TargetOpcode::IMPLICIT_DEF,
3215 dl, MVT::f128), 0);
3216 DstReg128 = DAG.getTargetInsertSubreg(SP::sub_even64, dl, MVT::f128,
3217 DstReg128, Hi64);
3218 DstReg128 = DAG.getTargetInsertSubreg(SP::sub_odd64, dl, MVT::f128,
3219 DstReg128, Lo64);
3220 return DstReg128;
3221}
3222
3224 if (isStrongerThanMonotonic(cast<AtomicSDNode>(Op)->getSuccessOrdering())) {
3225 // Expand with a fence.
3226 return SDValue();
3227 }
3228
3229 // Monotonic load/stores are legal.
3230 return Op;
3231}
3232
3234 SDLoc DL(Op);
3235 SDValue Vec = Op.getOperand(0);
3236 SDValue Idx = Op.getOperand(1);
3237 assert(Vec.getSimpleValueType() == MVT::v2i32 && "Unexpected vector type");
3238
3239 // Constant indices are handled by the TableGen patterns.
3240 if (isa<ConstantSDNode>(Idx))
3241 return Op;
3242
3243 EVT VT = Op.getValueType();
3244 EVT IdxVT = Idx.getValueType();
3245 SDValue Elt0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, Vec,
3246 DAG.getConstant(0, DL, IdxVT));
3247 SDValue Elt1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, Vec,
3248 DAG.getConstant(1, DL, IdxVT));
3249 return DAG.getSelectCC(DL, Idx, DAG.getConstant(0, DL, IdxVT), Elt0, Elt1,
3250 ISD::SETEQ);
3251}
3252
3254 SelectionDAG &DAG) const {
3255 unsigned IntNo = Op.getConstantOperandVal(0);
3256 switch (IntNo) {
3257 default: return SDValue(); // Don't custom lower most intrinsics.
3258 case Intrinsic::thread_pointer: {
3259 EVT PtrVT = getPointerTy(DAG.getDataLayout());
3260 return DAG.getRegister(SP::G7, PtrVT);
3261 }
3262 }
3263}
3264
3267
3268 bool hasHardQuad = Subtarget->hasHardQuad();
3269 bool isV9 = Subtarget->isV9();
3270 bool is64Bit = Subtarget->is64Bit();
3271
3272 switch (Op.getOpcode()) {
3273 default: llvm_unreachable("Should not custom lower this!");
3274
3275 case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG, *this,
3276 Subtarget);
3277 case ISD::FRAMEADDR: return LowerFRAMEADDR(Op, DAG,
3278 Subtarget);
3280 case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
3281 case ISD::BlockAddress: return LowerBlockAddress(Op, DAG);
3282 case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
3283 case ISD::FP_TO_SINT: return LowerFP_TO_SINT(Op, DAG, *this,
3284 hasHardQuad);
3285 case ISD::SINT_TO_FP: return LowerSINT_TO_FP(Op, DAG, *this,
3286 hasHardQuad);
3287 case ISD::FP_TO_UINT: return LowerFP_TO_UINT(Op, DAG, *this,
3288 hasHardQuad);
3289 case ISD::UINT_TO_FP: return LowerUINT_TO_FP(Op, DAG, *this,
3290 hasHardQuad);
3291 case ISD::BR_CC:
3292 return LowerBR_CC(Op, DAG, *this, hasHardQuad, isV9, is64Bit);
3293 case ISD::SELECT_CC:
3294 return LowerSELECT_CC(Op, DAG, *this, hasHardQuad, isV9, is64Bit);
3295 case ISD::VASTART: return LowerVASTART(Op, DAG, *this);
3296 case ISD::VAARG: return LowerVAARG(Op, DAG);
3298 Subtarget);
3299 case ISD::STACKADDRESS:
3300 return LowerSTACKADDRESS(Op, DAG, *Subtarget);
3301
3302 case ISD::BSWAP:
3303 return LowerBSWAP(Op, DAG);
3304
3305 case ISD::LOAD: return LowerLOAD(Op, DAG);
3306 case ISD::STORE: return LowerSTORE(Op, DAG);
3307 case ISD::FADD:
3308 return LowerF128Op(Op, DAG, RTLIB::ADD_F128, 2);
3309 case ISD::FSUB:
3310 return LowerF128Op(Op, DAG, RTLIB::SUB_F128, 2);
3311 case ISD::FMUL:
3312 return LowerF128Op(Op, DAG, RTLIB::MUL_F128, 2);
3313 case ISD::FDIV:
3314 return LowerF128Op(Op, DAG, RTLIB::DIV_F128, 2);
3315 case ISD::FSQRT:
3316 return LowerF128Op(Op, DAG, RTLIB::SQRT_F128, 1);
3317 case ISD::FABS:
3318 case ISD::FNEG: return LowerFNEGorFABS(Op, DAG, isV9);
3319 case ISD::FP_EXTEND: return LowerF128_FPEXTEND(Op, DAG, *this);
3320 case ISD::FP_ROUND: return LowerF128_FPROUND(Op, DAG, *this);
3321 case ISD::ATOMIC_LOAD:
3322 case ISD::ATOMIC_STORE: return LowerATOMIC_LOAD_STORE(Op, DAG);
3324 return LowerEXTRACT_VECTOR_ELT(Op, DAG);
3326 }
3327}
3328
3330 const SDLoc &DL,
3331 SelectionDAG &DAG) const {
3332 APInt V = C->getValueAPF().bitcastToAPInt();
3333 SDValue Lo = DAG.getConstant(V.zextOrTrunc(32), DL, MVT::i32);
3334 SDValue Hi = DAG.getConstant(V.lshr(32).zextOrTrunc(32), DL, MVT::i32);
3335 if (DAG.getDataLayout().isLittleEndian())
3336 std::swap(Lo, Hi);
3337 return DAG.getBuildVector(MVT::v2i32, DL, {Hi, Lo});
3338}
3339
3341 DAGCombinerInfo &DCI) const {
3342 SDLoc dl(N);
3343 SDValue Src = N->getOperand(0);
3344
3345 if (isa<ConstantFPSDNode>(Src) && N->getSimpleValueType(0) == MVT::v2i32 &&
3346 Src.getSimpleValueType() == MVT::f64)
3348
3349 return SDValue();
3350}
3351
3353 DAGCombinerInfo &DCI) const {
3354 SDLoc DL(N);
3355 SelectionDAG &DAG = DCI.DAG;
3356 SDValue Op = N->getOperand(0);
3357 EVT VT = N->getValueType(0);
3358 auto *LN = dyn_cast<LoadSDNode>(Op.getNode());
3359
3360 bool IsLittleEndian = DAG.getDataLayout().isLittleEndian();
3361 bool IsAlignedLoad = LN && ISD::isNormalLoad(Op.getNode()) &&
3362 LN->getAlign() >= VT.getScalarStoreSize();
3363
3364 // Turn BSWAP (aligned-LOAD) -> ld*a #ASI_P(_L) on V9.
3365 if (Subtarget->isV9() && IsAlignedLoad && Op.getNode()->hasOneUse() &&
3366 (VT == MVT::i16 || VT == MVT::i32 ||
3367 (Subtarget->is64Bit() && VT == MVT::i64))) {
3368 SDValue Load = Op;
3369 auto *LD = cast<LoadSDNode>(Load);
3370
3371 // Create the byte-swapping load.
3372 SDValue Ops[] = {LD->getChain(), LD->getBasePtr(), DAG.getValueType(VT)};
3373
3374 SDValue BSLoad = DAG.getMemIntrinsicNode(
3375 IsLittleEndian ? SPISD::LOAD_BIG : SPISD::LOAD_LITTLE, DL,
3376 DAG.getVTList(VT == MVT::i64 ? MVT::i64 : MVT::i32, MVT::Other), Ops,
3377 LD->getMemoryVT(), LD->getMemOperand());
3378
3379 // If this is an i16 load, insert the truncate.
3380 SDValue ResVal = BSLoad;
3381 if (VT == MVT::i16)
3382 ResVal = DAG.getNode(ISD::TRUNCATE, DL, MVT::i16, BSLoad);
3383
3384 return DCI.CombineTo(N, ResVal);
3385 }
3386
3387 return SDValue();
3388}
3389
3391 DAGCombinerInfo &DCI) const {
3392 SDLoc DL(N);
3393 SelectionDAG &DAG = DCI.DAG;
3394 SDValue Op = N->getOperand(1);
3395 EVT VT = Op.getValueType();
3396 EVT MemVT = cast<StoreSDNode>(N)->getMemoryVT();
3397 unsigned Opcode = Op.getOpcode();
3398 auto *SN = dyn_cast<StoreSDNode>(N);
3399
3400 bool IsLittleEndian = DAG.getDataLayout().isLittleEndian();
3401 bool IsAlignedStore = SN && SN->getAlign() >= MemVT.getScalarStoreSize();
3402
3403 // Turn aligned-STORE (BSWAP) -> st*a #ASI_P(_L) on V9.
3404 if (Subtarget->isV9() && Opcode == ISD::BSWAP && Op.getNode()->hasOneUse() &&
3405 IsAlignedStore &&
3406 (VT == MVT::i16 || VT == MVT::i32 ||
3407 (Subtarget->is64Bit() && VT == MVT::i64))) {
3408
3409 // st*a can only handle simple types and it makes no sense to store less
3410 // than two bytes in byte-reversed order.
3411 if (MemVT.getSizeInBits() < 16)
3412 return SDValue();
3413
3414 SDValue BSwapOp = Op.getOperand(0);
3415 // Do an any-extend to 32-bits if this is a half-word input.
3416 if (BSwapOp.getValueType() == MVT::i16)
3417 BSwapOp = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, BSwapOp);
3418
3419 // If the type of BSWAP operand is wider than stored memory width
3420 // it needs to be shifted to the right side before st*a.
3421 if (VT.bitsGT(MemVT)) {
3422 unsigned Shift = VT.getSizeInBits() - MemVT.getSizeInBits();
3423 BSwapOp = DAG.getNode(ISD::SRL, DL, VT, BSwapOp,
3424 DAG.getShiftAmountConstant(Shift, VT, DL));
3425 }
3426
3427 SDValue Ops[] = {N->getOperand(0), BSwapOp, N->getOperand(2),
3428 DAG.getValueType(MemVT)};
3429 return DAG.getMemIntrinsicNode(
3430 IsLittleEndian ? SPISD::STORE_BIG : SPISD::STORE_LITTLE, DL,
3431 DAG.getVTList(MVT::Other), Ops, cast<StoreSDNode>(N)->getMemoryVT(),
3432 cast<StoreSDNode>(N)->getMemOperand());
3433 }
3434
3435 return SDValue();
3436}
3437
3439 DAGCombinerInfo &DCI) const {
3440 switch (N->getOpcode()) {
3441 default:
3442 break;
3443 case ISD::BITCAST:
3444 return PerformBITCASTCombine(N, DCI);
3445 case ISD::BSWAP:
3446 return PerformBSWAPCombine(N, DCI);
3447 case ISD::STORE:
3448 return PerformSTORECombine(N, DCI);
3449 }
3450 return SDValue();
3451}
3452
3455 MachineBasicBlock *BB) const {
3456 switch (MI.getOpcode()) {
3457 default: llvm_unreachable("Unknown SELECT_CC!");
3458 case SP::SELECT_CC_Int_ICC:
3459 case SP::SELECT_CC_FP_ICC:
3460 case SP::SELECT_CC_DFP_ICC:
3461 case SP::SELECT_CC_QFP_ICC:
3462 if (Subtarget->isV9())
3463 return expandSelectCC(MI, BB, SP::BPICC);
3464 return expandSelectCC(MI, BB, SP::BCOND);
3465 case SP::SELECT_CC_Int_XCC:
3466 case SP::SELECT_CC_FP_XCC:
3467 case SP::SELECT_CC_DFP_XCC:
3468 case SP::SELECT_CC_QFP_XCC:
3469 return expandSelectCC(MI, BB, SP::BPXCC);
3470 case SP::SELECT_CC_Int_FCC:
3471 case SP::SELECT_CC_FP_FCC:
3472 case SP::SELECT_CC_DFP_FCC:
3473 case SP::SELECT_CC_QFP_FCC:
3474 if (Subtarget->isV9())
3475 return expandSelectCC(MI, BB, SP::FBCOND_V9);
3476 return expandSelectCC(MI, BB, SP::FBCOND);
3477 }
3478}
3479
3482 unsigned BROpcode) const {
3483 const TargetInstrInfo &TII = *Subtarget->getInstrInfo();
3484 DebugLoc dl = MI.getDebugLoc();
3485 unsigned CC = (SPCC::CondCodes)MI.getOperand(3).getImm();
3486
3487 // To "insert" a SELECT_CC instruction, we actually have to insert the
3488 // triangle control-flow pattern. The incoming instruction knows the
3489 // destination vreg to set, the condition code register to branch on, the
3490 // true/false values to select between, and the condition code for the branch.
3491 //
3492 // We produce the following control flow:
3493 // ThisMBB
3494 // | \
3495 // | IfFalseMBB
3496 // | /
3497 // SinkMBB
3498 const BasicBlock *LLVM_BB = BB->getBasicBlock();
3500
3501 MachineBasicBlock *ThisMBB = BB;
3502 MachineFunction *F = BB->getParent();
3503 MachineBasicBlock *IfFalseMBB = F->CreateMachineBasicBlock(LLVM_BB);
3504 MachineBasicBlock *SinkMBB = F->CreateMachineBasicBlock(LLVM_BB);
3505 F->insert(It, IfFalseMBB);
3506 F->insert(It, SinkMBB);
3507
3508 // Transfer the remainder of ThisMBB and its successor edges to SinkMBB.
3509 SinkMBB->splice(SinkMBB->begin(), ThisMBB,
3510 std::next(MachineBasicBlock::iterator(MI)), ThisMBB->end());
3511 SinkMBB->transferSuccessorsAndUpdatePHIs(ThisMBB);
3512
3513 // Set the new successors for ThisMBB.
3514 ThisMBB->addSuccessor(IfFalseMBB);
3515 ThisMBB->addSuccessor(SinkMBB);
3516
3517 BuildMI(ThisMBB, dl, TII.get(BROpcode))
3518 .addMBB(SinkMBB)
3519 .addImm(CC);
3520
3521 // IfFalseMBB just falls through to SinkMBB.
3522 IfFalseMBB->addSuccessor(SinkMBB);
3523
3524 // %Result = phi [ %TrueValue, ThisMBB ], [ %FalseValue, IfFalseMBB ]
3525 BuildMI(*SinkMBB, SinkMBB->begin(), dl, TII.get(SP::PHI),
3526 MI.getOperand(0).getReg())
3527 .addReg(MI.getOperand(1).getReg())
3528 .addMBB(ThisMBB)
3529 .addReg(MI.getOperand(2).getReg())
3530 .addMBB(IfFalseMBB);
3531
3532 MI.eraseFromParent(); // The pseudo instruction is gone now.
3533 return SinkMBB;
3534}
3535
3536//===----------------------------------------------------------------------===//
3537// Sparc Inline Assembly Support
3538//===----------------------------------------------------------------------===//
3539
3540/// getConstraintType - Given a constraint letter, return the type of
3541/// constraint it is for this target.
3544 if (Constraint.size() == 1) {
3545 switch (Constraint[0]) {
3546 default: break;
3547 case 'r':
3548 case 'f':
3549 case 'e':
3550 return C_RegisterClass;
3551 case 'I': // SIMM13
3552 case 'J': // Zero
3553 case 'K': // 32-bit constant with the low 10 bits clear (sethi)
3554 case 'L': // SIMM11
3555 case 'M': // SIMM10
3556 case 'N': // Unsigned 32-bit constant with the low 10 bits clear (sethi)
3557 case 'O': // The constant 4096
3558 return C_Immediate;
3559 }
3560 }
3561
3562 return TargetLowering::getConstraintType(Constraint);
3563}
3564
3565/// isValidImmForConstraint - Return true if constraint is satisfied
3566static bool isValidImmForConstraint(char Constraint, int64_t Val) {
3567 switch (Constraint) {
3568 case 'I':
3569 return isInt<13>(Val);
3570 case 'J':
3571 return Val == 0;
3572 case 'K':
3573 return (isInt<32>(Val) || isUInt<32>(Val)) && (Val & 0x3ff) == 0;
3574 case 'L':
3575 return isInt<11>(Val);
3576 case 'M':
3577 return isInt<10>(Val);
3578 case 'N':
3579 return isUInt<32>(Val) && (Val & 0x3ff) == 0;
3580 case 'O':
3581 return Val == 4096;
3582 default:
3583 return false;
3584 }
3585}
3586
3589 const char *constraint) const {
3591 Value *CallOperandVal = info.CallOperandVal;
3592 // If we don't have a value, we can't do a match,
3593 // but allow it at the lowest weight.
3594 if (!CallOperandVal)
3595 return CW_Default;
3596
3597 // Look at the constraint type.
3598 switch (*constraint) {
3599 default:
3601 break;
3602 case 'I': // SIMM13
3603 case 'J':
3604 case 'K':
3605 case 'L':
3606 case 'M':
3607 case 'N':
3608 case 'O':
3609 if (ConstantInt *C = dyn_cast<ConstantInt>(info.CallOperandVal)) {
3610 if (isValidImmForConstraint(*constraint, C->getSExtValue()))
3611 weight = CW_Constant;
3612 }
3613 break;
3614 }
3615 return weight;
3616}
3617
3618/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
3619/// vector. If it is invalid, don't add anything to Ops.
3621 SDValue Op, StringRef Constraint, std::vector<SDValue> &Ops,
3622 SelectionDAG &DAG) const {
3623 SDValue Result;
3624
3625 // Only support length 1 constraints for now.
3626 if (Constraint.size() > 1)
3627 return;
3628
3629 char ConstraintLetter = Constraint[0];
3630 switch (ConstraintLetter) {
3631 default: break;
3632 case 'I':
3633 case 'J':
3634 case 'K':
3635 case 'L':
3636 case 'M':
3637 case 'N':
3638 case 'O':
3640 if (isValidImmForConstraint(ConstraintLetter, C->getSExtValue())) {
3641 Result = DAG.getSignedTargetConstant(C->getSExtValue(), SDLoc(Op),
3642 Op.getValueType());
3643 break;
3644 }
3645 return;
3646 }
3647 }
3648
3649 if (Result.getNode()) {
3650 Ops.push_back(Result);
3651 return;
3652 }
3654}
3655
3656std::pair<unsigned, const TargetRegisterClass *>
3658 StringRef Constraint,
3659 MVT VT) const {
3660 if (Constraint.empty())
3661 return std::make_pair(0U, nullptr);
3662
3663 if (Constraint.size() == 1) {
3664 switch (Constraint[0]) {
3665 case 'r':
3666 if (VT == MVT::v2i32)
3667 return std::make_pair(0U, &SP::IntPairRegClass);
3668 else if (Subtarget->is64Bit())
3669 return std::make_pair(0U, &SP::I64RegsRegClass);
3670 else
3671 return std::make_pair(0U, &SP::IntRegsRegClass);
3672 case 'f':
3673 if (VT == MVT::f32 || VT == MVT::i32)
3674 return std::make_pair(0U, &SP::FPRegsRegClass);
3675 else if (VT == MVT::f64 || VT == MVT::i64)
3676 return std::make_pair(0U, &SP::LowDFPRegsRegClass);
3677 else if (VT == MVT::f128)
3678 return std::make_pair(0U, &SP::LowQFPRegsRegClass);
3679 // This will generate an error message
3680 return std::make_pair(0U, nullptr);
3681 case 'e':
3682 if (VT == MVT::f32 || VT == MVT::i32)
3683 return std::make_pair(0U, &SP::FPRegsRegClass);
3684 else if (VT == MVT::f64 || VT == MVT::i64 )
3685 return std::make_pair(0U, &SP::DFPRegsRegClass);
3686 else if (VT == MVT::f128)
3687 return std::make_pair(0U, &SP::QFPRegsRegClass);
3688 // This will generate an error message
3689 return std::make_pair(0U, nullptr);
3690 }
3691 }
3692
3693 if (Constraint.front() != '{')
3694 return std::make_pair(0U, nullptr);
3695
3696 assert(Constraint.back() == '}' && "Not a brace enclosed constraint?");
3697 StringRef RegName(Constraint.data() + 1, Constraint.size() - 2);
3698 if (RegName.empty())
3699 return std::make_pair(0U, nullptr);
3700
3701 unsigned CCReg = StringSwitch<unsigned>(RegName)
3702 .Cases({"cc", "icc"}, SP::ICC)
3703 .Case("fcc0", SP::FCC0)
3704 .Case("fcc1", SP::FCC1)
3705 .Case("fcc2", SP::FCC2)
3706 .Case("fcc3", SP::FCC3)
3707 .Default(0);
3708 if (CCReg == SP::ICC)
3709 return std::make_pair(CCReg, &SP::ICCRegsRegClass);
3710 if (CCReg)
3711 return std::make_pair(CCReg, &SP::FCCRegsRegClass);
3712
3713 unsigned long long RegNo;
3714 // Handle numbered register aliases.
3715 if (RegName[0] == 'r' &&
3716 getAsUnsignedInteger(RegName.begin() + 1, 10, RegNo)) {
3717 // r0-r7 -> g0-g7
3718 // r8-r15 -> o0-o7
3719 // r16-r23 -> l0-l7
3720 // r24-r31 -> i0-i7
3721 if (RegNo > 31)
3722 return std::make_pair(0U, nullptr);
3723 const char RegTypes[] = {'g', 'o', 'l', 'i'};
3724 char RegType = RegTypes[RegNo / 8];
3725 char RegIndex = '0' + (RegNo % 8);
3726 char Tmp[] = {'{', RegType, RegIndex, '}', 0};
3727 return getRegForInlineAsmConstraint(TRI, Tmp, VT);
3728 }
3729
3730 // Rewrite the fN constraint according to the value type if needed.
3731 if (VT != MVT::f32 && VT != MVT::Other && RegName[0] == 'f' &&
3732 getAsUnsignedInteger(RegName.begin() + 1, 10, RegNo)) {
3733 if (VT == MVT::f64 && (RegNo % 2 == 0)) {
3735 TRI, StringRef("{d" + utostr(RegNo / 2) + "}"), VT);
3736 } else if (VT == MVT::f128 && (RegNo % 4 == 0)) {
3738 TRI, StringRef("{q" + utostr(RegNo / 4) + "}"), VT);
3739 } else {
3740 return std::make_pair(0U, nullptr);
3741 }
3742 }
3743
3744 auto ResultPair =
3746 if (!ResultPair.second)
3747 return std::make_pair(0U, nullptr);
3748
3749 // Force the use of I64Regs over IntRegs for 64-bit values.
3750 if (Subtarget->is64Bit() && VT == MVT::i64) {
3751 assert(ResultPair.second == &SP::IntRegsRegClass &&
3752 "Unexpected register class");
3753 return std::make_pair(ResultPair.first, &SP::I64RegsRegClass);
3754 }
3755
3756 return ResultPair;
3757}
3758
3759bool
3761 // The Sparc target isn't yet aware of offsets.
3762 return false;
3763}
3764
3767 SelectionDAG &DAG) const {
3768
3769 SDLoc dl(N);
3770
3771 RTLIB::Libcall libCall = RTLIB::UNKNOWN_LIBCALL;
3772
3773 switch (N->getOpcode()) {
3774 default:
3775 llvm_unreachable("Do not know how to custom type legalize this operation!");
3776
3777 case ISD::FP_TO_SINT:
3778 case ISD::FP_TO_UINT:
3779 // Custom lower only if it involves f128 or i64.
3780 if (N->getOperand(0).getValueType() != MVT::f128
3781 || N->getValueType(0) != MVT::i64)
3782 return;
3783 libCall = ((N->getOpcode() == ISD::FP_TO_SINT)
3784 ? RTLIB::FPTOSINT_F128_I64
3785 : RTLIB::FPTOUINT_F128_I64);
3786
3787 Results.push_back(LowerF128Op(SDValue(N, 0), DAG, libCall, 1));
3788 return;
3789 case ISD::READCYCLECOUNTER: {
3790 assert(Subtarget->hasLeonCycleCounter());
3791 SDValue Lo = DAG.getCopyFromReg(N->getOperand(0), dl, SP::ASR23, MVT::i32);
3792 SDValue Hi = DAG.getCopyFromReg(Lo, dl, SP::G0, MVT::i32);
3793 SDValue Ops[] = { Lo, Hi };
3794 SDValue Pair = DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, Ops);
3795 Results.push_back(Pair);
3796 Results.push_back(N->getOperand(0));
3797 return;
3798 }
3799 case ISD::SINT_TO_FP:
3800 case ISD::UINT_TO_FP:
3801 // Custom lower only if it involves f128 or i64.
3802 if (N->getValueType(0) != MVT::f128
3803 || N->getOperand(0).getValueType() != MVT::i64)
3804 return;
3805
3806 libCall = ((N->getOpcode() == ISD::SINT_TO_FP)
3807 ? RTLIB::SINTTOFP_I64_F128
3808 : RTLIB::UINTTOFP_I64_F128);
3809
3810 Results.push_back(LowerF128Op(SDValue(N, 0), DAG, libCall, 1));
3811 return;
3812 case ISD::LOAD: {
3814 // Custom handling only for i64: turn i64 load into a v2i32 load,
3815 // and a bitcast.
3816 if (Ld->getValueType(0) != MVT::i64 || Ld->getMemoryVT() != MVT::i64)
3817 return;
3818
3819 SDLoc dl(N);
3820 SDValue LoadRes = DAG.getExtLoad(
3821 Ld->getExtensionType(), dl, MVT::v2i32, Ld->getChain(),
3822 Ld->getBasePtr(), Ld->getPointerInfo(), MVT::v2i32, Ld->getBaseAlign(),
3823 Ld->getMemOperand()->getFlags(), Ld->getAAInfo());
3824
3825 SDValue Res = DAG.getNode(ISD::BITCAST, dl, MVT::i64, LoadRes);
3826 Results.push_back(Res);
3827 Results.push_back(LoadRes.getValue(1));
3828 return;
3829 }
3830 }
3831}
3832
3833// Override to enable LOAD_STACK_GUARD lowering on Linux.
3835 if (!Subtarget->getTargetTriple().isOSLinux())
3837 return true;
3838}
3839
3841 if (Subtarget->isVIS3())
3842 return VT == MVT::f32 || VT == MVT::f64;
3843 return false;
3844}
3845
3848 bool ForCodeSize) const {
3849 if (VT != MVT::f32 && VT != MVT::f64)
3851 if (Subtarget->isVIS() && Imm.isZero())
3852 return FPImmAction::Legal;
3853 // Check for +/-0.5.
3854 if (Subtarget->isVIS3() && Imm.getExactLog2Abs() == -1)
3855 return FPImmAction::Legal;
3857}
3858
3859bool SparcTargetLowering::isCtlzFast() const { return Subtarget->isVIS3(); }
3860
3862 // We lack native cttz, however,
3863 // On 64-bit targets it is cheap to implement it in terms of popc.
3864 if (Subtarget->is64Bit() && Subtarget->usePopc())
3865 return true;
3866 // Otherwise, implementing cttz in terms of ctlz is still cheap.
3867 return isCheapToSpeculateCtlz(Ty);
3868}
3869
3871 EVT VT) const {
3872 return Subtarget->isUA2007() && !Subtarget->useSoftFloat();
3873}
3874
3876 SDNode *Node) const {
3877 assert(MI.getOpcode() == SP::SUBCCrr || MI.getOpcode() == SP::SUBCCri);
3878 // If the result is dead, replace it with %g0.
3879 if (!Node->hasAnyUseOfValue(0))
3880 MI.getOperand(0).setReg(SP::G0);
3881}
3882
3884 Instruction *Inst,
3885 AtomicOrdering Ord) const {
3886 bool HasStoreSemantics =
3888 if (HasStoreSemantics && isReleaseOrStronger(Ord))
3889 return Builder.CreateFence(AtomicOrdering::Release);
3890 return nullptr;
3891}
3892
3894 Instruction *Inst,
3895 AtomicOrdering Ord) const {
3896 // V8 loads already come with implicit acquire barrier so there's no need to
3897 // emit it again.
3898 bool HasLoadSemantics = isa<AtomicCmpXchgInst, AtomicRMWInst, LoadInst>(Inst);
3899 if (Subtarget->isV9() && HasLoadSemantics && isAcquireOrStronger(Ord))
3900 return Builder.CreateFence(AtomicOrdering::Acquire);
3901
3902 // SC plain stores would need a trailing full barrier.
3904 return Builder.CreateFence(Ord);
3905 return nullptr;
3906}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
uint64_t Imm
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG)
static SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG, const ARMSubtarget *ST)
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
RISCVCC::CondCode CC
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 bool isValidImmForConstraint(char Constraint, int64_t Val)
isValidImmForConstraint - Return true if constraint is satisfied
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:167
bool hasStructRetAttr() const
Determine if the function returns a structure through first or second pointer argument.
Definition Function.h:673
Type * getParamStructRetType(unsigned ArgNo) const
Extract the sret type for a parameter.
Definition Function.h:478
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:731
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:111
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
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
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 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.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
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.
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:68
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.
SDNodeFlags getFlags() const
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
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
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.
SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True, SDValue False, ISD::CondCode Cond, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build SelectCC's if you just have an ISD::CondCode instead of an...
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
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.
FPImmAction getFPImmAction(const APFloat &Imm, EVT VT, bool ForCodeSize) const override
Returns how the legalizer should materialize the specified FP immediate.
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:31
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)
StringSwitch & Cases(std::initializer_list< StringLiteral > CaseStrings, 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...
FPImmAction
How the legalizer should materialize a floating-point immediate.
@ ConstantPool
Load the immediate from the constant pool.
@ Legal
The target can instruction select the immediate natively.
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:352
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:170
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:272
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:187
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:257
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:845
@ 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:277
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:129
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:805
@ 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:296
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:266
@ 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:879
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:523
@ GlobalAddress
Definition ISDOpcodes.h:90
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:906
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:420
@ 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:282
@ 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:256
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:91
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:814
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:870
@ 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:822
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:235
@ 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:232
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:714
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:787
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:581
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:876
@ 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:837
@ 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:914
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
Definition ISDOpcodes.h:112
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:952
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:757
@ TRAP
TRAP - Trapping instruction.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:207
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:306
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:570
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:55
@ 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:813
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:985
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:882
@ 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:859
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:64
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:539
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:561
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:124
@ ICC_G
Definition Sparc.h:96
@ REG_LEZ
Definition Sparc.h:147
@ ICC_L
Definition Sparc.h:99
@ ICC_LEU
Definition Sparc.h:101
@ ICC_LE
Definition Sparc.h:97
@ ICC_GE
Definition Sparc.h:98
@ ICC_NE
Definition Sparc.h:94
@ ICC_E
Definition Sparc.h:95
@ FCC_UGE
Definition Sparc.h:122
@ REG_GEZ
Definition Sparc.h:151
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
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:1685
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:1762
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:149
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:190
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:206
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:111
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)