xref: /qemu/include/qemu/int128.h (revision 613cf0fcbabee5ec34cab85a933eb3d46845a7cb)
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