【问题标题】:How do you Mark ASM code?如何标记 ASM 代码?
【发布时间】:2015-05-07 11:14:52
【问题描述】:

我正在尝试标记我的 ASM(由编译器生成)以在我的标记我的分析与相应的 .s 文件之间进行延迟分析。以下 MACRO 适用于 GCC

#define ASM_LABEL(label) asm ("#" label "\n\t")

尽管如此,使用 CLANG 会删除标签。

void kernel(double const * x, double * y){
    ASM_LABEL (START)
    y[0]+=x[1]+x[3]/x[4];
    y[1] = std::exp(x[0]);
    ASM_LABEL (STOP)
}

生成的 ASM (clang -O3 -S) 给出:

    movq    %rdi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    ## InlineAsm Start
    ## InlineAsm End <---- no START mark
    movq    -8(%rbp), %rsi
    movsd   8(%rsi), %xmm0
    movq    -8(%rbp), %rsi
    ..............

标签已被删除。你有什么建议吗?是否存在通用提示?

谢谢

【问题讨论】:

  • 添加volatile?我认为无论如何您都会在生成的 asm 中获得行号。另请注意,优化的代码甚至可能不会映射到单个程序集块...
  • 如果 gcc 语义被保留,asm 语句中缺少输出变量会使语句 volatile 隐含。 (参考:gcc extended asm documentation

标签: assembly clang


【解决方案1】:

默认情况下,clang 将使用其集成的 llvm 汇编器,但这可以通过命令行选项 -fno-integrated-as 禁用。

将其与-S 一起指定应该保留内联汇编中的cmets。在代码示例上运行clang -S -O3 -fno-integrated-as

#include <cmath>
#define ASM_LABEL(label) asm ("#" label "\n\t" ::: "memory");

void kernel(double const * x, double * y){
    ASM_LABEL("START")
    y[0]+=x[1]+x[3]/x[4];
    y[1] = std::exp(x[0]);
    ASM_LABEL("STOP")
}

给出程序集(省略指令和标签):

pushq   %rbx
movq    %rsi, %rbx
#APP
#START

#NO_APP
movsd   24(%rdi), %xmm0
divsd   32(%rdi), %xmm0
addsd   8(%rdi), %xmm0
addsd   (%rbx), %xmm0
movsd   %xmm0, (%rbx)
movsd   (%rdi), %xmm0
callq   exp
movsd   %xmm0, 8(%rbx)
#APP
#STOP

#NO_APP
popq    %rbx
retq

【讨论】:

  • 大人,你真聪明。
猜你喜欢
  • 1970-01-01
  • 2014-01-10
  • 2010-11-25
  • 1970-01-01
  • 2011-04-07
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多