-
Notifications
You must be signed in to change notification settings - Fork 0
/
C65CallingConv.td
73 lines (63 loc) · 2.82 KB
/
C65CallingConv.td
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//===-- C65CallingConv.td - Calling Conventions for C65 --*- tablegen -*-===//
/// Taken from MipsCallingConv.td
///
/// Match if this specific argument is a vararg. This is slightly
/// different fro CCIfIsVarArg which matches if any argument is a
/// vararg.
//class CCIfArgIsVarArg<CCAction A>
// : CCIf<"!static_cast<MipsCCState *>(&State)->IsCallOperandFixed(ValNo)", A>;
def CC_C65_Stack : CallingConv<[
// Stack arguments are not aligned.
CCIfType<[i8], CCAssignToStack<1, 1>>,
CCIfType<[i16], CCAssignToStack<2, 1>>,
CCIfType<[i32], CCAssignToStack<4, 1>>,
CCIfType<[i64], CCAssignToStack<8, 1>>
]>;
def CC_C65 : CallingConv<[
// TODO:Assign all vararg arguments to the stack. Currently all
// arguments are passed to the stack if the function is variadic.
CCIfVarArg<CCDelegateTo<CC_C65_Stack>>,
// Non-vararg arguments go on zero registers by default.
CCIfType<[i8], CCAssignToReg<[ZR0, ZR1, ZR2, ZR3,
ZR4, ZR5, ZR6, ZR7,
ZR8, ZR9, ZR10, ZR11,
ZR12, ZR13, ZR14, ZR15]>>,
CCIfType<[i16], CCAssignToReg<[ZR0W, ZR2W, ZR4W, ZR6W,
ZR8W, ZR10W, ZR12W, ZR14W]>>,
CCIfType<[i32], CCAssignToReg<[ZR0D, ZR4D, ZR8D, ZR12D]>>,
CCIfType<[i64], CCAssignToReg<[ZR0Q, ZR8Q]>>,
// Assign to stack if we run out of zero page registers.
CCDelegateTo<CC_C65_Stack>
]>;
def RetCC_C65 : CallingConv<[
CCIfType<[i8], CCAssignToReg<[ZR0, ZR1, ZR2, ZR3,
ZR4, ZR5, ZR6, ZR7,
ZR8, ZR9, ZR10, ZR11,
ZR12, ZR13, ZR14, ZR15]>>,
CCIfType<[i16], CCAssignToReg<[ZR0W, ZR2W, ZR4W, ZR6W,
ZR8W, ZR10W, ZR12W, ZR14W]>>,
CCIfType<[i32], CCAssignToReg<[ZR0D, ZR4D, ZR8D, ZR12D]>>,
CCIfType<[i64], CCAssignToReg<[ZR0Q, ZR8Q]>>
//// Return values are passed exactly like arguments.
//CCDelegateTo<CC_C65>
]>;
// By default, save half of the ZP registers.
//def CSR_C65 : CalleeSavedRegs<(add ZR16W, ZR18W, ZR20W, ZR22W, ZR24W,
// ZR26W, ZR28W, ZR30W)>;
def CSR_C65 : CalleeSavedRegs<(add ZR16Q, ZR24Q)>;
// Libcalls are required to save all ZP registers that are touched.
def CSR_C65_AllRegs : CalleeSavedRegs<(add CSR_C65, ZR0Q, ZR8Q)>;
/// WDC W65816 C compiler calling convention.
///
// def CC_W65816CC : CallingConv<[
// // All arguments are passed via the stack.
// CCIfType<[i8], CCAssignToStack<1, 1>>,
// CCIfType<[i16], CCAssignToStack<2, 1>>,
// CCIfType<[i32], CCAssignToStack<4, 1>>,
// CCIfType<[i64], CCAssignToStack<8, 1>>
// ]>;
// def RetCC_W65816CC : CallingConv<[
// // Return values are passed via A, or X:A for 32-bit integers.
// CCIfType<[i8], CCAssignToReg<[AL]>>,
// CCIfType<[i16], CCAssignToReg<[A, X]>>
// ]>;