Add primitives `fixnum-quotient' and `fixnum-remainder'.
authorChris Hanson <org/chris-hanson/cph>
Thu, 28 Sep 1989 21:19:51 +0000 (21:19 +0000)
committerChris Hanson <org/chris-hanson/cph>
Thu, 28 Sep 1989 21:19:51 +0000 (21:19 +0000)
v7/src/microcode/fixnum.c
v7/src/microcode/version.h
v8/src/microcode/version.h

index 72537536f64c0b37a88fbca4e96cc91be2bf140b..15e5be2610bf863a7fe485fa9cf43e4dfd22cd00 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/fixnum.c,v 9.28 1989/09/20 23:08:26 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/fixnum.c,v 9.29 1989/09/28 21:18:59 cph Exp $
 
 Copyright (c) 1987, 1988, 1989 Massachusetts Institute of Technology
 
@@ -122,6 +122,12 @@ DEFINE_PRIMITIVE ("MINUS-FIXNUM", Prim_minus_fixnum, 2, 2, 0)
   FIXNUM_RESULT ((arg_fixnum (1)) - (arg_fixnum (2)));
 }
 
+DEFINE_PRIMITIVE ("FIXNUM-NEGATE", Prim_fixnum_negate, 1, 1, 0)
+{
+  PRIMITIVE_HEADER (1);
+  FIXNUM_RESULT (- (arg_fixnum (1)));
+}
+
 /* Fixnum multiplication routine with overflow detection. */
 #include "mul.c"
 
@@ -180,6 +186,48 @@ DEFINE_PRIMITIVE ("DIVIDE-FIXNUM", Prim_divide_fixnum, 2, 2, 0)
   PRIMITIVE_RETURN
     (cons ((LONG_TO_FIXNUM (quotient)), (LONG_TO_FIXNUM (remainder))));
 }
+\f
+DEFINE_PRIMITIVE ("FIXNUM-QUOTIENT", Prim_fixnum_quotient, 2, 2, 0)
+{
+  PRIMITIVE_HEADER (2);
+  {
+    fast long numerator = (arg_fixnum (1));
+    fast long denominator = (arg_fixnum (2));
+    fast long quotient =
+      ((denominator > 0)
+       ? ((numerator < 0)
+         ? (- ((- numerator) / denominator))
+         : (numerator / denominator))
+       : (denominator < 0)
+       ? ((numerator < 0)
+         ? ((- numerator) / (- denominator))
+         : (- (numerator / (- denominator))))
+       : (error_bad_range_arg (2), 0));
+    if (! (LONG_TO_FIXNUM_P (quotient)))
+      error_bad_range_arg (1);
+    PRIMITIVE_RETURN (LONG_TO_FIXNUM (quotient));
+  }
+}
+
+DEFINE_PRIMITIVE ("FIXNUM-REMAINDER", Prim_fixnum_remainder, 2, 2, 0)
+{
+  PRIMITIVE_HEADER (2);
+  {
+    fast long numerator = (arg_fixnum (1));
+    fast long denominator = (arg_fixnum (2));
+    PRIMITIVE_RETURN
+      (LONG_TO_FIXNUM
+       ((denominator > 0)
+       ? ((numerator < 0)
+          ? (- ((- numerator) % denominator))
+          : (numerator % denominator))
+       : (denominator < 0)
+       ? ((numerator < 0)
+          ? (- ((- numerator) % (- denominator)))
+          : (numerator % (- denominator)))
+       : (error_bad_range_arg (2), 0)));
+  }
+}
 
 DEFINE_PRIMITIVE ("GCD-FIXNUM", Prim_gcd_fixnum, 2, 2, 0)
 {
@@ -189,6 +237,8 @@ DEFINE_PRIMITIVE ("GCD-FIXNUM", Prim_gcd_fixnum, 2, 2, 0)
   PRIMITIVE_HEADER (2);
   x = (arg_fixnum (1));
   y = (arg_fixnum (2));
+  if (x < 0) x = (-x);
+  if (y < 0) y = (-y);
   while (y != 0)
     {
       z = x;
index a6a0d27a2060891c7b2d389a5164a9f1d8ccdef3..b63eb8618a2e950c873f7f4b29d1a8473f77f3da 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/version.h,v 11.3 1989/09/25 16:51:23 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/version.h,v 11.4 1989/09/28 21:19:51 cph Exp $
 
 Copyright (c) 1988, 1989 Massachusetts Institute of Technology
 
@@ -46,7 +46,7 @@ MIT in each case. */
 #define VERSION                11
 #endif
 #ifndef SUBVERSION
-#define SUBVERSION     3
+#define SUBVERSION     4
 #endif
 
 #ifndef UCODE_TABLES_FILENAME
index f88b690f62a8ba59fe882f8e2a1d54ded4794f84..8cde4c23eb428d6ec75585684aafcacb48a00a76 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/microcode/version.h,v 11.3 1989/09/25 16:51:23 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/microcode/version.h,v 11.4 1989/09/28 21:19:51 cph Exp $
 
 Copyright (c) 1988, 1989 Massachusetts Institute of Technology
 
@@ -46,7 +46,7 @@ MIT in each case. */
 #define VERSION                11
 #endif
 #ifndef SUBVERSION
-#define SUBVERSION     3
+#define SUBVERSION     4
 #endif
 
 #ifndef UCODE_TABLES_FILENAME