xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VECallingConv.td (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1480093f4SDimitry Andric//===-- VECallingConv.td - Calling Conventions VE ----------*- tablegen -*-===//
2480093f4SDimitry Andric//
3480093f4SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4480093f4SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5480093f4SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6480093f4SDimitry Andric//
7480093f4SDimitry Andric//===----------------------------------------------------------------------===//
8480093f4SDimitry Andric//
9480093f4SDimitry Andric// This describes the calling conventions for the VE architectures.
10480093f4SDimitry Andric//
11480093f4SDimitry Andric//===----------------------------------------------------------------------===//
12480093f4SDimitry Andric
13480093f4SDimitry Andric//===----------------------------------------------------------------------===//
14480093f4SDimitry Andric// Aurora VE
15480093f4SDimitry Andric//===----------------------------------------------------------------------===//
16*5ffd83dbSDimitry Andricdef CC_VE_C_Stack: CallingConv<[
17*5ffd83dbSDimitry Andric  // float --> need special handling like below.
18*5ffd83dbSDimitry Andric  //    0      4
19*5ffd83dbSDimitry Andric  //    +------+------+
20*5ffd83dbSDimitry Andric  //    | empty| float|
21*5ffd83dbSDimitry Andric  //    +------+------+
22*5ffd83dbSDimitry Andric  CCIfType<[f32], CCCustom<"allocateFloat">>,
23*5ffd83dbSDimitry Andric
24*5ffd83dbSDimitry Andric  // All of the rest are assigned to the stack in 8-byte aligned units.
25*5ffd83dbSDimitry Andric  CCAssignToStack<0, 8>
26*5ffd83dbSDimitry Andric]>;
27*5ffd83dbSDimitry Andric
28*5ffd83dbSDimitry Andricdef CC_VE : CallingConv<[
29*5ffd83dbSDimitry Andric  // All arguments get passed in generic registers if there is space.
30*5ffd83dbSDimitry Andric
31*5ffd83dbSDimitry Andric  // Promote i1/i8/i16 arguments to i32.
32*5ffd83dbSDimitry Andric  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
33*5ffd83dbSDimitry Andric
34*5ffd83dbSDimitry Andric  // bool, char, int, enum, long --> generic integer 32 bit registers
35*5ffd83dbSDimitry Andric  CCIfType<[i32], CCAssignToRegWithShadow<
36*5ffd83dbSDimitry Andric    [SW0, SW1, SW2, SW3, SW4, SW5, SW6, SW7],
37*5ffd83dbSDimitry Andric    [SX0, SX1, SX2, SX3, SX4, SX5, SX6, SX7]>>,
38*5ffd83dbSDimitry Andric
39*5ffd83dbSDimitry Andric  // float --> generic floating point 32 bit registers
40*5ffd83dbSDimitry Andric  CCIfType<[f32], CCAssignToRegWithShadow<
41*5ffd83dbSDimitry Andric    [SF0, SF1, SF2, SF3, SF4, SF5, SF6, SF7],
42*5ffd83dbSDimitry Andric    [SX0, SX1, SX2, SX3, SX4, SX5, SX6, SX7]>>,
43*5ffd83dbSDimitry Andric
44*5ffd83dbSDimitry Andric  // long long/double --> generic 64 bit registers
45*5ffd83dbSDimitry Andric  CCIfType<[i64, f64],
46*5ffd83dbSDimitry Andric           CCAssignToReg<[SX0, SX1, SX2, SX3, SX4, SX5, SX6, SX7]>>,
47*5ffd83dbSDimitry Andric
48*5ffd83dbSDimitry Andric  // Alternatively, they are assigned to the stack in 8-byte aligned units.
49*5ffd83dbSDimitry Andric  CCDelegateTo<CC_VE_C_Stack>
50*5ffd83dbSDimitry Andric]>;
51*5ffd83dbSDimitry Andric
52*5ffd83dbSDimitry Andric// All arguments get passed in stack for varargs function or non-prototyped
53*5ffd83dbSDimitry Andric// function.
54*5ffd83dbSDimitry Andricdef CC_VE2 : CallingConv<[
55*5ffd83dbSDimitry Andric  // float --> need special handling like below.
56*5ffd83dbSDimitry Andric  //    0      4
57*5ffd83dbSDimitry Andric  //    +------+------+
58*5ffd83dbSDimitry Andric  //    | empty| float|
59*5ffd83dbSDimitry Andric  //    +------+------+
60*5ffd83dbSDimitry Andric  CCIfType<[f32], CCCustom<"allocateFloat">>,
61*5ffd83dbSDimitry Andric
62*5ffd83dbSDimitry Andric  CCAssignToStack<0, 8>
63*5ffd83dbSDimitry Andric]>;
64*5ffd83dbSDimitry Andric
65*5ffd83dbSDimitry Andricdef RetCC_VE : CallingConv<[
66*5ffd83dbSDimitry Andric  // Promote i1/i8/i16 arguments to i32.
67*5ffd83dbSDimitry Andric  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
68*5ffd83dbSDimitry Andric
69*5ffd83dbSDimitry Andric  // bool, char, int, enum, long --> generic integer 32 bit registers
70*5ffd83dbSDimitry Andric  CCIfType<[i32], CCAssignToRegWithShadow<
71*5ffd83dbSDimitry Andric    [SW0, SW1, SW2, SW3, SW4, SW5, SW6, SW7],
72*5ffd83dbSDimitry Andric    [SX0, SX1, SX2, SX3, SX4, SX5, SX6, SX7]>>,
73*5ffd83dbSDimitry Andric
74*5ffd83dbSDimitry Andric  // float --> generic floating point 32 bit registers
75*5ffd83dbSDimitry Andric  CCIfType<[f32], CCAssignToRegWithShadow<
76*5ffd83dbSDimitry Andric    [SF0, SF1, SF2, SF3, SF4, SF5, SF6, SF7],
77*5ffd83dbSDimitry Andric    [SX0, SX1, SX2, SX3, SX4, SX5, SX6, SX7]>>,
78*5ffd83dbSDimitry Andric
79*5ffd83dbSDimitry Andric  // long long/double --> generic 64 bit registers
80*5ffd83dbSDimitry Andric  CCIfType<[i64, f64],
81*5ffd83dbSDimitry Andric           CCAssignToReg<[SX0, SX1, SX2, SX3, SX4, SX5, SX6, SX7]>>,
82*5ffd83dbSDimitry Andric]>;
83480093f4SDimitry Andric
84480093f4SDimitry Andric// Callee-saved registers
85480093f4SDimitry Andricdef CSR : CalleeSavedRegs<(add (sequence "SX%u", 18, 33))>;
86480093f4SDimitry Andricdef CSR_NoRegs : CalleeSavedRegs<(add)>;
87*5ffd83dbSDimitry Andric
88*5ffd83dbSDimitry Andric// PreserveAll (clobbers s62,s63) - used for ve_grow_stack
89*5ffd83dbSDimitry Andricdef CSR_preserve_all : CalleeSavedRegs<(add (sequence "SX%u", 0, 61))>;
90