[GHC] #5339: Data.Bits instances should use default shift instead of shiftL/shiftR

GHC cvs-ghc at haskell.org
Fri Jul 22 18:21:49 CEST 2011


#5339: Data.Bits instances should use default shift instead of shiftL/shiftR
---------------------------------+------------------------------------------
    Reporter:  liyang            |       Owner:                         
        Type:  feature request   |      Status:  new                    
    Priority:  normal            |   Component:  libraries/base         
     Version:  7.1               |    Keywords:                         
    Testcase:                    |   Blockedby:                         
          Os:  Unknown/Multiple  |    Blocking:                         
Architecture:  Unknown/Multiple  |     Failure:  Runtime performance bug
---------------------------------+------------------------------------------
 The documentation notes that the second arg of shiftL/shiftR must be
 positive, yet many definitions of "instance Bits …" rely on the class
 defaults implementation of shift.

 This patch defines shiftL and shiftR explicitly in terms of the
 corresponding prim ops, while falling back to the class default for shift.
 This produces the same output for shift, but much more readable core for
 shiftL and shiftR.

 For "shiftR 1 i", contrast
 {{{
 case i of _ { I# i# -> case >=# i# 64 of _ {
     False -> uncheckedIShiftRA# 1 i#
     True -> 0 } }
 }}}
 with
 {{{
 case i of _ { I# i# -> let { n# = negateInt# i# } in case >=# n# 0 of _ {
     False -> let { nn# = negateInt# n# } in case >=# nn# 64 of _ {
         False -> uncheckedIShiftRA# 1 nn#
         True -> 0 };
     True -> case >=# n# 64 of _ {
         False -> uncheckedIShiftL# 1 n#
         True -> 0 } } }
 }}}

 Cheers,

 /Liyang

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5339>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the Glasgow-haskell-bugs mailing list