summaryrefslogtreecommitdiff
path: root/libguile/vm-i-scheme.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-06-26 12:41:34 +0200
committerAndy Wingo <wingo@pobox.com>2009-06-26 12:42:10 +0200
commit39141c876b36431caa6bd0c84472de61fbc0a8e0 (patch)
tree47d1ffe84955ed24a82f84e8db2f6bb05c17cf44 /libguile/vm-i-scheme.c
parenta98f422ed61d36d2a0feca3d662ddc64067466f3 (diff)
downloadguile-39141c876b36431caa6bd0c84472de61fbc0a8e0.tar.gz
bytevector ops now compile down to low-level VM ops
* libguile/instructions.c (scm_instruction_list): Fix a longstanding bug in this humble function. * libguile/vm-i-scheme.c (BV_FIXABLE_INT_SET, BV_INT_SET, BV_FLOAT_SET): Fix some bugs in these macros -- now the bytevector ops work. * module/language/tree-il/compile-glil.scm (*primcall-ops*): Compile bytevector calls to VM ops. * module/language/tree-il/primitives.scm (*interesting-primitive-names*): Resolve bytevector calls to primitive calls.
Diffstat (limited to 'libguile/vm-i-scheme.c')
-rw-r--r--libguile/vm-i-scheme.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c
index 0039d92cd..5de39a23d 100644
--- a/libguile/vm-i-scheme.c
+++ b/libguile/vm-i-scheme.c
@@ -455,14 +455,14 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
#define BV_FIXABLE_INT_SET(stem, fn_stem, type, min, max, size) \
{ \
long i, j; \
- ARGS3 (bv, idx, val); \
+ SCM bv, idx, val; POP (val); POP (idx); POP (bv); \
VM_VALIDATE_BYTEVECTOR (bv); \
if (SCM_LIKELY (SCM_I_INUMP (idx) \
- && ((i = SCM_I_INUM (idx)) >= 0) \
+ && ((i = SCM_I_INUM (idx)) >= 0) \
&& (i < SCM_BYTEVECTOR_LENGTH (bv)) \
&& (i % size == 0) \
&& (SCM_I_INUMP (val)) \
- && ((j = SCM_I_INUM (val)) >= min) \
+ && ((j = SCM_I_INUM (val)) >= min) \
&& (j <= max))) \
*(scm_t_##type*) (SCM_BYTEVECTOR_CONTENTS (bv) + i) = (scm_t_##type)j; \
else \
@@ -473,7 +473,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
#define BV_INT_SET(stem, type, size) \
{ \
long i; \
- ARGS3 (bv, idx, val); \
+ SCM bv, idx, val; POP (val); POP (idx); POP (bv); \
VM_VALIDATE_BYTEVECTOR (bv); \
if (SCM_LIKELY (SCM_I_INUMP (idx) \
&& ((i = SCM_I_INUM (idx)) >= 0) \
@@ -488,7 +488,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
#define BV_FLOAT_SET(stem, fn_stem, type, size) \
{ \
long i; \
- ARGS3 (bv, idx, val); \
+ SCM bv, idx, val; POP (val); POP (idx); POP (bv); \
VM_VALIDATE_BYTEVECTOR (bv); \
if (SCM_LIKELY (SCM_I_INUMP (idx) \
&& ((i = SCM_I_INUM (idx)) >= 0) \
@@ -497,6 +497,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
*(type*) (SCM_BYTEVECTOR_CONTENTS (bv) + i) = scm_to_double (val); \
else \
scm_bytevector_##fn_stem##_native_set_x (bv, idx, val); \
+ NEXT; \
}
VM_DEFINE_INSTRUCTION (137, bv_u8_set, "bv-u8-set", 0, 3, 0)