blob: edbe29a5344a9081c7a72c696a679b59f7b83c8a [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- HexagonVarargsCallingConvention.h - Calling Conventions -*- C++ -*-===//
Tony Linthicum1213a7a2011-12-12 21:14:40 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
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
13//
14//===----------------------------------------------------------------------===//
15//
16
17
18
19
20static bool RetCC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
21 EVT LocVT, CCValAssign::LocInfo LocInfo,
22 ISD::ArgFlagsTy ArgFlags,
23 Hexagon_CCState &State,
24 int NonVarArgsParams,
25 int CurrentParam,
26 bool ForceMem);
27
28
29static bool CC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
30 EVT LocVT, CCValAssign::LocInfo LocInfo,
31 ISD::ArgFlagsTy ArgFlags,
32 Hexagon_CCState &State,
33 int NonVarArgsParams,
34 int CurrentParam,
35 bool ForceMem) {
36 unsigned ByValSize = 0;
37 if (ArgFlags.isByVal() &&
38 ((ByValSize = ArgFlags.getByValSize()) >
39 (MVT(MVT::i64).getSizeInBits() / 8))) {
40 ForceMem = true;
41 }
42
43
Alp Tokerf907b892013-12-05 05:44:44 +000044 // Only assign registers for named (non-varargs) arguments
Tony Linthicum1213a7a2011-12-12 21:14:40 +000045 if ( !ForceMem && ((NonVarArgsParams == -1) || (CurrentParam <=
46 NonVarArgsParams))) {
47
48 if (LocVT == MVT::i32 ||
49 LocVT == MVT::i16 ||
50 LocVT == MVT::i8 ||
51 LocVT == MVT::f32) {
52 static const unsigned RegList1[] = {
53 Hexagon::R0, Hexagon::R1, Hexagon::R2, Hexagon::R3, Hexagon::R4,
54 Hexagon::R5
55 };
56 if (unsigned Reg = State.AllocateReg(RegList1, 6)) {
57 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
58 LocVT.getSimpleVT(), LocInfo));
59 return false;
60 }
61 }
62
63 if (LocVT == MVT::i64 ||
64 LocVT == MVT::f64) {
65 static const unsigned RegList2[] = {
66 Hexagon::D0, Hexagon::D1, Hexagon::D2
67 };
68 if (unsigned Reg = State.AllocateReg(RegList2, 3)) {
69 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
70 LocVT.getSimpleVT(), LocInfo));
71 return false;
72 }
73 }
74 }
75
76 const Type* ArgTy = LocVT.getTypeForEVT(State.getContext());
Eric Christopherd9134482014-08-04 21:25:23 +000077 unsigned Alignment = State.getTarget()
78 .getSubtargetImpl()
79 ->getDataLayout()
80 ->getABITypeAlignment(ArgTy);
Tony Linthicum1213a7a2011-12-12 21:14:40 +000081 unsigned Size =
Eric Christopherd9134482014-08-04 21:25:23 +000082 State.getTarget().getSubtargetImpl()->getDataLayout()->getTypeSizeInBits(
83 ArgTy) /
84 8;
Tony Linthicum1213a7a2011-12-12 21:14:40 +000085
86 // If it's passed by value, then we need the size of the aggregate not of
87 // the pointer.
88 if (ArgFlags.isByVal()) {
89 Size = ByValSize;
90
91 // Hexagon_TODO: Get the alignment of the contained type here.
92 Alignment = 8;
93 }
94
95 unsigned Offset3 = State.AllocateStack(Size, Alignment);
96 State.addLoc(CCValAssign::getMem(ValNo, ValVT.getSimpleVT(), Offset3,
97 LocVT.getSimpleVT(), LocInfo));
98 return false;
99}
100
101
102static 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,
107 int CurrentParam,
108 bool ForceMem) {
109
110 if (LocVT == MVT::i32 ||
111 LocVT == MVT::f32) {
112 static const unsigned RegList1[] = {
113 Hexagon::R0, Hexagon::R1, Hexagon::R2, Hexagon::R3, Hexagon::R4,
114 Hexagon::R5
115 };
116 if (unsigned Reg = State.AllocateReg(RegList1, 6)) {
117 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
118 LocVT.getSimpleVT(), LocInfo));
119 return false;
120 }
121 }
122
123 if (LocVT == MVT::i64 ||
124 LocVT == MVT::f64) {
125 static const unsigned RegList2[] = {
126 Hexagon::D0, Hexagon::D1, Hexagon::D2
127 };
128 if (unsigned Reg = State.AllocateReg(RegList2, 3)) {
129 State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
130 LocVT.getSimpleVT(), LocInfo));
131 return false;
132 }
133 }
134
135 const Type* ArgTy = LocVT.getTypeForEVT(State.getContext());
Eric Christopherd9134482014-08-04 21:25:23 +0000136 unsigned Alignment = State.getTarget()
137 .getSubtargetImpl()
138 ->getDataLayout()
139 ->getABITypeAlignment(ArgTy);
Tony Linthicum1213a7a2011-12-12 21:14:40 +0000140 unsigned Size =
Eric Christopherd9134482014-08-04 21:25:23 +0000141 State.getTarget().getSubtargetImpl()->getDataLayout()->getTypeSizeInBits(
142 ArgTy) /
143 8;
Tony Linthicum1213a7a2011-12-12 21:14:40 +0000144
145 unsigned Offset3 = State.AllocateStack(Size, Alignment);
146 State.addLoc(CCValAssign::getMem(ValNo, ValVT.getSimpleVT(), Offset3,
147 LocVT.getSimpleVT(), LocInfo));
148 return false;
149}