]>
git.proxmox.com Git - rustc.git/blob - src/llvm/lib/Target/Hexagon/HexagonVarargsCallingConvention.h
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
));