Peter Trommler pushed to branch wip/T26519 at Glasgow Haskell Compiler / GHC

Commits:

1 changed file:

Changes:

  • compiler/GHC/CmmToAsm/PPC/CodeGen.hs
    ... ... @@ -469,48 +469,26 @@ 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
    -getRegister' _ _ (CmmMachOp (MO_UU_Conv W8 W32) [CmmLoad mem _ _]) = do
    
    473
    -    Amode addr addr_code <- getAmode D mem
    
    474
    -    return (Any II32 (\dst -> addr_code `snocOL` LD II8 dst addr))
    
    475
    -
    
    476
    -getRegister' _ _ (CmmMachOp (MO_XX_Conv W8 W32) [CmmLoad mem _ _]) = do
    
    477
    -    Amode addr addr_code <- getAmode D mem
    
    478
    -    return (Any II32 (\dst -> addr_code `snocOL` LD II8 dst addr))
    
    479
    -
    
    480
    -getRegister' _ _ (CmmMachOp (MO_UU_Conv W8 W64) [CmmLoad mem _ _]) = do
    
    481
    -    Amode addr addr_code <- getAmode D mem
    
    482
    -    return (Any II64 (\dst -> addr_code `snocOL` LD II8 dst addr))
    
    483
    -
    
    484
    -getRegister' _ _ (CmmMachOp (MO_XX_Conv W8 W64) [CmmLoad mem _ _]) = do
    
    485
    -    Amode addr addr_code <- getAmode D mem
    
    486
    -    return (Any II64 (\dst -> addr_code `snocOL` LD II8 dst addr))
    
    487
    -
    
    488
    --- Note: there is no Load Byte Arithmetic instruction, so no signed case here
    
    489
    -
    
    490
    -getRegister' _ _ (CmmMachOp (MO_UU_Conv W16 W32) [CmmLoad mem _ _]) = do
    
    491
    -    Amode addr addr_code <- getAmode D mem
    
    492
    -    return (Any II32 (\dst -> addr_code `snocOL` LD II16 dst addr))
    
    493
    -
    
    494
    -getRegister' _ _ (CmmMachOp (MO_SS_Conv W16 W32) [CmmLoad mem _ _]) = do
    
    495
    -    Amode addr addr_code <- getAmode D mem
    
    496
    -    return (Any II32 (\dst -> addr_code `snocOL` LA II16 dst addr))
    
    497
    -
    
    498
    -getRegister' _ _ (CmmMachOp (MO_UU_Conv W16 W64) [CmmLoad mem _ _]) = do
    
    499
    -    Amode addr addr_code <- getAmode D mem
    
    500
    -    return (Any II64 (\dst -> addr_code `snocOL` LD II16 dst addr))
    
    501
    -
    
    502
    -getRegister' _ _ (CmmMachOp (MO_SS_Conv W16 W64) [CmmLoad mem _ _]) = do
    
    503
    -    Amode addr addr_code <- getAmode D mem
    
    504
    -    return (Any II64 (\dst -> addr_code `snocOL` LA II16 dst addr))
    
    505
    -
    
    506
    -getRegister' _ _ (CmmMachOp (MO_UU_Conv W32 W64) [CmmLoad mem _ _]) = do
    
    507
    -    Amode addr addr_code <- getAmode D mem
    
    508
    -    return (Any II64 (\dst -> addr_code `snocOL` LD II32 dst addr))
    
    509
    -
    
    510
    -getRegister' _ _ (CmmMachOp (MO_SS_Conv W32 W64) [CmmLoad mem _ _]) = do
    
    511
    -    -- lwa is DS-form. See Note [Power instruction format]
    
    512
    -    Amode addr addr_code <- getAmode DS mem
    
    513
    -    return (Any II64 (\dst -> addr_code `snocOL` LA II32 dst addr))
    
    472
    +getRegister' _ _ (CmmMachOp (MO_UU_Conv src tgt) [CmmLoad mem pk _])
    
    473
    +  | src < tgt
    
    474
    +  , cmmTypeFormat pk == intFormat src = loadZeroExpand mem pk tgt
    
    475
    +
    
    476
    +getRegister' _ _ (CmmMachOp (MO_XX_Conv src tgt) [CmmLoad mem pk _])
    
    477
    +  | src < tgt
    
    478
    +  , cmmTypeFormat pk == intFormat src = loadZeroExpand mem pk tgt
    
    479
    +
    
    480
    +  -- XXX: This is ugly, refactor
    
    481
    +getRegister' _ _ (CmmMachOp (MO_SS_Conv src tgt) [CmmLoad mem pk _])
    
    482
    +  -- Note: there is no Load Byte Arithmetic instruction
    
    483
    +  | cmmTypeFormat pk /= II8
    
    484
    +  , src < tgt = do
    
    485
    +      let format = cmmTypeFormat pk
    
    486
    +      -- lwa is DS-form. See Note [Power instruction format]
    
    487
    +      let form = if format >= II32 then DS else D
    
    488
    +      Amode addr addr_code <- getAmode form mem
    
    489
    +      let code dst = assert (format == intFormat src)
    
    490
    +                     $ addr_code `snocOL` LA format dst addr
    
    491
    +      return (Any (intFormat tgt) code)
    
    514 492
     
    
    515 493
     getRegister' config platform (CmmMachOp (MO_RelaxedRead w) [e]) =
    
    516 494
           getRegister' config platform (CmmLoad e (cmmBits w) NaturallyAligned)
    
    ... ... @@ -791,6 +769,12 @@ extendSExpr from to x = CmmMachOp (MO_SS_Conv from to) [x]
    791 769
     extendUExpr :: Width -> Width -> CmmExpr -> CmmExpr
    
    792 770
     extendUExpr from to x = CmmMachOp (MO_UU_Conv from to) [x]
    
    793 771
     
    
    772
    +loadZeroExpand :: CmmExpr -> CmmType -> Width -> 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
    +
    
    794 778
     -- -----------------------------------------------------------------------------
    
    795 779
     --  The 'Amode' type: Memory addressing modes passed up the tree.
    
    796 780
     
    
    ... ... @@ -2450,8 +2434,8 @@ srCode width sgn instr x y = do
    2450 2434
       let op_len = max W32 width
    
    2451 2435
           extend = if sgn then extendSExpr else extendUExpr
    
    2452 2436
       (src1, code1) <- getSomeReg (extend width op_len x)
    
    2453
    -  (src2, code2) <- getSomeReg (extendUExpr width op_len y)
    
    2454
    -  -- Note: Shift amount `y` is unsigned
    
    2437
    +  (src2, code2) <- getSomeReg y
    
    2438
    +
    
    2455 2439
       let code dst = code1 `appOL` code2 `snocOL`
    
    2456 2440
                      instr (intFormat op_len) dst src1 (RIReg src2)
    
    2457 2441
       return (Any (intFormat width) code)