mescc: Tinycc support: word array assignment.

* stage0/x86.M1 (movzwl_(%eax),%eax): New define.
* module/mes/as-i386.mes (i386:word-mem->accu): New function.
* module/mes/as-i386.scm: Export it.
* module/language/c99/compiler.mes (expr->accu): word array assignment.
  (expr->accu*): word array assignment.
* scaffold/tests/7a-struct-char-array.c (test): Test it.
This commit is contained in:
Jan Nieuwenhuizen 2017-08-08 10:00:13 +02:00
parent 082c81dbbb
commit b16c9dbf16
5 changed files with 71 additions and 32 deletions

View file

@ -517,8 +517,8 @@
((sizeof-expr (p-expr (string ,string)))
(append-text info (wrap-as (i386:value->accu (1+ (string-length string))))))
((sizeof-expr (i-sel (ident ,field) (p-expr (ident ,array))))
(let* ((type (ident->type info array))
((sizeof-expr (i-sel (ident ,field) (p-expr (ident ,struct))))
(let* ((type (ident->type info struct))
(size (field-size info type field)))
(append-text info (wrap-as (i386:value->accu size)))))
@ -550,16 +550,16 @@
(let ((size 4))
(append-text info (wrap-as (i386:value->accu size)))))
;; c+p expr->arg
;; g_cells[<expr>]
;; foo[bar]
((array-ref ,index (p-expr (ident ,array)))
(let* ((type (ident->type info array))
(let* ((info ((expr->accu* info) o))
(type (ident->type info array))
(ptr (ident->pointer info array))
(size (if (or (= ptr 1) (= ptr -1)) (ast-type->size info type)
4))
(info ((expr->accu* info) o)))
4)))
(append-text info (wrap-as (case size
((1) (i386:byte-mem->accu))
((2) (i386:word-mem->accu))
((4) (i386:mem->accu))
(else '()))))))
@ -573,6 +573,7 @@
4)))
(append-text info (wrap-as (case size
((1) (i386:byte-mem->accu))
((2) (i386:word-mem->accu))
(else (i386:mem->accu)))))))
;; foo->bar[baz])
@ -585,6 +586,7 @@
4)))
(append-text info (wrap-as (case size
((1) (i386:byte-mem->accu))
((2) (i386:word-mem->accu))
(else (i386:mem->accu)))))))
;; <expr>[baz]
@ -593,8 +595,10 @@
(ptr (expr->pointer info array))
(size (if (= ptr 1) (expr->size info array)
4)))
(append-text info (wrap-as (if (= size 1) (i386:byte-mem->accu)
(i386:mem->accu))))))
(append-text info (wrap-as (case size
((1) (i386:byte-mem->accu))
((2) (i386:word-mem->accu))
(else (i386:mem->accu)))))))
;; bar.f.i
((d-sel (ident ,field1) (d-sel (ident ,field0) (p-expr (ident ,struct0))))
@ -688,8 +692,10 @@
4)))
(append-text info (append (if (or #t (assoc-ref locals name)) ((ident->accu info) name)
((ident-address->accu info) name))
(wrap-as (if (= size 1) (i386:byte-mem->accu)
(i386:mem->accu)))))))
(wrap-as (case size
((1) (i386:byte-mem->accu))
((2) (i386:word-mem->accu))
(else (i386:mem->accu))))))))
((de-ref (post-inc (p-expr (ident ,name))))
(let* ((info ((expr->accu info) `(de-ref (p-expr (ident ,name)))))
@ -704,8 +710,10 @@
(ptr (expr->pointer info expr))
(size (if (= ptr 1) (expr->size info expr)
4)))
(append-text info (wrap-as (if (= size 1) (i386:byte-mem->accu)
(i386:mem->accu))))))
(append-text info (wrap-as (case size
((1) (i386:byte-mem->accu))
((2) (i386:word-mem->accu))
(else (i386:mem->accu)))))))
((fctn-call (p-expr (ident ,name)) (expr-list . ,expr-list))
(if (equal? name "asm") (let ((arg0 (cadr (cadar expr-list)))) ;; FIXME
@ -1031,8 +1039,10 @@
4))
(info ((expr->base* info) a)))
(append-text info
(append (if (eq? size 1) (wrap-as (i386:byte-accu->base-mem))
(if (<= size 4) (wrap-as (i386:accu->base-mem))
(append (case size
((1) (wrap-as (i386:byte-accu->base-mem)))
((2) (wrap-as (i386:word-accu->base-mem)))
(else (if (<= size 4) (wrap-as (i386:accu->base-mem))
(append
(wrap-as (i386:accu-mem->base-mem))
(wrap-as (append (i386:accu+value 4)
@ -1041,7 +1051,7 @@
(if (<= size 8) '()
(wrap-as (append (i386:accu+value 4)
(i386:base+value 4)
(i386:accu-mem->base-mem)))))))))))
(i386:accu-mem->base-mem))))))))))))
(_ (error "expr->accu: unsupported assign: " a)))))
(_ (error "expr->accu: unsupported: " o))))))
@ -1080,7 +1090,7 @@
(define (expr->accu* info)
(lambda (o)
(pmatch o
;; g_cells[<expr>]
;; foo[bar]
((array-ref ,index (p-expr (ident ,array)))
(let* ((info ((expr->accu info) index))
(type (ident->type info array))
@ -1088,13 +1098,14 @@
(size (if (or (= ptr 1) (= ptr -1)) (ast-type->size info type)
4)))
(append-text info (append (wrap-as (append (i386:accu->base)
(if (eq? size 1) '()
(append
(if (<= size 4) '()
(case size
((1) '())
((2) (i386:accu+accu))
(else (append (if (<= size 4) '()
(i386:accu+accu))
(if (<= size 8) '()
(i386:accu+base))
(i386:accu-shl 2)))))
(i386:accu-shl 2))))))
((ident->base info) array)
(wrap-as (i386:accu+base))))))

View file

@ -321,6 +321,9 @@
(define (i386:byte-mem->accu)
'(("movzbl_(%eax),%eax"))) ; movzbl (%eax),%eax
(define (i386:word-mem->accu)
'(("movzwl_(%eax),%eax")))
(define (i386:byte-mem->base)
'(("movzbl_(%edx),%edx"))) ; movzbl (%edx),%edx

View file

@ -69,6 +69,7 @@
i386:base-mem->accu
i386:base-sub
i386:byte-accu->base-mem
i386:word-accu->base-mem
i386:byte-base->accu-mem
i386:byte-base->accu-mem+n
i386:byte-base-mem->accu
@ -76,6 +77,7 @@
i386:byte-local->accu
i386:byte-local->base
i386:byte-mem->accu
i386:word-mem->accu
i386:byte-mem->base
i386:byte-sub-base
i386:byte-test-base

View file

@ -118,5 +118,27 @@ test ()
if (p[8] != ' ') return 32;
if (p[9] != '9') return 33;
short *ps;
ps = pfile->buffer;
p = pfile->buffer;
strcpy (file.buffer, "0123456789\n");
eputs (file.buffer);
memcpy (ps + 1, " ", 2);
eputs (file.buffer);
eputs (itoa (ps[1])); eputs ("\n");
eputs (itoa (((' ' << 8) + ' '))); eputs ("\n");
if (ps[1] != ((' ' << 8) + ' ')) return 40;
if (p[4] != '4') return 41;
strcpy (file.buffer, "0123456789\n");
eputs (file.buffer);
ps[2] = ((' ' << 8) + ' ');
eputs (file.buffer);
eputs (itoa (ps[2])); eputs ("\n");
eputs (itoa (((' ' << 8) + ' '))); eputs ("\n");
if (ps[2] != ((' ' << 8) + ' ')) return 42;
if (p[6] != '6') return 43;
return 0;
}

View file

@ -139,6 +139,7 @@ DEFINE movzbl_0x32(%ebp),%eax 0fb685
DEFINE movzbl_0x8(%eax),%eax 0fb640
DEFINE movzbl_0x8(%ebp),%eax 0fb645
DEFINE movzbl_0x8(%ebp),%edx 0fb655
DEFINE movzwl_(%eax),%eax 0fb700
DEFINE movzwl_0x32(%eax),%eax 0fb780
DEFINE movzwl_0x8(%eax),%eax 0fb740
DEFINE mul____%edx f7e2