Teach assembler about MODULO.
authorTaylor R Campbell <campbell@mumble.net>
Mon, 14 Jan 2019 07:44:17 +0000 (07:44 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 21 Aug 2019 21:34:01 +0000 (21:34 +0000)
XXX Should maybe do EUCLIDEAN-REMAINDER or the full gamut of division
operators, but this is all I need for now.

src/compiler/back/bitutl.scm

index 7cb117b05d55b5b5b42b15fcfc801e6e25e699e1..4330716601ec9d07a60ef4350586da38d1744b45 100644 (file)
@@ -130,7 +130,8 @@ USA.
     (* . ,(lambda () interval:*))
     (/ . ,(lambda () interval:/))
     (QUOTIENT . ,(lambda () interval:quotient))
-    (REMAINDER . ,(lambda () interval:remainder))))
+    (REMAINDER . ,(lambda () interval:remainder))
+    (MODULO . ,(lambda () interval:modulo))))
 
 (define-integrable (->machine-pc pc)
   (paranoid-quotient pc addressing-granularity))
@@ -271,6 +272,11 @@ USA.
   (if (or (interval? a) (interval? b))
       (error "REMAINDER doesn't do intervals:" a b))
   (remainder a b))
+
+(define (interval:modulo a b)
+  (if (or (interval? a) (interval? b))
+      (error "MODULO doesn't do intervals:" a b))
+  (modulo a b))
 \f
 ;;; A segment consists of an ending point and a coefficient.
 ;;; The ending point has a minimum and maximum non-negative integer value.