如何从Common Lisp访问新的x86位操作指令



我想使用最新英特尔和AMD芯片中提供的新位操作指令,特别是"并行位提取"PEXT指令(请参阅此处和此处(。如何从Common Lisp中访问这些指令?(特别是SBCL(。

理想情况下,我想通过一个库来访问这些指令,该库检测CPU是否提供了它们,如果没有,它会在软件中模拟它们。其他语言的编译器提供这样的函数(例如,GCC提供函数_pext_u32;请参阅此处(。

我认为要真正添加对它的支持,需要修改编译器本身。这可能涉及添加一个新的VOP(请参阅sbcl源代码中的VOP.lisp(,定义一个新函数,该函数可编译到它(可能在sb-ext包中(并将其连接起来。我实际上无法告诉你如何做到这一点,我对此的理解只是肤浅的。

另一种可能更具可移植性的方法是创建一个C库,其中包含在汇编中使用新原语的函数,然后将其封装在CFFI绑定中。

有一个名为*features*的变量(至少在CMU Common Lisp中,Steel Bank是其分支(,它列出了Lisp运行系统的一些信息

(:GERDS-PCL :PCL-STRUCTURES :PORTABLE-COMMONLOOPS :PCL :CMU21 :CMU21B :PYTHON
:MODULAR-ARITH :MP :X86 :RELOCATABLE-STACKS :SSE2 :LINKAGE-TABLE
:RELATIVE-PACKAGE-NAMES :EXECUTABLE :MACH-O :DARWIN :BSD :UNIX :RANDOM-MT19937
:GENCGC :CMUCL :UNICODE :COMPLEX-FP-VOPS :HASH-NEW :ALIEN-CALLBACK
:DOUBLE-DOUBLE :HEAP-OVERFLOW-CHECK :STACK-CHECKING :COMMON-LISP :ANSI-CL
:IEEE-FLOATING-POINT :CMU)

这可能会告诉你你需要知道什么。如果没有,试着用(apropos 'feature)查找一些东西,它应该会显示一个带有"feature"的符号列表。

最新更新