OCaml是否具有popcnt功能?

时间:2014-11-03 22:39:46

标签: ocaml bit-manipulation instructions

可以在x86 CPU上的本机OCaml中生成popcntbsfbsrlzcnt指令吗?

2 个答案:

答案 0 :(得分:3)

我有方便的OCaml 4.01.0源码,为此它很容易检查。如果您在代码生成源中查找这些说明,则不会出现这些说明。

$ pwd
/home/jeffsco/oc41/asmcomp/i386
$ ls
arch.ml       emit_nt.mlp   reload.ml     selection.ml
emit.mlp      proc.ml       scheduling.ml
$ grep -w popcnt *
$ grep -w bsf *
$ grep -w bsr *
$ grep -w lzcnt *

如果我寻找像movl这样的东西,我会得到很多点击量:

$ grep -w movl *
emit.mlp:              `    movl    {emit_reg src}, {emit_reg dst}\n`
emit.mlp:          | _     -> ` movl    $0, {emit_reg i.res.(0)}\n`
. . .

所以,我强烈怀疑答案是否定的。也许OCaml 4.02的情况发生了变化,但我对此表示怀疑。

答案 1 :(得分:2)

简街基础库中的硬件指令有一个绑定:

Cf。 https://github.com/janestreet/base/blob/master/src/popcount.ml

在界面中:

val int_popcount       : int       -> int
val int32_popcount     : int32     -> int
val int64_popcount     : int64     -> int
val nativeint_popcount : nativeint -> int`

int_popcount是您要寻找的人。

Cf。此C文件的详细信息(您可以在其中看到它们 使用__builtin_popcount):

https://github.com/janestreet/base/blob/master/src/int_math_stubs.c

zarith库中还有一个popcount,它使用了 GMP实施。

Z.popcount

PS:感谢Francois Bobot向我讲述了一个绝顶的人