| #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 |
| #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