xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AVR/AVRCallingConv.td (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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