char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
6d9c82ea2
char/aliceai-t5-moe
1#ifndef HVX_SIN_COS_H 2#define HVX_SIN_COS_H 3 4#include "hvx-base.h" 5#include "hvx-floor.h" 6 7// Range-reduce x to y in [-pi/2, pi/2] and the quadrant sign (-1)^n. 8// Floor/truncate need IEEE bits, so convert qf32 back to sf before them. 9static inline void hvx_vec_sincos_reduce_f32 (HVX_Vector x ,HVX_Vector * y ,HVX_Vector * sign ) { 10HVX_Vector const_inv_pi = hvx_vec_splat_f32 (0.3183098861837907f ); 11HVX_Vector const_half = hvx_vec_splat_f32 (0.5f ); 12HVX_Vector const_pi = hvx_vec_splat_f32 (3.141592653589793f ); 13HVX_Vector const_one = hvx_vec_splat_f32 (1.0f ); 14HVX_Vector const_neg_one = hvx_vec_splat_f32 (-1.0f ); 15HVX_Vector const_one_i = Q6_V_vsplat_R (1 ); 16 17HVX_Vector x_over_pi = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (x ,const_inv_pi )); 18x_over_pi = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (x_over_pi ,const_half )); 19 20HVX_Vector n_float = hvx_vec_floor_f32 (x_over_pi ); 21HVX_Vector n_int = hvx_vec_truncate_f32 (n_float ); 22 23HVX_Vector n_pi = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (n_float ,const_pi )); 24* y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vsub_VsfVsf (x ,n_pi )); 25 26HVX_VectorPred is_odd = Q6_Q_vcmp_eq_VwVw (Q6_V_vand_VV (n_int ,const_one_i ),const_one_i ); 27* sign = Q6_V_vmux_QVV (is_odd ,const_neg_one ,const_one ); 28} 29 30static inline void hvx_vec_sincos_f32 (HVX_Vector x ,HVX_Vector * vcos ,HVX_Vector * vsin ) { 31HVX_Vector y ; 32HVX_Vector sign ; 33hvx_vec_sincos_reduce_f32 (x ,& y ,& sign ); 34 35HVX_Vector z = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (y ,y )); 36 37HVX_Vector c4 = hvx_vec_splat_f32 (2.3557242013849433e-05f ); 38HVX_Vector c3 = hvx_vec_splat_f32 (-0.0013871428263450528f ); 39HVX_Vector c2 = hvx_vec_splat_f32 (0.041665895266688284f ); 40HVX_Vector c1 = hvx_vec_splat_f32 (-0.4999999360426369f ); 41HVX_Vector c0 = hvx_vec_splat_f32 (0.9999999999071725f ); 42 43HVX_Vector cos_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (c3 ,Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (z ,c4 )))); 44cos_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (c2 ,Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (z ,cos_y )))); 45cos_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (c1 ,Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (z ,cos_y )))); 46cos_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (c0 ,Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (z ,cos_y )))); 47 48HVX_Vector s4 = hvx_vec_splat_f32 (2.642186986152672e-06f ); 49HVX_Vector s3 = hvx_vec_splat_f32 (-0.00019825318964070864f ); 50HVX_Vector s2 = hvx_vec_splat_f32 (0.00833326283319605f ); 51HVX_Vector s1 = hvx_vec_splat_f32 (-0.16666666082087775f ); 52HVX_Vector s0 = hvx_vec_splat_f32 (0.999999999915155f ); 53 54HVX_Vector sin_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (s3 ,Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (z ,s4 )))); 55sin_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (s2 ,Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (z ,sin_y )))); 56sin_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (s1 ,Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (z ,sin_y )))); 57sin_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vadd_VsfVsf (s0 ,Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (z ,sin_y )))); 58sin_y = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (y ,sin_y )); 59 60* vcos = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (cos_y ,sign )); 61* vsin = Q6_Vsf_equals_Vqf32 (Q6_Vqf32_vmpy_VsfVsf (sin_y ,sign )); 62} 63 64static inline HVX_Vector hvx_vec_cos_f32 (HVX_Vector x ) { 65HVX_Vector vcos ; 66HVX_Vector vsin ; 67hvx_vec_sincos_f32 (x ,& vcos ,& vsin ); 68return vcos ; 69} 70 71static inline HVX_Vector hvx_vec_sin_f32 (HVX_Vector x ) { 72HVX_Vector vcos ; 73HVX_Vector vsin ; 74hvx_vec_sincos_f32 (x ,& vcos ,& vsin ); 75return vsin ; 76} 77 78#endif /* HVX_SIN_COS_H */