forked from Mirrors/tinycc
Fix signed integer division in ARM runtime ABI
- fix computation of absolute value (clearing the sign bit does not since integers are encoded in 2's complement) - test sign of integer in a more conventional way (binary and with the high bit does not work for long long due to a bug in gtst) - spacing in includemaster
parent
f2dbcf7594
commit
a24e31e85d
|
@ -331,16 +331,22 @@ void __aeabi_ ## name(type numerator, type denominator) \
|
|||
urettype uxdiv_ret; \
|
||||
rettype ret; \
|
||||
\
|
||||
num = numerator & typemacro ## _MAX; \
|
||||
den = denominator & typemacro ## _MAX; \
|
||||
if (numerator >= 0) \
|
||||
num = numerator; \
|
||||
else \
|
||||
num = 0 - numerator; \
|
||||
if (denominator >= 0) \
|
||||
den = denominator; \
|
||||
else \
|
||||
den = 0 - denominator; \
|
||||
uxdiv_ret = aeabi_ ## uiname(num, den); \
|
||||
/* signs differ */ \
|
||||
if ((numerator & typemacro ## _MIN) != (denominator & typemacro ## _MIN)) \
|
||||
ret.quot = uxdiv_ret.quot * -1; \
|
||||
ret.quot = 0 - uxdiv_ret.quot; \
|
||||
else \
|
||||
ret.quot = uxdiv_ret.quot; \
|
||||
if (numerator & typemacro ## _MIN) \
|
||||
ret.rem = uxdiv_ret.rem * -1; \
|
||||
if (numerator < 0) \
|
||||
ret.rem = 0 - uxdiv_ret.rem; \
|
||||
else \
|
||||
ret.rem = uxdiv_ret.rem; \
|
||||
\
|
||||
|
@ -420,8 +426,14 @@ int __aeabi_idiv(int numerator, int denominator)
|
|||
unsigned num, den;
|
||||
uidiv_t ret;
|
||||
|
||||
num = numerator & INT_MAX;
|
||||
den = denominator & INT_MAX;
|
||||
if (numerator >= 0)
|
||||
num = numerator;
|
||||
else
|
||||
num = 0 - numerator;
|
||||
if (denominator >= 0)
|
||||
den = denominator;
|
||||
else
|
||||
den = 0 - denominator;
|
||||
ret = aeabi_uidivmod(num, den);
|
||||
if ((numerator & INT_MIN) != (denominator & INT_MIN)) /* signs differ */
|
||||
ret.quot *= -1;
|
||||
|
|
Loading…
Reference in New Issue