1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 06:41:13 +02:00

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.
This commit is contained in:
Andy Wingo 2009-08-05 11:55:42 +02:00
parent f4863880f5
commit 7382f23e58
4 changed files with 52 additions and 6 deletions

View file

@ -215,11 +215,37 @@ VM_DEFINE_FUNCTION (120, add, "add", 2)
FUNC2 (+, scm_sum); 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) VM_DEFINE_FUNCTION (121, sub, "sub", 2)
{ {
FUNC2 (-, scm_difference); 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) VM_DEFINE_FUNCTION (122, mul, "mul", 2)
{ {
ARGS2 (x, y); ARGS2 (x, y);

View file

@ -85,6 +85,8 @@
((>= . 2) . ge?) ((>= . 2) . ge?)
((+ . 2) . add) ((+ . 2) . add)
((- . 2) . sub) ((- . 2) . sub)
((1+ . 1) . add1)
((1- . 1) . sub1)
((* . 2) . mul) ((* . 2) . mul)
((/ . 2) . div) ((/ . 2) . div)
((quotient . 2) . quo) ((quotient . 2) . quo)

View file

@ -19,6 +19,7 @@
;;; Code: ;;; Code:
(define-module (language tree-il primitives) (define-module (language tree-il primitives)
#:use-module (system base pmatch)
#:use-module (rnrs bytevector) #:use-module (rnrs bytevector)
#:use-module (system base syntax) #:use-module (system base syntax)
#:use-module (language tree-il) #:use-module (language tree-il)
@ -142,8 +143,14 @@
(define (consequent exp) (define (consequent exp)
(cond (cond
((pair? exp) ((pair? exp)
`(make-application src (make-primitive-ref src ',(car exp)) (pmatch exp
,(inline-args (cdr exp)))) ((if ,test ,then ,else)
`(if ,test
,(consequent then)
,(consequent else)))
(else
`(make-application src (make-primitive-ref src ',(car exp))
,(inline-args (cdr exp))))))
((symbol? exp) ((symbol? exp)
;; assume locally bound ;; assume locally bound
exp) exp)
@ -163,6 +170,15 @@
(define-primitive-expander + (define-primitive-expander +
() 0 () 0
(x) x (x) x
(x y) (if (and (const? y)
(let ((y (const-exp y)))
(and (exact? y) (= y 1))))
(1+ x)
(if (and (const? x)
(let ((x (const-exp x)))
(and (exact? x) (= x 1))))
(1+ y)
(+ x y)))
(x y z . rest) (+ x (+ y z . rest))) (x y z . rest) (+ x (+ y z . rest)))
(define-primitive-expander * (define-primitive-expander *
@ -172,11 +188,13 @@
(define-primitive-expander - (define-primitive-expander -
(x) (- 0 x) (x) (- 0 x)
(x y) (if (and (const? y)
(let ((y (const-exp y)))
(and (exact? y) (= y 1))))
(1- x)
(- x y))
(x y z . rest) (- x (+ y z . rest))) (x y z . rest) (- x (+ y z . rest)))
(define-primitive-expander 1-
(x) (- x 1))
(define-primitive-expander / (define-primitive-expander /
(x) (/ 1 x) (x) (/ 1 x)
(x y z . rest) (/ x (* y z . rest))) (x y z . rest) (/ x (* y z . rest)))

View file

@ -72,7 +72,7 @@
(program 0 0 0 () (const 1) (call return 1))) (program 0 0 0 () (const 1) (call return 1)))
(assert-tree-il->glil (assert-tree-il->glil
(apply (primitive +) (void) (const 1)) (apply (primitive +) (void) (const 1))
(program 0 0 0 () (void) (const 1) (call add 2) (call return 1)))) (program 0 0 0 () (void) (call add1 1) (call return 1))))
(with-test-prefix "application" (with-test-prefix "application"
(assert-tree-il->glil (assert-tree-il->glil