iced_x86/
register.rs

1// SPDX-License-Identifier: MIT
2// Copyright (C) 2018-present iced project and contributors
3
4use 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		// GENERATOR-BEGIN: RegisterInfoTable
22		// ⚠️This was generated by GENERATOR!🦹‍♂️
23		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		// GENERATOR-END: RegisterInfoTable
280	];
281
282	/// [`Register`] information
283	///
284	/// [`Register`]: enum.Register.html
285	#[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		/// Gets the register
296		///
297		/// # Examples
298		///
299		/// ```
300		/// use iced_x86::*;
301		/// let info = Register::EAX.info();
302		/// assert_eq!(info.register(), Register::EAX);
303		/// ```
304		#[must_use]
305		#[inline]
306		pub const fn register(&self) -> Register {
307			self.register
308		}
309
310		/// Gets the base register, eg. `AL`, `AX`, `EAX`, `RAX`, `MM0`, `XMM0`, `YMM0`, `ZMM0`, `ES`
311		///
312		/// # Examples
313		///
314		/// ```
315		/// use iced_x86::*;
316		/// let info = Register::GS.info();
317		/// assert_eq!(info.base(), Register::ES);
318		/// let info = Register::RDX.info();
319		/// assert_eq!(info.base(), Register::RAX);
320		/// let info = Register::XMM13.info();
321		/// assert_eq!(info.base(), Register::XMM0);
322		/// let info = Register::YMM13.info();
323		/// assert_eq!(info.base(), Register::YMM0);
324		/// let info = Register::ZMM13.info();
325		/// assert_eq!(info.base(), Register::ZMM0);
326		/// ```
327		#[must_use]
328		#[inline]
329		pub const fn base(&self) -> Register {
330			self.base
331		}
332
333		/// The register number (index) relative to [`base()`], eg. 0-15, or 0-31, or if 8-bit GPR, 0-19
334		///
335		/// [`base()`]: #method.base
336		///
337		/// # Examples
338		///
339		/// ```
340		/// use iced_x86::*;
341		/// let info = Register::GS.info();
342		/// assert_eq!(info.number(), 5);
343		/// let info = Register::RDX.info();
344		/// assert_eq!(info.number(), 2);
345		/// let info = Register::XMM13.info();
346		/// assert_eq!(info.number(), 13);
347		/// let info = Register::YMM13.info();
348		/// assert_eq!(info.number(), 13);
349		/// let info = Register::ZMM13.info();
350		/// assert_eq!(info.number(), 13);
351		/// ```
352		#[must_use]
353		#[inline]
354		pub const fn number(&self) -> usize {
355			self.register as usize - self.base as usize
356		}
357
358		/// The full register that this one is a part of, eg. `CL`/`CH`/`CX`/`ECX`/`RCX` -> `RCX`, `XMM11`/`YMM11`/`ZMM11` -> `ZMM11`
359		///
360		/// # Examples
361		///
362		/// ```
363		/// use iced_x86::*;
364		/// let info = Register::GS.info();
365		/// assert_eq!(info.full_register(), Register::GS);
366		/// let info = Register::BH.info();
367		/// assert_eq!(info.full_register(), Register::RBX);
368		/// let info = Register::DX.info();
369		/// assert_eq!(info.full_register(), Register::RDX);
370		/// let info = Register::ESP.info();
371		/// assert_eq!(info.full_register(), Register::RSP);
372		/// let info = Register::RCX.info();
373		/// assert_eq!(info.full_register(), Register::RCX);
374		/// let info = Register::XMM3.info();
375		/// assert_eq!(info.full_register(), Register::ZMM3);
376		/// let info = Register::YMM3.info();
377		/// assert_eq!(info.full_register(), Register::ZMM3);
378		/// let info = Register::ZMM3.info();
379		/// assert_eq!(info.full_register(), Register::ZMM3);
380		/// ```
381		#[must_use]
382		#[inline]
383		pub const fn full_register(&self) -> Register {
384			self.full_register
385		}
386
387		/// Gets the full register that this one is a part of, except if it's a GPR in which case the 32-bit register is returned,
388		/// eg. `CL`/`CH`/`CX`/`ECX`/`RCX` -> `ECX`, `XMM11`/`YMM11`/`ZMM11` -> `ZMM11`
389		///
390		/// # Examples
391		///
392		/// ```
393		/// use iced_x86::*;
394		/// let info = Register::GS.info();
395		/// assert_eq!(info.full_register32(), Register::GS);
396		/// let info = Register::BH.info();
397		/// assert_eq!(info.full_register32(), Register::EBX);
398		/// let info = Register::DX.info();
399		/// assert_eq!(info.full_register32(), Register::EDX);
400		/// let info = Register::ESP.info();
401		/// assert_eq!(info.full_register32(), Register::ESP);
402		/// let info = Register::RCX.info();
403		/// assert_eq!(info.full_register32(), Register::ECX);
404		/// let info = Register::XMM3.info();
405		/// assert_eq!(info.full_register32(), Register::ZMM3);
406		/// let info = Register::YMM3.info();
407		/// assert_eq!(info.full_register32(), Register::ZMM3);
408		/// let info = Register::ZMM3.info();
409		/// assert_eq!(info.full_register32(), Register::ZMM3);
410		/// ```
411		#[must_use]
412		#[inline]
413		pub const fn full_register32(&self) -> Register {
414			self.full_register32
415		}
416
417		/// Size of the register in bytes
418		///
419		/// # Examples
420		///
421		/// ```
422		/// use iced_x86::*;
423		/// let info = Register::GS.info();
424		/// assert_eq!(info.size(), 2);
425		/// let info = Register::BH.info();
426		/// assert_eq!(info.size(), 1);
427		/// let info = Register::DX.info();
428		/// assert_eq!(info.size(), 2);
429		/// let info = Register::ESP.info();
430		/// assert_eq!(info.size(), 4);
431		/// let info = Register::RCX.info();
432		/// assert_eq!(info.size(), 8);
433		/// let info = Register::XMM3.info();
434		/// assert_eq!(info.size(), 16);
435		/// let info = Register::YMM3.info();
436		/// assert_eq!(info.size(), 32);
437		/// let info = Register::ZMM3.info();
438		/// assert_eq!(info.size(), 64);
439		/// ```
440		#[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	/// Gets register info
451	///
452	/// # Examples
453	///
454	/// ```
455	/// use iced_x86::*;
456	/// let info = Register::EAX.info();
457	/// assert_eq!(info.size(), 4);
458	/// ```
459	#[must_use]
460	#[inline]
461	pub fn info(self) -> &'static RegisterInfo {
462		&REGISTER_INFOS[self as usize]
463	}
464
465	/// Gets the base register, eg. `AL`, `AX`, `EAX`, `RAX`, `MM0`, `XMM0`, `YMM0`, `ZMM0`, `ES`
466	///
467	/// # Examples
468	///
469	/// ```
470	/// use iced_x86::*;
471	/// assert_eq!(Register::GS.base(), Register::ES);
472	/// assert_eq!(Register::SIL.base(), Register::AL);
473	/// assert_eq!(Register::SP.base(), Register::AX);
474	/// assert_eq!(Register::R13D.base(), Register::EAX);
475	/// assert_eq!(Register::RBP.base(), Register::RAX);
476	/// assert_eq!(Register::MM6.base(), Register::MM0);
477	/// assert_eq!(Register::XMM28.base(), Register::XMM0);
478	/// assert_eq!(Register::YMM12.base(), Register::YMM0);
479	/// assert_eq!(Register::ZMM31.base(), Register::ZMM0);
480	/// assert_eq!(Register::K3.base(), Register::K0);
481	/// assert_eq!(Register::BND1.base(), Register::BND0);
482	/// assert_eq!(Register::ST7.base(), Register::ST0);
483	/// assert_eq!(Register::CR8.base(), Register::CR0);
484	/// assert_eq!(Register::DR6.base(), Register::DR0);
485	/// assert_eq!(Register::TR3.base(), Register::TR0);
486	/// assert_eq!(Register::RIP.base(), Register::EIP);
487	/// ```
488	#[must_use]
489	#[inline]
490	pub fn base(self) -> Self {
491		self.info().base()
492	}
493
494	/// The register number (index) relative to [`base()`], eg. 0-15, or 0-31, or if 8-bit GPR, 0-19
495	///
496	/// [`base()`]: #method.base
497	///
498	/// # Examples
499	///
500	/// ```
501	/// use iced_x86::*;
502	/// assert_eq!(Register::GS.number(), 5);
503	/// assert_eq!(Register::SIL.number(), 10);
504	/// assert_eq!(Register::SP.number(), 4);
505	/// assert_eq!(Register::R13D.number(), 13);
506	/// assert_eq!(Register::RBP.number(), 5);
507	/// assert_eq!(Register::MM6.number(), 6);
508	/// assert_eq!(Register::XMM28.number(), 28);
509	/// assert_eq!(Register::YMM12.number(), 12);
510	/// assert_eq!(Register::ZMM31.number(), 31);
511	/// assert_eq!(Register::K3.number(), 3);
512	/// assert_eq!(Register::BND1.number(), 1);
513	/// assert_eq!(Register::ST7.number(), 7);
514	/// assert_eq!(Register::CR8.number(), 8);
515	/// assert_eq!(Register::DR6.number(), 6);
516	/// assert_eq!(Register::TR3.number(), 3);
517	/// assert_eq!(Register::RIP.number(), 1);
518	/// ```
519	#[must_use]
520	#[inline]
521	pub fn number(self) -> usize {
522		self.info().number()
523	}
524
525	/// Gets the full register that this one is a part of, eg. `CL`/`CH`/`CX`/`ECX`/`RCX` -> `RCX`, `XMM11`/`YMM11`/`ZMM11` -> `ZMM11`
526	///
527	/// # Examples
528	///
529	/// ```
530	/// use iced_x86::*;
531	/// assert_eq!(Register::GS.full_register(), Register::GS);
532	/// assert_eq!(Register::SIL.full_register(), Register::RSI);
533	/// assert_eq!(Register::SP.full_register(), Register::RSP);
534	/// assert_eq!(Register::R13D.full_register(), Register::R13);
535	/// assert_eq!(Register::RBP.full_register(), Register::RBP);
536	/// assert_eq!(Register::MM6.full_register(), Register::MM6);
537	/// assert_eq!(Register::XMM10.full_register(), Register::ZMM10);
538	/// assert_eq!(Register::YMM10.full_register(), Register::ZMM10);
539	/// assert_eq!(Register::ZMM10.full_register(), Register::ZMM10);
540	/// assert_eq!(Register::K3.full_register(), Register::K3);
541	/// assert_eq!(Register::BND1.full_register(), Register::BND1);
542	/// assert_eq!(Register::ST7.full_register(), Register::ST7);
543	/// assert_eq!(Register::CR8.full_register(), Register::CR8);
544	/// assert_eq!(Register::DR6.full_register(), Register::DR6);
545	/// assert_eq!(Register::TR3.full_register(), Register::TR3);
546	/// assert_eq!(Register::RIP.full_register(), Register::RIP);
547	/// ```
548	#[must_use]
549	#[inline]
550	pub fn full_register(self) -> Self {
551		self.info().full_register()
552	}
553
554	/// Gets the full register that this one is a part of, except if it's a GPR in which case the 32-bit register is returned,
555	/// eg. `CL`/`CH`/`CX`/`ECX`/`RCX` -> `ECX`, `XMM11`/`YMM11`/`ZMM11` -> `ZMM11`
556	///
557	/// # Examples
558	///
559	/// ```
560	/// use iced_x86::*;
561	/// assert_eq!(Register::GS.full_register32(), Register::GS);
562	/// assert_eq!(Register::SIL.full_register32(), Register::ESI);
563	/// assert_eq!(Register::SP.full_register32(), Register::ESP);
564	/// assert_eq!(Register::R13D.full_register32(), Register::R13D);
565	/// assert_eq!(Register::RBP.full_register32(), Register::EBP);
566	/// assert_eq!(Register::MM6.full_register32(), Register::MM6);
567	/// assert_eq!(Register::XMM10.full_register32(), Register::ZMM10);
568	/// assert_eq!(Register::YMM10.full_register32(), Register::ZMM10);
569	/// assert_eq!(Register::ZMM10.full_register32(), Register::ZMM10);
570	/// assert_eq!(Register::K3.full_register32(), Register::K3);
571	/// assert_eq!(Register::BND1.full_register32(), Register::BND1);
572	/// assert_eq!(Register::ST7.full_register32(), Register::ST7);
573	/// assert_eq!(Register::CR8.full_register32(), Register::CR8);
574	/// assert_eq!(Register::DR6.full_register32(), Register::DR6);
575	/// assert_eq!(Register::TR3.full_register32(), Register::TR3);
576	/// assert_eq!(Register::RIP.full_register32(), Register::RIP);
577	/// ```
578	#[must_use]
579	#[inline]
580	pub fn full_register32(self) -> Self {
581		self.info().full_register32()
582	}
583
584	/// Gets the size of the register in bytes
585	///
586	/// # Examples
587	///
588	/// ```
589	/// use iced_x86::*;
590	/// assert_eq!(Register::GS.size(), 2);
591	/// assert_eq!(Register::SIL.size(), 1);
592	/// assert_eq!(Register::SP.size(), 2);
593	/// assert_eq!(Register::R13D.size(), 4);
594	/// assert_eq!(Register::RBP.size(), 8);
595	/// assert_eq!(Register::MM6.size(), 8);
596	/// assert_eq!(Register::XMM10.size(), 16);
597	/// assert_eq!(Register::YMM10.size(), 32);
598	/// assert_eq!(Register::ZMM10.size(), 64);
599	/// assert_eq!(Register::K3.size(), 8);
600	/// assert_eq!(Register::BND1.size(), 16);
601	/// assert_eq!(Register::ST7.size(), 10);
602	/// assert_eq!(Register::CR8.size(), 8);
603	/// assert_eq!(Register::DR6.size(), 8);
604	/// assert_eq!(Register::TR3.size(), 4);
605	/// assert_eq!(Register::RIP.size(), 8);
606	/// ```
607	#[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	/// Checks if it's a segment register (`ES`, `CS`, `SS`, `DS`, `FS`, `GS`)
617	///
618	/// # Examples
619	///
620	/// ```
621	/// use iced_x86::*;
622	/// assert!(Register::GS.is_segment_register());
623	/// assert!(!Register::RCX.is_segment_register());
624	/// ```
625	#[must_use]
626	#[inline]
627	pub fn is_segment_register(self) -> bool {
628		Register::ES <= self && self <= Register::GS
629	}
630
631	/// Checks if it's a general purpose register (`AL`-`R15L`, `AX`-`R15W`, `EAX`-`R15D`, `RAX`-`R15`)
632	///
633	/// # Examples
634	///
635	/// ```
636	/// use iced_x86::*;
637	/// assert!(!Register::GS.is_gpr());
638	/// assert!(Register::CH.is_gpr());
639	/// assert!(Register::DX.is_gpr());
640	/// assert!(Register::R13D.is_gpr());
641	/// assert!(Register::RSP.is_gpr());
642	/// assert!(!Register::XMM0.is_gpr());
643	/// ```
644	#[must_use]
645	#[inline]
646	pub fn is_gpr(self) -> bool {
647		Register::AL <= self && self <= Register::R15
648	}
649
650	/// Checks if it's an 8-bit general purpose register (`AL`-`R15L`)
651	///
652	/// # Examples
653	///
654	/// ```
655	/// use iced_x86::*;
656	/// assert!(!Register::GS.is_gpr8());
657	/// assert!(Register::CH.is_gpr8());
658	/// assert!(!Register::DX.is_gpr8());
659	/// assert!(!Register::R13D.is_gpr8());
660	/// assert!(!Register::RSP.is_gpr8());
661	/// assert!(!Register::XMM0.is_gpr8());
662	/// ```
663	#[must_use]
664	#[inline]
665	pub fn is_gpr8(self) -> bool {
666		Register::AL <= self && self <= Register::R15L
667	}
668
669	/// Checks if it's a 16-bit general purpose register (`AX`-`R15W`)
670	///
671	/// # Examples
672	///
673	/// ```
674	/// use iced_x86::*;
675	/// assert!(!Register::GS.is_gpr16());
676	/// assert!(!Register::CH.is_gpr16());
677	/// assert!(Register::DX.is_gpr16());
678	/// assert!(!Register::R13D.is_gpr16());
679	/// assert!(!Register::RSP.is_gpr16());
680	/// assert!(!Register::XMM0.is_gpr16());
681	/// ```
682	#[must_use]
683	#[inline]
684	pub fn is_gpr16(self) -> bool {
685		Register::AX <= self && self <= Register::R15W
686	}
687
688	/// Checks if it's a 32-bit general purpose register (`EAX`-`R15D`)
689	///
690	/// # Examples
691	///
692	/// ```
693	/// use iced_x86::*;
694	/// assert!(!Register::GS.is_gpr32());
695	/// assert!(!Register::CH.is_gpr32());
696	/// assert!(!Register::DX.is_gpr32());
697	/// assert!(Register::R13D.is_gpr32());
698	/// assert!(!Register::RSP.is_gpr32());
699	/// assert!(!Register::XMM0.is_gpr32());
700	/// ```
701	#[must_use]
702	#[inline]
703	pub fn is_gpr32(self) -> bool {
704		Register::EAX <= self && self <= Register::R15D
705	}
706
707	/// Checks if it's a 64-bit general purpose register (`RAX`-`R15`)
708	///
709	/// # Examples
710	///
711	/// ```
712	/// use iced_x86::*;
713	/// assert!(!Register::GS.is_gpr64());
714	/// assert!(!Register::CH.is_gpr64());
715	/// assert!(!Register::DX.is_gpr64());
716	/// assert!(!Register::R13D.is_gpr64());
717	/// assert!(Register::RSP.is_gpr64());
718	/// assert!(!Register::XMM0.is_gpr64());
719	/// ```
720	#[must_use]
721	#[inline]
722	pub fn is_gpr64(self) -> bool {
723		Register::RAX <= self && self <= Register::R15
724	}
725
726	/// Checks if it's a 128-bit vector register (`XMM0`-`XMM31`)
727	///
728	/// # Examples
729	///
730	/// ```
731	/// use iced_x86::*;
732	/// assert!(!Register::R13D.is_xmm());
733	/// assert!(!Register::RSP.is_xmm());
734	/// assert!(Register::XMM0.is_xmm());
735	/// assert!(!Register::YMM0.is_xmm());
736	/// assert!(!Register::ZMM0.is_xmm());
737	/// ```
738	#[must_use]
739	#[inline]
740	pub fn is_xmm(self) -> bool {
741		Register::XMM0 <= self && self <= IcedConstants::XMM_LAST
742	}
743
744	/// Checks if it's a 256-bit vector register (`YMM0`-`YMM31`)
745	///
746	/// # Examples
747	///
748	/// ```
749	/// use iced_x86::*;
750	/// assert!(!Register::R13D.is_ymm());
751	/// assert!(!Register::RSP.is_ymm());
752	/// assert!(!Register::XMM0.is_ymm());
753	/// assert!(Register::YMM0.is_ymm());
754	/// assert!(!Register::ZMM0.is_ymm());
755	/// ```
756	#[must_use]
757	#[inline]
758	pub fn is_ymm(self) -> bool {
759		Register::YMM0 <= self && self <= IcedConstants::YMM_LAST
760	}
761
762	/// Checks if it's a 512-bit vector register (`ZMM0`-`ZMM31`)
763	///
764	/// # Examples
765	///
766	/// ```
767	/// use iced_x86::*;
768	/// assert!(!Register::R13D.is_zmm());
769	/// assert!(!Register::RSP.is_zmm());
770	/// assert!(!Register::XMM0.is_zmm());
771	/// assert!(!Register::YMM0.is_zmm());
772	/// assert!(Register::ZMM0.is_zmm());
773	/// ```
774	#[must_use]
775	#[inline]
776	pub fn is_zmm(self) -> bool {
777		Register::ZMM0 <= self && self <= IcedConstants::ZMM_LAST
778	}
779
780	/// Checks if it's an `XMM`, `YMM` or `ZMM` register
781	///
782	/// # Examples
783	///
784	/// ```
785	/// use iced_x86::*;
786	/// assert!(!Register::R13D.is_vector_register());
787	/// assert!(!Register::RSP.is_vector_register());
788	/// assert!(Register::XMM0.is_vector_register());
789	/// assert!(Register::YMM0.is_vector_register());
790	/// assert!(Register::ZMM0.is_vector_register());
791	/// ```
792	#[must_use]
793	#[inline]
794	pub fn is_vector_register(self) -> bool {
795		Register::XMM0 <= self && self <= IcedConstants::VMM_LAST
796	}
797
798	/// Checks if it's `EIP`/`RIP`
799	///
800	/// # Examples
801	///
802	/// ```
803	/// use iced_x86::*;
804	/// assert!(Register::EIP.is_ip());
805	/// assert!(Register::RIP.is_ip());
806	/// ```
807	#[must_use]
808	#[inline]
809	pub fn is_ip(self) -> bool {
810		self == Register::EIP || self == Register::RIP
811	}
812
813	/// Checks if it's an opmask register (`K0`-`K7`)
814	///
815	/// # Examples
816	///
817	/// ```
818	/// use iced_x86::*;
819	/// assert!(!Register::R13D.is_k());
820	/// assert!(Register::K3.is_k());
821	/// ```
822	#[must_use]
823	#[inline]
824	pub fn is_k(self) -> bool {
825		Register::K0 <= self && self <= Register::K7
826	}
827
828	/// Checks if it's a control register (`CR0`-`CR15`)
829	///
830	/// # Examples
831	///
832	/// ```
833	/// use iced_x86::*;
834	/// assert!(!Register::R13D.is_cr());
835	/// assert!(Register::CR3.is_cr());
836	/// ```
837	#[must_use]
838	#[inline]
839	pub fn is_cr(self) -> bool {
840		Register::CR0 <= self && self <= Register::CR15
841	}
842
843	/// Checks if it's a debug register (`DR0`-`DR15`)
844	///
845	/// # Examples
846	///
847	/// ```
848	/// use iced_x86::*;
849	/// assert!(!Register::R13D.is_dr());
850	/// assert!(Register::DR3.is_dr());
851	/// ```
852	#[must_use]
853	#[inline]
854	pub fn is_dr(self) -> bool {
855		Register::DR0 <= self && self <= Register::DR15
856	}
857
858	/// Checks if it's a test register (`TR0`-`TR7`)
859	///
860	/// # Examples
861	///
862	/// ```
863	/// use iced_x86::*;
864	/// assert!(!Register::R13D.is_tr());
865	/// assert!(Register::TR3.is_tr());
866	/// ```
867	#[must_use]
868	#[inline]
869	pub fn is_tr(self) -> bool {
870		Register::TR0 <= self && self <= Register::TR7
871	}
872
873	/// Checks if it's an FPU stack register (`ST0`-`ST7`)
874	///
875	/// # Examples
876	///
877	/// ```
878	/// use iced_x86::*;
879	/// assert!(!Register::R13D.is_st());
880	/// assert!(Register::ST3.is_st());
881	/// ```
882	#[must_use]
883	#[inline]
884	pub fn is_st(self) -> bool {
885		Register::ST0 <= self && self <= Register::ST7
886	}
887
888	/// Checks if it's a bound register (`BND0`-`BND3`)
889	///
890	/// # Examples
891	///
892	/// ```
893	/// use iced_x86::*;
894	/// assert!(!Register::R13D.is_bnd());
895	/// assert!(Register::BND3.is_bnd());
896	/// ```
897	#[must_use]
898	#[inline]
899	pub fn is_bnd(self) -> bool {
900		Register::BND0 <= self && self <= Register::BND3
901	}
902
903	/// Checks if it's an MMX register (`MM0`-`MM7`)
904	///
905	/// # Examples
906	///
907	/// ```
908	/// use iced_x86::*;
909	/// assert!(!Register::R13D.is_mm());
910	/// assert!(Register::MM3.is_mm());
911	/// ```
912	#[must_use]
913	#[inline]
914	pub fn is_mm(self) -> bool {
915		Register::MM0 <= self && self <= Register::MM7
916	}
917
918	/// Checks if it's a tile register (`TMM0`-`TMM7`)
919	///
920	/// # Examples
921	///
922	/// ```
923	/// use iced_x86::*;
924	/// assert!(!Register::R13D.is_tmm());
925	/// assert!(Register::TMM3.is_tmm());
926	/// ```
927	#[must_use]
928	#[inline]
929	pub fn is_tmm(self) -> bool {
930		Register::TMM0 <= self && self <= IcedConstants::TMM_LAST
931	}
932}
933
934// GENERATOR-BEGIN: Register
935// ⚠️This was generated by GENERATOR!🦹‍♂️
936/// A register
937#[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	/// Don't use it!
1191	#[deprecated(since = "1.12.0", note = "Not part of the public API")]
1192	DontUse0 = 249,
1193	/// Don't use it!
1194	#[deprecated(since = "1.12.0", note = "Not part of the public API")]
1195	DontUseFA = 250,
1196	/// Don't use it!
1197	#[deprecated(since = "1.12.0", note = "Not part of the public API")]
1198	DontUseFB = 251,
1199	/// Don't use it!
1200	#[deprecated(since = "1.12.0", note = "Not part of the public API")]
1201	DontUseFC = 252,
1202	/// Don't use it!
1203	#[deprecated(since = "1.12.0", note = "Not part of the public API")]
1204	DontUseFD = 253,
1205	/// Don't use it!
1206	#[deprecated(since = "1.12.0", note = "Not part of the public API")]
1207	DontUseFE = 254,
1208	/// Don't use it!
1209	#[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	/// Iterates over all `Register` enum values
1490	#[inline]
1491	pub fn values() -> impl Iterator<Item = Register> + DoubleEndedIterator + ExactSizeIterator + FusedIterator {
1492		// SAFETY: all values 0-max are valid enum values
1493		(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			// SAFETY: all values 0-max are valid enum values
1524			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};
1590// GENERATOR-END: Register
1591
1592impl Register {
1593	#[allow(clippy::unwrap_used)]
1594	pub(crate) fn from_u8(value: u8) -> Register {
1595		const _: () = assert!(IcedConstants::REGISTER_ENUM_COUNT >= 0x100);
1596		// This can't panic since all `u8` values are Register variants
1597		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		// SAFETY: verified by the assert above. All values 0-max are valid enum values
1607		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		// SAFETY: verified by the assert above. All values 0-max are valid enum values
1614		unsafe { mem::transmute(result as RegisterUnderlyingType) }
1615	}
1616}
1617// i32 + Register
1618impl 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}
1627// u32 + Register
1628impl 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}
1637// Register + i32
1638impl 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}
1647// Register + u32
1648impl 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}
1657// Register += i32
1658impl AddAssign<i32> for Register {
1659	#[inline]
1660	fn add_assign(&mut self, rhs: i32) {
1661		*self = self.add(rhs as u32)
1662	}
1663}
1664// Register += u32
1665impl AddAssign<u32> for Register {
1666	#[inline]
1667	fn add_assign(&mut self, rhs: u32) {
1668		*self = self.add(rhs)
1669	}
1670}
1671// Register - i32
1672impl 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}
1681// Register - u32
1682impl 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}
1691// Register -= i32
1692impl SubAssign<i32> for Register {
1693	#[inline]
1694	fn sub_assign(&mut self, rhs: i32) {
1695		*self = self.sub(rhs as u32)
1696	}
1697}
1698// Register -= u32
1699impl SubAssign<u32> for Register {
1700	#[inline]
1701	fn sub_assign(&mut self, rhs: u32) {
1702		*self = self.sub(rhs)
1703	}
1704}