[GHC] #9340: Implement new `clz` inline primop
GHC
ghc-devs at haskell.org
Mon Jul 21 06:22:05 UTC 2014
#9340: Implement new `clz` inline primop
-------------------------------------+-------------------------------------
Reporter: hvr | Owner:
Type: feature request | Status: new
Priority: normal | Milestone: 7.10.1
Component: Compiler | Version: 7.8.2
(CodeGen) | Differential Revisions:
Keywords: primop clz | Architecture:
Operating System: Unknown/Multiple | Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
-------------------------------------+-------------------------------------
From a draft for #9281, I had to use a C FFI and using a gcc/clang
`__builtin` to get access to the
[http://en.wikipedia.org/wiki/Find_first_set CLZ instruction]:
{{{#!hs
-- | Compute base-2 log of 'Word#'
--
-- This is internally implemented as count-leading-zeros machine
instruction.
foreign import ccall unsafe "integer_gmp_word_log2"
wordLog2# :: Word# -> Int#
}}}
{{{#!c
HsWord
integer_gmp_word_log2(HsWord x)
{
#if (SIZEOF_HSWORD) == (SIZEOF_INT)
return x ? (WORD_SIZE_IN_BITS-1) - __builtin_clz(x) : -1;
#elif (SIZEOF_HSWORD) == (SIZEOF_LONG)
return x ? (WORD_SIZE_IN_BITS-1) - __builtin_clzl(x) : -1;
#elif (SIZEOF_HSWORD) == (SIZEOF_LONG_LONG)
return x ? (WORD_SIZE_IN_BITS-1) - __builtin_clzll(x) : -1;
#else
# error unsupported SIZEOF_HSWORD
#endif
}
}}}
Since a `clz`-like operation should be available on most cpus GHC should
expose that as a primop ({{{clz# :: Word# -> Int#}}}).
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9340>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list