DSPLIB User Guide
DSPLIB_recip_ci.cpp
Go to the documentation of this file.
1 /******************************************************************************/
5 /* Copyright (C) 2017 Texas Instruments Incorporated - https://www.ti.com/
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in the
16  * documentation and/or other materials provided with the
17  * distribution.
18  *
19  * Neither the name of Texas Instruments Incorporated nor the names of
20  * its contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  *
35  ******************************************************************************/
36 
37 /*******************************************************************************
38  *
39  * INCLUDES
40  *
41  ******************************************************************************/
42 
43 #include "../common/c71/DSPLIB_inlines.h"
44 #include "DSPLIB_recip.h"
45 #include "DSPLIB_recip_priv.h"
46 #include "DSPLIB_types.h"
47 #include "c7x_scalable.h"
48 #include <cstdint>
49 #include <float.h>
50 
51 /*******************************************************************************
52  *
53  * DEFINES
54  *
55  ******************************************************************************/
56 #define SE_PARAM_BASE (0x0000)
57 #define SE_SE0_PARAM_OFFSET (SE_PARAM_BASE)
58 #define SE_SA0_PARAM_OFFSET (SE_SE0_PARAM_OFFSET + SE_PARAM_SIZE)
59 
60 // this method initializes the reciprocal kernel with appropriate parameters for floating point computations
61 template <typename dataType>
63  const DSPLIB_bufParams1D_t *bufParamsIn,
64  const DSPLIB_bufParams1D_t *bufParamsOut,
65  const DSPLIB_recip_InitArgs *pKerInitArgs)
66 {
68  DSPLIB_recip_PrivArgs *pKerPrivArgs = (DSPLIB_recip_PrivArgs *) handle;
69  uint32_t blockSize = pKerPrivArgs->blockSize;
70 
71  __SE_TEMPLATE_v1 se0Params;
72  __SA_TEMPLATE_v1 sa0Params;
73 
74  __SE_ELETYPE SE_ELETYPE;
75  __SE_VECLEN SE_VECLEN;
76  __SA_VECLEN SA_VECLEN;
77 
78  uint8_t *pBlock = pKerPrivArgs->bufPblock;
79 
80  typedef typename c7x::make_full_vector<dataType>::type vec;
81  SE_VECLEN = c7x::se_veclen<vec>::value;
82  SA_VECLEN = c7x::sa_veclen<vec>::value;
83  SE_ELETYPE = c7x::se_eletype<vec>::value;
84 
85 #if DSPLIB_DEBUGPRINT
86  int32_t eleCount = c7x::element_count_of<vec>::value;
87  printf("Enter eleCount %d\n", eleCount);
88 #endif
89 
90  /**********************************************************************/
91  /* Prepare streaming engine 1 to fetch the input */
92  /**********************************************************************/
93  se0Params = __gen_SE_TEMPLATE_v1();
94 
95  se0Params.ICNT0 = blockSize;
96  se0Params.ELETYPE = SE_ELETYPE;
97  se0Params.VECLEN = SE_VECLEN;
98  se0Params.DIMFMT = __SE_DIMFMT_1D;
99 
100  /**********************************************************************/
101  /* Prepare SA template to store output */
102  /**********************************************************************/
103  sa0Params = __gen_SA_TEMPLATE_v1();
104 
105  sa0Params.ICNT0 = blockSize;
106  sa0Params.DIM1 = blockSize;
107  sa0Params.VECLEN = SA_VECLEN;
108  sa0Params.DIMFMT = __SA_DIMFMT_1D;
109 
110  *(__SE_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE_SE0_PARAM_OFFSET) = se0Params;
111  *(__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE_SA0_PARAM_OFFSET) = sa0Params;
112 
113  return status;
114 }
115 
117  const DSPLIB_bufParams1D_t *bufParamsIn,
118  const DSPLIB_bufParams1D_t *bufParamsOut,
119  const DSPLIB_recip_InitArgs *pKerInitArgs);
120 
122  const DSPLIB_bufParams1D_t *bufParamsIn,
123  const DSPLIB_bufParams1D_t *bufParamsOut,
124  const DSPLIB_recip_InitArgs *pKerInitArgs);
125 
126 // this method initializes the reciprocal kernel with appropriate parameters for fixed point computations
127 template <>
129  const DSPLIB_bufParams1D_t *bufParamsIn,
130  const DSPLIB_bufParams1D_t *bufParamsOut,
131  const DSPLIB_recip_InitArgs *pKerInitArgs)
132 {
133  DSPLIB_STATUS status = DSPLIB_SUCCESS;
134  // setup se, sa parameters for fixed point
135  DSPLIB_recip_PrivArgs *pKerPrivArgs = (DSPLIB_recip_PrivArgs *) handle;
136  uint32_t blockSize = pKerPrivArgs->blockSize;
137 
138  __SE_TEMPLATE_v1 se0Params;
139  __SA_TEMPLATE_v1 sa0Params;
140 
141  __SE_ELETYPE SE_ELETYPE;
142  __SE_VECLEN SE_VECLEN;
143  __SA_VECLEN SA_VECLEN;
144  __SE_PROMOTE SE_PROMOTE;
145 
146  uint8_t *pBlock = pKerPrivArgs->bufPblock;
147 
148  typedef typename c7x::make_full_vector<int16_t>::type vec;
149  SE_VECLEN = c7x::se_veclen<c7x::int_vec>::value;
150  SA_VECLEN = c7x::sa_veclen<vec>::value;
151  SE_ELETYPE = c7x::se_eletype<vec>::value;
152  SE_PROMOTE = __SE_PROMOTE_2X_SIGNEXT;
153 
154 #if DSPLIB_DEBUGPRINT
155  int32_t eleCount = c7x::element_count_of<c7x::int_vec>::value;
156  printf("Enter eleCount %d\n", eleCount);
157 #endif
158 
159  // setup streaming engine 0 to fetch data
160  se0Params = __gen_SE_TEMPLATE_v1();
161 
162  se0Params.ICNT0 = blockSize;
163  se0Params.ELETYPE = SE_ELETYPE;
164  se0Params.VECLEN = SE_VECLEN;
165  se0Params.DIMFMT = __SE_DIMFMT_1D;
166  se0Params.PROMOTE = SE_PROMOTE;
167 
168  // setup streaming address 0,1 to store data
169  sa0Params = __gen_SA_TEMPLATE_v1();
170 
171  sa0Params.ICNT0 = blockSize;
172  sa0Params.DIM1 = blockSize;
173 
174  if (pKerPrivArgs->initArgs.storeStyle == DSPLIB_INTERLEAVE_ST) {
175  sa0Params.ICNT0 = 2 * blockSize;
176  sa0Params.DIM1 = 2 * blockSize;
177  }
178 
179  sa0Params.VECLEN = SA_VECLEN;
180  sa0Params.DIMFMT = __SA_DIMFMT_1D;
181 
182  *(__SE_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE_SE0_PARAM_OFFSET) = se0Params;
183  *(__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE_SA0_PARAM_OFFSET) = sa0Params;
184 
185  return status;
186 }
187 
188 // this method performs floating point reciprocal computations
189 template <typename dataType, int32_t dataIn>
190 DSPLIB_STATUS DSPLIB_recip_exec_ci(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut)
191 {
192  DSPLIB_recip_PrivArgs *pKerPrivArgs = (DSPLIB_recip_PrivArgs *) handle;
193  uint32_t blockSize = pKerPrivArgs->blockSize;
194 
195  __SE_TEMPLATE_v1 se0Params;
196  __SA_TEMPLATE_v1 sa0Params;
197 
198  dataType *restrict pInLocal = (dataType *) pIn;
199  dataType *restrict pOutLocal = (dataType *) pOut;
200 
201 #if DSPLIB_DEBUGPRINT
202  printf("Enter DSPLIB_recip_exec_ci\n");
203 #endif
204 
205  typedef typename c7x::make_full_vector<dataType>::type vec;
206  int32_t eleCount = c7x::element_count_of<vec>::value;
207 
208 #if DSPLIB_DEBUGPRINT
209  printf("Enter eleCount %d\n", eleCount);
210 #endif
211 
212  uint8_t *pBlock = pKerPrivArgs->bufPblock;
213 
214  se0Params = *(__SE_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE_SE0_PARAM_OFFSET);
215  sa0Params = *(__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE_SA0_PARAM_OFFSET);
216  // Input samples
217  __SE0_OPEN(pInLocal, se0Params);
218 
219  // Output samples
220  __SA0_OPEN(sa0Params);
221 
222 #if DSPLIB_DEBUGPRINT
223  printf("DSPLIB_DEBUGPRINT blockSize %d\n", blockSize);
224 #endif
225 
226  vec out;
227  vec Two;
228 
229  Two = (vec) 2.0;
230 
231  for (int32_t counter = 0; counter < blockSize; counter += eleCount) {
232  vec a = c7x::strm_eng<0, vec>::get_adv();
233 
234  vec d0, p0, p1;
235 
236  // Calculate reciprocal
237  p0 = __recip(a);
238  d0 = p0 * a;
239 
240  p1 = Two - d0;
241  out = p0 * p1;
242 
243  __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
244  vec *VB1 = c7x::strm_agen<0, vec>::get_adv(pOutLocal);
245 
246  __vstore_pred(tmp, VB1, out);
247  }
248  __SE0_CLOSE();
249  __SA0_CLOSE();
250 
251  return DSPLIB_SUCCESS;
252 }
253 
255 DSPLIB_recip_exec_ci<float, DSPLIB_FLOAT32>(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut);
256 
258 DSPLIB_recip_exec_ci<double, DSPLIB_FLOAT64>(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut);
259 
260 // this method performs fixed point reciprocal computations
261 template <>
263 DSPLIB_recip_exec_ci<int16_t, DSPLIB_INT16>(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut)
264 {
265 
266  DSPLIB_STATUS status = DSPLIB_SUCCESS;
267  DSPLIB_recip_PrivArgs *pKerPrivArgs = (DSPLIB_recip_PrivArgs *) handle;
268 
269  // setup iteration count, open streaming engine/address, etc.
270  uint32_t blockSize = pKerPrivArgs->blockSize;
271  DSPLIB_recip_storeStyle storeStyle = pKerPrivArgs->initArgs.storeStyle;
272 
273  __SE_TEMPLATE_v1 se0Params;
274  __SA_TEMPLATE_v1 sa0Params;
275 
276  int16_t *restrict pInLocal = (int16_t *) pIn;
277  int16_t *restrict pOutLocal = (int16_t *) pOut;
278 
279 #if DSPLIB_DEBUGPRINT
280  printf("Enter DSPLIB_recip_exec_ci\n");
281 #endif
282 
283  typedef typename c7x::make_full_vector<int16_t>::type vec;
284  int32_t eleCount = c7x::element_count_of<c7x::int_vec>::value;
285 
286 #if DSPLIB_DEBUGPRINT
287  printf("Enter eleCount %d\n", eleCount);
288 #endif
289 
290  uint8_t *pBlock = pKerPrivArgs->bufPblock;
291 
292  se0Params = *(__SE_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE_SE0_PARAM_OFFSET);
293  sa0Params = *(__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE_SA0_PARAM_OFFSET);
294  // Input samples
295  __SE0_OPEN(pInLocal, se0Params);
296 
297  // Output samples
298  __SA0_OPEN(sa0Params);
299 
300  c7x::int_vec zero = (c7x::int_vec) 0;
301  c7x::int_vec one = (c7x::int_vec) 1;
302  c7x::int_vec fifteen = (c7x::int_vec) 15;
303 
304  /* Horizontal stack implementation of fixed point store */
305  /* ========================================================== */
306  if (storeStyle == DSPLIB_HSTACK_ST) {
307 
308  /* Horizontal store uses one more SA for offset store */
309  __SA1_OPEN(sa0Params);
310 
311  // setup outerloop
312  for (int32_t counter = 0; counter < blockSize; counter += 2 * eleCount) {
313 
314  // place into 32b container vectors and do computation
315  c7x::int_vec a_hi = c7x::strm_eng<0, c7x::int_vec>::get_adv();
316  c7x::int_vec a_lo = c7x::strm_eng<0, c7x::int_vec>::get_adv();
317 
318  __vpred cmp_sign_hi = __cmp_gt_pred(zero, a_hi);
319  __vpred cmp_sign_lo = __cmp_gt_pred(zero, a_lo);
320 
321  // determine negate input
322  c7x::int_vec neg_hi = __select(cmp_sign_hi, one, zero);
323  c7x::int_vec neg_lo = __select(cmp_sign_lo, one, zero);
324 
325  a_hi = __select(cmp_sign_hi, -a_hi, a_hi);
326  a_lo = __select(cmp_sign_lo, -a_lo, a_lo);
327 
328  // normalize
329  c7x::int_vec norm_hi = __norm(a_hi);
330  c7x::int_vec norm_lo = __norm(a_lo);
331 
332  a_hi = a_hi << norm_hi;
333  a_lo = a_lo << norm_lo;
334 
335  // take only lower 16b from hi and lo (via permute) and store in rexp (16b vector)
336  c7x::int_vec exp_hi = norm_hi - fifteen;
337  c7x::int_vec exp_lo = norm_lo - fifteen;
338 
339  /* original implementation */
340  /* ================================================*/
341  // permute exp_hi and exp_lo into rexp
342  /* c7x::uchar_vec exp_hi_byte = c7x::reinterpret<c7x::uchar_vec>(exp_hi); */
343  /* c7x::uchar_vec exp_lo_byte = c7x::reinterpret<c7x::uchar_vec>(exp_lo); */
344 
345  /* c7x::uchar_vec permuteExp = __permute_even_even_short(DSPLIB_vperm_mask_hstack, exp_lo_byte, exp_hi_byte);
346  */
347 
348  // store rexp via sa0
349  /* vec rexp = c7x::reinterpret<vec>(permuteExp); */
350  /* =================================================*/
351 
352  __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
353  vec *VB1 = c7x::strm_agen<0, vec>::get_adv(pOutLocal);
354 
355  /* __vstore_pred(tmp, VB1, rexp); */
356 
357  __vstore_pred_packl_2src(tmp, VB1, exp_hi, exp_lo);
358  // set dividends
359  c7x::uint_vec ub_hi = (c7x::uint_vec) 0x80000000U;
360  c7x::uint_vec ub_lo = (c7x::uint_vec) 0x80000000U;
361 
362  c7x::uint_vec ua_hi = c7x::reinterpret<c7x::uint_vec>(a_hi);
363  c7x::uint_vec ua_lo = c7x::reinterpret<c7x::uint_vec>(a_lo);
364 
365  // setup inner loop and unroll it 15x
366 
367 #pragma UNROLL(15)
368  for (int32_t i = 0; i < 15; i++) {
369 
370  ub_hi = __sub_cond(ub_hi, ua_hi);
371  ub_lo = __sub_cond(ub_lo, ua_lo);
372  }
373 
374  c7x::uint_vec divMask = (c7x::uint_vec) 0x7FFF;
375 
376  ub_hi = ub_hi & divMask;
377  ub_lo = ub_lo & divMask;
378 
379  c7x::int_vec b_hi = c7x::reinterpret<c7x::int_vec>(ub_hi);
380  c7x::int_vec b_lo = c7x::reinterpret<c7x::int_vec>(ub_lo);
381 
382  __vpred cmp_neg_hi = __cmp_eq_pred(neg_hi, one);
383  __vpred cmp_neg_lo = __cmp_eq_pred(neg_lo, one);
384 
385  b_hi = __select(cmp_neg_hi, -b_hi, b_hi);
386  b_lo = __select(cmp_neg_lo, -b_lo, b_lo);
387 
388  // store frac
389  /* c7x::uchar_vec b_hi_byte = c7x::reinterpret<c7x::uchar_vec>(b_hi); */
390  /* c7x::uchar_vec b_lo_byte = c7x::reinterpret<c7x::uchar_vec>(b_lo); */
391 
392  /* c7x::uchar_vec permuteFrac = __permute_even_even_short(DSPLIB_vperm_mask_hstack, b_lo_byte, b_hi_byte); */
393 
394  /* vec rFrac = c7x::reinterpret<vec>(permuteFrac); */
395 
396  tmp = c7x::strm_agen<1, vec>::get_vpred();
397  VB1 = c7x::strm_agen<1, vec>::get_adv(pOutLocal + blockSize);
398 
399  /* __vstore_pred(tmp, VB1, rFrac); */
400  __vstore_pred_packl_2src(tmp, VB1, b_hi, b_lo);
401  }
402 
403  __SA1_CLOSE();
404  }
405 
406  /* Interleaved implementation of fixed point store */
407  /* ========================================================== */
408  else if (storeStyle == DSPLIB_INTERLEAVE_ST) {
409 
410  for (int32_t counter = 0; counter < blockSize; counter += eleCount) {
411 
412  // grab values as 32b integers
413  c7x::int_vec a = c7x::strm_eng<0, c7x::int_vec>::get_adv();
414 
415  __vpred cmp_sign = __cmp_gt_pred(zero, a);
416 
417  // determine negate input
418  c7x::int_vec neg = __select(cmp_sign, one, zero);
419 
420  a = __select(cmp_sign, -a, a);
421 
422  // normalize
423  c7x::int_vec norm = __norm(a);
424 
425  a = a << norm;
426 
427  // take only lower 16b (via permute) and store in rexp (16b vector)
428  c7x::int_vec expVec = norm - fifteen;
429  /* c7x::uchar_vec exp_byte = c7x::reinterpret<c7x::uchar_vec>(expVec); */
430 
431  // set dividends
432  c7x::uint_vec ub = (c7x::uint_vec) 0x80000000U;
433  c7x::uint_vec ua = c7x::reinterpret<c7x::uint_vec>(a);
434 
435  // setup inner loop and unroll it 15x
436 #pragma UNROLL(15)
437  for (int32_t i = 0; i < 15; i++) {
438 
439  ub = __sub_cond(ub, ua);
440  }
441 
442  c7x::uint_vec divMask = (c7x::uint_vec) 0x7FFF;
443 
444  ub = ub & divMask;
445 
446  c7x::int_vec b = c7x::reinterpret<c7x::int_vec>(ub);
447 
448  __vpred cmp_neg = __cmp_eq_pred(neg, one);
449 
450  b = __select(cmp_neg, -b, b);
451 
452  // store exp and frac
453  /* c7x::uchar_vec frac_byte = c7x::reinterpret<c7x::uchar_vec>(b); */
454 
455  /* c7x::uchar_vec permuteExpFrac = __permute_even_even_short(DSPLIB_vperm_mask_interleave, frac_byte,
456  * exp_byte); */
457 
458  /* vec rExpFrac = c7x::reinterpret<vec>(permuteExpFrac); */
459 
460  vec exp_short = c7x::reinterpret<vec>(expVec);
461  vec frac_short = c7x::reinterpret<vec>(b);
462 
463  __vpred tmp = c7x::strm_agen<0, vec>::get_vpred();
464  vec *VB1 = c7x::strm_agen<0, vec>::get_adv(pOutLocal);
465 
466  /* __vstore_pred(tmp, VB1, rExpFrac); */
467  __vstore_pred_interleave(tmp, VB1, exp_short, frac_short);
468  }
469  }
470 
471  /* not implemented store method for fixed point */
472  else {
474  }
475  // close se, sa, etc.
476  __SE0_CLOSE();
477  __SA0_CLOSE();
478 
479  return status;
480 }
template DSPLIB_STATUS DSPLIB_recip_exec_ci< double, DSPLIB_FLOAT64 >(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut)
DSPLIB_STATUS DSPLIB_recip_init_ci< int16_t >(DSPLIB_kernelHandle handle, const DSPLIB_bufParams1D_t *bufParamsIn, const DSPLIB_bufParams1D_t *bufParamsOut, const DSPLIB_recip_InitArgs *pKerInitArgs)
#define SE_SE0_PARAM_OFFSET
DSPLIB_STATUS DSPLIB_recip_init_ci(DSPLIB_kernelHandle handle, const DSPLIB_bufParams1D_t *bufParamsIn, const DSPLIB_bufParams1D_t *bufParamsOut, const DSPLIB_recip_InitArgs *pKerInitArgs)
This function is the initialization function for the C7x implementation of the kernel....
template DSPLIB_STATUS DSPLIB_recip_exec_ci< float, DSPLIB_FLOAT32 >(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut)
DSPLIB_STATUS DSPLIB_recip_exec_ci(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut)
This function is the main execution function for the C7x implementation of the kernel....
template DSPLIB_STATUS DSPLIB_recip_init_ci< float >(DSPLIB_kernelHandle handle, const DSPLIB_bufParams1D_t *bufParamsIn, const DSPLIB_bufParams1D_t *bufParamsOut, const DSPLIB_recip_InitArgs *pKerInitArgs)
template DSPLIB_STATUS DSPLIB_recip_init_ci< double >(DSPLIB_kernelHandle handle, const DSPLIB_bufParams1D_t *bufParamsIn, const DSPLIB_bufParams1D_t *bufParamsOut, const DSPLIB_recip_InitArgs *pKerInitArgs)
DSPLIB_STATUS DSPLIB_recip_exec_ci< int16_t, DSPLIB_INT16 >(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pOut)
#define SE_SA0_PARAM_OFFSET
Header file for kernel's internal use. For the kernel's interface, please see DSPLIB_recip.
DSPLIB_STATUS_NAME
The enumeration of all status codes.
Definition: DSPLIB_types.h:151
void * DSPLIB_kernelHandle
Handle type for DSPLIB operations.
Definition: DSPLIB_types.h:172
@ DSPLIB_SUCCESS
Definition: DSPLIB_types.h:152
@ DSPLIB_ERR_NOT_IMPLEMENTED
Definition: DSPLIB_types.h:158
DSPLIB_recip_storeStyle
enumeration to determine store style of the fixed point
Definition: DSPLIB_recip.h:106
@ DSPLIB_HSTACK_ST
input is fixed point, store pattern is horizontal stack.
Definition: DSPLIB_recip.h:112
@ DSPLIB_INTERLEAVE_ST
input is fixed point, store pattern is interleaved.
Definition: DSPLIB_recip.h:115
A structure for a 1 dimensional buffer descriptor.
Structure containing the parameters to initialize the kernel.
Definition: DSPLIB_recip.h:120
DSPLIB_recip_storeStyle storeStyle
Fixed Point Output Store Style
Definition: DSPLIB_recip.h:126
Structure that is reserved for internal use by the kernel.
int32_t blockSize
Size of input buffer for different batches DSPLIB_recip_init that will be retrieved and used by DSPLI...
uint8_t bufPblock[DSPLIB_RECIP_IXX_IXX_OXX_PBLOCK_SIZE]
DSPLIB_recip_InitArgs initArgs