mescc: Support expression as lhs array index.
authorJan Nieuwenhuizen <janneke@gnu.org>
Wed, 5 Apr 2017 12:24:34 +0000 (14:24 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 5 Apr 2017 12:24:34 +0000 (14:24 +0200)
* module/language/c99/compiler.mes (expr->accu): Treat array index as expression.
* scaffold/t.c (struct_test): Test it.
* gc.c (gc_copy)[!__GNUC__]: Remove branch.
* vector.c (list_to_vector)[!__GNUC__]: Likewise.

gc.c
module/language/c99/compiler.mes
scaffold/t.c
vector.c

diff --git a/gc.c b/gc.c
index 0c9c1608ae1142efec201cb7f1e351eb64aa1574..26e4b252ce0bd0b9747887f950341404979998c9 100644 (file)
--- a/gc.c
+++ b/gc.c
@@ -77,14 +77,7 @@ gc_copy (SCM old) ///((internal))
     {
       NVECTOR (new) = g_free;
       for (int i=0; i<LENGTH (old); i++)
-#if __GNUC__
         g_news[g_free++] = g_cells[VECTOR (old)+i];
-#else
-      {
-        SCM b = VECTOR (old)+i;
-        g_news[g_free++] = g_cells[b];
-      }
-#endif
     }
   TYPE (old) = TBROKEN_HEART;
   CAR (old) = new;
index 1cbd0082186830fe80c24183867b1f8dcc6d96c2..6b81f7c7fe6c66a8e77aa07793787d42b048dedd 100644 (file)
                                  (i386:value->accu size))))))))
         
         ;; c+p expr->arg
-        ;; g_cells[0]
-        ((array-ref (p-expr (fixed ,index)) (p-expr (ident ,array)))
-         (let* ((index (cstring->number index))
+        ;; g_cells[<expr>]
+        ((array-ref ,index (p-expr (ident ,array)))
+         (let* ((info ((expr->accu info) index))
                 (type (ident->type info array))
                 (size (type->size info type)))
            (clone info #:text
-                  (append text
-                        ((ident->base info) array)
-                        (list (lambda (f g ta t d)
-                                (append
-                                 (i386:value->accu (* size index))
-                                 (case size
-                                   ((1) (i386:byte-base-mem->accu))
-                                   ((4) (i386:base-mem->accu))
-                                   (else (i386:accu+base))))))))))
-
-        ;; c+p expr->arg
-        ;; g_cells[i]
-        ((array-ref (p-expr (ident ,index)) (p-expr (ident ,array)))
-         (let* ((type (ident->type info array))
-                (size (type->size info type)))
-           (clone info #:text (append text
-                                      ((ident->base info) index)
-                                      (list (lambda (f g ta t d)
-                                              (append
-                                               (i386:base->accu)
-                                               (if (< size 4) '()
-                                                   (append
-                                                    (i386:accu+accu)
-                                                    (if (= size 12) (i386:accu+base) '())
-                                                    (i386:accu-shl 2))))))
-                                      ((ident->base info) array)
-                                      (list (lambda (f g ta t d)
-                                              (case size
-                                                ((1) (i386:byte-base-mem->accu))
-                                                ((4) (i386:base-mem->accu))
-                                                (else (i386:accu+base)))))))))
+                  (append (.text info)
+                          ;; immediate: (i386:value->accu (* size index))
+                          ;; * size cells: * length * 4 = * 12
+                          (list (lambda (f g ta t d)
+                                  (append
+                                   (i386:accu->base)
+                                   (if (eq? size 1) '()
+                                       (append
+                                        (if (> size 4) (i386:accu+accu) '())
+                                        (if (> size 8) (i386:accu+base) '())
+                                        (i386:accu-shl 2))))))
+                          ((ident->base info) array)
+                          (list (lambda (f g ta t d)
+                                  (append
+                                   (case size
+                                     ((1) (i386:byte-base-mem->accu))
+                                     ((4) (i386:base-mem->accu))
+                                     (else (i386:accu+base))))))))))
 
         ;; f.field
         ((d-sel (ident ,field) (p-expr (ident ,array)))
index 1d470844f50db7400e960468f86ce39b214b357f..522ba7ca7f63d0b0df8efaaccafbf7f35e720668 100644 (file)
@@ -294,7 +294,7 @@ struct_test ()
   TYPE (1) = 1;
   CAR (1) = 2;
   CDR (1) = 3;
-  g_cells[0] = g_cells[1];
+  g_cells[0] = g_cells[0+1];
   if (TYPE (0) != 1) return 1;
   if (CAR (0) != 2) return 2;
   if (CDR (0) != 3) return 3;
index 26acf80462050d2c66a40b494176c9eaca0c0f96..1b5db5234ade64d535443edd8c27024e03db9652 100644 (file)
--- a/vector.c
+++ b/vector.c
@@ -87,12 +87,7 @@ list_to_vector (SCM x)
   SCM p = VECTOR (v);
   while (x != cell_nil)
     {
-#if __GNUC__
       g_cells[p++] = g_cells[vector_entry (car (x))];
-#else
-      SCM b = vector_entry (car (x));
-      g_cells[p++] = g_cells[b];
-#endif
       x = cdr (x);
     }
   return v;