xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYCallingConv.h (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
1*349cc55cSDimitry Andric //=== CSKYCallingConv.h - CSKY Custom Calling Convention Routines -*-C++-*-===//
2*349cc55cSDimitry Andric //
3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*349cc55cSDimitry Andric //
7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8*349cc55cSDimitry Andric //
9*349cc55cSDimitry Andric // This file contains the custom routines for the CSKY Calling Convention that
10*349cc55cSDimitry Andric // aren't done by tablegen.
11*349cc55cSDimitry Andric //
12*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
13*349cc55cSDimitry Andric 
14*349cc55cSDimitry Andric #ifndef LLVM_LIB_TARGET_CSKY_CSKYCALLINGCONV_H
15*349cc55cSDimitry Andric #define LLVM_LIB_TARGET_CSKY_CSKYCALLINGCONV_H
16*349cc55cSDimitry Andric 
17*349cc55cSDimitry Andric #include "CSKY.h"
18*349cc55cSDimitry Andric #include "CSKYSubtarget.h"
19*349cc55cSDimitry Andric #include "llvm/CodeGen/CallingConvLower.h"
20*349cc55cSDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h"
21*349cc55cSDimitry Andric #include "llvm/IR/CallingConv.h"
22*349cc55cSDimitry Andric 
23*349cc55cSDimitry Andric namespace llvm {
24*349cc55cSDimitry Andric 
CC_CSKY_ABIV2_SOFT_64(unsigned & ValNo,MVT & ValVT,MVT & LocVT,CCValAssign::LocInfo & LocInfo,ISD::ArgFlagsTy & ArgFlags,CCState & State)25*349cc55cSDimitry Andric static bool CC_CSKY_ABIV2_SOFT_64(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
26*349cc55cSDimitry Andric                                   CCValAssign::LocInfo &LocInfo,
27*349cc55cSDimitry Andric                                   ISD::ArgFlagsTy &ArgFlags, CCState &State) {
28*349cc55cSDimitry Andric 
29*349cc55cSDimitry Andric   static const MCPhysReg ArgGPRs[] = {CSKY::R0, CSKY::R1, CSKY::R2, CSKY::R3};
30*349cc55cSDimitry Andric   Register Reg = State.AllocateReg(ArgGPRs);
31*349cc55cSDimitry Andric   LocVT = MVT::i32;
32*349cc55cSDimitry Andric   if (!Reg) {
33*349cc55cSDimitry Andric     unsigned StackOffset = State.AllocateStack(8, Align(4));
34*349cc55cSDimitry Andric     State.addLoc(
35*349cc55cSDimitry Andric         CCValAssign::getMem(ValNo, ValVT, StackOffset, LocVT, LocInfo));
36*349cc55cSDimitry Andric     return true;
37*349cc55cSDimitry Andric   }
38*349cc55cSDimitry Andric   if (!State.AllocateReg(ArgGPRs))
39*349cc55cSDimitry Andric     State.AllocateStack(4, Align(4));
40*349cc55cSDimitry Andric   State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
41*349cc55cSDimitry Andric   return true;
42*349cc55cSDimitry Andric }
43*349cc55cSDimitry Andric 
Ret_CSKY_ABIV2_SOFT_64(unsigned & ValNo,MVT & ValVT,MVT & LocVT,CCValAssign::LocInfo & LocInfo,ISD::ArgFlagsTy & ArgFlags,CCState & State)44*349cc55cSDimitry Andric static bool Ret_CSKY_ABIV2_SOFT_64(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
45*349cc55cSDimitry Andric                                    CCValAssign::LocInfo &LocInfo,
46*349cc55cSDimitry Andric                                    ISD::ArgFlagsTy &ArgFlags, CCState &State) {
47*349cc55cSDimitry Andric 
48*349cc55cSDimitry Andric   static const MCPhysReg ArgGPRs[] = {CSKY::R0, CSKY::R1};
49*349cc55cSDimitry Andric   Register Reg = State.AllocateReg(ArgGPRs);
50*349cc55cSDimitry Andric   LocVT = MVT::i32;
51*349cc55cSDimitry Andric   if (!Reg)
52*349cc55cSDimitry Andric     return false;
53*349cc55cSDimitry Andric 
54*349cc55cSDimitry Andric   if (!State.AllocateReg(ArgGPRs))
55*349cc55cSDimitry Andric     return false;
56*349cc55cSDimitry Andric 
57*349cc55cSDimitry Andric   State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
58*349cc55cSDimitry Andric   return true;
59*349cc55cSDimitry Andric }
60*349cc55cSDimitry Andric 
61*349cc55cSDimitry Andric } // namespace llvm
62*349cc55cSDimitry Andric 
63*349cc55cSDimitry Andric #endif
64