141
* expensive_bif_interface_1(nbif_name, cbif_name)
142
* expensive_bif_interface_2(nbif_name, cbif_name)
143
* expensive_bif_interface_3(nbif_name, cbif_name)
145
* Generate native interface for a BIF with 1-3 parameters and
146
* an expensive failure mode (may fail with RESCHEDULE).
148
define(expensive_bif_interface_1,
154
/* Set up C argument registers. */
158
/* Save actual parameters in case we must reschedule. */
159
NBIF_SAVE_RESCHED_ARGS(1)
161
/* Save caller-save registers and call the C function. */
166
/* Restore registers. Check for exception. */
167
CMPI r3, THE_NON_VALUE
172
/* XXX: may need to change for PPC64 */
173
addi r5, 0, lo16(ASYM($1))
174
addis r5, r5, ha16(ASYM($1))
175
b CSYM(nbif_1_hairy_exception)
178
TYPE_FUNCTION(ASYM($1))
181
define(expensive_bif_interface_2,
187
/* Set up C argument registers. */
192
/* Save actual parameters in case we must reschedule. */
193
NBIF_SAVE_RESCHED_ARGS(2)
195
/* Save caller-save registers and call the C function. */
200
/* Restore registers. Check for exception. */
201
CMPI r3, THE_NON_VALUE
206
/* XXX: may need to change for PPC64 */
207
addi r5, 0, lo16(ASYM($1))
208
addis r5, r5, ha16(ASYM($1))
209
b CSYM(nbif_2_hairy_exception)
212
TYPE_FUNCTION(ASYM($1))
215
define(expensive_bif_interface_3,
221
/* Set up C argument registers. */
227
/* Save actual parameters in case we must reschedule. */
228
NBIF_SAVE_RESCHED_ARGS(3)
230
/* Save caller-save registers and call the C function. */
235
/* Restore registers. Check for exception. */
236
CMPI r3, THE_NON_VALUE
241
/* XXX: may need to change for PPC64 */
242
addi r5, 0, lo16(ASYM($1))
243
addis r5, r5, ha16(ASYM($1))
244
b CSYM(nbif_3_hairy_exception)
247
TYPE_FUNCTION(ASYM($1))
251
141
* gc_bif_interface_0(nbif_name, cbif_name)
252
142
* gc_bif_interface_1(nbif_name, cbif_name)
253
143
* gc_bif_interface_2(nbif_name, cbif_name)
255
145
* Generate native interface for a BIF with 0-2 parameters and
256
* standard failure mode (may fail, but not with RESCHEDULE).
146
* standard failure mode.
257
147
* The BIF may do a GC.
259
149
define(gc_bif_interface_0,
337
* expensive_gc_bif_interface_1(nbif_name, cbif_name)
338
* expensive_gc_bif_interface_2(nbif_name, cbif_name)
340
* Generate native interface for a BIF with 1-2 parameters and
341
* an expensive failure mode (may fail with RESCHEDULE).
342
* The BIF may do a GC.
344
define(expensive_gc_bif_interface_1,
350
/* Set up C argument registers. */
354
/* Save actual parameters in case we must reschedule. */
355
NBIF_SAVE_RESCHED_ARGS(1)
357
/* Save caller-save registers and call the C function. */
362
/* Restore registers. Check for exception. */
363
CMPI r3, THE_NON_VALUE
368
/* XXX: may need to change for PPC64 */
369
addi r5, 0, lo16(ASYM($1))
370
addis r5, r5, ha16(ASYM($1))
371
b CSYM(nbif_1_hairy_exception)
374
TYPE_FUNCTION(ASYM($1))
377
define(expensive_gc_bif_interface_2,
383
/* Set up C argument registers. */
388
/* Save actual parameters in case we must reschedule. */
389
NBIF_SAVE_RESCHED_ARGS(2)
391
/* Save caller-save registers and call the C function. */
396
/* Restore registers. Check for exception. */
397
CMPI r3, THE_NON_VALUE
402
/* XXX: may need to change for PPC64 */
403
addi r5, 0, lo16(ASYM($1))
404
addis r5, r5, ha16(ASYM($1))
405
b CSYM(nbif_2_hairy_exception)
408
TYPE_FUNCTION(ASYM($1))
412
227
* gc_nofail_primop_interface_1(nbif_name, cbif_name)
414
229
* Generate native interface for a primop with implicit P