繁体   English   中英

lang集成汇编器和“无效的指令操作数”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM