xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYCallingConv.td (revision 0eae32dcef82f6f06de6419a0d623d7def0cc8f6)
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