Clang集成汇编程序和"指令无效操作数"

时间:2015-07-22 09:17:24

标签: c assembly clang llvm inline-assembly

我们在默认配置中使用Clang。在默认配置中,使用Clang的集成汇编程序(而不是系统汇编程序,如GAS)。我无法确定确切的问题(并修复):

rdi

认为 上述错误可能与Inline Assembly and Compatibility有关。但据我所知,xmm1为64位,movd为128位,git clone https://github.com/weidai11/cryptopp.git cryptopp-asm cd cryptopp-asm export CXX=clang++ make GAS210_OR_LATER=1 GAS219_OR_LATER=1 GAS219_OR_LATER=1 指定操作数大小,因此兼容性问题不适用。

上面的代码有什么问题?

您可以在Crypto++ gcm.cpp Source File在线检查源文件。如果安装了Clang,问题应该很容易复制:

# Try to make just gcm.o
make GAS210_OR_LATER=1 GAS219_OR_LATER=1 GAS219_OR_LATER=1 gcm.o

或者:

make

奇怪的DateTimeFormat format = DateTimeFormat.getFormat("c"); String dayOfWeek = format.format(new Date()); E12CommonUtils.printOnConsole("dayOfWeek ="+dayOfWeek); 行归于LLVM Bug 24200 - With integrated assembler enabled, failed to fetch version string of assembler

1 个答案:

答案 0 :(得分:2)

r/m64, xmm未列为英特尔软件开发人员MOVD指令的有效操作数组合。手册。但是,支持以下两种形式:

MOVD r/m32, xmm
SSE2 Move doubleword from xmm register to r/m32.

MOVQ r/m64, xmm
SSE2 Move quadword from xmm register to r/m64.

这使我怀疑在为64位目标构建时MOVD指令需要MOVQ,或者rdi应该被edi替换(尽管这可能会影响依赖于rdi的前32位的代码的其他部分。)