}
}
+ if len(os.Args) > 1 && os.Args[1] == "-check-goarm" {
+ useVFPv1() // might fail with SIGILL
+ println("VFPv1 OK.")
+ useVFPv3() // might fail with SIGILL
+ println("VFPv3 OK.")
+ os.Exit(0)
+ }
+
xinit()
xmain()
xexit(0)
// OpenBSD currently only supports softfloat.
return "5"
}
- if goos != "linux" {
- // All other arm platforms that we support
- // require ARMv7.
+
+ // Try to exec ourselves in a mode to detect VFP support.
+ // Seeing how far it gets determines which instructions failed.
+ // The test is OS-agnostic.
+ out := run("", 0, os.Args[0], "-check-goarm")
+ v1ok := strings.Contains(out, "VFPv1 OK.")
+ v3ok := strings.Contains(out, "VFPv3 OK.")
+
+ if v1ok && v3ok {
return "7"
}
- cpuinfo := readfile("/proc/cpuinfo")
- goarm := "5"
- for _, line := range splitlines(cpuinfo) {
- line := strings.SplitN(line, ":", 2)
- if len(line) < 2 {
- continue
- }
- if strings.TrimSpace(line[0]) != "Features" {
- continue
- }
- features := splitfields(line[1])
- sort.Strings(features) // so vfpv3 sorts after vfp
-
- // Infer GOARM value from the vfp features available
- // on this host. Values of GOARM detected are:
- // 5: no vfp support was found
- // 6: vfp (v1) support was detected, but no higher
- // 7: vfpv3 support was detected.
- // This matches the assertions in runtime.checkarm.
- for _, f := range features {
- switch f {
- case "vfp":
- goarm = "6"
- case "vfpv3":
- goarm = "7"
- }
- }
+ if v1ok {
+ return "6"
}
- return goarm
+ return "5"
}
func min(a, b int) int {
cpuid(&info, 1)
return info[3]&(1<<26) != 0 // SSE2
}
+
+// useVFPv1 tries to execute one VFPv1 instruction on ARM.
+// It will crash the current process if VFPv1 is missing.
+func useVFPv1()
+
+// useVFPv3 tries to execute one VFPv3 instruction on ARM.
+// It will crash the current process if VFPv3 is missing.
+func useVFPv3()
--- /dev/null
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gc,arm
+
+#include "textflag.h"
+
+// try to run "vmov.f64 d0, d0" instruction
+TEXT ·useVFPv1(SB),NOSPLIT,$0
+ WORD $0xeeb00b40 // vmov.f64 d0, d0
+ RET
+
+// try to run VFPv3-only "vmov.f64 d0, #112" instruction
+TEXT ·useVFPv3(SB),NOSPLIT,$0
+ WORD $0xeeb70b00 // vmov.f64 d0, #112
+ RET
--- /dev/null
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !arm,gc
+
+#include "textflag.h"
+
+TEXT ·useVFPv1(SB),NOSPLIT,$0
+ RET
+
+TEXT ·useVFPv3(SB),NOSPLIT,$0
+ RET