12cab237bSDimitry Andric//===-- RISCVCallingConv.td - Calling Conventions RISCV ----*- tablegen -*-===// 22cab237bSDimitry Andric// 32cab237bSDimitry Andric// The LLVM Compiler Infrastructure 42cab237bSDimitry Andric// 52cab237bSDimitry Andric// This file is distributed under the University of Illinois Open Source 62cab237bSDimitry Andric// License. See LICENSE.TXT for details. 72cab237bSDimitry Andric// 82cab237bSDimitry Andric//===----------------------------------------------------------------------===// 92cab237bSDimitry Andric// 102cab237bSDimitry Andric// This describes the calling conventions for the RISCV architecture. 112cab237bSDimitry Andric// 122cab237bSDimitry Andric//===----------------------------------------------------------------------===// 132cab237bSDimitry Andric 142cab237bSDimitry Andric// The RISC-V calling convention is handled with custom code in 152cab237bSDimitry Andric// RISCVISelLowering.cpp (CC_RISCV). 162cab237bSDimitry Andric 172cab237bSDimitry Andricdef CSR : CalleeSavedRegs<(add X1, X3, X4, X8, X9, (sequence "X%u", 18, 27))>; 182cab237bSDimitry Andric 192cab237bSDimitry Andric// Needed for implementation of RISCVRegisterInfo::getNoPreservedMask() 202cab237bSDimitry Andricdef CSR_NoRegs : CalleeSavedRegs<(add)>; 21*4ba319b5SDimitry Andric 22*4ba319b5SDimitry Andric// Interrupt handler needs to save/restore all registers that are used, 23*4ba319b5SDimitry Andric// both Caller and Callee saved registers. 24*4ba319b5SDimitry Andricdef CSR_Interrupt : CalleeSavedRegs<(add X1, 25*4ba319b5SDimitry Andric (sequence "X%u", 3, 9), 26*4ba319b5SDimitry Andric (sequence "X%u", 10, 11), 27*4ba319b5SDimitry Andric (sequence "X%u", 12, 17), 28*4ba319b5SDimitry Andric (sequence "X%u", 18, 27), 29*4ba319b5SDimitry Andric (sequence "X%u", 28, 31))>; 30*4ba319b5SDimitry Andric 31*4ba319b5SDimitry Andric// Same as CSR_Interrupt, but including all 32-bit FP registers. 32*4ba319b5SDimitry Andricdef CSR_XLEN_F32_Interrupt: CalleeSavedRegs<(add X1, 33*4ba319b5SDimitry Andric (sequence "X%u", 3, 9), 34*4ba319b5SDimitry Andric (sequence "X%u", 10, 11), 35*4ba319b5SDimitry Andric (sequence "X%u", 12, 17), 36*4ba319b5SDimitry Andric (sequence "X%u", 18, 27), 37*4ba319b5SDimitry Andric (sequence "X%u", 28, 31), 38*4ba319b5SDimitry Andric (sequence "F%u_32", 0, 7), 39*4ba319b5SDimitry Andric (sequence "F%u_32", 10, 11), 40*4ba319b5SDimitry Andric (sequence "F%u_32", 12, 17), 41*4ba319b5SDimitry Andric (sequence "F%u_32", 28, 31), 42*4ba319b5SDimitry Andric (sequence "F%u_32", 8, 9), 43*4ba319b5SDimitry Andric (sequence "F%u_32", 18, 27))>; 44*4ba319b5SDimitry Andric 45*4ba319b5SDimitry Andric// Same as CSR_Interrupt, but including all 64-bit FP registers. 46*4ba319b5SDimitry Andricdef CSR_XLEN_F64_Interrupt: CalleeSavedRegs<(add X1, 47*4ba319b5SDimitry Andric (sequence "X%u", 3, 9), 48*4ba319b5SDimitry Andric (sequence "X%u", 10, 11), 49*4ba319b5SDimitry Andric (sequence "X%u", 12, 17), 50*4ba319b5SDimitry Andric (sequence "X%u", 18, 27), 51*4ba319b5SDimitry Andric (sequence "X%u", 28, 31), 52*4ba319b5SDimitry Andric (sequence "F%u_64", 0, 7), 53*4ba319b5SDimitry Andric (sequence "F%u_64", 10, 11), 54*4ba319b5SDimitry Andric (sequence "F%u_64", 12, 17), 55*4ba319b5SDimitry Andric (sequence "F%u_64", 28, 31), 56*4ba319b5SDimitry Andric (sequence "F%u_64", 8, 9), 57*4ba319b5SDimitry Andric (sequence "F%u_64", 18, 27))>; 58