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