~ubuntu-branches/ubuntu/trusty/gnustep-base/trusty

« back to all changes in this revision

Viewing changes to Source/mframe/sparc/generic

Tags: upstream-1.20.0
ImportĀ upstreamĀ versionĀ 1.20.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* See ../README for copyright */
2
 
 
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
8
 
 
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)
12
 
 
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);})
16
 
 
17
 
#define IN_REGS 0
18
 
#define ON_STACK 1
19
 
 
20
 
struct sparc_args {
21
 
  int offsets[2];   /* 0 for args in regs, 1 for the rest of args on stack */
22
 
  int onStack;
23
 
};
24
 
 
25
 
#define MFRAME_ARGS struct sparc_args
26
 
 
27
 
#define MFRAME_INIT_ARGS(CUM, RTYPE)    \
28
 
({ \
29
 
  (CUM).offsets[0] = 8; /* encoding in regs starts from 8 */ \
30
 
  (CUM).offsets[1] = 20; /* encoding on stack starts from 20 or 24 */ \
31
 
  (CUM).onStack = NO; \
32
 
})
33
 
 
34
 
#define GET_SPARC_ARG_LOCATION(CUM, CSTRING_TYPE, TYPESIZE) \
35
 
((CUM).onStack \
36
 
  ? ON_STACK \
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)),\
40
 
      IN_REGS) \
41
 
    : ((CUM).onStack = YES, ON_STACK)))
42
 
 
43
 
#define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) \
44
 
({  \
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); \
49
 
\
50
 
  (CUM).offsets[locn] = ROUND((CUM).offsets[locn], align); \
51
 
  if (size < sizeof(int)) \
52
 
    { \
53
 
      (CUM).offsets[locn] += sizeof(int) - ROUND(size, align); \
54
 
    } \
55
 
  (TYPE) = objc_skip_typespec(type); \
56
 
  if (locn == IN_REGS) \
57
 
    { \
58
 
      sprintf((DEST), "%.*s+%d", (TYPE)-type, type, (CUM).offsets[locn]); \
59
 
    } \
60
 
  else \
61
 
    { \
62
 
      sprintf((DEST), "%.*s%d", (TYPE)-type, type, (CUM).offsets[locn]); \
63
 
    } \
64
 
  if (*(TYPE) == '+') \
65
 
    { \
66
 
      (TYPE)++; \
67
 
    } \
68
 
  if (*(TYPE) == '-') \
69
 
    { \
70
 
      (TYPE)++; \
71
 
    } \
72
 
  while (isdigit(*(TYPE))) \
73
 
    { \
74
 
      (TYPE)++; \
75
 
    } \
76
 
  (DEST)=&(DEST)[strlen(DEST)]; \
77
 
  if (locn == ON_STACK) \
78
 
    { \
79
 
      if ((*type==_C_STRUCT_B || *type==_C_UNION_B || *type==_C_ARY_B)) \
80
 
        { \
81
 
          (STACK) = (CUM).offsets[ON_STACK] + ROUND(size, align); \
82
 
        } \
83
 
      else \
84
 
        { \
85
 
          (STACK) = (CUM).offsets[ON_STACK] + size; \
86
 
        } \
87
 
    } \
88
 
  (CUM).offsets[locn] += \
89
 
    size < sizeof(int) \
90
 
      ? ROUND(size, align) \
91
 
      : ROUND(size, sizeof(void*)); \
92
 
})
93