diff options
Diffstat (limited to 'runtime/powerpc/i64_dtou.s')
-rw-r--r-- | runtime/powerpc/i64_dtou.s | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/runtime/powerpc/i64_dtou.s b/runtime/powerpc/i64_dtou.s index d9638e68..78cd08b1 100644 --- a/runtime/powerpc/i64_dtou.s +++ b/runtime/powerpc/i64_dtou.s @@ -61,9 +61,24 @@ __i64_dtou: # shift it appropriately cmpwi r5, 0 blt 3f - b __i64_shl # if EXP >= 0, shift left by EXP -3: subfic r5, r5, 0 - b __i64_shr # if EXP < 0, shift right by -EXP + # if EXP >= 0, shift left by EXP. Note that EXP < 12. + subfic r6, r5, 32 # r6 = 32 - EXP + slw r3, r3, r5 + srw r0, r4, r6 + or r3, r3, r0 + slw r4, r4, r5 + blr + # if EXP < 0, shift right by -EXP. Note that -EXP <= 52 but can be >= 32. +3: subfic r5, r5, 0 # r5 = -EXP = shift amount + subfic r6, r5, 32 # r6 = 32 - amount + addi r7, r5, -32 # r7 = amount - 32 (see i64_shr.s) + srw r4, r4, r5 + slw r0, r3, r6 + or r4, r4, r0 + srw r0, r3, r7 + or r4, r4, r0 + srw r3, r3, r5 + blr # Special cases 1: li r3, 0 # result is 0 li r4, 0 |