6.60.18 Поддержка архитектуры MIPS SIMD (MSA)
GCC предоставляет встроенные функции для доступа к инструкциям SIMD, предоставляемым архитектурой MIPS SIMD MSA. Интерфейс доступен путём включения <msa.h> и использования -mmsa -mhard-float -mfp64 -mnan=2008. Для каждой __builtin_msa_*, существует укороченное имя встроенной функции, __msa_*.
MSA реализует 128-битные векторные регистры, работающие с 8-, 16-, 32- и 64-битными целыми, 16- и 32-битными фиксированными точками или 32- и 64-битными числами с плавающей запятой. Следующие типы векторов включены в msa.h:
-
v16i8, вектор шестнадцати знаково-целых 8-битных чисел; -
v16u8, вектор шестнадцати беззнаковых 8-битных чисел; -
v8i16, вектор восьми знаково-целых 16-битных чисел; -
v8u16, вектор восьми беззнаковых 16-битных чисел; -
v4i32, вектор четырёх знаково-целых 32-битных чисел; -
v4u32, вектор четырёх беззнаковых 32-битных чисел; -
v2i64, вектор двух знаково-целых 64-битных чисел; -
v2u64, вектор двух беззнаковых 64-битных чисел; -
v4f32, вектор четырёх 32-битных чисел с плавающей запятой; -
v2f64, вектор двух 64-битных чисел с двойной точностью.
Инструкции и соответствующие встроенные функции могут иметь дополнительные ограничения и/или манипулировать входными/выходными значениями:
-
imm0_1, целая литеральная константа в диапазоне от 0 до 1; -
imm0_3, целая литеральная константа в диапазоне от 0 до 3; -
imm0_7, целая литеральная константа в диапазоне от 0 до 7; -
imm0_15, целая литеральная константа в диапазоне от 0 до 15; -
imm0_31, целая литеральная константа в диапазоне от 0 до 31; -
imm0_63, целая литеральная константа в диапазоне от 0 до 63; -
imm0_255, целая литеральная константа в диапазоне от 0 до 255; -
imm_n16_15, целая литеральная константа в диапазоне от -16 до 15; -
imm_n512_511, целая литеральная константа в диапазоне от -512 до 511; -
imm_n1024_1022, целая литеральная константа в диапазоне от -512 до 511, сдвинутая влево на 1 бит, т.е., -1024, -1022, …, 1020, 1022; -
imm_n2048_2044, целая литеральная константа в диапазоне от -512 до 511, сдвинутая влево на 2 бита, т.е., -2048, -2044, …, 2040, 2044; -
imm_n4096_4088, целая литеральная константа в диапазоне от -512 до 511, сдвинутая влево на 3 бита, т.е., -4096, -4088, …, 4080, 4088; -
imm1_4, целая литеральная константа в диапазоне от 1 до 4; -
i32, i64, u32, u64, f32, f64, определено следующим образом:
{
typedef int i32;
#if __LONG_MAX__ == __LONG_LONG_MAX__
typedef long i64;
#else
typedef long long i64;
#endif
typedef unsigned int u32;
#if __LONG_MAX__ == __LONG_LONG_MAX__
typedef unsigned long u64;
#else
typedef unsigned long long u64;
#endif
typedef double f64;
typedef float f32;
}
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/MIPS-SIMD-Architecture-_0028MSA_0029-Support.html