可以在x86 CPU上的本机OCaml中生成popcnt
,bsf
,bsr
和lzcnt
指令吗?
答案 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向我讲述了一个绝顶的人