1
changecom(`/*', `*/')dnl
5
`#ifndef HIPE_ARM_ASM_H
6
#define HIPE_ARM_ASM_H'
11
define(LEAF_WORDS,16)dnl number of stack words for leaf functions
12
define(NR_ARG_REGS,3)dnl admissible values are 0 to 6, inclusive
14
`#define ARM_LEAF_WORDS 'LEAF_WORDS
25
* Context switching macros.
27
* RESTORE_CONTEXT and RESTORE_CONTEXT_QUICK do not affect
28
* the condition register.
30
`#define SAVE_CONTEXT_QUICK \
33
`#define RESTORE_CONTEXT_QUICK \
36
`#define SAVE_CACHED_STATE \
40
`#define RESTORE_CACHED_STATE \
44
`#define SAVE_CONTEXT_BIF \
48
`#define RESTORE_CONTEXT_BIF \
51
`#define SAVE_CONTEXT_GC \
53
str lr, [P, #P_NRA]; \
54
str NSP, [P, #P_NSP]; \
57
`#define RESTORE_CONTEXT_GC \
61
* Argument (parameter) registers.
63
`#define ARM_NR_ARG_REGS 'NR_ARG_REGS
64
`#define NR_ARG_REGS 'NR_ARG_REGS
66
define(defarg,`define(ARG$1,`$2')dnl
70
ifelse(eval(NR_ARG_REGS >= 1),0,,
72
ifelse(eval(NR_ARG_REGS >= 2),0,,
74
ifelse(eval(NR_ARG_REGS >= 3),0,,
76
ifelse(eval(NR_ARG_REGS >= 4),0,,
78
ifelse(eval(NR_ARG_REGS >= 5),0,,
80
ifelse(eval(NR_ARG_REGS >= 6),0,,
85
* Used in nbif_stack_trap_ra to preserve the return value.
86
* Must be a C callee-save register.
87
* Must be otherwise unused in the return path.
93
* Used by NBIF_SAVE_RESCHED_ARGS to save argument
94
* registers in locations preserved by C.
95
* May be registers or process-private memory locations.
96
* Must not be C caller-save registers.
97
* Must not overlap with any Erlang global registers.
99
`#define TEMP_ARG0 r7'
100
`#define TEMP_ARG1 r6'
102
dnl XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
104
dnl X hipe_arm_glue.S support X
106
dnl XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
111
define(LAR_1,`ldr ARG$1, [P, #P_ARG$1] ; ')dnl
112
define(LAR_N,`ifelse(eval($1 >= 0),0,,`LAR_N(eval($1-1))LAR_1($1)')')dnl
113
define(LOAD_ARG_REGS,`LAR_N(eval(NR_ARG_REGS-1))')dnl
114
`#define LOAD_ARG_REGS 'LOAD_ARG_REGS
119
define(SAR_1,`str ARG$1, [P, #P_ARG$1] ; ')dnl
120
define(SAR_N,`ifelse(eval($1 >= 0),0,,`SAR_N(eval($1-1))SAR_1($1)')')dnl
121
define(STORE_ARG_REGS,`SAR_N(eval(NR_ARG_REGS-1))')dnl
122
`#define STORE_ARG_REGS 'STORE_ARG_REGS
124
dnl XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
126
dnl X hipe_arm_bifs.m4 support X
128
dnl XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
131
dnl NBIF_ARG(DST,ARITY,ARGNO)
132
dnl Access a formal parameter.
133
dnl It will be a memory load via NSP when ARGNO >= NR_ARG_REGS.
134
dnl It will be a register move when 0 <= ARGNO < NR_ARG_REGS; if
135
dnl the source and destination are the same, the move is suppressed.
137
define(NBIF_MOVE_REG,`ifelse($1,$2,`# mov $1, $2',`mov $1, $2')')dnl
138
define(NBIF_REG_ARG,`NBIF_MOVE_REG($1,ARG$2)')dnl
139
define(NBIF_STK_LOAD,`ldr $1, [NSP, #$2]')dnl
140
define(NBIF_STK_ARG,`NBIF_STK_LOAD($1,eval(4*(($2-$3)-1)))')dnl
141
define(NBIF_ARG,`ifelse(eval($3 >= NR_ARG_REGS),0,`NBIF_REG_ARG($1,$3)',`NBIF_STK_ARG($1,$2,$3)')')dnl
142
`/* #define NBIF_ARG_1_0 'NBIF_ARG(r1,1,0)` */'
143
`/* #define NBIF_ARG_2_0 'NBIF_ARG(r1,2,0)` */'
144
`/* #define NBIF_ARG_2_1 'NBIF_ARG(r2,2,1)` */'
145
`/* #define NBIF_ARG_3_0 'NBIF_ARG(r1,3,0)` */'
146
`/* #define NBIF_ARG_3_1 'NBIF_ARG(r2,3,1)` */'
147
`/* #define NBIF_ARG_3_2 'NBIF_ARG(r3,3,2)` */'
148
`/* #define NBIF_ARG_5_0 'NBIF_ARG(r1,5,0)` */'
149
`/* #define NBIF_ARG_5_1 'NBIF_ARG(r2,5,1)` */'
150
`/* #define NBIF_ARG_5_2 'NBIF_ARG(r3,5,2)` */'
151
`/* #define NBIF_ARG_5_3 'NBIF_ARG(r4,5,3)` */'
152
`/* #define NBIF_ARG_5_4 'NBIF_ARG(r5,5,4)` */'
156
dnl Generates a return from a native BIF, taking care to pop
157
dnl any stacked formal parameters.
158
dnl May only be used in BIF/primop wrappers where SAVE_CONTEXT
159
dnl has saved LR in TEMP_LR.
161
define(NSP_RETN,`add NSP, NSP, #$1
163
define(NSP_RET0,`mov pc, TEMP_LR')dnl
164
define(RET_POP,`ifelse(eval($1 > NR_ARG_REGS),0,0,eval(4*($1 - NR_ARG_REGS)))')dnl
165
define(NBIF_RET_N,`ifelse(eval($1),0,`NSP_RET0',`NSP_RETN($1)')')dnl
166
define(NBIF_RET,`NBIF_RET_N(eval(RET_POP($1)))')dnl
167
`/* #define NBIF_RET_0 'NBIF_RET(0)` */'
168
`/* #define NBIF_RET_1 'NBIF_RET(1)` */'
169
`/* #define NBIF_RET_2 'NBIF_RET(2)` */'
170
`/* #define NBIF_RET_3 'NBIF_RET(3)` */'
171
`/* #define NBIF_RET_5 'NBIF_RET(5)` */'
174
dnl NBIF_SAVE_RESCHED_ARGS(ARITY)
175
dnl Used in the expensive_bif_interface_{1,2}() macros to copy
176
dnl caller-save argument registers to non-volatile locations.
177
dnl Currently, 1 <= ARITY <= 2, so this simply moves the arguments
178
dnl to C callee-save registers.
180
define(NBIF_MIN,`ifelse(eval($1 > $2),0,$1,$2)')dnl
181
define(NBIF_SVA_1,`ifelse(eval($1 < NR_ARG_REGS),0,,`mov TEMP_ARG$1,ARG$1; ')')dnl
182
define(NBIF_SVA_N,`ifelse(eval($1 >= 0),0,,`NBIF_SVA_N(eval($1-1))NBIF_SVA_1($1)')')dnl
183
define(NBIF_SAVE_RESCHED_ARGS,`NBIF_SVA_N(eval(NBIF_MIN($1,NR_ARG_REGS)-1))')dnl
184
`/* #define NBIF_SAVE_RESCHED_ARGS_1 'NBIF_SAVE_RESCHED_ARGS(1)` */'
185
`/* #define NBIF_SAVE_RESCHED_ARGS_2 'NBIF_SAVE_RESCHED_ARGS(2)` */'
188
dnl QUICK_CALL_RET(CFUN,ARITY)
189
dnl Used in nocons_nofail and noproc primop interfaces to optimise
190
dnl SAVE_CONTEXT_QUICK; bl CFUN; RESTORE_CONTEXT_QUICK; NBIF_RET(ARITY).
192
define(NBIF_POP_N,`ifelse(eval($1),0,`',`add NSP, NSP, #$1 ; ')')dnl
193
define(QUICK_CALL_RET,`NBIF_POP_N(eval(RET_POP($2)))b $1')dnl
194
`/* #define QUICK_CALL_RET_F_0 'QUICK_CALL_RET(F,0)` */'
195
`/* #define QUICK_CALL_RET_F_1 'QUICK_CALL_RET(F,1)` */'
196
`/* #define QUICK_CALL_RET_F_2 'QUICK_CALL_RET(F,2)` */'
197
`/* #define QUICK_CALL_RET_F_3 'QUICK_CALL_RET(F,3)` */'
198
`/* #define QUICK_CALL_RET_F_5 'QUICK_CALL_RET(F,5)` */'
200
`#endif /* HIPE_ARM_ASM_H */'