DRAFT mescc: Consider truncate after each shift operation.
* module/mescc/compile.scm (expr->register): After lshift and rshift, use convert-r0. Tuncate on largest of default/int or size of first operand.
This commit is contained in:
parent
05e945c0a8
commit
592a612777
|
@ -1215,8 +1215,20 @@
|
||||||
(append-text info (wrap-as (as info 'not-r)))))
|
(append-text info (wrap-as (as info 'not-r)))))
|
||||||
((bitwise-or ,a ,b) ((binop->r info) a b 'r0-or-r1))
|
((bitwise-or ,a ,b) ((binop->r info) a b 'r0-or-r1))
|
||||||
((bitwise-xor ,a ,b) ((binop->r info) a b 'r0-xor-r1))
|
((bitwise-xor ,a ,b) ((binop->r info) a b 'r0-xor-r1))
|
||||||
((lshift ,a ,b) ((binop->r info) a b 'r0<<r1))
|
((lshift ,a ,b)
|
||||||
((rshift ,a ,b) ((binop->r info) a b 'r0>>r1))
|
(let* ((type-a (ast->type a info))
|
||||||
|
(default (get-type "default" info))
|
||||||
|
(type (if (> (->size type-a info) (->size default info)) type-a
|
||||||
|
default))
|
||||||
|
(info ((binop->r info) a b 'r0<<r1)))
|
||||||
|
(append-text info (convert-r0 info type))))
|
||||||
|
((rshift ,a ,b)
|
||||||
|
(let* ((type-a (ast->type a info))
|
||||||
|
(default (get-type "default" info))
|
||||||
|
(type (if (> (->size type-a info) (->size default info)) type-a
|
||||||
|
default))
|
||||||
|
(info ((binop->r info) a b 'r0>>r1)))
|
||||||
|
(append-text info (convert-r0 info type))))
|
||||||
((div ,a ,b)
|
((div ,a ,b)
|
||||||
((binop->r info) a b 'r0/r1
|
((binop->r info) a b 'r0/r1
|
||||||
(signed? (ast->type a info))))
|
(signed? (ast->type a info))))
|
||||||
|
|
Loading…
Reference in a new issue