diff options
Diffstat (limited to 'runtime/arm/i64_dtos.S')
-rw-r--r-- | runtime/arm/i64_dtos.S | 67 |
1 files changed, 34 insertions, 33 deletions
diff --git a/runtime/arm/i64_dtos.S b/runtime/arm/i64_dtos.S index e454fd4c..638a5ff5 100644 --- a/runtime/arm/i64_dtos.S +++ b/runtime/arm/i64_dtos.S @@ -34,66 +34,67 @@ @ Helper functions for 64-bit integer arithmetic. ARM version. - .text +#include "sysdeps.h" @@@ Conversion from double float to signed 64-bit integer - .global __i64_dtos -__i64_dtos: -#ifdef VARIANT_hardfloat - fmrrd r0, r1, d0 +FUNCTION(__i64_dtos) +#ifndef VARIANT_eabi + vmov r0, r1, d0 #endif - mov r12, r1, asr #31 @ save sign of result in r12 + ASR r12, r1, #31 @ save sign of result in r12 @ extract unbiased exponent ((HI & 0x7FF00000) >> 20) - (1023 + 52) in r2 @ note: 1023 + 52 = 1075 = 1024 + 51 @ note: (HI & 0x7FF00000) >> 20 = (HI << 1) >> 21 - mov r2, r1, lsl #1 - mov r2, r2, lsr #21 - sub r2, r2, #51 - sub r2, r2, #1024 + LSL r2, r1, #1 + LSR r2, r2, #21 + SUB r2, r2, #51 + SUB r2, r2, #1024 @ check range of exponent cmn r2, #52 @ if EXP < -52, |double| is < 1.0 blt 1f cmp r2, #11 @ if EXP >= 63 - 52, |double| is >= 2^63 bge 2f @ extract true mantissa - bic r1, r1, #0xFF000000 - bic r1, r1, #0x00F00000 @ HI &= ~0xFFF00000 - orr r1, r1, #0x00100000 @ HI |= 0x00100000 + BIC r1, r1, #0xFF000000 + BIC r1, r1, #0x00F00000 @ HI &= ~0xFFF00000 + ORR r1, r1, #0x00100000 @ HI |= 0x00100000 @ shift it appropriately cmp r2, #0 blt 3f @ EXP >= 0: shift left by EXP. Note that EXP < 12 rsb r3, r2, #32 @ r3 = 32 - amount - mov r1, r1, lsl r2 - orr r1, r1, r0, lsr r3 - mov r0, r0, lsl r2 + LSL r1, r1, r2 + LSR r3, r0, r3 + ORR r1, r1, r3 + LSL r0, r0, r2 b 4f @ EXP < 0: shift right by -EXP. Note that -EXP <= 52 but can be >= 32 -3: rsb r2, r2, #0 @ r2 = -EXP - shift amount - rsb r3, r2, #32 @ r3 = 32 - amount - mov r0, r0, lsr r2 - orr r0, r0, r1, lsl r3 - sub r3, r2, #32 @ r3 = amount - 32 (see i64_shr.s) - orr r0, r0, r1, lsr r3 - mov r1, r1, lsr r2 +3: RSB r2, r2, #0 @ r2 = -EXP = shift amount + RSB r3, r2, #32 @ r3 = 32 - amount + LSR r0, r0, r2 + LSL r3, r1, r3 + ORR r0, r0, r3 + SUB r3, r2, #32 @ r3 = amount - 32 (see i64_shr.s) + LSR r3, r1, r3 + ORR r0, r0, r3 + LSR r1, r1, r2 @ apply sign to result -4: eor r0, r0, r12 - eor r1, r1, r12 +4: EOR r0, r0, r12 + EOR r1, r1, r12 subs r0, r0, r12 sbc r1, r1, r12 bx lr @ special cases -1: mov r0, #0 @ result is 0 - mov r1, #0 +1: MOV r0, #0 @ result is 0 + MOV r1, #0 bx lr -2: cmp r4, #0 +2: cmp r12, #0 blt 6f mvn r0, #0 @ result is 0x7F....FF (MAX_SINT) - mov r1, r0, lsr #1 + LSR r1, r0, #1 bx lr -6: mov r0, #0 @ result is 0x80....00 (MIN_SINT) - mov r1, #0x80000000 +6: MOV r0, #0 @ result is 0x80....00 (MIN_SINT) + MOV r1, #0x80000000 bx lr - .type __i64_dtos, %function - .size __i64_dtos, . - __i64_dtos +ENDFUNCTION(__i64_dtos) |