diff options
author | Andy Wingo <wingo@pobox.com> | 2009-08-05 11:55:42 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2009-08-05 11:55:42 +0200 |
commit | 7382f23e58725eef2f7a374ec101a42c0192527e (patch) | |
tree | e89dacc9c0918950aa9f67bcfccbcb338a3055e8 /libguile/vm-i-scheme.c | |
parent | f4863880f5ef539cb545999c19b6b5c0eec9382d (diff) | |
download | guile-7382f23e58725eef2f7a374ec101a42c0192527e.tar.gz |
add1 and sub1 instructions
* libguile/vm-i-scheme.c: Add add1 and sub1 instructions.
* module/language/tree-il/compile-glil.scm: Compile 1+ and 1- to add1
and sub1.
* module/language/tree-il/primitives.scm (define-primitive-expander):
Add support for `if' statements in the consequent.
(+, -): Compile (- x 1), (+ x 1), and (+ 1 x) to 1- or 1+ as
appropriate.
(1-): Remove this one. Seems we forgot 1+ before, but we weren't
compiling it nicely anyway.
* test-suite/tests/tree-il.test ("void"): Fix expected compilation of (+
(void) 1) to allow for add1.
Diffstat (limited to 'libguile/vm-i-scheme.c')
-rw-r--r-- | libguile/vm-i-scheme.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c index dce9b5fbc..675ec1a0a 100644 --- a/libguile/vm-i-scheme.c +++ b/libguile/vm-i-scheme.c @@ -215,11 +215,37 @@ VM_DEFINE_FUNCTION (120, add, "add", 2) FUNC2 (+, scm_sum); } +VM_DEFINE_FUNCTION (167, add1, "add1", 1) +{ + ARGS1 (x); + if (SCM_I_INUMP (x)) + { + scm_t_int64 n = SCM_I_INUM (x) + 1; + if (SCM_FIXABLE (n)) + RETURN (SCM_I_MAKINUM (n)); + } + SYNC_REGISTER (); + RETURN (scm_sum (x, SCM_I_MAKINUM (1))); +} + VM_DEFINE_FUNCTION (121, sub, "sub", 2) { FUNC2 (-, scm_difference); } +VM_DEFINE_FUNCTION (168, sub1, "sub1", 1) +{ + ARGS1 (x); + if (SCM_I_INUMP (x)) + { + scm_t_int64 n = SCM_I_INUM (x) - 1; + if (SCM_FIXABLE (n)) + RETURN (SCM_I_MAKINUM (n)); + } + SYNC_REGISTER (); + RETURN (scm_difference (x, SCM_I_MAKINUM (1))); +} + VM_DEFINE_FUNCTION (122, mul, "mul", 2) { ARGS2 (x, y); |