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