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
use super::{aux_t, AuxValue, Sealed};

crate::bitflags! {
    #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub enum Features: usize {
        /// 32-bit mode.
        B32 = 0x80000000,
        /// 64-bit mode.
        B64 = 0x40000000,
        /// 601 chip, Old POWER ISA.
        C601_INSTR = 0x20000000,
        /// SIMD/Vector Unit.
        HAS_ALTIVEC = 0x10000000,
        /// Floating Point Unit.
        HAS_FPU = 0x08000000,
        /// Memory Management Unit.
        HAS_MMU = 0x04000000,
        #[allow(non_upper_case_globals)]
        /// 4xx Multiply Accumulator.
        HAS_4xxMAC = 0x02000000,
        /// Unified I/D cache.
        UNIFIED_CACHE = 0x01000000,
        /// Signal Processing ext.
        HAS_SPE = 0x00800000,
        /// SPE Float.
        HAS_EFP_SINGLE = 0x00400000,
        /// SPE Double.
        HAS_EFP_DOUBLE = 0x00200000,
        /// 601/403gx have no timebase
        NO_TB = 0x00100000,
        /// POWER4 ISA 2.00
        POWER4 = 0x00080000,
        /// POWER5 ISA 2.02
        POWER5 = 0x00040000,
        /// POWER5+ ISA 2.03
        POWER5_PLUS = 0x00020000,
        /// CELL Broadband Engine
        CELL_BE = 0x00010000,
        /// ISA Category Embedded
        BOOKE = 0x00008000,
        /// Simultaneous Multi-Threading
        SMT = 0x00004000,
        ICACHE_SNOOP = 0x00002000,
        /// ISA 2.05
        ARCH_2_05 = 0x00001000,
        /// PA Semi 6T Core
        PA6T = 0x00000800,
        /// Decimal FP Unit
        HAS_DFP = 0x00000400,
        /// P6 + mffgpr/mftgpr
        POWER6_EXT = 0x00000200,
        /// ISA 2.06
        ARCH_2_06 = 0x00000100,
        /// P7 Vector Extension.
        HAS_VSX = 0x00000080,
        PSERIES_PERFMON_COMPAT = 0x00000040,
        TRUE_LE = 0x00000002,
        PPC_LE = 0x00000001,
    }

    impl Sealed for Features {}
    impl AuxValue for Features {
        fn from(value: aux_t) -> Self {
            (value as usize).into()
        }
    }
}

crate::bitflags! {
    #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub enum Features2: usize {
        /// ISA 2.07
        ARCH_2_07 = 0x80000000,
        /// Hardware Transactional Memory
        HAS_HTM = 0x40000000,
        /// Data Stream Control Register
        HAS_DSCR = 0x20000000,
        /// Event Base Branching
        HAS_EBB = 0x10000000,
        /// Integer Select
        HAS_ISEL = 0x08000000,
        /// Target Address Register
        HAS_TAR = 0x04000000,
         /// Target supports vector instruction.
        HAS_VEC_CRYPTO = 0x02000000,
        /// Kernel aborts transaction when a syscall is made.
        HTM_NOSC = 0x01000000,
        /// ISA 3.0
        ARCH_3_00 = 0x00800000,
        /// VSX IEEE Binary Float 128-bit
        HAS_IEEE128 = 0x00400000,
        /// darn instruction.
        DARN = 0x00200000,
        /// scv syscall.
        SCV = 0x00100000,
        /// TM without suspended state.
        HTM_NO_SUSPEND = 0x00080000,
        /// ISA 3.1.
        ARCH_3_1 = 0x00040000,
        /// Matrix-Multiply Assist.
        MMA = 0x00020000,
    }

    impl Sealed for Features2 {}
    impl AuxValue for Features2 {
        fn from(value: aux_t) -> Self {
            (value as usize).into()
        }
    }
}