From a8c897c57ca21b641560e1d0bc40f32ba9c9b23e Mon Sep 17 00:00:00 2001 From: Dylan McKay Date: Sun, 20 Dec 2015 23:17:44 +0000 Subject: [PATCH] [AVR] Added AVRCallingConv.td git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256130 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AVR/AVR.td | 2 +- lib/Target/AVR/AVRCallingConv.td | 65 ++++++++++++++++++++++++++++++++ lib/Target/AVR/CMakeLists.txt | 1 + 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 lib/Target/AVR/AVRCallingConv.td diff --git a/lib/Target/AVR/AVR.td b/lib/Target/AVR/AVR.td index ba59c8f42db..9e80717cd68 100644 --- a/lib/Target/AVR/AVR.td +++ b/lib/Target/AVR/AVR.td @@ -522,7 +522,7 @@ include "AVRRegisterInfo.td" // Calling Conventions //===---------------------------------------------------------------------===// -//include "AVRCallingConv.td" +include "AVRCallingConv.td" //===---------------------------------------------------------------------===// // Assembly Printers diff --git a/lib/Target/AVR/AVRCallingConv.td b/lib/Target/AVR/AVRCallingConv.td new file mode 100644 index 00000000000..d8cb3fe8402 --- /dev/null +++ b/lib/Target/AVR/AVRCallingConv.td @@ -0,0 +1,65 @@ +//===-- AVRCallingConv.td - Calling Conventions for AVR ----*- tablegen -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// This describes the calling conventions for AVR architecture. +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +// AVR Return Value Calling Convention +//===----------------------------------------------------------------------===// + +def RetCC_AVR : CallingConv +<[ + // i8 is returned in R24. + CCIfType<[i8], CCAssignToReg<[R24]>>, + + // i16 are returned in R25:R24, R23:R22, R21:R20 and R19:R18. + CCIfType<[i16], CCAssignToReg<[R25R24, R23R22, R21R20, R19R18]>> +]>; + +// Special return value calling convention for runtime functions. +def RetCC_AVR_RT : CallingConv +<[ + CCIfType<[i8], CCAssignToReg<[R24,R25]>>, + CCIfType<[i16], CCAssignToReg<[R23R22, R25R24]>> +]>; + +//===----------------------------------------------------------------------===// +// AVR Argument Calling Conventions +//===----------------------------------------------------------------------===// + +// The calling conventions are implemented in custom C++ code + +// Calling convention for variadic functions. +def ArgCC_AVR_Vararg : CallingConv +<[ + // i16 are always passed through the stack with an alignment of 1. + CCAssignToStack<2, 1> +]>; + +// Special argument calling convention for +// multiplication runtime functions. +def ArgCC_AVR_RT_MUL : CallingConv +<[ + CCIfType<[i16], CCAssignToReg<[R27R26,R19R18]>> +]>; + +// Special argument calling convention for +// division runtime functions. +def ArgCC_AVR_RT_DIV : CallingConv +<[ + CCIfType<[i8], CCAssignToReg<[R24,R22]>>, + CCIfType<[i16], CCAssignToReg<[R25R24, R23R22]>> +]>; + +//===----------------------------------------------------------------------===// +// Callee-saved register lists. +//===----------------------------------------------------------------------===// + +def CSR_Normal : CalleeSavedRegs<(add R29, R28, (sequence "R%u", 17, 2))>; +def CSR_Interrupts : CalleeSavedRegs<(add (sequence "R%u", 31, 0))>; diff --git a/lib/Target/AVR/CMakeLists.txt b/lib/Target/AVR/CMakeLists.txt index 9c29f2086e6..22b30ef3585 100644 --- a/lib/Target/AVR/CMakeLists.txt +++ b/lib/Target/AVR/CMakeLists.txt @@ -1,6 +1,7 @@ set(LLVM_TARGET_DEFINITIONS AVR.td) tablegen(LLVM AVRGenRegisterInfo.inc -gen-register-info) +tablegen(LLVM AVRGenCallingConv.inc -gen-callingconv) add_public_tablegen_target(AVRCommonTableGen) add_llvm_target(AVRCodeGen -- 2.34.1