1 1 6.59.16 MIPS SIMD Architecture (MSA) Support 1 -------------------------------------------- 1
1 · MIPS SIMD Architecture Built-in Functions 1 1 GCC provides intrinsics to access the SIMD instructions provided by the 1 MSA MIPS SIMD Architecture. The interface is made available by 1 including '<msa.h>' and using '-mmsa -mhard-float -mfp64 -mnan=2008'. 1 For each '__builtin_msa_*', there is a shortened name of the intrinsic, 1 '__msa_*'. 1 1 MSA implements 128-bit wide vector registers, operating on 8-, 16-, 32- 1 and 64-bit integer, 16- and 32-bit fixed-point, or 32- and 64-bit 1 floating point data elements. The following vectors typedefs are 1 included in 'msa.h': 1 * 'v16i8', a vector of sixteen signed 8-bit integers; 1 * 'v16u8', a vector of sixteen unsigned 8-bit integers; 1 * 'v8i16', a vector of eight signed 16-bit integers; 1 * 'v8u16', a vector of eight unsigned 16-bit integers; 1 * 'v4i32', a vector of four signed 32-bit integers; 1 * 'v4u32', a vector of four unsigned 32-bit integers; 1 * 'v2i64', a vector of two signed 64-bit integers; 1 * 'v2u64', a vector of two unsigned 64-bit integers; 1 * 'v4f32', a vector of four 32-bit floats; 1 * 'v2f64', a vector of two 64-bit doubles. 1 1 Instructions and corresponding built-ins may have additional 1 restrictions and/or input/output values manipulated: 1 * 'imm0_1', an integer literal in range 0 to 1; 1 * 'imm0_3', an integer literal in range 0 to 3; 1 * 'imm0_7', an integer literal in range 0 to 7; 1 * 'imm0_15', an integer literal in range 0 to 15; 1 * 'imm0_31', an integer literal in range 0 to 31; 1 * 'imm0_63', an integer literal in range 0 to 63; 1 * 'imm0_255', an integer literal in range 0 to 255; 1 * 'imm_n16_15', an integer literal in range -16 to 15; 1 * 'imm_n512_511', an integer literal in range -512 to 511; 1 * 'imm_n1024_1022', an integer literal in range -512 to 511 left 1 shifted by 1 bit, i.e., -1024, -1022, ..., 1020, 1022; 1 * 'imm_n2048_2044', an integer literal in range -512 to 511 left 1 shifted by 2 bits, i.e., -2048, -2044, ..., 2040, 2044; 1 * 'imm_n4096_4088', an integer literal in range -512 to 511 left 1 shifted by 3 bits, i.e., -4096, -4088, ..., 4080, 4088; 1 * 'imm1_4', an integer literal in range 1 to 4; 1 * 'i32, i64, u32, u64, f32, f64', defined as follows: 1 1 { 1 typedef int i32; 1 #if __LONG_MAX__ == __LONG_LONG_MAX__ 1 typedef long i64; 1 #else 1 typedef long long i64; 1 #endif 1 1 typedef unsigned int u32; 1 #if __LONG_MAX__ == __LONG_LONG_MAX__ 1 typedef unsigned long u64; 1 #else 1 typedef unsigned long long u64; 1 #endif 1 1 typedef double f64; 1 typedef float f32; 1 } 1