1 #ifndef COMMON_MMALIB_INT128_T_H_
2 #define COMMON_MMALIB_INT128_T_H_ 1
70 MMALIB_int128_t(int64_t h, int64_t l);
71 MMALIB_int128_t(int64_t l);
73 MMALIB_int128_t operator+ (
const MMALIB_int128_t&)
const;
74 MMALIB_int128_t operator>> (
const int8_t&)
const;
78 inline MMALIB_int128_t::MMALIB_int128_t(int64_t h, int64_t l)
85 inline MMALIB_int128_t::MMALIB_int128_t(int64_t l)
88 hi = (((uint64_t)l & 0x8000000000000000ULL) != 0LL)?(int64_t)0xffffffffffffffffULL:(int64_t)0x0000000000000000ULL;
93 inline MMALIB_int128_t::MMALIB_int128_t()
95 hi = 0x0000000000000000LL;
96 lo = 0x0000000000000000LL;
99 static inline void MMALIB_UTIL_shiftRight128(
113 for(i = 0 ; i < sh ; i++ ) {
114 l = (uint64_t) __shift_right(l, (uint32_t)1) | (uint64_t) __shift_left(h, (uint32_t)63) ;
115 h = (uint64_t) __shift_right(h, (uint32_t)1) | ((s!=0)?(h&0x8000000000000000ULL):0ULL) ;
122 static inline void MMALIB_UTIL_Add128(
146 all = (uint64_t) __shift_right(al, (uint32_t) 0) & 0x0ffffffffULL ;
147 alh = (uint64_t) __shift_right(al, (uint32_t)32) & 0x0ffffffffULL ;
148 ahl = (uint64_t) __shift_right(ah, (uint32_t) 0) & 0x0ffffffffULL ;
149 ahh = (uint64_t) __shift_right(ah, (uint32_t)32) & 0x0ffffffffULL ;
151 bll = (uint64_t) __shift_right(bl, (uint32_t) 0) & 0x0ffffffffULL ;
152 blh = (uint64_t) __shift_right(bl, (uint32_t)32) & 0x0ffffffffULL ;
153 bhl = (uint64_t) __shift_right(bh, (uint32_t) 0) & 0x0ffffffffULL ;
154 bhh = (uint64_t) __shift_right(bh, (uint32_t)32) & 0x0ffffffffULL ;
158 s1 = alh + blh + __shift_right(s0, (uint32_t)32) ;
159 s2 = ahl + bhl + __shift_right(s1, (uint32_t)32) ;
160 s3 = ahh + bhh + __shift_right(s2, (uint32_t)32) ;
163 sl = (uint64_t) __shift_left(s1, (uint32_t)32) | (s0 & 0x0ffffffffULL) ;
164 sh = (uint64_t) __shift_left(s3, (uint32_t)32) | (s2 & 0x0ffffffffULL) ;
171 inline MMALIB_int128_t MMALIB_int128_t::operator+ (
const MMALIB_int128_t& b)
const
173 MMALIB_int128_t result;
175 MMALIB_UTIL_Add128((uint64_t *)&(result.hi), (uint64_t *)&(result.lo), this->hi, this->lo, b.hi, b.lo);
181 inline MMALIB_int128_t MMALIB_int128_t::operator>> (
const int8_t& shift)
const
183 MMALIB_int128_t result;
185 MMALIB_UTIL_shiftRight128((uint64_t *)&result.hi, (uint64_t *)&result.lo, this->hi, this->lo, (int32_t)shift, 1);