This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "int_lib.h" | |
/* | |
typedef int si_int; | |
typedef unsigned su_int; | |
typedef long long di_int; | |
typedef unsigned long long du_int; | |
typedef int ti_int __attribute__((mode(TI))); // 128 signed | |
typedef unsigned tu_int __attribute__((mode(TI))); // 128 bit unsigned | |
*/ | |
#ifdef CRT_HAS_128BIT | |
COMPILER_RT_ABI tu_int __umodti3(tu_int a, tu_int b) { | |
tu_int r; | |
__udivmodti4(a, b, &r); | |
return r; | |
} | |
// Returns: a % b | |
COMPILER_RT_ABI ti_int __modti3(ti_int a, ti_int b) { | |
const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1; | |
ti_int s = b >> bits_in_tword_m1; // s = b < 0 ? -1 : 0 | |
b = (b ^ s) - s; // negate if s == -1 | |
s = a >> bits_in_tword_m1; // s = a < 0 ? -1 : 0 | |
a = (a ^ s) - s; // negate if s == -1 | |
tu_int r; | |
__udivmodti4(a, b, &r); | |
return ((ti_int)r ^ s) - s; // negate if s == -1 | |
} | |
#endif // CRT_HAS_128BIT |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "int_lib.h" | |
/* | |
typedef int si_int; | |
typedef unsigned su_int; | |
typedef long long di_int; | |
typedef unsigned long long du_int; | |
typedef int ti_int __attribute__((mode(TI))); // 128 signed | |
typedef unsigned tu_int __attribute__((mode(TI))); // 128 bit unsigned | |
*/ | |
#ifdef CRT_HAS_128BIT | |
// Returns: a / b | |
COMPILER_RT_ABI tu_int __udivti3(tu_int a, tu_int b) { | |
return __udivmodti4(a, b, 0); | |
} | |
COMPILER_RT_ABI ti_int __divti3(ti_int a, ti_int b) { | |
const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1; | |
ti_int s_a = a >> bits_in_tword_m1; // s_a = a < 0 ? -1 : 0 | |
ti_int s_b = b >> bits_in_tword_m1; // s_b = b < 0 ? -1 : 0 | |
a = (a ^ s_a) - s_a; // negate if s_a == -1 | |
b = (b ^ s_b) - s_b; // negate if s_b == -1 | |
s_a ^= s_b; // sign of quotient | |
return (__udivmodti4(a, b, (tu_int *)0) ^ s_a) - s_a; // negate if s_a == -1 | |
} | |
#endif // CRT_HAS_128BIT |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment