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