aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/x64_cpu_info.cpp
blob: 8e67f0fc391389ff9ce5a635975715be00977ea5 (plain)
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* This file is part of the dynarmic project.
 * Copyright (c) 2020 MerryMage
 * SPDX-License-Identifier: 0BSD
 */

#include <array>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstring>
#include <utility>

#include <catch2/catch_test_macros.hpp>
#include <xbyak/xbyak_util.h>

TEST_CASE("Host CPU supports", "[a64]") {
    using Cpu = Xbyak::util::Cpu;
    Cpu cpu_info;

    std::array<std::uint32_t, 4> cpu_name;
    for (std::uint32_t i = 2; i < 5; ++i) {
        cpu_info.getCpuid(0x80000000 | i, cpu_name.data());
        std::printf("%.16s", reinterpret_cast<const char*>(cpu_name.data()));
    }
    std::putchar('\n');

    cpu_info.putFamily();
    const std::array types{
#define X(NAME) std::make_pair(Cpu::Type{Cpu::NAME}, &#NAME[1])
        X(t3DN),
        X(tADX),
        X(tAESNI),
        X(tAMD),
        X(tAMX_BF16),
        X(tAMX_INT8),
        X(tAMX_TILE),
        X(tAVX),
        X(tAVX2),
        X(tAVX512_4FMAPS),
        X(tAVX512_4VNNIW),
        X(tAVX512_BF16),
        X(tAVX512_BITALG),
        X(tAVX512_FP16),
        X(tAVX512_IFMA),
        X(tAVX512_VBMI),
        X(tAVX512_VBMI2),
        X(tAVX512_VNNI),
        X(tAVX512_VP2INTERSECT),
        X(tAVX512_VPOPCNTDQ),
        X(tAVX512BW),
        X(tAVX512CD),
        X(tAVX512DQ),
        X(tAVX512ER),
        X(tAVX512F),
        X(tAVX512IFMA),
        X(tAVX512PF),
        X(tAVX512VBMI),
        X(tAVX512VL),
        X(tAVX_VNNI),
        X(tBMI1),
        X(tBMI2),
        X(tCLDEMOTE),
        X(tCLFLUSHOPT),
        X(tCLZERO),
        X(tCMOV),
        X(tE3DN),
        X(tENHANCED_REP),
        X(tF16C),
        X(tFMA),
        X(tGFNI),
        X(tHLE),
        X(tINTEL),
        X(tLZCNT),
        X(tMMX),
        X(tMMX2),
        X(tMOVBE),
        X(tMOVDIR64B),
        X(tMOVDIRI),
        X(tMPX),
        X(tOSXSAVE),
        X(tPCLMULQDQ),
        X(tPOPCNT),
        X(tPREFETCHW),
        X(tPREFETCHWT1),
        X(tRDRAND),
        X(tRDSEED),
        X(tRDTSCP),
        X(tRTM),
        X(tSHA),
        X(tSMAP),
        X(tSSE),
        X(tSSE2),
        X(tSSE3),
        X(tSSE41),
        X(tSSE42),
        X(tSSSE3),
        X(tVAES),
        X(tVPCLMULQDQ),
        X(tWAITPKG),
#undef X
    };

    constexpr std::size_t line_max = 80;
    std::size_t line_length = 0;
    for (const auto& [type, name] : types) {
        if (cpu_info.has(type)) {
            const std::size_t name_length = std::strlen(name) + 1;
            if ((line_length + name_length) >= line_max) {
                line_length = name_length;
                std::putchar('\n');
            } else if (line_length) {
                std::putchar(' ');
            }
            std::fputs(name, stdout);
            line_length += name_length;
        }
    }
    std::putchar('\n');
}