131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonVarargsCallingConvention.h - Calling Conventions -*- C++ -*-===//
2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//                     The LLVM Compiler Infrastructure
4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source
6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details.
7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file declares the functions that assign locations to outgoing function
11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// arguments. Adapted from the target independent version but this handles
12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// calls to varargs functions
13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
16b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
17b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
20b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic bool RetCC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
21b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    EVT LocVT, CCValAssign::LocInfo LocInfo,
22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    ISD::ArgFlagsTy ArgFlags,
23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    Hexagon_CCState &State,
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    int NonVarArgsParams,
25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    int CurrentParam,
26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    bool ForceMem);
27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic bool CC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
30b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 EVT LocVT, CCValAssign::LocInfo LocInfo,
31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 ISD::ArgFlagsTy ArgFlags,
32b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 Hexagon_CCState &State,
33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 int NonVarArgsParams,
34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 int CurrentParam,
35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 bool ForceMem) {
36b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  unsigned ByValSize = 0;
37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  if (ArgFlags.isByVal() &&
38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      ((ByValSize = ArgFlags.getByValSize()) >
39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum       (MVT(MVT::i64).getSizeInBits() / 8))) {
40b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    ForceMem = true;
41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Only assign registers for named (non-varargs) arguments
45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  if ( !ForceMem && ((NonVarArgsParams == -1) || (CurrentParam <=
46b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                                  NonVarArgsParams))) {
47b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    if (LocVT == MVT::i32 ||
49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        LocVT == MVT::i16 ||
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        LocVT == MVT::i8 ||
51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        LocVT == MVT::f32) {
52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      static const unsigned RegList1[] = {
53b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        Hexagon::R0, Hexagon::R1, Hexagon::R2, Hexagon::R3, Hexagon::R4,
54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        Hexagon::R5
55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      };
56b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      if (unsigned Reg = State.AllocateReg(RegList1, 6)) {
57b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                         LocVT.getSimpleVT(), LocInfo));
59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        return false;
60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      }
61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    if (LocVT == MVT::i64 ||
64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        LocVT == MVT::f64) {
65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      static const unsigned RegList2[] = {
66b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        Hexagon::D0, Hexagon::D1, Hexagon::D2
67b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      };
68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      if (unsigned Reg = State.AllocateReg(RegList2, 3)) {
69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
70b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                         LocVT.getSimpleVT(), LocInfo));
71b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum        return false;
72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      }
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  const Type* ArgTy = LocVT.getTypeForEVT(State.getContext());
77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  unsigned Alignment =
783574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow    State.getTarget().getDataLayout()->getABITypeAlignment(ArgTy);
79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  unsigned Size =
803574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow    State.getTarget().getDataLayout()->getTypeSizeInBits(ArgTy) / 8;
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  // If it's passed by value, then we need the size of the aggregate not of
83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  // the pointer.
84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  if (ArgFlags.isByVal()) {
85b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    Size = ByValSize;
86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    // Hexagon_TODO: Get the alignment of the contained type here.
88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    Alignment = 8;
89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
91b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  unsigned Offset3 = State.AllocateStack(Size, Alignment);
92b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  State.addLoc(CCValAssign::getMem(ValNo, ValVT.getSimpleVT(), Offset3,
93b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                   LocVT.getSimpleVT(), LocInfo));
94b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return false;
95b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
96b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
97b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
98b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic bool RetCC_Hexagon32_VarArgs(unsigned ValNo, EVT ValVT,
99b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    EVT LocVT, CCValAssign::LocInfo LocInfo,
100b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    ISD::ArgFlagsTy ArgFlags,
101b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    Hexagon_CCState &State,
102b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    int NonVarArgsParams,
103b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    int CurrentParam,
104b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                    bool ForceMem) {
105b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
106b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  if (LocVT == MVT::i32 ||
107b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      LocVT == MVT::f32) {
108b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    static const unsigned RegList1[] = {
109b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      Hexagon::R0, Hexagon::R1, Hexagon::R2, Hexagon::R3, Hexagon::R4,
110b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      Hexagon::R5
111b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    };
112b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    if (unsigned Reg = State.AllocateReg(RegList1, 6)) {
113b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
114b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                       LocVT.getSimpleVT(), LocInfo));
115b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      return false;
116b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
117b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
118b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
119b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  if (LocVT == MVT::i64 ||
120b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      LocVT == MVT::f64) {
121b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    static const unsigned RegList2[] = {
122b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      Hexagon::D0, Hexagon::D1, Hexagon::D2
123b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    };
124b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    if (unsigned Reg = State.AllocateReg(RegList2, 3)) {
125b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      State.addLoc(CCValAssign::getReg(ValNo, ValVT.getSimpleVT(), Reg,
126b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                       LocVT.getSimpleVT(), LocInfo));
127b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      return false;
128b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
129b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
130b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
131b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  const Type* ArgTy = LocVT.getTypeForEVT(State.getContext());
132b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  unsigned Alignment =
1333574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow    State.getTarget().getDataLayout()->getABITypeAlignment(ArgTy);
134b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  unsigned Size =
1353574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow    State.getTarget().getDataLayout()->getTypeSizeInBits(ArgTy) / 8;
136b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
137b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  unsigned Offset3 = State.AllocateStack(Size, Alignment);
138b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  State.addLoc(CCValAssign::getMem(ValNo, ValVT.getSimpleVT(), Offset3,
139b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                   LocVT.getSimpleVT(), LocInfo));
140b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return false;
141b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
142