~ubuntu-branches/debian/squeeze/erlang/squeeze

« back to all changes in this revision

Viewing changes to erts/emulator/hipe/hipe_arm_asm.m4

  • Committer: Bazaar Package Importer
  • Author(s): Erlang Packagers, Sergei Golovan
  • Date: 2006-12-03 17:07:44 UTC
  • mfrom: (2.1.11 feisty)
  • Revision ID: james.westby@ubuntu.com-20061203170744-rghjwupacqlzs6kv
Tags: 1:11.b.2-4
[ Sergei Golovan ]
Fixed erlang-base and erlang-base-hipe prerm scripts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
changecom(`/*', `*/')dnl
 
2
/*
 
3
 * $Id$
 
4
 */
 
5
`#ifndef HIPE_ARM_ASM_H
 
6
#define HIPE_ARM_ASM_H'
 
7
 
 
8
/*
 
9
 * Tunables.
 
10
 */
 
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
 
13
 
 
14
`#define ARM_LEAF_WORDS 'LEAF_WORDS
 
15
 
 
16
/*
 
17
 * Reserved registers.
 
18
 */
 
19
`#define P      r11'
 
20
`#define NSP    r10'
 
21
`#define HP     r9'
 
22
`#define TEMP_LR        r8'
 
23
 
 
24
/*
 
25
 * Context switching macros.
 
26
 *
 
27
 * RESTORE_CONTEXT and RESTORE_CONTEXT_QUICK do not affect
 
28
 * the condition register.
 
29
 */
 
30
`#define SAVE_CONTEXT_QUICK     \
 
31
        mov     TEMP_LR, lr'
 
32
 
 
33
`#define RESTORE_CONTEXT_QUICK  \
 
34
        mov     lr, TEMP_LR'
 
35
 
 
36
`#define SAVE_CACHED_STATE      \
 
37
        str     HP, [P, #P_HP]; \
 
38
        str     NSP, [P, #P_NSP]'
 
39
 
 
40
`#define RESTORE_CACHED_STATE   \
 
41
        ldr     HP, [P, #P_HP]; \
 
42
        ldr     NSP, [P, #P_NSP]'
 
43
 
 
44
`#define SAVE_CONTEXT_BIF       \
 
45
        mov     TEMP_LR, lr;    \
 
46
        str     HP, [P, #P_HP]'
 
47
 
 
48
`#define RESTORE_CONTEXT_BIF    \
 
49
        ldr     HP, [P, #P_HP]'
 
50
 
 
51
`#define SAVE_CONTEXT_GC        \
 
52
        mov     TEMP_LR, lr;    \
 
53
        str     lr, [P, #P_NRA];        \
 
54
        str     NSP, [P, #P_NSP];       \
 
55
        str     HP, [P, #P_HP]'
 
56
 
 
57
`#define RESTORE_CONTEXT_GC     \
 
58
        ldr     HP, [P, #P_HP]'
 
59
 
 
60
/*
 
61
 * Argument (parameter) registers.
 
62
 */
 
63
`#define ARM_NR_ARG_REGS        'NR_ARG_REGS
 
64
`#define NR_ARG_REGS    'NR_ARG_REGS
 
65
 
 
66
define(defarg,`define(ARG$1,`$2')dnl
 
67
#`define ARG'$1 $2'
 
68
)dnl
 
69
 
 
70
ifelse(eval(NR_ARG_REGS >= 1),0,,
 
71
`defarg(0,`r1')')dnl
 
72
ifelse(eval(NR_ARG_REGS >= 2),0,,
 
73
`defarg(1,`r2')')dnl
 
74
ifelse(eval(NR_ARG_REGS >= 3),0,,
 
75
`defarg(2,`r3')')dnl
 
76
ifelse(eval(NR_ARG_REGS >= 4),0,,
 
77
`defarg(3,`r4')')dnl
 
78
ifelse(eval(NR_ARG_REGS >= 5),0,,
 
79
`defarg(4,`r5')')dnl
 
80
ifelse(eval(NR_ARG_REGS >= 6),0,,
 
81
`defarg(5,`r6')')dnl
 
82
 
 
83
/*
 
84
 * TEMP_RV:
 
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.
 
88
 */
 
89
`#define TEMP_RV        r7'
 
90
 
 
91
/*
 
92
 * TEMP_ARG{0,1}:
 
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.
 
98
 */
 
99
`#define TEMP_ARG0      r7'
 
100
`#define TEMP_ARG1      r6'
 
101
 
 
102
dnl XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
103
dnl X                                                           X
 
104
dnl X                   hipe_arm_glue.S support                 X
 
105
dnl X                                                           X
 
106
dnl XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
107
 
 
108
dnl
 
109
dnl LOAD_ARG_REGS
 
110
dnl
 
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
 
115
 
 
116
dnl
 
117
dnl STORE_ARG_REGS
 
118
dnl
 
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
 
123
 
 
124
dnl XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
125
dnl X                                                           X
 
126
dnl X                   hipe_arm_bifs.m4 support                X
 
127
dnl X                                                           X
 
128
dnl XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
129
 
 
130
dnl
 
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.
 
136
dnl
 
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)` */'
 
153
 
 
154
dnl
 
155
dnl NBIF_RET(ARITY)
 
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.
 
160
dnl
 
161
define(NSP_RETN,`add    NSP, NSP, #$1
 
162
        mov pc, TEMP_LP')dnl
 
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)` */'
 
172
 
 
173
dnl
 
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.
 
179
dnl
 
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)` */'
 
186
 
 
187
dnl
 
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).
 
191
dnl
 
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)` */'
 
199
 
 
200
`#endif /* HIPE_ARM_ASM_H */'