Одной из первых библиотек которую можно порекомендовать для начала изучения NEON команд называется math-neon. Проект библиотеки размещен по ссылке https://code.google.com/archive/p/math-neon/
Этот проект реализует функции стандартной библиотеки cmath и некоторые оптимизированные матричные функции.
В файле math_neon.h перечислены все доступные в библиотеке функции.
В качестве примера рассмотрим функцию math_fabsf (файл math_fabsf.c) - это функция аналог fabsf(x) стандартной библиотеки С. Функция fabs вычисляет абсолютное значение (модуль) и возвращает его |х|.
Ниже приведены функции из файла math_fabsf.c:
#include "math_neon.h"
float fabsf_c(float x) // реализация функции на С
{
union {
int i;
float f;
} xx;
xx.f = x;
xx.i = xx.i & 0x7FFFFFFF;
return xx.f;
}
//Следующие две функции используют вставки на assembler
float fabsf_neon_hfp(float x) // функция использует команду NEON / VFP
{
asm volatile (
"fabss s0, s0 \n\t" //s0 = fabs(s0)
);
}
float fabsf_neon_sfp(float x) // функция использует команду ARM
{
asm volatile (
"bic r0, r0, #0x80000000 \n\t" //r0 = r0 & ~(1 << 31)
);
}
Надо отметить что, в библиотеке используются как NEON так и VFP команды. Библиотека math-neon проста для понимания и легко может быть модифицирована для ваших экспериментов. В функциях написанных на assembler к каждой команде даются подробные комментарии.
Если Вас заинтересовала эта тема оставьте свой комментарий, ставьте пальчик вверх.
В следующей статье будет приведён обзор ещё одной freeware библиотеки, использующей NEON команды.