7.13.4 Встроенные функции SIMD для ARC
Встроенные функции SIMD, предоставляемые компилятором, можно использовать для генерации векторных инструкций. В этом разделе описаны доступные встроенные функции и их использование в программах. С параметром -msimd компилятор предоставляет 128-битные векторные типы, которые можно указать с помощью атрибута vector_size. Для использования следующих предопределённых типов можно подключить заголовочный файл arc-simd.h:
typedef int __v4si __attribute__((vector_size(16))); typedef short __v8hi __attribute__((vector_size(16)));
Эти типы можно использовать для определения 128-битных переменных. Встроенные функции, перечисленные в следующем разделе, можно применять к этим переменным для генерации векторных операций.
Для всех встроенных функций __builtin_arc_someinsn заголовочный файл arc-simd.h также предоставляет эквивалентные макросы с именами _someinsn, которые упрощают программирование и повышают читаемость кода. Также предоставляются следующие макросы для управления DMA:
#define _setup_dma_in_channel_reg _vdiwr #define _setup_dma_out_channel_reg _vdowr
Ниже приведён полный список всех встроенных функций SIMD для ARC, сгруппированных по сигнатурам вызова.
Следующие функции принимают два аргумента типа __v8hi и возвращают результат типа __v8hi:
__v8hi __builtin_arc_vaddaw (__v8hi, __v8hi); __v8hi __builtin_arc_vaddw (__v8hi, __v8hi); __v8hi __builtin_arc_vand (__v8hi, __v8hi); __v8hi __builtin_arc_vandaw (__v8hi, __v8hi); __v8hi __builtin_arc_vavb (__v8hi, __v8hi); __v8hi __builtin_arc_vavrb (__v8hi, __v8hi); __v8hi __builtin_arc_vbic (__v8hi, __v8hi); __v8hi __builtin_arc_vbicaw (__v8hi, __v8hi); __v8hi __builtin_arc_vdifaw (__v8hi, __v8hi); __v8hi __builtin_arc_vdifw (__v8hi, __v8hi); __v8hi __builtin_arc_veqw (__v8hi, __v8hi); __v8hi __builtin_arc_vh264f (__v8hi, __v8hi); __v8hi __builtin_arc_vh264ft (__v8hi, __v8hi); __v8hi __builtin_arc_vh264fw (__v8hi, __v8hi); __v8hi __builtin_arc_vlew (__v8hi, __v8hi); __v8hi __builtin_arc_vltw (__v8hi, __v8hi); __v8hi __builtin_arc_vmaxaw (__v8hi, __v8hi); __v8hi __builtin_arc_vmaxw (__v8hi, __v8hi); __v8hi __builtin_arc_vminaw (__v8hi, __v8hi); __v8hi __builtin_arc_vminw (__v8hi, __v8hi); __v8hi __builtin_arc_vmr1aw (__v8hi, __v8hi); __v8hi __builtin_arc_vmr1w (__v8hi, __v8hi); __v8hi __builtin_arc_vmr2aw (__v8hi, __v8hi); __v8hi __builtin_arc_vmr2w (__v8hi, __v8hi); __v8hi __builtin_arc_vmr3aw (__v8hi, __v8hi); __v8hi __builtin_arc_vmr3w (__v8hi, __v8hi); __v8hi __builtin_arc_vmr4aw (__v8hi, __v8hi); __v8hi __builtin_arc_vmr4w (__v8hi, __v8hi); __v8hi __builtin_arc_vmr5aw (__v8hi, __v8hi); __v8hi __builtin_arc_vmr5w (__v8hi, __v8hi); __v8hi __builtin_arc_vmr6aw (__v8hi, __v8hi); __v8hi __builtin_arc_vmr6w (__v8hi, __v8hi); __v8hi __builtin_arc_vmr7aw (__v8hi, __v8hi); __v8hi __builtin_arc_vmr7w (__v8hi, __v8hi); __v8hi __builtin_arc_vmrb (__v8hi, __v8hi); __v8hi __builtin_arc_vmulaw (__v8hi, __v8hi); __v8hi __builtin_arc_vmulfaw (__v8hi, __v8hi); __v8hi __builtin_arc_vmulfw (__v8hi, __v8hi); __v8hi __builtin_arc_vmulw (__v8hi, __v8hi); __v8hi __builtin_arc_vnew (__v8hi, __v8hi); __v8hi __builtin_arc_vor (__v8hi, __v8hi); __v8hi __builtin_arc_vsubaw (__v8hi, __v8hi); __v8hi __builtin_arc_vsubw (__v8hi, __v8hi); __v8hi __builtin_arc_vsummw (__v8hi, __v8hi); __v8hi __builtin_arc_vvc1f (__v8hi, __v8hi); __v8hi __builtin_arc_vvc1ft (__v8hi, __v8hi); __v8hi __builtin_arc_vxor (__v8hi, __v8hi); __v8hi __builtin_arc_vxoraw (__v8hi, __v8hi);
Следующие функции принимают один аргумент типа __v8hi и один аргумент типа int и возвращают результат типа __v8hi:
__v8hi __builtin_arc_vbaddw (__v8hi, int); __v8hi __builtin_arc_vbmaxw (__v8hi, int); __v8hi __builtin_arc_vbminw (__v8hi, int); __v8hi __builtin_arc_vbmulaw (__v8hi, int); __v8hi __builtin_arc_vbmulfw (__v8hi, int); __v8hi __builtin_arc_vbmulw (__v8hi, int); __v8hi __builtin_arc_vbrsubw (__v8hi, int); __v8hi __builtin_arc_vbsubw (__v8hi, int);
Следующие функции принимают один аргумент типа __v8hi и один аргумент типа int, который должен быть 3-битной константой времени компиляции, указывающей номер регистра I0–I7. Они возвращают результат типа __v8hi.
__v8hi __builtin_arc_vasrw (__v8hi, const int); __v8hi __builtin_arc_vsr8 (__v8hi, const int); __v8hi __builtin_arc_vsr8aw (__v8hi, const int);
Следующие функции принимают один аргумент типа __v8hi и один аргумент типа int, который должен быть 6-битной константой времени компиляции. Они возвращают результат типа __v8hi.
__v8hi __builtin_arc_vasrpwbi (__v8hi, const int); __v8hi __builtin_arc_vasrrpwbi (__v8hi, const int); __v8hi __builtin_arc_vasrrwi (__v8hi, const int); __v8hi __builtin_arc_vasrsrwi (__v8hi, const int); __v8hi __builtin_arc_vasrwi (__v8hi, const int); __v8hi __builtin_arc_vsr8awi (__v8hi, const int); __v8hi __builtin_arc_vsr8i (__v8hi, const int);
Следующие функции принимают один аргумент типа __v8hi и один аргумент типа int, который должен быть 8-битной константой времени компиляции. Они возвращают результат типа __v8hi.
__v8hi __builtin_arc_vd6tapf (__v8hi, const int); __v8hi __builtin_arc_vmvaw (__v8hi, const int); __v8hi __builtin_arc_vmvw (__v8hi, const int); __v8hi __builtin_arc_vmvzw (__v8hi, const int);
Следующие функции принимают два аргумента типа int, второй из которых должен быть 8-битной константой времени компиляции. Они возвращают результат типа __v8hi:
__v8hi __builtin_arc_vmovaw (int, const int); __v8hi __builtin_arc_vmovw (int, const int); __v8hi __builtin_arc_vmovzw (int, const int);
Следующие функции принимают один аргумент типа __v8hi и возвращают результат типа __v8hi:
__v8hi __builtin_arc_vabsaw (__v8hi); __v8hi __builtin_arc_vabsw (__v8hi); __v8hi __builtin_arc_vaddsuw (__v8hi); __v8hi __builtin_arc_vexch1 (__v8hi); __v8hi __builtin_arc_vexch2 (__v8hi); __v8hi __builtin_arc_vexch4 (__v8hi); __v8hi __builtin_arc_vsignw (__v8hi); __v8hi __builtin_arc_vupbaw (__v8hi); __v8hi __builtin_arc_vupbw (__v8hi); __v8hi __builtin_arc_vupsbaw (__v8hi); __v8hi __builtin_arc_vupsbw (__v8hi);
Следующие функции принимают два аргумента типа int и не возвращают результат:
void __builtin_arc_vdirun (int, int); void __builtin_arc_vdorun (int, int);
Следующие функции принимают два аргумента типа int и не возвращают результат. Первый аргумент должен быть 3-битной константой времени компиляции, указывающей один из каналов настройки DMA DR0–DR7:
void __builtin_arc_vdiwr (const int, int); void __builtin_arc_vdowr (const int, int);
Следующие функции принимают аргумент типа int и не возвращают результат:
void __builtin_arc_vendrec (int); void __builtin_arc_vrec (int); void __builtin_arc_vrecrun (int); void __builtin_arc_vrun (int);
Следующие функции принимают один аргумент типа __v8hi и два аргумента типа int и возвращают результат типа __v8hi. Второй аргумент должен быть 3-битной константой времени компиляции, указывающей один из регистров I0–I7, а третий аргумент должен быть 8-битной константой времени компиляции.
Примечание: Хотя соответствующие аппаратные инструкции не принимают SIMD-регистр в качестве операнда, эти встроенные функции перезаписывают соответствующие биты регистра __v8hi, переданного в качестве первого аргумента, значением, загруженным из расположения [Ib, u8] в SDM.
__v8hi __builtin_arc_vld32 (__v8hi, const int, const int); __v8hi __builtin_arc_vld32wh (__v8hi, const int, const int); __v8hi __builtin_arc_vld32wl (__v8hi, const int, const int); __v8hi __builtin_arc_vld64 (__v8hi, const int, const int);
Следующие функции принимают два аргумента типа int и возвращают результат типа __v8hi. Первый аргумент должен быть 3-битной константой времени компиляции, указывающей один из регистров I0–I7, а второй аргумент должен быть 8-битной константой времени компиляции.
__v8hi __builtin_arc_vld128 (const int, const int); __v8hi __builtin_arc_vld64w (const int, const int);
Следующие функции принимают один аргумент типа __v8hi и два аргумента типа int и не возвращают результат. Второй аргумент должен быть 3-битной константой времени компиляции, указывающей один из регистров I0–I7, а третий аргумент должен быть 8-битной константой времени компиляции.
void __builtin_arc_vst128 (__v8hi, const int, const int); void __builtin_arc_vst64 (__v8hi, const int, const int);
Следующие функции принимают один аргумент типа __v8hi и три аргумента типа int и не возвращают результат. Второй аргумент должен быть 3-битной константой времени компиляции, определяющей 16-битный подрегистр для сохранения, третий аргумент должен быть 3-битной константой времени компиляции, указывающей один из регистров I0–I7, а четвёртый аргумент должен быть 8-битной константой времени компиляции.
void __builtin_arc_vst16_n (__v8hi, const int, const int, const int); void __builtin_arc_vst32_n (__v8hi, const int, const int, const int);
Следующие встроенные функции доступны в системах с параметром -mmpy-option=6 или выше.
__v2hi __builtin_arc_dmach (__v2hi, __v2hi); __v2hi __builtin_arc_dmachu (__v2hi, __v2hi); __v2hi __builtin_arc_dmpyh (__v2hi, __v2hi); __v2hi __builtin_arc_dmpyhu (__v2hi, __v2hi); __v2hi __builtin_arc_vaddsub2h (__v2hi, __v2hi); __v2hi __builtin_arc_vsubadd2h (__v2hi, __v2hi);
Следующие встроенные функции доступны в системах с параметром -mmpy-option=7 или выше.
__v2si __builtin_arc_vmac2h (__v2hi, __v2hi); __v2si __builtin_arc_vmac2hu (__v2hi, __v2hi); __v2si __builtin_arc_vmpy2h (__v2hi, __v2hi); __v2si __builtin_arc_vmpy2hu (__v2hi, __v2hi);
Следующие встроенные функции доступны в системах с параметром -mmpy-option=8 или выше.
long long __builtin_arc_qmach (__v4hi, __v4hi); long long __builtin_arc_qmachu (__v4hi, __v4hi); long long __builtin_arc_qmpyh (__v4hi, __v4hi); long long __builtin_arc_qmpyhu (__v4hi, __v4hi); long long __builtin_arc_dmacwh (__v2si, __v2hi); long long __builtin_arc_dmacwhu (__v2si, __v2hi); _v2si __builtin_arc_vaddsub (__v2si, __v2si); _v2si __builtin_arc_vsubadd (__v2si, __v2si); _v4hi __builtin_arc_vaddsub4h (__v4hi, __v4hi); _v4hi __builtin_arc_vsubadd4h (__v4hi, __v4hi);
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/ARC-SIMD-Built_002din-Functions.html