mescc: Use signed integer comparison.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 24 Mar 2017 20:45:19 +0000 (21:45 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 24 Mar 2017 20:45:19 +0000 (21:45 +0100)
* module/language/c99/compiler.mes (test->jump->info):
* module/mes/as-i386.mes (i386:Xjump-le, i386:Xjump-g, i386:Xjump-l,
  i386:Xjump-ge): New functions.
* module/mes/as-i386.scm: Export them.
* scaffold/t.c (math_test): Test them.
* tests/scm.test ("iota -1"): Enable for mesc.

module/language/c99/compiler.mes
module/mes/as-i386.mes
module/mes/as-i386.scm
scaffold/mini-mes.c
scaffold/t.c
tests/scm.test

index 0648bbc8c154f2b3e73c71008b0f0b9b25a2d601..51d24870d8ec16ec43cd5c73b775ce1f8cd7616f 100644 (file)
                         (jump-text body-length)))))))
   (lambda (o)
     (pmatch o
-      ((le ,a ,b) ((jump i386:Xjump-ncz) o))
-      ((lt ,a ,b) ((jump i386:Xjump-nc) o))
-      ((ge ,a ,b) ((jump i386:Xjump-ncz) o))
-      ((gt ,a ,b) ((jump i386:Xjump-nc) o))
+      ;; unsigned
+      ;; ((le ,a ,b) ((jump i386:Xjump-ncz) o)) ; ja
+      ;; ((lt ,a ,b) ((jump i386:Xjump-nc) o))  ; jae
+      ;; ((ge ,a ,b) ((jump i386:Xjump-ncz) o))
+      ;; ((gt ,a ,b) ((jump i386:Xjump-nc) o))
+
+      ((le ,a ,b) ((jump i386:Xjump-g) o))
+      ((lt ,a ,b) ((jump i386:Xjump-ge) o))
+      ((ge ,a ,b) ((jump i386:Xjump-g) o))
+      ((gt ,a ,b) ((jump i386:Xjump-ge) o))
+
       ((ne ,a ,b) ((jump i386:Xjump-nz) o))
       ((eq ,a ,b) ((jump i386:Xjump-nz) o))
       ((not _) ((jump i386:Xjump-z) o))
index 9b1a63dfd99855ffa28d6af0c5c8d72bcd2b8bbf..287066cd02559b67fd9ead8411afa16be18f1605 100644 (file)
     barf)
   `(#x72 ,(if (>= n 0) n (- n 2))))     ; jc <n>
 
-(define (i386:Xjump-c n)
-  (or n urg:Xjump-c)
-  `(#x0f #x82 ,@(int->bv32 n)))     ; jc <n>
-
 (define (i386:jump-cz n)
   (when (or (> n #x80) (< n #x-80))
     (format (current-error-port) "JUMP n=~a\n" n)
     barf)
   `(#x73 ,(if (>= n 0) n (- n 2))))     ; jnc <n>
 
+;; unsigned
 (define (i386:Xjump-nc n)
   (or n urg:Xjump-nc)
   `(#x0f #x83 ,@(int->bv32 n)))         ; jnc <n>
 
-(define (i386:Xjump-cz n)
-  (or n urg:Xjump-cz)
-  `(#x0f #x86 ,@(int->bv32 n)))         ; jbe <n>
-
+;; unsigned
 (define (i386:Xjump-ncz n)
   (or n urg:Xjump-ncz)
   `(#x0f #x87 ,@(int->bv32 n)))         ; ja <n>
 
+;; unsigned
+;; (define (i386:Xjump-c n)
+;;   (or n urg:Xjump-c)
+;;   `(#x0f #x82 ,@(int->bv32 n)))     ; jc <n>
+
+;; unsigned
+;; (define (i386:Xjump-cz n)
+;;   (or n urg:Xjump-cz)
+;;   `(#x0f #x86 ,@(int->bv32 n)))         ; jbe <n>
+
+;; signed
+(define (i386:Xjump-g n)
+  (or n urg:Xjump-g)
+  `(#x0f #x8f ,@(int->bv32 n)))         ; jg/jnle <n>
+
+;; signed
+(define (i386:Xjump-ge n)
+  (or n urg:Xjump-ge)
+  `(#x0f #x8d ,@(int->bv32 n)))         ; jge/jnl <n>
+
+;; ;; signed
+;; (define (i386:Xjump-l n)
+;;   (or n urg:Xjump-l)
+;;   `(#x0f #x8c ,@(int->bv32 n)))         ; jl/jnge <n>
+
+;; ;; signed
+;; (define (i386:Xjump-le n)
+;;   (or n urg:Xjump-le)
+;;   `(#x0f #x8e ,@(int->bv32 n)))         ; jle/jgn <n>
+
 (define (i386:jump-z n)
   (when (or (> n #x80) (< n #x-80))
     (format (current-error-port) "JUMP-z n=~a\n" n)
index fe0a008f0f0d67118c4235bfea9338c33abed428..9c5fd4398349287af1757bd40189c1744ac16c0f 100644 (file)
 
             ;; long jump
             i386:Xjump
-            i386:Xjump
-            i386:Xjump-c
-            i386:Xjump-cz
+            ;;i386:Xjump-c
+            ;;i386:Xjump-cz
             i386:Xjump-nc
             i386:Xjump-ncz
+
             i386:Xjump-nz
             i386:Xjump-z
 
+            i386:Xjump-g
+            i386:Xjump-ge
+
+            ;; i386:Xjump-l
+            ;; i386:Xjump-le
+
             i386:XXjump
 
             i386:accu+n
index b2fc0b2ac31499aa60dfba7636ed10d0fb0401c6..0d8fdb94ff5af7d44ffcf6c9148de81ece2ac22a 100644 (file)
@@ -1368,11 +1368,6 @@ less_p (SCM x) ///((name . "<") (arity . n))
   while (x != cell_nil)
     {
       assert (TYPE (car (x)) == TNUMBER);
-#if __MESC__
-      //FIXME __GNUC__
-      if (n == INT_MIN);
-      else
-#endif
       if (VALUE (car (x)) <= n) return cell_f;
       n = VALUE (car (x));
       x = cdr (x);
index 1fd12f5cfe1f0bbcf539b81645f9a8f97defcc13..cffa2ce7593b22c857d306f61805c9e2c247c986 100644 (file)
@@ -177,6 +177,30 @@ read_test ()
 int
 math_test ()
 {
+  puts ("t: 0 < 0\n");
+  if (0 < 0) return 1;
+
+  puts ("t: 2 < 1\n");
+  if (2 < 1) return 1;
+
+  puts ("t: -1 < -2\n");
+  if (-1 < -2) return 1;
+
+  puts ("t: 0 < -1\n");
+  if (0 < -1) return 1;
+
+  puts ("t: 0 > 0\n");
+  if (0 > 0) return 1;
+
+  puts ("t: 1 > 2\n");
+  if (1 > 2) return 1;
+
+  puts ("t: -2 > -1\n");
+  if (-2 > -1) return 1;
+
+  puts ("t: -1 > 0\n");
+  if (-1 > 0) return 1;
+
   int i;
   puts ("t: 4/2=");
   i = 4 / 2;
index e8b8682718ad402e1bdf0cb56e069a639343893a..2f444255cb8baa2d25e80538c159b4bdd8345729 100755 (executable)
@@ -122,9 +122,8 @@ exit $?
 (pass-if-equal "iota 0"
     '() (iota 0))
 
-(if %mesc (display "***FIXME: MESCC skip iota -1")
-    (pass-if-equal "iota -1"
-                   '() (iota -1)))
+(pass-if-equal "iota -1"
+               '() (iota -1))
 
 (pass-if "reverse" (sequal? (reverse '(1 2 3)) '(3 2 1)))