1*349cc55cSDimitry Andric//===-- CSKYCallingConv.td - Calling Conventions CSKY ----*- tablegen -*---===// 2*349cc55cSDimitry Andric// 3*349cc55cSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*349cc55cSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*349cc55cSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*349cc55cSDimitry Andric// 7*349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 8*349cc55cSDimitry Andric// 9*349cc55cSDimitry Andric// This describes the calling conventions for the CSKY architecture. 10*349cc55cSDimitry Andric// 11*349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 12*349cc55cSDimitry Andric 13*349cc55cSDimitry Andricdef CSR_I32 : CalleeSavedRegs<(add R8, R15, (sequence "R%u", 4, 7), 14*349cc55cSDimitry Andric (sequence "R%u", 9, 11), (sequence "R%u", 16, 17), R28)>; 15*349cc55cSDimitry Andricdef CSR_GPR_FPR32 : CalleeSavedRegs<(add CSR_I32, (sequence "F%u_32", 8, 15))>; 16*349cc55cSDimitry Andricdef CSR_GPR_FPR64 : CalleeSavedRegs<(add CSR_I32, 17*349cc55cSDimitry Andric (sequence "F%u_64", 8, 15))>; 18*349cc55cSDimitry Andric 19*349cc55cSDimitry Andric// Interrupt handler needs to save/restore all registers that are used, 20*349cc55cSDimitry Andric// both Caller and Callee saved registers. 21*349cc55cSDimitry Andricdef CSR_GPR_ISR : CalleeSavedRegs<(add R8, R15, 22*349cc55cSDimitry Andric (sequence "R%u", 0, 3), 23*349cc55cSDimitry Andric (sequence "R%u", 4, 7), 24*349cc55cSDimitry Andric (sequence "R%u", 9, 13), 25*349cc55cSDimitry Andric (sequence "R%u", 16, 31))>; 26*349cc55cSDimitry Andric 27*349cc55cSDimitry Andricdef CSR_GPR_FPR32_ISR: CalleeSavedRegs<(add CSR_GPR_ISR, 28*349cc55cSDimitry Andric (sequence "F%u_32", 0, 15))>; 29*349cc55cSDimitry Andricdef CSR_GPR_FPR64_ISR: CalleeSavedRegs<(add CSR_GPR_ISR, 30*349cc55cSDimitry Andric (sequence "F%u_64", 0, 15))>; 31*349cc55cSDimitry Andric 32*349cc55cSDimitry Andricdef CSR_GPR_FPR32v3_ISR: CalleeSavedRegs<(add CSR_GPR_FPR32_ISR, 33*349cc55cSDimitry Andric (sequence "F%u_32", 16, 31))>; 34*349cc55cSDimitry Andricdef CSR_GPR_FPR64v3_ISR: CalleeSavedRegs<(add CSR_GPR_FPR64_ISR, 35*349cc55cSDimitry Andric (sequence "F%u_64", 16, 31))>; 36*349cc55cSDimitry Andric 37*349cc55cSDimitry Andric// Needed for implementation of CSKYRegisterInfo::getNoPreservedMask() 38*349cc55cSDimitry Andricdef CSR_NoRegs : CalleeSavedRegs<(add)>; 39*349cc55cSDimitry Andric 40*349cc55cSDimitry Andricdef CC_CSKY_ABIV2_SOFT : CallingConv<[ 41*349cc55cSDimitry Andric // DSP types 42*349cc55cSDimitry Andric CCIfType<[v2i16, v4i8], CCAssignToReg<[R0, R1, R2, R3]>>, 43*349cc55cSDimitry Andric CCIfType<[v2i16, v4i8], CCAssignToStack<4, 4>>, 44*349cc55cSDimitry Andric CCIfType<[i8, i16], CCPromoteToType<i32>>, 45*349cc55cSDimitry Andric CCIfType<[f32], CCAssignToReg<[R0, R1, R2, R3]>>, 46*349cc55cSDimitry Andric CCIfType<[f32], CCAssignToStack<4, 4>>, 47*349cc55cSDimitry Andric CCIfType<[i32], CCAssignToReg<[R0, R1, R2, R3]>>, 48*349cc55cSDimitry Andric CCIfType<[i32], CCAssignToStack<4, 4>>, 49*349cc55cSDimitry Andric CCIfType<[f64], CCCustom<"CC_CSKY_ABIV2_SOFT_64">>, 50*349cc55cSDimitry Andric CCIfType<[f64], CCAssignToStack<8, 4>> 51*349cc55cSDimitry Andric]>; 52*349cc55cSDimitry Andric 53*349cc55cSDimitry Andricdef RetCC_CSKY_ABIV2_SOFT : CallingConv<[ 54*349cc55cSDimitry Andric // DSP types 55*349cc55cSDimitry Andric CCIfType<[v2i16, v4i8], CCAssignToReg<[R0, R1]>>, 56*349cc55cSDimitry Andric CCIfType<[i8, i16], CCPromoteToType<i32>>, 57*349cc55cSDimitry Andric CCIfType<[f32], CCBitConvertToType<i32>>, 58*349cc55cSDimitry Andric CCIfType<[i32], CCAssignToReg<[R0, R1]>>, 59*349cc55cSDimitry Andric CCIfType<[f64], CCCustom<"Ret_CSKY_ABIV2_SOFT_64">> 60*349cc55cSDimitry Andric]>; 61*349cc55cSDimitry Andric 62*349cc55cSDimitry Andricdef CC_CSKY_ABIV2_FP : CallingConv<[ 63*349cc55cSDimitry Andric // DSP types 64*349cc55cSDimitry Andric CCIfType<[v2i16, v4i8], CCAssignToReg<[R0, R1, R2, R3]>>, 65*349cc55cSDimitry Andric CCIfType<[v2i16, v4i8], CCAssignToStack<4, 4>>, 66*349cc55cSDimitry Andric CCIfType<[i8, i16], CCPromoteToType<i32>>, 67*349cc55cSDimitry Andric CCIfType<[i32], CCAssignToReg<[R0, R1, R2, R3]>>, 68*349cc55cSDimitry Andric CCIfType<[i32], CCAssignToStack<4, 4>>, 69*349cc55cSDimitry Andric CCIfType<[f32], CCAssignToReg<[F0_32, F1_32, F2_32, F3_32]>>, 70*349cc55cSDimitry Andric CCIfType<[f32], CCAssignToStack<4, 4>>, 71*349cc55cSDimitry Andric CCIfType<[f64], CCAssignToReg<[F0_64, F1_64, F2_64, F3_64]>>, 72*349cc55cSDimitry Andric CCIfType<[f64], CCAssignToStack<8, 4>> 73*349cc55cSDimitry Andric]>; 74*349cc55cSDimitry Andric 75*349cc55cSDimitry Andricdef RetCC_CSKY_ABIV2_FP : CallingConv<[ 76*349cc55cSDimitry Andric // DSP types 77*349cc55cSDimitry Andric CCIfType<[v2i16, v4i8], CCAssignToReg<[R0, R1]>>, 78*349cc55cSDimitry Andric CCIfType<[i8, i16], CCPromoteToType<i32>>, 79*349cc55cSDimitry Andric CCIfType<[i32], CCAssignToReg<[R0, R1]>>, 80*349cc55cSDimitry Andric CCIfType<[f32], CCAssignToReg<[F0_32]>>, 81*349cc55cSDimitry Andric CCIfType<[f64], CCAssignToReg<[F0_64]>> 82*349cc55cSDimitry Andric]>; 83