6.60.23 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 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-13.3.0/gcc/PowerPC-AltiVec_002fVSX-Built_002din-Functions.html