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());
78 State.getTarget().getDataLayout()->getABITypeAlignment(ArgTy);
80 State.getTarget().getDataLayout()->getTypeSizeInBits(ArgTy) / 8;
82 // If it's passed by value, then we need the size of the aggregate not of
84 if (ArgFlags.isByVal()) {
87 // Hexagon_TODO: Get the alignment of the contained type here.
91 unsigned Offset3 = State.AllocateStack(Size, Alignment);
92 State.addLoc(CCValAssign::getMem(ValNo, ValVT.getSimpleVT(), Offset3,
93 LocVT.getSimpleVT(), LocInfo));
98 static bool RetCC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
99 EVT LocVT, CCValAssign::LocInfo LocInfo,
100 ISD::ArgFlagsTy ArgFlags,
101 Hexagon_CCState &State,
102 int NonVarArgsParams,
106 if (LocVT == MVT::i32 ||
108 static const unsigned RegList1[] = {
109 Hexagon::R0, Hexagon::R1, Hexagon::R2, Hexagon::R3, Hexagon::R4,
112 if (unsigned Reg = State.AllocateReg(RegList1, 6)) {
113 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
114 LocVT.getSimpleVT(), LocInfo));
119 if (LocVT == MVT::i64 ||
121 static const unsigned RegList2[] = {
122 Hexagon::D0, Hexagon::D1, Hexagon::D2
124 if (unsigned Reg = State.AllocateReg(RegList2, 3)) {
125 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
126 LocVT.getSimpleVT(), LocInfo));
131 const Type* ArgTy = LocVT.getTypeForEVT(State.getContext());
133 State.getTarget().getDataLayout()->getABITypeAlignment(ArgTy);
135 State.getTarget().getDataLayout()->getTypeSizeInBits(ArgTy) / 8;
137 unsigned Offset3 = State.AllocateStack(Size, Alignment);
138 State.addLoc(CCValAssign::getMem(ValNo, ValVT.getSimpleVT(), Offset3,
139 LocVT.getSimpleVT(), LocInfo));