Next: Other MIPS Built-in Functions, Previous: MIPS Loongson Built-in Functions, Up: Target Builtins [Contents][Index]

• MIPS SIMD Architecture Built-in Functions: |

GCC provides intrinsics to access the SIMD instructions provided by the MSA MIPS SIMD Architecture. The interface is made available by including `<msa.h>`

and using `-mmsa -mhard-float -mfp64 -mnan=2008`. For each `__builtin_msa_*`

, there is a shortened name of the intrinsic, `__msa_*`

.

MSA implements 128-bit wide vector registers, operating on 8-, 16-, 32- and 64-bit integer, 16- and 32-bit fixed-point, or 32- and 64-bit floating point data elements. The following vectors typedefs are included in `msa.h`

:

`v16i8`

, a vector of sixteen signed 8-bit integers;`v16u8`

, a vector of sixteen unsigned 8-bit integers;`v8i16`

, a vector of eight signed 16-bit integers;`v8u16`

, a vector of eight unsigned 16-bit integers;`v4i32`

, a vector of four signed 32-bit integers;`v4u32`

, a vector of four unsigned 32-bit integers;`v2i64`

, a vector of two signed 64-bit integers;`v2u64`

, a vector of two unsigned 64-bit integers;`v4f32`

, a vector of four 32-bit floats;`v2f64`

, a vector of two 64-bit doubles.

Instructions and corresponding built-ins may have additional restrictions and/or input/output values manipulated:

`imm0_1`

, an integer literal in range 0 to 1;`imm0_3`

, an integer literal in range 0 to 3;`imm0_7`

, an integer literal in range 0 to 7;`imm0_15`

, an integer literal in range 0 to 15;`imm0_31`

, an integer literal in range 0 to 31;`imm0_63`

, an integer literal in range 0 to 63;`imm0_255`

, an integer literal in range 0 to 255;`imm_n16_15`

, an integer literal in range -16 to 15;`imm_n512_511`

, an integer literal in range -512 to 511;`imm_n1024_1022`

, an integer literal in range -512 to 511 left shifted by 1 bit, i.e., -1024, -1022, …, 1020, 1022;`imm_n2048_2044`

, an integer literal in range -512 to 511 left shifted by 2 bits, i.e., -2048, -2044, …, 2040, 2044;`imm_n4096_4088`

, an integer literal in range -512 to 511 left shifted by 3 bits, i.e., -4096, -4088, …, 4080, 4088;`imm1_4`

, an integer literal in range 1 to 4;`i32, i64, u32, u64, f32, f64`

, defined as follows:

{ 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; }