34 #define ELEMENT_COUNT(x) c7x::element_count_of<x>::value
56 size_t remNumBlocks = 0;
59 typedef typename c7x::make_full_vector<T>::type vec;
67 c7x::ulong_vec>::type uvec_type;
69 __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1();
70 __SA_TEMPLATE_v1 sa0Params = __gen_SA_TEMPLATE_v1();
75 numBlocks = length / c7x::element_count_of<vec>::value;
76 remNumBlocks = length % c7x::element_count_of<vec>::value;
88 vec log2_base_x16, half, negativeHalf, zero, LnMin, LnMax, Max, C0, C1, C2;
92 log2_base_x16 = (vec) 23.083120654f;
94 negativeHalf = (vec) -0.5f;
96 LnMin = (vec) -87.33654475f;
97 LnMax = (vec) 88.72283905f;
98 Max = (vec) 3.402823466E+38f;
99 C0 = (vec) 0.166668549286041f;
100 C1 = (vec) 0.500016170012920f;
101 C2 = (vec) 0.999999998618401f;
102 mask = (uvec_type) 0x3u;
103 p = (c7x::double_vec) 0.0433216987816623;
106 for (
size_t i = 0; i < numBlocks; i++) {
107 vec inVec = c7x::strm_eng<0, vec>::get();
113 vec pol, r, r2, r3, outVec, Nf, absNf, dT, rVals_odd, rVals_even;
114 uvec_type J, K, uN, dTAdjusted_32_63, dT_32_63, dT_0_31;
116 c7x::double_vec inVecVals_odd, inVecVals_even, NVals_odd, NVals_even, KVals_8_15, KVals_0_7, JVals_8_15,
117 JVals_0_7, dTVals_8_15, dTVals_0_7;
118 c7x::uint_vec upperBitsK, lowerBitsK, upperBitsJ, lowerBitsJ;
121 Nf = inVec * log2_base_x16;
123 N = c7x::convert<vec_type>(absNf);
129 __vpred cmp_N = __cmp_lt_pred(Nf, negativeHalf);
130 N = __select(cmp_N, minusN, N);
137 inVecVals_odd = __high_float_to_double(inVec);
138 inVecVals_even = __low_float_to_double(inVec);
139 NVals_odd = __high_int_to_double(N);
140 NVals_even = __low_int_to_double(N);
141 rVals_odd = __double_to_float((inVecVals_odd - (p * NVals_odd)));
142 rVals_even = __double_to_float((inVecVals_even - (p * NVals_even)));
145 r = c7x::reinterpret<vec>(__permute_even_even_int(MATHLIB_vperm_data_interweave_0_63,
146 c7x::as_uchar_vec(rVals_odd),
147 c7x::as_uchar_vec(rVals_even)));
152 pol = (r * C2) + ((r3 * C0) + (r2 * C1));
159 uN = c7x::convert<uvec_type>(N);
169 KVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(MATHLIB_vperm_data_interweave_0_63,
170 c7x::as_uchar_vec(upperBitsK),
171 c7x::as_uchar_vec(lowerBitsK)));
172 KVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(MATHLIB_vperm_data_interweave_0_63,
173 c7x::as_uchar_vec(upperBitsK),
174 c7x::as_uchar_vec(lowerBitsK)));
175 JVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(MATHLIB_vperm_data_interweave_0_63,
176 c7x::as_uchar_vec(upperBitsJ),
177 c7x::as_uchar_vec(lowerBitsJ)));
178 JVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(MATHLIB_vperm_data_interweave_0_63,
179 c7x::as_uchar_vec(upperBitsJ),
180 c7x::as_uchar_vec(lowerBitsJ)));
183 dTVals_8_15 = KVals_8_15 * JVals_8_15;
184 dTVals_0_7 = KVals_0_7 * JVals_0_7;
192 dT_32_63 = c7x::reinterpret<c7x::uint_vec>(__permute_odd_odd_int(MATHLIB_vperm_data_0_63,
193 c7x::as_uchar_vec(dTVals_8_15),
194 c7x::as_uchar_vec(dTVals_0_7)));
195 dT_0_31 = c7x::reinterpret<c7x::uint_vec>(__permute_even_even_int(MATHLIB_vperm_data_0_63,
196 c7x::as_uchar_vec(dTVals_8_15),
197 c7x::as_uchar_vec(dTVals_0_7)));
199 uN = (uN >> 4) << 20;
200 dTAdjusted_32_63 = dT_32_63 + uN;
203 dTVals_8_15 = c7x::reinterpret<c7x::double_vec>(
204 __permute_high_high(MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(dTAdjusted_32_63),
205 c7x::as_uchar_vec(dT_0_31)));
206 dTVals_0_7 = c7x::reinterpret<c7x::double_vec>(
207 __permute_low_low(MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(dTAdjusted_32_63),
208 c7x::as_uchar_vec(dT_0_31)));
209 dT = c7x::reinterpret<vec>(__permute_even_even_int(
210 MATHLIB_vperm_data_0_63, c7x::as_uchar_vec(__double_to_float(dTVals_8_15)),
211 c7x::as_uchar_vec(__double_to_float(dTVals_0_7))));
213 outVec = dT * (1.0f + pol);
219 inVec = c7x::strm_eng<0, vec>::get_adv();
225 __vpred cmp_min = __cmp_lt_pred(inVec, LnMin);
226 outVec = __select(cmp_min, zero, outVec);
232 __vpred cmp_max = __cmp_lt_pred(LnMax, inVec);
233 outVec = __select(cmp_max, Max, outVec);
235 __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
236 vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
237 __vstore_pred(tmp, addr, outVec);
static void MATHLIB_exp_vector(size_t length, T *pSrc, T *pDst)
template MATHLIB_STATUS MATHLIB_exp< float >(size_t length, float *pSrc, float *pDst)
MATHLIB_STATUS MATHLIB_exp_sp(size_t length, float *pSrc, float *pDst)
This function is the C interface for MATHLIB_exp. Function accepts float pointers.
MATHLIB_STATUS MATHLIB_exp(size_t length, T *pSrc, T *pDst)
Performs the elementwise exponentialization of an input vector. Function can be overloaded with float...
#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_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.