1
/* See ../README for copyright */
3
#define MFRAME_STACK_STRUCT 0
4
#define MFRAME_STRUCT_BYREF 1
5
#define MFRAME_SMALL_STRUCT 0
6
#define MFRAME_ARGS_SIZE 32
7
#define MFRAME_RESULT_SIZE 16
9
#define MFRAME_GET_STRUCT_ADDR(ARGS, TYPES) \
10
((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) ? \
11
*(void**)((ARGS)->arg_regs+sizeof(void*)): (void*)0)
13
#define MFRAME_SET_STRUCT_ADDR(ARGS, TYPES, ADDR) \
14
({if (*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) \
15
*(void**)((ARGS)->arg_regs+sizeof(void*)) = (ADDR);})
21
int offsets[2]; /* 0 for args in regs, 1 for the rest of args on stack */
25
#define MFRAME_ARGS struct sparc_args
27
#define MFRAME_INIT_ARGS(CUM, RTYPE) \
29
(CUM).offsets[0] = 8; /* encoding in regs starts from 8 */ \
30
(CUM).offsets[1] = 20; /* encoding on stack starts from 20 or 24 */ \
34
#define GET_SPARC_ARG_LOCATION(CUM, CSTRING_TYPE, TYPESIZE) \
37
: ((CUM).offsets[IN_REGS] + TYPESIZE <= 6 * sizeof(int) + 8 \
38
? (((CUM).offsets[IN_REGS] + TYPESIZE <= 6 * sizeof(int) + 4 \
39
? 0 : ((CUM).offsets[ON_STACK] += 4)),\
41
: ((CUM).onStack = YES, ON_STACK)))
43
#define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) \
45
const char* type = (TYPE); \
46
int align = objc_alignof_type(type); \
47
int size = objc_sizeof_type(type); \
48
int locn = GET_SPARC_ARG_LOCATION(CUM, type, size); \
50
(CUM).offsets[locn] = ROUND((CUM).offsets[locn], align); \
51
if (size < sizeof(int)) \
53
(CUM).offsets[locn] += sizeof(int) - ROUND(size, align); \
55
(TYPE) = objc_skip_typespec(type); \
56
if (locn == IN_REGS) \
58
sprintf((DEST), "%.*s+%d", (TYPE)-type, type, (CUM).offsets[locn]); \
62
sprintf((DEST), "%.*s%d", (TYPE)-type, type, (CUM).offsets[locn]); \
72
while (isdigit(*(TYPE))) \
76
(DEST)=&(DEST)[strlen(DEST)]; \
77
if (locn == ON_STACK) \
79
if ((*type==_C_STRUCT_B || *type==_C_UNION_B || *type==_C_ARY_B)) \
81
(STACK) = (CUM).offsets[ON_STACK] + ROUND(size, align); \
85
(STACK) = (CUM).offsets[ON_STACK] + size; \
88
(CUM).offsets[locn] += \
90
? ROUND(size, align) \
91
: ROUND(size, sizeof(void*)); \