SparcCallingConv.td revision 249423
1224133Sdim//===-- SparcCallingConv.td - Calling Conventions Sparc ----*- tablegen -*-===//
2224133Sdim//
3224133Sdim//                     The LLVM Compiler Infrastructure
4224133Sdim//
5224133Sdim// This file is distributed under the University of Illinois Open Source
6224133Sdim// License. See LICENSE.TXT for details.
7224133Sdim//
8224133Sdim//===----------------------------------------------------------------------===//
9224133Sdim//
10224133Sdim// This describes the calling conventions for the Sparc architectures.
11224133Sdim//
12224133Sdim//===----------------------------------------------------------------------===//
13224133Sdim
14224133Sdim//===----------------------------------------------------------------------===//
15224133Sdim// Return Value Calling Conventions
16224133Sdim//===----------------------------------------------------------------------===//
17224133Sdim
18224133Sdim// Sparc 32-bit C return-value convention.
19224133Sdimdef RetCC_Sparc32 : CallingConv<[
20224133Sdim  CCIfType<[i32], CCAssignToReg<[I0, I1, I2, I3, I4, I5]>>,
21224133Sdim  CCIfType<[f32], CCAssignToReg<[F0, F1, F2, F3]>>,
22224133Sdim  CCIfType<[f64], CCAssignToReg<[D0, D1]>>
23249423Sdim]>;
24224133Sdim
25224133Sdim// Sparc 64-bit C return-value convention.
26224133Sdimdef RetCC_Sparc64 : CallingConv<[
27224133Sdim  CCIfType<[i32], CCPromoteToType<i64>>,
28239462Sdim  CCIfType<[i64], CCAssignToReg<[I0, I1, I2, I3, I4, I5]>>,
29224133Sdim  CCIfType<[f32], CCAssignToReg<[F0, F1, F2, F3]>>,
30224133Sdim  CCIfType<[f64], CCAssignToReg<[D0, D1]>>
31224133Sdim]>;
32224133Sdim
33224133Sdim// Sparc 32-bit C Calling convention.
34224133Sdimdef CC_Sparc32 : CallingConv<[
35224133Sdim  //Custom assign SRet to [sp+64].
36224133Sdim  CCIfSRet<CCCustom<"CC_Sparc_Assign_SRet">>,
37224133Sdim  // i32 f32 arguments get passed in integer registers if there is space.
38224133Sdim  CCIfType<[i32, f32], CCAssignToReg<[I0, I1, I2, I3, I4, I5]>>,
39239462Sdim  // f64 arguments are split and passed through registers or through stack.
40263508Sdim  CCIfType<[f64], CCCustom<"CC_Sparc_Assign_f64">>,
41263508Sdim
42263508Sdim  // Alternatively, they are assigned to the stack in 4-byte aligned units.
43224133Sdim  CCAssignToStack<4, 4>
44224133Sdim]>;
45239462Sdim
46224133Sdim// Sparc 64-bit C Calling convention.
47224133Sdimdef CC_Sparc64 : CallingConv<[
48224133Sdim  // All integers are promoted to i64 by the caller.
49224133Sdim  CCIfType<[i32], CCPromoteToType<i64>>,
50224133Sdim  // Integer arguments get passed in integer registers if there is space.
51224133Sdim  CCIfType<[i64], CCAssignToReg<[I0, I1, I2, I3, I4, I5]>>,
52224133Sdim  // FIXME: Floating point arguments.
53243830Sdim
54239462Sdim  // Alternatively, they are assigned to the stack in 8-byte aligned units.
55263508Sdim  CCAssignToStack<8, 8>
56263508Sdim]>;
57263508Sdim