[Haskell-cafe] quotRem and divMod

Artyom Kazak artyom.kazak at gmail.com
Tue Jan 29 01:27:41 CET 2013


Hi!

I’ve always thought that `quotRem` is faster than `quot` + `rem`, since  
both `quot` and `rem` are just "wrappers" that compute both the quotient  
and the remainder and then just throw one out. However, today I looked  
into the implementation of `quotRem` for `Int32` and found out that it’s  
not true:

     quotRem x@(I32# x#) y@(I32# y#)
         | y == 0                     = divZeroError
         | x == minBound && y == (-1) = overflowError
         | otherwise                  = (I32# (narrow32Int# (x# `quotInt#`  
y#)),
                                         I32# (narrow32Int# (x# `remInt#`  
y#)))

Why? The `DIV` instruction computes both, doesn’t it? And yet it’s being  
performed twice here. Couldn’t one of the experts clarify this bit?



More information about the Haskell-Cafe mailing list