diff options
Diffstat (limited to 'libgo/go/runtime/os_linux_ppc64x.go')
-rw-r--r-- | libgo/go/runtime/os_linux_ppc64x.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/libgo/go/runtime/os_linux_ppc64x.go b/libgo/go/runtime/os_linux_ppc64x.go new file mode 100644 index 00000000000..b324344493e --- /dev/null +++ b/libgo/go/runtime/os_linux_ppc64x.go @@ -0,0 +1,61 @@ +// 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 ignore_for_gccgo +// +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 + } +} |