summaryrefslogtreecommitdiff
path: root/src/runtime/os_linux_ppc64x.go
diff options
context:
space:
mode:
authorCarlos Eduardo Seo <cseo@linux.vnet.ibm.com>2016-10-28 14:42:42 -0200
committerBrad Fitzpatrick <bradfitz@golang.org>2016-11-01 13:41:04 +0000
commit40aaf283124de44d513ca086976194f0133faa82 (patch)
tree966fd06eb26fe8fb2d8a8cf35010e814e01e0f5e /src/runtime/os_linux_ppc64x.go
parent47c58b46676af533a105fb10169522b958843a70 (diff)
downloadgo-git-40aaf283124de44d513ca086976194f0133faa82.tar.gz
runtime: get ppc64x ISA level and hardware capabilities from HWCAP/HWCAP2
This implements a check that can be done at runtime for the ISA level and hardware capability. It follows the same implementation as in s390x. These checks will be important as we enable new instructions and write go asm implementations using those. Updates #15403 Fixes #16643 Change-Id: Idfee374a3ffd7cf13a7d8cf0a6c83d247d3bee16 Reviewed-on: https://go-review.googlesource.com/32330 Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/os_linux_ppc64x.go')
-rw-r--r--src/runtime/os_linux_ppc64x.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/runtime/os_linux_ppc64x.go b/src/runtime/os_linux_ppc64x.go
new file mode 100644
index 0000000000..b0da98b0bd
--- /dev/null
+++ b/src/runtime/os_linux_ppc64x.go
@@ -0,0 +1,60 @@
+// Copyright 2016 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 ppc64 ppc64le
+
+package runtime
+
+import (
+ "runtime/internal/sys"
+)
+
+const (
+ // ISA level
+ // Go currently requires POWER5 as a minimum for ppc64, so we need
+ // to check for ISA 2.03 and beyond.
+ _PPC_FEATURE_POWER5_PLUS = 0x00020000 // ISA 2.03 (POWER5+)
+ _PPC_FEATURE_ARCH_2_05 = 0x00001000 // ISA 2.05 (POWER6)
+ _PPC_FEATURE_POWER6_EXT = 0x00000200 // mffgpr/mftgpr extension (POWER6x)
+ _PPC_FEATURE_ARCH_2_06 = 0x00000100 // ISA 2.06 (POWER7)
+ _PPC_FEATURE2_ARCH_2_07 = 0x80000000 // ISA 2.07 (POWER8)
+
+ // Standalone capabilities
+ _PPC_FEATURE_HAS_ALTIVEC = 0x10000000 // SIMD/Vector unit
+ _PPC_FEATURE_HAS_VSX = 0x00000080 // Vector scalar unit
+)
+
+type facilities struct {
+ _ [sys.CacheLineSize]byte
+ isPOWER5x bool // ISA 2.03
+ isPOWER6 bool // ISA 2.05
+ isPOWER6x bool // ISA 2.05 + mffgpr/mftgpr extension
+ isPOWER7 bool // ISA 2.06
+ isPOWER8 bool // ISA 2.07
+ hasVMX bool // Vector unit
+ hasVSX bool // Vector scalar unit
+ _ [sys.CacheLineSize]byte
+}
+
+// cpu can be tested at runtime in go assembler code to check for
+// a certain ISA level or hardware capability, for example:
+// ·cpu+facilities_hasVSX(SB) for checking the availability of VSX
+// or
+// ·cpu+facilities_isPOWER7(SB) for checking if the processor implements
+// ISA 2.06 instructions.
+var cpu facilities
+
+func archauxv(tag, val uintptr) {
+ switch tag {
+ case _AT_HWCAP:
+ cpu.isPOWER5x = val&_PPC_FEATURE_POWER5_PLUS != 0
+ cpu.isPOWER6 = val&_PPC_FEATURE_ARCH_2_05 != 0
+ cpu.isPOWER6x = val&_PPC_FEATURE_POWER6_EXT != 0
+ cpu.isPOWER7 = val&_PPC_FEATURE_ARCH_2_06 != 0
+ cpu.hasVMX = val&_PPC_FEATURE_HAS_ALTIVEC != 0
+ cpu.hasVSX = val&_PPC_FEATURE_HAS_VSX != 0
+ case _AT_HWCAP2:
+ cpu.isPOWER8 = val&_PPC_FEATURE2_ARCH_2_07 != 0
+ }
+}