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

Commits:

1 changed file:

Changes:

  • compiler/GHC/CmmToAsm/PPC/CodeGen.hs
    ... ... @@ -469,28 +469,35 @@ 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 src tgt) [CmmLoad mem pk _]) = do
    
    473
    -  let format = cmmTypeFormat pk
    
    474
    -  Amode addr addr_code <- getAmode D mem
    
    475
    -  return (Any (intFormat tgt) (\dst -> addr_code `snocOL` LD format dst addr))
    
    476
    -getRegister' _ _ (CmmMachOp (MO_XX_Conv src tgt) [CmmLoad mem pk _]) = do
    
    477
    -  let format = cmmTypeFormat pk
    
    478
    -  Amode addr addr_code <- getAmode D mem
    
    479
    -  return (Any (intFormat tgt) (\dst -> addr_code `snocOL` LD format dst addr))
    
    480
    --- Note: there is no Load Byte Arithmetic instruction, so no signed case here
    
    481
    -
    
    482
    -getRegister' _ _ (CmmMachOp (MO_SS_Conv W16 W32) [CmmLoad mem _ _]) = do
    
    483
    -    Amode addr addr_code <- getAmode D mem
    
    484
    -    return (Any II32 (\dst -> addr_code `snocOL` LA II16 dst addr))
    
    485
    -
    
    486
    -getRegister' _ _ (CmmMachOp (MO_SS_Conv W16 W64) [CmmLoad mem _ _]) = do
    
    487
    -    Amode addr addr_code <- getAmode D mem
    
    488
    -    return (Any II64 (\dst -> addr_code `snocOL` LA II16 dst addr))
    
    489
    -
    
    490
    -getRegister' _ _ (CmmMachOp (MO_SS_Conv W32 W64) [CmmLoad mem _ _]) = do
    
    491
    -    -- lwa is DS-form. See Note [Power instruction format]
    
    492
    -    Amode addr addr_code <- getAmode DS mem
    
    493
    -    return (Any II64 (\dst -> addr_code `snocOL` LA II32 dst addr))
    
    472
    +-- XXX: refactor into separate function
    
    473
    +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)
    
    480
    +
    
    481
    +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)
    
    488
    +
    
    489
    +  -- XXX: This is ugly, refactor
    
    490
    +getRegister' _ _ (CmmMachOp (MO_SS_Conv src tgt) [CmmLoad mem pk _])
    
    491
    +  -- Note: there is no Load Byte Arithmetic instruction
    
    492
    +  | cmmTypeFormat pk /= II8
    
    493
    +  , src < tgt = do
    
    494
    +      let format = cmmTypeFormat pk
    
    495
    +      -- lwa is DS-form. See Note [Power instruction format]
    
    496
    +      let form = if format == II32 then DS else D
    
    497
    +      Amode addr addr_code <- getAmode form mem
    
    498
    +      let code dst = assert (format == intFormat src)
    
    499
    +                     $ addr_code `snocOL` LA format dst addr
    
    500
    +      return (Any (intFormat tgt) code)
    
    494 501
     
    
    495 502
     getRegister' config platform (CmmMachOp (MO_RelaxedRead w) [e]) =
    
    496 503
           getRegister' config platform (CmmLoad e (cmmBits w) NaturallyAligned)