> [EDIT: (edited to highlight the question in context)
Ниже приведены характеристики SSE, для которых Мне требуются НЕОН поскольку я конвертирую некоторый код SSE для работы на iOS.
_mm_set_ps
Устанавливает четыре значения с плавающей запятой одинарной точности для четырех входов.
(__m128 _mm_set_ps(float z , float y , float x , float w );)
Return Value:
r0 := w
r1 := x
r2 := y
r3 := z
_mm_loadu_ps
Загружает четыре значения одинарной точности с плавающей точкой. Адрес делает не должен быть выровнен по 16 байтов.
__m128 _mm_loadu_ps(float * p);
Return Value:
r0 := p[0]
r1 := p[1]
r2 := p[2]
r3 := p[3]
_mm_storeu_ps
Хранит четыре значения с плавающей точкой одинарной точности. Адрес делает не должен быть выровнен по 16 байтов.
void _mm_storeu_ps(float *p, __m128 a);
Return Value:
p[0] := a0
p[1] := a1
p[2] := a2
p[3] := a3
_mm_add_epi32
Добавляет 4 подписанный или же неподписанный 32-разрядные целые числа от a до 4 32-разрядные целые числа со знаком или без знака в b.
__m128i _mm_add_epi32 (__m128i a, __m128i b);
Return Value:
r0 := a0 + b0
r1 := a1 + b1
r2 := a2 + b2
r3 := a3 + b3
Примечание: по возможности избегайте выравниваемого доступа к памяти. Итак, мне нужен способ преобразовать не выровненный доступ в выровненный доступ (возможно, с использованием отступов).
Я не очень знаком с внутренностями NEON, но могу назвать вам эквивалентные инструкции NEON. Тогда вы легко найдете подходящий макрос.
_mm_set_ps
Если значения уже находятся в S регистрах, вам просто нужно заново интерпретировать их как D регистры
В противном случае вы можете заполнить регистр D командой vmov:
vmov.i32 d0, r0, r1
_mm_loadu_ps
vld1.32 q0, [r0]
_mm_storeu_ps
vst1.32 q0, [r0]
_mm_add_epi32
vadd.u32 q0, q1, q2
Других решений пока нет …