[ARM/CRT] Refactor several functions (#3865)

- Make __fto64 function more readable
- Call worker function directly for __rt_sdiv/udiv
- Adapt __rt_sdiv64/udiv64 asm shims accordingly
- Add header files to CMake source list

CORE-17607 CORE-17614 CORE-17703 CORE-17604

Addendum to f2bc1f0e, e448094e and 54406bf4.
This commit is contained in:
Roman Masanin 2021-07-31 04:04:25 +03:00 committed by Stanislav Motylkov
parent d7f13aa696
commit be3c532bf4
No known key found for this signature in database
GPG key ID: AFE513258CBA9E92
12 changed files with 70 additions and 76 deletions

View file

@ -23,6 +23,12 @@ unsigned
#endif
long long FTO64_RESULT;
typedef union _FTO64_UNION
{
FLOAT_TYPE value;
FINT_TYPE raw;
} FTO64_UNION;
#define SIGN_MASK (((FINT_TYPE)1) << (FRACTION_LEN + EXPONENT_LEN))
#define FRACTION_ONE (((FINT_TYPE)1) << FRACTION_LEN)
@ -44,18 +50,14 @@ long long FTO64_RESULT;
#define NEGATE(x) (~(x) + 1)
FTO64_RESULT
__fto64(FLOAT_TYPE value)
__fto64(FLOAT_TYPE fvalue)
{
union {
FLOAT_TYPE val_float;
FINT_TYPE val_int;
} u;
FTO64_UNION u = { .value = fvalue };
FINT_TYPE value = u.raw;
int exponent;
FTO64_RESULT fraction;
u.val_float = value;
exponent = (int)(u.val_int >> FRACTION_LEN);
exponent = (int)(value >> FRACTION_LEN);
exponent &= EXPONENT_MASK;
/* infinity and other NaNs */
@ -77,11 +79,11 @@ __fto64(FLOAT_TYPE value)
return INTNAN;
#ifndef _USE_SIGNED_
if (u.val_int & SIGN_MASK)
if (value & SIGN_MASK)
return INTNAN;
#endif
fraction = u.val_int & FRACTION_MASK;
fraction = value & FRACTION_MASK;
fraction |= FRACTION_ONE;
exponent -= FRACTION_LEN;
@ -94,7 +96,7 @@ __fto64(FLOAT_TYPE value)
}
#ifdef _USE_SIGNED_
if (u.val_int & SIGN_MASK)
if (value & SIGN_MASK)
fraction = NEGATE(fraction);
#endif