7.13.25 Встроенные функции PowerPC AltiVec/VSX
GCC предоставляет интерфейс для семейства процессоров PowerPC, позволяющий обращаться к операциям AltiVec, описанным в руководстве Motorola AltiVec Programming Interface Manual. Интерфейс доступен при подключении <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 Vector Intrinsic Programming Reference (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-15.3.0/gcc/PowerPC-AltiVec_002fVSX-Built_002din-Functions.html