arm: bugfixes and syscall
- integer divide by zero raises panic
- float comparisons involving NaNs work
- syscall interface actually handles return
values and errno correctly.
R=rsc, bradfitzpatrick
CC=golang-dev
https://golang.org/cl/1847047
diff --git a/src/pkg/syscall/asm_linux_arm.s b/src/pkg/syscall/asm_linux_arm.s
index 830d41c..a579088 100644
--- a/src/pkg/syscall/asm_linux_arm.s
+++ b/src/pkg/syscall/asm_linux_arm.s
@@ -17,9 +17,21 @@
MOVW 12(SP), R1
MOVW 16(SP), R2
SWI $0
- MOVW R0, 20(SP) // r1
- MOVW R1, 24(SP) // r2
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ BLS ok
+ MOVW $-1, R1
+ MOVW R1, 20(SP) // r1
+ MOVW $0, R2
+ MOVW R2, 24(SP) // r2
+ RSB $0, R0, R0
+ MOVW R0, 28(SP) // errno
+ BL runtime·exitsyscall(SB)
+ RET
+ok:
+ MOVW R0, 20(SP) // r1
MOVW $0, R0
+ MOVW R0, 24(SP) // r2
MOVW R0, 28(SP) // errno
BL runtime·exitsyscall(SB)
RET
@@ -36,9 +48,21 @@
MOVW 24(SP), R4
MOVW 28(SP), R5
SWI $0
- MOVW R0, 32(SP) // r1
- MOVW R1, 36(SP) // r2
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ BLS ok6
+ MOVW $-1, R1
+ MOVW R1, 32(SP) // r1
+ MOVW $0, R2
+ MOVW R2, 36(SP) // r2
+ RSB $0, R0, R0
+ MOVW R0, 40(SP) // errno
+ BL runtime·exitsyscall(SB)
+ RET
+ok6:
+ MOVW R0, 32(SP) // r1
MOVW $0, R0
+ MOVW R0, 36(SP) // r2
MOVW R0, 40(SP) // errno
BL runtime·exitsyscall(SB)
RET
@@ -50,8 +74,19 @@
MOVW 12(SP), R1
MOVW 16(SP), R2
SWI $0
- MOVW R0, 20(SP) // r1
- MOVW R1, 24(SP) // r2
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ BLS ok1
+ MOVW $-1, R1
+ MOVW R1, 20(SP) // r1
+ MOVW $0, R2
+ MOVW R2, 24(SP) // r2
+ RSB $0, R0, R0
+ MOVW R0, 28(SP) // errno
+ RET
+ok1:
+ MOVW R0, 20(SP) // r1
MOVW $0, R0
+ MOVW R0, 24(SP) // r2
MOVW R0, 28(SP) // errno
RET