LLVM GCC 4.2 中内联汇编的奇怪编译

Posted

技术标签:

【中文标题】LLVM GCC 4.2 中内联汇编的奇怪编译【英文标题】:Strange compilation of inline assembly in LLVM GCC 4.2 【发布时间】:2012-01-19 12:06:09 【问题描述】:

我正在尝试优化以下 C 宏:

rotate(v0, v1) a0 = v0, b0 = v1, v0 = a0*c - b0*s, v1 = a0*s + b0*c

对于 Cortex-A8 处理器,所有变量都是 双精度数

内联程序集如下所示:

            __asm__ __volatile__("vmul.f64 %[v0], %[a0], %[c];\n\t"
                                 "vmul.f64 %[v1], %[a0], %[s];\n\t"
                                 "vmls.f64 %[v0], %[b0], %[s];\n\t"
                                 "vmla.f64 %[v1], %[b0], %[c];\n\t"
                                 :[v0]"=w"(v0), [v1]"=w"(v1)
                                 :[s]"w"(s), [c]"w"(c),
                                  [a0]"w"(v0), [b0]"w"(v1)
                                 :);

生成的程序集如下所示:

@ InlineAsm Start
vmul.f64 d13, d13, d9;
vmul.f64 d12, d13, d8;
vmls.f64 d13, d12, d8;
vmla.f64 d12, d12, d9;
@ InlineAsm End

如您所见,编译器只使用了 4 个寄存器,而不是获得正确结果所必需的 6 个。

如何告诉编译器我需要 6 个寄存器?

【问题讨论】:

如果对输出操作数使用“=&w”约束会怎样? IIRC,它告诉编译器可以在读取所有输入之前写入这些寄存器,防止错误的寄存器分配。 @BrettHale 它有效,谢谢。我想,你应该把它写成答案。 【参考方案1】:

对输出操作数使用"=&w" 约束可以解决此问题。

【讨论】:

以上是关于LLVM GCC 4.2 中内联汇编的奇怪编译的主要内容,如果未能解决你的问题,请参考以下文章

带有 CUDA 内联汇编的 LLVM

优化系列汇编优化技术:x86架构内联汇编及demo

GCC 内联汇编中的标签

使用 gcc 编译内联汇编时出错,“shl”

ARM嵌入式开发中的GCC内联汇编__asm__

转贴GCC内联汇编基础