Use paired immediates for large constants.
The double-to-int and double-to-long instructions were loading constants
from .word directives, which wastes space in the CPU data cache. This
replaces a single LDR with a pair of data operations.
We don't actually use the double-to-long handler (the ARM EABI lib
does the right thing), and double-to-int is handled by VFP on newer
devices, but on older devices this may help a smidgeon. Mostly it just
looks nicer when you don't have .words lying around.
Also picks up a change that should be in the armv7-a generated file but
got lost in all of today's various mergings (float compare tweak).
diff --git a/vm/mterp/armv5te/OP_DOUBLE_TO_INT.S b/vm/mterp/armv5te/OP_DOUBLE_TO_INT.S
index db5a5d8..2cf88f0 100644
--- a/vm/mterp/armv5te/OP_DOUBLE_TO_INT.S
+++ b/vm/mterp/armv5te/OP_DOUBLE_TO_INT.S
@@ -14,20 +14,23 @@
*/
d2i_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r2, .L${opcode}_maxlo @ (double)maxint, lo
- ldr r3, .L${opcode}_maxhi @ (double)maxint, hi
+ mov r2, #0x80000000 @ maxint, as a double (low word)
+ mov r2, r2, asr #9 @ 0xffc00000
sub sp, sp, #4 @ align for EABI
- mov r4, r0 @ save r0
+ mvn r3, #0xbe000000 @ maxint, as a double (high word)
+ sub r3, r3, #0x00200000 @ 0x41dfffff
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxint?
cmp r0, #0 @ nonzero == yes
- mvnne r0, #0x80000000 @ return maxint (7fffffff)
+ mvnne r0, #0x80000000 @ return maxint (0x7fffffff)
bne 1f
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .L${opcode}_min @ (double)minint, hi
- mov r2, #0 @ (double)minint, lo
+ mov r3, #0xc1000000 @ minint, as a double (high word)
+ add r3, r3, #0x00e00000 @ 0xc1e00000
+ mov r2, #0 @ minint, as a double (low word)
bl __aeabi_dcmple @ is arg <= minint?
cmp r0, #0 @ nonzero == yes
movne r0, #0x80000000 @ return minint (80000000)
@@ -48,12 +51,5 @@
1:
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-
-.L${opcode}_maxlo:
- .word 0xffc00000 @ maxint, as a double (low word)
-.L${opcode}_maxhi:
- .word 0x41dfffff @ maxint, as a double (high word)
-.L${opcode}_min:
- .word 0xc1e00000 @ minint, as a double (high word)
#endif
diff --git a/vm/mterp/armv5te/OP_DOUBLE_TO_LONG.S b/vm/mterp/armv5te/OP_DOUBLE_TO_LONG.S
index 1d274e9..563027d 100644
--- a/vm/mterp/armv5te/OP_DOUBLE_TO_LONG.S
+++ b/vm/mterp/armv5te/OP_DOUBLE_TO_LONG.S
@@ -12,10 +12,11 @@
*/
d2l_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r3, .L${opcode}_max @ (double)maxlong, hi
+ mov r3, #0x43000000 @ maxlong, as a double (high word)
+ add r3, #0x00e00000 @ 0x43e00000
+ mov r2, #0 @ maxlong, as a double (low word)
sub sp, sp, #4 @ align for EABI
- mov r2, #0 @ (double)maxlong, lo
- mov r4, r0 @ save r0
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxlong?
cmp r0, #0 @ nonzero == yes
@@ -25,8 +26,9 @@
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .L${opcode}_min @ (double)minlong, hi
- mov r2, #0 @ (double)minlong, lo
+ mov r3, #0xc3000000 @ minlong, as a double (high word)
+ add r3, #0x00e00000 @ 0xc3e00000
+ mov r2, #0 @ minlong, as a double (low word)
bl __aeabi_dcmple @ is arg <= minlong?
cmp r0, #0 @ nonzero == yes
movne r0, #0 @ return minlong (8000000000000000)
@@ -50,8 +52,3 @@
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-.L${opcode}_max:
- .word 0x43e00000 @ maxlong, as a double (high word)
-.L${opcode}_min:
- .word 0xc3e00000 @ minlong, as a double (high word)
-
diff --git a/vm/mterp/armv6t2/OP_DOUBLE_TO_INT.S b/vm/mterp/armv6t2/OP_DOUBLE_TO_INT.S
index b92a76d..d3882f3 100644
--- a/vm/mterp/armv6t2/OP_DOUBLE_TO_INT.S
+++ b/vm/mterp/armv6t2/OP_DOUBLE_TO_INT.S
@@ -3,7 +3,7 @@
%include "armv6t2/unopNarrower.S" {"instr":"bl __aeabi_d2iz"}
#if 0
-@include "armv6t2/unopNarrower.S" {"instr":"bl d2i_doconv"}
+@include "armv5te/unopNarrower.S" {"instr":"bl d2i_doconv"}
@break
/*
* Convert the double in r0/r1 to an int in r0.
@@ -14,20 +14,23 @@
*/
d2i_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r2, .L${opcode}_maxlo @ (double)maxint, lo
- ldr r3, .L${opcode}_maxhi @ (double)maxint, hi
+ mov r2, #0x80000000 @ maxint, as a double (low word)
+ mov r2, r2, asr #9 @ 0xffc00000
sub sp, sp, #4 @ align for EABI
- mov r4, r0 @ save r0
+ mvn r3, #0xbe000000 @ maxint, as a double (high word)
+ sub r3, r3, #0x00200000 @ 0x41dfffff
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxint?
cmp r0, #0 @ nonzero == yes
- mvnne r0, #0x80000000 @ return maxint (7fffffff)
+ mvnne r0, #0x80000000 @ return maxint (0x7fffffff)
bne 1f
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .L${opcode}_min @ (double)minint, hi
- mov r2, #0 @ (double)minint, lo
+ mov r3, #0xc1000000 @ minint, as a double (high word)
+ add r3, r3, #0x00e00000 @ 0xc1e00000
+ mov r2, #0 @ minint, as a double (low word)
bl __aeabi_dcmple @ is arg <= minint?
cmp r0, #0 @ nonzero == yes
movne r0, #0x80000000 @ return minint (80000000)
@@ -48,12 +51,5 @@
1:
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-
-.L${opcode}_maxlo:
- .word 0xffc00000 @ maxint, as a double (low word)
-.L${opcode}_maxhi:
- .word 0x41dfffff @ maxint, as a double (high word)
-.L${opcode}_min:
- .word 0xc1e00000 @ minint, as a double (high word)
#endif
diff --git a/vm/mterp/armv6t2/OP_DOUBLE_TO_LONG.S b/vm/mterp/armv6t2/OP_DOUBLE_TO_LONG.S
index 71af72d..a9ecab7 100644
--- a/vm/mterp/armv6t2/OP_DOUBLE_TO_LONG.S
+++ b/vm/mterp/armv6t2/OP_DOUBLE_TO_LONG.S
@@ -12,10 +12,11 @@
*/
d2l_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r3, .L${opcode}_max @ (double)maxlong, hi
+ mov r3, #0x43000000 @ maxlong, as a double (high word)
+ add r3, #0x00e00000 @ 0x43e00000
+ mov r2, #0 @ maxlong, as a double (low word)
sub sp, sp, #4 @ align for EABI
- mov r2, #0 @ (double)maxlong, lo
- mov r4, r0 @ save r0
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxlong?
cmp r0, #0 @ nonzero == yes
@@ -25,8 +26,9 @@
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .L${opcode}_min @ (double)minlong, hi
- mov r2, #0 @ (double)minlong, lo
+ mov r3, #0xc3000000 @ minlong, as a double (high word)
+ add r3, #0x00e00000 @ 0xc3e00000
+ mov r2, #0 @ minlong, as a double (low word)
bl __aeabi_dcmple @ is arg <= minlong?
cmp r0, #0 @ nonzero == yes
movne r0, #0 @ return minlong (8000000000000000)
@@ -50,8 +52,3 @@
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-.L${opcode}_max:
- .word 0x43e00000 @ maxlong, as a double (high word)
-.L${opcode}_min:
- .word 0xc3e00000 @ minlong, as a double (high word)
-
diff --git a/vm/mterp/out/InterpAsm-armv4t.S b/vm/mterp/out/InterpAsm-armv4t.S
index 033b305..3b3d0a9 100644
--- a/vm/mterp/out/InterpAsm-armv4t.S
+++ b/vm/mterp/out/InterpAsm-armv4t.S
@@ -4021,20 +4021,23 @@
*/
d2i_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r2, .LOP_DOUBLE_TO_INT_maxlo @ (double)maxint, lo
- ldr r3, .LOP_DOUBLE_TO_INT_maxhi @ (double)maxint, hi
+ mov r2, #0x80000000 @ maxint, as a double (low word)
+ mov r2, r2, asr #9 @ 0xffc00000
sub sp, sp, #4 @ align for EABI
- mov r4, r0 @ save r0
+ mvn r3, #0xbe000000 @ maxint, as a double (high word)
+ sub r3, r3, #0x00200000 @ 0x41dfffff
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxint?
cmp r0, #0 @ nonzero == yes
- mvnne r0, #0x80000000 @ return maxint (7fffffff)
+ mvnne r0, #0x80000000 @ return maxint (0x7fffffff)
bne 1f
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .LOP_DOUBLE_TO_INT_min @ (double)minint, hi
- mov r2, #0 @ (double)minint, lo
+ mov r3, #0xc1000000 @ minint, as a double (high word)
+ add r3, r3, #0x00e00000 @ 0xc1e00000
+ mov r2, #0 @ minint, as a double (low word)
bl __aeabi_dcmple @ is arg <= minint?
cmp r0, #0 @ nonzero == yes
movne r0, #0x80000000 @ return minint (80000000)
@@ -4055,13 +4058,6 @@
1:
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-
-.LOP_DOUBLE_TO_INT_maxlo:
- .word 0xffc00000 @ maxint, as a double (low word)
-.LOP_DOUBLE_TO_INT_maxhi:
- .word 0x41dfffff @ maxint, as a double (high word)
-.LOP_DOUBLE_TO_INT_min:
- .word 0xc1e00000 @ minint, as a double (high word)
#endif
@@ -9333,10 +9329,11 @@
*/
d2l_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r3, .LOP_DOUBLE_TO_LONG_max @ (double)maxlong, hi
+ mov r3, #0x43000000 @ maxlong, as a double (high word)
+ add r3, #0x00e00000 @ 0x43e00000
+ mov r2, #0 @ maxlong, as a double (low word)
sub sp, sp, #4 @ align for EABI
- mov r2, #0 @ (double)maxlong, lo
- mov r4, r0 @ save r0
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxlong?
cmp r0, #0 @ nonzero == yes
@@ -9346,8 +9343,9 @@
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .LOP_DOUBLE_TO_LONG_min @ (double)minlong, hi
- mov r2, #0 @ (double)minlong, lo
+ mov r3, #0xc3000000 @ minlong, as a double (high word)
+ add r3, #0x00e00000 @ 0xc3e00000
+ mov r2, #0 @ minlong, as a double (low word)
bl __aeabi_dcmple @ is arg <= minlong?
cmp r0, #0 @ nonzero == yes
movne r0, #0 @ return minlong (8000000000000000)
@@ -9371,11 +9369,6 @@
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-.LOP_DOUBLE_TO_LONG_max:
- .word 0x43e00000 @ maxlong, as a double (high word)
-.LOP_DOUBLE_TO_LONG_min:
- .word 0xc3e00000 @ minlong, as a double (high word)
-
/* continuation for OP_MUL_LONG */
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index 2d6fa3e..860c3e7 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -8847,10 +8847,11 @@
*/
d2l_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r3, .LOP_DOUBLE_TO_LONG_max @ (double)maxlong, hi
+ mov r3, #0x43000000 @ maxlong, as a double (high word)
+ add r3, #0x00e00000 @ 0x43e00000
+ mov r2, #0 @ maxlong, as a double (low word)
sub sp, sp, #4 @ align for EABI
- mov r2, #0 @ (double)maxlong, lo
- mov r4, r0 @ save r0
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxlong?
cmp r0, #0 @ nonzero == yes
@@ -8860,8 +8861,9 @@
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .LOP_DOUBLE_TO_LONG_min @ (double)minlong, hi
- mov r2, #0 @ (double)minlong, lo
+ mov r3, #0xc3000000 @ minlong, as a double (high word)
+ add r3, #0x00e00000 @ 0xc3e00000
+ mov r2, #0 @ minlong, as a double (low word)
bl __aeabi_dcmple @ is arg <= minlong?
cmp r0, #0 @ nonzero == yes
movne r0, #0 @ return minlong (8000000000000000)
@@ -8885,11 +8887,6 @@
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-.LOP_DOUBLE_TO_LONG_max:
- .word 0x43e00000 @ maxlong, as a double (high word)
-.LOP_DOUBLE_TO_LONG_min:
- .word 0xc3e00000 @ minlong, as a double (high word)
-
/* continuation for OP_MUL_LONG */
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index 90355be..5ba2523 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -4021,20 +4021,23 @@
*/
d2i_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r2, .LOP_DOUBLE_TO_INT_maxlo @ (double)maxint, lo
- ldr r3, .LOP_DOUBLE_TO_INT_maxhi @ (double)maxint, hi
+ mov r2, #0x80000000 @ maxint, as a double (low word)
+ mov r2, r2, asr #9 @ 0xffc00000
sub sp, sp, #4 @ align for EABI
- mov r4, r0 @ save r0
+ mvn r3, #0xbe000000 @ maxint, as a double (high word)
+ sub r3, r3, #0x00200000 @ 0x41dfffff
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxint?
cmp r0, #0 @ nonzero == yes
- mvnne r0, #0x80000000 @ return maxint (7fffffff)
+ mvnne r0, #0x80000000 @ return maxint (0x7fffffff)
bne 1f
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .LOP_DOUBLE_TO_INT_min @ (double)minint, hi
- mov r2, #0 @ (double)minint, lo
+ mov r3, #0xc1000000 @ minint, as a double (high word)
+ add r3, r3, #0x00e00000 @ 0xc1e00000
+ mov r2, #0 @ minint, as a double (low word)
bl __aeabi_dcmple @ is arg <= minint?
cmp r0, #0 @ nonzero == yes
movne r0, #0x80000000 @ return minint (80000000)
@@ -4055,13 +4058,6 @@
1:
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-
-.LOP_DOUBLE_TO_INT_maxlo:
- .word 0xffc00000 @ maxint, as a double (low word)
-.LOP_DOUBLE_TO_INT_maxhi:
- .word 0x41dfffff @ maxint, as a double (high word)
-.LOP_DOUBLE_TO_INT_min:
- .word 0xc1e00000 @ minint, as a double (high word)
#endif
@@ -9327,10 +9323,11 @@
*/
d2l_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r3, .LOP_DOUBLE_TO_LONG_max @ (double)maxlong, hi
+ mov r3, #0x43000000 @ maxlong, as a double (high word)
+ add r3, #0x00e00000 @ 0x43e00000
+ mov r2, #0 @ maxlong, as a double (low word)
sub sp, sp, #4 @ align for EABI
- mov r2, #0 @ (double)maxlong, lo
- mov r4, r0 @ save r0
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxlong?
cmp r0, #0 @ nonzero == yes
@@ -9340,8 +9337,9 @@
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .LOP_DOUBLE_TO_LONG_min @ (double)minlong, hi
- mov r2, #0 @ (double)minlong, lo
+ mov r3, #0xc3000000 @ minlong, as a double (high word)
+ add r3, #0x00e00000 @ 0xc3e00000
+ mov r2, #0 @ minlong, as a double (low word)
bl __aeabi_dcmple @ is arg <= minlong?
cmp r0, #0 @ nonzero == yes
movne r0, #0 @ return minlong (8000000000000000)
@@ -9365,11 +9363,6 @@
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-.LOP_DOUBLE_TO_LONG_max:
- .word 0x43e00000 @ maxlong, as a double (high word)
-.LOP_DOUBLE_TO_LONG_min:
- .word 0xc3e00000 @ minlong, as a double (high word)
-
/* continuation for OP_MUL_LONG */
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index 155b98b..923084f 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -1317,13 +1317,13 @@
*/
/* op vAA, vBB, vCC */
FETCH(r0, 1) @ r0<- CCBB
- and r2, r0, #255 @ r2<- BB
- VREG_INDEX_TO_ADDR(r2, r2) @ r2<- &vBB
- flds s0, [r2] @ s0<- vBB
- mov r3, r0, lsr #8 @ r3<- CC
- VREG_INDEX_TO_ADDR(r3, r3) @ r3<- &vCC
- flds s1, [r3] @ s1<- vCC
mov r9, rINST, lsr #8 @ r9<- AA
+ and r2, r0, #255 @ r2<- BB
+ mov r3, r0, lsr #8 @ r3<- CC
+ VREG_INDEX_TO_ADDR(r2, r2) @ r2<- &vBB
+ VREG_INDEX_TO_ADDR(r3, r3) @ r3<- &vCC
+ flds s0, [r2] @ s0<- vBB
+ flds s1, [r3] @ s1<- vCC
fcmpes s0, s1 @ compare (vBB, vCC)
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
mvn r0, #0 @ r0<- -1 (default)
@@ -1331,7 +1331,7 @@
fmstat @ export status flags
movgt r0, #1 @ (greater than) r1<- 1
moveq r0, #0 @ (equal) r1<- 0
- bl .LOP_CMPL_FLOAT_finish @ argh
+ b .LOP_CMPL_FLOAT_finish @ argh
/* ------------------------------ */
@@ -1356,13 +1356,13 @@
*/
/* op vAA, vBB, vCC */
FETCH(r0, 1) @ r0<- CCBB
- and r2, r0, #255 @ r2<- BB
- VREG_INDEX_TO_ADDR(r2, r2) @ r2<- &vBB
- flds s0, [r2] @ s0<- vBB
- mov r3, r0, lsr #8 @ r3<- CC
- VREG_INDEX_TO_ADDR(r3, r3) @ r3<- &vCC
- flds s1, [r3] @ s1<- vCC
mov r9, rINST, lsr #8 @ r9<- AA
+ and r2, r0, #255 @ r2<- BB
+ mov r3, r0, lsr #8 @ r3<- CC
+ VREG_INDEX_TO_ADDR(r2, r2) @ r2<- &vBB
+ VREG_INDEX_TO_ADDR(r3, r3) @ r3<- &vCC
+ flds s0, [r2] @ s0<- vBB
+ flds s1, [r3] @ s1<- vCC
fcmpes s0, s1 @ compare (vBB, vCC)
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
mov r0, #1 @ r0<- 1 (default)
@@ -1370,7 +1370,7 @@
fmstat @ export status flags
mvnmi r0, #0 @ (less than) r1<- -1
moveq r0, #0 @ (equal) r1<- 0
- bl .LOP_CMPG_FLOAT_finish @ argh
+ b .LOP_CMPG_FLOAT_finish @ argh
/* ------------------------------ */
@@ -1395,13 +1395,13 @@
*/
/* op vAA, vBB, vCC */
FETCH(r0, 1) @ r0<- CCBB
- and r2, r0, #255 @ r2<- BB
- VREG_INDEX_TO_ADDR(r2, r2) @ r2<- &vBB
- fldd d0, [r2] @ d0<- vBB
- mov r3, r0, lsr #8 @ r3<- CC
- VREG_INDEX_TO_ADDR(r3, r3) @ r3<- &vCC
- fldd d1, [r3] @ d1<- vCC
mov r9, rINST, lsr #8 @ r9<- AA
+ and r2, r0, #255 @ r2<- BB
+ mov r3, r0, lsr #8 @ r3<- CC
+ VREG_INDEX_TO_ADDR(r2, r2) @ r2<- &vBB
+ VREG_INDEX_TO_ADDR(r3, r3) @ r3<- &vCC
+ fldd d0, [r2] @ d0<- vBB
+ fldd d1, [r3] @ d1<- vCC
fcmped d0, d1 @ compare (vBB, vCC)
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
mvn r0, #0 @ r0<- -1 (default)
@@ -1409,7 +1409,7 @@
fmstat @ export status flags
movgt r0, #1 @ (greater than) r1<- 1
moveq r0, #0 @ (equal) r1<- 0
- bl .LOP_CMPL_DOUBLE_finish @ argh
+ b .LOP_CMPL_DOUBLE_finish @ argh
/* ------------------------------ */
@@ -1434,13 +1434,13 @@
*/
/* op vAA, vBB, vCC */
FETCH(r0, 1) @ r0<- CCBB
- and r2, r0, #255 @ r2<- BB
- VREG_INDEX_TO_ADDR(r2, r2) @ r2<- &vBB
- fldd d0, [r2] @ d0<- vBB
- mov r3, r0, lsr #8 @ r3<- CC
- VREG_INDEX_TO_ADDR(r3, r3) @ r3<- &vCC
- fldd d1, [r3] @ d1<- vCC
mov r9, rINST, lsr #8 @ r9<- AA
+ and r2, r0, #255 @ r2<- BB
+ mov r3, r0, lsr #8 @ r3<- CC
+ VREG_INDEX_TO_ADDR(r2, r2) @ r2<- &vBB
+ VREG_INDEX_TO_ADDR(r3, r3) @ r3<- &vCC
+ fldd d0, [r2] @ d0<- vBB
+ fldd d1, [r3] @ d1<- vCC
fcmped d0, d1 @ compare (vBB, vCC)
FETCH_ADVANCE_INST(2) @ advance rPC, load rINST
mov r0, #1 @ r0<- 1 (default)
@@ -1448,7 +1448,7 @@
fmstat @ export status flags
mvnmi r0, #0 @ (less than) r1<- -1
moveq r0, #0 @ (equal) r1<- 0
- bl .LOP_CMPG_DOUBLE_finish @ argh
+ b .LOP_CMPG_DOUBLE_finish @ argh
/* ------------------------------ */
@@ -8783,10 +8783,11 @@
*/
d2l_doconv:
stmfd sp!, {r4, r5, lr} @ save regs
- ldr r3, .LOP_DOUBLE_TO_LONG_max @ (double)maxlong, hi
+ mov r3, #0x43000000 @ maxlong, as a double (high word)
+ add r3, #0x00e00000 @ 0x43e00000
+ mov r2, #0 @ maxlong, as a double (low word)
sub sp, sp, #4 @ align for EABI
- mov r2, #0 @ (double)maxlong, lo
- mov r4, r0 @ save r0
+ mov r4, r0 @ save a copy of r0
mov r5, r1 @ and r1
bl __aeabi_dcmpge @ is arg >= maxlong?
cmp r0, #0 @ nonzero == yes
@@ -8796,8 +8797,9 @@
mov r0, r4 @ recover arg
mov r1, r5
- ldr r3, .LOP_DOUBLE_TO_LONG_min @ (double)minlong, hi
- mov r2, #0 @ (double)minlong, lo
+ mov r3, #0xc3000000 @ minlong, as a double (high word)
+ add r3, #0x00e00000 @ 0xc3e00000
+ mov r2, #0 @ minlong, as a double (low word)
bl __aeabi_dcmple @ is arg <= minlong?
cmp r0, #0 @ nonzero == yes
movne r0, #0 @ return minlong (8000000000000000)
@@ -8821,11 +8823,6 @@
add sp, sp, #4
ldmfd sp!, {r4, r5, pc}
-.LOP_DOUBLE_TO_LONG_max:
- .word 0x43e00000 @ maxlong, as a double (high word)
-.LOP_DOUBLE_TO_LONG_min:
- .word 0xc3e00000 @ minlong, as a double (high word)
-
/* continuation for OP_MUL_LONG */