GCC Каково правильное ограничение встроенной сборки для работы с инструкциями ARM VFP?

Я хочу загрузить значение регистра двойной точности (d8) в переменную C на платформе ARM с помощью цепочки инструментов (gcc-4.6), которая поставляется с Google NDKv8b. Моя ARM-машина - Samsung Galaxy S2 (в ней есть VFPv3 и NEON). Документация GCC гласит, что для использования регистров двойной точности VFP на встроенной сборке необходимо использовать ограничение "w". Итак, я попробовал что-то вроде этого (хорошо, не смотрите так сильно на логику всей программы):

#include <stdio.h>

int main()
{
    double dVar = 1.2345678;
    double dTmp;
    int i;
    for(i = 0; i < 100; i++ )
    {
        asm volatile(
            "vmov.f64 %[dTmp], d8\n"
            : [dTmp] "=w" (dTmp)
            :
            :
        );
        dVar *= 10.0;
        printf("d8 = %f\n", dTmp );
    }

    return 0;
}

Ну, это даже не компилируется:

/tmp/cc9wQA1z.s: Assembler messages:
/tmp/cc9wQA1z.s:62: Internal error, aborting at /usr/local/google/home/andrewhsieh/ndk-andrewhsieh/src/build/../binutils/binutils-2.21/gas/config/tc-arm.c line 14709 in do_neon_mov

Как мне этого добиться?

Спасибо!

1 ответ

Решение

Я изменил часть кода, как показано ниже,

"vmov.f64 %P[dTmp2], d8\n"

после этого я могу скомпилировать. Я не проверял полученный код.

За P Пожалуйста, ознакомьтесь с секретами встроенного ассемблера Hardwarebug / ARM и этой веткой электронной почты.

Другие вопросы по тегам