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

LLVM 22.0.0git
M68kCallingConv.h
Go to the documentation of this file.
1//===-- M68kCallingConv.h - M68k Custom CC 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/// \file
10/// This file contains the custom routines for the M68k Calling Convention
11/// that aren't done by tablegen.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_LIB_TARGET_M68K_M68KCALLINGCONV_H
16#define LLVM_LIB_TARGET_M68K_M68KCALLINGCONV_H
17
19
21#include "llvm/IR/CallingConv.h"
22#include "llvm/IR/Function.h"
23
24namespace llvm {
25
26/// Custom state to propagate llvm type info to register CC assigner
27struct M68kCCState : public CCState {
29
30 M68kCCState(ArrayRef<Type *> ArgTypes, CallingConv::ID CC, bool IsVarArg,
33 : CCState(CC, IsVarArg, MF, Locs, C), ArgTypeList(ArgTypes) {}
34};
35
36/// NOTE this function is used to select registers for formal arguments and call
37/// FIXME: Handling on pointer arguments is not complete
38inline bool CC_M68k_Any_AssignToReg(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
39 CCValAssign::LocInfo &LocInfo,
40 ISD::ArgFlagsTy &ArgFlags, CCState &State) {
41 const M68kCCState &CCInfo = static_cast<M68kCCState &>(State);
42
43 static const MCPhysReg DataRegList[] = {M68k::D0, M68k::D1, M68k::A0,
44 M68k::A1};
45
46 // Address registers have %a register priority
47 static const MCPhysReg AddrRegList[] = {
48 M68k::A0,
49 M68k::A1,
50 M68k::D0,
51 M68k::D1,
52 };
53
54 const auto &ArgTypes = CCInfo.ArgTypeList;
55 auto I = ArgTypes.begin(), End = ArgTypes.end();
56 int No = ValNo;
57 while (No > 0 && I != End) {
58 No -= (*I)->isIntegerTy(64) ? 2 : 1;
59 ++I;
60 }
61
62 bool IsPtr = I != End && (*I)->isPointerTy();
63
64 unsigned Reg =
65 IsPtr ? State.AllocateReg(AddrRegList) : State.AllocateReg(DataRegList);
66
67 if (Reg) {
68 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
69 return true;
70 }
71
72 return false;
73}
74
75} // namespace llvm
76
77#endif // LLVM_LIB_TARGET_M68K_M68KCALLINGCONV_H
This file provides M68k specific target descriptions.
#define I(x, y, z)
Definition MD5.cpp:58
Register Reg
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
CCState - This class holds information needed while lowering arguments and return values.
LLVM_ABI CCState(CallingConv::ID CC, bool IsVarArg, MachineFunction &MF, SmallVectorImpl< CCValAssign > &Locs, LLVMContext &Context, bool NegativeOffsets=false)
static CCValAssign getReg(unsigned ValNo, MVT ValVT, MCRegister Reg, MVT LocVT, LocInfo HTP, bool IsCustom=false)
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Machine Value Type.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
bool CC_M68k_Any_AssignToReg(unsigned &ValNo, MVT &ValVT, MVT &LocVT, CCValAssign::LocInfo &LocInfo, ISD::ArgFlagsTy &ArgFlags, CCState &State)
NOTE this function is used to select registers for formal arguments and call FIXME: Handling on point...
Custom state to propagate llvm type info to register CC assigner.
M68kCCState(ArrayRef< Type * > ArgTypes, CallingConv::ID CC, bool IsVarArg, MachineFunction &MF, SmallVectorImpl< CCValAssign > &Locs, LLVMContext &C)
ArrayRef< Type * > ArgTypeList