Clang 集成汇编程序和 “unknown token in expression” 在否定期间

标签 c assembly clang llvm inline-assembly

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

make
...
clang++ -DNDEBUG -g2 -O3 -Wall -fPIC -arch i386 -arch x86_64 -pipe -Wno-tautological-compare -c integer.cpp
integer.cpp:542:2: error: unknown token in expression
        AS1(    neg             %1)
        ^
./cpu.h:220:17: note: expanded from macro 'AS1'
        #define AS1(x) GNU_AS1(x)
                       ^
./cpu.h:215:24: note: expanded from macro 'GNU_AS1'
        #define GNU_AS1(x) "\n\t" #x ";"
                              ^
<inline asm>:3:6: note: instantiated into assembly here
        neg %rcx;
            ^

有问题的代码如下。

认为上面的错误可能与Inline Assembly and Compatibility有关.一个简单的 negq %1 没有按预期工作:

integer.cpp:543:2: error: unknown token in expression
        AS1(    negq    %1)
        ^
./cpu.h:220:17: note: expanded from macro 'AS1'
        #define AS1(x) GNU_AS1(x)
                       ^
./cpu.h:215:24: note: expanded from macro 'GNU_AS1'
        #define GNU_AS1(x) "\n\t" #x ";"
                              ^
<inline asm>:3:7: note: instantiated into assembly here
        negq %rcx;
             ^

自从它的 Intel 汇编以来,我还尝试了 negq [%1]neg DWORD PTR [%1]negq DWORD PTR [%1] 没有喜悦。

“unknown token in expression”似乎是一条虚假消息,因为它提示的汇编指令似乎没有问题。所以我怀疑 Clang 集成汇编程序还有其他令人反感的东西。

代码有什么问题?


导致编译错误的代码:

int Baseline_Add(size_t N, word *C, const word *A, const word *B)
{
    word result;
    __asm__ __volatile__
    (
      ".intel_syntax;" "\n"
      AS1(  neg     %1)
      ASJ(  jz,     1, f)
      AS2(  mov     %0,[%3+8*%1])
      AS2(  add     %0,[%4+8*%1])
      AS2(  mov     [%2+8*%1],%0)
      ASL(0)
      AS2(  mov     %0,[%3+8*%1+8])
      AS2(  adc     %0,[%4+8*%1+8])
      AS2(  mov     [%2+8*%1+8],%0)
      AS2(  lea     %1,[%1+2])
      ASJ(  jrcxz,  1, f)
      AS2(  mov     %0,[%3+8*%1])
      AS2(  adc     %0,[%4+8*%1])
      AS2(  mov     [%2+8*%1],%0)
      ASJ(  jmp,    0, b)
      ASL(1)
      AS2(  mov     %0, 0)
      AS2(  adc     %0, %0)

      ".att_syntax;" "\n"
      : "=&r" (result), "+c" (N)
      : "r" (C+N), "r" (A+N), "r" (B+N)
      : "memory", "cc"
    );
    return (int)result;
}

最佳答案

这似乎是集成汇编程序中的一个问题。在 CFE-dev 邮件列表上提出问题后,一位 LLVM 开发人员打开了一个 PR。另见 LLVM Bug 24232 - [X86] Inline assembly operands don't work with .intel_syntax .

认为这意味着如果我们有时间和精力用 1000 行重写 block ,Michael 的评论可能是一个解决方案。

关于Clang 集成汇编程序和 “unknown token in expression” 在否定期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31577076/

相关文章:

c - libev 网络服务器读取文件

c - C中的选择排序程序

程序集 8086 - 异或操作

assembly - GNU 汇编器 : Accessing a corrupted shared library error

c - 我未编译一些汇编代码。它有什么作用?

objective-c - "-Weverything"在每个 NSAssert 处发出 "Varargs argument missing, but tolerated as an extension"警告

c++ - -mmacosx-version-min 影响位域的打包行为?

c - 不同结构的数组

clang 表达式中未使用的值

c++ - 在 Windows 7 的 CodeBlocks 16.01 中构建 glfw3 程序失败