func main() {
os.Setenv("TERM", "dumb") // disable escape codes in clang errors
+ // provide -check-armv6k first, before checking for $GOROOT so that
+ // it is possible to run this check without having $GOROOT available.
+ if len(os.Args) > 1 && os.Args[1] == "-check-armv6k" {
+ useARMv6K() // might fail with SIGILL
+ println("ARMv6K supported.")
+ os.Exit(0)
+ }
+
slash = string(filepath.Separator)
gohostos = runtime.GOOS
// useVFPv3 tries to execute one VFPv3 instruction on ARM.
// It will crash the current process if VFPv3 is missing.
func useVFPv3()
+
+// useARMv6K tries to run ARMv6K instructions on ARM.
+// It will crash the current process if it doesn't implement
+// ARMv6K or above.
+func useARMv6K()
func useVFPv1() {}
func useVFPv3() {}
+
+func useARMv6K() {}
TEXT ·useVFPv3(SB),NOSPLIT,$0
WORD $0xeeb70b00 // vmov.f64 d0, #112
RET
+
+// try to run ARMv6K (or above) "ldrexd" instruction
+TEXT ·useARMv6K(SB),NOSPLIT,$32
+ MOVW R13, R2
+ BIC $15, R13
+ WORD $0xe1bd0f9f // ldrexd r0, r1, [sp]
+ WORD $0xf57ff01f // clrex
+ MOVW R2, R13
+ RET
TEXT ·useVFPv3(SB),NOSPLIT,$0
RET
+
+TEXT ·useARMv6K(SB),NOSPLIT,$0
+ RET