From b3f25e62695315ab632d2e3a66d31bb490c82100 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Sun, 15 Apr 2012 13:39:56 -0700 Subject: [PATCH 1/1] better primitives support for bit operations * module/language/tree-il/primitives.scm (*interesting-primitive-names*): Add lognot. (*effect-free-primitives*): Add ash, logand, logior, logxor, and lognot. (logior, logand): Define associative expanders. --- module/language/tree-il/primitives.scm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/module/language/tree-il/primitives.scm b/module/language/tree-il/primitives.scm index 704f7c294..dba31bdc8 100644 --- a/module/language/tree-il/primitives.scm +++ b/module/language/tree-il/primitives.scm @@ -46,7 +46,7 @@ memq memv = < > <= >= zero? + * - / 1- 1+ quotient remainder modulo - ash logand logior logxor + ash logand logior logxor lognot not pair? null? list? symbol? vector? string? struct? number? char? @@ -148,6 +148,7 @@ `(values eq? eqv? equal? = < > <= >= zero? + ash logand logior logxor lognot + * - / 1- 1+ quotient remainder modulo not pair? null? list? symbol? vector? struct? string? number? char? @@ -364,6 +365,18 @@ (x) (/ 1 x) (x y z . rest) (/ x (* y z . rest))) +(define-primitive-expander logior + () 0 + (x) (logior x 0) + (x y) (logior x y) + (x y z . rest) (logior x (logior y z . rest))) + +(define-primitive-expander logand + () -1 + (x) (logand x -1) + (x y) (logand x y) + (x y z . rest) (logand x (logand y z . rest))) + (define-primitive-expander caar (x) (car (car x))) (define-primitive-expander cadr (x) (car (cdr x))) (define-primitive-expander cdar (x) (cdr (car x))) -- 2.20.1