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 中内联汇编的奇怪编译的主要内容,如果未能解决你的问题,请参考以下文章