int test__udivdi3(du_int a, du_int b, du_int expected_q) { du_int q = __udivdi3(a, b); if (q != expected_q) printf("error in __udivdi3: %lld / %lld = %lld, expected %lld\n", a, b, q, expected_q); return q != expected_q; }
unsigned long long __gnu_uldivmod_helper (unsigned long long a, unsigned long long b, unsigned long long *remainder) { unsigned long long quotient; quotient = __udivdi3 (a, b); *remainder = a - b * quotient; return quotient; }
// Signed 32-bit integer division long long int __divdi3(long long int value1, long long int value2) { int sign1 = value1 >> 63; int sign2 = value2 >> 63; // Take absolute values unsigned long long int u_value1 = (value1 ^ sign1) - sign1; unsigned long long int u_value2 = (value2 ^ sign2) - sign2; // Compute result sign sign1 ^= sign2; // Perform division (will call __udivsi3), then convert sign back return (__udivdi3(u_value1, u_value2) ^ sign1) - sign1; }
int main() { // Shift left 64 bits, less than 32 bit shift, unsigned value print64bit(__ashldi3(0x1257493827394374LL, 3)); // CHECK: 0x92ba49c139ca1ba0 // Shift left 64 bits, more than 32 bit shift, unsigned value print64bit(__ashldi3(0x1257493827394374LL, 34)); // CHECK: 0x9ce50dd000000000 // Logical shift right 64 bits, less than 32 bit shift, unsigned value print64bit(__lshrdi3(0x1d348856d51c4737LL, 7)); // CHECK: 0x003a6910adaa388e // Signed value print64bit(__lshrdi3(0xfd348856d51c4737LL, 7)); // CHECK: 0x01fa6910adaa388e // Logical shift right 64 bits, more than 32 bit shift, unsigned value print64bit(__lshrdi3(0x1d348856d51c4737LL, 37)); // CHECK: 0x0000000000e9a442 // Signed value print64bit(__lshrdi3(0xfd348856d51c4737LL, 37)); // CHECK: 0x0000000007e9a442 // Unsigned 32 bit integer division, signed value printf("0x%08x\n", __udivsi3(0xf39eca1b, 17)); // CHECK: 0x0e54a27a // Unsigned value printf("0x%08x\n", __udivsi3(0x5b0a6c63, 17)); // CHECK: 0x055af751 // Signed 32 bit integer division, signed value printf("0x%08x\n", __divsi3(0xf39eca1b, 17)); // CHECK: 0xff45936b // Unsigned value printf("0x%08x\n", __divsi3(0x539eca1b, 17)); // CHECK: 0x04eb3910 // Unsigned 32 bit integer modulus, signed value printf("0x%08x\n", __umodsi3(0xf39eca1b, 495)); // CHECK: 0x000001d1 // Unsigned value printf("0x%08x\n", __umodsi3(0x539eca1b, 495)); // CHECK: 0x000000d7 // Signed 32 bit integer modulus, signed value printf("0x%08x\n", __modsi3(0xf39eca1b, 495)); // CHECK: 0xfffffeb5 // Unsigned value printf("0x%08x\n", __modsi3(0x539eca1b, 495)); // CHECK: 0x000000d7 // Unsigned 64 bit integer division, signed value print64bit(__udivdi3(0xf3c367523e29230aLL, 495)); // CHECK: 0x007e114680625881 // Unsigned value print64bit(__udivdi3(0x53c367523e29230aLL, 495)); // CHECK: 0x002b51ebff175b17 // Signed 64 bit integer division, signed value print64bit(__divdi3(0xf3c367523e29230aLL, 495)); // CHECK: 0xfff9abe8e4b72972 // Unsigned value print64bit(__divdi3(0x53c367523e29230aLL, 495)); // CHECK: 0x002b51ebff175b17 // Unsigned 64 bit integer modulus, signed value print64bit(__umoddi3(0xf3c367523e29230aLL, 495)); // CHECK: 0x000000000000019b // Unsigned value print64bit(__umoddi3(0x53c367523e29230aLL, 495)); // CHECK: 0x0000000000000191 // Signed 64 bit integer modulus, signed value print64bit(__moddi3(0xf3c367523e29230aLL, 495)); // CHECK: 0xffffffffffffff9c // Unsigned value print64bit(__moddi3(0x53c367523e29230aLL, 495)); // CHECK: 0x0000000000000191 // Convert 64 bit value to float, greater than > 32 bits printfloathex(__floatundisf(1674874919848732277LL)); // CHECK: 0x5db9f2cf // < 32 bits printfloathex(__floatundisf(1674877LL)); // CHECK: 0x49cc73e8 }
// Time getter functions int32_t time_getSeconds(timestamp_t time) { int32_t seconds = (int32_t)__udivdi3(time, 1000); return seconds; }
// Unsigned 64-bit integer modulus unsigned long long int __umoddi3(unsigned long long int value1, unsigned long long int value2) { return value1 - __udivdi3(value1, value2) * value2; }