Commit 91d326e7 authored by Martin Möhrmann's avatar Martin Möhrmann Committed by Brad Fitzpatrick

runtime: remove duplicate cpu feature detection on x86

This also allows the GODEBUGCPU options to change the
support_* runtime cpu feature variable values.

Change-Id: I884c5f03993afc7e3344ff2fd471a2c6cfde43d4
Reviewed-on: https://go-review.googlesource.com/114615
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent bdaadeb3
...@@ -164,42 +164,6 @@ notintel: ...@@ -164,42 +164,6 @@ notintel:
TESTL $(1<<23), DX // MMX TESTL $(1<<23), DX // MMX
JZ bad_proc JZ bad_proc
TESTL $(1<<26), DX // SSE2
SETNE runtime·support_sse2(SB)
TESTL $(1<<19), DI // SSE4.1
SETNE runtime·support_sse41(SB)
TESTL $(1<<23), DI // POPCNT
SETNE runtime·support_popcnt(SB)
TESTL $(1<<27), DI // OSXSAVE
SETNE runtime·support_osxsave(SB)
eax7:
// Load EAX=7/ECX=0 cpuid flags
CMPL SI, $7
JLT osavx
MOVL $7, AX
MOVL $0, CX
CPUID
TESTL $(1<<9), BX // ERMS
SETNE runtime·support_erms(SB)
osavx:
// nacl does not support XGETBV to test
// for XMM and YMM OS support.
#ifndef GOOS_nacl
CMPB runtime·support_osxsave(SB), $1
JNE nocpuinfo
MOVL $0, CX
// For XGETBV, OSXSAVE bit is required and sufficient
XGETBV
ANDL $6, AX
CMPL AX, $6 // Check for OS support of XMM and YMM registers.
#endif
nocpuinfo: nocpuinfo:
// if there is an _cgo_init, call it to let it // if there is an _cgo_init, call it to let it
// initialize and to set up GS. if not, // initialize and to set up GS. if not,
......
...@@ -127,38 +127,6 @@ notintel: ...@@ -127,38 +127,6 @@ notintel:
CPUID CPUID
MOVL AX, runtime·processorVersionInfo(SB) MOVL AX, runtime·processorVersionInfo(SB)
TESTL $(1<<26), DX // SSE2
SETNE runtime·support_sse2(SB)
TESTL $(1<<19), CX // SSE4.1
SETNE runtime·support_sse41(SB)
TESTL $(1<<23), CX // POPCNT
SETNE runtime·support_popcnt(SB)
TESTL $(1<<27), CX // OSXSAVE
SETNE runtime·support_osxsave(SB)
eax7:
// Load EAX=7/ECX=0 cpuid flags
CMPL SI, $7
JLT osavx
MOVL $7, AX
MOVL $0, CX
CPUID
TESTL $(1<<9), BX // ERMS
SETNE runtime·support_erms(SB)
osavx:
CMPB runtime·support_osxsave(SB), $1
JNE nocpuinfo
MOVL $0, CX
// For XGETBV, OSXSAVE bit is required and sufficient
XGETBV
ANDL $6, AX
CMPL AX, $6 // Check for OS support of XMM and YMM registers.
nocpuinfo: nocpuinfo:
// if there is an _cgo_init, call it. // if there is an _cgo_init, call it.
MOVQ _cgo_init(SB), AX MOVQ _cgo_init(SB), AX
......
...@@ -47,45 +47,7 @@ notintel: ...@@ -47,45 +47,7 @@ notintel:
CPUID CPUID
MOVL AX, runtime·processorVersionInfo(SB) MOVL AX, runtime·processorVersionInfo(SB)
TESTL $(1<<26), DX // SSE2
SETNE runtime·support_sse2(SB)
TESTL $(1<<19), CX // SSE4.1
SETNE runtime·support_sse41(SB)
TESTL $(1<<23), CX // POPCNT
SETNE runtime·support_popcnt(SB)
TESTL $(1<<27), CX // OSXSAVE
SETNE runtime·support_osxsave(SB)
eax7:
// Load EAX=7/ECX=0 cpuid flags
CMPL SI, $7
JLT osavx
MOVL $7, AX
MOVL $0, CX
CPUID
TESTL $(1<<9), BX // ERMS
SETNE runtime·support_erms(SB)
osavx:
// nacl does not support XGETBV to test
// for XMM and YMM OS support.
#ifndef GOOS_nacl
CMPB runtime·support_osxsave(SB), $1
JNE nocpuinfo
MOVL $0, CX
// For XGETBV, OSXSAVE bit is required and sufficient
XGETBV
ANDL $6, AX
CMPL AX, $6 // Check for OS support of XMM and YMM registers.
#endif
nocpuinfo: nocpuinfo:
needtls:
LEAL runtime·m0+m_tls(SB), DI LEAL runtime·m0+m_tls(SB), DI
CALL runtime·settls(SB) CALL runtime·settls(SB)
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package runtime package runtime
import ( import (
"internal/cpu"
"runtime/internal/atomic" "runtime/internal/atomic"
"runtime/internal/sys" "runtime/internal/sys"
"unsafe" "unsafe"
...@@ -507,6 +508,11 @@ func cpuinit() { ...@@ -507,6 +508,11 @@ func cpuinit() {
} }
internal_cpu_initialize(env) internal_cpu_initialize(env)
support_erms = cpu.X86.HasERMS
support_popcnt = cpu.X86.HasPOPCNT
support_sse2 = cpu.X86.HasSSE2
support_sse41 = cpu.X86.HasSSE41
} }
// The bootstrap sequence is: // The bootstrap sequence is:
......
...@@ -833,7 +833,7 @@ var ( ...@@ -833,7 +833,7 @@ var (
newprocs int32 newprocs int32
// Information about what cpu features are available. // Information about what cpu features are available.
// Set on startup in asm_{386,amd64,amd64p32}.s. // Set on startup in runtime.cpuinit.
// Packages outside the runtime should not use these // Packages outside the runtime should not use these
// as they are not an external api. // as they are not an external api.
// TODO: deprecate these; use internal/cpu directly. // TODO: deprecate these; use internal/cpu directly.
...@@ -841,7 +841,6 @@ var ( ...@@ -841,7 +841,6 @@ var (
isIntel bool isIntel bool
lfenceBeforeRdtsc bool lfenceBeforeRdtsc bool
support_erms bool support_erms bool
support_osxsave bool
support_popcnt bool support_popcnt bool
support_sse2 bool support_sse2 bool
support_sse41 bool support_sse41 bool
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment