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"
59 #include "c7524/MMALIB_utility.h"
87 static inline void MMALIB_UTIL_mult(int64_t *ph, int64_t *pl, int64_t a, int64_t b);
98 *ph = ((((uint64_t)*pl) & 0x8000000000000000ULL) != 0ULL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
116 class MMALIB_int128_t
121 MMALIB_int128_t(int64_t h, int64_t l);
122 MMALIB_int128_t(int64_t l);
124 MMALIB_int128_t operator+ (
const MMALIB_int128_t&)
const;
125 MMALIB_int128_t operator>> (
const int8_t&)
const;
129 inline MMALIB_int128_t::MMALIB_int128_t(int64_t h, int64_t l)
136 inline MMALIB_int128_t::MMALIB_int128_t(int64_t l)
139 hi = (((uint64_t)l & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0x0000000000000000ULL;
144 inline MMALIB_int128_t::MMALIB_int128_t()
146 hi = 0x0000000000000000LL;
147 lo = 0x0000000000000000LL;
150 static inline void MMALIB_UTIL_shiftRight128(
164 for(i = 0 ; i < sh ; i++ ) {
165 l = (uint64_t) __shift_right(l, (uint32_t)1) | (uint64_t) __shift_left(h, (uint32_t)63) ;
166 h = (uint64_t) __shift_right(h, (uint32_t)1) | ((s!=0)?(h&0x8000000000000000ULL):0ULL) ;
173 static inline void MMALIB_UTIL_Add128(
197 all = (uint64_t) __shift_right(al, (uint32_t) 0) & 0x0ffffffffULL ;
198 alh = (uint64_t) __shift_right(al, (uint32_t)32) & 0x0ffffffffULL ;
199 ahl = (uint64_t) __shift_right(ah, (uint32_t) 0) & 0x0ffffffffULL ;
200 ahh = (uint64_t) __shift_right(ah, (uint32_t)32) & 0x0ffffffffULL ;
202 bll = (uint64_t) __shift_right(bl, (uint32_t) 0) & 0x0ffffffffULL ;
203 blh = (uint64_t) __shift_right(bl, (uint32_t)32) & 0x0ffffffffULL ;
204 bhl = (uint64_t) __shift_right(bh, (uint32_t) 0) & 0x0ffffffffULL ;
205 bhh = (uint64_t) __shift_right(bh, (uint32_t)32) & 0x0ffffffffULL ;
209 s1 = alh + blh + __shift_right(s0, (uint32_t)32) ;
210 s2 = ahl + bhl + __shift_right(s1, (uint32_t)32) ;
211 s3 = ahh + bhh + __shift_right(s2, (uint32_t)32) ;
214 sl = (uint64_t) __shift_left(s1, (uint32_t)32) | (s0 & 0x0ffffffffULL) ;
215 sh = (uint64_t) __shift_left(s3, (uint32_t)32) | (s2 & 0x0ffffffffULL) ;
222 inline MMALIB_int128_t MMALIB_int128_t::operator+ (
const MMALIB_int128_t& b)
const
224 MMALIB_int128_t result;
226 MMALIB_UTIL_Add128((uint64_t *)&(result.hi), (uint64_t *)&(result.lo), this->hi, this->lo, b.hi, b.lo);
232 inline MMALIB_int128_t MMALIB_int128_t::operator>> (
const int8_t& shift)
const
234 MMALIB_int128_t result;
236 MMALIB_UTIL_shiftRight128((uint64_t *)&result.hi, (uint64_t *)&result.lo, this->hi, this->lo, (int32_t)shift, 1);
250 static inline int16_t MMALIB_UTIL_negate(int16_t a)
254 result = (a == -32768) ? 32767 : -a;
258 static inline int32_t MMALIB_UTIL_negate(int32_t a)
262 result = (a == -2147483648) ? 2147483647 : -a;
274 return (int16_t)a * (int16_t)b;
279 return (int16_t)a * (int16_t)b;
284 return (int16_t)a * (int16_t)b;
289 return (int16_t)a * (int16_t)b;
295 return (int32_t)a * (int32_t)b;
300 return (int32_t)a * (int32_t)b;
305 return (int32_t)a * (int32_t)b;
310 return (int32_t)a * (int32_t)b;
323 MMALIB_int128_t result(0,0);
325 result.lo = (int64_t)a * (int64_t)b ;
327 result.hi = (int64_t)0ULL ;
334 MMALIB_int128_t result(0,0);
336 result.lo = (int64_t)a * (int64_t)b ;
338 result.hi = (((uint64_t)result.lo & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
345 MMALIB_int128_t result(0,0);
347 result.lo = (int64_t)a * (int64_t)b ;
349 result.hi = (((uint64_t)result.lo & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
356 MMALIB_int128_t result(0,0);
358 result.lo = (int64_t)a * (int64_t)b ;
360 result.hi = (((uint64_t)result.lo & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
371 static inline void MMALIB_UTIL_saturate_relu(int32_t x, int8_t *y)
384 static inline void MMALIB_UTIL_saturate_relu(int32_t x, uint8_t *y)
397 static inline void MMALIB_UTIL_saturate_relu(uint32_t x, uint8_t *y)
408 static inline void MMALIB_UTIL_saturate_relu(int64_t x, int16_t *y)
412 }
else if (x < 0x0000) {
421 static inline void MMALIB_UTIL_saturate_relu(int64_t x, uint16_t *y)
425 }
else if (x < 0x0000) {
434 static inline void MMALIB_UTIL_saturate_relu(uint64_t x, uint16_t *y)
451 template <
typename dataType,
typename returnType>
452 static inline returnType MMALIB_UTIL_shiftRoundAndReLU(dataType inVal, uint8_t shift){
457 MMALIB_UTIL_saturate_relu(inVal, &result);
465 temp = __shift_right(inVal, (shift - 1)) + 1;
466 temp = __shift_right(temp, 1);
467 MMALIB_UTIL_saturate_relu(temp, &result);
473 template int8_t MMALIB_UTIL_shiftRoundAndReLU<int32_t, int8_t> (int32_t inVal, uint8_t shift);
474 template int16_t MMALIB_UTIL_shiftRoundAndReLU<int64_t, int16_t> (int64_t inVal, uint8_t shift);
480 inline uint8_t MMALIB_UTIL_shiftRoundAndReLU<int32_t, uint8_t>(int32_t inVal, uint8_t shift){
485 MMALIB_UTIL_saturate_relu(inVal, &result);
493 temp = __shift_right( inVal, (shift - 1) ) + 1;
494 temp = __shift_right(temp, 1);
495 MMALIB_UTIL_saturate_relu(temp, &result);
503 inline uint8_t MMALIB_UTIL_shiftRoundAndReLU<uint32_t, uint8_t>(uint32_t inVal, uint8_t shift){
508 MMALIB_UTIL_saturate_relu(inVal, &result);
516 uint32_t shift32_t = (uint32_t) shift;
517 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
519 MMALIB_UTIL_saturate_relu(temp, &result);
526 inline uint16_t MMALIB_UTIL_shiftRoundAndReLU<int64_t, uint16_t>(int64_t inVal, uint8_t shift){
531 MMALIB_UTIL_saturate_relu(inVal, &result);
539 temp = __shift_right( inVal, (shift - 1) ) + 1;
540 temp = __shift_right(temp, 1);
541 MMALIB_UTIL_saturate_relu(temp, &result);
548 inline uint16_t MMALIB_UTIL_shiftRoundAndReLU<uint64_t, uint16_t>(uint64_t inVal, uint8_t shift){
553 MMALIB_UTIL_saturate_relu(inVal, &result);
556 uint32_t shift32_t = (uint32_t) shift;
557 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
559 MMALIB_UTIL_saturate_relu(temp, &result);
572 static inline int8_t MMALIB_UTIL_saturate(int32_t x)
577 }
else if (x < -0x80) {
585 static inline uint8_t MMALIB_UTIL_saturate(uint32_t x)
596 static inline int16_t MMALIB_UTIL_saturate(int64_t x)
601 }
else if (x < -0x8000) {
609 static inline uint16_t MMALIB_UTIL_saturate(uint64_t x)
615 retVal = (uint16_t)x;
620 static inline int32_t MMALIB_UTIL_saturate(int64_t xh, int64_t xl)
625 if(((uint64_t)xh & 0x8000000000000000ULL) != 0LL){
626 if( ((~(uint64_t)xh & 0xFFFFFFFFFFFFFFFFULL) != 0LL) || ((~(uint64_t)xl & 0xFFFFFFFF80000000ULL) != 0LL)){
627 retVal = ((int32_t)0x80000000U);
629 retVal = (int32_t)xl;
631 }
else if (((uint64_t)xl & 0xFFFFFFFF80000000ULL) != 0LL){
633 retVal = ((int32_t)0x7FFFFFFFU);
635 retVal = (int32_t)xl;
640 static inline int32_t MMALIB_UTIL_saturate(MMALIB_int128_t x)
642 return MMALIB_UTIL_saturate(x.hi, x.lo);
651 template <
typename dataType,
typename returnType>
652 inline returnType MMALIB_UTIL_shiftAndRound(dataType inVal, uint8_t shift){
657 result = MMALIB_UTIL_saturate(inVal);
661 temp = (__shift_right(inVal, (shift - 1)) + 1);
662 temp = __shift_right(temp , 1);
663 result = MMALIB_UTIL_saturate(temp);
675 template <>
inline MMALIB_F32 MMALIB_UTIL_shiftAndRound <MMALIB_F32, MMALIB_F32> (
MMALIB_F32 inVal, uint8_t shift)
682 template MMALIB_F32 MMALIB_UTIL_shiftAndRound<MMALIB_F32, MMALIB_F32> (
MMALIB_F32 inVal, uint8_t shift);
683 template int8_t MMALIB_UTIL_shiftAndRound<int32_t, int8_t> (int32_t inVal, uint8_t shift);
684 template int16_t MMALIB_UTIL_shiftAndRound<int64_t, int16_t> (int64_t inVal, uint8_t shift);
688 inline uint8_t MMALIB_UTIL_shiftAndRound(uint32_t inVal, uint8_t shift){
693 result = MMALIB_UTIL_saturate(inVal);
697 uint32_t shift32_t = (uint32_t) shift;
698 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
700 result = MMALIB_UTIL_saturate(temp);
707 inline uint16_t MMALIB_UTIL_shiftAndRound(uint64_t inVal, uint8_t shift){
712 result = MMALIB_UTIL_saturate(inVal);
716 uint32_t shift32_t = (uint32_t) shift;
717 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
719 result = MMALIB_UTIL_saturate(temp);
730 inline int32_t MMALIB_UTIL_shiftAndRound<MMALIB_int128_t, int32_t>(MMALIB_int128_t inVal, uint8_t shift){
735 result = MMALIB_UTIL_saturate(inVal);
739 MMALIB_int128_t temp;
741 MMALIB_UTIL_shiftRight128((uint64_t *)&temp.hi, (uint64_t *)&temp.lo, inVal.hi, inVal.lo, (int32_t)(shift - 1), 1);
744 MMALIB_UTIL_shiftRight128((uint64_t *)&temp.hi, (uint64_t *)&temp.lo, temp.hi, temp.lo, 1, 1);
745 result = MMALIB_UTIL_saturate(temp);
758 template <
typename returnType>
759 static inline returnType MMALIB_UTIL_typeConv_i64f_oxX(
MMALIB_D64 x)
761 int64_t xLocal, maxValue;
762 returnType returnValue;
769 maxValue = ((int64_t)( (uint32_t)1 << ((uint32_t)(
sizeof(returnType)*8-2)))) - 1;
770 maxValue += (int64_t)( (uint32_t)1 << ((uint32_t)(
sizeof(returnType)*8-2)));
772 xLocal = (int64_t)floor(0.5 + x);
773 if (xLocal >= maxValue) {
774 returnValue = (returnType)maxValue;
775 }
else if (xLocal <= -maxValue-1) {
776 returnValue = (returnType)(-maxValue-1);
778 returnValue = (returnType)xLocal;
783 template int16_t MMALIB_UTIL_typeConv_i64f_oxX<int16_t>(
MMALIB_D64 x);
784 template int32_t MMALIB_UTIL_typeConv_i64f_oxX<int32_t>(
MMALIB_D64 x);
793 template <
typename returnType>
794 static returnType MMALIB_UTIL_cos_i64f_oxX(
MMALIB_D64 x,
797 return MMALIB_UTIL_typeConv_i64f_oxX<returnType>(scaleFactor*cos(x));
810 template <
typename returnType>
811 static inline returnType MMALIB_UTIL_sin_i64f_oxX(
MMALIB_D64 x,
814 return MMALIB_UTIL_typeConv_i64f_oxX<returnType>(scaleFactor*sin(x));
828 template <
typename dataType>
829 inline dataType MMALIB_UTIL_iLUT(dataType inVal,
const void *pLutValues){
830 const dataType *iLUT = (
const dataType*)pLutValues;
831 uint8_t mask = 0xffU;
834 uint8_t index = (uint8_t)inVal & mask;
835 result = iLUT[index];
841 inline int16_t MMALIB_UTIL_iLUT<int16_t>(int16_t inVal,
const void *pLutValues){
842 const int16_t *iLUT = (
const int16_t*)pLutValues;
843 uint16_t mask = 0x00ff;
846 uint8_t index = (int16_t) ((uint16_t)inVal & mask);
847 result = iLUT[index];
853 inline uint16_t MMALIB_UTIL_iLUT<uint16_t>(uint16_t inVal,
const void *pLutValues){
854 const uint16_t *iLUT = (
const uint16_t*)pLutValues;
855 uint16_t mask = 0x00ff;
858 uint8_t index = inVal & mask;
859 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)
float MMALIB_F32
Single precision floating point.
double MMALIB_D64
Double precision floating point.