diff options
author | Andy Wingo <wingo@pobox.com> | 2019-05-27 19:05:10 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2019-05-27 19:05:10 +0200 |
commit | 1fb39929f9c1c292b11aedb7b29a166471b1c555 (patch) | |
tree | aa9f7f57e61f5fb51ca3f01e268e6dc458a93735 | |
parent | 2ba50e2fe642b1a92b087ba4a18a71a2a67cd798 (diff) | |
download | guile-1fb39929f9c1c292b11aedb7b29a166471b1c555.tar.gz |
Reapply atomics inlining
This patch reapplies 230a5559764679d75e3e8941e97a268a2b2e6a53 and
e8d34258beab2799951e16d21d547299d4659364, but fixing a misplaced
comma (!).
-rw-r--r-- | libguile/intrinsics.c | 28 | ||||
-rw-r--r-- | libguile/intrinsics.h | 6 | ||||
-rw-r--r-- | libguile/jit.c | 12 | ||||
-rw-r--r-- | libguile/vm-engine.c | 12 |
4 files changed, 9 insertions, 49 deletions
diff --git a/libguile/intrinsics.c b/libguile/intrinsics.c index a8c6fa7bb..ab6b6a872 100644 --- a/libguile/intrinsics.c +++ b/libguile/intrinsics.c @@ -438,30 +438,6 @@ push_prompt (scm_thread *thread, uint8_t escape_only_p, vra, mra, thread->vm.registers); } -static SCM -atomic_ref_scm (SCM *loc) -{ - return scm_atomic_ref_scm (loc); -} - -static void -atomic_set_scm (SCM *loc, SCM val) -{ - scm_atomic_set_scm (loc, val); -} - -static SCM -atomic_swap_scm (SCM *loc, SCM val) -{ - return scm_atomic_swap_scm (loc, val); -} - -static SCM -atomic_compare_and_swap_scm (SCM *loc, SCM expected, SCM desired) -{ - return scm_atomic_compare_and_swap_scm (loc, expected, desired); -} - void scm_bootstrap_intrinsics (void) { @@ -530,10 +506,6 @@ scm_bootstrap_intrinsics (void) scm_vm_intrinsics.allocate_words = allocate_words; scm_vm_intrinsics.current_module = current_module; scm_vm_intrinsics.push_prompt = push_prompt; - scm_vm_intrinsics.atomic_ref_scm = atomic_ref_scm; - scm_vm_intrinsics.atomic_set_scm = atomic_set_scm; - scm_vm_intrinsics.atomic_swap_scm = atomic_swap_scm; - scm_vm_intrinsics.atomic_compare_and_swap_scm = atomic_compare_and_swap_scm; scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION, "scm_init_intrinsics", diff --git a/libguile/intrinsics.h b/libguile/intrinsics.h index 397dffed6..2c1b53abc 100644 --- a/libguile/intrinsics.h +++ b/libguile/intrinsics.h @@ -1,4 +1,4 @@ -/* Copyright 2018 +/* Copyright 2018-2019 Free Software Foundation, Inc. This file is part of Guile. @@ -160,10 +160,6 @@ typedef uint32_t* scm_t_vcode_intrinsic; M(scm_from_thread, current_module, "current-module", CURRENT_MODULE) \ M(thread_u8_scm_sp_vra_mra, push_prompt, "push-prompt", PUSH_PROMPT) \ M(thread_scm, unpack_values_object, "unpack-values-object", UNPACK_VALUES_OBJECT) \ - M(scm_from_ptr, atomic_ref_scm, "atomic-ref-scm", ATOMIC_REF_SCM) \ - M(ptr_scm, atomic_set_scm, "atomic-set-scm", ATOMIC_SET_SCM) \ - M(scm_from_ptr_scm, atomic_swap_scm, "atomic-swap-scm", ATOMIC_SWAP_SCM) \ - M(scm_from_ptr_scm_scm, atomic_compare_and_swap_scm, "atomic-compare-and-swap-scm", ATOMIC_COMPARE_AND_SWAP_SCM) \ M(vcode, handle_interrupt_code, "%handle-interrupt-code", HANDLE_INTERRUPT_CODE) \ /* Add new intrinsics here; also update scm_bootstrap_intrinsics. */ diff --git a/libguile/jit.c b/libguile/jit.c index 20116c16a..6cea8bbc5 100644 --- a/libguile/jit.c +++ b/libguile/jit.c @@ -3010,16 +3010,8 @@ compile_handle_interrupts (scm_jit_state *j) void *again = jit_address (j->jit); -#if defined(__i386__) || defined(__x86_64__) - /* Disassembly of atomic_ref_scm is just a mov. */ - jit_ldxi (j->jit, T0, THREAD, thread_offset_pending_asyncs); -#else - emit_call_1 (j, scm_vm_intrinsics.atomic_ref_scm, - jit_operand_addi (thread_operand (), - thread_offset_pending_asyncs)); - emit_retval (j, T0); - restore_reloadable_register_state (j, saved_state); -#endif + jit_addi (j->jit, T0, THREAD, thread_offset_pending_asyncs); + jit_ldr_atomic (j->jit, T0, T0); jit_reloc_t none_pending = jit_beqi (j->jit, T0, SCM_UNPACK (SCM_EOL)); jit_ldxi_i (j->jit, T0, THREAD, thread_offset_block_asyncs); jit_reloc_t blocked = jit_bnei (j->jit, T0, 0); diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 3b57fa115..062dc00bd 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -1,4 +1,4 @@ -/* Copyright 2001,2009-2015,2017-2018 +/* Copyright 2001,2009-2015,2017-2019 Free Software Foundation, Inc. This file is part of Guile. @@ -2079,7 +2079,7 @@ VM_NAME (scm_thread *thread) SCM *loc; UNPACK_8_8_8 (op, dst, obj, offset); loc = SCM_CELL_OBJECT_LOC (SP_REF (obj), offset); - SP_SET (dst, CALL_INTRINSIC (atomic_ref_scm, (loc))); + SP_SET (dst, scm_atomic_ref_scm (loc)); NEXT (1); } @@ -2095,7 +2095,7 @@ VM_NAME (scm_thread *thread) SCM *loc; UNPACK_8_8_8 (op, obj, offset, val); loc = SCM_CELL_OBJECT_LOC (SP_REF (obj), offset); - CALL_INTRINSIC (atomic_set_scm, (loc, SP_REF (val))); + scm_atomic_set_scm (loc, SP_REF (val)); NEXT (1); } @@ -2114,7 +2114,7 @@ VM_NAME (scm_thread *thread) UNPACK_24 (ip[1], obj); UNPACK_8_24 (ip[2], offset, val); loc = SCM_CELL_OBJECT_LOC (SP_REF (obj), offset); - SP_SET (dst, CALL_INTRINSIC (atomic_swap_scm, (loc, SP_REF (val)))); + SP_SET (dst, scm_atomic_swap_scm (loc, SP_REF (val))); NEXT (3); } @@ -2137,8 +2137,8 @@ VM_NAME (scm_thread *thread) UNPACK_8_24 (ip[2], offset, expected); UNPACK_24 (ip[3], desired); loc = SCM_CELL_OBJECT_LOC (SP_REF (obj), offset); - got = CALL_INTRINSIC (atomic_compare_and_swap_scm, - (loc, SP_REF (expected), SP_REF (desired))); + got = scm_atomic_compare_and_swap_scm (loc, SP_REF (expected), + SP_REF (desired)); SP_SET (dst, got); NEXT (4); } |