1 #ifndef COMMON_MATHLIB_UTILITY_H_ 2 #define COMMON_MATHLIB_UTILITY_H_ 1 54 #include "c71/MATHLIB_utility.h" 55 #if MATHLIB_DEBUGPRINT >= 1 56 #include "c71/MATHLIB_debug.h" 59 #include "c7120/MATHLIB_utility.h" 87 static inline void MATHLIB_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 MATHLIB_int128_t
121 MATHLIB_int128_t(int64_t h, int64_t l);
122 MATHLIB_int128_t(int64_t l);
124 MATHLIB_int128_t operator+ (
const MATHLIB_int128_t&)
const;
125 MATHLIB_int128_t operator>> (
const int8_t&)
const;
129 inline MATHLIB_int128_t::MATHLIB_int128_t(int64_t h, int64_t l)
136 inline MATHLIB_int128_t::MATHLIB_int128_t(int64_t l)
139 hi = (((uint64_t)l & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0x0000000000000000ULL;
144 inline MATHLIB_int128_t::MATHLIB_int128_t()
146 hi = 0x0000000000000000LL;
147 lo = 0x0000000000000000LL;
150 static inline void MATHLIB_UTIL_shiftRight128(
164 for(i = 0 ; i < sh ; i++ ) {
165 l = __shift_right(l, (uint32_t)1) | __shift_left(h, (uint32_t)63) ;
166 h = __shift_right(h, (uint32_t)1) | ((s!=0)?(h&0x8000000000000000ULL):0ULL) ;
173 static inline void MATHLIB_UTIL_Add128(
197 all = __shift_right(al, (uint32_t) 0) & 0x0ffffffffULL ;
198 alh = __shift_right(al, (uint32_t)32) & 0x0ffffffffULL ;
199 ahl = __shift_right(ah, (uint32_t) 0) & 0x0ffffffffULL ;
200 ahh = __shift_right(ah, (uint32_t)32) & 0x0ffffffffULL ;
202 bll = __shift_right(bl, (uint32_t) 0) & 0x0ffffffffULL ;
203 blh = __shift_right(bl, (uint32_t)32) & 0x0ffffffffULL ;
204 bhl = __shift_right(bh, (uint32_t) 0) & 0x0ffffffffULL ;
205 bhh = __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 = __shift_left(s1, (uint32_t)32) | (s0 & 0x0ffffffffULL) ;
215 sh = __shift_left(s3, (uint32_t)32) | (s2 & 0x0ffffffffULL) ;
222 inline MATHLIB_int128_t MATHLIB_int128_t::operator+ (
const MATHLIB_int128_t& b)
const 224 MATHLIB_int128_t result;
226 MATHLIB_UTIL_Add128((uint64_t *)&(result.hi), (uint64_t *)&(result.lo), this->hi, this->lo, b.hi, b.lo);
232 inline MATHLIB_int128_t MATHLIB_int128_t::operator>> (
const int8_t& shift)
const 234 MATHLIB_int128_t result;
236 MATHLIB_UTIL_shiftRight128((uint64_t *)&result.hi, (uint64_t *)&result.lo, this->hi, this->lo, (int32_t)shift, 1);
250 static inline int16_t MATHLIB_UTIL_negate(int16_t a)
254 result = (a == -32768) ? 32767 : -a;
258 static inline int32_t MATHLIB_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;
285 return (int32_t)a * (int32_t)b;
290 return (int32_t)a * (int32_t)b;
295 MATHLIB_int128_t result(0,0);
297 result.lo = (int64_t)a * (int64_t)b ;
299 result.hi = (((uint64_t)result.lo & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0ULL ;
310 static inline void MATHLIB_UTIL_saturate_relu(int32_t x, int8_t *y)
323 static inline void MATHLIB_UTIL_saturate_relu(int32_t x, uint8_t *y)
336 static inline void MATHLIB_UTIL_saturate_relu(uint32_t x, uint8_t *y)
347 static inline void MATHLIB_UTIL_saturate_relu(int64_t x, int16_t *y)
351 }
else if (x < 0x0000) {
360 static inline void MATHLIB_UTIL_saturate_relu(int64_t x, uint16_t *y)
364 }
else if (x < 0x0000) {
373 static inline void MATHLIB_UTIL_saturate_relu(uint64_t x, uint16_t *y)
390 template <
typename dataType,
typename returnType>
391 static inline returnType MATHLIB_UTIL_shiftRoundAndReLU(dataType inVal, uint8_t shift){
396 MATHLIB_UTIL_saturate_relu(inVal, &result);
404 temp = __shift_right(inVal, (shift - 1)) + 1;
405 temp = __shift_right(temp, 1);
406 MATHLIB_UTIL_saturate_relu(temp, &result);
412 template int8_t MATHLIB_UTIL_shiftRoundAndReLU<int32_t, int8_t> (int32_t inVal, uint8_t shift);
413 template int16_t MATHLIB_UTIL_shiftRoundAndReLU<int64_t, int16_t> (int64_t inVal, uint8_t shift);
419 inline uint8_t MATHLIB_UTIL_shiftRoundAndReLU<int32_t, uint8_t>(int32_t inVal, uint8_t shift){
424 MATHLIB_UTIL_saturate_relu(inVal, &result);
432 temp = __shift_right( inVal, (shift - 1) ) + 1;
433 temp = __shift_right(temp, 1);
434 MATHLIB_UTIL_saturate_relu(temp, &result);
442 inline uint8_t MATHLIB_UTIL_shiftRoundAndReLU<uint32_t, uint8_t>(uint32_t inVal, uint8_t shift){
447 MATHLIB_UTIL_saturate_relu(inVal, &result);
455 uint32_t shift32_t = (uint32_t) shift;
456 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
458 MATHLIB_UTIL_saturate_relu(temp, &result);
465 inline uint16_t MATHLIB_UTIL_shiftRoundAndReLU<int64_t, uint16_t>(int64_t inVal, uint8_t shift){
470 MATHLIB_UTIL_saturate_relu(inVal, &result);
478 temp = __shift_right( inVal, (shift - 1) ) + 1;
479 temp = __shift_right(temp, 1);
480 MATHLIB_UTIL_saturate_relu(temp, &result);
487 inline uint16_t MATHLIB_UTIL_shiftRoundAndReLU<uint64_t, uint16_t>(uint64_t inVal, uint8_t shift){
492 MATHLIB_UTIL_saturate_relu(inVal, &result);
495 uint32_t shift32_t = (uint32_t) shift;
496 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
498 MATHLIB_UTIL_saturate_relu(temp, &result);
511 static inline int8_t MATHLIB_UTIL_saturate(int32_t x)
516 }
else if (x < -0x80) {
524 static inline uint8_t MATHLIB_UTIL_saturate(uint32_t x)
535 static inline int16_t MATHLIB_UTIL_saturate(int64_t x)
540 }
else if (x < -0x8000) {
548 static inline uint16_t MATHLIB_UTIL_saturate(uint64_t x)
554 retVal = (uint16_t)x;
559 static inline int32_t MATHLIB_UTIL_saturate(int64_t xh, int64_t xl)
564 if(((uint64_t)xh & 0x8000000000000000ULL) != 0LL){
565 if( ((~(uint64_t)xh & 0xFFFFFFFFFFFFFFFFULL) != 0LL) || ((~(uint64_t)xl & 0xFFFFFFFF80000000ULL) != 0LL)){
566 retVal = ((int32_t)0x80000000U);
568 retVal = (int32_t)xl;
570 }
else if (((uint64_t)xl & 0xFFFFFFFF80000000ULL) != 0LL){
572 retVal = ((int32_t)0x7FFFFFFFU);
574 retVal = (int32_t)xl;
579 static inline int32_t MATHLIB_UTIL_saturate(MATHLIB_int128_t x)
581 return MATHLIB_UTIL_saturate(x.hi, x.lo);
590 template <
typename dataType,
typename returnType>
591 inline returnType MATHLIB_UTIL_shiftAndRound(dataType inVal, uint8_t shift){
596 result = MATHLIB_UTIL_saturate(inVal);
600 temp = (__shift_right(inVal, (shift - 1)) + 1);
601 temp = __shift_right(temp , 1);
602 result = MATHLIB_UTIL_saturate(temp);
608 template int8_t MATHLIB_UTIL_shiftAndRound<int32_t, int8_t> (int32_t inVal, uint8_t shift);
609 template int16_t MATHLIB_UTIL_shiftAndRound<int64_t, int16_t> (int64_t inVal, uint8_t shift);
613 inline uint8_t MATHLIB_UTIL_shiftAndRound(uint32_t inVal, uint8_t shift){
618 result = MATHLIB_UTIL_saturate(inVal);
622 uint32_t shift32_t = (uint32_t) shift;
623 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
625 result = MATHLIB_UTIL_saturate(temp);
632 inline uint16_t MATHLIB_UTIL_shiftAndRound(uint64_t inVal, uint8_t shift){
637 result = MATHLIB_UTIL_saturate(inVal);
641 uint32_t shift32_t = (uint32_t) shift;
642 temp = (inVal >> (shift32_t - (uint32_t)1) ) + 1;
644 result = MATHLIB_UTIL_saturate(temp);
655 inline int32_t MATHLIB_UTIL_shiftAndRound<MATHLIB_int128_t, int32_t>(MATHLIB_int128_t inVal, uint8_t shift){
660 result = MATHLIB_UTIL_saturate(inVal);
664 MATHLIB_int128_t temp;
666 MATHLIB_UTIL_shiftRight128((uint64_t *)&temp.hi, (uint64_t *)&temp.lo, inVal.hi, inVal.lo, (int32_t)(shift - 1), 1);
669 MATHLIB_UTIL_shiftRight128((uint64_t *)&temp.hi, (uint64_t *)&temp.lo, temp.hi, temp.lo, 1, 1);
670 result = MATHLIB_UTIL_saturate(temp);
683 template <
typename returnType>
684 static inline returnType MATHLIB_UTIL_typeConv_i64f_oxX(
MATHLIB_D64 x)
686 int64_t xLocal, maxValue;
687 returnType returnValue;
694 maxValue = ((int64_t)( (uint32_t)1 << ((uint32_t)(
sizeof(returnType)*8-2)))) - 1;
695 maxValue += (int64_t)( (uint32_t)1 << ((uint32_t)(
sizeof(returnType)*8-2)));
697 xLocal = (int64_t)floor(0.5 + x);
698 if (xLocal >= maxValue) {
699 returnValue = (returnType)maxValue;
700 }
else if (xLocal <= -maxValue-1) {
701 returnValue = (returnType)(-maxValue-1);
703 returnValue = (returnType)xLocal;
708 template int16_t MATHLIB_UTIL_typeConv_i64f_oxX<int16_t>(
MATHLIB_D64 x);
709 template int32_t MATHLIB_UTIL_typeConv_i64f_oxX<int32_t>(
MATHLIB_D64 x);
716 template <
typename returnType>
717 static returnType MATHLIB_UTIL_cos_i64f_oxX(
MATHLIB_D64 x,
720 return MATHLIB_UTIL_typeConv_i64f_oxX<returnType>(scaleFactor*cos(x));
730 template <
typename returnType>
731 static inline returnType MATHLIB_UTIL_sin_i64f_oxX(
MATHLIB_D64 x,
734 return MATHLIB_UTIL_typeConv_i64f_oxX<returnType>(scaleFactor*sin(x));
double MATHLIB_D64
Double precision floating point.
File to hold common structure, enums, macros and functions for MATHLIB.
static void MATHLIB_UTIL_mult(int64_t *ph, int64_t *pl, int64_t a, int64_t b)