1use crate::iced_constants::IcedConstants;
5use crate::iced_error::IcedError;
6use core::iter::{ExactSizeIterator, FusedIterator, Iterator};
7use core::ops::{Add, AddAssign, Sub, SubAssign};
8use core::{fmt, mem};
9
10#[cfg(feature = "instr_info")]
11pub use crate::register::info::*;
12
13#[cfg(feature = "instr_info")]
14mod info {
15 use crate::iced_constants::IcedConstants;
16 use crate::Register;
17
18 #[rustfmt::skip]
19 #[allow(deprecated)]
20 pub(super) static REGISTER_INFOS: &[RegisterInfo; IcedConstants::REGISTER_ENUM_COUNT] = &[
21 RegisterInfo { register: Register::None, base: Register::None, full_register32: Register::None, full_register: Register::None, size: 0 },
24 RegisterInfo { register: Register::AL, base: Register::AL, full_register32: Register::EAX, full_register: Register::RAX, size: 1 },
25 RegisterInfo { register: Register::CL, base: Register::AL, full_register32: Register::ECX, full_register: Register::RCX, size: 1 },
26 RegisterInfo { register: Register::DL, base: Register::AL, full_register32: Register::EDX, full_register: Register::RDX, size: 1 },
27 RegisterInfo { register: Register::BL, base: Register::AL, full_register32: Register::EBX, full_register: Register::RBX, size: 1 },
28 RegisterInfo { register: Register::AH, base: Register::AL, full_register32: Register::EAX, full_register: Register::RAX, size: 1 },
29 RegisterInfo { register: Register::CH, base: Register::AL, full_register32: Register::ECX, full_register: Register::RCX, size: 1 },
30 RegisterInfo { register: Register::DH, base: Register::AL, full_register32: Register::EDX, full_register: Register::RDX, size: 1 },
31 RegisterInfo { register: Register::BH, base: Register::AL, full_register32: Register::EBX, full_register: Register::RBX, size: 1 },
32 RegisterInfo { register: Register::SPL, base: Register::AL, full_register32: Register::ESP, full_register: Register::RSP, size: 1 },
33 RegisterInfo { register: Register::BPL, base: Register::AL, full_register32: Register::EBP, full_register: Register::RBP, size: 1 },
34 RegisterInfo { register: Register::SIL, base: Register::AL, full_register32: Register::ESI, full_register: Register::RSI, size: 1 },
35 RegisterInfo { register: Register::DIL, base: Register::AL, full_register32: Register::EDI, full_register: Register::RDI, size: 1 },
36 RegisterInfo { register: Register::R8L, base: Register::AL, full_register32: Register::R8D, full_register: Register::R8, size: 1 },
37 RegisterInfo { register: Register::R9L, base: Register::AL, full_register32: Register::R9D, full_register: Register::R9, size: 1 },
38 RegisterInfo { register: Register::R10L, base: Register::AL, full_register32: Register::R10D, full_register: Register::R10, size: 1 },
39 RegisterInfo { register: Register::R11L, base: Register::AL, full_register32: Register::R11D, full_register: Register::R11, size: 1 },
40 RegisterInfo { register: Register::R12L, base: Register::AL, full_register32: Register::R12D, full_register: Register::R12, size: 1 },
41 RegisterInfo { register: Register::R13L, base: Register::AL, full_register32: Register::R13D, full_register: Register::R13, size: 1 },
42 RegisterInfo { register: Register::R14L, base: Register::AL, full_register32: Register::R14D, full_register: Register::R14, size: 1 },
43 RegisterInfo { register: Register::R15L, base: Register::AL, full_register32: Register::R15D, full_register: Register::R15, size: 1 },
44 RegisterInfo { register: Register::AX, base: Register::AX, full_register32: Register::EAX, full_register: Register::RAX, size: 2 },
45 RegisterInfo { register: Register::CX, base: Register::AX, full_register32: Register::ECX, full_register: Register::RCX, size: 2 },
46 RegisterInfo { register: Register::DX, base: Register::AX, full_register32: Register::EDX, full_register: Register::RDX, size: 2 },
47 RegisterInfo { register: Register::BX, base: Register::AX, full_register32: Register::EBX, full_register: Register::RBX, size: 2 },
48 RegisterInfo { register: Register::SP, base: Register::AX, full_register32: Register::ESP, full_register: Register::RSP, size: 2 },
49 RegisterInfo { register: Register::BP, base: Register::AX, full_register32: Register::EBP, full_register: Register::RBP, size: 2 },
50 RegisterInfo { register: Register::SI, base: Register::AX, full_register32: Register::ESI, full_register: Register::RSI, size: 2 },
51 RegisterInfo { register: Register::DI, base: Register::AX, full_register32: Register::EDI, full_register: Register::RDI, size: 2 },
52 RegisterInfo { register: Register::R8W, base: Register::AX, full_register32: Register::R8D, full_register: Register::R8, size: 2 },
53 RegisterInfo { register: Register::R9W, base: Register::AX, full_register32: Register::R9D, full_register: Register::R9, size: 2 },
54 RegisterInfo { register: Register::R10W, base: Register::AX, full_register32: Register::R10D, full_register: Register::R10, size: 2 },
55 RegisterInfo { register: Register::R11W, base: Register::AX, full_register32: Register::R11D, full_register: Register::R11, size: 2 },
56 RegisterInfo { register: Register::R12W, base: Register::AX, full_register32: Register::R12D, full_register: Register::R12, size: 2 },
57 RegisterInfo { register: Register::R13W, base: Register::AX, full_register32: Register::R13D, full_register: Register::R13, size: 2 },
58 RegisterInfo { register: Register::R14W, base: Register::AX, full_register32: Register::R14D, full_register: Register::R14, size: 2 },
59 RegisterInfo { register: Register::R15W, base: Register::AX, full_register32: Register::R15D, full_register: Register::R15, size: 2 },
60 RegisterInfo { register: Register::EAX, base: Register::EAX, full_register32: Register::EAX, full_register: Register::RAX, size: 4 },
61 RegisterInfo { register: Register::ECX, base: Register::EAX, full_register32: Register::ECX, full_register: Register::RCX, size: 4 },
62 RegisterInfo { register: Register::EDX, base: Register::EAX, full_register32: Register::EDX, full_register: Register::RDX, size: 4 },
63 RegisterInfo { register: Register::EBX, base: Register::EAX, full_register32: Register::EBX, full_register: Register::RBX, size: 4 },
64 RegisterInfo { register: Register::ESP, base: Register::EAX, full_register32: Register::ESP, full_register: Register::RSP, size: 4 },
65 RegisterInfo { register: Register::EBP, base: Register::EAX, full_register32: Register::EBP, full_register: Register::RBP, size: 4 },
66 RegisterInfo { register: Register::ESI, base: Register::EAX, full_register32: Register::ESI, full_register: Register::RSI, size: 4 },
67 RegisterInfo { register: Register::EDI, base: Register::EAX, full_register32: Register::EDI, full_register: Register::RDI, size: 4 },
68 RegisterInfo { register: Register::R8D, base: Register::EAX, full_register32: Register::R8D, full_register: Register::R8, size: 4 },
69 RegisterInfo { register: Register::R9D, base: Register::EAX, full_register32: Register::R9D, full_register: Register::R9, size: 4 },
70 RegisterInfo { register: Register::R10D, base: Register::EAX, full_register32: Register::R10D, full_register: Register::R10, size: 4 },
71 RegisterInfo { register: Register::R11D, base: Register::EAX, full_register32: Register::R11D, full_register: Register::R11, size: 4 },
72 RegisterInfo { register: Register::R12D, base: Register::EAX, full_register32: Register::R12D, full_register: Register::R12, size: 4 },
73 RegisterInfo { register: Register::R13D, base: Register::EAX, full_register32: Register::R13D, full_register: Register::R13, size: 4 },
74 RegisterInfo { register: Register::R14D, base: Register::EAX, full_register32: Register::R14D, full_register: Register::R14, size: 4 },
75 RegisterInfo { register: Register::R15D, base: Register::EAX, full_register32: Register::R15D, full_register: Register::R15, size: 4 },
76 RegisterInfo { register: Register::RAX, base: Register::RAX, full_register32: Register::EAX, full_register: Register::RAX, size: 8 },
77 RegisterInfo { register: Register::RCX, base: Register::RAX, full_register32: Register::ECX, full_register: Register::RCX, size: 8 },
78 RegisterInfo { register: Register::RDX, base: Register::RAX, full_register32: Register::EDX, full_register: Register::RDX, size: 8 },
79 RegisterInfo { register: Register::RBX, base: Register::RAX, full_register32: Register::EBX, full_register: Register::RBX, size: 8 },
80 RegisterInfo { register: Register::RSP, base: Register::RAX, full_register32: Register::ESP, full_register: Register::RSP, size: 8 },
81 RegisterInfo { register: Register::RBP, base: Register::RAX, full_register32: Register::EBP, full_register: Register::RBP, size: 8 },
82 RegisterInfo { register: Register::RSI, base: Register::RAX, full_register32: Register::ESI, full_register: Register::RSI, size: 8 },
83 RegisterInfo { register: Register::RDI, base: Register::RAX, full_register32: Register::EDI, full_register: Register::RDI, size: 8 },
84 RegisterInfo { register: Register::R8, base: Register::RAX, full_register32: Register::R8D, full_register: Register::R8, size: 8 },
85 RegisterInfo { register: Register::R9, base: Register::RAX, full_register32: Register::R9D, full_register: Register::R9, size: 8 },
86 RegisterInfo { register: Register::R10, base: Register::RAX, full_register32: Register::R10D, full_register: Register::R10, size: 8 },
87 RegisterInfo { register: Register::R11, base: Register::RAX, full_register32: Register::R11D, full_register: Register::R11, size: 8 },
88 RegisterInfo { register: Register::R12, base: Register::RAX, full_register32: Register::R12D, full_register: Register::R12, size: 8 },
89 RegisterInfo { register: Register::R13, base: Register::RAX, full_register32: Register::R13D, full_register: Register::R13, size: 8 },
90 RegisterInfo { register: Register::R14, base: Register::RAX, full_register32: Register::R14D, full_register: Register::R14, size: 8 },
91 RegisterInfo { register: Register::R15, base: Register::RAX, full_register32: Register::R15D, full_register: Register::R15, size: 8 },
92 RegisterInfo { register: Register::EIP, base: Register::EIP, full_register32: Register::RIP, full_register: Register::RIP, size: 4 },
93 RegisterInfo { register: Register::RIP, base: Register::EIP, full_register32: Register::RIP, full_register: Register::RIP, size: 8 },
94 RegisterInfo { register: Register::ES, base: Register::ES, full_register32: Register::ES, full_register: Register::ES, size: 2 },
95 RegisterInfo { register: Register::CS, base: Register::ES, full_register32: Register::CS, full_register: Register::CS, size: 2 },
96 RegisterInfo { register: Register::SS, base: Register::ES, full_register32: Register::SS, full_register: Register::SS, size: 2 },
97 RegisterInfo { register: Register::DS, base: Register::ES, full_register32: Register::DS, full_register: Register::DS, size: 2 },
98 RegisterInfo { register: Register::FS, base: Register::ES, full_register32: Register::FS, full_register: Register::FS, size: 2 },
99 RegisterInfo { register: Register::GS, base: Register::ES, full_register32: Register::GS, full_register: Register::GS, size: 2 },
100 RegisterInfo { register: Register::XMM0, base: Register::XMM0, full_register32: Register::ZMM0, full_register: Register::ZMM0, size: 16 },
101 RegisterInfo { register: Register::XMM1, base: Register::XMM0, full_register32: Register::ZMM1, full_register: Register::ZMM1, size: 16 },
102 RegisterInfo { register: Register::XMM2, base: Register::XMM0, full_register32: Register::ZMM2, full_register: Register::ZMM2, size: 16 },
103 RegisterInfo { register: Register::XMM3, base: Register::XMM0, full_register32: Register::ZMM3, full_register: Register::ZMM3, size: 16 },
104 RegisterInfo { register: Register::XMM4, base: Register::XMM0, full_register32: Register::ZMM4, full_register: Register::ZMM4, size: 16 },
105 RegisterInfo { register: Register::XMM5, base: Register::XMM0, full_register32: Register::ZMM5, full_register: Register::ZMM5, size: 16 },
106 RegisterInfo { register: Register::XMM6, base: Register::XMM0, full_register32: Register::ZMM6, full_register: Register::ZMM6, size: 16 },
107 RegisterInfo { register: Register::XMM7, base: Register::XMM0, full_register32: Register::ZMM7, full_register: Register::ZMM7, size: 16 },
108 RegisterInfo { register: Register::XMM8, base: Register::XMM0, full_register32: Register::ZMM8, full_register: Register::ZMM8, size: 16 },
109 RegisterInfo { register: Register::XMM9, base: Register::XMM0, full_register32: Register::ZMM9, full_register: Register::ZMM9, size: 16 },
110 RegisterInfo { register: Register::XMM10, base: Register::XMM0, full_register32: Register::ZMM10, full_register: Register::ZMM10, size: 16 },
111 RegisterInfo { register: Register::XMM11, base: Register::XMM0, full_register32: Register::ZMM11, full_register: Register::ZMM11, size: 16 },
112 RegisterInfo { register: Register::XMM12, base: Register::XMM0, full_register32: Register::ZMM12, full_register: Register::ZMM12, size: 16 },
113 RegisterInfo { register: Register::XMM13, base: Register::XMM0, full_register32: Register::ZMM13, full_register: Register::ZMM13, size: 16 },
114 RegisterInfo { register: Register::XMM14, base: Register::XMM0, full_register32: Register::ZMM14, full_register: Register::ZMM14, size: 16 },
115 RegisterInfo { register: Register::XMM15, base: Register::XMM0, full_register32: Register::ZMM15, full_register: Register::ZMM15, size: 16 },
116 RegisterInfo { register: Register::XMM16, base: Register::XMM0, full_register32: Register::ZMM16, full_register: Register::ZMM16, size: 16 },
117 RegisterInfo { register: Register::XMM17, base: Register::XMM0, full_register32: Register::ZMM17, full_register: Register::ZMM17, size: 16 },
118 RegisterInfo { register: Register::XMM18, base: Register::XMM0, full_register32: Register::ZMM18, full_register: Register::ZMM18, size: 16 },
119 RegisterInfo { register: Register::XMM19, base: Register::XMM0, full_register32: Register::ZMM19, full_register: Register::ZMM19, size: 16 },
120 RegisterInfo { register: Register::XMM20, base: Register::XMM0, full_register32: Register::ZMM20, full_register: Register::ZMM20, size: 16 },
121 RegisterInfo { register: Register::XMM21, base: Register::XMM0, full_register32: Register::ZMM21, full_register: Register::ZMM21, size: 16 },
122 RegisterInfo { register: Register::XMM22, base: Register::XMM0, full_register32: Register::ZMM22, full_register: Register::ZMM22, size: 16 },
123 RegisterInfo { register: Register::XMM23, base: Register::XMM0, full_register32: Register::ZMM23, full_register: Register::ZMM23, size: 16 },
124 RegisterInfo { register: Register::XMM24, base: Register::XMM0, full_register32: Register::ZMM24, full_register: Register::ZMM24, size: 16 },
125 RegisterInfo { register: Register::XMM25, base: Register::XMM0, full_register32: Register::ZMM25, full_register: Register::ZMM25, size: 16 },
126 RegisterInfo { register: Register::XMM26, base: Register::XMM0, full_register32: Register::ZMM26, full_register: Register::ZMM26, size: 16 },
127 RegisterInfo { register: Register::XMM27, base: Register::XMM0, full_register32: Register::ZMM27, full_register: Register::ZMM27, size: 16 },
128 RegisterInfo { register: Register::XMM28, base: Register::XMM0, full_register32: Register::ZMM28, full_register: Register::ZMM28, size: 16 },
129 RegisterInfo { register: Register::XMM29, base: Register::XMM0, full_register32: Register::ZMM29, full_register: Register::ZMM29, size: 16 },
130 RegisterInfo { register: Register::XMM30, base: Register::XMM0, full_register32: Register::ZMM30, full_register: Register::ZMM30, size: 16 },
131 RegisterInfo { register: Register::XMM31, base: Register::XMM0, full_register32: Register::ZMM31, full_register: Register::ZMM31, size: 16 },
132 RegisterInfo { register: Register::YMM0, base: Register::YMM0, full_register32: Register::ZMM0, full_register: Register::ZMM0, size: 32 },
133 RegisterInfo { register: Register::YMM1, base: Register::YMM0, full_register32: Register::ZMM1, full_register: Register::ZMM1, size: 32 },
134 RegisterInfo { register: Register::YMM2, base: Register::YMM0, full_register32: Register::ZMM2, full_register: Register::ZMM2, size: 32 },
135 RegisterInfo { register: Register::YMM3, base: Register::YMM0, full_register32: Register::ZMM3, full_register: Register::ZMM3, size: 32 },
136 RegisterInfo { register: Register::YMM4, base: Register::YMM0, full_register32: Register::ZMM4, full_register: Register::ZMM4, size: 32 },
137 RegisterInfo { register: Register::YMM5, base: Register::YMM0, full_register32: Register::ZMM5, full_register: Register::ZMM5, size: 32 },
138 RegisterInfo { register: Register::YMM6, base: Register::YMM0, full_register32: Register::ZMM6, full_register: Register::ZMM6, size: 32 },
139 RegisterInfo { register: Register::YMM7, base: Register::YMM0, full_register32: Register::ZMM7, full_register: Register::ZMM7, size: 32 },
140 RegisterInfo { register: Register::YMM8, base: Register::YMM0, full_register32: Register::ZMM8, full_register: Register::ZMM8, size: 32 },
141 RegisterInfo { register: Register::YMM9, base: Register::YMM0, full_register32: Register::ZMM9, full_register: Register::ZMM9, size: 32 },
142 RegisterInfo { register: Register::YMM10, base: Register::YMM0, full_register32: Register::ZMM10, full_register: Register::ZMM10, size: 32 },
143 RegisterInfo { register: Register::YMM11, base: Register::YMM0, full_register32: Register::ZMM11, full_register: Register::ZMM11, size: 32 },
144 RegisterInfo { register: Register::YMM12, base: Register::YMM0, full_register32: Register::ZMM12, full_register: Register::ZMM12, size: 32 },
145 RegisterInfo { register: Register::YMM13, base: Register::YMM0, full_register32: Register::ZMM13, full_register: Register::ZMM13, size: 32 },
146 RegisterInfo { register: Register::YMM14, base: Register::YMM0, full_register32: Register::ZMM14, full_register: Register::ZMM14, size: 32 },
147 RegisterInfo { register: Register::YMM15, base: Register::YMM0, full_register32: Register::ZMM15, full_register: Register::ZMM15, size: 32 },
148 RegisterInfo { register: Register::YMM16, base: Register::YMM0, full_register32: Register::ZMM16, full_register: Register::ZMM16, size: 32 },
149 RegisterInfo { register: Register::YMM17, base: Register::YMM0, full_register32: Register::ZMM17, full_register: Register::ZMM17, size: 32 },
150 RegisterInfo { register: Register::YMM18, base: Register::YMM0, full_register32: Register::ZMM18, full_register: Register::ZMM18, size: 32 },
151 RegisterInfo { register: Register::YMM19, base: Register::YMM0, full_register32: Register::ZMM19, full_register: Register::ZMM19, size: 32 },
152 RegisterInfo { register: Register::YMM20, base: Register::YMM0, full_register32: Register::ZMM20, full_register: Register::ZMM20, size: 32 },
153 RegisterInfo { register: Register::YMM21, base: Register::YMM0, full_register32: Register::ZMM21, full_register: Register::ZMM21, size: 32 },
154 RegisterInfo { register: Register::YMM22, base: Register::YMM0, full_register32: Register::ZMM22, full_register: Register::ZMM22, size: 32 },
155 RegisterInfo { register: Register::YMM23, base: Register::YMM0, full_register32: Register::ZMM23, full_register: Register::ZMM23, size: 32 },
156 RegisterInfo { register: Register::YMM24, base: Register::YMM0, full_register32: Register::ZMM24, full_register: Register::ZMM24, size: 32 },
157 RegisterInfo { register: Register::YMM25, base: Register::YMM0, full_register32: Register::ZMM25, full_register: Register::ZMM25, size: 32 },
158 RegisterInfo { register: Register::YMM26, base: Register::YMM0, full_register32: Register::ZMM26, full_register: Register::ZMM26, size: 32 },
159 RegisterInfo { register: Register::YMM27, base: Register::YMM0, full_register32: Register::ZMM27, full_register: Register::ZMM27, size: 32 },
160 RegisterInfo { register: Register::YMM28, base: Register::YMM0, full_register32: Register::ZMM28, full_register: Register::ZMM28, size: 32 },
161 RegisterInfo { register: Register::YMM29, base: Register::YMM0, full_register32: Register::ZMM29, full_register: Register::ZMM29, size: 32 },
162 RegisterInfo { register: Register::YMM30, base: Register::YMM0, full_register32: Register::ZMM30, full_register: Register::ZMM30, size: 32 },
163 RegisterInfo { register: Register::YMM31, base: Register::YMM0, full_register32: Register::ZMM31, full_register: Register::ZMM31, size: 32 },
164 RegisterInfo { register: Register::ZMM0, base: Register::ZMM0, full_register32: Register::ZMM0, full_register: Register::ZMM0, size: 64 },
165 RegisterInfo { register: Register::ZMM1, base: Register::ZMM0, full_register32: Register::ZMM1, full_register: Register::ZMM1, size: 64 },
166 RegisterInfo { register: Register::ZMM2, base: Register::ZMM0, full_register32: Register::ZMM2, full_register: Register::ZMM2, size: 64 },
167 RegisterInfo { register: Register::ZMM3, base: Register::ZMM0, full_register32: Register::ZMM3, full_register: Register::ZMM3, size: 64 },
168 RegisterInfo { register: Register::ZMM4, base: Register::ZMM0, full_register32: Register::ZMM4, full_register: Register::ZMM4, size: 64 },
169 RegisterInfo { register: Register::ZMM5, base: Register::ZMM0, full_register32: Register::ZMM5, full_register: Register::ZMM5, size: 64 },
170 RegisterInfo { register: Register::ZMM6, base: Register::ZMM0, full_register32: Register::ZMM6, full_register: Register::ZMM6, size: 64 },
171 RegisterInfo { register: Register::ZMM7, base: Register::ZMM0, full_register32: Register::ZMM7, full_register: Register::ZMM7, size: 64 },
172 RegisterInfo { register: Register::ZMM8, base: Register::ZMM0, full_register32: Register::ZMM8, full_register: Register::ZMM8, size: 64 },
173 RegisterInfo { register: Register::ZMM9, base: Register::ZMM0, full_register32: Register::ZMM9, full_register: Register::ZMM9, size: 64 },
174 RegisterInfo { register: Register::ZMM10, base: Register::ZMM0, full_register32: Register::ZMM10, full_register: Register::ZMM10, size: 64 },
175 RegisterInfo { register: Register::ZMM11, base: Register::ZMM0, full_register32: Register::ZMM11, full_register: Register::ZMM11, size: 64 },
176 RegisterInfo { register: Register::ZMM12, base: Register::ZMM0, full_register32: Register::ZMM12, full_register: Register::ZMM12, size: 64 },
177 RegisterInfo { register: Register::ZMM13, base: Register::ZMM0, full_register32: Register::ZMM13, full_register: Register::ZMM13, size: 64 },
178 RegisterInfo { register: Register::ZMM14, base: Register::ZMM0, full_register32: Register::ZMM14, full_register: Register::ZMM14, size: 64 },
179 RegisterInfo { register: Register::ZMM15, base: Register::ZMM0, full_register32: Register::ZMM15, full_register: Register::ZMM15, size: 64 },
180 RegisterInfo { register: Register::ZMM16, base: Register::ZMM0, full_register32: Register::ZMM16, full_register: Register::ZMM16, size: 64 },
181 RegisterInfo { register: Register::ZMM17, base: Register::ZMM0, full_register32: Register::ZMM17, full_register: Register::ZMM17, size: 64 },
182 RegisterInfo { register: Register::ZMM18, base: Register::ZMM0, full_register32: Register::ZMM18, full_register: Register::ZMM18, size: 64 },
183 RegisterInfo { register: Register::ZMM19, base: Register::ZMM0, full_register32: Register::ZMM19, full_register: Register::ZMM19, size: 64 },
184 RegisterInfo { register: Register::ZMM20, base: Register::ZMM0, full_register32: Register::ZMM20, full_register: Register::ZMM20, size: 64 },
185 RegisterInfo { register: Register::ZMM21, base: Register::ZMM0, full_register32: Register::ZMM21, full_register: Register::ZMM21, size: 64 },
186 RegisterInfo { register: Register::ZMM22, base: Register::ZMM0, full_register32: Register::ZMM22, full_register: Register::ZMM22, size: 64 },
187 RegisterInfo { register: Register::ZMM23, base: Register::ZMM0, full_register32: Register::ZMM23, full_register: Register::ZMM23, size: 64 },
188 RegisterInfo { register: Register::ZMM24, base: Register::ZMM0, full_register32: Register::ZMM24, full_register: Register::ZMM24, size: 64 },
189 RegisterInfo { register: Register::ZMM25, base: Register::ZMM0, full_register32: Register::ZMM25, full_register: Register::ZMM25, size: 64 },
190 RegisterInfo { register: Register::ZMM26, base: Register::ZMM0, full_register32: Register::ZMM26, full_register: Register::ZMM26, size: 64 },
191 RegisterInfo { register: Register::ZMM27, base: Register::ZMM0, full_register32: Register::ZMM27, full_register: Register::ZMM27, size: 64 },
192 RegisterInfo { register: Register::ZMM28, base: Register::ZMM0, full_register32: Register::ZMM28, full_register: Register::ZMM28, size: 64 },
193 RegisterInfo { register: Register::ZMM29, base: Register::ZMM0, full_register32: Register::ZMM29, full_register: Register::ZMM29, size: 64 },
194 RegisterInfo { register: Register::ZMM30, base: Register::ZMM0, full_register32: Register::ZMM30, full_register: Register::ZMM30, size: 64 },
195 RegisterInfo { register: Register::ZMM31, base: Register::ZMM0, full_register32: Register::ZMM31, full_register: Register::ZMM31, size: 64 },
196 RegisterInfo { register: Register::K0, base: Register::K0, full_register32: Register::K0, full_register: Register::K0, size: 8 },
197 RegisterInfo { register: Register::K1, base: Register::K0, full_register32: Register::K1, full_register: Register::K1, size: 8 },
198 RegisterInfo { register: Register::K2, base: Register::K0, full_register32: Register::K2, full_register: Register::K2, size: 8 },
199 RegisterInfo { register: Register::K3, base: Register::K0, full_register32: Register::K3, full_register: Register::K3, size: 8 },
200 RegisterInfo { register: Register::K4, base: Register::K0, full_register32: Register::K4, full_register: Register::K4, size: 8 },
201 RegisterInfo { register: Register::K5, base: Register::K0, full_register32: Register::K5, full_register: Register::K5, size: 8 },
202 RegisterInfo { register: Register::K6, base: Register::K0, full_register32: Register::K6, full_register: Register::K6, size: 8 },
203 RegisterInfo { register: Register::K7, base: Register::K0, full_register32: Register::K7, full_register: Register::K7, size: 8 },
204 RegisterInfo { register: Register::BND0, base: Register::BND0, full_register32: Register::BND0, full_register: Register::BND0, size: 16 },
205 RegisterInfo { register: Register::BND1, base: Register::BND0, full_register32: Register::BND1, full_register: Register::BND1, size: 16 },
206 RegisterInfo { register: Register::BND2, base: Register::BND0, full_register32: Register::BND2, full_register: Register::BND2, size: 16 },
207 RegisterInfo { register: Register::BND3, base: Register::BND0, full_register32: Register::BND3, full_register: Register::BND3, size: 16 },
208 RegisterInfo { register: Register::CR0, base: Register::CR0, full_register32: Register::CR0, full_register: Register::CR0, size: 8 },
209 RegisterInfo { register: Register::CR1, base: Register::CR0, full_register32: Register::CR1, full_register: Register::CR1, size: 8 },
210 RegisterInfo { register: Register::CR2, base: Register::CR0, full_register32: Register::CR2, full_register: Register::CR2, size: 8 },
211 RegisterInfo { register: Register::CR3, base: Register::CR0, full_register32: Register::CR3, full_register: Register::CR3, size: 8 },
212 RegisterInfo { register: Register::CR4, base: Register::CR0, full_register32: Register::CR4, full_register: Register::CR4, size: 8 },
213 RegisterInfo { register: Register::CR5, base: Register::CR0, full_register32: Register::CR5, full_register: Register::CR5, size: 8 },
214 RegisterInfo { register: Register::CR6, base: Register::CR0, full_register32: Register::CR6, full_register: Register::CR6, size: 8 },
215 RegisterInfo { register: Register::CR7, base: Register::CR0, full_register32: Register::CR7, full_register: Register::CR7, size: 8 },
216 RegisterInfo { register: Register::CR8, base: Register::CR0, full_register32: Register::CR8, full_register: Register::CR8, size: 8 },
217 RegisterInfo { register: Register::CR9, base: Register::CR0, full_register32: Register::CR9, full_register: Register::CR9, size: 8 },
218 RegisterInfo { register: Register::CR10, base: Register::CR0, full_register32: Register::CR10, full_register: Register::CR10, size: 8 },
219 RegisterInfo { register: Register::CR11, base: Register::CR0, full_register32: Register::CR11, full_register: Register::CR11, size: 8 },
220 RegisterInfo { register: Register::CR12, base: Register::CR0, full_register32: Register::CR12, full_register: Register::CR12, size: 8 },
221 RegisterInfo { register: Register::CR13, base: Register::CR0, full_register32: Register::CR13, full_register: Register::CR13, size: 8 },
222 RegisterInfo { register: Register::CR14, base: Register::CR0, full_register32: Register::CR14, full_register: Register::CR14, size: 8 },
223 RegisterInfo { register: Register::CR15, base: Register::CR0, full_register32: Register::CR15, full_register: Register::CR15, size: 8 },
224 RegisterInfo { register: Register::DR0, base: Register::DR0, full_register32: Register::DR0, full_register: Register::DR0, size: 8 },
225 RegisterInfo { register: Register::DR1, base: Register::DR0, full_register32: Register::DR1, full_register: Register::DR1, size: 8 },
226 RegisterInfo { register: Register::DR2, base: Register::DR0, full_register32: Register::DR2, full_register: Register::DR2, size: 8 },
227 RegisterInfo { register: Register::DR3, base: Register::DR0, full_register32: Register::DR3, full_register: Register::DR3, size: 8 },
228 RegisterInfo { register: Register::DR4, base: Register::DR0, full_register32: Register::DR4, full_register: Register::DR4, size: 8 },
229 RegisterInfo { register: Register::DR5, base: Register::DR0, full_register32: Register::DR5, full_register: Register::DR5, size: 8 },
230 RegisterInfo { register: Register::DR6, base: Register::DR0, full_register32: Register::DR6, full_register: Register::DR6, size: 8 },
231 RegisterInfo { register: Register::DR7, base: Register::DR0, full_register32: Register::DR7, full_register: Register::DR7, size: 8 },
232 RegisterInfo { register: Register::DR8, base: Register::DR0, full_register32: Register::DR8, full_register: Register::DR8, size: 8 },
233 RegisterInfo { register: Register::DR9, base: Register::DR0, full_register32: Register::DR9, full_register: Register::DR9, size: 8 },
234 RegisterInfo { register: Register::DR10, base: Register::DR0, full_register32: Register::DR10, full_register: Register::DR10, size: 8 },
235 RegisterInfo { register: Register::DR11, base: Register::DR0, full_register32: Register::DR11, full_register: Register::DR11, size: 8 },
236 RegisterInfo { register: Register::DR12, base: Register::DR0, full_register32: Register::DR12, full_register: Register::DR12, size: 8 },
237 RegisterInfo { register: Register::DR13, base: Register::DR0, full_register32: Register::DR13, full_register: Register::DR13, size: 8 },
238 RegisterInfo { register: Register::DR14, base: Register::DR0, full_register32: Register::DR14, full_register: Register::DR14, size: 8 },
239 RegisterInfo { register: Register::DR15, base: Register::DR0, full_register32: Register::DR15, full_register: Register::DR15, size: 8 },
240 RegisterInfo { register: Register::ST0, base: Register::ST0, full_register32: Register::ST0, full_register: Register::ST0, size: 10 },
241 RegisterInfo { register: Register::ST1, base: Register::ST0, full_register32: Register::ST1, full_register: Register::ST1, size: 10 },
242 RegisterInfo { register: Register::ST2, base: Register::ST0, full_register32: Register::ST2, full_register: Register::ST2, size: 10 },
243 RegisterInfo { register: Register::ST3, base: Register::ST0, full_register32: Register::ST3, full_register: Register::ST3, size: 10 },
244 RegisterInfo { register: Register::ST4, base: Register::ST0, full_register32: Register::ST4, full_register: Register::ST4, size: 10 },
245 RegisterInfo { register: Register::ST5, base: Register::ST0, full_register32: Register::ST5, full_register: Register::ST5, size: 10 },
246 RegisterInfo { register: Register::ST6, base: Register::ST0, full_register32: Register::ST6, full_register: Register::ST6, size: 10 },
247 RegisterInfo { register: Register::ST7, base: Register::ST0, full_register32: Register::ST7, full_register: Register::ST7, size: 10 },
248 RegisterInfo { register: Register::MM0, base: Register::MM0, full_register32: Register::MM0, full_register: Register::MM0, size: 8 },
249 RegisterInfo { register: Register::MM1, base: Register::MM0, full_register32: Register::MM1, full_register: Register::MM1, size: 8 },
250 RegisterInfo { register: Register::MM2, base: Register::MM0, full_register32: Register::MM2, full_register: Register::MM2, size: 8 },
251 RegisterInfo { register: Register::MM3, base: Register::MM0, full_register32: Register::MM3, full_register: Register::MM3, size: 8 },
252 RegisterInfo { register: Register::MM4, base: Register::MM0, full_register32: Register::MM4, full_register: Register::MM4, size: 8 },
253 RegisterInfo { register: Register::MM5, base: Register::MM0, full_register32: Register::MM5, full_register: Register::MM5, size: 8 },
254 RegisterInfo { register: Register::MM6, base: Register::MM0, full_register32: Register::MM6, full_register: Register::MM6, size: 8 },
255 RegisterInfo { register: Register::MM7, base: Register::MM0, full_register32: Register::MM7, full_register: Register::MM7, size: 8 },
256 RegisterInfo { register: Register::TR0, base: Register::TR0, full_register32: Register::TR0, full_register: Register::TR0, size: 4 },
257 RegisterInfo { register: Register::TR1, base: Register::TR0, full_register32: Register::TR1, full_register: Register::TR1, size: 4 },
258 RegisterInfo { register: Register::TR2, base: Register::TR0, full_register32: Register::TR2, full_register: Register::TR2, size: 4 },
259 RegisterInfo { register: Register::TR3, base: Register::TR0, full_register32: Register::TR3, full_register: Register::TR3, size: 4 },
260 RegisterInfo { register: Register::TR4, base: Register::TR0, full_register32: Register::TR4, full_register: Register::TR4, size: 4 },
261 RegisterInfo { register: Register::TR5, base: Register::TR0, full_register32: Register::TR5, full_register: Register::TR5, size: 4 },
262 RegisterInfo { register: Register::TR6, base: Register::TR0, full_register32: Register::TR6, full_register: Register::TR6, size: 4 },
263 RegisterInfo { register: Register::TR7, base: Register::TR0, full_register32: Register::TR7, full_register: Register::TR7, size: 4 },
264 RegisterInfo { register: Register::TMM0, base: Register::TMM0, full_register32: Register::TMM0, full_register: Register::TMM0, size: 1024 },
265 RegisterInfo { register: Register::TMM1, base: Register::TMM0, full_register32: Register::TMM1, full_register: Register::TMM1, size: 1024 },
266 RegisterInfo { register: Register::TMM2, base: Register::TMM0, full_register32: Register::TMM2, full_register: Register::TMM2, size: 1024 },
267 RegisterInfo { register: Register::TMM3, base: Register::TMM0, full_register32: Register::TMM3, full_register: Register::TMM3, size: 1024 },
268 RegisterInfo { register: Register::TMM4, base: Register::TMM0, full_register32: Register::TMM4, full_register: Register::TMM4, size: 1024 },
269 RegisterInfo { register: Register::TMM5, base: Register::TMM0, full_register32: Register::TMM5, full_register: Register::TMM5, size: 1024 },
270 RegisterInfo { register: Register::TMM6, base: Register::TMM0, full_register32: Register::TMM6, full_register: Register::TMM6, size: 1024 },
271 RegisterInfo { register: Register::TMM7, base: Register::TMM0, full_register32: Register::TMM7, full_register: Register::TMM7, size: 1024 },
272 RegisterInfo { register: Register::DontUse0, base: Register::DontUse0, full_register32: Register::DontUse0, full_register: Register::DontUse0, size: 0 },
273 RegisterInfo { register: Register::DontUseFA, base: Register::DontUseFA, full_register32: Register::DontUseFA, full_register: Register::DontUseFA, size: 0 },
274 RegisterInfo { register: Register::DontUseFB, base: Register::DontUseFA, full_register32: Register::DontUseFB, full_register: Register::DontUseFB, size: 0 },
275 RegisterInfo { register: Register::DontUseFC, base: Register::DontUseFA, full_register32: Register::DontUseFC, full_register: Register::DontUseFC, size: 0 },
276 RegisterInfo { register: Register::DontUseFD, base: Register::DontUseFA, full_register32: Register::DontUseFD, full_register: Register::DontUseFD, size: 0 },
277 RegisterInfo { register: Register::DontUseFE, base: Register::DontUseFA, full_register32: Register::DontUseFE, full_register: Register::DontUseFE, size: 0 },
278 RegisterInfo { register: Register::DontUseFF, base: Register::DontUseFA, full_register32: Register::DontUseFF, full_register: Register::DontUseFF, size: 0 },
279 ];
281
282 #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
286 pub struct RegisterInfo {
287 register: Register,
288 base: Register,
289 full_register: Register,
290 full_register32: Register,
291 size: u16,
292 }
293
294 impl RegisterInfo {
295 #[must_use]
305 #[inline]
306 pub const fn register(&self) -> Register {
307 self.register
308 }
309
310 #[must_use]
328 #[inline]
329 pub const fn base(&self) -> Register {
330 self.base
331 }
332
333 #[must_use]
353 #[inline]
354 pub const fn number(&self) -> usize {
355 self.register as usize - self.base as usize
356 }
357
358 #[must_use]
382 #[inline]
383 pub const fn full_register(&self) -> Register {
384 self.full_register
385 }
386
387 #[must_use]
412 #[inline]
413 pub const fn full_register32(&self) -> Register {
414 self.full_register32
415 }
416
417 #[must_use]
441 #[inline]
442 pub const fn size(&self) -> usize {
443 self.size as usize
444 }
445 }
446}
447
448#[cfg(feature = "instr_info")]
449impl Register {
450 #[must_use]
460 #[inline]
461 pub fn info(self) -> &'static RegisterInfo {
462 ®ISTER_INFOS[self as usize]
463 }
464
465 #[must_use]
489 #[inline]
490 pub fn base(self) -> Self {
491 self.info().base()
492 }
493
494 #[must_use]
520 #[inline]
521 pub fn number(self) -> usize {
522 self.info().number()
523 }
524
525 #[must_use]
549 #[inline]
550 pub fn full_register(self) -> Self {
551 self.info().full_register()
552 }
553
554 #[must_use]
579 #[inline]
580 pub fn full_register32(self) -> Self {
581 self.info().full_register32()
582 }
583
584 #[must_use]
608 #[inline]
609 pub fn size(self) -> usize {
610 self.info().size()
611 }
612}
613
614#[cfg(any(feature = "instr_info", feature = "encoder"))]
615impl Register {
616 #[must_use]
626 #[inline]
627 pub fn is_segment_register(self) -> bool {
628 Register::ES <= self && self <= Register::GS
629 }
630
631 #[must_use]
645 #[inline]
646 pub fn is_gpr(self) -> bool {
647 Register::AL <= self && self <= Register::R15
648 }
649
650 #[must_use]
664 #[inline]
665 pub fn is_gpr8(self) -> bool {
666 Register::AL <= self && self <= Register::R15L
667 }
668
669 #[must_use]
683 #[inline]
684 pub fn is_gpr16(self) -> bool {
685 Register::AX <= self && self <= Register::R15W
686 }
687
688 #[must_use]
702 #[inline]
703 pub fn is_gpr32(self) -> bool {
704 Register::EAX <= self && self <= Register::R15D
705 }
706
707 #[must_use]
721 #[inline]
722 pub fn is_gpr64(self) -> bool {
723 Register::RAX <= self && self <= Register::R15
724 }
725
726 #[must_use]
739 #[inline]
740 pub fn is_xmm(self) -> bool {
741 Register::XMM0 <= self && self <= IcedConstants::XMM_LAST
742 }
743
744 #[must_use]
757 #[inline]
758 pub fn is_ymm(self) -> bool {
759 Register::YMM0 <= self && self <= IcedConstants::YMM_LAST
760 }
761
762 #[must_use]
775 #[inline]
776 pub fn is_zmm(self) -> bool {
777 Register::ZMM0 <= self && self <= IcedConstants::ZMM_LAST
778 }
779
780 #[must_use]
793 #[inline]
794 pub fn is_vector_register(self) -> bool {
795 Register::XMM0 <= self && self <= IcedConstants::VMM_LAST
796 }
797
798 #[must_use]
808 #[inline]
809 pub fn is_ip(self) -> bool {
810 self == Register::EIP || self == Register::RIP
811 }
812
813 #[must_use]
823 #[inline]
824 pub fn is_k(self) -> bool {
825 Register::K0 <= self && self <= Register::K7
826 }
827
828 #[must_use]
838 #[inline]
839 pub fn is_cr(self) -> bool {
840 Register::CR0 <= self && self <= Register::CR15
841 }
842
843 #[must_use]
853 #[inline]
854 pub fn is_dr(self) -> bool {
855 Register::DR0 <= self && self <= Register::DR15
856 }
857
858 #[must_use]
868 #[inline]
869 pub fn is_tr(self) -> bool {
870 Register::TR0 <= self && self <= Register::TR7
871 }
872
873 #[must_use]
883 #[inline]
884 pub fn is_st(self) -> bool {
885 Register::ST0 <= self && self <= Register::ST7
886 }
887
888 #[must_use]
898 #[inline]
899 pub fn is_bnd(self) -> bool {
900 Register::BND0 <= self && self <= Register::BND3
901 }
902
903 #[must_use]
913 #[inline]
914 pub fn is_mm(self) -> bool {
915 Register::MM0 <= self && self <= Register::MM7
916 }
917
918 #[must_use]
928 #[inline]
929 pub fn is_tmm(self) -> bool {
930 Register::TMM0 <= self && self <= IcedConstants::TMM_LAST
931 }
932}
933
934#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
938#[cfg_attr(not(feature = "exhaustive_enums"), non_exhaustive)]
939#[allow(missing_docs)]
940pub enum Register {
941 None = 0,
942 AL = 1,
943 CL = 2,
944 DL = 3,
945 BL = 4,
946 AH = 5,
947 CH = 6,
948 DH = 7,
949 BH = 8,
950 SPL = 9,
951 BPL = 10,
952 SIL = 11,
953 DIL = 12,
954 R8L = 13,
955 R9L = 14,
956 R10L = 15,
957 R11L = 16,
958 R12L = 17,
959 R13L = 18,
960 R14L = 19,
961 R15L = 20,
962 AX = 21,
963 CX = 22,
964 DX = 23,
965 BX = 24,
966 SP = 25,
967 BP = 26,
968 SI = 27,
969 DI = 28,
970 R8W = 29,
971 R9W = 30,
972 R10W = 31,
973 R11W = 32,
974 R12W = 33,
975 R13W = 34,
976 R14W = 35,
977 R15W = 36,
978 EAX = 37,
979 ECX = 38,
980 EDX = 39,
981 EBX = 40,
982 ESP = 41,
983 EBP = 42,
984 ESI = 43,
985 EDI = 44,
986 R8D = 45,
987 R9D = 46,
988 R10D = 47,
989 R11D = 48,
990 R12D = 49,
991 R13D = 50,
992 R14D = 51,
993 R15D = 52,
994 RAX = 53,
995 RCX = 54,
996 RDX = 55,
997 RBX = 56,
998 RSP = 57,
999 RBP = 58,
1000 RSI = 59,
1001 RDI = 60,
1002 R8 = 61,
1003 R9 = 62,
1004 R10 = 63,
1005 R11 = 64,
1006 R12 = 65,
1007 R13 = 66,
1008 R14 = 67,
1009 R15 = 68,
1010 EIP = 69,
1011 RIP = 70,
1012 ES = 71,
1013 CS = 72,
1014 SS = 73,
1015 DS = 74,
1016 FS = 75,
1017 GS = 76,
1018 XMM0 = 77,
1019 XMM1 = 78,
1020 XMM2 = 79,
1021 XMM3 = 80,
1022 XMM4 = 81,
1023 XMM5 = 82,
1024 XMM6 = 83,
1025 XMM7 = 84,
1026 XMM8 = 85,
1027 XMM9 = 86,
1028 XMM10 = 87,
1029 XMM11 = 88,
1030 XMM12 = 89,
1031 XMM13 = 90,
1032 XMM14 = 91,
1033 XMM15 = 92,
1034 XMM16 = 93,
1035 XMM17 = 94,
1036 XMM18 = 95,
1037 XMM19 = 96,
1038 XMM20 = 97,
1039 XMM21 = 98,
1040 XMM22 = 99,
1041 XMM23 = 100,
1042 XMM24 = 101,
1043 XMM25 = 102,
1044 XMM26 = 103,
1045 XMM27 = 104,
1046 XMM28 = 105,
1047 XMM29 = 106,
1048 XMM30 = 107,
1049 XMM31 = 108,
1050 YMM0 = 109,
1051 YMM1 = 110,
1052 YMM2 = 111,
1053 YMM3 = 112,
1054 YMM4 = 113,
1055 YMM5 = 114,
1056 YMM6 = 115,
1057 YMM7 = 116,
1058 YMM8 = 117,
1059 YMM9 = 118,
1060 YMM10 = 119,
1061 YMM11 = 120,
1062 YMM12 = 121,
1063 YMM13 = 122,
1064 YMM14 = 123,
1065 YMM15 = 124,
1066 YMM16 = 125,
1067 YMM17 = 126,
1068 YMM18 = 127,
1069 YMM19 = 128,
1070 YMM20 = 129,
1071 YMM21 = 130,
1072 YMM22 = 131,
1073 YMM23 = 132,
1074 YMM24 = 133,
1075 YMM25 = 134,
1076 YMM26 = 135,
1077 YMM27 = 136,
1078 YMM28 = 137,
1079 YMM29 = 138,
1080 YMM30 = 139,
1081 YMM31 = 140,
1082 ZMM0 = 141,
1083 ZMM1 = 142,
1084 ZMM2 = 143,
1085 ZMM3 = 144,
1086 ZMM4 = 145,
1087 ZMM5 = 146,
1088 ZMM6 = 147,
1089 ZMM7 = 148,
1090 ZMM8 = 149,
1091 ZMM9 = 150,
1092 ZMM10 = 151,
1093 ZMM11 = 152,
1094 ZMM12 = 153,
1095 ZMM13 = 154,
1096 ZMM14 = 155,
1097 ZMM15 = 156,
1098 ZMM16 = 157,
1099 ZMM17 = 158,
1100 ZMM18 = 159,
1101 ZMM19 = 160,
1102 ZMM20 = 161,
1103 ZMM21 = 162,
1104 ZMM22 = 163,
1105 ZMM23 = 164,
1106 ZMM24 = 165,
1107 ZMM25 = 166,
1108 ZMM26 = 167,
1109 ZMM27 = 168,
1110 ZMM28 = 169,
1111 ZMM29 = 170,
1112 ZMM30 = 171,
1113 ZMM31 = 172,
1114 K0 = 173,
1115 K1 = 174,
1116 K2 = 175,
1117 K3 = 176,
1118 K4 = 177,
1119 K5 = 178,
1120 K6 = 179,
1121 K7 = 180,
1122 BND0 = 181,
1123 BND1 = 182,
1124 BND2 = 183,
1125 BND3 = 184,
1126 CR0 = 185,
1127 CR1 = 186,
1128 CR2 = 187,
1129 CR3 = 188,
1130 CR4 = 189,
1131 CR5 = 190,
1132 CR6 = 191,
1133 CR7 = 192,
1134 CR8 = 193,
1135 CR9 = 194,
1136 CR10 = 195,
1137 CR11 = 196,
1138 CR12 = 197,
1139 CR13 = 198,
1140 CR14 = 199,
1141 CR15 = 200,
1142 DR0 = 201,
1143 DR1 = 202,
1144 DR2 = 203,
1145 DR3 = 204,
1146 DR4 = 205,
1147 DR5 = 206,
1148 DR6 = 207,
1149 DR7 = 208,
1150 DR8 = 209,
1151 DR9 = 210,
1152 DR10 = 211,
1153 DR11 = 212,
1154 DR12 = 213,
1155 DR13 = 214,
1156 DR14 = 215,
1157 DR15 = 216,
1158 ST0 = 217,
1159 ST1 = 218,
1160 ST2 = 219,
1161 ST3 = 220,
1162 ST4 = 221,
1163 ST5 = 222,
1164 ST6 = 223,
1165 ST7 = 224,
1166 MM0 = 225,
1167 MM1 = 226,
1168 MM2 = 227,
1169 MM3 = 228,
1170 MM4 = 229,
1171 MM5 = 230,
1172 MM6 = 231,
1173 MM7 = 232,
1174 TR0 = 233,
1175 TR1 = 234,
1176 TR2 = 235,
1177 TR3 = 236,
1178 TR4 = 237,
1179 TR5 = 238,
1180 TR6 = 239,
1181 TR7 = 240,
1182 TMM0 = 241,
1183 TMM1 = 242,
1184 TMM2 = 243,
1185 TMM3 = 244,
1186 TMM4 = 245,
1187 TMM5 = 246,
1188 TMM6 = 247,
1189 TMM7 = 248,
1190 #[deprecated(since = "1.12.0", note = "Not part of the public API")]
1192 DontUse0 = 249,
1193 #[deprecated(since = "1.12.0", note = "Not part of the public API")]
1195 DontUseFA = 250,
1196 #[deprecated(since = "1.12.0", note = "Not part of the public API")]
1198 DontUseFB = 251,
1199 #[deprecated(since = "1.12.0", note = "Not part of the public API")]
1201 DontUseFC = 252,
1202 #[deprecated(since = "1.12.0", note = "Not part of the public API")]
1204 DontUseFD = 253,
1205 #[deprecated(since = "1.12.0", note = "Not part of the public API")]
1207 DontUseFE = 254,
1208 #[deprecated(since = "1.12.0", note = "Not part of the public API")]
1210 DontUseFF = 255,
1211}
1212#[rustfmt::skip]
1213static GEN_DEBUG_REGISTER: [&str; 256] = [
1214 "None",
1215 "AL",
1216 "CL",
1217 "DL",
1218 "BL",
1219 "AH",
1220 "CH",
1221 "DH",
1222 "BH",
1223 "SPL",
1224 "BPL",
1225 "SIL",
1226 "DIL",
1227 "R8L",
1228 "R9L",
1229 "R10L",
1230 "R11L",
1231 "R12L",
1232 "R13L",
1233 "R14L",
1234 "R15L",
1235 "AX",
1236 "CX",
1237 "DX",
1238 "BX",
1239 "SP",
1240 "BP",
1241 "SI",
1242 "DI",
1243 "R8W",
1244 "R9W",
1245 "R10W",
1246 "R11W",
1247 "R12W",
1248 "R13W",
1249 "R14W",
1250 "R15W",
1251 "EAX",
1252 "ECX",
1253 "EDX",
1254 "EBX",
1255 "ESP",
1256 "EBP",
1257 "ESI",
1258 "EDI",
1259 "R8D",
1260 "R9D",
1261 "R10D",
1262 "R11D",
1263 "R12D",
1264 "R13D",
1265 "R14D",
1266 "R15D",
1267 "RAX",
1268 "RCX",
1269 "RDX",
1270 "RBX",
1271 "RSP",
1272 "RBP",
1273 "RSI",
1274 "RDI",
1275 "R8",
1276 "R9",
1277 "R10",
1278 "R11",
1279 "R12",
1280 "R13",
1281 "R14",
1282 "R15",
1283 "EIP",
1284 "RIP",
1285 "ES",
1286 "CS",
1287 "SS",
1288 "DS",
1289 "FS",
1290 "GS",
1291 "XMM0",
1292 "XMM1",
1293 "XMM2",
1294 "XMM3",
1295 "XMM4",
1296 "XMM5",
1297 "XMM6",
1298 "XMM7",
1299 "XMM8",
1300 "XMM9",
1301 "XMM10",
1302 "XMM11",
1303 "XMM12",
1304 "XMM13",
1305 "XMM14",
1306 "XMM15",
1307 "XMM16",
1308 "XMM17",
1309 "XMM18",
1310 "XMM19",
1311 "XMM20",
1312 "XMM21",
1313 "XMM22",
1314 "XMM23",
1315 "XMM24",
1316 "XMM25",
1317 "XMM26",
1318 "XMM27",
1319 "XMM28",
1320 "XMM29",
1321 "XMM30",
1322 "XMM31",
1323 "YMM0",
1324 "YMM1",
1325 "YMM2",
1326 "YMM3",
1327 "YMM4",
1328 "YMM5",
1329 "YMM6",
1330 "YMM7",
1331 "YMM8",
1332 "YMM9",
1333 "YMM10",
1334 "YMM11",
1335 "YMM12",
1336 "YMM13",
1337 "YMM14",
1338 "YMM15",
1339 "YMM16",
1340 "YMM17",
1341 "YMM18",
1342 "YMM19",
1343 "YMM20",
1344 "YMM21",
1345 "YMM22",
1346 "YMM23",
1347 "YMM24",
1348 "YMM25",
1349 "YMM26",
1350 "YMM27",
1351 "YMM28",
1352 "YMM29",
1353 "YMM30",
1354 "YMM31",
1355 "ZMM0",
1356 "ZMM1",
1357 "ZMM2",
1358 "ZMM3",
1359 "ZMM4",
1360 "ZMM5",
1361 "ZMM6",
1362 "ZMM7",
1363 "ZMM8",
1364 "ZMM9",
1365 "ZMM10",
1366 "ZMM11",
1367 "ZMM12",
1368 "ZMM13",
1369 "ZMM14",
1370 "ZMM15",
1371 "ZMM16",
1372 "ZMM17",
1373 "ZMM18",
1374 "ZMM19",
1375 "ZMM20",
1376 "ZMM21",
1377 "ZMM22",
1378 "ZMM23",
1379 "ZMM24",
1380 "ZMM25",
1381 "ZMM26",
1382 "ZMM27",
1383 "ZMM28",
1384 "ZMM29",
1385 "ZMM30",
1386 "ZMM31",
1387 "K0",
1388 "K1",
1389 "K2",
1390 "K3",
1391 "K4",
1392 "K5",
1393 "K6",
1394 "K7",
1395 "BND0",
1396 "BND1",
1397 "BND2",
1398 "BND3",
1399 "CR0",
1400 "CR1",
1401 "CR2",
1402 "CR3",
1403 "CR4",
1404 "CR5",
1405 "CR6",
1406 "CR7",
1407 "CR8",
1408 "CR9",
1409 "CR10",
1410 "CR11",
1411 "CR12",
1412 "CR13",
1413 "CR14",
1414 "CR15",
1415 "DR0",
1416 "DR1",
1417 "DR2",
1418 "DR3",
1419 "DR4",
1420 "DR5",
1421 "DR6",
1422 "DR7",
1423 "DR8",
1424 "DR9",
1425 "DR10",
1426 "DR11",
1427 "DR12",
1428 "DR13",
1429 "DR14",
1430 "DR15",
1431 "ST0",
1432 "ST1",
1433 "ST2",
1434 "ST3",
1435 "ST4",
1436 "ST5",
1437 "ST6",
1438 "ST7",
1439 "MM0",
1440 "MM1",
1441 "MM2",
1442 "MM3",
1443 "MM4",
1444 "MM5",
1445 "MM6",
1446 "MM7",
1447 "TR0",
1448 "TR1",
1449 "TR2",
1450 "TR3",
1451 "TR4",
1452 "TR5",
1453 "TR6",
1454 "TR7",
1455 "TMM0",
1456 "TMM1",
1457 "TMM2",
1458 "TMM3",
1459 "TMM4",
1460 "TMM5",
1461 "TMM6",
1462 "TMM7",
1463 "DontUse0",
1464 "DontUseFA",
1465 "DontUseFB",
1466 "DontUseFC",
1467 "DontUseFD",
1468 "DontUseFE",
1469 "DontUseFF",
1470];
1471impl fmt::Debug for Register {
1472 #[inline]
1473 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1474 write!(f, "{}", GEN_DEBUG_REGISTER[*self as usize])
1475 }
1476}
1477impl Default for Register {
1478 #[must_use]
1479 #[inline]
1480 fn default() -> Self {
1481 Register::None
1482 }
1483}
1484#[allow(non_camel_case_types)]
1485#[allow(dead_code)]
1486pub(crate) type RegisterUnderlyingType = u8;
1487#[rustfmt::skip]
1488impl Register {
1489 #[inline]
1491 pub fn values() -> impl Iterator<Item = Register> + DoubleEndedIterator + ExactSizeIterator + FusedIterator {
1492 (0..IcedConstants::REGISTER_ENUM_COUNT).map(|x| unsafe { mem::transmute::<u8, Register>(x as u8) })
1494 }
1495}
1496#[test]
1497#[rustfmt::skip]
1498fn test_register_values() {
1499 let mut iter = Register::values();
1500 assert_eq!(iter.size_hint(), (IcedConstants::REGISTER_ENUM_COUNT, Some(IcedConstants::REGISTER_ENUM_COUNT)));
1501 assert_eq!(iter.len(), IcedConstants::REGISTER_ENUM_COUNT);
1502 assert!(iter.next().is_some());
1503 assert_eq!(iter.size_hint(), (IcedConstants::REGISTER_ENUM_COUNT - 1, Some(IcedConstants::REGISTER_ENUM_COUNT - 1)));
1504 assert_eq!(iter.len(), IcedConstants::REGISTER_ENUM_COUNT - 1);
1505
1506 let values: Vec<Register> = Register::values().collect();
1507 assert_eq!(values.len(), IcedConstants::REGISTER_ENUM_COUNT);
1508 for (i, value) in values.into_iter().enumerate() {
1509 assert_eq!(i, value as usize);
1510 }
1511
1512 let values1: Vec<Register> = Register::values().collect();
1513 let mut values2: Vec<Register> = Register::values().rev().collect();
1514 values2.reverse();
1515 assert_eq!(values1, values2);
1516}
1517#[rustfmt::skip]
1518impl TryFrom<usize> for Register {
1519 type Error = IcedError;
1520 #[inline]
1521 fn try_from(value: usize) -> Result<Self, Self::Error> {
1522 if value < IcedConstants::REGISTER_ENUM_COUNT {
1523 Ok(unsafe { mem::transmute(value as u8) })
1525 } else {
1526 Err(IcedError::new("Invalid Register value"))
1527 }
1528 }
1529}
1530#[test]
1531#[rustfmt::skip]
1532fn test_register_try_from_usize() {
1533 for value in Register::values() {
1534 let converted = <Register as TryFrom<usize>>::try_from(value as usize).unwrap();
1535 assert_eq!(converted, value);
1536 }
1537 assert!(<Register as TryFrom<usize>>::try_from(IcedConstants::REGISTER_ENUM_COUNT).is_err());
1538 assert!(<Register as TryFrom<usize>>::try_from(core::usize::MAX).is_err());
1539}
1540#[cfg(feature = "serde")]
1541#[rustfmt::skip]
1542#[allow(clippy::zero_sized_map_values)]
1543const _: () = {
1544 use core::marker::PhantomData;
1545 use serde::de;
1546 use serde::{Deserialize, Deserializer, Serialize, Serializer};
1547 type EnumType = Register;
1548 impl Serialize for EnumType {
1549 #[inline]
1550 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1551 where
1552 S: Serializer,
1553 {
1554 serializer.serialize_u8(*self as u8)
1555 }
1556 }
1557 impl<'de> Deserialize<'de> for EnumType {
1558 #[inline]
1559 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1560 where
1561 D: Deserializer<'de>,
1562 {
1563 struct Visitor<'de> {
1564 marker: PhantomData<EnumType>,
1565 lifetime: PhantomData<&'de ()>,
1566 }
1567 impl<'de> de::Visitor<'de> for Visitor<'de> {
1568 type Value = EnumType;
1569 #[inline]
1570 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1571 formatter.write_str("enum Register")
1572 }
1573 #[inline]
1574 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
1575 where
1576 E: de::Error,
1577 {
1578 if let Ok(v) = <usize as TryFrom<_>>::try_from(v) {
1579 if let Ok(value) = <EnumType as TryFrom<_>>::try_from(v) {
1580 return Ok(value);
1581 }
1582 }
1583 Err(de::Error::invalid_value(de::Unexpected::Unsigned(v), &"a valid Register variant value"))
1584 }
1585 }
1586 deserializer.deserialize_u8(Visitor { marker: PhantomData::<EnumType>, lifetime: PhantomData })
1587 }
1588 }
1589};
1590impl Register {
1593 #[allow(clippy::unwrap_used)]
1594 pub(crate) fn from_u8(value: u8) -> Register {
1595 const _: () = assert!(IcedConstants::REGISTER_ENUM_COUNT >= 0x100);
1596 Register::try_from(value as usize).unwrap()
1598 }
1599}
1600
1601impl Register {
1602 #[must_use]
1603 fn add(self, rhs: u32) -> Self {
1604 let result = (self as u32).wrapping_add(rhs);
1605 iced_assert!(result < IcedConstants::REGISTER_ENUM_COUNT as u32);
1606 unsafe { mem::transmute(result as RegisterUnderlyingType) }
1608 }
1609 #[must_use]
1610 fn sub(self, rhs: u32) -> Self {
1611 let result = (self as u32).wrapping_sub(rhs);
1612 iced_assert!(result < IcedConstants::REGISTER_ENUM_COUNT as u32);
1613 unsafe { mem::transmute(result as RegisterUnderlyingType) }
1615 }
1616}
1617impl Add<Register> for i32 {
1619 type Output = Register;
1620
1621 #[must_use]
1622 #[inline]
1623 fn add(self, rhs: Register) -> Self::Output {
1624 rhs.add(self as u32)
1625 }
1626}
1627impl Add<Register> for u32 {
1629 type Output = Register;
1630
1631 #[must_use]
1632 #[inline]
1633 fn add(self, rhs: Register) -> Self::Output {
1634 rhs.add(self)
1635 }
1636}
1637impl Add<i32> for Register {
1639 type Output = Self;
1640
1641 #[must_use]
1642 #[inline]
1643 fn add(self, rhs: i32) -> Self::Output {
1644 self.add(rhs as u32)
1645 }
1646}
1647impl Add<u32> for Register {
1649 type Output = Self;
1650
1651 #[must_use]
1652 #[inline]
1653 fn add(self, rhs: u32) -> Self::Output {
1654 self.add(rhs)
1655 }
1656}
1657impl AddAssign<i32> for Register {
1659 #[inline]
1660 fn add_assign(&mut self, rhs: i32) {
1661 *self = self.add(rhs as u32)
1662 }
1663}
1664impl AddAssign<u32> for Register {
1666 #[inline]
1667 fn add_assign(&mut self, rhs: u32) {
1668 *self = self.add(rhs)
1669 }
1670}
1671impl Sub<i32> for Register {
1673 type Output = Self;
1674
1675 #[must_use]
1676 #[inline]
1677 fn sub(self, rhs: i32) -> Self::Output {
1678 self.sub(rhs as u32)
1679 }
1680}
1681impl Sub<u32> for Register {
1683 type Output = Self;
1684
1685 #[must_use]
1686 #[inline]
1687 fn sub(self, rhs: u32) -> Self::Output {
1688 self.sub(rhs)
1689 }
1690}
1691impl SubAssign<i32> for Register {
1693 #[inline]
1694 fn sub_assign(&mut self, rhs: i32) {
1695 *self = self.sub(rhs as u32)
1696 }
1697}
1698impl SubAssign<u32> for Register {
1700 #[inline]
1701 fn sub_assign(&mut self, rhs: u32) {
1702 *self = self.sub(rhs)
1703 }
1704}