| ... |
... |
@@ -469,22 +469,13 @@ getRegister' _ platform (CmmLoad mem pk _) |
|
469
|
469
|
return (Any II64 code)
|
|
470
|
470
|
|
|
471
|
471
|
-- catch simple cases of zero- or sign-extended load
|
|
472
|
|
--- XXX: refactor into separate function
|
|
473
|
472
|
getRegister' _ _ (CmmMachOp (MO_UU_Conv src tgt) [CmmLoad mem pk _])
|
|
474
|
|
- | src < tgt = do
|
|
475
|
|
- let format = cmmTypeFormat pk
|
|
476
|
|
- Amode addr addr_code <- getAmode D mem
|
|
477
|
|
- let code dst = assert (format == intFormat src)
|
|
478
|
|
- $ addr_code `snocOL` LD format dst addr
|
|
479
|
|
- return (Any (intFormat tgt) code)
|
|
|
473
|
+ | src < tgt
|
|
|
474
|
+ , cmmTypeFormat pk == intFormat src = loadZeroExpand mem pk tgt
|
|
480
|
475
|
|
|
481
|
476
|
getRegister' _ _ (CmmMachOp (MO_XX_Conv src tgt) [CmmLoad mem pk _])
|
|
482
|
|
- | src < tgt = do
|
|
483
|
|
- let format = cmmTypeFormat pk
|
|
484
|
|
- Amode addr addr_code <- getAmode D mem
|
|
485
|
|
- let code dst = assert (format == intFormat src)
|
|
486
|
|
- $ addr_code `snocOL` LD format dst addr
|
|
487
|
|
- return (Any (intFormat tgt) code)
|
|
|
477
|
+ | src < tgt =
|
|
|
478
|
+ , cmmTypeFormat pk == intFormat src = loadZeroExpand mem pk tgt
|
|
488
|
479
|
|
|
489
|
480
|
-- XXX: This is ugly, refactor
|
|
490
|
481
|
getRegister' _ _ (CmmMachOp (MO_SS_Conv src tgt) [CmmLoad mem pk _])
|
| ... |
... |
@@ -778,6 +769,12 @@ extendSExpr from to x = CmmMachOp (MO_SS_Conv from to) [x] |
|
778
|
769
|
extendUExpr :: Width -> Width -> CmmExpr -> CmmExpr
|
|
779
|
770
|
extendUExpr from to x = CmmMachOp (MO_UU_Conv from to) [x]
|
|
780
|
771
|
|
|
|
772
|
+loadZeroExpand :: CmmExpr -> CmmType -> Format -> NatM Register
|
|
|
773
|
+loadZeroExpand mem pk tgt = do
|
|
|
774
|
+ Amode addr addr_code <- getAmode D mem
|
|
|
775
|
+ let code dst = addr_code `snocOL` LD (cmmTypeFormat pk) dst addr
|
|
|
776
|
+ return (Any (intFormat tgt) code)
|
|
|
777
|
+
|
|
781
|
778
|
-- -----------------------------------------------------------------------------
|
|
782
|
779
|
-- The 'Amode' type: Memory addressing modes passed up the tree.
|
|
783
|
780
|
|