1//===-- AVRCallingConv.td - Calling Conventions for AVR ----*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// This describes the calling conventions for AVR architecture. 10//===----------------------------------------------------------------------===// 11 12//===----------------------------------------------------------------------===// 13// AVR Return Value Calling Convention 14//===----------------------------------------------------------------------===// 15 16def RetCC_AVR : CallingConv 17<[ 18 // i8 is returned in R24. 19 CCIfType<[i8], CCAssignToReg<[R24]>>, 20 21 // i16 are returned in R25:R24, R23:R22, R21:R20 and R19:R18. 22 CCIfType<[i16], CCAssignToReg<[R25R24, R23R22, R21R20, R19R18]>> 23]>; 24 25// Special return value calling convention for runtime functions. 26def RetCC_AVR_RT : CallingConv 27<[ 28 CCIfType<[i8], CCAssignToReg<[R24,R25]>>, 29 CCIfType<[i16], CCAssignToReg<[R23R22, R25R24]>> 30]>; 31 32//===----------------------------------------------------------------------===// 33// AVR Argument Calling Conventions 34//===----------------------------------------------------------------------===// 35 36// The calling conventions are implemented in custom C++ code 37 38// Calling convention for variadic functions. 39def ArgCC_AVR_Vararg : CallingConv 40<[ 41 // i16 are always passed through the stack with an alignment of 1. 42 CCAssignToStack<2, 1> 43]>; 44 45// Special argument calling convention for 46// multiplication runtime functions. 47def ArgCC_AVR_RT_MUL : CallingConv 48<[ 49 CCIfType<[i16], CCAssignToReg<[R27R26,R19R18]>> 50]>; 51 52// Special argument calling convention for 53// division runtime functions. 54def ArgCC_AVR_RT_DIV : CallingConv 55<[ 56 CCIfType<[i8], CCAssignToReg<[R24,R22]>>, 57 CCIfType<[i16], CCAssignToReg<[R25R24, R23R22]>> 58]>; 59 60//===----------------------------------------------------------------------===// 61// Callee-saved register lists. 62//===----------------------------------------------------------------------===// 63 64def CSR_Normal : CalleeSavedRegs<(add R29, R28, (sequence "R%u", 17, 2))>; 65def CSR_Interrupts : CalleeSavedRegs<(add (sequence "R%u", 31, 0))>; 66