34 #define ELEMENT_COUNT(x) c7x::element_count_of<x>::value
60 size_t remNumBlocks = 0;
63 typedef typename c7x::make_full_vector<float>::type vec;
70 __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1();
71 __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, HalfPI, One, MAX, Zero, s1, s2, s3, s4, C1, C2;
96 InvPI = (vec) 0.318309886183791;
97 HalfPI = (vec) 1.5707963268;
99 MAX = (vec) 1048576.0;
102 s1 = (vec) -1.666665668e-1;
103 s2 = (vec) 8.333025139e-3;
104 s3 = (vec) -1.980741872e-4;
105 s4 = (vec) 2.601903036e-6;
107 C2 = (vec) 9.67653589793e-4;
110 for (
size_t i = 0; i < numBlocks; i++) {
111 vec inVec = c7x::strm_eng<0, vec>::get_adv();
117 vec Sign, X, Y, Z, F, G, R;
119 vec_type int_one = (vec_type) 1;
122 vec negativeOne = (vec) -1;
129 Y = __abs(inVec) + HalfPI;
130 __vpred cmp_gt = __cmp_lt_pred((vec) MAX, Y);
131 Y = __select(cmp_gt, HalfPI, Y);
136 N = __float_to_int(X);
137 Z = c7x::convert<vec>(N);
146 vec_type andN = N & int_one;
147 vec convert_andN = c7x::convert<vec>(andN);
148 __vpred cmp_mod = __cmp_le_pred(convert_andN, Zero);
149 vec Sign_T = __select(cmp_mod, Sign, negativeOne);
151 F = (Y - (Z * C1)) - (Z * C2);
158 __vpred cmp_F = __cmp_lt_pred(F, Zero);
159 R = __select(cmp_F, R, negativeR);
163 __vpred cmp_RMin = __cmp_lt_pred(R, Zero);
165 vec outputRMin = R * Sign_T;
166 R = ((((((s4 * G) + s3) * G) + s2) * G) + s1) * G;
167 vec outVec = ((F + (F * R)) * Sign_T);
169 outVec = __select(cmp_RMin, outVec, outputRMin);
173 __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
174 vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
175 __vstore_pred(tmp, addr, outVec);
189 size_t numBlocks = 0;
190 size_t remNumBlocks = 0;
193 typedef typename c7x::make_full_vector<c7x::double_vec>::type vec;
194 typedef typename c7x::make_full_vector<c7x::int_vec>::type vec_type;
196 __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1();
197 __SA_TEMPLATE_v1 sa0Params = __gen_SA_TEMPLATE_v1();
207 numBlocks = length / c7x::element_count_of<vec>::value;
208 remNumBlocks = length % c7x::element_count_of<vec>::value;
220 vec InvPI, HalfPI, Zero, negativeOne, MAX, Sign, r1, r2, r3, r4, r5, r6, r7, r8, C1, C2;
222 C1 = (vec) 3.1416015625;
223 C2 = (vec) -8.908910206761537356617e-6;
224 r8 = (vec) 2.7204790957888846175e-15;
225 r7 = (vec) -7.6429178068910467734e-13;
226 r6 = (vec) 1.6058936490371589114e-10;
227 r5 = (vec) -2.5052106798274584544e-8;
228 r4 = (vec) 2.7557319210152756119e-6;
229 r3 = (vec) -1.9841269841201840457e-4;
230 r2 = (vec) 8.3333333333331650314e-3;
231 r1 = (vec) -1.6666666666666665052e-1;
232 MAX = (vec) 1.073741824e+09;
233 HalfPI = (vec) 1.57079632679489661923;
234 InvPI = (vec) 0.31830988618379067154;
237 negativeOne = (vec) -1.0;
239 vec_type int_one = (vec_type) 1;
241 vec X, Z, F, F2, G, R;
245 for (
size_t i = 0; i < numBlocks; i++) {
246 vec inVec = c7x::strm_eng<0, vec>::get_adv();
248 F = __abs(inVec) + HalfPI;
249 __vpred cmp_gt = __cmp_lt_pred(MAX, F);
250 F = __select(cmp_gt, HalfPI, F);
253 N = __double_to_int(X);
254 Z = __low_int_to_double(N);
256 vec_type andN = N & int_one;
257 vec convert_andN = __low_int_to_double(andN);
258 __vpred cmp_mod = __cmp_le_pred(convert_andN, Zero);
259 vec sign_vec = __select(cmp_mod, Sign, negativeOne);
261 F = (F - (Z * C1)) - (Z * C2);
265 R = ((((((G * r8) + r6) * G) + r4) * G) + r2) * G;
266 X = ((((((G * r7) + r5) * G) + r3) * G) + r1) * F2;
268 G = (F + (F * R)) * sign_vec;
270 __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
271 vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
272 __vstore_pred(tmp, addr, G);
MATHLIB_STATUS MATHLIB_cos< float >(size_t length, float *pSrc, float *pDst)
MATHLIB_STATUS MATHLIB_cos< double >(size_t length, double *pSrc, double *pDst)
MATHLIB_STATUS MATHLIB_cos(size_t length, T *pSrc, T *pDst)
MATHLIB_STATUS MATHLIB_cos_sp(size_t length, float *pSrc, float *pDst)
This function is the C interface for MATHLIB_cos. Function accepts float pointers.
MATHLIB_STATUS MATHLIB_cos_dp(size_t length, double *pSrc, double *pDst)
This function is the C interface for MATHLIB_cos. Function accepts double pointers.
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_NAME
The enumeration of all status codes.