LLVM GCC 4.2のインラインアセンブリの奇妙な編集
-
30-10-2019 - |
質問
次のCマクロを最適化しようとしています。
rotate(v0, v1) a0 = v0, b0 = v1, v0 = a0*c - b0*s, v1 = a0*s + b0*c
すべての変数がある場所 ダブルス 皮質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
ご覧のとおり、コンパイラは、正しい結果を得るために必要な6の代わりに4つのレジスタのみを使用します。
コンパイラに6つのレジスタが必要だと言うにはどうすればよいですか?
正しい解決策はありません
所属していません StackOverflow