34 #define ELEMENT_COUNT(x) c7x::element_count_of<x>::value
57 __SA_TEMPLATE_v1 *restrict sa0Params,
64 size_t remNumBlocks = 0;
67 typedef typename c7x::make_full_vector<T>::type vec;
70 numBlocks = length / c7x::element_count_of<vec>::value;
71 remNumBlocks = length % c7x::element_count_of<vec>::value;
83 vec k10e, LnMin, LnMax, Max, zero;
84 c7x::uint_vec inVec_min;
86 k10e = (vec) 2.302585093f;
87 LnMin = (vec) -87.33654475f;
88 LnMax = (vec) 88.72283905f;
89 Max = (vec) 3.402823466E+38f;
91 inVec_min = (c7x::uint_vec) 114u;
94 for (
size_t i = 0; i < numBlocks; i++) {
95 vec outVec = c7x::strm_eng<0, vec>::get_adv();
96 vec inVec = c7x::strm_eng<1, vec>::get_adv();
102 c7x::uint_vec inVec_small;
112 inVec_small = ((c7x::as_uint_vec(Ye) << 1U) >> 24U);
113 __vpred cmp_inVec = __cmp_gt_pred(inVec_min, inVec_small);
114 outVec = __select(cmp_inVec, 1.0f + Ye, outVec);
120 __vpred cmp_min = __cmp_lt_pred(Ye, LnMin);
121 outVec = __select(cmp_min, zero, outVec);
127 __vpred cmp_max = __cmp_lt_pred(LnMax, Ye);
128 outVec = __select(cmp_max, Max, outVec);
130 __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
131 vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
132 __vstore_pred(tmp, addr, outVec);
137 template <
typename T>
static inline void MATHLIB_exp10_vector(
size_t length, T *restrict pSrc, T *restrict pDst)
139 size_t numBlocks = 0;
140 size_t remNumBlocks = 0;
143 typedef typename c7x::make_full_vector<T>::type vec;
151 c7x::ulong_vec>::type uvec_type;
153 __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1();
154 __SA_TEMPLATE_v1 sa0Params = __gen_SA_TEMPLATE_v1();
159 numBlocks = length / c7x::element_count_of<vec>::value;
160 remNumBlocks = length % c7x::element_count_of<vec>::value;
172 vec log2_base_x16, half, negativeHalf, C0, C1, C2, P1, P2, k10e;
175 log2_base_x16 = (vec) (16.0f * 3.321928095f);
177 negativeHalf = (vec) -0.5f;
178 C0 = (vec) 0.1667361910f;
179 C1 = (vec) 0.4999999651f;
180 C2 = (vec) 0.9999998881f;
181 P1 = (vec) 0.04331970214844f;
182 P2 = (vec) 1.99663646e-6f;
183 k10e = (vec) 2.302585093f;
184 mask = (uvec_type) 0x3u;
187 for (
size_t i = 0; i < numBlocks; i++) {
188 vec inVec = c7x::strm_eng<0, vec>::get_adv();
194 vec pol, r, r2, r3, outVec, Nf, absNf, Ye;
195 uvec_type J, K, uN, dTAdjusted_32_63, dT_32_63, dT_0_31;
197 c7x::double_vec KVals_8_15, KVals_0_7, JVals_8_15, JVals_0_7, dTVals_8_15, dTVals_0_7, pol_0_7, pol_8_15,
198 outVec_0_7, outVec_8_15;
199 c7x::uint_vec upperBitsK, lowerBitsK, upperBitsJ, lowerBitsJ;
204 Nf = inVec * log2_base_x16;
206 N = c7x::convert<vec_type>(absNf);
212 __vpred cmp_N = __cmp_lt_pred(Nf, negativeHalf);
213 N = __select(cmp_N, minusN, N);
218 r = (Ye - (P1 * __int_to_float(N))) - (P2 * __int_to_float(N));
222 pol = (r * C2) + ((r3 * C0) + (r2 * C1));
229 uN = c7x::convert<uvec_type>(N);
239 KVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
240 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(upperBitsK), c7x::as_uchar_vec(lowerBitsK)));
241 KVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(
242 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(upperBitsK), c7x::as_uchar_vec(lowerBitsK)));
243 JVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
244 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(upperBitsJ), c7x::as_uchar_vec(lowerBitsJ)));
245 JVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(
246 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(upperBitsJ), c7x::as_uchar_vec(lowerBitsJ)));
249 dTVals_8_15 = KVals_8_15 * JVals_8_15;
250 dTVals_0_7 = KVals_0_7 * JVals_0_7;
257 dT_32_63 = c7x::as_uint_vec(__permute_odd_odd_int(MATHLIB_vperm_data_0_63, c7x::as_uchar_vec(dTVals_8_15),
258 c7x::as_uchar_vec(dTVals_0_7)));
259 dT_0_31 = c7x::as_uint_vec(__permute_even_even_int(MATHLIB_vperm_data_0_63, c7x::as_uchar_vec(dTVals_8_15),
260 c7x::as_uchar_vec(dTVals_0_7)));
262 uN = (uN >> 4) << 20;
263 dTAdjusted_32_63 = dT_32_63 + uN;
266 dTVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
267 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(dTAdjusted_32_63), c7x::as_uchar_vec(dT_0_31)));
268 dTVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(
269 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(dTAdjusted_32_63), c7x::as_uchar_vec(dT_0_31)));
273 pol_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(MATHLIB_vperm_data_dp_interweave_0_63,
274 c7x::as_uchar_vec(__high_float_to_double(pol)),
275 c7x::as_uchar_vec(__low_float_to_double(pol))));
276 pol_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(MATHLIB_vperm_data_dp_interweave_0_63,
277 c7x::as_uchar_vec(__high_float_to_double(pol)),
278 c7x::as_uchar_vec(__low_float_to_double(pol))));
280 outVec_0_7 = dTVals_0_7 * (1.0f + pol_0_7);
281 outVec_8_15 = dTVals_8_15 * (1.0f + pol_8_15);
283 outVec = c7x::reinterpret<vec>(__permute_even_even_int(MATHLIB_vperm_data_0_63,
284 c7x::as_uchar_vec(__double_to_float(outVec_8_15)),
285 c7x::as_uchar_vec(__double_to_float(outVec_0_7))));
287 __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
288 vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
289 __vstore_pred(tmp, addr, outVec);
static void MATHLIB_exp10_vector(size_t length, T *restrict pSrc, T *restrict pDst)
MATHLIB_STATUS MATHLIB_exp10(size_t length, T *restrict pSrc, T *restrict pDst)
static void MATHLIB_exp10_cond(__SE_TEMPLATE_v1 *restrict se0Params, __SA_TEMPLATE_v1 *restrict sa0Params, size_t length, T *restrict pSrc0, T *restrict pDst)
template MATHLIB_STATUS MATHLIB_exp10< float >(size_t length, float *pSrc, float *pDst)
MATHLIB_STATUS MATHLIB_exp10_sp(size_t length, float *pSrc, float *pDst)
This function is the C interface for MATHLIB_exp10. Function accepts float pointers.
#define MATHLIB_KTABLE_OFFSET
static c7x::uint_vec MATHLIB_LUTReadLowerBits(vecType vecOffset)
This method reads bits 31-0 of LUT value at vecOffset.
#define MATHLIB_JTABLE_OFFSET
static c7x::uint_vec MATHLIB_LUTReadUpperBits(vecType vecOffset)
This method reads bits 63-32 of LUT value at vecOffset.
static void MATHLIB_SE0SE1SA0Open(__SE_TEMPLATE_v1 *se0Params, __SA_TEMPLATE_v1 *sa0Params, T *pSrc0, T *pSrc1)
This method performs SE0, SE1, and SA0 open.
static void MATHLIB_SE0SA0Close()
This method performs SE0 and SA0 close.
static void MATHLIB_SE0SE1SA0Close()
This method performs SE0, SE1, 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.