34 #define ELEMENT_COUNT(x) c7x::element_count_of<x>::value
61 size_t remNumBlocks = 0;
64 typedef typename c7x::make_full_vector<float>::type vec;
71 __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1();
72 __SA_TEMPLATE_v1 sa0Params = __gen_SA_TEMPLATE_v1();
81 numBlocks = length / c7x::element_count_of<vec>::value;
82 remNumBlocks = length % c7x::element_count_of<vec>::value;
94 vec InvPI, One, MAX, Zero, s1, s2, s3, s4, C1, C2, X, Y, Z, F, G, R, negativeOne, Sign;
97 InvPI = (vec) 0.318309886183791;
99 MAX = (vec) 1048576.0;
101 s1 = (vec) -1.666665668e-1;
102 s2 = (vec) 8.333025139e-3;
103 s3 = (vec) -1.980741872e-4;
104 s4 = (vec) 2.601903036e-6;
106 C2 = (vec) 9.67653589793e-4;
107 negativeOne = (vec) -1;
109 int_one = (vec_type) 1;
114 for (
size_t i = 0; i < numBlocks; i++) {
115 vec a = c7x::strm_eng<0, vec>::get_adv();
121 __vpred cmp_gt = __cmp_lt_pred((vec) MAX, __abs(Y));
122 Y = __select(cmp_gt, Zero, Y);
127 N = __float_to_int(X);
128 Z = c7x::convert<vec>(N);
137 vec_type andN = N & int_one;
138 vec convert_andN = c7x::convert<vec>(andN);
139 __vpred cmp_mod = __cmp_le_pred(convert_andN, Zero);
140 vec Sign_vec = __select(cmp_mod, Sign, negativeOne);
142 F = (Y - (Z * C1)) - (Z * C2);
145 R = ((((((s4 * G) + s3) * G) + s2) * G) + s1) * G;
147 vec output = ((F + (F * R)) * Sign_vec);
148 __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
149 vec *VB1 = c7x::strm_agen<0, vec>::get_adv(pDst);
151 __vstore_pred(tmp, VB1, output);
165 size_t numBlocks = 0;
166 size_t remNumBlocks = 0;
169 typedef typename c7x::make_full_vector<c7x::double_vec>::type vec;
170 typedef typename c7x::make_full_vector<c7x::int_vec>::type vec_type;
172 __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1();
173 __SA_TEMPLATE_v1 sa0Params = __gen_SA_TEMPLATE_v1();
182 numBlocks = length / c7x::element_count_of<vec>::value;
183 remNumBlocks = length % c7x::element_count_of<vec>::value;
194 vec InvPI, C1, C2, r8, r7, r6, r5, r4, r3, r2, r1, MAX, Zero, Sign, negativeOne;
196 InvPI = (vec) 0.31830988618379067154;
197 C1 = (vec) 3.1416015625;
198 C2 = (vec) -8.908910206761537356617e-6;
199 r8 = (vec) 2.7204790957888846175e-15;
200 r7 = (vec) -7.6429178068910467734e-13;
201 r6 = (vec) 1.6058936490371589114e-10;
202 r5 = (vec) -2.5052106798274584544e-8;
203 r4 = (vec) 2.7557319210152756119e-6;
204 r3 = (vec) -1.9841269841201840457e-4;
205 r2 = (vec) 8.3333333333331650314e-3;
206 r1 = (vec) -1.6666666666666665052e-1;
207 MAX = (vec) 1.073741824e+09;
211 negativeOne = (vec) -1.0;
213 vec_type int_one = (vec_type) 1;
215 vec X, Z, F1, F2, G, R;
219 for (
size_t i = 0; i < numBlocks; i++) {
220 vec a = c7x::strm_eng<0, vec>::get_adv();
224 __vpred cmp_gt = __cmp_lt_pred((vec) MAX, __abs(F1));
225 F1 = __select(cmp_gt, Zero, F1);
228 N = __double_to_int(X);
229 Z = __low_int_to_double(N);
231 vec_type andN = N & int_one;
232 vec convert_andN = __low_int_to_double(andN);
234 __vpred cmp_mod = __cmp_le_pred(convert_andN, Zero);
235 vec Sign_vec = __select(cmp_mod, Sign, negativeOne);
237 F1 = (F1 - (Z * C1)) - (Z * C2);
241 R = ((((((G * r8) + r6) * G) + r4) * G) + r2) * G;
242 X = ((((((G * r7) + r5) * G) + r3) * G) + r1) * F2;
244 G = ((F1 + (F1 * R)) * Sign_vec);
246 __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
247 vec *VB1 = c7x::strm_agen<0, vec>::get_adv(pDst);
248 __vstore_pred(tmp, VB1, G);
MATHLIB_STATUS MATHLIB_sin< float >(size_t length, float *pSrc, float *pDst)
MATHLIB_STATUS MATHLIB_sin(size_t length, T *pSrc, T *pDst)
MATHLIB_STATUS MATHLIB_sin< double >(size_t length, double *pSrc, double *pDst)
static void MATHLIB_SE0SA0Close()
This method performs SE0 and SA0 close.
static void MATHLIB_SE0SA01DSequentialInit(__SE_TEMPLATE_v1 *se0Params, __SA_TEMPLATE_v1 *sa0Params, size_t length, T *pSrc, T *pDst)
static MATHLIB_STATUS MATHLIB_checkParams(size_t length, T *pSrc, T *pDst)
This method performs parameter checks for MATHLIB function.
static void MATHLIB_SE0SA0Open(__SE_TEMPLATE_v1 *se0Params, __SA_TEMPLATE_v1 *sa0Params, T *pSrc)
This method performs SE0 and SA0 open.
MATHLIB_STATUS MATHLIB_sin_sp(size_t length, float *pSrc, float *pDst)
This function is the C interface for MATHLIB_sin. Function accepts float pointers.
MATHLIB_STATUS MATHLIB_sin_dp(size_t length, double *pSrc, double *pDst)
This function is the C interface for MATHLIB_sin. Function accepts double pointers.
MATHLIB_STATUS_NAME
The enumeration of all status codes.