mescc: Only use signed division when numerator is signed.

Currently, sign-extension (CLTD vs XOR EDX) and signed division (IDIV vs
DIV) selected by setting "signed?".  See, module/mescc/x86/as.scm.
Possibly we need a signed? based on numerator and denominator, and
add a extend-sign? based on the signedness of the numerator?

* module/mescc/compile.scm (expr->register): Base "signed?" strictly on
signedness of numerator.
This commit is contained in:
Jan (janneke) Nieuwenhuizen 2021-01-01 10:31:46 +01:00
parent fac6a873f7
commit 348dcbcbd7
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273

View file

@ -1218,9 +1218,9 @@
((rshift ,a ,b) ((binop->r info) a b 'r0>>r1))
((div ,a ,b)
((binop->r info) a b 'r0/r1
(or (signed? (ast->type a info)) (signed? (ast->type b info)))))
(signed? (ast->type a info))))
((mod ,a ,b) ((binop->r info) a b 'r0%r1
(or (signed? (ast->type a info)) (signed? (ast->type b info)))))
(signed? (ast->type a info))))
((mul ,a ,b) ((binop->r info) a b 'r0*r1))
((not ,expr)
@ -1361,7 +1361,7 @@
info)))
(info (expr->register a info))
(info (append-text info (wrap-as (as info 'swap-r0-r1))))
(signed? (or (signed? type) (signed? type-b)))
(signed? (signed? type))
(info (append-text info (cond ((equal? op "+=") (wrap-as (as info 'r0+r1)))
((equal? op "-=") (wrap-as (as info 'r0-r1)))
((equal? op "*=") (wrap-as (as info 'r0*r1)))