Thanks to visit codestin.com
Credit goes to llvm.org

LLVM 22.0.0git
CSKYCallingConv.h
Go to the documentation of this file.
1//=== CSKYCallingConv.h - CSKY Custom Calling Convention Routines -*-C++-*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the custom routines for the CSKY Calling Convention that
10// aren't done by tablegen.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_CSKY_CSKYCALLINGCONV_H
15#define LLVM_LIB_TARGET_CSKY_CSKYCALLINGCONV_H
16
17#include "CSKY.h"
18#include "CSKYSubtarget.h"
21#include "llvm/IR/CallingConv.h"
22
23namespace llvm {
24
25static bool CC_CSKY_ABIV2_SOFT_64(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
26 CCValAssign::LocInfo &LocInfo,
27 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
28
29 static const MCPhysReg ArgGPRs[] = {CSKY::R0, CSKY::R1, CSKY::R2, CSKY::R3};
30 Register Reg = State.AllocateReg(ArgGPRs);
31 LocVT = MVT::i32;
32 if (!Reg) {
33 unsigned StackOffset = State.AllocateStack(8, Align(4));
34 State.addLoc(
35 CCValAssign::getMem(ValNo, ValVT, StackOffset, LocVT, LocInfo));
36 return true;
37 }
38 if (!State.AllocateReg(ArgGPRs))
39 State.AllocateStack(4, Align(4));
40 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
41 return true;
42}
43
44static bool Ret_CSKY_ABIV2_SOFT_64(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
45 CCValAssign::LocInfo &LocInfo,
46 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
47
48 static const MCPhysReg ArgGPRs[] = {CSKY::R0, CSKY::R1};
49 Register Reg = State.AllocateReg(ArgGPRs);
50 LocVT = MVT::i32;
51 if (!Reg)
52 return false;
53
54 if (!State.AllocateReg(ArgGPRs))
55 return false;
56
57 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
58 return true;
59}
60
61} // namespace llvm
62
63#endif
const MCPhysReg ArgGPRs[]
Register Reg
CCState - This class holds information needed while lowering arguments and return values.
static CCValAssign getReg(unsigned ValNo, MVT ValVT, MCRegister Reg, MVT LocVT, LocInfo HTP, bool IsCustom=false)
static CCValAssign getMem(unsigned ValNo, MVT ValVT, int64_t Offset, MVT LocVT, LocInfo HTP, bool IsCustom=false)
Machine Value Type.
Wrapper class representing virtual and physical registers.
Definition Register.h:19
StackOffset holds a fixed and a scalable offset in bytes.
Definition TypeSize.h:31
This is an optimization pass for GlobalISel generic memory operations.
static bool Ret_CSKY_ABIV2_SOFT_64(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
static bool CC_CSKY_ABIV2_SOFT_64(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39