...
1 package platform
2
3 const (
4
5 CpuFeatureSSE3 = uint64(1)
6
7 CpuFeatureSSE4_1 = uint64(1) << 19
8
9 CpuFeatureSSE4_2 = uint64(1) << 20
10 )
11
12 const (
13
14 CpuExtraFeatureABM = uint64(1) << 5
15 )
16
17
18 var CpuFeatures CpuFeatureFlags = loadCpuFeatureFlags()
19
20
21 type CpuFeatureFlags interface {
22
23 Has(cpuFeature uint64) bool
24
25 HasExtra(cpuFeature uint64) bool
26 }
27
28
29 type cpuFeatureFlags struct {
30 flags uint64
31 extraFlags uint64
32 }
33
34
35
36 func cpuid(arg1, arg2 uint32) (eax, ebx, ecx, edx uint32)
37
38
39 func cpuidAsBitmap(arg1, arg2 uint32) uint64 {
40 _ , _ , ecx, edx := cpuid(arg1, arg2)
41 return (uint64(edx) << 32) | uint64(ecx)
42 }
43
44
45 func loadStandardRange(id uint32) uint64 {
46
47 maxRange, _, _, _ := cpuid(0, 0)
48 if id > maxRange {
49 panic("cannot query standard CPU flags")
50 }
51 return cpuidAsBitmap(id, 0)
52 }
53
54
55 func loadExtendedRange(id uint32) uint64 {
56
57 maxRange, _, _, _ := cpuid(0x80000000, 0)
58 if id > maxRange {
59 panic("cannot query extended CPU flags")
60 }
61 return cpuidAsBitmap(id, 0)
62 }
63
64 func loadCpuFeatureFlags() CpuFeatureFlags {
65 return &cpuFeatureFlags{
66 flags: loadStandardRange(1),
67 extraFlags: loadExtendedRange(0x80000001),
68 }
69 }
70
71
72 func (f *cpuFeatureFlags) Has(cpuFeature uint64) bool {
73 return (f.flags & cpuFeature) != 0
74 }
75
76
77 func (f *cpuFeatureFlags) HasExtra(cpuFeature uint64) bool {
78 return (f.extraFlags & cpuFeature) != 0
79 }
80
View as plain text