about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--mu.arc19
-rw-r--r--mu.arc.t37
2 files changed, 42 insertions, 14 deletions
diff --git a/mu.arc b/mu.arc
index d0f83099..d556e30a 100644
--- a/mu.arc
+++ b/mu.arc
@@ -4,7 +4,8 @@
   (= types* (obj
               integer (obj size 1)
               location (obj size 1)
-              address (obj size 1)))
+              address (obj size 1)
+              boolean (obj size 1)))
   (= memory* (table))
   (= function* (table)))
 (clear)
@@ -58,6 +59,18 @@
                    (trunc:/ (memory* arg.0.1) (memory* arg.1.1))
                    (memory* oarg.1.1)
                    (mod (memory* arg.0.1) (memory* arg.1.1)))
+              and
+                (= (memory* oarg.0.1)
+                   (and (memory* arg.0.1) (memory* arg.1.1)))
+              or
+                (= (memory* oarg.0.1)
+                   (and (memory* arg.0.1) (memory* arg.1.1)))
+              not
+                (= (memory* oarg.0.1)
+                   (not (memory* arg.0.1)))
+              eq
+                (= (memory* oarg.0.1)
+                   (iso (memory* arg.0.1) (memory* arg.1.1)))
               arg
                 (let idx (if arg
                            arg.0
@@ -72,8 +85,8 @@
                 (do (= pc (+ pc arg.0.1))  ; relies on continue still incrementing (bug)
 ;?                     (prn "jumping to " pc)
                     (continue))
-              jifz
-                (when (is 0 (memory* arg.0.1))
+              jif
+                (when (is t (memory* arg.0.1))
 ;?                   (prn "jumping to " arg.1.1)
                   (= pc (+ pc arg.1.1))  ; relies on continue still incrementing (bug)
                   (continue))
diff --git a/mu.arc.t b/mu.arc.t
index 8150f4a1..4c24d0c5 100644
--- a/mu.arc.t
+++ b/mu.arc.t
@@ -165,6 +165,17 @@
 (clear)
 (add-fns
   '((main
+      ((boolean 1) <- loadi t)
+      ((boolean 2) <- loadi nil)
+      ((boolean 3) <- and (boolean 1) (boolean 2)))))
+(run function*!main)
+;? (prn memory*)
+(if (~iso memory* (obj 1 t  2 nil  3 nil))
+  (prn "F - and works"))
+
+(clear)
+(add-fns
+  '((main
       ((integer 1) <- loadi 8)
       (jmp (offset 1))
       ((integer 2) <- loadi 3)
@@ -190,36 +201,40 @@
 (clear)
 (add-fns
   '((main
-      ((integer 1) <- loadi 0)
-      (jifz (integer 1) (offset 1))
+      ((integer 1) <- loadi 1)
+      ((integer 2) <- loadi 1)
+      ((boolean 3) <- eq (integer 1) (integer 2))
+      (jif (boolean 3) (offset 1))
       ((integer 2) <- loadi 3)
       (reply)
       ((integer 3) <- loadi 34))))
 (run function*!main)
 ;? (prn memory*)
-(if (~iso memory* (obj 1 0))
-  (prn "F - jifz works"))
+(if (~iso memory* (obj 1 1  2 1  3 t))
+  (prn "F - jif works"))
 
 (clear)
 (add-fns
   '((main
       ((integer 1) <- loadi 1)
-      (jifz (integer 1) (offset 1))
-      ((integer 2) <- loadi 3)
+      ((integer 2) <- loadi 2)
+      ((boolean 3) <- eq (integer 1) (integer 2))
+      (jif (boolean 3) (offset 1))
+      ((integer 4) <- loadi 3)
       (reply)
       ((integer 3) <- loadi 34))))
 (run function*!main)
 ;? (prn memory*)
-(if (~iso memory* (obj 1 1  2 3))
-  (prn "F - jifz works - 2"))
+(if (~iso memory* (obj 1 1  2 2  3 nil  4 3))
+  (prn "F - jif works - 2"))
 
 (clear)
 (add-fns
   '((add-fn
       ((integer 4) <- otype 0)
       ((integer 5) <- loadi 0)  ; type index corresponding to 'integer'
-      ((integer 6) <- sub (integer 4) (integer 5))
-      (jifz (integer 6) (offset 1))
+      ((boolean 6) <- eq (integer 4) (integer 5))
+      (jif (boolean 6) (offset 1))
       (reply)
       ((integer 7) <- arg)
       ((integer 8) <- arg)
@@ -233,5 +248,5 @@
 ;? (prn memory*)
 (if (~iso memory* (obj 1 1  2 3                     3 4
                          ; add-fn's temporaries
-                         4 0  5 0  6 0  7 1  8 3  9 4))
+                         4 0  5 0  6 t  7 1  8 3  9 4))
   (prn "F - user-defined function with clauses"))