34 #define ELEMENT_COUNT(x) c7x::element_count_of<x>::value
54 template <
typename T>
static inline void MATHLIB_log_vector(
size_t length, T *restrict pSrc, T *restrict pDst)
57 size_t remNumBlocks = 0;
60 typedef typename c7x::make_full_vector<T>::type vec;
62 __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1();
63 __SA_TEMPLATE_v1 sa0Params = __gen_SA_TEMPLATE_v1();
67 numBlocks = length / c7x::element_count_of<vec>::value;
68 remNumBlocks = length % c7x::element_count_of<vec>::value;
79 vec C1, C2, C3, C4, C5, eMax, outVecMin, outVecMax;
82 zero = (c7x::uint_vec) 0;
84 ln2 = (c7x::double_vec) 0.693147180559945;
85 C1 = (vec) -0.2302894f;
86 C2 = (vec) 0.1908169f;
87 C3 = (vec) -0.2505905f;
88 C4 = (vec) 0.3333164f;
89 C5 = (vec) -0.5000002f;
90 eMax = (vec) 3.402823466e+38f;
91 outVecMin = (vec) 0xFF800000u;
92 outVecMax = (vec) 709.7827f;
95 for (
size_t i = 0; i < numBlocks; i++) {
96 vec inVec = c7x::strm_eng<0, vec>::get_adv();
101 vec pol, r1, r2, r3, r4;
102 c7x::double_vec inVecVals_odd, inVecVals_even, inVecVals_oddReciprocal, inVecVals_evenReciprocal,
103 inVecReciprocalApprox_8_15, inVecReciprocalApprox_0_7, inVecVals_8_15, inVecVals_0_7, rVals_0_7, rVals_8_15,
104 TVals_8_15, TVals_0_7, NVals_odd, NVals_even, NVals_0_7, NVals_8_15, outVec_8_15, outVec_0_7;
105 c7x::uint_vec inVecReciprocal_32_63, inVecReciprocalClr_32_63, inVecReciprocalApprox_32_63, indexT,
106 upperBitsIndexT, lowerBitsIndexT;
115 inVecVals_odd = __high_float_to_double(inVec);
116 inVecVals_even = __low_float_to_double(inVec);
117 inVecVals_oddReciprocal = __recip(inVecVals_odd);
118 inVecVals_evenReciprocal = __recip(inVecVals_even);
122 inVecReciprocal_32_63 = c7x::reinterpret<c7x::uint_vec>(
123 __permute_odd_odd_int(MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(inVecVals_oddReciprocal),
124 c7x::as_uchar_vec(inVecVals_evenReciprocal)));
127 inVecReciprocalClr_32_63 = inVecReciprocal_32_63 & 0xFFFE0000u;
130 inVecReciprocalApprox_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
131 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(inVecReciprocalClr_32_63), c7x::as_uchar_vec(zero)));
132 inVecReciprocalApprox_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(
133 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(inVecReciprocalClr_32_63), c7x::as_uchar_vec(zero)));
136 inVecVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(
137 MATHLIB_vperm_data_dp_interweave_0_63, c7x::as_uchar_vec(inVecVals_odd), c7x::as_uchar_vec(inVecVals_even)));
138 inVecVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
139 MATHLIB_vperm_data_dp_interweave_0_63, c7x::as_uchar_vec(inVecVals_odd), c7x::as_uchar_vec(inVecVals_even)));
142 rVals_0_7 = (inVecReciprocalApprox_0_7 * inVecVals_0_7) - 1.0;
143 rVals_8_15 = (inVecReciprocalApprox_8_15 * inVecVals_8_15) - 1.0;
146 r1 = c7x::reinterpret<vec>(__permute_even_even_int(MATHLIB_vperm_data_0_63,
147 c7x::as_uchar_vec(__double_to_float(rVals_8_15)),
148 c7x::as_uchar_vec(__double_to_float(rVals_0_7))));
154 pol = (C5 * r2) + ((C4 * r3) + ((((C2 * r1) + C3) + (C1 * r2)) * r4));
161 inVecReciprocalApprox_32_63 = c7x::reinterpret<c7x::uint_vec>(
162 __permute_odd_odd_int(MATHLIB_vperm_data_0_63, c7x::as_uchar_vec(inVecReciprocalApprox_8_15),
163 c7x::as_uchar_vec(inVecReciprocalApprox_0_7)));
165 N = c7x::convert<c7x::int_vec>(((inVecReciprocalApprox_32_63 << 1) >> 21) - 1023);
168 NVals_odd = __high_int_to_double(N);
169 NVals_even = __low_int_to_double(N);
170 NVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(
171 MATHLIB_vperm_data_dp_interweave_0_63, c7x::as_uchar_vec(NVals_odd), c7x::as_uchar_vec(NVals_even)));
172 NVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
173 MATHLIB_vperm_data_dp_interweave_0_63, c7x::as_uchar_vec(NVals_odd), c7x::as_uchar_vec(NVals_even)));
186 TVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
187 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(upperBitsIndexT), c7x::as_uchar_vec(lowerBitsIndexT)));
188 TVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(
189 MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(upperBitsIndexT), c7x::as_uchar_vec(lowerBitsIndexT)));
192 TVals_8_15 = TVals_8_15 - (ln2 * NVals_8_15);
193 TVals_0_7 = TVals_0_7 - (ln2 * NVals_0_7);
200 outVec_0_7 = rVals_0_7 + TVals_0_7;
201 outVec_8_15 = rVals_8_15 + TVals_8_15;
204 outVec = c7x::reinterpret<vec>(__permute_even_even_int(MATHLIB_vperm_data_0_63,
205 c7x::as_uchar_vec(__double_to_float(outVec_8_15)),
206 c7x::as_uchar_vec(__double_to_float(outVec_0_7))));
207 outVec = outVec + pol;
216 __vpred cmp_min = __cmp_le_pred(inVec, c7x::convert<vec>(zero));
217 outVec = __select(cmp_min, outVecMin, outVec);
222 __vpred cmp_max = __cmp_lt_pred(eMax, inVec);
223 outVec = __select(cmp_max, outVecMax, outVec);
225 __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
226 vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
227 __vstore_pred(tmp, addr, outVec);
template MATHLIB_STATUS MATHLIB_log< float >(size_t length, float *pSrc, float *pDst)
static void MATHLIB_log_vector(size_t length, T *restrict pSrc, T *restrict pDst)
MATHLIB_STATUS MATHLIB_log(size_t length, T *restrict pSrc, T *restrict pDst)
MATHLIB_STATUS MATHLIB_log_sp(size_t length, float *pSrc, float *pDst)
This function is the C interface for MATHLIB_log. Function accepts float pointers.
#define MATHLIB_LOGTABLE_OFFSET
static c7x::uint_vec MATHLIB_LUTReadLowerBits(vecType vecOffset)
This method reads bits 31-0 of LUT value at vecOffset.
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.