1*0b57cec5SDimitry Andric//===-- BPFCallingConv.td - Calling Conventions BPF --------*- tablegen -*-===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric// 9*0b57cec5SDimitry Andric// This describes the calling conventions for the BPF architecture. 10*0b57cec5SDimitry Andric// 11*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric// BPF 64-bit C return-value convention. 14*0b57cec5SDimitry Andricdef RetCC_BPF64 : CallingConv<[CCIfType<[i64], CCAssignToReg<[R0]>>]>; 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andric// BPF 64-bit C Calling convention. 17*0b57cec5SDimitry Andricdef CC_BPF64 : CallingConv<[ 18*0b57cec5SDimitry Andric // Promote i8/i16/i32 args to i64 19*0b57cec5SDimitry Andric CCIfType<[ i8, i16, i32 ], CCPromoteToType<i64>>, 20*0b57cec5SDimitry Andric 21*0b57cec5SDimitry Andric // All arguments get passed in integer registers if there is space. 22*0b57cec5SDimitry Andric CCIfType<[i64], CCAssignToReg<[ R1, R2, R3, R4, R5 ]>>, 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric // Could be assigned to the stack in 8-byte aligned units, but unsupported 25*0b57cec5SDimitry Andric CCAssignToStack<8, 8> 26*0b57cec5SDimitry Andric]>; 27*0b57cec5SDimitry Andric 28*0b57cec5SDimitry Andric// Return-value convention when -mattr=+alu32 enabled 29*0b57cec5SDimitry Andricdef RetCC_BPF32 : CallingConv<[ 30*0b57cec5SDimitry Andric CCIfType<[i32], CCAssignToRegWithShadow<[W0], [R0]>>, 31*0b57cec5SDimitry Andric CCIfType<[i64], CCAssignToRegWithShadow<[R0], [W0]>> 32*0b57cec5SDimitry Andric]>; 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric// Calling convention when -mattr=+alu32 enabled 35*0b57cec5SDimitry Andricdef CC_BPF32 : CallingConv<[ 36*0b57cec5SDimitry Andric // Promote i8/i16/i32 args to i64 37*0b57cec5SDimitry Andric CCIfType<[i32], CCAssignToRegWithShadow<[W1, W2, W3, W4, W5], 38*0b57cec5SDimitry Andric [R1, R2, R3, R4, R5]>>, 39*0b57cec5SDimitry Andric 40*0b57cec5SDimitry Andric // All arguments get passed in integer registers if there is space. 41*0b57cec5SDimitry Andric CCIfType<[i64], CCAssignToRegWithShadow<[R1, R2, R3, R4, R5], 42*0b57cec5SDimitry Andric [W1, W2, W3, W4, W5]>>, 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric // Could be assigned to the stack in 8-byte aligned units, but unsupported 45*0b57cec5SDimitry Andric CCAssignToStack<8, 8> 46*0b57cec5SDimitry Andric]>; 47*0b57cec5SDimitry Andric 48*0b57cec5SDimitry Andricdef CSR : CalleeSavedRegs<(add R6, R7, R8, R9, R10)>; 49