@@ -236,12 +236,22 @@ partialCopyM dest didx src sidx count =
236236 assert (sidx + count <= length src) .
237237 assert (didx + count <= length dest) $
238238#endif
239− copy_loop sidx didx 0
239+ if srem == 0 && drem == 0
240+ then fast_loop 0
241+ else slow_loop 0
240242 where
241− copy_loop !i !j !c
242− | c >= count = return ()
243− | otherwise = do unsafeRead src i >>= unsafeWrite dest j
244− copy_loop (i+1) (j+1) (c+1)
243+ (swidx,srem) = sidx `divMod` wordFactor
244+ (dwidx,drem) = didx `divMod` wordFactor
245+ nwds = count `div` wordFactor
246+ fast_loop !i
247+ | i >= nwds = slow_loop (i * wordFactor)
248+ | otherwise = do w <- unsafeReadWord src (swidx+i)
249+ unsafeWriteWord dest (dwidx+i) w
250+ fast_loop (i+1)
251+ slow_loop !i
252+ | i >= count= return ()
253+ | otherwise = do unsafeRead src (sidx+i) >>= unsafeWrite dest (didx+i)
254+ slow_loop (i+1)
245255
246256-- | Copy some elements of an immutable array.
247257partialCopyI :: MArray s -- ^ Destination