1 //===-- HexagonVarargsCallingConvention.h - Calling Conventions -*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file declares the functions that assign locations to outgoing function
11 // arguments. Adapted from the target independent version but this handles
12 // calls to varargs functions
14 //===----------------------------------------------------------------------===//
20 static bool RetCC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
21 EVT LocVT, CCValAssign::LocInfo LocInfo,
22 ISD::ArgFlagsTy ArgFlags,
23 Hexagon_CCState &State,
29 static bool CC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
30 EVT LocVT, CCValAssign::LocInfo LocInfo,
31 ISD::ArgFlagsTy ArgFlags,
32 Hexagon_CCState &State,
36 unsigned ByValSize = 0;
37 if (ArgFlags.isByVal() &&
38 ((ByValSize = ArgFlags.getByValSize()) >
39 (MVT(MVT::i64).getSizeInBits() / 8))) {
44 // Only assign registers for named (non-varargs) arguments
45 if ( !ForceMem && ((NonVarArgsParams == -1) || (CurrentParam <=
48 if (LocVT == MVT::i32 ||
52 static const unsigned RegList1[] = {
53 Hexagon::R0, Hexagon::R1, Hexagon::R2, Hexagon::R3, Hexagon::R4,
56 if (unsigned Reg = State.AllocateReg(RegList1, 6)) {
57 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
58 LocVT.getSimpleVT(), LocInfo));
63 if (LocVT == MVT::i64 ||
65 static const unsigned RegList2[] = {
66 Hexagon::D0, Hexagon::D1, Hexagon::D2
68 if (unsigned Reg = State.AllocateReg(RegList2, 3)) {
69 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
70 LocVT.getSimpleVT(), LocInfo));
76 const Type* ArgTy = LocVT.getTypeForEVT(State.getContext());
77 unsigned Alignment = State.getTarget()
80 ->getABITypeAlignment(ArgTy);
82 State.getTarget().getSubtargetImpl()->getDataLayout()->getTypeSizeInBits(
86 // If it's passed by value, then we need the size of the aggregate not of
88 if (ArgFlags.isByVal()) {
91 // Hexagon_TODO: Get the alignment of the contained type here.
95 unsigned Offset3 = State.AllocateStack(Size, Alignment);
96 State.addLoc(CCValAssign::getMem(ValNo, ValVT.getSimpleVT(), Offset3,
97 LocVT.getSimpleVT(), LocInfo));
102 static bool RetCC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
103 EVT LocVT, CCValAssign::LocInfo LocInfo,
104 ISD::ArgFlagsTy ArgFlags,
105 Hexagon_CCState &State,
106 int NonVarArgsParams,
110 if (LocVT == MVT::i32 ||
112 static const unsigned RegList1[] = {
113 Hexagon::R0, Hexagon::R1, Hexagon::R2, Hexagon::R3, Hexagon::R4,
116 if (unsigned Reg = State.AllocateReg(RegList1, 6)) {
117 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
118 LocVT.getSimpleVT(), LocInfo));
123 if (LocVT == MVT::i64 ||
125 static const unsigned RegList2[] = {
126 Hexagon::D0, Hexagon::D1, Hexagon::D2
128 if (unsigned Reg = State.AllocateReg(RegList2, 3)) {
129 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
130 LocVT.getSimpleVT(), LocInfo));
135 const Type* ArgTy = LocVT.getTypeForEVT(State.getContext());
136 unsigned Alignment = State.getTarget()
139 ->getABITypeAlignment(ArgTy);
141 State.getTarget().getSubtargetImpl()->getDataLayout()->getTypeSizeInBits(
145 unsigned Offset3 = State.AllocateStack(Size, Alignment);
146 State.addLoc(CCValAssign::getMem(ValNo, ValVT.getSimpleVT(), Offset3,
147 LocVT.getSimpleVT(), LocInfo));