mescc: Support ==, != as expression value.
* module/mes/as-i386.scm: Export them. * module/language/c99/compiler.mes (expr->accu): Set accu to 0/1 for eq, ne. * module/mes/as-i386.mes (i386:nz->accu, i386:z->accu, i386:accu<->stack): New functions. * scaffold/t.c (math_test): Test it.
This commit is contained in:
parent
be6e30a8fa
commit
2eae07de72
|
@ -712,11 +712,20 @@
|
||||||
(wrap-as (i386:value->accu 0))
|
(wrap-as (i386:value->accu 0))
|
||||||
(wrap-as (i386:sub-base)))))
|
(wrap-as (i386:sub-base)))))
|
||||||
|
|
||||||
((eq ,a ,b) ((binop->accu info) a b (i386:sub-base)))
|
((eq ,a ,b) ((binop->accu info) a b (append (i386:sub-base) (i386:z->accu))))
|
||||||
((ge ,a ,b) ((binop->accu info) b a (i386:sub-base)))
|
((ge ,a ,b) ((binop->accu info) b a (i386:sub-base)))
|
||||||
((gt ,a ,b) ((binop->accu info) b a (i386:sub-base)))
|
((gt ,a ,b) ((binop->accu info) b a (i386:sub-base)))
|
||||||
((ne ,a ,b) ((binop->accu info) a b (append (i386:sub-base)
|
|
||||||
(i386:xor-zf))))
|
;; FIXME: set accu *and* flags
|
||||||
|
((ne ,a ,b) ((binop->accu info) a b (append (i386:push-accu)
|
||||||
|
(i386:sub-base)
|
||||||
|
(i386:nz->accu)
|
||||||
|
(i386:accu<->stack)
|
||||||
|
(i386:sub-base)
|
||||||
|
(i386:xor-zf)
|
||||||
|
(i386:pop-accu))))
|
||||||
|
|
||||||
|
((ne ,a ,b) ((binop->accu info) a b (append (i386:sub-base) (i386:xor-zf))))
|
||||||
((le ,a ,b) ((binop->accu info) b a (i386:base-sub)))
|
((le ,a ,b) ((binop->accu info) b a (i386:base-sub)))
|
||||||
((lt ,a ,b) ((binop->accu info) b a (i386:base-sub)))
|
((lt ,a ,b) ((binop->accu info) b a (i386:base-sub)))
|
||||||
|
|
||||||
|
|
|
@ -483,3 +483,14 @@
|
||||||
(define (i386:base-sub)
|
(define (i386:base-sub)
|
||||||
`(#x29 #xc2)) ; sub %eax,%edx
|
`(#x29 #xc2)) ; sub %eax,%edx
|
||||||
|
|
||||||
|
(define (i386:nz->accu)
|
||||||
|
'(#x0f #x95 #xc0 ; setne %al
|
||||||
|
#x0f #xb6 #xc0)) ; movzbl %al,%eax
|
||||||
|
|
||||||
|
(define (i386:z->accu)
|
||||||
|
'(#x0f #x94 #xc0 ; sete %al
|
||||||
|
#x0f #xb6 #xc0)) ; movzbl %al,%eax
|
||||||
|
|
||||||
|
(define (i386:accu<->stack)
|
||||||
|
'(#x87 #x04 #x24)) ; xchg %eax,(%esp)
|
||||||
|
|
||||||
|
|
|
@ -148,6 +148,10 @@
|
||||||
i386:accu+n
|
i386:accu+n
|
||||||
i386:base+n
|
i386:base+n
|
||||||
i386:base-address->accu-address
|
i386:base-address->accu-address
|
||||||
|
|
||||||
|
i386:nz->accu
|
||||||
|
i386:z->accu
|
||||||
|
i386:accu<->stack
|
||||||
))
|
))
|
||||||
|
|
||||||
(include-from-path "mes/as-i386.mes")
|
(include-from-path "mes/as-i386.mes")
|
||||||
|
|
|
@ -341,6 +341,12 @@ math_test ()
|
||||||
puts ("t: ^ 1 \n");
|
puts ("t: ^ 1 \n");
|
||||||
if ((1 ^ 3) != 2) return 1;
|
if ((1 ^ 3) != 2) return 1;
|
||||||
|
|
||||||
|
puts ("t: 3 == 3\n");
|
||||||
|
if ((3 == 3) != 1) return 1;
|
||||||
|
|
||||||
|
puts ("t: 3 != 3\n");
|
||||||
|
if ((3 != 3) != 0) return 1;
|
||||||
|
|
||||||
return array_test (env);
|
return array_test (env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue