1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
package cpu_test
import (
"testing"
"github.com/segmentio/asm/cpu/arm64"
"github.com/segmentio/asm/cpu/cpuid"
"github.com/segmentio/asm/cpu/x86"
)
var x86Tests = map[string]cpuid.Feature{
"SSE": cpuid.Feature(x86.SSE),
"SSE2": cpuid.Feature(x86.SSE2),
"SSE3": cpuid.Feature(x86.SSE3),
"SSE41": cpuid.Feature(x86.SSE41),
"SSE42": cpuid.Feature(x86.SSE42),
"SSE4A": cpuid.Feature(x86.SSE4A),
"SSSE3": cpuid.Feature(x86.SSSE3),
"AVX": cpuid.Feature(x86.AVX),
"AVX2": cpuid.Feature(x86.AVX2),
"AVX512BF16": cpuid.Feature(x86.AVX512BF16),
"AVX512BITALG": cpuid.Feature(x86.AVX512BITALG),
"AVX512BW": cpuid.Feature(x86.AVX512BW),
"AVX512CD": cpuid.Feature(x86.AVX512CD),
"AVX512DQ": cpuid.Feature(x86.AVX512DQ),
"AVX512ER": cpuid.Feature(x86.AVX512ER),
"AVX512F": cpuid.Feature(x86.AVX512F),
"AVX512IFMA": cpuid.Feature(x86.AVX512IFMA),
"AVX512PF": cpuid.Feature(x86.AVX512PF),
"AVX512VBMI": cpuid.Feature(x86.AVX512VBMI),
"AVX512VBMI2": cpuid.Feature(x86.AVX512VBMI2),
"AVX512VL": cpuid.Feature(x86.AVX512VL),
"AVX512VNNI": cpuid.Feature(x86.AVX512VNNI),
"AVX512VP2INTERSECT": cpuid.Feature(x86.AVX512VP2INTERSECT),
"AVX512VPOPCNTDQ": cpuid.Feature(x86.AVX512VPOPCNTDQ),
}
var arm64Tests = map[string]cpuid.Feature{
"ASIMD": cpuid.Feature(arm64.ASIMD),
"ASIMDDP": cpuid.Feature(arm64.ASIMDDP),
"ASIMDHP": cpuid.Feature(arm64.ASIMDHP),
"ASIMDRDM": cpuid.Feature(arm64.ASIMDRDM),
}
func TestCPU(t *testing.T) {
for _, test := range []struct {
arch string
feat map[string]cpuid.Feature
}{
{arch: "x86", feat: x86Tests},
{arch: "arm64", feat: arm64Tests},
} {
t.Run("none", func(t *testing.T) {
c := cpuid.CPU(cpuid.None)
for name, feature := range test.feat {
t.Run(name, func(t *testing.T) {
if c.Has(feature) {
t.Error("cpuid.None must not have any features enabled")
}
})
}
})
t.Run("all", func(t *testing.T) {
c := cpuid.CPU(cpuid.All)
for name, feature := range test.feat {
t.Run(name, func(t *testing.T) {
if !c.Has(feature) {
t.Errorf("missing a feature that should have been enabled by cpuid.All")
}
})
}
})
t.Run("single", func(t *testing.T) {
for name, feature := range test.feat {
t.Run(name, func(t *testing.T) {
c := cpuid.CPU(0)
c.Set(feature, true)
for n, f := range test.feat {
if n == name {
if !c.Has(f) {
t.Errorf("expected feature not set on CPU: %s", n)
}
} else {
if c.Has(f) {
t.Errorf("unexpected feature set on CPU: %s", n)
}
}
}
})
}
})
}
}
|