xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/M68k/M68kCallingConv.td (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1fe6060f1SDimitry Andric//===-- M68kCallingConv.td - Calling Conventions for M68k --*- tablegen -*-===//
2fe6060f1SDimitry Andric//
3fe6060f1SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric//
7fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric///
9fe6060f1SDimitry Andric/// \file
10fe6060f1SDimitry Andric/// This describes the calling conventions for the M68k architectures. These
11fe6060f1SDimitry Andric/// conventions assume Int to be 4 bytes and 4 byte aligned.
12fe6060f1SDimitry Andric///
13fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
14fe6060f1SDimitry Andric
15fe6060f1SDimitry Andric// TODO Verify C convention follows SysV M68K ABI
16fe6060f1SDimitry Andric
17fe6060f1SDimitry Andricclass CCIfSubtarget<string F, CCAction A>
18fe6060f1SDimitry Andric    : CCIf<!strconcat("static_cast<const M68kSubtarget &>"
19fe6060f1SDimitry Andric                      "(State.getMachineFunction().getSubtarget()).", F), A>;
20fe6060f1SDimitry Andric
21fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
22fe6060f1SDimitry Andric// Return Value Calling Conventions
23fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
24fe6060f1SDimitry Andric
25fe6060f1SDimitry Andric/// M68k C return convention.
26fe6060f1SDimitry Andricdef RetCC_M68k_C : CallingConv<[
27*06c3fb27SDimitry Andric  CCIfPtr<CCAssignToReg<[A0]>>,
28fe6060f1SDimitry Andric  CCIfType<[i1],   CCPromoteToType<i8>>,
29fe6060f1SDimitry Andric  CCIfType<[i8],   CCAssignToReg<[BD0, BD1]>>,
30fe6060f1SDimitry Andric  CCIfType<[i16],  CCAssignToReg<[WD0, WD1]>>,
31fe6060f1SDimitry Andric  CCIfType<[i32],  CCAssignToReg<[D0, D1]>>,
32fe6060f1SDimitry Andric]>;
33fe6060f1SDimitry Andric
34fe6060f1SDimitry Andric/// M68k fastcc return convention.
35fe6060f1SDimitry Andric/// This convention allows to return up to 16 bytes in registers which can be
36fe6060f1SDimitry Andric/// split among 16 1-byte values or used for a single 16-byte value.
37fe6060f1SDimitry Andric/// TODO: Verify its functionality and write tests
38fe6060f1SDimitry Andricdef RetCC_M68k_Fast : CallingConv<[
39*06c3fb27SDimitry Andric  CCIfPtr<CCAssignToReg<[A0]>>,
40fe6060f1SDimitry Andric  CCIfType<[i1],   CCPromoteToType<i8>>,
41fe6060f1SDimitry Andric  CCIfType<[i8],   CCAssignToReg<[BD0, BD1]>>,
42fe6060f1SDimitry Andric  CCIfType<[i16],  CCAssignToReg<[WD0, WD1, WA0, WA1]>>,
43fe6060f1SDimitry Andric  CCIfType<[i32],  CCAssignToReg<[D0, D1, A0, A1]>>,
44fe6060f1SDimitry Andric]>;
45fe6060f1SDimitry Andric
46fe6060f1SDimitry Andric/// This is the root return-value convention for the M68k backend.
47fe6060f1SDimitry Andricdef RetCC_M68k : CallingConv<[
48fe6060f1SDimitry Andric  CCIfCC<"CallingConv::Fast", CCDelegateTo<RetCC_M68k_Fast>>,
49fe6060f1SDimitry Andric  CCDelegateTo<RetCC_M68k_C>
50fe6060f1SDimitry Andric]>;
51fe6060f1SDimitry Andric
52fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
53fe6060f1SDimitry Andric// M68k C Calling Convention
54fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
55fe6060f1SDimitry Andric
56fe6060f1SDimitry Andric/// CC_M68k_Common - In all M68k calling conventions, extra integers and FP
57fe6060f1SDimitry Andric/// values are spilled on the stack.
58fe6060f1SDimitry Andricdef CC_M68k_Common : CallingConv<[
59fe6060f1SDimitry Andric  /// Handles byval parameters.
60fe6060f1SDimitry Andric  CCIfByVal<CCPassByVal<4, 4>>,
61fe6060f1SDimitry Andric
62fe6060f1SDimitry Andric  /// Integer values get stored in stack slots that are 4 bytes in
63fe6060f1SDimitry Andric  /// size and 4-byte aligned.
64fe6060f1SDimitry Andric  CCIfType<[i32],  CCAssignToStack<4, 4>>
65fe6060f1SDimitry Andric]>;
66fe6060f1SDimitry Andric
67fe6060f1SDimitry Andricdef CC_M68k_Fast : CallingConv<[
68fe6060f1SDimitry Andric  /// Promote i1/i8/i16 arguments to i32.
69fe6060f1SDimitry Andric  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
70fe6060f1SDimitry Andric
71fe6060f1SDimitry Andric  /// The 'nest' parameter, if any, is passed in A1.
72fe6060f1SDimitry Andric  CCIfNest<CCAssignToReg<[A1]>>, // FIXME verify if this is correct
73fe6060f1SDimitry Andric
74fe6060f1SDimitry Andric  /// Since M68k uses %An for pointers and we want them be passed in regs
75fe6060f1SDimitry Andric  /// too we have to use custom function.
76fe6060f1SDimitry Andric  CCIfType<[i32], CCCustom<"CC_M68k_Any_AssignToReg">>,
77fe6060f1SDimitry Andric
78fe6060f1SDimitry Andric  /// Otherwise, same as everything else.
79fe6060f1SDimitry Andric  CCDelegateTo<CC_M68k_Common>
80fe6060f1SDimitry Andric]>;
81fe6060f1SDimitry Andric
82fe6060f1SDimitry Andricdef CC_M68k_C : CallingConv<[
83fe6060f1SDimitry Andric  /// Promote i1/i8/i16 arguments to i32.
84fe6060f1SDimitry Andric  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
85fe6060f1SDimitry Andric
86fe6060f1SDimitry Andric  /// The 'nest' parameter, if any, is passed in A1.
87fe6060f1SDimitry Andric  CCIfNest<CCAssignToReg<[A1]>>, // FIXME verify if this is correct
88fe6060f1SDimitry Andric
89fe6060f1SDimitry Andric  /// Use registers only if 'inreg' used and the call is not vararg
90fe6060f1SDimitry Andric  CCIfNotVarArg<CCIfInReg<CCIfType<[i32], CCAssignToReg<[D0, D1]>>>>,
91fe6060f1SDimitry Andric
92fe6060f1SDimitry Andric  // TODO: Support for 'sret'
93fe6060f1SDimitry Andric
94fe6060f1SDimitry Andric  /// Otherwise, same as everything else.
95fe6060f1SDimitry Andric  CCDelegateTo<CC_M68k_Common>
96fe6060f1SDimitry Andric]>;
97fe6060f1SDimitry Andric
98fe6060f1SDimitry Andric/// This is the root argument convention for the M68k backend.
99fe6060f1SDimitry Andricdef CC_M68k : CallingConv<[
100fe6060f1SDimitry Andric  CCIfCC<"CallingConv::Fast", CCDelegateTo<CC_M68k_Fast>>,
101fe6060f1SDimitry Andric  CCDelegateTo<CC_M68k_C>
102fe6060f1SDimitry Andric]>;
103fe6060f1SDimitry Andric
104fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
105fe6060f1SDimitry Andric// Callee-saved Registers.
106fe6060f1SDimitry Andric//===----------------------------------------------------------------------===//
107fe6060f1SDimitry Andric
108fe6060f1SDimitry Andricdef CSR_NoRegs : CalleeSavedRegs<(add)>;
109fe6060f1SDimitry Andric
110fe6060f1SDimitry Andric// A5 - BP
111fe6060f1SDimitry Andric// A6 - FP
112fe6060f1SDimitry Andricdef CSR_STD : CalleeSavedRegs<(add D2, D3, D4, D5, D6, D7,
113fe6060f1SDimitry Andric                                   A2, A3, A4, A5, A6)>;
114fe6060f1SDimitry Andric
115