diff options
Diffstat (limited to 'runtime/arm/i64_utof.S')
-rw-r--r-- | runtime/arm/i64_utof.S | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/runtime/arm/i64_utof.S b/runtime/arm/i64_utof.S index ff21438..6fb11df 100644 --- a/runtime/arm/i64_utof.S +++ b/runtime/arm/i64_utof.S @@ -40,30 +40,30 @@ .global __i64_utof __i64_utof: - # Check whether X < 2^53 - movs r2, r1, lsr #21 # test if X >> 53 == 0 - beq 1b - # X is large enough that double rounding can occur. - # Avoid it by nudging X away from the points where double rounding - # occurs (the "round to odd" technique) + @ Check whether X < 2^53 + movs r2, r1, lsr #21 @ test if X >> 53 == 0 + beq 1f + @ X is large enough that double rounding can occur. + @ Avoid it by nudging X away from the points where double rounding + @ occurs (the "round to odd" technique) mov r2, #0x700 - orr r2, r2, #0xFF # r2 = 0x7FF - and r3, r0, r2 # extract bits 0 to 11 of X - add r3, r3, r2 # r3 = (X & 0x7FF) + 0x7FF - # bit 12 of r3 is 0 if all low 12 bits of X are 0, 1 otherwise - # bits 13-31 of r3 are 0 - orr r0, r0, r3 # correct bit number 12 of X - bic r0, r0, r2 # set to 0 bits 0 to 11 of X - # Convert to double + orr r2, r2, #0xFF @ r2 = 0x7FF + and r3, r0, r2 @ extract bits 0 to 11 of X + add r3, r3, r2 @ r3 = (X & 0x7FF) + 0x7FF + @ bit 12 of r3 is 0 if all low 12 bits of X are 0, 1 otherwise + @ bits 13-31 of r3 are 0 + orr r0, r0, r3 @ correct bit number 12 of X + bic r0, r0, r2 @ set to 0 bits 0 to 11 of X + @ Convert to double 1: fmsr s0, r0 fuitod d0, s0 @ convert low half to double (unsigned) fmsr s2, r1 fuitod d1, s2 @ convert high half to double (unsigned) fldd d2, .LC1 @ d2 = 2^32 fmacd d0, d1, d2 @ d0 = d0 + d1 * d2 = double value of int64 - # Round to single + @ Round to single fcvtsd s0, d0 - # Return result in r0 + @ Return result in r0 fmrs r0, s0 bx lr .type __i64_utof, %function |