diff --git a/module/language/c99/compiler.mes b/module/language/c99/compiler.mes index 714d32d1..13f26869 100644 --- a/module/language/c99/compiler.mes +++ b/module/language/c99/compiler.mes @@ -898,12 +898,12 @@ (if (<= size 4) (wrap-as (i386:base->accu-address)) (append (wrap-as (i386:base-address->accu-address)) - (wrap-as (append (i386:accu+n 4) - (i386:base+n 4) + (wrap-as (append (i386:accu+value 4) + (i386:base+value 4) (i386:base-address->accu-address))) (if (<= size 8) '() - (wrap-as (append (i386:accu+n 4) - (i386:base+n 4) + (wrap-as (append (i386:accu+value 4) + (i386:base+value 4) (i386:base-address->accu-address))))))))))) ((i-sel (ident ,field) ,array) diff --git a/module/mes/as-i386.mes b/module/mes/as-i386.mes index 13986097..b6d3854f 100644 --- a/module/mes/as-i386.mes +++ b/module/mes/as-i386.mes @@ -31,11 +31,11 @@ (mes-use-module (mes as)))) (define (i386:nop) - '(("nop"))) ; nop + '(("nop"))) (define (i386:function-preamble) - '(("push___%ebp") ; push %ebp - ("mov____%esp,%ebp"))) ; mov %esp,%ebp; + '(("push___%ebp") + ("mov____%esp,%ebp"))) (define (i386:function-locals) '(("sub____%esp,$i8" (#:immediate1 #x40)))) ; sub %esp,$0x40 # 16 local vars @@ -47,33 +47,135 @@ `(("mov____0x32,%eax" (#:address ,label)) ; mov 0x804a000,%eax ("push___%eax"))) ; push %eax + +;;; locals + (define (i386:push-local n) (or n (error "invalid value: push-local: " n)) - `(("push___0x8(%ebp)" (#:immediate1 ,(- 0 (* 4 n)))))) ; pushl 0x(%ebp) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("push___0x8(%ebp)" (#:immediate1 ,n)) + `("push___0x32(%ebp)" (#:immediate ,n)))))) (define (i386:push-local-address n) (or n (error "invalid value: push-local-address: " n)) - `(("lea____0x8(%ebp),%eax" (#:immediate1 ,(- 0 (* 4 n)))) ; lea 0x(%ebp),%eax - ("push___%eax"))) ; push %eax + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("lea____0x8(%ebp),%eax" (#:immediate1 ,n)) + `("lea____0x32(%ebp),%eax" (#:immediate ,n))) + ("push___%eax")))) (define (i386:push-byte-local-de-ref n) (or n (error "invalid value: push-byte-local-de-ref: " n)) - `(("mov____0x8(%ebp),%eax" (#:immediate1 ,(- 0 (* 4 n)))) ; mov -0x(%ebp),%eax - ("movzbl_(%eax),%eax") ; movzbl (%eax),%eax - ("push___%eax"))) ; push %eax + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n)) + `("mov____0x32(%ebp),%eax" (#:immediate ,n))) + ("movzbl_(%eax),%eax") + ("push___%eax")))) (define (i386:push-byte-local-de-de-ref n) (or n (error "invalid value: push-byte-local-de-de-ref: " n)) - `(("mov____0x8(%ebp),%eax" (#:immediate1 ,(- 0 (* 4 n)))) ; mov -0x(%ebp),%eax - ("mov____(%eax),%eax") ; mov (%eax),%eax - ("movzbl_(%eax),%eax") ; movzbl (%eax),%eax - ("push___%eax"))) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n)) + `("mov____0x32(%ebp),%eax" (#:immediate ,n))) + ("mov____(%eax),%eax") + ("movzbl_(%eax),%eax") + ("push___%eax")))) (define (i386:push-local-de-ref n) (or n (error "invalid value: push-byte-local-de-ref: " n)) - `(("mov____0x8(%ebp),%eax" (#:immediate1 ,(- 0 (* 4 n)))) ; mov -0x(%ebp),%eax - ("mov____(%eax),%eax") ; mov (%eax),%eax - ("push___%eax"))) ; push %eax + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n)) + `("mov____0x32(%ebp),%eax" (#:immediate ,n))) + ("mov____(%eax),%eax") + ("push___%eax")))) + +(define (i386:local-add n v) + (or n (error "invalid value: i386:local-add: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (and (< (abs n) #x80) + (< (abs v) #x80)) `("add____$i8,0x8(%ebp)" (#:immediate1 ,n) (#:immediate1 ,v)) + `("add____$i32,0x32(%ebp)" (#:immediate ,n) (#:immediate ,v)))))) + +(define (i386:accu->local n) + (or n (error "invalid value: accu->local: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("mov____%eax,0x8(%ebp)" (#:immediate1 ,n)) + `("mov____%eax,0x32(%ebp)" (#:immediate ,n)))))) + +(define (i386:base->local n) + (or n (error "invalid value: base->local: " n)) + `(("mov____%edx,0x8(%ebp)" ,(- 0 (* 4 n))))) ; mov %edx,-<0xn>(%ebp) + +(define (i386:base->local n) + (or n (error "invalid value: base->local: " n)) + (let ((n (- 0 (* 4 n)))) + `((if (< (abs n) #x80) `("mov____%edx,0x8(%ebp)" (#:immediate1 ,n)) + `("mov____%edx,0x32(%ebp)" (#:immediate ,n)))))) + +(define (i386:local->accu n) + (or n (error "invalid value: local->accu: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n)) + `("mov____0x32(%ebp),%eax" (#:immediate ,n)))))) + +(define (i386:local-address->accu n) + (or n (error "invalid value: ladd: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("lea____0x8(%ebp),%eax" (#:immediate1 ,n)) + `("lea____0x32(%ebp),%eax" (#:immediate ,n)))))) + +(define (i386:local-ptr->accu n) + (or n (error "invalid value: local-ptr->accu: " n)) + (let ((n (- 0 (* 4 n)))) + `(("mov____%ebp,%eax") ; mov %ebp,%eax + ,(if (< (abs n) #x80) `("add____$i8,%eax" (#:immediate1 ,n)) + `("add____$i32,%eax" (#:immediate ,n)))))) + +(define (i386:byte-local->accu n) + (or n (error "invalid value: byte-local->accu: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("movzbl_0x8(%ebp),%eax" (#:immediate1 ,n)) + `("movzbl_0x32(%ebp),%eax" (#:immediate ,n)))))) + +(define (i386:byte-local->base n) + (or n (error "invalid value: byte-local->base: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("movzbl_0x8(%ebp),%edx" (#:immediate1 ,n)) + `,@(("mov_0x32(%ebp),%edx" (#:immediate ,n)) + ("movzbl_%dl,%edx")))))) + +(define (i386:local->base n) + (or n (error "invalid value: local->base: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%edx" (#:immediate1 ,n)) + `("mov____0x32(%ebp),%edx" (#:immediate ,n)))))) + +(define (i386:local-address->base n) ;; DE-REF + (or n (error "invalid value: local-address->base: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("lea____0x8(%ebp),%edx" (#:immediate1 ,n)) + `("lea____0x32(%ebp),%edx" (#:immediate ,n)))))) + +(define (i386:local-ptr->base n) + (or n (error "invalid value: local-ptr->base: " n)) + (let ((n (- 0 (* 4 n)))) + `(("mov____%ebp,%edx") ; mov %ebp,%edx + ,(if (< (abs n) #x80) `("add____$i8,%edx" (#:immediate1 ,n)) + `("add____$i32,%edx" (#:immediate ,n)))))) + +(define (i386:value->local n v) + (or n (error "invalid value: value->local: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(if (< (abs n) #x80) `("mov____$i32,0x8(%ebp)" (#:immediate1 ,n) (#:immediate ,v)) + `("mov____$i32,0x32(%ebp)" (#:immediate ,n) (#:immediate ,v)))))) + +(define (i386:local-test n v) + (or n (error "invalid value: local-test: " n)) + (let ((n (- 0 (* 4 n)))) + `(,(cond ((and (< (abs n) #x80) + (< (abs v) #x80)) `("cmp____$i8,0x8(%ebp)" (#:immediate1 ,n) (#:immediate1 ,v))) + ((< (abs n) #x80) `("cmp____$i32,0x8(%ebp)" (#:immediate1 ,n) (#:immediate ,v))) + ((< (abs v) #x80) `("cmp____$i8,0x32(%ebp)" (#:immediate ,n) (#:immediate1 ,v))) + (else `("cmp____$i32,0x32(%ebp)" (#:immediate ,n) (#:immediate ,v))))))) (define (i386:pop-accu) '(("pop____%eax"))) ; pop %eax @@ -102,19 +204,8 @@ (define (i386:accu->base-address+n n) (or n (error "invalid value: accu->base-address+n: " n)) - `(("mov____%eax,0x8(%edx)" (#:immediate1 ,n)))) ; mov %eax,$0x%(edx) - -(define (i386:accu->local n) - (or n (error "invalid value: accu->local: " n)) - `(("mov____%eax,0x8(%ebp)" (#:immediate1 ,(- 0 (* 4 n)))))) ; mov %eax,-<0xn>(%ebp) - -;; (define (i386:accu->local-address n) -;; (or n (error "invalid value: accu->local: " n)) -;; `(#x89 #x45 ,(- 0 (* 4 n)))) ; mov %eax,-<0xn>(%ebp) - -(define (i386:base->local n) - (or n (error "invalid value: base->local: " n)) - `(("mov____%edx,0x8(%ebp)" ,(- 0 (* 4 n))))) ; mov %edx,-<0xn>(%ebp) + `(,(if (< (abs n) #x80) `("mov____%eax,0x8(%edx)" (#:immediate1 ,n)) + `("mov____%eax,0x32(%edx)" (#:immediate ,n))))) (define (i386:accu->label label) `(("mov____%eax,0x32" (#:address ,label)))) ; mov %eax,0x