DRAFT mescc: Only use signed division when numerator is signed.
XXX TODO: We are getting stray nondeterministic floating point
exceptions when compiling mes using mescc with an m2-planet-compiled
mes: recompilation often succeeds.
I am suspecting using signed division: CLTD / IDIV is the problem,
which were enabled here
fa4147a284
mescc: Use signed division for x86, x86_64 when appropriate.
before, we never used signed division. This patch fixed
lib/tests/scaffold/36-compare-arithmetic.c
lib/tests/scaffold/36-compare-arithmetic-negative.c
As a workaround, I have been avoiding using signed division, however,
signed division should work just fine.
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:
parent
d6d1399d55
commit
2da6375b4e
|
@ -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)))
|
||||
|
|
Loading…
Reference in New Issue