diff options
author | Andy Wingo <wingo@pobox.com> | 2009-06-26 12:41:34 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2009-06-26 12:42:10 +0200 |
commit | 39141c876b36431caa6bd0c84472de61fbc0a8e0 (patch) | |
tree | 47d1ffe84955ed24a82f84e8db2f6bb05c17cf44 /libguile/vm-i-scheme.c | |
parent | a98f422ed61d36d2a0feca3d662ddc64067466f3 (diff) | |
download | guile-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.c | 11 |
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) |