6.62.26 PowerPC AltiVec/VSX Встроенные функции
GCC предоставляет интерфейс для семейства процессоров PowerPC для доступа к операциям AltiVec, описанным в руководстве по программированию AltiVec от Motorola. Интерфейс доступен путём включения <altivec.h> и использования -maltivec и -mabi=altivec. Интерфейс поддерживает следующие типы векторов.
vector unsigned char vector signed char vector bool char vector unsigned short vector signed short vector bool short vector pixel vector unsigned int vector signed int vector bool int vector float
Реализация GCC интерфейса высокого уровня, доступного из кода C и C++, отличается от документации Motorola в нескольких аспектах.
- Векторная константа — это список константных выражений в фигурных скобках.
- Для инициализации вектора не требуется приведение типов, если векторная константа имеет тот же тип, что и переменная, которую она инициализирует.
- Если
signedилиunsignedопущены, знаковый тип векторного типа является значением по умолчанию для базового типа. Значение по умолчанию зависит от операционной системы, поэтому в портабельном программном обеспечении всегда нужно указывать знаковый тип. - Компиляция с -maltivec добавляет ключевые слова
__vector,vector,__pixel,pixel,__boolиbool. При компиляции ISO C контекстно-зависимая подстановка ключевых словvector,pixelиboolотключена. Для их использования необходимо включить<altivec.h>. - GCC позволяет использовать имя
typedefв качестве спецификатора типа для векторного типа, но только в следующих случаях:- При использовании
__vectorвместоvector; например,typedef signed short int16; __vector int16 data;
- При использовании
vectorв режиме ключевого слова и предварительного определения; например,typedef signed short int16; vector int16 data;
Обратите внимание, что режим ключевого слова и предварительного определения включен путём отключения расширений GNU (например, используя
-std=c11) и включением<altivec.h>.
- При использовании
- В C перегруженные функции реализуются с помощью макросов, поэтому следующее не работает:
vec_add ((vector signed int){1, 2, 3, 4}, foo);Поскольку
vec_addявляется макросом, векторная константа в примере обрабатывается как четыре отдельных аргумента. Для корректной работы оберните весь аргумент в скобки.
Примечание: Поддерживается только интерфейс <altivec.h>. Внутри GCC используются встроенные функции для достижения функциональности в указанном заголовочном файле, но они не поддерживаются и могут быть изменены без предварительного уведомления.
GCC соответствует справке по программированию с использованием векторов Power (PVIPR), которая доступна по адресу https://openpowerfoundation.org/?resource_lib=power-vector-intrinsic-programming-reference. Глава 4 данного документа полностью описывает интерфейсы API векторов, которые должны предоставляться совместимыми компиляторами. Разработчикам рекомендуется использовать описанные там интерфейсы. Однако исторически GCC предоставляет дополнительные интерфейсы для доступа к векторным инструкциям. Они кратко описаны ниже. Там, где PVIPR предоставляет портабельный интерфейс, другие функции в GCC, обеспечивающие те же возможности, следует считать устаревшими.
В PVIPR документированы следующие перегруженные функции:
vec_abs |
vec_absd |
vec_abss |
vec_add |
vec_addc |
vec_adde |
vec_addec |
vec_adds |
vec_all_eq |
vec_all_ge |
vec_all_gt |
vec_all_in |
vec_all_le |
vec_all_lt |
vec_all_nan |
vec_all_ne |
vec_all_nge |
vec_all_ngt |
vec_all_nle |
vec_all_nlt |
vec_all_numeric |
vec_and |
vec_andc |
vec_any_eq |
vec_any_ge |
vec_any_gt |
vec_any_le |
vec_any_lt |
vec_any_nan |
vec_any_ne |
vec_any_nge |
vec_any_ngt |
vec_any_nle |
vec_any_nlt |
vec_any_numeric |
vec_any_out |
vec_avg |
vec_bperm |
vec_ceil |
vec_cipher_be |
vec_cipherlast_be |
vec_cmpb |
vec_cmpeq |
vec_cmpge |
vec_cmpgt |
vec_cmple |
vec_cmplt |
vec_cmpne |
vec_cmpnez |
vec_cntlz |
vec_cntlz_lsbb |
vec_cnttz |
vec_cnttz_lsbb |
vec_cpsgn |
vec_ctf |
vec_cts |
vec_ctu |
vec_div |
vec_double |
vec_doublee |
vec_doubleh |
vec_doublel |
vec_doubleo |
vec_eqv |
vec_expte |
vec_extract |
vec_extract_exp |
vec_extract_fp32_from_shorth |
vec_extract_fp32_from_shortl |
vec_extract_sig |
vec_extract_4b |
vec_first_match_index |
vec_first_match_or_eos_index |
vec_first_mismatch_index |
vec_first_mismatch_or_eos_index |
vec_float |
vec_float2 |
vec_floate |
vec_floato |
vec_floor |
vec_gb |
vec_insert |
vec_insert_exp |
vec_insert4b |
vec_ld |
vec_lde |
vec_ldl |
vec_loge |
vec_madd |
vec_madds |
vec_max |
vec_mergee |
vec_mergeh |
vec_mergel |
vec_mergeo |
vec_mfvscr |
vec_min |
vec_mradds |
vec_msub |
vec_msum |
vec_msums |
vec_mtvscr |
vec_mul |
vec_mule |
vec_mulo |
vec_nabs |
vec_nand |
vec_ncipher_be |
vec_ncipherlast_be |
vec_nearbyint |
vec_neg |
vec_nmadd |
vec_nmsub |
vec_nor |
vec_or |
vec_orc |
vec_pack |
vec_pack_to_short_fp32 |
vec_packpx |
vec_packs |
vec_packsu |
vec_parity_lsbb |
vec_perm |
vec_permxor |
vec_pmsum_be |
vec_popcnt |
vec_re |
vec_recipdiv |
vec_revb |
vec_reve |
vec_rint |
vec_rl |
vec_rlmi |
vec_rlnm |
vec_round |
vec_rsqrt |
vec_rsqrte |
vec_sbox_be |
vec_sel |
vec_shasigma_be |
vec_signed |
vec_signed2 |
vec_signede |
vec_signedo |
vec_sl |
vec_sld |
vec_sldw |
vec_sll |
vec_slo |
vec_slv |
vec_splat |
vec_splat_s8 |
vec_splat_s16 |
vec_splat_s32 |
vec_splat_u8 |
vec_splat_u16 |
vec_splat_u32 |
vec_splats |
vec_sqrt |
vec_sr |
vec_sra |
vec_srl |
vec_sro |
vec_srv |
vec_st |
vec_ste |
vec_stl |
vec_sub |
vec_subc |
vec_sube |
vec_subec |
vec_subs |
vec_sum2s |
vec_sum4s |
vec_sums |
vec_test_data_class |
vec_trunc |
vec_unpackh |
vec_unpackl |
vec_unsigned |
vec_unsigned2 |
vec_unsignede |
vec_unsignedo |
vec_xl |
vec_xl_be |
vec_xl_len |
vec_xl_len_r |
vec_xor |
vec_xst |
vec_xst_be |
vec_xst_len |
vec_xst_len_r |
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/PowerPC-AltiVec_002fVSX-Built_002din-Functions.html