
On 1/27/07, John Meacham
so I have this simple bit of code, which should be fast but seems to be being compiled to something very slow.
import Data.Word import Data.Bits
fhb :: Word -> Word fhb w = b1 .|. b2 where b2 = if 0xFFFF0000 .&. w /= 0 then 0x2 else 0 b1 = if 0xFF00FF00 .&. w /= 0 then 0x1 else 0
what it compiles to is something involving Integers, lots of coercions and other nasty stuff when it should consist of a couple of primitive operations.
Output from an AMD64 box: $wfhb = \ (ww_sIw :: GHC.Prim.Word#) -> case GHC.Prim.eqWord# (GHC.Prim.and# __word 4278255360 ww_sIw) __word 0 of wild2_aHI { GHC.Base.False -> case GHC.Prim.eqWord# (GHC.Prim.and# __word 4294901760 ww_sIw) __word 0 of wild21_XHW { GHC.Base.False -> __word 3; GHC.Base.True -> __word 1 }; GHC.Base.True -> case GHC.Prim.eqWord# (GHC.Prim.and# __word 4294901760 ww_sIw) __word 0 of wild21_XHW { GHC.Base.False -> __word 2; GHC.Base.True -> __word 0 } } -- Cheers, Lemmih