summaryrefslogtreecommitdiff
path: root/runtime/powerpc/i64_dtou.s
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/powerpc/i64_dtou.s')
-rw-r--r--runtime/powerpc/i64_dtou.s21
1 files changed, 18 insertions, 3 deletions
diff --git a/runtime/powerpc/i64_dtou.s b/runtime/powerpc/i64_dtou.s
index d9638e6..78cd08b 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