Странная компиляция встроенной сборки в LLVM GCC 4.2 - PullRequest
1 голос
/ 19 января 2012

Я пытаюсь оптимизировать следующий макрос 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 регистров?

1 Ответ

0 голосов
/ 09 октября 2012

Использование ограничения "=&w" для выходных операндов устраняет проблему.

...