📄 altivec.h
字号:
#define vec_sr __builtin_vec_sr#define vec_sra __builtin_vec_sra#define vec_srl __builtin_vec_srl#define vec_sro __builtin_vec_sro#define vec_st __builtin_vec_st#define vec_ste __builtin_vec_ste#define vec_stl __builtin_vec_stl#define vec_stvebx __builtin_vec_stvebx#define vec_stvehx __builtin_vec_stvehx#define vec_stvewx __builtin_vec_stvewx#define vec_sub __builtin_vec_sub#define vec_subs __builtin_vec_subs#define vec_sum __builtin_vec_sum#define vec_unpackh __builtin_vec_unpackh#define vec_unpackl __builtin_vec_unpackl#define vec_vaddubm __builtin_vec_vaddubm#define vec_vaddubs __builtin_vec_vaddubs#define vec_vadduhm __builtin_vec_vadduhm#define vec_vadduhs __builtin_vec_vadduhs#define vec_vadduwm __builtin_vec_vadduwm#define vec_vadduws __builtin_vec_vadduws#define vec_vcmpequb __builtin_vec_vcmpequb#define vec_vcmpequh __builtin_vec_vcmpequh#define vec_vcmpequw __builtin_vec_vcmpequw#define vec_vmaxub __builtin_vec_vmaxub#define vec_vmaxuh __builtin_vec_vmaxuh#define vec_vmaxuw __builtin_vec_vmaxuw#define vec_vminub __builtin_vec_vminub#define vec_vminuh __builtin_vec_vminuh#define vec_vminuw __builtin_vec_vminuw#define vec_vmrghb __builtin_vec_vmrghb#define vec_vmrghh __builtin_vec_vmrghh#define vec_vmrghw __builtin_vec_vmrghw#define vec_vmrglb __builtin_vec_vmrglb#define vec_vmrglh __builtin_vec_vmrglh#define vec_vmrglw __builtin_vec_vmrglw#define vec_vpkuhum __builtin_vec_vpkuhum#define vec_vpkuwum __builtin_vec_vpkuwum#define vec_vrlb __builtin_vec_vrlb#define vec_vrlh __builtin_vec_vrlh#define vec_vrlw __builtin_vec_vrlw#define vec_vslb __builtin_vec_vslb#define vec_vslh __builtin_vec_vslh#define vec_vslw __builtin_vec_vslw#define vec_vspltb __builtin_vec_vspltb#define vec_vsplth __builtin_vec_vsplth#define vec_vspltw __builtin_vec_vspltw#define vec_vsrab __builtin_vec_vsrab#define vec_vsrah __builtin_vec_vsrah#define vec_vsraw __builtin_vec_vsraw#define vec_vsrb __builtin_vec_vsrb#define vec_vsrh __builtin_vec_vsrh#define vec_vsrw __builtin_vec_vsrw#define vec_vsububs __builtin_vec_vsububs#define vec_vsububm __builtin_vec_vsububm#define vec_vsubuhm __builtin_vec_vsubuhm#define vec_vsubuhs __builtin_vec_vsubuhs#define vec_vsubuwm __builtin_vec_vsubuwm#define vec_vsubuws __builtin_vec_vsubuws#define vec_xor __builtin_vec_xor/* Predicates. For C++, we use templates in order to allow non-parenthesized arguments. For C, instead, we use macros since non-parenthesized arguments were not allowed even in older GCC implementation of AltiVec. In the future, we may add more magic to the back-end, so that no one- or two-argument macros are used. */#ifdef __cplusplus__#define __altivec_unary_pred(NAME, CALL) \template <class T> int NAME (T a1) { return CALL; }#define __altivec_scalar_pred(NAME, CALL) \template <class T, class U> int NAME (T a1, U a2) { return CALL; }/* Given the vec_step of a type, return the corresponding bool type. */template <int STEP> class __altivec_bool_ret { };template <> class __altivec_bool_ret <4> { typedef __vector __bool int __ret;};template <> class __altivec_bool_ret <8> { typedef __vector __bool short __ret;};template <> class __altivec_bool_ret <16> { typedef __vector __bool char __ret;};/* Be very liberal in the pairs we accept. Mistakes such as passing a `vector char' and `vector short' will be caught by the middle-end, while any attempt to detect them here would produce hard to understand error messages involving the implementation details of AltiVec. */#define __altivec_binary_pred(NAME, CALL) \template <class T, class U> \typename __altivec_bool_ret <vec_step (T)>::__ret \NAME (T a1, U a2) \{ \ return CALL; \}__altivec_binary_pred(vec_cmplt, __builtin_vec_cmpgt (a2, a1))__altivec_binary_pred(vec_cmple, __builtin_altivec_cmpge (a2, a1))__altivec_scalar_pred(vec_all_in, __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2))__altivec_scalar_pred(vec_any_out, __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2))__altivec_unary_pred(vec_all_nan, __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a1))__altivec_unary_pred(vec_any_nan, __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a1))__altivec_unary_pred(vec_all_numeric, __builtin_altivec_vcmpeqfp_p (__CR6_LT, a1, a1))__altivec_unary_pred(vec_any_numeric, __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, a1, a1))__altivec_scalar_pred(vec_all_eq, __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2))__altivec_scalar_pred(vec_all_ne, __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2))__altivec_scalar_pred(vec_any_eq, __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2))__altivec_scalar_pred(vec_any_ne, __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2))__altivec_scalar_pred(vec_all_gt, __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2))__altivec_scalar_pred(vec_all_lt, __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1))__altivec_scalar_pred(vec_any_gt, __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2))__altivec_scalar_pred(vec_any_lt, __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1))__altivec_scalar_pred(vec_all_ngt, __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a1, a2))__altivec_scalar_pred(vec_all_nlt, __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a2, a1))__altivec_scalar_pred(vec_any_ngt, __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a1, a2))__altivec_scalar_pred(vec_any_nlt, __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a2, a1))/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, while for integer types it is converted to __builtin_vec_vcmpgt_p, with inverted args and condition code. */__altivec_scalar_pred(vec_all_le, __builtin_vec_vcmpge_p (__CR6_LT, a2, a1))__altivec_scalar_pred(vec_all_ge, __builtin_vec_vcmpge_p (__CR6_LT, a1, a2))__altivec_scalar_pred(vec_any_le, __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1))__altivec_scalar_pred(vec_any_ge, __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2))__altivec_scalar_pred(vec_all_nge, __builtin_altivec_vcmpgefp_p (__CR6_EQ, a1, a2))__altivec_scalar_pred(vec_all_nle, __builtin_altivec_vcmpgefp_p (__CR6_EQ, a2, a1))__altivec_scalar_pred(vec_any_nge, __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a1, a2))__altivec_scalar_pred(vec_any_nle, __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a2, a1))#undef __altivec_scalar_pred#undef __altivec_unary_pred#undef __altivec_binary_pred#else#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1))#define vec_cmple(a1, a2) __builtin_altivec_vcmpgefp ((a2), (a1))#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2))#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2))#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (a1), (a1))#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, (a1), (a1))#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT, (a1), (a1))#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, (a1), (a1))#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2))#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2))#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2))#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2))#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2))#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1))#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2))#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1))#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a1), (a2))#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a2), (a1))#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a1), (a2))#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a2), (a1))/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, while for integer types it is converted to __builtin_vec_vcmpgt_p, with inverted args and condition code. */#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1))#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2))#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1))#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2))#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a1), (a2))#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a2), (a1))#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a1), (a2))#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a2), (a1))#endif/* These do not accept vectors, so they do not have a __builtin_vec_* counterpart. */#define vec_dss(x) __builtin_altivec_dss((x))#define vec_dssall() __builtin_altivec_dssall ()#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ())#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x))#define vec_splat_s16(x) __builtin_altivec_vspltish ((x))#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x))#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x)))#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x)))#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x)))/* This also accepts a type for its parameter, so it is not enough to #define vec_step to __builtin_vec_step. */#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0)#endif /* _ALTIVEC_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -