Unicode.Internal.Division
Fast division by known constants.
Division by a constant can be replaced by a double-word multiplication. Roughly speaking, instead of dividing by x, multiply by 2^64/x, obtaining 128-bit-long product, and take upper 64 bits. The peculiar details can be found in Hacker's Delight, Ch. 10.
Even GHC 8.10 does not provide a primitive for a signed double-word
multiplication, but since our applications does not involve negative
integers, we convert Int
to Word
and use timesWord#
.
Textbook unsigned division by 21 or 28 becomes involved, when an argument
is allowed to take the full range of Word
up to 2^64. Luckily, in our
case the argument was casted from Int
, so we can guarantee that it is
below 2^63.