1
0
mirror of https://github.com/golang/go synced 2024-10-02 06:28:33 -06:00
go/src/runtime/os_linux_ppc64x.go
Carlos Eduardo Seo 40aaf28312 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>
2016-11-01 13:41:04 +00:00

61 lines
1.9 KiB
Go

// 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
}
}