[GHC] #9340: Implement new `clz` inline primop

GHC ghc-devs at haskell.org
Mon Jul 21 06:25:04 UTC 2014


#9340: Implement new `clz` inline primop
-------------------------------------+-------------------------------------
              Reporter:  hvr         |             Owner:
                  Type:  feature     |            Status:  new
  request                            |         Milestone:  7.10.1
              Priority:  normal      |           Version:  7.8.2
             Component:  Compiler    |          Keywords:  primop clz
  (CodeGen)                          |  Operating System:  Unknown/Multiple
            Resolution:              |   Type of failure:  None/Unknown
Differential Revisions:              |         Test Case:
          Architecture:              |          Blocking:
  Unknown/Multiple                   |
            Difficulty:  Unknown     |
            Blocked By:              |
       Related Tickets:              |
-------------------------------------+-------------------------------------

Old description:

> 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#}}}).

New description:

 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#}}}).

--

Comment (by hvr):

 (remove hidden Unicode characters in code blocks)

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9340#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list