# intel-neon2sse

Библиотека-транслятор, которая позволяет использовать код, написанный для ARM NEON SIMD-инструкций, на архитектурах x86/x86-64 с поддержкой SSE (Streaming SIMD Extensions). Библиотека предоставляет заголовочные файлы, которые преобразуют вызовы функций NEON в эквивалентные SSE-инструкции, что упрощает портирование высокопроизводительного кода между ARM и x86 платформами без необходимости полного переписывания.

## Особенности

- преобразует ARM NEON SIMD-инструкции в SSE (SSE2/SSE3/SSE4.1) аналоги на x86;
- позволяет запускать код, написанный для ARM, на x86 без изменений;
- поддерживает большинство распространённых NEON-функций и типов данных;
- требует только заголовочные файлы (header-only), не нуждается в отдельной компиляции;
- совместима с компиляторами GCC, Clang, MSVC;
- упрощает кросс-платформенную разработку для ARM и x86.

## Основные компоненты

NEON2SSE состоит из заголовочных файлов, которые предоставляют макросы и функции, эмулирующие поведение ARM NEON с помощью SSE инструкций (подробнее с документацией можно ознакомиться [здесь](https://github.com/intel/ARM_NEON_2_x86_SSE)).

### Макросы преобразования типов данных

Библиотека определяет набор макросов и типов, которые соответствуют NEON-векторам, но реализованы через SSE-регистры. Это позволяет использовать тот же API, что и в ARM NEON, но на x86 архитектуре.

Основные типы и макросы:

- `int8x16_t`, `int16x8_t`, `int32x4_t`, `int64x2_t` — целочисленные векторы;
- `uint8x16_t`, `uint16x8_t`, `uint32x4_t`, `uint64x2_t` — беззнаковые целочисленные векторы;
- `float32x4_t`, `float64x2_t` — векторы с плавающей точкой;
- `vdupq_n_s8()`, `vdupq_n_u16()`, `vdupq_n_f32()` — инициализация векторов повторяющимся значением;
- `vld1q_s32()`, `vst1q_s32()` — загрузка и сохранение векторов из/в памяти.

### Поддержка арифметических операций

Библиотека реализует основные арифметические операции, доступные в NEON, такие как сложение, вычитание, умножение и деление, с использованием соответствующих SSE-инструкций.

Основные арифметические функции:

- `vaddq_s32()`, `vsubq_f32()`, `vmulq_u16()` — сложение, вычитание, умножение векторов;
- `vaddvq_s32()` — горизонтальное суммирование элементов вектора;
- `vmlaq_f32()` — умножение и сложение (fused multiply-add);
- `vabdq_s32()` — абсолютная разность;
- `vmaxq_s32()`, `vminq_f32()` — максимум и минимум элементов.

### Операции сравнения и логические операции

NEON2SSE преобразует операции сравнения и логические операции NEON в эквивалентные SSE-инструкции, сохраняя семантику работы с векторами.

Функции сравнения и логики:

- `vceqq_s32()`, `vcgtq_f32()`, `vcleq_u16()` — операции сравнения (равно, больше, меньше или равно);
- `vandq_s32()`, `vorrq_u16()`, `veorq_f32()` — побитовые логические операции;
- `vmvnq_s32()` — побитовое отрицание (NOT);
- `vbslq_s32()` — выбор битов на основе маски (bit select).

### Операции сдвига и реорганизации данных

Библиотека поддерживает операции сдвига элементов вектора, а также функции реорганизации данных, такие как перестановки и интерливинг.

Функции сдвига и реорганизации:

- `vshlq_s32()`, `vshrq_n_u16()` — арифметические и логические сдвиги;
- `vrev64q_s32()` — обратный порядок элементов в 64-битных блоках;
- `vtrn1q_s32()`, `vzip1q_f32()` — транспонирование и объединение векторов;
- `vextq_s32()` — извлечение части вектора;
- `vtbl1_s8()` — табличная замена байтов.

### Ограничения и особенности преобразования

Хотя NEON2SSE покрывает большинство распространённых NEON-функций, существуют некоторые ограничения из-за различий между архитектурами NEON и SSE. Важно учитывать эти особенности при портировании кода.

Ключевые ограничения:

- Не все NEON-функции имеют прямые аналоги в SSE, некоторые операции могут быть эмулированы с большими накладными расходами;
- Различия в обработке переполнений и округления могут влиять на результаты;
- Производительность может отличаться от нативного NEON из-за особенностей реализации на SSE;
- Требуется поддержка SSE2 как минимум, для некоторых функций — SSE3, SSE4.1.
