diff options
author | Andy Wingo <wingo@pobox.com> | 2018-08-13 21:42:43 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-08-13 22:00:19 +0200 |
commit | e6304fb2425475ddf441439ee3c510060f9464d4 (patch) | |
tree | 215a5676ac9b16bcdacfc4b3c7ed2d75dad5ec67 /libguile/vm-engine.c | |
parent | 0188bd381692fd2d72673dc5921a08f34f110f58 (diff) | |
download | guile-e6304fb2425475ddf441439ee3c510060f9464d4.tar.gz |
Define intrinsics for atomic ops
* libguile/intrinsics.h:
* libguile/intrinsics.c (atomic_ref_scm, atomic_set_scm):
(atomic_swap_scm, atomic_compare_and_swap_scm): New intrinsics, given
that lightning doesn't know atomics.
(scm_bootstrap_intrinsics): Init new intrinsics.
* libguile/vm-engine.c (atomic-scm-ref/immediate)
(atomic-scm-set!/immediate, atomic-scm-swap!/immediate)
(atomic-scm-compare-and-swap!/immediate): Use intrinsics, to be like
the JIT.
Diffstat (limited to 'libguile/vm-engine.c')
-rw-r--r-- | libguile/vm-engine.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index d64ce9ee7..2af02dcea 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -1784,7 +1784,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, scm_atomic_ref_scm (loc)); + SP_SET (dst, CALL_INTRINSIC (atomic_ref_scm, (loc))); NEXT (1); } @@ -1794,7 +1794,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); - scm_atomic_set_scm (loc, SP_REF (val)); + CALL_INTRINSIC (atomic_set_scm, (loc, SP_REF (val))); NEXT (1); } @@ -1807,7 +1807,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, scm_atomic_swap_scm (loc, SP_REF (val))); + SP_SET (dst, CALL_INTRINSIC (atomic_swap_scm, (loc, SP_REF (val)))); NEXT (3); } @@ -1816,15 +1816,15 @@ VM_NAME (scm_thread *thread) uint32_t dst, obj, expected, desired; uint8_t offset; SCM *loc; - SCM scm_expected; + SCM got; UNPACK_24 (op, dst); UNPACK_24 (ip[1], obj); UNPACK_8_24 (ip[2], offset, expected); UNPACK_24 (ip[3], desired); loc = SCM_CELL_OBJECT_LOC (SP_REF (obj), offset); - scm_expected = SP_REF (expected); - scm_atomic_compare_and_swap_scm (loc, &scm_expected, SP_REF (desired)); - SP_SET (dst, scm_expected); + got = CALL_INTRINSIC (atomic_compare_and_swap_scm, + (loc, SP_REF (expected), SP_REF (desired))); + SP_SET (dst, got); NEXT (4); } |