1 #ifndef COMMON_FFTLIB_UTILITY_H_
2 #define COMMON_FFTLIB_UTILITY_H_ 1
53 #if defined(__C7100__) || defined(__C7120__) || defined(__C7502__) || defined(__C7504__) || defined(__C7508__) || \
56 #if FFTLIB_DEBUGPRINT >= 1
91 static inline void FFTLIB_UTIL_mult(int64_t *ph, int64_t *pl, int64_t a, int64_t b);
103 *ph = ((((uint64_t) *pl) & 0x8000000000000000ULL) != 0ULL) ? (int64_t) 0xffffffffffffffffULL : (int64_t) 0ULL;
120 class FFTLIB_int128_t {
124 FFTLIB_int128_t(int64_t h, int64_t l);
125 FFTLIB_int128_t(int64_t l);
127 FFTLIB_int128_t operator+(
const FFTLIB_int128_t &)
const;
128 FFTLIB_int128_t operator>>(
const int8_t &)
const;
132 inline FFTLIB_int128_t::FFTLIB_int128_t(int64_t h, int64_t l)
139 inline FFTLIB_int128_t::FFTLIB_int128_t(int64_t l)
142 hi = (((uint64_t) l & 0x8000000000000000ULL) != 0LL) ? (int64_t) 0xffffffffffffffffULL
143 : (int64_t) 0x0000000000000000ULL;
148 inline FFTLIB_int128_t::FFTLIB_int128_t()
150 hi = 0x0000000000000000LL;
151 lo = 0x0000000000000000LL;
154 static inline void FFTLIB_UTIL_shiftRight128(uint64_t *rh,
167 for (i = 0; i < sh; i++) {
168 l = __shift_right(l, (uint32_t) 1) | __shift_left(h, (uint32_t) 63);
169 h = __shift_right(h, (uint32_t) 1) | ((s != 0) ? (h & 0x8000000000000000ULL) : 0ULL);
176 static inline void FFTLIB_UTIL_Add128(uint64_t *rh,
199 all = __shift_right(al, (uint32_t) 0) & 0x0ffffffffULL;
200 alh = __shift_right(al, (uint32_t) 32) & 0x0ffffffffULL;
201 ahl = __shift_right(ah, (uint32_t) 0) & 0x0ffffffffULL;
202 ahh = __shift_right(ah, (uint32_t) 32) & 0x0ffffffffULL;
204 bll = __shift_right(bl, (uint32_t) 0) & 0x0ffffffffULL;
205 blh = __shift_right(bl, (uint32_t) 32) & 0x0ffffffffULL;
206 bhl = __shift_right(bh, (uint32_t) 0) & 0x0ffffffffULL;
207 bhh = __shift_right(bh, (uint32_t) 32) & 0x0ffffffffULL;
211 s1 = alh + blh + __shift_right(s0, (uint32_t) 32);
212 s2 = ahl + bhl + __shift_right(s1, (uint32_t) 32);
213 s3 = ahh + bhh + __shift_right(s2, (uint32_t) 32);
216 sl = __shift_left(s1, (uint32_t) 32) | (s0 & 0x0ffffffffULL);
217 sh = __shift_left(s3, (uint32_t) 32) | (s2 & 0x0ffffffffULL);
224 inline FFTLIB_int128_t FFTLIB_int128_t::operator+(
const FFTLIB_int128_t &b)
const
226 FFTLIB_int128_t result;
228 FFTLIB_UTIL_Add128((uint64_t *) &(result.hi), (uint64_t *) &(result.lo), this->hi, this->lo, b.hi, b.lo);
234 inline FFTLIB_int128_t FFTLIB_int128_t::operator>>(
const int8_t &shift)
const
236 FFTLIB_int128_t result;
238 FFTLIB_UTIL_shiftRight128((uint64_t *) &result.hi, (uint64_t *) &result.lo, this->hi, this->lo, (int32_t) shift, 1);
252 static inline int16_t FFTLIB_UTIL_negate(int16_t a)
256 result = (a == -32768) ? 32767 : -a;
260 static inline int32_t FFTLIB_UTIL_negate(int32_t a)
264 result = (a == -2147483648) ? 2147483647 : -a;
274 static inline int32_t
FFTLIB_UTIL_mult(int8_t a, int8_t b) {
return (int16_t) a * (int16_t) b; }
276 static inline int32_t
FFTLIB_UTIL_mult(uint8_t a, int8_t b) {
return (int16_t) a * (int16_t) b; }
278 static inline int64_t
FFTLIB_UTIL_mult(int16_t a, int16_t b) {
return (int32_t) a * (int32_t) b; }
280 static inline int64_t
FFTLIB_UTIL_mult(uint16_t a, int16_t b) {
return (int32_t) a * (int32_t) b; }
284 FFTLIB_int128_t result(0, 0);
286 result.lo = (int64_t) a * (int64_t) b;
289 (((uint64_t) result.lo & 0x8000000000000000ULL) != 0LL) ? (int64_t) 0xffffffffffffffffULL : (int64_t) 0ULL;
300 static inline void FFTLIB_UTIL_saturate_relu(int32_t x, int8_t *y)
315 static inline void FFTLIB_UTIL_saturate_relu(int32_t x, uint8_t *y)
330 static inline void FFTLIB_UTIL_saturate_relu(uint32_t x, uint8_t *y)
342 static inline void FFTLIB_UTIL_saturate_relu(int64_t x, int16_t *y)
347 else if (x < 0x0000) {
357 static inline void FFTLIB_UTIL_saturate_relu(int64_t x, uint16_t *y)
362 else if (x < 0x0000) {
372 static inline void FFTLIB_UTIL_saturate_relu(uint64_t x, uint16_t *y)
390 template <
typename dataType,
typename returnType>
391 static inline returnType FFTLIB_UTIL_shiftRoundAndReLU(dataType inVal, uint8_t shift)
397 FFTLIB_UTIL_saturate_relu(inVal, &result);
406 temp = __shift_right(inVal, (shift - 1)) + 1;
407 temp = __shift_right(temp, 1);
408 FFTLIB_UTIL_saturate_relu(temp, &result);
414 template int8_t FFTLIB_UTIL_shiftRoundAndReLU<int32_t, int8_t>(int32_t inVal, uint8_t shift);
415 template int16_t FFTLIB_UTIL_shiftRoundAndReLU<int64_t, int16_t>(int64_t inVal, uint8_t shift);
420 template <>
inline uint8_t FFTLIB_UTIL_shiftRoundAndReLU<int32_t, uint8_t>(int32_t inVal, uint8_t shift)
426 FFTLIB_UTIL_saturate_relu(inVal, &result);
435 temp = __shift_right(inVal, (shift - 1)) + 1;
436 temp = __shift_right(temp, 1);
437 FFTLIB_UTIL_saturate_relu(temp, &result);
443 template <>
inline uint8_t FFTLIB_UTIL_shiftRoundAndReLU<uint32_t, uint8_t>(uint32_t inVal, uint8_t shift)
449 FFTLIB_UTIL_saturate_relu(inVal, &result);
458 uint32_t shift32_t = (uint32_t) shift;
459 temp = (inVal >> (shift32_t - (uint32_t) 1)) + 1;
461 FFTLIB_UTIL_saturate_relu(temp, &result);
467 template <>
inline uint16_t FFTLIB_UTIL_shiftRoundAndReLU<int64_t, uint16_t>(int64_t inVal, uint8_t shift)
473 FFTLIB_UTIL_saturate_relu(inVal, &result);
482 temp = __shift_right(inVal, (shift - 1)) + 1;
483 temp = __shift_right(temp, 1);
484 FFTLIB_UTIL_saturate_relu(temp, &result);
490 template <>
inline uint16_t FFTLIB_UTIL_shiftRoundAndReLU<uint64_t, uint16_t>(uint64_t inVal, uint8_t shift)
496 FFTLIB_UTIL_saturate_relu(inVal, &result);
500 uint32_t shift32_t = (uint32_t) shift;
501 temp = (inVal >> (shift32_t - (uint32_t) 1)) + 1;
503 FFTLIB_UTIL_saturate_relu(temp, &result);
515 static inline int8_t FFTLIB_UTIL_saturate(int32_t x)
521 else if (x < -0x80) {
530 static inline uint8_t FFTLIB_UTIL_saturate(uint32_t x)
537 retVal = (uint8_t) x;
542 static inline int16_t FFTLIB_UTIL_saturate(int64_t x)
548 else if (x < -0x8000) {
552 retVal = (int16_t) x;
557 static inline uint16_t FFTLIB_UTIL_saturate(uint64_t x)
564 retVal = (uint16_t) x;
569 static inline int32_t FFTLIB_UTIL_saturate(int64_t xh, int64_t xl)
574 if (((uint64_t) xh & 0x8000000000000000ULL) != 0LL) {
575 if (((~(uint64_t) xh & 0xFFFFFFFFFFFFFFFFULL) != 0LL) || ((~(uint64_t) xl & 0xFFFFFFFF80000000ULL) != 0LL)) {
576 retVal = ((int32_t) 0x80000000U);
579 retVal = (int32_t) xl;
582 else if (((uint64_t) xl & 0xFFFFFFFF80000000ULL) != 0LL) {
584 retVal = ((int32_t) 0x7FFFFFFFU);
587 retVal = (int32_t) xl;
592 static inline int32_t FFTLIB_UTIL_saturate(FFTLIB_int128_t x) {
return FFTLIB_UTIL_saturate(x.hi, x.lo); }
600 template <
typename dataType,
typename returnType>
601 inline returnType FFTLIB_UTIL_shiftAndRound(dataType inVal, uint8_t shift)
607 result = FFTLIB_UTIL_saturate(inVal);
612 temp = (__shift_right(inVal, (shift - 1)) + 1);
613 temp = __shift_right(temp, 1);
614 result = FFTLIB_UTIL_saturate(temp);
620 template int8_t FFTLIB_UTIL_shiftAndRound<int32_t, int8_t>(int32_t inVal, uint8_t shift);
621 template int16_t FFTLIB_UTIL_shiftAndRound<int64_t, int16_t>(int64_t inVal, uint8_t shift);
623 template <>
inline uint8_t FFTLIB_UTIL_shiftAndRound(uint32_t inVal, uint8_t shift)
629 result = FFTLIB_UTIL_saturate(inVal);
634 uint32_t shift32_t = (uint32_t) shift;
635 temp = (inVal >> (shift32_t - (uint32_t) 1)) + 1;
637 result = FFTLIB_UTIL_saturate(temp);
643 template <>
inline uint16_t FFTLIB_UTIL_shiftAndRound(uint64_t inVal, uint8_t shift)
649 result = FFTLIB_UTIL_saturate(inVal);
654 uint32_t shift32_t = (uint32_t) shift;
655 temp = (inVal >> (shift32_t - (uint32_t) 1)) + 1;
657 result = FFTLIB_UTIL_saturate(temp);
667 template <>
inline int32_t FFTLIB_UTIL_shiftAndRound<FFTLIB_int128_t, int32_t>(FFTLIB_int128_t inVal, uint8_t shift)
673 result = FFTLIB_UTIL_saturate(inVal);
678 FFTLIB_int128_t temp;
680 FFTLIB_UTIL_shiftRight128((uint64_t *) &temp.hi, (uint64_t *) &temp.lo, inVal.hi, inVal.lo, (int32_t) (shift - 1),
684 FFTLIB_UTIL_shiftRight128((uint64_t *) &temp.hi, (uint64_t *) &temp.lo, temp.hi, temp.lo, 1, 1);
685 result = FFTLIB_UTIL_saturate(temp);
697 template <
typename returnType>
static inline returnType FFTLIB_UTIL_typeConv_i64f_oxX(
FFTLIB_D64 x)
699 int64_t xLocal, maxValue;
700 returnType returnValue;
707 maxValue = ((int64_t) ((uint32_t) 1 << ((uint32_t) (
sizeof(returnType) * 8 - 2)))) - 1;
708 maxValue += (int64_t) ((uint32_t) 1 << ((uint32_t) (
sizeof(returnType) * 8 - 2)));
710 xLocal = (int64_t) floor(0.5 + x);
711 if (xLocal >= maxValue) {
712 returnValue = (returnType) maxValue;
714 else if (xLocal <= -maxValue - 1) {
715 returnValue = (returnType) (-maxValue - 1);
718 returnValue = (returnType) xLocal;
723 template int16_t FFTLIB_UTIL_typeConv_i64f_oxX<int16_t>(
FFTLIB_D64 x);
724 template int32_t FFTLIB_UTIL_typeConv_i64f_oxX<int32_t>(
FFTLIB_D64 x);
731 template <
typename returnType>
static returnType FFTLIB_UTIL_cos_i64f_oxX(
FFTLIB_D64 x,
FFTLIB_D64 scaleFactor)
733 return FFTLIB_UTIL_typeConv_i64f_oxX<returnType>(scaleFactor * cos(x));
743 template <
typename returnType>
static inline returnType FFTLIB_UTIL_sin_i64f_oxX(
FFTLIB_D64 x,
FFTLIB_D64 scaleFactor)
745 return FFTLIB_UTIL_typeConv_i64f_oxX<returnType>(scaleFactor * sin(x));
File to hold buffer parameter related info for FFTLIB.
File to hold common structure, enums, macros and functions for FFTLIB.
double FFTLIB_D64
Double precision floating point.
static void FFTLIB_UTIL_mult(int64_t *ph, int64_t *pl, int64_t a, int64_t b)