1*0b57cec5SDimitry Andric//===-- AVRCallingConv.td - Calling Conventions for AVR ----*- tablegen -*-===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric// This describes the calling conventions for AVR architecture. 9*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10*0b57cec5SDimitry Andric 11*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric// AVR Return Value Calling Convention 13*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 14*0b57cec5SDimitry Andric 15*0b57cec5SDimitry Andricdef RetCC_AVR : CallingConv 16*0b57cec5SDimitry Andric<[ 17*0b57cec5SDimitry Andric // i8 is returned in R24. 18*0b57cec5SDimitry Andric CCIfType<[i8], CCAssignToReg<[R24]>>, 19*0b57cec5SDimitry Andric 20*0b57cec5SDimitry Andric // i16 are returned in R25:R24, R23:R22, R21:R20 and R19:R18. 21*0b57cec5SDimitry Andric CCIfType<[i16], CCAssignToReg<[R25R24, R23R22, R21R20, R19R18]>> 22*0b57cec5SDimitry Andric]>; 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric// Special return value calling convention for runtime functions. 25*0b57cec5SDimitry Andricdef RetCC_AVR_BUILTIN : CallingConv 26*0b57cec5SDimitry Andric<[ 27*0b57cec5SDimitry Andric CCIfType<[i8], CCAssignToReg<[R24,R25]>>, 28*0b57cec5SDimitry Andric CCIfType<[i16], CCAssignToReg<[R23R22, R25R24]>> 29*0b57cec5SDimitry Andric]>; 30*0b57cec5SDimitry Andric 31*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 32*0b57cec5SDimitry Andric// AVR Argument Calling Conventions 33*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 34*0b57cec5SDimitry Andric 35*0b57cec5SDimitry Andric// The calling conventions are implemented in custom C++ code 36*0b57cec5SDimitry Andric 37*0b57cec5SDimitry Andric// Calling convention for variadic functions. 38*0b57cec5SDimitry Andricdef ArgCC_AVR_Vararg : CallingConv 39*0b57cec5SDimitry Andric<[ 40*0b57cec5SDimitry Andric // i16 are always passed through the stack with an alignment of 1. 41*0b57cec5SDimitry Andric CCAssignToStack<2, 1> 42*0b57cec5SDimitry Andric]>; 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric// Special argument calling convention for 45*0b57cec5SDimitry Andric// division runtime functions. 46*0b57cec5SDimitry Andricdef ArgCC_AVR_BUILTIN_DIV : CallingConv 47*0b57cec5SDimitry Andric<[ 48*0b57cec5SDimitry Andric CCIfType<[i8], CCAssignToReg<[R24,R22]>>, 49*0b57cec5SDimitry Andric CCIfType<[i16], CCAssignToReg<[R25R24, R23R22]>> 50*0b57cec5SDimitry Andric]>; 51*0b57cec5SDimitry Andric 52*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 53*0b57cec5SDimitry Andric// Callee-saved register lists. 54*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andricdef CSR_Normal : CalleeSavedRegs<(add R29, R28, (sequence "R%u", 17, 2))>; 57*0b57cec5SDimitry Andricdef CSR_Interrupts : CalleeSavedRegs<(add (sequence "R%u", 31, 0))>; 58