diff options
author | Andy Wingo <wingo@pobox.com> | 2010-01-24 18:59:19 -0600 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-01-26 22:56:41 +0100 |
commit | 827dc8dcb61dcbdd62ad1ae41b98d65ecd8d5b66 (patch) | |
tree | 0ca35462796f4f999f720687fb222fe841b8886d /libguile/vm-i-scheme.c | |
parent | 20aafae22a4f11289b65dba685495a808ebd6b07 (diff) | |
download | guile-827dc8dcb61dcbdd62ad1ae41b98d65ecd8d5b66.tar.gz |
renumber VM opcodes
* libguile/vm-i-loader.c:
* libguile/vm-i-scheme.c:
* libguile/vm-i-system.c: Renumber ops. Add a foreign-call op stub.
Rearrange some ops.
* libguile/_scm.h (SCM_OBJCODE_MINOR_VERSION): Bump
Diffstat (limited to 'libguile/vm-i-scheme.c')
-rw-r--r-- | libguile/vm-i-scheme.c | 459 |
1 files changed, 236 insertions, 223 deletions
diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c index e5e73dd99..20ec9f6af 100644 --- a/libguile/vm-i-scheme.c +++ b/libguile/vm-i-scheme.c @@ -29,43 +29,43 @@ #define RETURN(x) do { *sp = x; NEXT; } while (0) -VM_DEFINE_FUNCTION (100, not, "not", 1) +VM_DEFINE_FUNCTION (128, not, "not", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_false_or_nil (x))); } -VM_DEFINE_FUNCTION (101, not_not, "not-not", 1) +VM_DEFINE_FUNCTION (129, not_not, "not-not", 1) { ARGS1 (x); RETURN (scm_from_bool (!scm_is_false_or_nil (x))); } -VM_DEFINE_FUNCTION (102, eq, "eq?", 2) +VM_DEFINE_FUNCTION (130, eq, "eq?", 2) { ARGS2 (x, y); RETURN (scm_from_bool (scm_is_eq (x, y))); } -VM_DEFINE_FUNCTION (103, not_eq, "not-eq?", 2) +VM_DEFINE_FUNCTION (131, not_eq, "not-eq?", 2) { ARGS2 (x, y); RETURN (scm_from_bool (!scm_is_eq (x, y))); } -VM_DEFINE_FUNCTION (104, nullp, "null?", 1) +VM_DEFINE_FUNCTION (132, nullp, "null?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_null_or_nil (x))); } -VM_DEFINE_FUNCTION (105, not_nullp, "not-null?", 1) +VM_DEFINE_FUNCTION (133, not_nullp, "not-null?", 1) { ARGS1 (x); RETURN (scm_from_bool (!scm_is_null_or_nil (x))); } -VM_DEFINE_FUNCTION (106, eqv, "eqv?", 2) +VM_DEFINE_FUNCTION (134, eqv, "eqv?", 2) { ARGS2 (x, y); if (scm_is_eq (x, y)) @@ -76,7 +76,7 @@ VM_DEFINE_FUNCTION (106, eqv, "eqv?", 2) RETURN (scm_eqv_p (x, y)); } -VM_DEFINE_FUNCTION (107, equal, "equal?", 2) +VM_DEFINE_FUNCTION (135, equal, "equal?", 2) { ARGS2 (x, y); if (scm_is_eq (x, y)) @@ -87,13 +87,13 @@ VM_DEFINE_FUNCTION (107, equal, "equal?", 2) RETURN (scm_equal_p (x, y)); } -VM_DEFINE_FUNCTION (108, pairp, "pair?", 1) +VM_DEFINE_FUNCTION (136, pairp, "pair?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_pair (x))); } -VM_DEFINE_FUNCTION (109, listp, "list?", 1) +VM_DEFINE_FUNCTION (137, listp, "list?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_ilength (x) >= 0)); @@ -104,7 +104,7 @@ VM_DEFINE_FUNCTION (109, listp, "list?", 1) * Basic data */ -VM_DEFINE_FUNCTION (110, cons, "cons", 2) +VM_DEFINE_FUNCTION (138, cons, "cons", 2) { ARGS2 (x, y); CONS (x, x, y); @@ -117,21 +117,21 @@ VM_DEFINE_FUNCTION (110, cons, "cons", 2) goto vm_error_not_a_pair; \ } -VM_DEFINE_FUNCTION (111, car, "car", 1) +VM_DEFINE_FUNCTION (139, car, "car", 1) { ARGS1 (x); VM_VALIDATE_CONS (x); RETURN (SCM_CAR (x)); } -VM_DEFINE_FUNCTION (112, cdr, "cdr", 1) +VM_DEFINE_FUNCTION (140, cdr, "cdr", 1) { ARGS1 (x); VM_VALIDATE_CONS (x); RETURN (SCM_CDR (x)); } -VM_DEFINE_INSTRUCTION (113, set_car, "set-car!", 0, 2, 0) +VM_DEFINE_INSTRUCTION (141, set_car, "set-car!", 0, 2, 0) { SCM x, y; POP (y); @@ -141,7 +141,7 @@ VM_DEFINE_INSTRUCTION (113, set_car, "set-car!", 0, 2, 0) NEXT; } -VM_DEFINE_INSTRUCTION (114, set_cdr, "set-cdr!", 0, 2, 0) +VM_DEFINE_INSTRUCTION (142, set_cdr, "set-cdr!", 0, 2, 0) { SCM x, y; POP (y); @@ -166,27 +166,27 @@ VM_DEFINE_INSTRUCTION (114, set_cdr, "set-cdr!", 0, 2, 0) RETURN (srel (x, y)); \ } -VM_DEFINE_FUNCTION (115, ee, "ee?", 2) +VM_DEFINE_FUNCTION (143, ee, "ee?", 2) { REL (==, scm_num_eq_p); } -VM_DEFINE_FUNCTION (116, lt, "lt?", 2) +VM_DEFINE_FUNCTION (144, lt, "lt?", 2) { REL (<, scm_less_p); } -VM_DEFINE_FUNCTION (117, le, "le?", 2) +VM_DEFINE_FUNCTION (145, le, "le?", 2) { REL (<=, scm_leq_p); } -VM_DEFINE_FUNCTION (118, gt, "gt?", 2) +VM_DEFINE_FUNCTION (146, gt, "gt?", 2) { REL (>, scm_gr_p); } -VM_DEFINE_FUNCTION (119, ge, "ge?", 2) +VM_DEFINE_FUNCTION (147, ge, "ge?", 2) { REL (>=, scm_geq_p); } @@ -210,12 +210,12 @@ VM_DEFINE_FUNCTION (119, ge, "ge?", 2) RETURN (SFUNC (x, y)); \ } -VM_DEFINE_FUNCTION (120, add, "add", 2) +VM_DEFINE_FUNCTION (148, add, "add", 2) { FUNC2 (+, scm_sum); } -VM_DEFINE_FUNCTION (167, add1, "add1", 1) +VM_DEFINE_FUNCTION (149, add1, "add1", 1) { ARGS1 (x); if (SCM_I_INUMP (x)) @@ -228,12 +228,12 @@ VM_DEFINE_FUNCTION (167, add1, "add1", 1) RETURN (scm_sum (x, SCM_I_MAKINUM (1))); } -VM_DEFINE_FUNCTION (121, sub, "sub", 2) +VM_DEFINE_FUNCTION (150, sub, "sub", 2) { FUNC2 (-, scm_difference); } -VM_DEFINE_FUNCTION (168, sub1, "sub1", 1) +VM_DEFINE_FUNCTION (151, sub1, "sub1", 1) { ARGS1 (x); if (SCM_I_INUMP (x)) @@ -246,42 +246,42 @@ VM_DEFINE_FUNCTION (168, sub1, "sub1", 1) RETURN (scm_difference (x, SCM_I_MAKINUM (1))); } -VM_DEFINE_FUNCTION (122, mul, "mul", 2) +VM_DEFINE_FUNCTION (152, mul, "mul", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_product (x, y)); } -VM_DEFINE_FUNCTION (123, div, "div", 2) +VM_DEFINE_FUNCTION (153, div, "div", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_divide (x, y)); } -VM_DEFINE_FUNCTION (124, quo, "quo", 2) +VM_DEFINE_FUNCTION (154, quo, "quo", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_quotient (x, y)); } -VM_DEFINE_FUNCTION (125, rem, "rem", 2) +VM_DEFINE_FUNCTION (155, rem, "rem", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_remainder (x, y)); } -VM_DEFINE_FUNCTION (126, mod, "mod", 2) +VM_DEFINE_FUNCTION (156, mod, "mod", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_modulo (x, y)); } -VM_DEFINE_FUNCTION (170, ash, "ash", 2) +VM_DEFINE_FUNCTION (157, ash, "ash", 2) { ARGS2 (x, y); if (SCM_I_INUMP (x) && SCM_I_INUMP (y)) @@ -297,7 +297,7 @@ VM_DEFINE_FUNCTION (170, ash, "ash", 2) RETURN (scm_ash (x, y)); } -VM_DEFINE_FUNCTION (171, logand, "logand", 2) +VM_DEFINE_FUNCTION (158, logand, "logand", 2) { ARGS2 (x, y); if (SCM_I_INUMP (x) && SCM_I_INUMP (y)) @@ -306,7 +306,7 @@ VM_DEFINE_FUNCTION (171, logand, "logand", 2) RETURN (scm_logand (x, y)); } -VM_DEFINE_FUNCTION (172, logior, "logior", 2) +VM_DEFINE_FUNCTION (159, logior, "logior", 2) { ARGS2 (x, y); if (SCM_I_INUMP (x) && SCM_I_INUMP (y)) @@ -315,7 +315,7 @@ VM_DEFINE_FUNCTION (172, logior, "logior", 2) RETURN (scm_logior (x, y)); } -VM_DEFINE_FUNCTION (173, logxor, "logxor", 2) +VM_DEFINE_FUNCTION (160, logxor, "logxor", 2) { ARGS2 (x, y); if (SCM_I_INUMP (x) && SCM_I_INUMP (y)) @@ -326,35 +326,10 @@ VM_DEFINE_FUNCTION (173, logxor, "logxor", 2) /* - * GOOPS support + * Vectors and arrays */ -VM_DEFINE_FUNCTION (169, class_of, "class-of", 1) -{ - ARGS1 (obj); - RETURN (SCM_INSTANCEP (obj) ? SCM_CLASS_OF (obj) : scm_class_of (obj)); -} -VM_DEFINE_FUNCTION (127, slot_ref, "slot-ref", 2) -{ - size_t slot; - ARGS2 (instance, idx); - slot = SCM_I_INUM (idx); - RETURN (SCM_PACK (SCM_STRUCT_DATA (instance) [slot])); -} - -VM_DEFINE_INSTRUCTION (128, slot_set, "slot-set", 0, 3, 0) -{ - SCM instance, idx, val; - size_t slot; - POP (val); - POP (idx); - POP (instance); - slot = SCM_I_INUM (idx); - SCM_STRUCT_DATA (instance) [slot] = SCM_UNPACK (val); - NEXT; -} - -VM_DEFINE_FUNCTION (129, vector_ref, "vector-ref", 2) +VM_DEFINE_FUNCTION (161, vector_ref, "vector-ref", 2) { long i = 0; ARGS2 (vect, idx); @@ -370,7 +345,7 @@ VM_DEFINE_FUNCTION (129, vector_ref, "vector-ref", 2) } } -VM_DEFINE_INSTRUCTION (130, vector_set, "vector-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (162, vector_set, "vector-set", 0, 3, 0) { long i = 0; SCM vect, idx, val; @@ -388,6 +363,169 @@ VM_DEFINE_INSTRUCTION (130, vector_set, "vector-set", 0, 3, 0) NEXT; } +VM_DEFINE_INSTRUCTION (163, make_array, "make-array", 3, -1, 1) +{ + scm_t_uint32 len; + SCM shape, ret; + + len = FETCH (); + len = (len << 8) + FETCH (); + len = (len << 8) + FETCH (); + POP (shape); + SYNC_REGISTER (); + ret = scm_from_contiguous_array (shape, sp - len + 1, len); + DROPN (len); + PUSH (ret); + NEXT; +} + + +/* + * Structs + */ +#define VM_VALIDATE_STRUCT(obj) \ + if (SCM_UNLIKELY (!SCM_STRUCTP (obj))) \ + { \ + finish_args = (obj); \ + goto vm_error_not_a_struct; \ + } + +VM_DEFINE_FUNCTION (164, struct_p, "struct?", 1) +{ + ARGS1 (obj); + RETURN (scm_from_bool (SCM_STRUCTP (obj))); +} + +VM_DEFINE_FUNCTION (165, struct_vtable, "struct-vtable", 1) +{ + ARGS1 (obj); + VM_VALIDATE_STRUCT (obj); + RETURN (SCM_STRUCT_VTABLE (obj)); +} + +VM_DEFINE_INSTRUCTION (166, make_struct, "make-struct", 2, -1, 1) +{ + unsigned h = FETCH (); + unsigned l = FETCH (); + scm_t_bits n_args = ((h << 8U) + l); + SCM vtable = sp[1 - n_args], n_tail = sp[2 - n_args]; + const SCM *inits = sp - n_args + 3; + + sp -= n_args - 1; + + if (SCM_LIKELY (SCM_STRUCTP (vtable) + && SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SIMPLE) + && SCM_I_INUMP (n_tail))) + { + scm_t_bits n_inits, len; + + n_inits = SCM_I_INUM (n_tail) + n_args - 2; + len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); + + if (SCM_LIKELY (n_inits == len)) + { + SCM obj; + + obj = scm_i_alloc_struct (SCM_STRUCT_DATA (vtable), n_inits); + memcpy (SCM_STRUCT_DATA (obj), inits, n_inits * sizeof (SCM)); + + RETURN (obj); + } + } + + SYNC_REGISTER (); + RETURN (scm_c_make_structv (vtable, scm_to_size_t (n_tail), + n_args - 2, (scm_t_bits *) inits)); +} + +VM_DEFINE_FUNCTION (167, struct_ref, "struct-ref", 2) +{ + ARGS2 (obj, pos); + + if (SCM_LIKELY (SCM_STRUCTP (obj) + && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, + SCM_VTABLE_FLAG_SIMPLE) + && SCM_I_INUMP (pos))) + { + SCM vtable; + scm_t_bits index, len; + + index = SCM_I_INUM (pos); + vtable = SCM_STRUCT_VTABLE (obj); + len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); + + if (SCM_LIKELY (index < len)) + { + scm_t_bits *data = SCM_STRUCT_DATA (obj); + RETURN (SCM_PACK (data[index])); + } + } + + RETURN (scm_struct_ref (obj, pos)); +} + +VM_DEFINE_FUNCTION (168, struct_set, "struct-set", 3) +{ + ARGS3 (obj, pos, val); + + if (SCM_LIKELY (SCM_STRUCTP (obj) + && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, + SCM_VTABLE_FLAG_SIMPLE) + && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, + SCM_VTABLE_FLAG_SIMPLE_RW) + && SCM_I_INUMP (pos))) + { + SCM vtable; + scm_t_bits index, len; + + index = SCM_I_INUM (pos); + vtable = SCM_STRUCT_VTABLE (obj); + len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); + if (SCM_LIKELY (index < len)) + { + scm_t_bits *data = SCM_STRUCT_DATA (obj); + data[index] = SCM_UNPACK (val); + RETURN (val); + } + } + + RETURN (scm_struct_set_x (obj, pos, val)); +} + + +/* + * GOOPS support + */ +VM_DEFINE_FUNCTION (169, class_of, "class-of", 1) +{ + ARGS1 (obj); + RETURN (SCM_INSTANCEP (obj) ? SCM_CLASS_OF (obj) : scm_class_of (obj)); +} + +VM_DEFINE_FUNCTION (170, slot_ref, "slot-ref", 2) +{ + size_t slot; + ARGS2 (instance, idx); + slot = SCM_I_INUM (idx); + RETURN (SCM_PACK (SCM_STRUCT_DATA (instance) [slot])); +} + +VM_DEFINE_INSTRUCTION (171, slot_set, "slot-set", 0, 3, 0) +{ + SCM instance, idx, val; + size_t slot; + POP (val); + POP (idx); + POP (instance); + slot = SCM_I_INUM (idx); + SCM_STRUCT_DATA (instance) [slot] = SCM_UNPACK (val); + NEXT; +} + + +/* + * Bytevectors + */ #define VM_VALIDATE_BYTEVECTOR(x) \ if (SCM_UNLIKELY (!SCM_BYTEVECTOR_P (x))) \ { finish_args = x; \ @@ -406,21 +544,21 @@ VM_DEFINE_INSTRUCTION (130, vector_set, "vector-set", 0, 3, 0) } \ } -VM_DEFINE_FUNCTION (131, bv_u16_ref, "bv-u16-ref", 3) +VM_DEFINE_FUNCTION (172, bv_u16_ref, "bv-u16-ref", 3) BV_REF_WITH_ENDIANNESS (u16, u16) -VM_DEFINE_FUNCTION (132, bv_s16_ref, "bv-s16-ref", 3) +VM_DEFINE_FUNCTION (173, bv_s16_ref, "bv-s16-ref", 3) BV_REF_WITH_ENDIANNESS (s16, s16) -VM_DEFINE_FUNCTION (133, bv_u32_ref, "bv-u32-ref", 3) +VM_DEFINE_FUNCTION (174, bv_u32_ref, "bv-u32-ref", 3) BV_REF_WITH_ENDIANNESS (u32, u32) -VM_DEFINE_FUNCTION (134, bv_s32_ref, "bv-s32-ref", 3) +VM_DEFINE_FUNCTION (175, bv_s32_ref, "bv-s32-ref", 3) BV_REF_WITH_ENDIANNESS (s32, s32) -VM_DEFINE_FUNCTION (135, bv_u64_ref, "bv-u64-ref", 3) +VM_DEFINE_FUNCTION (176, bv_u64_ref, "bv-u64-ref", 3) BV_REF_WITH_ENDIANNESS (u64, u64) -VM_DEFINE_FUNCTION (136, bv_s64_ref, "bv-s64-ref", 3) +VM_DEFINE_FUNCTION (177, bv_s64_ref, "bv-s64-ref", 3) BV_REF_WITH_ENDIANNESS (s64, s64) -VM_DEFINE_FUNCTION (137, bv_f32_ref, "bv-f32-ref", 3) +VM_DEFINE_FUNCTION (178, bv_f32_ref, "bv-f32-ref", 3) BV_REF_WITH_ENDIANNESS (f32, ieee_single) -VM_DEFINE_FUNCTION (138, bv_f64_ref, "bv-f64-ref", 3) +VM_DEFINE_FUNCTION (179, bv_f64_ref, "bv-f64-ref", 3) BV_REF_WITH_ENDIANNESS (f64, ieee_double) #undef BV_REF_WITH_ENDIANNESS @@ -473,33 +611,33 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) RETURN (scm_bytevector_##fn_stem##_native_ref (bv, idx)); \ } -VM_DEFINE_FUNCTION (139, bv_u8_ref, "bv-u8-ref", 2) +VM_DEFINE_FUNCTION (180, bv_u8_ref, "bv-u8-ref", 2) BV_FIXABLE_INT_REF (u8, u8, uint8, 1) -VM_DEFINE_FUNCTION (140, bv_s8_ref, "bv-s8-ref", 2) +VM_DEFINE_FUNCTION (181, bv_s8_ref, "bv-s8-ref", 2) BV_FIXABLE_INT_REF (s8, s8, int8, 1) -VM_DEFINE_FUNCTION (141, bv_u16_native_ref, "bv-u16-native-ref", 2) +VM_DEFINE_FUNCTION (182, bv_u16_native_ref, "bv-u16-native-ref", 2) BV_FIXABLE_INT_REF (u16, u16_native, uint16, 2) -VM_DEFINE_FUNCTION (142, bv_s16_native_ref, "bv-s16-native-ref", 2) +VM_DEFINE_FUNCTION (183, bv_s16_native_ref, "bv-s16-native-ref", 2) BV_FIXABLE_INT_REF (s16, s16_native, int16, 2) -VM_DEFINE_FUNCTION (143, bv_u32_native_ref, "bv-u32-native-ref", 2) +VM_DEFINE_FUNCTION (184, bv_u32_native_ref, "bv-u32-native-ref", 2) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_REF (u32, u32_native, uint32, 4) #else BV_INT_REF (u32, uint32, 4) #endif -VM_DEFINE_FUNCTION (144, bv_s32_native_ref, "bv-s32-native-ref", 2) +VM_DEFINE_FUNCTION (185, bv_s32_native_ref, "bv-s32-native-ref", 2) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_REF (s32, s32_native, int32, 4) #else BV_INT_REF (s32, int32, 4) #endif -VM_DEFINE_FUNCTION (145, bv_u64_native_ref, "bv-u64-native-ref", 2) +VM_DEFINE_FUNCTION (186, bv_u64_native_ref, "bv-u64-native-ref", 2) BV_INT_REF (u64, uint64, 8) -VM_DEFINE_FUNCTION (146, bv_s64_native_ref, "bv-s64-native-ref", 2) +VM_DEFINE_FUNCTION (187, bv_s64_native_ref, "bv-s64-native-ref", 2) BV_INT_REF (s64, int64, 8) -VM_DEFINE_FUNCTION (147, bv_f32_native_ref, "bv-f32-native-ref", 2) +VM_DEFINE_FUNCTION (188, bv_f32_native_ref, "bv-f32-native-ref", 2) BV_FLOAT_REF (f32, ieee_single, float, 4) -VM_DEFINE_FUNCTION (148, bv_f64_native_ref, "bv-f64-native-ref", 2) +VM_DEFINE_FUNCTION (189, bv_f64_native_ref, "bv-f64-native-ref", 2) BV_FLOAT_REF (f64, ieee_double, double, 8) #undef BV_FIXABLE_INT_REF @@ -521,21 +659,21 @@ BV_FLOAT_REF (f64, ieee_double, double, 8) } \ } -VM_DEFINE_INSTRUCTION (149, bv_u16_set, "bv-u16-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (190, bv_u16_set, "bv-u16-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u16, u16) -VM_DEFINE_INSTRUCTION (150, bv_s16_set, "bv-s16-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (191, bv_s16_set, "bv-s16-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s16, s16) -VM_DEFINE_INSTRUCTION (151, bv_u32_set, "bv-u32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (192, bv_u32_set, "bv-u32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u32, u32) -VM_DEFINE_INSTRUCTION (152, bv_s32_set, "bv-s32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (193, bv_s32_set, "bv-s32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s32, s32) -VM_DEFINE_INSTRUCTION (153, bv_u64_set, "bv-u64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (194, bv_u64_set, "bv-u64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u64, u64) -VM_DEFINE_INSTRUCTION (154, bv_s64_set, "bv-s64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (195, bv_s64_set, "bv-s64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s64, s64) -VM_DEFINE_INSTRUCTION (155, bv_f32_set, "bv-f32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (196, bv_f32_set, "bv-f32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (f32, ieee_single) -VM_DEFINE_INSTRUCTION (156, bv_f64_set, "bv-f64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (197, bv_f64_set, "bv-f64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (f64, ieee_double) #undef BV_SET_WITH_ENDIANNESS @@ -588,170 +726,45 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) NEXT; \ } -VM_DEFINE_INSTRUCTION (157, bv_u8_set, "bv-u8-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (198, bv_u8_set, "bv-u8-set", 0, 3, 0) BV_FIXABLE_INT_SET (u8, u8, uint8, 0, SCM_T_UINT8_MAX, 1) -VM_DEFINE_INSTRUCTION (158, bv_s8_set, "bv-s8-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (199, bv_s8_set, "bv-s8-set", 0, 3, 0) BV_FIXABLE_INT_SET (s8, s8, int8, SCM_T_INT8_MIN, SCM_T_INT8_MAX, 1) -VM_DEFINE_INSTRUCTION (159, bv_u16_native_set, "bv-u16-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (200, bv_u16_native_set, "bv-u16-native-set", 0, 3, 0) BV_FIXABLE_INT_SET (u16, u16_native, uint16, 0, SCM_T_UINT16_MAX, 2) -VM_DEFINE_INSTRUCTION (160, bv_s16_native_set, "bv-s16-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (201, bv_s16_native_set, "bv-s16-native-set", 0, 3, 0) BV_FIXABLE_INT_SET (s16, s16_native, int16, SCM_T_INT16_MIN, SCM_T_INT16_MAX, 2) -VM_DEFINE_INSTRUCTION (161, bv_u32_native_set, "bv-u32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (202, bv_u32_native_set, "bv-u32-native-set", 0, 3, 0) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_SET (u32, u32_native, uint32, 0, SCM_T_UINT32_MAX, 4) #else BV_INT_SET (u32, uint32, 4) #endif -VM_DEFINE_INSTRUCTION (162, bv_s32_native_set, "bv-s32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (203, bv_s32_native_set, "bv-s32-native-set", 0, 3, 0) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_SET (s32, s32_native, int32, SCM_T_INT32_MIN, SCM_T_INT32_MAX, 4) #else BV_INT_SET (s32, int32, 4) #endif -VM_DEFINE_INSTRUCTION (163, bv_u64_native_set, "bv-u64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (204, bv_u64_native_set, "bv-u64-native-set", 0, 3, 0) BV_INT_SET (u64, uint64, 8) -VM_DEFINE_INSTRUCTION (164, bv_s64_native_set, "bv-s64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (205, bv_s64_native_set, "bv-s64-native-set", 0, 3, 0) BV_INT_SET (s64, int64, 8) -VM_DEFINE_INSTRUCTION (165, bv_f32_native_set, "bv-f32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (206, bv_f32_native_set, "bv-f32-native-set", 0, 3, 0) BV_FLOAT_SET (f32, ieee_single, float, 4) -VM_DEFINE_INSTRUCTION (166, bv_f64_native_set, "bv-f64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (207, bv_f64_native_set, "bv-f64-native-set", 0, 3, 0) BV_FLOAT_SET (f64, ieee_double, double, 8) #undef BV_FIXABLE_INT_SET #undef BV_INT_SET #undef BV_FLOAT_SET -#define VM_VALIDATE_STRUCT(obj) \ - if (SCM_UNLIKELY (!SCM_STRUCTP (obj))) \ - { \ - finish_args = (obj); \ - goto vm_error_not_a_struct; \ - } - -VM_DEFINE_FUNCTION (174, struct_p, "struct?", 1) -{ - ARGS1 (obj); - RETURN (scm_from_bool (SCM_STRUCTP (obj))); -} - -VM_DEFINE_FUNCTION (175, struct_vtable, "struct-vtable", 1) -{ - ARGS1 (obj); - VM_VALIDATE_STRUCT (obj); - RETURN (SCM_STRUCT_VTABLE (obj)); -} - -VM_DEFINE_INSTRUCTION (176, make_struct, "make-struct", 2, -1, 1) -{ - unsigned h = FETCH (); - unsigned l = FETCH (); - scm_t_bits n_args = ((h << 8U) + l); - SCM vtable = sp[1 - n_args], n_tail = sp[2 - n_args]; - const SCM *inits = sp - n_args + 3; - - sp -= n_args - 1; - - if (SCM_LIKELY (SCM_STRUCTP (vtable) - && SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SIMPLE) - && SCM_I_INUMP (n_tail))) - { - scm_t_bits n_inits, len; - - n_inits = SCM_I_INUM (n_tail) + n_args - 2; - len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); - - if (SCM_LIKELY (n_inits == len)) - { - SCM obj; - - obj = scm_i_alloc_struct (SCM_STRUCT_DATA (vtable), n_inits); - memcpy (SCM_STRUCT_DATA (obj), inits, n_inits * sizeof (SCM)); - - RETURN (obj); - } - } - - SYNC_REGISTER (); - RETURN (scm_c_make_structv (vtable, scm_to_size_t (n_tail), - n_args - 2, (scm_t_bits *) inits)); -} - -VM_DEFINE_INSTRUCTION (177, make_array, "make-array", 3, -1, 1) -{ - scm_t_uint32 len; - SCM shape, ret; - - len = FETCH (); - len = (len << 8) + FETCH (); - len = (len << 8) + FETCH (); - POP (shape); - SYNC_REGISTER (); - ret = scm_from_contiguous_array (shape, sp - len + 1, len); - DROPN (len); - PUSH (ret); - NEXT; -} - -VM_DEFINE_FUNCTION (178, struct_ref, "struct-ref", 2) -{ - ARGS2 (obj, pos); - - if (SCM_LIKELY (SCM_STRUCTP (obj) - && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, - SCM_VTABLE_FLAG_SIMPLE) - && SCM_I_INUMP (pos))) - { - SCM vtable; - scm_t_bits index, len; - - index = SCM_I_INUM (pos); - vtable = SCM_STRUCT_VTABLE (obj); - len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); - - if (SCM_LIKELY (index < len)) - { - scm_t_bits *data = SCM_STRUCT_DATA (obj); - RETURN (SCM_PACK (data[index])); - } - } - - RETURN (scm_struct_ref (obj, pos)); -} - -VM_DEFINE_FUNCTION (179, struct_set, "struct-set", 3) -{ - ARGS3 (obj, pos, val); - - if (SCM_LIKELY (SCM_STRUCTP (obj) - && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, - SCM_VTABLE_FLAG_SIMPLE) - && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, - SCM_VTABLE_FLAG_SIMPLE_RW) - && SCM_I_INUMP (pos))) - { - SCM vtable; - scm_t_bits index, len; - - index = SCM_I_INUM (pos); - vtable = SCM_STRUCT_VTABLE (obj); - len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); - if (SCM_LIKELY (index < len)) - { - scm_t_bits *data = SCM_STRUCT_DATA (obj); - data[index] = SCM_UNPACK (val); - RETURN (val); - } - } - - RETURN (scm_struct_set_x (obj, pos, val)); -} - /* (defun renumber-ops () "start from top of buffer and renumber 'VM_DEFINE_FOO (\n' sequences" (interactive "") (save-excursion - (let ((counter 99)) (goto-char (point-min)) + (let ((counter 127)) (goto-char (point-min)) (while (re-search-forward "^VM_DEFINE_[^ ]+ (\\([^,]+\\)," (point-max) t) (replace-match (number-to-string (setq counter (1+ counter))) |