diff -U3 -r a/go/src/runtime/sys_darwin_386.s b/go/src/runtime/sys_darwin_386.s
--- src/runtime/sys_darwin_386.s	2015-09-23 05:37:37.000000000 +0100
+++ src/runtime/sys_darwin_386.s	2016-09-18 15:50:43.000000000 +0100
@@ -182,11 +182,17 @@
 
 systime:
 	// Fall back to system call (usually first call in this thread)
-	LEAL	12(SP), AX	// must be non-nil, unused
+	LEAL	16(SP), AX	// must be non-nil, unused
 	MOVL	AX, 4(SP)
 	MOVL	$0, 8(SP)	// time zone pointer
+        MOVL    $0, 12(SP)      // required as of Sierra; Issue 16570
 	MOVL	$116, AX
 	INT	$0x80
+        CMPL    AX, $0
+        JNE     inreg
+        MOVL    16(SP), AX
+        MOVL    20(SP), DX
+inreg:
 	// sec is in AX, usec in DX
 	// convert to DX:AX nsec
 	MOVL	DX, BX
diff -U3 -r a/go/src/runtime/sys_darwin_amd64.s b/go/src/runtime/sys_darwin_amd64.s
--- src/runtime/sys_darwin_amd64.s	2015-09-23 05:37:37.000000000 +0100
+++ src/runtime/sys_darwin_amd64.s	2016-09-18 15:50:41.000000000 +0100
@@ -141,10 +141,16 @@
 
 systime:
 	// Fall back to system call (usually first call in this thread).
-	MOVQ	SP, DI	// must be non-nil, unused
+	MOVQ	SP, DI
 	MOVQ	$0, SI
+        MOVQ    $0, DX // required as of Sierra; Issue 16570
 	MOVL	$(0x2000000+116), AX
 	SYSCALL
+        CMPQ    AX, $0
+        JNE     inreg
+        MOVQ    0(SP), AX
+        MOVL    8(SP), DX
+inreg:
 	// sec is in AX, usec in DX
 	// return nsec in AX
 	IMULQ	$1000000000, AX

