1 #ifndef COMMON_MMALIB_UTILITY_H_
2 #define COMMON_MMALIB_UTILITY_H_ 1
54 #include "c71/MMALIB_utility.h"
55 #if MMALIB_DEBUGPRINT >= 1
56 #include "c71/MMALIB_debug.h"
86 static inline void MMALIB_UTIL_mult(int64_t *ph, int64_t *pl, int64_t a, int64_t b);
97 *ph = ((((uint64_t)*pl) & 0x8000000000000000ULL) != 0ULL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
111 static inline int16_t MMALIB_UTIL_negate(int16_t a)
115 result = (a == -32768) ? 32767 : -a;
119 static inline int32_t MMALIB_UTIL_negate(int32_t a)
123 result = (a == -2147483648) ? 2147483647 : -a;
135 return (uint16_t)a * (uint16_t)b;
140 return (int16_t)a * (int16_t)b;
145 return (int16_t)a * (int16_t)b;
150 return (int16_t)a * (int16_t)b;
155 return (uint32_t)a * (uint32_t)b;
160 return (int32_t)a * (int32_t)b;
165 return (int32_t)a * (int32_t)b;
170 return (int32_t)a * (int32_t)b;
176 MMALIB_int128_t result(0,0);
178 result.lo = (int64_t)a * (int64_t)b ;
180 result.hi = (int64_t)0ULL ;
187 MMALIB_int128_t result(0,0);
189 result.lo = (int64_t)a * (int64_t)b ;
191 result.hi = (((uint64_t)result.lo & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
198 MMALIB_int128_t result(0,0);
200 result.lo = (int64_t)a * (int64_t)b ;
202 result.hi = (((uint64_t)result.lo & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
209 MMALIB_int128_t result(0,0);
211 result.lo = (int64_t)a * (int64_t)b ;
213 result.hi = (((uint64_t)result.lo & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
224 static inline void MMALIB_UTIL_shift_saturate_relu(int32_t x, uint8_t shift, int8_t *y)
232 xVal = __shift_right(xVal, (shift - 1)) + 1;
233 xVal = __shift_right(xVal, 1);
238 }
else if (xVal < 0) {
247 static inline void MMALIB_UTIL_shift_saturate_relu(int32_t x, uint8_t shift, uint8_t *y)
255 xVal = __shift_right(xVal, (shift - 1)) + 1;
256 xVal = __shift_right(xVal, 1);
261 }
else if (xVal < 0) {
270 static inline void MMALIB_UTIL_shift_saturate_relu(int64_t x, uint8_t shift, int16_t *y)
275 xVal = __shift_right(xVal, (shift - 1)) + 1;
276 xVal = __shift_right(xVal, 1);
281 }
else if (xVal < 0x0000) {
290 static inline void MMALIB_UTIL_shift_saturate_relu(int64_t x, uint8_t shift, uint16_t *y)
295 xVal = __shift_right(xVal, (shift - 1)) + 1;
296 xVal = __shift_right(xVal, 1);
302 }
else if (xVal < 0x0000) {
311 static inline void MMALIB_UTIL_shift_saturate_relu(uint64_t x, uint8_t shift, uint16_t *y)
315 uint32_t shift32_t = (uint32_t) shift;
318 xVal = (xVal >> (shift32_t - (uint32_t)1) ) + 1;
337 static inline void MMALIB_UTIL_saturate_relu(int32_t x, int8_t *y)
350 static inline void MMALIB_UTIL_saturate_relu(int32_t x, uint8_t *y)
363 static inline void MMALIB_UTIL_saturate_relu(uint32_t x, uint8_t *y)
374 static inline void MMALIB_UTIL_saturate_relu(int64_t x, int16_t *y)
378 }
else if (x < 0x0000) {
387 static inline void MMALIB_UTIL_saturate_relu(int64_t x, uint16_t *y)
391 }
else if (x < 0x0000) {
400 static inline void MMALIB_UTIL_saturate_relu(uint64_t x, uint16_t *y)
411 static inline int32_t MMALIB_UTIL_saturate_relu(int64_t xh, int64_t xl)
416 if(((uint64_t)xh & 0x8000000000000000ULL) != 0LL){
417 if( ((~(uint64_t)xh & 0xFFFFFFFFFFFFFFFFULL) != 0LL) || ((~(uint64_t)xl & 0xFFFFFFFF80000000ULL) != 0LL)){
418 retVal = ((int32_t)0x80000000U);
420 retVal = (int32_t)xl;
422 }
else if (((uint64_t)xl & 0xFFFFFFFF80000000ULL) != 0LL){
424 retVal = ((int32_t)0x7FFFFFFFU);
426 retVal = (int32_t)xl;
431 static inline int32_t MMALIB_UTIL_saturate_relu(MMALIB_int128_t x, int32_t *y)
433 return MMALIB_UTIL_saturate_relu(x.hi, int64_t(0));
442 template <
typename dataType,
typename returnType>
443 static inline returnType MMALIB_UTIL_shiftRoundAndReLU(dataType inVal, uint8_t shift){
448 MMALIB_UTIL_saturate_relu(inVal, &result);
456 temp = __shift_right(inVal, (shift - 1)) + 1;
457 temp = __shift_right(temp, 1);
458 MMALIB_UTIL_saturate_relu(temp, &result);
472 inline uint8_t MMALIB_UTIL_shiftRoundAndReLU<int32_t, uint8_t>(int32_t inVal, uint8_t shift){
477 MMALIB_UTIL_saturate_relu(inVal, &result);
485 temp = __shift_right( inVal, (shift - 1) ) + 1;
486 temp = __shift_right(temp, 1);
487 MMALIB_UTIL_saturate_relu(temp, &result);
495 inline uint8_t MMALIB_UTIL_shiftRoundAndReLU<uint32_t, uint8_t>(uint32_t inVal, uint8_t shift){
500 MMALIB_UTIL_saturate_relu(inVal, &result);
508 uint32_t shift32_t = (uint32_t) shift;
509 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
511 MMALIB_UTIL_saturate_relu(temp, &result);
518 inline uint16_t MMALIB_UTIL_shiftRoundAndReLU<int64_t, uint16_t>(int64_t inVal, uint8_t shift){
523 MMALIB_UTIL_saturate_relu(inVal, &result);
531 temp = __shift_right( inVal, (shift - 1) ) + 1;
532 temp = __shift_right(temp, 1);
533 MMALIB_UTIL_saturate_relu(temp, &result);
540 inline uint16_t MMALIB_UTIL_shiftRoundAndReLU<uint64_t, uint16_t>(uint64_t inVal, uint8_t shift){
545 MMALIB_UTIL_saturate_relu(inVal, &result);
548 uint32_t shift32_t = (uint32_t) shift;
549 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
551 MMALIB_UTIL_saturate_relu(temp, &result);
558 inline int32_t MMALIB_UTIL_shiftRoundAndReLU<MMALIB_int128_t, int32_t>(MMALIB_int128_t inVal, uint8_t shift){
563 result = MMALIB_UTIL_saturate_relu(inVal, &result);
567 MMALIB_int128_t temp;
569 MMALIB_UTIL_shiftRight128((uint64_t *)&temp.hi, (uint64_t *)&temp.lo, inVal.hi, inVal.lo, (int32_t)(shift - 1), 1);
572 MMALIB_UTIL_shiftRight128((uint64_t *)&temp.hi, (uint64_t *)&temp.lo, temp.hi, temp.lo, 1, 1);
573 MMALIB_UTIL_saturate_relu(temp, &result);
586 static inline int8_t MMALIB_UTIL_saturate(int32_t x)
591 }
else if (x < -0x80) {
599 static inline uint8_t MMALIB_UTIL_saturate(uint32_t x)
610 static inline int16_t MMALIB_UTIL_saturate(int64_t x)
615 }
else if (x < -0x8000) {
623 static inline uint16_t MMALIB_UTIL_saturate(uint64_t x)
629 retVal = (uint16_t)x;
634 static inline int32_t MMALIB_UTIL_saturate(int64_t xh, int64_t xl)
639 if(((uint64_t)xh & 0x8000000000000000ULL) != 0LL){
640 if( ((~(uint64_t)xh & 0xFFFFFFFFFFFFFFFFULL) != 0LL) || ((~(uint64_t)xl & 0xFFFFFFFF80000000ULL) != 0LL)){
641 retVal = ((int32_t)0x80000000U);
643 retVal = (int32_t)xl;
645 }
else if (((uint64_t)xl & 0xFFFFFFFF80000000ULL) != 0LL){
647 retVal = ((int32_t)0x7FFFFFFFU);
649 retVal = (int32_t)xl;
654 static inline int32_t MMALIB_UTIL_saturate(MMALIB_int128_t x)
656 return MMALIB_UTIL_saturate(x.hi, x.lo);
665 template <
typename dataType,
typename returnType>
666 inline returnType MMALIB_UTIL_shiftAndRound(dataType inVal, uint8_t shift){
671 result = MMALIB_UTIL_saturate(inVal);
675 temp = (__shift_right(inVal, (shift - 1)) + 1);
676 temp = __shift_right(temp , 1);
677 result = MMALIB_UTIL_saturate(temp);
689 template int8_t MMALIB_UTIL_shiftAndRound<int32_t, int8_t> (int32_t inVal, uint8_t shift);
690 template int16_t MMALIB_UTIL_shiftAndRound<int64_t, int16_t> (int64_t inVal, uint8_t shift);
694 inline uint8_t MMALIB_UTIL_shiftAndRound(uint32_t inVal, uint8_t shift){
699 result = MMALIB_UTIL_saturate(inVal);
703 uint32_t shift32_t = (uint32_t) shift;
704 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
706 result = MMALIB_UTIL_saturate(temp);
713 inline uint16_t MMALIB_UTIL_shiftAndRound(uint64_t inVal, uint8_t shift){
718 result = MMALIB_UTIL_saturate(inVal);
722 uint32_t shift32_t = (uint32_t) shift;
723 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
725 result = MMALIB_UTIL_saturate(temp);
736 inline int32_t MMALIB_UTIL_shiftAndRound<MMALIB_int128_t, int32_t>(MMALIB_int128_t inVal, uint8_t shift){
741 result = MMALIB_UTIL_saturate(inVal);
745 MMALIB_int128_t temp;
747 MMALIB_UTIL_shiftRight128((uint64_t *)&temp.hi, (uint64_t *)&temp.lo, inVal.hi, inVal.lo, (int32_t)(shift - 1), 1);
750 MMALIB_UTIL_shiftRight128((uint64_t *)&temp.hi, (uint64_t *)&temp.lo, temp.hi, temp.lo, 1, 1);
751 result = MMALIB_UTIL_saturate(temp);
764 template <
typename returnType>
765 static inline returnType MMALIB_UTIL_typeConv_i64f_oxX(
MMALIB_D64 x)
767 int64_t xLocal, maxValue;
768 returnType returnValue;
775 maxValue = ((int64_t)( (uint32_t)1 << ((uint32_t)(
sizeof(returnType)*8-2)))) - 1;
776 maxValue += (int64_t)( (uint32_t)1 << ((uint32_t)(
sizeof(returnType)*8-2)));
778 xLocal = (int64_t)floor(0.5 + x);
779 if (xLocal >= maxValue) {
780 returnValue = (returnType)maxValue;
781 }
else if (xLocal <= -maxValue-1) {
782 returnValue = (returnType)(-maxValue-1);
784 returnValue = (returnType)xLocal;
789 template int16_t MMALIB_UTIL_typeConv_i64f_oxX<int16_t>(
MMALIB_D64 x);
790 template int32_t MMALIB_UTIL_typeConv_i64f_oxX<int32_t>(
MMALIB_D64 x);
799 template <
typename returnType>
800 static returnType MMALIB_UTIL_cos_i64f_oxX(
MMALIB_D64 x,
803 return MMALIB_UTIL_typeConv_i64f_oxX<returnType>(scaleFactor*cos(x));
816 template <
typename returnType>
817 static inline returnType MMALIB_UTIL_sin_i64f_oxX(
MMALIB_D64 x,
820 return MMALIB_UTIL_typeConv_i64f_oxX<returnType>(scaleFactor*sin(x));
834 template <
typename dataType>
835 inline dataType MMALIB_UTIL_iLUT(dataType inVal,
const void *pLutValues){
836 const dataType *iLUT = (
const dataType*)pLutValues;
837 uint8_t mask = 0xffU;
840 uint8_t index = (uint8_t)inVal & mask;
841 result = iLUT[index];
847 inline int16_t MMALIB_UTIL_iLUT<int16_t>(int16_t inVal,
const void *pLutValues){
848 const int16_t *iLUT = (
const int16_t*)pLutValues;
849 uint16_t mask = 0x00ff;
852 uint8_t index = (int16_t) ((uint16_t)inVal & mask);
853 result = iLUT[index];
859 inline uint16_t MMALIB_UTIL_iLUT<uint16_t>(uint16_t inVal,
const void *pLutValues){
860 const uint16_t *iLUT = (
const uint16_t*)pLutValues;
861 uint16_t mask = 0x00ff;
864 uint8_t index = inVal & mask;
865 result = iLUT[index];
File to hold buffer parameter related info for MMALIB.
File to hold common structure, enums, macros and functions for MMALIB.
static void MMALIB_UTIL_mult(int64_t *ph, int64_t *pl, int64_t a, int64_t b)
double MMALIB_D64
Double precision floating point.