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