Я новичок в ассемблере и НЕОН программировании.
Моя задача - преобразовать часть алгоритма из C в ARM Assembler, используя инструкции NEON.
Алгоритм принимает массив int32, загружает различные значения из этого массива, выполняет сдвиг битов и Xor и записывает результат в другой массив.
Позже я буду использовать массив с 64-битными значениями, но сейчас я просто пытаюсь переписать код.
C Pseudo code:
out_array[index] = shiftSome( in_array[index] ) ^ shiftSome( in_array[index] );
Итак, вот мои вопросы относительно NEON Инструкции:
1.) Если я загружаю регистр как этот:
vld1.32 d0, [r1]
будет ли он загружать только 32 бита из памяти или 2x32 бита для заполнения 64-битного неонового D-регистра?
2.) Как я могу получить доступ к 2/4/8 (i32, i16, i8) частям D-регистра?
3.) Я пытаюсь загрузить различные значения из массива со смещением, но это не так
похоже на работу ... что я делаю не так ... вот мой код:
(это целочисленный массив, поэтому я пытаюсь загрузить, например, 3-элемент, который должен иметь смещение 64 бит = 8 байт)
asm volatile(
"vld1.32 d0, [%0], #8 \n"
"vst1.32 d0, [%1]" : : "r" (a), "r" (out): "d0", "r5");
где «a» - массив, а «out» - указатель на целое число (для отладки).
4.) После загрузки значения из массива мне нужно сместить его вправо, но, похоже, оно не работает:
vshr.u32 d0, d0, #24 // C code: x >> 24;
5.) Можно ли загрузить только 1 байт в неоновый регистр, чтобы мне не приходилось сдвигать / маскировать что-то, чтобы получить только один байт, который мне нужен?
6.) Мне нужно использовать встроенный ассемблер, но я не уверен, для чего нужна последняя строка:
input list : output list : what is this for?
7.) Знаете ли вы какие-нибудь хорошие NEON ссылки с примерами кода?
Программа должна работать на процессоре Samsung Galaxy S2, процессор Cortex-A9, если это имеет значение. Спасибо за помощь.
---------------- редактировать -------------------
Вот что я узнал:
- Он всегда будет загружать полный регистр (64 бит)
- Вы можете использовать инструкцию "vmov" для переноса части неонового регистра в регистр охраны.
- Смещение должно быть в регистре рук и будет добавлено к
базовый адрес после доступа к памяти.
- Это «забитый регистр». Каждый Регистр, который используется и
ни в списке ввода, ни в выводе, здесь не должно быть написано.