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