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