LLVM GCC 4.2中的内联程序集的奇怪编译



我正在尝试优化以下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];nt"
                                 "vmul.f64 %[v1], %[a0], %[s];nt"
                                 "vmls.f64 %[v0], %[b0], %[s];nt"
                                 "vmla.f64 %[v1], %[b0], %[c];nt"
                                 :[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"约束可修复此问题。

最新更新