[英]Clang integrated assembler and “unknown token in expression” during negate
[英]Clang integrated assembler and “invalid operand for instruction”
我们在默认配置中使用Clang。 在默认配置中,使用的是Clang的集成汇编程序(而不是系统汇编程序,如GAS)。 我在确定以下方面的确切问题时遇到了麻烦:
$ make
clang++ -DNDEBUG -g2 -O3 -Wall -fPIC -march=native -pipe -c gcm.cpp
...
gcm.cpp:676:3: error: invalid operand for instruction
AS2( movd WORD_REG(di), xmm...
^
./cpu.h:221:20: note: expanded from macro 'AS2'
#define AS2(x, y) GNU_AS2(x, y)
^
./cpu.h:216:27: note: expanded from macro 'GNU_AS2'
#define GNU_AS2(x, y) "\n\t" #x ", " #y ";"
^
<inline asm>:110:12: note: instantiated into assembly here
movd rdi, xmm0;
^~~~~
gcm.cpp:685:3: error: invalid operand for instruction
AS2( movd WORD_REG(di), xmm...
^
./cpu.h:221:20: note: expanded from macro 'AS2'
#define AS2(x, y) GNU_AS2(x, y)
^
./cpu.h:216:27: note: expanded from macro 'GNU_AS2'
#define GNU_AS2(x, y) "\n\t" #x ", " #y ";"
^
<inline asm>:117:12: note: instantiated into assembly here
movd rdi, xmm1;
^~~~~
我认为上述错误可能与内联汇编和兼容性有关 。 但是据我所知, rdi
是64位, xmm1
是128位,并且movd
指定操作数的大小,因此不应该考虑兼容性问题。
上面的代码有什么问题?
您可以在Crypto ++ gcm.cpp Source File上在线检查源文件 。 如果您已安装Clang,则该问题应易于复制:
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
要么:
# Try to make just gcm.o
make GAS210_OR_LATER=1 GAS219_OR_LATER=1 GAS219_OR_LATER=1 gcm.o
奇怪的看着make
行是由于LLVM错误24200 -启用集成组装,无法取得汇编程序的版本字符串 。
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位的代码的其他部分)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.