4 * Created on: Aug 12, 2009
11 void __attribute__((noreturn
)) __aeabi_ldiv0(uint64_t);
13 int64_t __ldiv(int64_t a
, int64_t b
)
15 int32_t sign
= ((int32_t)(a
>> 32))^((int32_t)(b
>> 32));
33 int first_bit_a
= __builtin_clz(a
>> 32);
34 int first_bit_b
= __builtin_clz(b
>> 32);
36 if (first_bit_a
== 32)
37 first_bit_a
+= __builtin_clz(a
& 0xffffffff);
38 if (first_bit_b
== 32)
39 first_bit_b
+= __builtin_clz(b
& 0xffffffff);
41 uint64_t mask
= 0x00000001ULL
<< (first_bit_b
-first_bit_a
);
42 b
<<= (first_bit_b
- first_bit_a
);
63 int64_t __ldivmod_helper(int64_t a
, int64_t b
, int64_t *remainder
)
67 quotient
= __ldiv(a
, b
);
69 *remainder
= a
- b
* quotient
;