diff options
author | Sverker Eriksson <[email protected]> | 2016-07-05 19:09:16 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2016-07-05 19:09:16 +0200 |
commit | a94f909586a7b69ba2f4539f4c40e3600cf705d2 (patch) | |
tree | dbc999e7120a41fe7acb41f6d1b4afb001318cc3 /erts/emulator/hipe/hipe_arm_bifs.m4 | |
parent | 04bb724a572c78d775df2ec12a1694870369c3b4 (diff) | |
parent | 520654d49d9f1c1548dc2a5800c7330001cd3064 (diff) | |
download | otp-a94f909586a7b69ba2f4539f4c40e3600cf705d2.tar.gz otp-a94f909586a7b69ba2f4539f4c40e3600cf705d2.tar.bz2 otp-a94f909586a7b69ba2f4539f4c40e3600cf705d2.zip |
Merge branch 'hipe-trap-gc/PR-1116/OTP-13724' into maint
* hipe-trap-gc/PR-1116:
hipe: Fix bug in trap frame allocation wrappers
hipe: Add assertion for gc in bif without wrapper
Diffstat (limited to 'erts/emulator/hipe/hipe_arm_bifs.m4')
-rw-r--r-- | erts/emulator/hipe/hipe_arm_bifs.m4 | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/erts/emulator/hipe/hipe_arm_bifs.m4 b/erts/emulator/hipe/hipe_arm_bifs.m4 index d9c9952dbf..d7a2fec04a 100644 --- a/erts/emulator/hipe/hipe_arm_bifs.m4 +++ b/erts/emulator/hipe/hipe_arm_bifs.m4 @@ -198,8 +198,9 @@ $1: * gc_bif_interface_0(nbif_name, cbif_name) * gc_bif_interface_1(nbif_name, cbif_name) * gc_bif_interface_2(nbif_name, cbif_name) + * gc_bif_interface_3(nbif_name, cbif_name) * - * Generate native interface for a BIF with 0-2 parameters and + * Generate native interface for a BIF with 0-3 parameters and * standard failure mode. * The BIF may do a GC. */ @@ -279,6 +280,36 @@ $1: .type $1, %function #endif') +define(gc_bif_interface_3, +` +#ifndef HAVE_$1 +#`define' HAVE_$1 + .global $1 +$1: + /* Set up C argument registers. */ + mov r0, P + NBIF_ARG(r1,3,0) + NBIF_ARG(r2,3,1) + NBIF_ARG(r3,3,2) + + /* Save caller-save registers and call the C function. */ + SAVE_CONTEXT_GC + str r1, [r0, #P_ARG0] /* Store BIF__ARGS in def_arg_reg[] */ + str r2, [r0, #P_ARG1] + str r3, [r0, #P_ARG2] + add r1, r0, #P_ARG0 + CALL_BIF($2) + TEST_GOT_MBUF(3) + + /* Restore registers. Check for exception. */ + cmp r0, #THE_NON_VALUE + RESTORE_CONTEXT_GC + beq nbif_3_simple_exception + NBIF_RET(3) + .size $1, .-$1 + .type $1, %function +#endif') + /* * gc_nofail_primop_interface_1(nbif_name, cbif_name) * |