ассемблерный ассемблерный код, как загрузить данные из разных исходных точек?

я пытался улучшить кое-какой код, но мне это кажется таким сложным. я разрабатываю на Android NDK. код С++, который я хочу улучшить, следует:

unsigned int test_add_C(unsigned int *x, unsigned int *y) {
unsigned int result = 0;
for (int i = 0; i < 8; i++) {
    result += x[i] * y[i];
}
return result;

}

и неоновый код:

unsigned int test_add_neon(unsigned *x, unsigned *y) {

unsigned int result;
__asm__ __volatile__(
        "vld1.32    {d2-d5}, [%[x]] \n\t"
        "vld1.32    {d6-d9}, [%[y]]!    \n\t"
        "vmul.s32   d0, d2, d6      \n\t"
        "vmla.s32   d0, d3, d7      \n\t"
        "vmla.s32   d0, d4, d8      \n\t"
        "vmla.s32   d0, d5, d9      \n\t"
        "vpadd.s32  d0, d0          \n\t"
        "vmov       %0, r4, d0      \n\t"
        :"=r"(result)
        :"r"(x)
        :"d0", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "r4"
);
return result;

}

но когда я компилирую код, он сообщает, что операнд с неопределенным именем «x» и «y». я не знаю, как загрузить данные из массива x и y. кто-нибудь может мне помочь? большое спасибо.


person joyDream    schedule 23.01.2013    source источник
comment
Было бы намного проще сделать это с помощью встроенных функций, а не встроенного ассемблера.   -  person Paul R    schedule 23.01.2013


Ответы (1)


Имена переменных внутри встроенной сборки не могут быть «увидены» компилятором и должны быть включены в список операндов ввода/вывода.

Изменение линии

:"r"(x)

to

:[x]"r"(x),[y]"r"(y)

исправит вашу проблему с неопределенным именованным операндом. Тем не менее, я сразу вижу еще несколько потенциальных проблем.

Во-первых, тип данных s32 ваших инструкций по умножению должен быть u32, поскольку вы указываете, что x и y относятся к типу unsigned int.

Во-вторых, вы увеличиваете y, но не x в строках.

"vld1.32    {d2-d5}, [%[x]]     \n\t"
"vld1.32    {d6-d9}, [%[y]]!    \n\t"

Если это не сделано специально, лучше быть последовательным.

person Aurelius    schedule 23.01.2013