MATHLIB User Guide
MATHLIB_asinh.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  ******************************************************************************/
33 
34 #include "c7x_scalable.h"
35 #define ELEMENT_COUNT(x) c7x::element_count_of<x>::value
36 /* the type of data that 'type x data structure' (i.e. vecType) holds */
37 #define ELEMENT_TYPE(x) typename c7x::element_type_of<x>::type
38 
39 /******************************************************************************/
40 /* */
41 /* Includes */
42 /* */
43 /******************************************************************************/
44 
45 #include <cstddef>
46 #include <float.h>
47 
48 #include "MATHLIB_asinh_scalar.h"
49 #include "MATHLIB_ilut.h"
50 #include "MATHLIB_lut.h"
51 #include "MATHLIB_permute.h"
52 #include "MATHLIB_types.h"
53 #include "MATHLIB_utility.h"
54 
55 /******************************************************************************/
56 /* */
57 /* MATHLIB_asinh */
58 /* */
59 /******************************************************************************/
60 
61 // this method performs iterative scalar asinh computation
62 // this method computes the logarithm expressions in asinh_log sub-kernel
63 template <typename vecType> static inline vecType log_asinh_i(vecType inVec)
64 {
65  /**********************************************************************/
66  /* Create and assign values for constants employed on log computation */
67  /**********************************************************************/
68 
69  vecType C1, C2, C3, C4, C5, eMax, outVecMax;
70  c7x::double_vec ln2;
71  c7x::uint_vec zero;
72  zero = (c7x::uint_vec) 0;
73 
74  ln2 = (c7x::double_vec) 0.693147180559945;
75  C1 = (vecType) -0.2302894f;
76  C2 = (vecType) 0.1908169f;
77  C3 = (vecType) -0.2505905f;
78  C4 = (vecType) 0.3333164f;
79  C5 = (vecType) -0.5000002f;
80  eMax = (vecType) 3.402823466e+38f;
81  outVecMax = (vecType) 88.72283905313f;
82 
83  /**********************************************************************/
84  /* Create variables employed on log computation */
85  /**********************************************************************/
86 
87  vecType pol, r1, r2, r3, r4, outVec;
88  c7x::double_vec inVecVals_odd, inVecVals_even, inVecVals_oddReciprocal, inVecVals_evenReciprocal,
89  inVecReciprocalApprox_8_15, inVecReciprocalApprox_0_7, inVecVals_8_15, inVecVals_0_7, rVals_0_7, rVals_8_15,
90  TVals_8_15, TVals_0_7, NVals_odd, NVals_even, NVals_0_7, NVals_8_15, pol_0_7, pol_8_15, outVec_8_15, outVec_0_7;
91  c7x::uint_vec inVecReciprocal_32_63, inVecReciprocalClr_32_63, inVecReciprocalApprox_32_63, indexT, upperBitsIndexT,
92  lowerBitsIndexT;
93  c7x::int_vec N;
94 
95  /**********************************************************************/
96  /* Calculate Taylor series approximation for log */
97  /**********************************************************************/
98 
99  // Split vectors to compute r with double precision
100  inVecVals_odd = __high_float_to_double(inVec);
101  inVecVals_even = __low_float_to_double(inVec);
102  inVecVals_oddReciprocal = __recip(inVecVals_odd);
103  inVecVals_evenReciprocal = __recip(inVecVals_even);
104 
105  // Create floating point reciprocal approximation
106  // Upper 32 bits of all inVec reciprocal values
107  inVecReciprocal_32_63 = c7x::reinterpret<c7x::uint_vec>(__permute_odd_odd_int(
108  MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(inVecVals_oddReciprocal),
109  c7x::as_uchar_vec(inVecVals_evenReciprocal)));
110 
111  // Clear bits 0-16 inclusive
112  inVecReciprocalClr_32_63 = inVecReciprocal_32_63 & 0xFFFE0000u;
113 
114  // Concatenate cleared bit reciprocal with zero bits
115  inVecReciprocalApprox_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
116  MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(inVecReciprocalClr_32_63),
117  c7x::as_uchar_vec(zero)));
118  inVecReciprocalApprox_0_7 = c7x::reinterpret<c7x::double_vec>(
119  __permute_low_low(MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(inVecReciprocalClr_32_63),
120  c7x::as_uchar_vec(zero)));
121 
122  // Split inVec into two vectors with double precision
123  inVecVals_0_7 = c7x::reinterpret<c7x::double_vec>(
124  __permute_low_low(MATHLIB_vperm_data_dp_interweave_0_63, c7x::as_uchar_vec(inVecVals_odd),
125  c7x::as_uchar_vec(inVecVals_even)));
126  inVecVals_8_15 = c7x::reinterpret<c7x::double_vec>(
127  __permute_high_high(MATHLIB_vperm_data_dp_interweave_0_63, c7x::as_uchar_vec(inVecVals_odd),
128  c7x::as_uchar_vec(inVecVals_even)));
129 
130  // Calculate r in double precision
131  rVals_0_7 = (inVecReciprocalApprox_0_7 * inVecVals_0_7) - 1.0;
132  rVals_8_15 = (inVecReciprocalApprox_8_15 * inVecVals_8_15) - 1.0;
133 
134  // Convert r to float, compute r to the power of 2, 3, 4
135  r1 = c7x::reinterpret<vecType>(
136  __permute_even_even_int(MATHLIB_vperm_data_0_63, c7x::as_uchar_vec(__double_to_float(rVals_8_15)),
137  c7x::as_uchar_vec(__double_to_float(rVals_0_7))));
138  r2 = r1 * r1;
139  r3 = r1 * r2;
140  r4 = r2 * r2;
141 
142  // Compute Taylor series polynomial
143  pol = (C5 * r2) + ((C4 * r3) + ((((C2 * r1) + C3) + (C1 * r2)) * r4));
144 
145  /**********************************************************************/
146  /* Calculate N */
147  /**********************************************************************/
148 
149  // Upper 32 bits of all inVec reciprocal approximation values
150  inVecReciprocalApprox_32_63 = c7x::reinterpret<c7x::uint_vec>(
151  __permute_odd_odd_int(MATHLIB_vperm_data_0_63, c7x::as_uchar_vec(inVecReciprocalApprox_8_15),
152  c7x::as_uchar_vec(inVecReciprocalApprox_0_7)));
153 
154  N = c7x::convert<c7x::int_vec>(((inVecReciprocalApprox_32_63 << 1) >> 21) - 1023);
155 
156  // Covert N to double precision for later calculation with LUT values
157  NVals_odd = __high_int_to_double(N);
158  NVals_even = __low_int_to_double(N);
159  NVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(MATHLIB_vperm_data_dp_interweave_0_63,
160  c7x::as_uchar_vec(NVals_odd),
161  c7x::as_uchar_vec(NVals_even)));
162  NVals_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(MATHLIB_vperm_data_dp_interweave_0_63,
163  c7x::as_uchar_vec(NVals_odd),
164  c7x::as_uchar_vec(NVals_even)));
165 
166  /**********************************************************************/
167  /* Determine LUT values */
168  /**********************************************************************/
169 
170  // Calculate LUT index
171  indexT = (((inVecReciprocalApprox_32_63 << 12) >> 29) + MATHLIB_LOGTABLE_OFFSET);
172 
173  // Read from LUT and reconstruct double values split into two vectors
174  // Read values from LUT or ILUT and convert and store as doubles in split vectors
175  upperBitsIndexT = MATHLIB_ILUTReadUpperBits(indexT);
176  lowerBitsIndexT = MATHLIB_ILUTReadLowerBits(indexT);
177 
178  TVals_8_15 = c7x::reinterpret<c7x::double_vec>(
179  __permute_high_high(MATHLIB_vperm_data_interweave_0_63, c7x::as_uchar_vec(upperBitsIndexT),
180  c7x::as_uchar_vec(lowerBitsIndexT)));
181  TVals_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(MATHLIB_vperm_data_interweave_0_63,
182  c7x::as_uchar_vec(upperBitsIndexT),
183  c7x::as_uchar_vec(lowerBitsIndexT)));
184 
185  // Calculate an adjusted T
186  TVals_8_15 = TVals_8_15 - (ln2 * NVals_8_15);
187  TVals_0_7 = TVals_0_7 - (ln2 * NVals_0_7);
188 
189  /**********************************************************************/
190  /* Calculate output with adjusted LUT and Taylor series values */
191  /**********************************************************************/
192 
193  // Split polynomial result into two vectors with double precision
194  pol_0_7 = c7x::reinterpret<c7x::double_vec>(__permute_low_low(
195  MATHLIB_vperm_data_dp_interweave_0_63, c7x::as_uchar_vec(__high_float_to_double(pol)),
196  c7x::as_uchar_vec(__low_float_to_double(pol))));
197  pol_8_15 = c7x::reinterpret<c7x::double_vec>(__permute_high_high(
198  MATHLIB_vperm_data_dp_interweave_0_63, c7x::as_uchar_vec(__high_float_to_double(pol)),
199  c7x::as_uchar_vec(__low_float_to_double(pol))));
200 
201  // Add LUT values and Taylor series values
202  outVec_0_7 = rVals_0_7 + TVals_0_7 + pol_0_7;
203  outVec_8_15 = rVals_8_15 + TVals_8_15 + pol_8_15;
204 
205  // Combine output vector into one floating point result
206  outVec = c7x::reinterpret<vecType>(__permute_even_even_int(
207  MATHLIB_vperm_data_0_63, c7x::as_uchar_vec(__double_to_float(outVec_8_15)),
208  c7x::as_uchar_vec(__double_to_float(outVec_0_7))));
209 
210  /**********************************************************************/
211  /* Bounds checking */
212  /**********************************************************************/
213 
214  // if (a > MAXe) {
215  // res = 709.7827f;
216  // }
217  __vpred cmp_max = __cmp_lt_pred(eMax, inVec);
218  outVec = __select(cmp_max, outVecMax, outVec);
219 
220  return outVec;
221 }
222 
223 // this method computes square root expressions in the asinh_sqrt sub-kernel
224 template <typename vecType> static inline vecType sqrt_asinh_i(vecType a, vecType x)
225 {
226 
227  /* // define type of elements vecType vector holds as elemType */
228  /* typedef ELEMENT_TYPE(vecType) elemType; */
229 
230  vecType half, OneP5;
231  /* vec zero, maxValue; */
232 
233  half = (vecType) 0.5;
234  OneP5 = (vecType) 1.5;
235  /* zero = (vecType) 0.0; */
236  /* maxValue = (vecType) std::numeric_limits<elemType>::max(); */
237 
238  vecType p0, p1, r0, d0, y;
239 
240  p0 = __recip_sqrt(a);
241  r0 = p0;
242  d0 = p0 * a;
243 
244  p1 = OneP5 - d0 * p0 * half;
245  y = a * r0 * p1;
246 
247  vecType x2 = x * x;
248 
249  // if input a is x^2, select x as output
250  __vpred cmp_xsqr = __cmp_eq_pred(a, x2);
251 
252  y = __select(cmp_xsqr, x, y);
253 
254  return y;
255 }
256 
257 // this method is 1 of 3 sub-kernels within asinh, computes sqrt expressions
258 template <typename T>
259 static inline void MATHLIB_asinh_sqrt(size_t length,
260  T *restrict pSrc,
261  T *restrict pDst,
262  __SE_TEMPLATE_v1 *se0Params,
263  __SA_TEMPLATE_v1 *sa0Params)
264 {
265  // variables
266  size_t numBlocks = 0; // compute loop's iteration count
267  size_t remNumBlocks = 0; // when numBlocks is not a multiple of SIMD width
268 
269  // derive c7x vector type from template typename
270  typedef typename c7x::make_full_vector<T>::type vec;
271 
272  numBlocks = length / c7x::element_count_of<vec>::value;
273  remNumBlocks = length % c7x::element_count_of<vec>::value;
274 
275  if (remNumBlocks) {
276  numBlocks++;
277  }
278 
279  // open SE0, SE1, and SA0 for reading and writing operands
280  MATHLIB_SE0SA0Open(se0Params, sa0Params, pSrc);
281 
282  vec one = (vec) 1.0;
283  vec half = (vec) 0.5;
284 
285  vec x_abs, x2, sqrt_;
286 
287  for (size_t i = 0; i < numBlocks; i++) {
288 
289  vec inVec_sqrt = c7x::strm_eng<0, vec>::get_adv();
290 
291  x2 = inVec_sqrt * inVec_sqrt;
292  x_abs = __abs(inVec_sqrt);
293 
294  sqrt_ = sqrt_asinh_i(x2 + one, x_abs); // sqrt(x^2 + 1)
295 
296  /* prevent overflow for large x, log(2x) where x > max/2 */
297  vec outVec_sqrt = (sqrt_ * half) + (x_abs * half); /* (x+sqrt(x^2 + 1))/2 */
298 
299  __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
300  vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
301  __vstore_pred(tmp, addr, outVec_sqrt);
302  }
303 
305 }
306 
307 // this method is 1 of 3 sub-kernels in asinh, computes log
308 template <typename T>
309 static inline void MATHLIB_asinh_log(size_t length,
310  T *restrict pSrc,
311  T *restrict pDst,
312  __SE_TEMPLATE_v1 *se0Params,
313  __SA_TEMPLATE_v1 *sa0Params)
314 {
315  // variables
316  size_t numBlocks = 0; // compute loop's iteration count
317  size_t remNumBlocks = 0; // when numBlocks is not a multiple of SIMD width
318 
319  // derive c7x vector type from template typename
320  typedef typename c7x::make_full_vector<T>::type vec;
321 
322  numBlocks = length / c7x::element_count_of<vec>::value;
323  remNumBlocks = length % c7x::element_count_of<vec>::value;
324 
325  if (remNumBlocks) {
326  numBlocks++;
327  }
328 
329  MATHLIB_SE0SA0Open(se0Params, sa0Params, pDst);
330 
331  vec ln2 = (vec) 0.69314718056;
332 
333  for (size_t i = 0; i < numBlocks; i++) {
334 
335  vec inVec_log = c7x::strm_eng<0, vec>::get_adv();
336 
337  vec outVec_log = log_asinh_i(inVec_log) + ln2;
338 
339  __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
340  vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
341  __vstore_pred(tmp, addr, outVec_log);
342  }
343 
345 }
346 
347 // this method is 1 of 3 sub-kernels in asinh, computes polynomial estimation
348 template <typename T>
349 static inline void MATHLIB_asinh_polyEst(size_t length,
350  T *restrict pSrc,
351  T *restrict pDst,
352  __SE_TEMPLATE_v1 *se0Params,
353  __SA_TEMPLATE_v1 *sa0Params)
354 {
355  // variables
356  size_t numBlocks = 0; // compute loop's iteration count
357  size_t remNumBlocks = 0; // when numBlocks is not a multiple of SIMD width
358 
359  // derive c7x vector type from template typename
360  typedef typename c7x::make_full_vector<T>::type vec;
361 
362  numBlocks = length / c7x::element_count_of<vec>::value;
363  remNumBlocks = length % c7x::element_count_of<vec>::value;
364 
365  if (remNumBlocks) {
366  numBlocks++;
367  }
368 
369  // open se0, se1, sa0
370  MATHLIB_SE0SE1SA0Open(se0Params, sa0Params, pDst, pSrc);
371 
372  vec c2, c4, c6;
373  vec pol_bound;
374 
375  vec zero = (vec) 0.0;
376 
377  c2 = (vec) -0.166605362341955;
378  c4 = (vec) 0.0734464812833510;
379  c6 = (vec) -0.0330279320352987;
380 
381  pol_bound = (vec) 0.5;
382 
383  for (size_t i = 0; i < numBlocks; i++) {
384  vec inVec_log = c7x::strm_eng<0, vec>::get_adv();
385  vec inVec = c7x::strm_eng<1, vec>::get_adv();
386 
387  vec sign = (vec) 1.0;
388 
389  __vpred cmp_sign = __cmp_lt_pred(inVec, zero);
390  sign = __select(cmp_sign, -sign, sign);
391 
392  // polynomial estimation
393  vec x2 = inVec * inVec;
394  vec x4 = x2 * x2;
395  vec x6 = x4 * x2;
396 
397  vec pol = (x2 * c2) + (x4 * c4) + (x6 * c6);
398  pol = (pol * inVec) + inVec;
399 
400  // give correct sign to log computation
401  vec res = inVec_log * sign;
402 
403  vec x_abs = __abs(inVec);
404 
405  __vpred cmp_bound = __cmp_le_pred(x_abs, pol_bound);
406  res = __select(cmp_bound, pol, res);
407 
408  vec outVec = res;
409 
410  __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
411  vec *addr = c7x::strm_agen<0, vec>::get_adv(pDst);
412  __vstore_pred(tmp, addr, outVec);
413  }
414 
416 }
417 
418 // this method incorporates 3 sub-kernels into vector asinh computation
419 template <typename T> static inline void MATHLIB_asinh_vector(size_t length, T *restrict pSrc, T *restrict pDst)
420 {
421  // variables
422  size_t numBlocks = 0; // compute loop's iteration count
423  size_t remNumBlocks = 0; // when numBlocks is not a multiple of SIMD width
424 
425  // derive c7x vector type from template typename
426  typedef typename c7x::make_full_vector<T>::type vec;
427 
428  numBlocks = length / c7x::element_count_of<vec>::value;
429  remNumBlocks = length % c7x::element_count_of<vec>::value;
430 
431  if (remNumBlocks) {
432  numBlocks++;
433  }
434 
435  __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1();
436  __SA_TEMPLATE_v1 sa0Params = __gen_SA_TEMPLATE_v1();
437 
438  MATHLIB_SE0SA01DSequentialInit(&se0Params, &sa0Params, length, pSrc, pDst);
439 
440  // sqrt setup
441  MATHLIB_asinh_sqrt(length, pSrc, pDst, &se0Params, &sa0Params);
442 
443  // log setup
444  MATHLIB_asinh_log(length, pSrc, pDst, &se0Params, &sa0Params);
445 
446  // polynomial estimation and bound check setup
447  MATHLIB_asinh_polyEst(length, pSrc, pDst, &se0Params, &sa0Params);
448 }
449 
450 // this method is top level module of asinh, deploys scalar or vector version
451 template <typename T> MATHLIB_STATUS MATHLIB_asinh(size_t length, T *restrict pSrc, T *restrict pDst)
452 {
453  MATHLIB_STATUS status = MATHLIB_SUCCESS; // return function status
454 
455  status = MATHLIB_checkParams(length, pSrc, pDst);
456 
457  if (status == MATHLIB_SUCCESS) {
458  MATHLIB_asinh_vector(length, pSrc, pDst);
459  }
460 
461  return status;
462 }
463 /******************************************************************************/
464 /* */
465 /* Explicit templatization for datatypes supported by MATHLIB_asinh */
466 /* */
467 /******************************************************************************/
468 
469 // single precision
470 template MATHLIB_STATUS MATHLIB_asinh<float>(size_t length, float *pSrc, float *pDst);
471 
472 /******************************************************************************/
473 /* */
474 /* C-interface wrapper functions */
475 /* */
476 /******************************************************************************/
477 
478 extern "C" {
479 
480 // single-precision wrapper
481 MATHLIB_STATUS MATHLIB_asinh_sp(size_t length, float *pSrc, float *pDst)
482 {
483  MATHLIB_STATUS status = MATHLIB_asinh(length, pSrc, pDst);
484  return status;
485 }
486 
487 } // extern "C"
static void MATHLIB_asinh_sqrt(size_t length, T *restrict pSrc, T *restrict pDst, __SE_TEMPLATE_v1 *se0Params, __SA_TEMPLATE_v1 *sa0Params)
MATHLIB_STATUS MATHLIB_asinh(size_t length, T *restrict pSrc, T *restrict pDst)
template MATHLIB_STATUS MATHLIB_asinh< float >(size_t length, float *pSrc, float *pDst)
static vecType sqrt_asinh_i(vecType a, vecType x)
static void MATHLIB_asinh_polyEst(size_t length, T *restrict pSrc, T *restrict pDst, __SE_TEMPLATE_v1 *se0Params, __SA_TEMPLATE_v1 *sa0Params)
static vecType log_asinh_i(vecType inVec)
static void MATHLIB_asinh_vector(size_t length, T *restrict pSrc, T *restrict pDst)
static void MATHLIB_asinh_log(size_t length, T *restrict pSrc, T *restrict pDst, __SE_TEMPLATE_v1 *se0Params, __SA_TEMPLATE_v1 *sa0Params)
MATHLIB_STATUS MATHLIB_asinh_sp(size_t length, float *pSrc, float *pDst)
This function is the C interface for MATHLIB_asinh. Function accepts float pointers.
static c7x::uint_vec MATHLIB_ILUTReadUpperBits(vecType indices)
This method reads bits 63-32 of LUT value at vecOffset.
Definition: MATHLIB_ilut.h:121
#define MATHLIB_LOGTABLE_OFFSET
Definition: MATHLIB_ilut.h:69
static c7x::uint_vec MATHLIB_ILUTReadLowerBits(vecType indices)
This method reads bits 31-0 of LUT value at vecOffset.
Definition: MATHLIB_ilut.h:145
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.
@ MATHLIB_SUCCESS