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