1#![allow(dead_code)]
2#![allow(unused_variables)]
3#![allow(non_camel_case_types)]
4
5use disasm_core::{insn::Insn, utils::zextract};
6
7pub mod opcode {
8    use disasm_core::{insn::Opcode, macros::define_opcodes};
9
10    pub const INVALID: Opcode = Opcode::INVALID;
11
12    pub(super) const BASE_OPCODE: u32 = 4096;
13
14    define_opcodes! {
15        CMPEQPS             = "cmpeqps",
16        CMPLTPS             = "cmpltps",
17        CMPLEPS             = "cmpleps",
18        CMPUNORDPS          = "cmpunordps",
19        CMPNEQPS            = "cmpneqps",
20        CMPNLTPS            = "cmpnltps",
21        CMPNLEPS            = "cmpnleps",
22        CMPORDPS            = "cmpordps",
23        CMPEQSS             = "cmpeqss",
24        CMPLTSS             = "cmpltss",
25        CMPLESS             = "cmpless",
26        CMPUNORDSS          = "cmpunordss",
27        CMPNEQSS            = "cmpneqss",
28        CMPNLTSS            = "cmpnltss",
29        CMPNLESS            = "cmpnless",
30        CMPORDSS            = "cmpordss",
31        CMPEQPD             = "cmpeqpd",
32        CMPLTPD             = "cmpltpd",
33        CMPLEPD             = "cmplepd",
34        CMPUNORDPD          = "cmpunordpd",
35        CMPNEQPD            = "cmpneqpd",
36        CMPNLTPD            = "cmpnltpd",
37        CMPNLEPD            = "cmpnlepd",
38        CMPORDPD            = "cmpordpd",
39        CMPEQSD             = "cmpeqsd",
40        CMPLTSD             = "cmpltsd",
41        CMPLESD             = "cmplesd",
42        CMPUNORDSD          = "cmpunordsd",
43        CMPNEQSD            = "cmpneqsd",
44        CMPNLTSD            = "cmpnltsd",
45        CMPNLESD            = "cmpnlesd",
46        CMPORDSD            = "cmpordsd",
47
48        PCLMULLQLQDQ        = "pclmullqlqdq",
49        PCLMULHQLQDQ        = "pclmulhqlqdq",
50        PCLMULLQHQDQ        = "pclmullqhqdq",
51        PCLMULHQHQDQ        = "pclmulhqhqdq",
52        VPCLMULLQLQDQ       = "vpclmullqlqdq",
53        VPCLMULHQLQDQ       = "vpclmulhqlqdq",
54        VPCLMULLQHQDQ       = "vpclmullqhqdq",
55        VPCLMULHQHQDQ       = "vpclmulhqhqdq",
56
57        VCMPEQSS            = "vcmpeqss",
58        VCMPLTSS            = "vcmpltss",
59        VCMPLESS            = "vcmpless",
60        VCMPUNORDSS         = "vcmpunordss",
61        VCMPNEQSS           = "vcmpneqss",
62        VCMPNLTSS           = "vcmpnltss",
63        VCMPNLESS           = "vcmpnless",
64        VCMPORDSS           = "vcmpordss",
65        VCMPEQ_UQSS         = "vcmpeq_uqss",
66        VCMPNGESS           = "vcmpngess",
67        VCMPNGTSS           = "vcmpngtss",
68        VCMPFALSESS         = "vcmpfalsess",
69        VCMPNEQ_OQSS        = "vcmpneq_oqss",
70        VCMPGESS            = "vcmpgess",
71        VCMPGTSS            = "vcmpgtss",
72        VCMPTRUESS          = "vcmptruess",
73        VCMPEQ_OSSS         = "vcmpeq_osss",
74        VCMPLT_OQSS         = "vcmplt_oqss",
75        VCMPLE_OQSS         = "vcmple_oqss",
76        VCMPUNORD_SSS       = "vcmpunord_sss",
77        VCMPNEQ_USSS        = "vcmpneq_usss",
78        VCMPNLT_UQSS        = "vcmpnlt_uqss",
79        VCMPNLE_UQSS        = "vcmpnle_uqss",
80        VCMPORD_SSS         = "vcmpord_sss",
81        VCMPEQ_USSS         = "vcmpeq_usss",
82        VCMPNGE_UQSS        = "vcmpnge_uqss",
83        VCMPNGT_UQSS        = "vcmpngt_uqss",
84        VCMPFALSE_OSSS      = "vcmpfalse_osss",
85        VCMPNEQ_OSSS        = "vcmpneq_osss",
86        VCMPGE_OQSS         = "vcmpge_oqss",
87        VCMPGT_OQSS         = "vcmpgt_oqss",
88        VCMPTRUE_USSS       = "vcmptrue_usss",
89        VCMPEQSD            = "vcmpeqsd",
90        VCMPLTSD            = "vcmpltsd",
91        VCMPLESD            = "vcmplesd",
92        VCMPUNORDSD         = "vcmpunordsd",
93        VCMPNEQSD           = "vcmpneqsd",
94        VCMPNLTSD           = "vcmpnltsd",
95        VCMPNLESD           = "vcmpnlesd",
96        VCMPORDSD           = "vcmpordsd",
97        VCMPEQ_UQSD         = "vcmpeq_uqsd",
98        VCMPNGESD           = "vcmpngesd",
99        VCMPNGTSD           = "vcmpngtsd",
100        VCMPFALSESD         = "vcmpfalsesd",
101        VCMPNEQ_OQSD        = "vcmpneq_oqsd",
102        VCMPGESD            = "vcmpgesd",
103        VCMPGTSD            = "vcmpgtsd",
104        VCMPTRUESD          = "vcmptruesd",
105        VCMPEQ_OSSD         = "vcmpeq_ossd",
106        VCMPLT_OQSD         = "vcmplt_oqsd",
107        VCMPLE_OQSD         = "vcmple_oqsd",
108        VCMPUNORD_SSD       = "vcmpunord_ssd",
109        VCMPNEQ_USSD        = "vcmpneq_ussd",
110        VCMPNLT_UQSD        = "vcmpnlt_uqsd",
111        VCMPNLE_UQSD        = "vcmpnle_uqsd",
112        VCMPORD_SSD         = "vcmpord_ssd",
113        VCMPEQ_USSD         = "vcmpeq_ussd",
114        VCMPNGE_UQSD        = "vcmpnge_uqsd",
115        VCMPNGT_UQSD        = "vcmpngt_uqsd",
116        VCMPFALSE_OSSD      = "vcmpfalse_ossd",
117        VCMPNEQ_OSSD        = "vcmpneq_ossd",
118        VCMPGE_OQSD         = "vcmpge_oqsd",
119        VCMPGT_OQSD         = "vcmpgt_oqsd",
120        VCMPTRUE_USSD       = "vcmptrue_ussd",
121        VCMPEQPS            = "vcmpeqps",
122        VCMPLTPS            = "vcmpltps",
123        VCMPLEPS            = "vcmpleps",
124        VCMPUNORDPS         = "vcmpunordps",
125        VCMPNEQPS           = "vcmpneqps",
126        VCMPNLTPS           = "vcmpnltps",
127        VCMPNLEPS           = "vcmpnleps",
128        VCMPORDPS           = "vcmpordps",
129        VCMPEQ_UQPS         = "vcmpeq_uqps",
130        VCMPNGEPS           = "vcmpngeps",
131        VCMPNGTPS           = "vcmpngtps",
132        VCMPFALSEPS         = "vcmpfalseps",
133        VCMPNEQ_OQPS        = "vcmpneq_oqps",
134        VCMPGEPS            = "vcmpgeps",
135        VCMPGTPS            = "vcmpgtps",
136        VCMPTRUEPS          = "vcmptrueps",
137        VCMPEQ_OSPS         = "vcmpeq_osps",
138        VCMPLT_OQPS         = "vcmplt_oqps",
139        VCMPLE_OQPS         = "vcmple_oqps",
140        VCMPUNORD_SPS       = "vcmpunord_sps",
141        VCMPNEQ_USPS        = "vcmpneq_usps",
142        VCMPNLT_UQPS        = "vcmpnlt_uqps",
143        VCMPNLE_UQPS        = "vcmpnle_uqps",
144        VCMPORD_SPS         = "vcmpord_sps",
145        VCMPEQ_USPS         = "vcmpeq_usps",
146        VCMPNGE_UQPS        = "vcmpnge_uqps",
147        VCMPNGT_UQPS        = "vcmpngt_uqps",
148        VCMPFALSE_OSPS      = "vcmpfalse_osps",
149        VCMPNEQ_OSPS        = "vcmpneq_osps",
150        VCMPGE_OQPS         = "vcmpge_oqps",
151        VCMPGT_OQPS         = "vcmpgt_oqps",
152        VCMPTRUE_USPS       = "vcmptrue_usps",
153        VCMPEQPD            = "vcmpeqpd",
154        VCMPLTPD            = "vcmpltpd",
155        VCMPLEPD            = "vcmplepd",
156        VCMPUNORDPD         = "vcmpunordpd",
157        VCMPNEQPD           = "vcmpneqpd",
158        VCMPNLTPD           = "vcmpnltpd",
159        VCMPNLEPD           = "vcmpnlepd",
160        VCMPORDPD           = "vcmpordpd",
161        VCMPEQ_UQPD         = "vcmpeq_uqpd",
162        VCMPNGEPD           = "vcmpngepd",
163        VCMPNGTPD           = "vcmpngtpd",
164        VCMPFALSEPD         = "vcmpfalsepd",
165        VCMPNEQ_OQPD        = "vcmpneq_oqpd",
166        VCMPGEPD            = "vcmpgepd",
167        VCMPGTPD            = "vcmpgtpd",
168        VCMPTRUEPD          = "vcmptruepd",
169        VCMPEQ_OSPD         = "vcmpeq_ospd",
170        VCMPLT_OQPD         = "vcmplt_oqpd",
171        VCMPLE_OQPD         = "vcmple_oqpd",
172        VCMPUNORD_SPD       = "vcmpunord_spd",
173        VCMPNEQ_USPD        = "vcmpneq_uspd",
174        VCMPNLT_UQPD        = "vcmpnlt_uqpd",
175        VCMPNLE_UQPD        = "vcmpnle_uqpd",
176        VCMPORD_SPD         = "vcmpord_spd",
177        VCMPEQ_USPD         = "vcmpeq_uspd",
178        VCMPNGE_UQPD        = "vcmpnge_uqpd",
179        VCMPNGT_UQPD        = "vcmpngt_uqpd",
180        VCMPFALSE_OSPD      = "vcmpfalse_ospd",
181        VCMPNEQ_OSPD        = "vcmpneq_ospd",
182        VCMPGE_OQPD         = "vcmpge_oqpd",
183        VCMPGT_OQPD         = "vcmpgt_oqpd",
184        VCMPTRUE_USPD       = "vcmptrue_uspd",
185
186        VPCMPEQUD           = "vpcmpequd",
187        VPCMPLTUD           = "vpcmpltud",
188        VPCMPLEUD           = "vpcmpleud",
189        VPCMPNEQUD          = "vpcmpnequd",
190        VPCMPNLTUD          = "vpcmpnltud",
191        VPCMPNLEUD          = "vpcmpnleud",
192        VPCMPLTD            = "vpcmpltd",
193        VPCMPLED            = "vpcmpled",
194        VPCMPNEQD           = "vpcmpneqd",
195        VPCMPNLTD           = "vpcmpnltd",
196        VPCMPNLED           = "vpcmpnled",
197        VPCMPEQUB           = "vpcmpequb",
198        VPCMPLTUB           = "vpcmpltub",
199        VPCMPLEUB           = "vpcmpleub",
200        VPCMPNEQUB          = "vpcmpnequb",
201        VPCMPNLTUB          = "vpcmpnltub",
202        VPCMPNLEUB          = "vpcmpnleub",
203        VPCMPLTB            = "vpcmpltb",
204        VPCMPLEB            = "vpcmpleb",
205        VPCMPNEQB           = "vpcmpneqb",
206        VPCMPNLTB           = "vpcmpnltb",
207        VPCMPNLEB           = "vpcmpnleb",
208        VPCMPEQUQ           = "vpcmpequq",
209        VPCMPLTUQ           = "vpcmpltuq",
210        VPCMPLEUQ           = "vpcmpleuq",
211        VPCMPNEQUQ          = "vpcmpnequq",
212        VPCMPNLTUQ          = "vpcmpnltuq",
213        VPCMPNLEUQ          = "vpcmpnleuq",
214        VPCMPLTQ            = "vpcmpltq",
215        VPCMPLEQ            = "vpcmpleq",
216        VPCMPNEQQ           = "vpcmpneqq",
217        VPCMPNLTQ           = "vpcmpnltq",
218        VPCMPNLEQ           = "vpcmpnleq",
219        VPCMPEQUW           = "vpcmpequw",
220        VPCMPLTUW           = "vpcmpltuw",
221        VPCMPLEUW           = "vpcmpleuw",
222        VPCMPNEQUW          = "vpcmpnequw",
223        VPCMPNLTUW          = "vpcmpnltuw",
224        VPCMPNLEUW          = "vpcmpnleuw",
225        VPCMPLTW            = "vpcmpltw",
226        VPCMPLEW            = "vpcmplew",
227        VPCMPNEQW           = "vpcmpneqw",
228        VPCMPNLTW           = "vpcmpnltw",
229        VPCMPNLEW           = "vpcmpnlew",
230        VCMPEQPH            = "vcmpeqph",
231        VCMPLTPH            = "vcmpltph",
232        VCMPLEPH            = "vcmpleph",
233        VCMPUNORDPH         = "vcmpunordph",
234        VCMPNEQPH           = "vcmpneqph",
235        VCMPNLTPH           = "vcmpnltph",
236        VCMPNLEPH           = "vcmpnleph",
237        VCMPORDPH           = "vcmpordph",
238        VCMPEQ_UQPH         = "vcmpeq_uqph",
239        VCMPNGEPH           = "vcmpngeph",
240        VCMPNGTPH           = "vcmpngtph",
241        VCMPFALSEPH         = "vcmpfalseph",
242        VCMPNEQ_OQPH        = "vcmpneq_oqph",
243        VCMPGEPH            = "vcmpgeph",
244        VCMPGTPH            = "vcmpgtph",
245        VCMPTRUEPH          = "vcmptrueph",
246        VCMPEQ_OSPH         = "vcmpeq_osph",
247        VCMPLT_OQPH         = "vcmplt_oqph",
248        VCMPLE_OQPH         = "vcmple_oqph",
249        VCMPUNORD_SPH       = "vcmpunord_sph",
250        VCMPNEQ_USPH        = "vcmpneq_usph",
251        VCMPNLT_UQPH        = "vcmpnlt_uqph",
252        VCMPNLE_UQPH        = "vcmpnle_uqph",
253        VCMPORD_SPH         = "vcmpord_sph",
254        VCMPEQ_USPH         = "vcmpeq_usph",
255        VCMPNGE_UQPH        = "vcmpnge_uqph",
256        VCMPNGT_UQPH        = "vcmpngt_uqph",
257        VCMPFALSE_OSPH      = "vcmpfalse_osph",
258        VCMPNEQ_OSPH        = "vcmpneq_osph",
259        VCMPGE_OQPH         = "vcmpge_oqph",
260        VCMPGT_OQPH         = "vcmpgt_oqph",
261        VCMPTRUE_USPH       = "vcmptrue_usph",
262        VCMPEQSH            = "vcmpeqsh",
263        VCMPLTSH            = "vcmpltsh",
264        VCMPLESH            = "vcmplesh",
265        VCMPUNORDSH         = "vcmpunordsh",
266        VCMPNEQSH           = "vcmpneqsh",
267        VCMPNLTSH           = "vcmpnltsh",
268        VCMPNLESH           = "vcmpnlesh",
269        VCMPORDSH           = "vcmpordsh",
270        VCMPEQ_UQSH         = "vcmpeq_uqsh",
271        VCMPNGESH           = "vcmpngesh",
272        VCMPNGTSH           = "vcmpngtsh",
273        VCMPFALSESH         = "vcmpfalsesh",
274        VCMPNEQ_OQSH        = "vcmpneq_oqsh",
275        VCMPGESH            = "vcmpgesh",
276        VCMPGTSH            = "vcmpgtsh",
277        VCMPTRUESH          = "vcmptruesh",
278        VCMPEQ_OSSH         = "vcmpeq_ossh",
279        VCMPLT_OQSH         = "vcmplt_oqsh",
280        VCMPLE_OQSH         = "vcmple_oqsh",
281        VCMPUNORD_SSH       = "vcmpunord_ssh",
282        VCMPNEQ_USSH        = "vcmpneq_ussh",
283        VCMPNLT_UQSH        = "vcmpnlt_uqsh",
284        VCMPNLE_UQSH        = "vcmpnle_uqsh",
285        VCMPORD_SSH         = "vcmpord_ssh",
286        VCMPEQ_USSH         = "vcmpeq_ussh",
287        VCMPNGE_UQSH        = "vcmpnge_uqsh",
288        VCMPNGT_UQSH        = "vcmpngt_uqsh",
289        VCMPFALSE_OSSH      = "vcmpfalse_ossh",
290        VCMPNEQ_OSSH        = "vcmpneq_ossh",
291        VCMPGE_OQSH         = "vcmpge_oqsh",
292        VCMPGT_OQSH         = "vcmpgt_oqsh",
293        VCMPTRUE_USSH       = "vcmptrue_ussh",
294    }
295
296    include!(concat!(env!("OUT_DIR"), "/generated_opcodes.rs"));
297
298    #[cfg(feature = "mnemonic")]
299    #[inline(always)]
300    pub(crate) fn mnemonic(opcode: Opcode) -> Option<&'static str> {
301        defined_mnemonic(opcode).or_else(|| generated_mnemonic(opcode))
302    }
303}
304
305include!(concat!(env!("OUT_DIR"), "/generated_set.rs"));
306include!(concat!(env!("OUT_DIR"), "/generated_decode.rs"));
307include!(concat!(env!("OUT_DIR"), "/generated_decode_0f.rs"));
308include!(concat!(env!("OUT_DIR"), "/generated_decode_0f_38.rs"));
309include!(concat!(env!("OUT_DIR"), "/generated_decode_0f_3a.rs"));
310include!(concat!(env!("OUT_DIR"), "/generated_decode_vex.rs"));
311include!(concat!(env!("OUT_DIR"), "/generated_decode_evex.rs"));