HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Modulequote-quot-0.2.1.0Haskell2010

Numeric.QuoteQuot

Generate routines for integer division, employing arithmetic and bitwise operations only, which are 2.5x-3.5x faster than quot. Divisors must be known in compile-time and be positive.

  • 1 type
  • 1 class
  • 7 values

Quasiquoters

3 declarations
valuequoteQuot :: (MulHi a, Lift a, Quote m) => a -> Code m (a -> a)
#

Quote integer division (quot) by a compile-time known divisor, which generates source code, employing arithmetic and bitwise operations only. This is usually 2.5x-3.5x faster than using normal quot.

{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -ddump-splices -ddump-simpl -dsuppress-all #-}
module Example where
import Numeric.QuoteQuot

-- Equivalent to (`quot` 10).
quot10 :: Word -> Word
quot10 = $$(quoteQuot 10)
Example1 expression
quot10 12312

Here -ddump-splices demonstrates the chosen implementation for division by 10:

Splicing expression quoteQuot 10 ======>
((`shiftR` 3) . ((\ (W# w_a9N4) ->
  let !(# hi_a9N5, _ #) = (timesWord2# w_a9N4) 14757395258967641293##
  in W# hi_a9N5) . id))

And -ddump-simpl demonstrates generated Core:

quot10 = \ x_a5t2 ->
  case x_a5t2 of { W# w_acHY ->
  case timesWord2# w_acHY 14757395258967641293## of
  { (# hi_acIg, ds_dcIs #) ->
  W# (uncheckedShiftRL# hi_acIg 3#)
  }
  }

Benchmarks show that this implementation is 3.5x faster than (`quot` 10).

AST

6 declarations
valueastQuot :: (Integral a, FiniteBits a) => a -> AST a
#

astQuot d constructs an AST representing a function, equivalent to quot a for positive a, but avoiding division instructions.

Example1 expression
astQuot (10 :: Data.Word.Word8)Shr (MulHi Arg 205) 3

And indeed to divide Word8 by 10 one can multiply it by 205, take the high byte and shift it right by 3. Somewhat counterintuitively, this sequence of operations is faster than a single division on most modern achitectures.

astQuot function is polymorphic and supports both signed and unsigned operands of arbitrary finite bitness. Implementation is based on Ch. 10 of Hacker's Delight by Henry S. Warren, 2012.

datadata AST a
#

An abstract syntax tree to represent a function of one argument.

Constructors

Instances1Show
  • Show a => Show (AST a)Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
valueinterpretAST :: (Integral a, FiniteBits a) => AST a -> a -> a
#

Reference (but slow) interpreter of AST. It is not meant to be used in production and is provided primarily for testing purposes.

Example1 expression
interpretAST (astQuot (10 :: Data.Word.Word8)) 12312
classclass (Integral a, FiniteBits a) => MulHi a where
#

Types allowing to multiply wide and return the high word of result.

Methods

Instances10MulHi, …
  • MulHi Int16Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi Int32Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi Int64Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi Int8Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi Word16Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi Word32Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi Word64Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi Word8Defined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi IntDefined in quote-quot-0.2.1.0 · Numeric.QuoteQuot
  • MulHi WordDefined in quote-quot-0.2.1.0 · Numeric.QuoteQuot