1b7cd3db6SAvi Kivity #ifndef INT128_H 2b7cd3db6SAvi Kivity #define INT128_H 3b7cd3db6SAvi Kivity 47ebee43eSRichard Henderson #include "qemu/bswap.h" 50846beb3SRichard Henderson 62484cd9cSMatheus Ferst #ifdef CONFIG_INT128 70846beb3SRichard Henderson typedef __int128_t Int128; 80846beb3SRichard Henderson 90846beb3SRichard Henderson static inline Int128 int128_make64(uint64_t a) 100846beb3SRichard Henderson { 110846beb3SRichard Henderson return a; 120846beb3SRichard Henderson } 130846beb3SRichard Henderson 14703235a3SPeter Maydell static inline Int128 int128_makes64(int64_t a) 15703235a3SPeter Maydell { 16703235a3SPeter Maydell return a; 17703235a3SPeter Maydell } 18703235a3SPeter Maydell 191edaeee0SRichard Henderson static inline Int128 int128_make128(uint64_t lo, uint64_t hi) 201edaeee0SRichard Henderson { 211edaeee0SRichard Henderson return (__uint128_t)hi << 64 | lo; 221edaeee0SRichard Henderson } 231edaeee0SRichard Henderson 240846beb3SRichard Henderson static inline uint64_t int128_get64(Int128 a) 250846beb3SRichard Henderson { 260846beb3SRichard Henderson uint64_t r = a; 270846beb3SRichard Henderson assert(r == a); 280846beb3SRichard Henderson return r; 290846beb3SRichard Henderson } 300846beb3SRichard Henderson 310846beb3SRichard Henderson static inline uint64_t int128_getlo(Int128 a) 320846beb3SRichard Henderson { 330846beb3SRichard Henderson return a; 340846beb3SRichard Henderson } 350846beb3SRichard Henderson 360846beb3SRichard Henderson static inline int64_t int128_gethi(Int128 a) 370846beb3SRichard Henderson { 380846beb3SRichard Henderson return a >> 64; 390846beb3SRichard Henderson } 400846beb3SRichard Henderson 410846beb3SRichard Henderson static inline Int128 int128_zero(void) 420846beb3SRichard Henderson { 430846beb3SRichard Henderson return 0; 440846beb3SRichard Henderson } 450846beb3SRichard Henderson 460846beb3SRichard Henderson static inline Int128 int128_one(void) 470846beb3SRichard Henderson { 480846beb3SRichard Henderson return 1; 490846beb3SRichard Henderson } 500846beb3SRichard Henderson 510846beb3SRichard Henderson static inline Int128 int128_2_64(void) 520846beb3SRichard Henderson { 530846beb3SRichard Henderson return (Int128)1 << 64; 540846beb3SRichard Henderson } 550846beb3SRichard Henderson 560846beb3SRichard Henderson static inline Int128 int128_exts64(int64_t a) 570846beb3SRichard Henderson { 580846beb3SRichard Henderson return a; 590846beb3SRichard Henderson } 600846beb3SRichard Henderson 611c469373SFrédéric Pétrot static inline Int128 int128_not(Int128 a) 621c469373SFrédéric Pétrot { 631c469373SFrédéric Pétrot return ~a; 641c469373SFrédéric Pétrot } 651c469373SFrédéric Pétrot 660846beb3SRichard Henderson static inline Int128 int128_and(Int128 a, Int128 b) 670846beb3SRichard Henderson { 680846beb3SRichard Henderson return a & b; 690846beb3SRichard Henderson } 700846beb3SRichard Henderson 7108895cdaSRichard Henderson static inline Int128 int128_or(Int128 a, Int128 b) 7208895cdaSRichard Henderson { 7308895cdaSRichard Henderson return a | b; 7408895cdaSRichard Henderson } 7508895cdaSRichard Henderson 761c469373SFrédéric Pétrot static inline Int128 int128_xor(Int128 a, Int128 b) 771c469373SFrédéric Pétrot { 781c469373SFrédéric Pétrot return a ^ b; 791c469373SFrédéric Pétrot } 801c469373SFrédéric Pétrot 810846beb3SRichard Henderson static inline Int128 int128_rshift(Int128 a, int n) 820846beb3SRichard Henderson { 830846beb3SRichard Henderson return a >> n; 840846beb3SRichard Henderson } 850846beb3SRichard Henderson 86*613cf0fcSMatheus Ferst static inline Int128 int128_urshift(Int128 a, int n) 87*613cf0fcSMatheus Ferst { 88*613cf0fcSMatheus Ferst return (__uint128_t)a >> n; 89*613cf0fcSMatheus Ferst } 90*613cf0fcSMatheus Ferst 915be4dd04SRichard Henderson static inline Int128 int128_lshift(Int128 a, int n) 925be4dd04SRichard Henderson { 935be4dd04SRichard Henderson return a << n; 945be4dd04SRichard Henderson } 955be4dd04SRichard Henderson 960846beb3SRichard Henderson static inline Int128 int128_add(Int128 a, Int128 b) 970846beb3SRichard Henderson { 980846beb3SRichard Henderson return a + b; 990846beb3SRichard Henderson } 1000846beb3SRichard Henderson 1010846beb3SRichard Henderson static inline Int128 int128_neg(Int128 a) 1020846beb3SRichard Henderson { 1030846beb3SRichard Henderson return -a; 1040846beb3SRichard Henderson } 1050846beb3SRichard Henderson 1060846beb3SRichard Henderson static inline Int128 int128_sub(Int128 a, Int128 b) 1070846beb3SRichard Henderson { 1080846beb3SRichard Henderson return a - b; 1090846beb3SRichard Henderson } 1100846beb3SRichard Henderson 1110846beb3SRichard Henderson static inline bool int128_nonneg(Int128 a) 1120846beb3SRichard Henderson { 1130846beb3SRichard Henderson return a >= 0; 1140846beb3SRichard Henderson } 1150846beb3SRichard Henderson 1160846beb3SRichard Henderson static inline bool int128_eq(Int128 a, Int128 b) 1170846beb3SRichard Henderson { 1180846beb3SRichard Henderson return a == b; 1190846beb3SRichard Henderson } 1200846beb3SRichard Henderson 1210846beb3SRichard Henderson static inline bool int128_ne(Int128 a, Int128 b) 1220846beb3SRichard Henderson { 1230846beb3SRichard Henderson return a != b; 1240846beb3SRichard Henderson } 1250846beb3SRichard Henderson 1260846beb3SRichard Henderson static inline bool int128_ge(Int128 a, Int128 b) 1270846beb3SRichard Henderson { 1280846beb3SRichard Henderson return a >= b; 1290846beb3SRichard Henderson } 1300846beb3SRichard Henderson 1310846beb3SRichard Henderson static inline bool int128_lt(Int128 a, Int128 b) 1320846beb3SRichard Henderson { 1330846beb3SRichard Henderson return a < b; 1340846beb3SRichard Henderson } 1350846beb3SRichard Henderson 1360846beb3SRichard Henderson static inline bool int128_le(Int128 a, Int128 b) 1370846beb3SRichard Henderson { 1380846beb3SRichard Henderson return a <= b; 1390846beb3SRichard Henderson } 1400846beb3SRichard Henderson 1410846beb3SRichard Henderson static inline bool int128_gt(Int128 a, Int128 b) 1420846beb3SRichard Henderson { 1430846beb3SRichard Henderson return a > b; 1440846beb3SRichard Henderson } 1450846beb3SRichard Henderson 1460846beb3SRichard Henderson static inline bool int128_nz(Int128 a) 1470846beb3SRichard Henderson { 1480846beb3SRichard Henderson return a != 0; 1490846beb3SRichard Henderson } 1500846beb3SRichard Henderson 1510846beb3SRichard Henderson static inline Int128 int128_min(Int128 a, Int128 b) 1520846beb3SRichard Henderson { 1530846beb3SRichard Henderson return a < b ? a : b; 1540846beb3SRichard Henderson } 1550846beb3SRichard Henderson 1560846beb3SRichard Henderson static inline Int128 int128_max(Int128 a, Int128 b) 1570846beb3SRichard Henderson { 1580846beb3SRichard Henderson return a > b ? a : b; 1590846beb3SRichard Henderson } 1600846beb3SRichard Henderson 1610846beb3SRichard Henderson static inline void int128_addto(Int128 *a, Int128 b) 1620846beb3SRichard Henderson { 1630846beb3SRichard Henderson *a += b; 1640846beb3SRichard Henderson } 1650846beb3SRichard Henderson 1660846beb3SRichard Henderson static inline void int128_subfrom(Int128 *a, Int128 b) 1670846beb3SRichard Henderson { 1680846beb3SRichard Henderson *a -= b; 1690846beb3SRichard Henderson } 1700846beb3SRichard Henderson 1717ebee43eSRichard Henderson static inline Int128 bswap128(Int128 a) 1727ebee43eSRichard Henderson { 1732484cd9cSMatheus Ferst #if __has_builtin(__builtin_bswap128) 1742484cd9cSMatheus Ferst return __builtin_bswap128(a); 1752484cd9cSMatheus Ferst #else 1767ebee43eSRichard Henderson return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a))); 1772484cd9cSMatheus Ferst #endif 1787ebee43eSRichard Henderson } 1797ebee43eSRichard Henderson 180e9d07601SFrédéric Pétrot static inline Int128 int128_divu(Int128 a, Int128 b) 181e9d07601SFrédéric Pétrot { 182e9d07601SFrédéric Pétrot return (__uint128_t)a / (__uint128_t)b; 183e9d07601SFrédéric Pétrot } 184e9d07601SFrédéric Pétrot 185e9d07601SFrédéric Pétrot static inline Int128 int128_remu(Int128 a, Int128 b) 186e9d07601SFrédéric Pétrot { 187e9d07601SFrédéric Pétrot return (__uint128_t)a % (__uint128_t)b; 188e9d07601SFrédéric Pétrot } 189e9d07601SFrédéric Pétrot 190e9d07601SFrédéric Pétrot static inline Int128 int128_divs(Int128 a, Int128 b) 191e9d07601SFrédéric Pétrot { 192e9d07601SFrédéric Pétrot return a / b; 193e9d07601SFrédéric Pétrot } 194e9d07601SFrédéric Pétrot 195e9d07601SFrédéric Pétrot static inline Int128 int128_rems(Int128 a, Int128 b) 196e9d07601SFrédéric Pétrot { 197e9d07601SFrédéric Pétrot return a % b; 198e9d07601SFrédéric Pétrot } 199e9d07601SFrédéric Pétrot 2000846beb3SRichard Henderson #else /* !CONFIG_INT128 */ 2016046c620SPaolo Bonzini 202b7cd3db6SAvi Kivity typedef struct Int128 Int128; 203b7cd3db6SAvi Kivity 204181b0c33SMatheus Ferst /* 205181b0c33SMatheus Ferst * We guarantee that the in-memory byte representation of an 206181b0c33SMatheus Ferst * Int128 is that of a host-endian-order 128-bit integer 207181b0c33SMatheus Ferst * (whether using this struct or the __int128_t version of the type). 208181b0c33SMatheus Ferst * Some code using this type relies on this (eg when copying it into 209181b0c33SMatheus Ferst * guest memory or a gdb protocol buffer, or by using Int128 in 210181b0c33SMatheus Ferst * a union with other integer types). 211181b0c33SMatheus Ferst */ 212b7cd3db6SAvi Kivity struct Int128 { 213e03b5686SMarc-André Lureau #if HOST_BIG_ENDIAN 214181b0c33SMatheus Ferst int64_t hi; 215181b0c33SMatheus Ferst uint64_t lo; 216181b0c33SMatheus Ferst #else 217b7cd3db6SAvi Kivity uint64_t lo; 218b7cd3db6SAvi Kivity int64_t hi; 219181b0c33SMatheus Ferst #endif 220b7cd3db6SAvi Kivity }; 221b7cd3db6SAvi Kivity 222b7cd3db6SAvi Kivity static inline Int128 int128_make64(uint64_t a) 223b7cd3db6SAvi Kivity { 224181b0c33SMatheus Ferst return (Int128) { .lo = a, .hi = 0 }; 225b7cd3db6SAvi Kivity } 226b7cd3db6SAvi Kivity 227703235a3SPeter Maydell static inline Int128 int128_makes64(int64_t a) 228703235a3SPeter Maydell { 229181b0c33SMatheus Ferst return (Int128) { .lo = a, .hi = a >> 63 }; 230703235a3SPeter Maydell } 231703235a3SPeter Maydell 2321edaeee0SRichard Henderson static inline Int128 int128_make128(uint64_t lo, uint64_t hi) 2331edaeee0SRichard Henderson { 234181b0c33SMatheus Ferst return (Int128) { .lo = lo, .hi = hi }; 2351edaeee0SRichard Henderson } 2361edaeee0SRichard Henderson 237b7cd3db6SAvi Kivity static inline uint64_t int128_get64(Int128 a) 238b7cd3db6SAvi Kivity { 239b7cd3db6SAvi Kivity assert(!a.hi); 240b7cd3db6SAvi Kivity return a.lo; 241b7cd3db6SAvi Kivity } 242b7cd3db6SAvi Kivity 243258dfaaaSRichard Henderson static inline uint64_t int128_getlo(Int128 a) 244258dfaaaSRichard Henderson { 245258dfaaaSRichard Henderson return a.lo; 246258dfaaaSRichard Henderson } 247258dfaaaSRichard Henderson 248258dfaaaSRichard Henderson static inline int64_t int128_gethi(Int128 a) 249258dfaaaSRichard Henderson { 250258dfaaaSRichard Henderson return a.hi; 251258dfaaaSRichard Henderson } 252258dfaaaSRichard Henderson 253b7cd3db6SAvi Kivity static inline Int128 int128_zero(void) 254b7cd3db6SAvi Kivity { 255b7cd3db6SAvi Kivity return int128_make64(0); 256b7cd3db6SAvi Kivity } 257b7cd3db6SAvi Kivity 258b7cd3db6SAvi Kivity static inline Int128 int128_one(void) 259b7cd3db6SAvi Kivity { 260b7cd3db6SAvi Kivity return int128_make64(1); 261b7cd3db6SAvi Kivity } 262b7cd3db6SAvi Kivity 263b7cd3db6SAvi Kivity static inline Int128 int128_2_64(void) 264b7cd3db6SAvi Kivity { 265181b0c33SMatheus Ferst return int128_make128(0, 1); 266b7cd3db6SAvi Kivity } 267b7cd3db6SAvi Kivity 26812e1129bSAlexey Kardashevskiy static inline Int128 int128_exts64(int64_t a) 26912e1129bSAlexey Kardashevskiy { 270181b0c33SMatheus Ferst return int128_make128(a, (a < 0) ? -1 : 0); 27112e1129bSAlexey Kardashevskiy } 27212e1129bSAlexey Kardashevskiy 2731c469373SFrédéric Pétrot static inline Int128 int128_not(Int128 a) 2741c469373SFrédéric Pétrot { 2751c469373SFrédéric Pétrot return int128_make128(~a.lo, ~a.hi); 2761c469373SFrédéric Pétrot } 2771c469373SFrédéric Pétrot 278052e87b0SPaolo Bonzini static inline Int128 int128_and(Int128 a, Int128 b) 279052e87b0SPaolo Bonzini { 280181b0c33SMatheus Ferst return int128_make128(a.lo & b.lo, a.hi & b.hi); 281052e87b0SPaolo Bonzini } 282052e87b0SPaolo Bonzini 28308895cdaSRichard Henderson static inline Int128 int128_or(Int128 a, Int128 b) 28408895cdaSRichard Henderson { 285181b0c33SMatheus Ferst return int128_make128(a.lo | b.lo, a.hi | b.hi); 28608895cdaSRichard Henderson } 28708895cdaSRichard Henderson 2881c469373SFrédéric Pétrot static inline Int128 int128_xor(Int128 a, Int128 b) 2891c469373SFrédéric Pétrot { 2901c469373SFrédéric Pétrot return int128_make128(a.lo ^ b.lo, a.hi ^ b.hi); 2911c469373SFrédéric Pétrot } 2921c469373SFrédéric Pétrot 293052e87b0SPaolo Bonzini static inline Int128 int128_rshift(Int128 a, int n) 294052e87b0SPaolo Bonzini { 295052e87b0SPaolo Bonzini int64_t h; 296052e87b0SPaolo Bonzini if (!n) { 297052e87b0SPaolo Bonzini return a; 298052e87b0SPaolo Bonzini } 299052e87b0SPaolo Bonzini h = a.hi >> (n & 63); 300052e87b0SPaolo Bonzini if (n >= 64) { 3011edaeee0SRichard Henderson return int128_make128(h, h >> 63); 302052e87b0SPaolo Bonzini } else { 3031edaeee0SRichard Henderson return int128_make128((a.lo >> n) | ((uint64_t)a.hi << (64 - n)), h); 304052e87b0SPaolo Bonzini } 305052e87b0SPaolo Bonzini } 306052e87b0SPaolo Bonzini 307*613cf0fcSMatheus Ferst static inline Int128 int128_urshift(Int128 a, int n) 308*613cf0fcSMatheus Ferst { 309*613cf0fcSMatheus Ferst uint64_t h = a.hi; 310*613cf0fcSMatheus Ferst if (!n) { 311*613cf0fcSMatheus Ferst return a; 312*613cf0fcSMatheus Ferst } 313*613cf0fcSMatheus Ferst h = h >> (n & 63); 314*613cf0fcSMatheus Ferst if (n >= 64) { 315*613cf0fcSMatheus Ferst return int128_make64(h); 316*613cf0fcSMatheus Ferst } else { 317*613cf0fcSMatheus Ferst return int128_make128((a.lo >> n) | ((uint64_t)a.hi << (64 - n)), h); 318*613cf0fcSMatheus Ferst } 319*613cf0fcSMatheus Ferst } 320*613cf0fcSMatheus Ferst 3215be4dd04SRichard Henderson static inline Int128 int128_lshift(Int128 a, int n) 3225be4dd04SRichard Henderson { 3235be4dd04SRichard Henderson uint64_t l = a.lo << (n & 63); 3245be4dd04SRichard Henderson if (n >= 64) { 3255be4dd04SRichard Henderson return int128_make128(0, l); 3265be4dd04SRichard Henderson } else if (n > 0) { 3275be4dd04SRichard Henderson return int128_make128(l, (a.hi << n) | (a.lo >> (64 - n))); 3285be4dd04SRichard Henderson } 3295be4dd04SRichard Henderson return a; 3305be4dd04SRichard Henderson } 3315be4dd04SRichard Henderson 332b7cd3db6SAvi Kivity static inline Int128 int128_add(Int128 a, Int128 b) 333b7cd3db6SAvi Kivity { 3346046c620SPaolo Bonzini uint64_t lo = a.lo + b.lo; 3356046c620SPaolo Bonzini 3366046c620SPaolo Bonzini /* a.lo <= a.lo + b.lo < a.lo + k (k is the base, 2^64). Hence, 3376046c620SPaolo Bonzini * a.lo + b.lo >= k implies 0 <= lo = a.lo + b.lo - k < a.lo. 3386046c620SPaolo Bonzini * Similarly, a.lo + b.lo < k implies a.lo <= lo = a.lo + b.lo < k. 3396046c620SPaolo Bonzini * 3406046c620SPaolo Bonzini * So the carry is lo < a.lo. 3416046c620SPaolo Bonzini */ 3421edaeee0SRichard Henderson return int128_make128(lo, (uint64_t)a.hi + b.hi + (lo < a.lo)); 343b7cd3db6SAvi Kivity } 344b7cd3db6SAvi Kivity 345b7cd3db6SAvi Kivity static inline Int128 int128_neg(Int128 a) 346b7cd3db6SAvi Kivity { 3476046c620SPaolo Bonzini uint64_t lo = -a.lo; 3481edaeee0SRichard Henderson return int128_make128(lo, ~(uint64_t)a.hi + !lo); 349b7cd3db6SAvi Kivity } 350b7cd3db6SAvi Kivity 351b7cd3db6SAvi Kivity static inline Int128 int128_sub(Int128 a, Int128 b) 352b7cd3db6SAvi Kivity { 3531edaeee0SRichard Henderson return int128_make128(a.lo - b.lo, (uint64_t)a.hi - b.hi - (a.lo < b.lo)); 354b7cd3db6SAvi Kivity } 355b7cd3db6SAvi Kivity 356b7cd3db6SAvi Kivity static inline bool int128_nonneg(Int128 a) 357b7cd3db6SAvi Kivity { 358b7cd3db6SAvi Kivity return a.hi >= 0; 359b7cd3db6SAvi Kivity } 360b7cd3db6SAvi Kivity 361b7cd3db6SAvi Kivity static inline bool int128_eq(Int128 a, Int128 b) 362b7cd3db6SAvi Kivity { 363b7cd3db6SAvi Kivity return a.lo == b.lo && a.hi == b.hi; 364b7cd3db6SAvi Kivity } 365b7cd3db6SAvi Kivity 366b7cd3db6SAvi Kivity static inline bool int128_ne(Int128 a, Int128 b) 367b7cd3db6SAvi Kivity { 368b7cd3db6SAvi Kivity return !int128_eq(a, b); 369b7cd3db6SAvi Kivity } 370b7cd3db6SAvi Kivity 371b7cd3db6SAvi Kivity static inline bool int128_ge(Int128 a, Int128 b) 372b7cd3db6SAvi Kivity { 3736046c620SPaolo Bonzini return a.hi > b.hi || (a.hi == b.hi && a.lo >= b.lo); 374b7cd3db6SAvi Kivity } 375b7cd3db6SAvi Kivity 376b7cd3db6SAvi Kivity static inline bool int128_lt(Int128 a, Int128 b) 377b7cd3db6SAvi Kivity { 378b7cd3db6SAvi Kivity return !int128_ge(a, b); 379b7cd3db6SAvi Kivity } 380b7cd3db6SAvi Kivity 381b7cd3db6SAvi Kivity static inline bool int128_le(Int128 a, Int128 b) 382b7cd3db6SAvi Kivity { 383b7cd3db6SAvi Kivity return int128_ge(b, a); 384b7cd3db6SAvi Kivity } 385b7cd3db6SAvi Kivity 386b7cd3db6SAvi Kivity static inline bool int128_gt(Int128 a, Int128 b) 387b7cd3db6SAvi Kivity { 388b7cd3db6SAvi Kivity return !int128_le(a, b); 389b7cd3db6SAvi Kivity } 390b7cd3db6SAvi Kivity 391b7cd3db6SAvi Kivity static inline bool int128_nz(Int128 a) 392b7cd3db6SAvi Kivity { 393b7cd3db6SAvi Kivity return a.lo || a.hi; 394b7cd3db6SAvi Kivity } 395b7cd3db6SAvi Kivity 396b7cd3db6SAvi Kivity static inline Int128 int128_min(Int128 a, Int128 b) 397b7cd3db6SAvi Kivity { 398b7cd3db6SAvi Kivity return int128_le(a, b) ? a : b; 399b7cd3db6SAvi Kivity } 400b7cd3db6SAvi Kivity 401b7cd3db6SAvi Kivity static inline Int128 int128_max(Int128 a, Int128 b) 402b7cd3db6SAvi Kivity { 403b7cd3db6SAvi Kivity return int128_ge(a, b) ? a : b; 404b7cd3db6SAvi Kivity } 405b7cd3db6SAvi Kivity 406b7cd3db6SAvi Kivity static inline void int128_addto(Int128 *a, Int128 b) 407b7cd3db6SAvi Kivity { 408b7cd3db6SAvi Kivity *a = int128_add(*a, b); 409b7cd3db6SAvi Kivity } 410b7cd3db6SAvi Kivity 411b7cd3db6SAvi Kivity static inline void int128_subfrom(Int128 *a, Int128 b) 412b7cd3db6SAvi Kivity { 413b7cd3db6SAvi Kivity *a = int128_sub(*a, b); 414b7cd3db6SAvi Kivity } 415b7cd3db6SAvi Kivity 4162484cd9cSMatheus Ferst static inline Int128 bswap128(Int128 a) 4172484cd9cSMatheus Ferst { 4182484cd9cSMatheus Ferst return int128_make128(bswap64(a.hi), bswap64(a.lo)); 4192484cd9cSMatheus Ferst } 4202484cd9cSMatheus Ferst 421e9d07601SFrédéric Pétrot Int128 int128_divu(Int128, Int128); 422e9d07601SFrédéric Pétrot Int128 int128_remu(Int128, Int128); 423e9d07601SFrédéric Pétrot Int128 int128_divs(Int128, Int128); 424e9d07601SFrédéric Pétrot Int128 int128_rems(Int128, Int128); 425e9d07601SFrédéric Pétrot 4260846beb3SRichard Henderson #endif /* CONFIG_INT128 */ 4272484cd9cSMatheus Ferst 4282484cd9cSMatheus Ferst static inline void bswap128s(Int128 *s) 4292484cd9cSMatheus Ferst { 4302484cd9cSMatheus Ferst *s = bswap128(*s); 4312484cd9cSMatheus Ferst } 4322484cd9cSMatheus Ferst 433e9d07601SFrédéric Pétrot #define UINT128_MAX int128_make128(~0LL, ~0LL) 434e9d07601SFrédéric Pétrot 4350846beb3SRichard Henderson #endif /* INT128_H */ 436