iced-x86 1.21.0

iced-x86 is a blazing fast and correct x86/x64 disassembler, assembler and instruction decoder written in Rust
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
// SPDX-License-Identifier: MIT
// Copyright (C) 2018-present iced project and contributors

use crate::decoder::handlers::d3now::*;
use crate::decoder::handlers::fpu::*;
use crate::decoder::handlers::legacy::*;
use crate::decoder::handlers::{
	get_invalid_handler, get_invalid_no_modrm_handler, get_null_handler, OpCodeHandler, OpCodeHandlerDecodeFn, OpCodeHandler_AnotherTable,
	OpCodeHandler_Bitness, OpCodeHandler_Bitness_DontReadModRM, OpCodeHandler_Group, OpCodeHandler_Group8x64, OpCodeHandler_Group8x8,
	OpCodeHandler_Int3, OpCodeHandler_Options, OpCodeHandler_Options1632, OpCodeHandler_Options_DontReadModRM, OpCodeHandler_RM,
	OpCodeHandler_Simple,
};
use crate::decoder::table_de::enums::*;
use crate::decoder::table_de::{box_opcode_handler, TableDeserializer};
use crate::decoder::Code;
use alloc::vec::Vec;

#[allow(trivial_casts)]
pub(super) fn read_handlers(deserializer: &mut TableDeserializer<'_>, result: &mut Vec<(OpCodeHandlerDecodeFn, &'static OpCodeHandler)>) {
	let index;
	let (decode, handler_ptr): (OpCodeHandlerDecodeFn, *const OpCodeHandler) = match deserializer.read_legacy_op_code_handler_kind() {
		LegacyOpCodeHandlerKind::Bitness => box_opcode_handler(OpCodeHandler_Bitness::new(deserializer.read_handler(), deserializer.read_handler())),

		LegacyOpCodeHandlerKind::Bitness_DontReadModRM => {
			box_opcode_handler(OpCodeHandler_Bitness_DontReadModRM::new(deserializer.read_handler(), deserializer.read_handler()))
		}

		LegacyOpCodeHandlerKind::Invalid => {
			result.push(get_invalid_handler());
			return;
		}

		LegacyOpCodeHandlerKind::Invalid_NoModRM => {
			result.push(get_invalid_no_modrm_handler());
			return;
		}

		LegacyOpCodeHandlerKind::Invalid2 => {
			result.push(get_invalid_handler());
			result.push(get_invalid_handler());
			return;
		}

		LegacyOpCodeHandlerKind::Dup => {
			let count = deserializer.read_u32();
			let handler = deserializer.read_handler_or_null_instance();
			for _ in 0..count {
				result.push(handler);
			}
			return;
		}

		LegacyOpCodeHandlerKind::Null => {
			result.push(get_null_handler());
			return;
		}

		LegacyOpCodeHandlerKind::HandlerReference => {
			result.push(deserializer.read_handler_reference());
			return;
		}

		LegacyOpCodeHandlerKind::ArrayReference => unreachable!(),
		LegacyOpCodeHandlerKind::RM => box_opcode_handler(OpCodeHandler_RM::new(deserializer.read_handler(), deserializer.read_handler())),

		LegacyOpCodeHandlerKind::Options1632_1 => box_opcode_handler(OpCodeHandler_Options1632::new(
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_decoder_options(),
		)),

		LegacyOpCodeHandlerKind::Options1632_2 => box_opcode_handler(OpCodeHandler_Options1632::new2(
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_decoder_options(),
			deserializer.read_handler(),
			deserializer.read_decoder_options(),
		)),

		LegacyOpCodeHandlerKind::Options3 => box_opcode_handler(OpCodeHandler_Options::new(
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_decoder_options(),
		)),

		LegacyOpCodeHandlerKind::Options5 => box_opcode_handler(OpCodeHandler_Options::new2(
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_decoder_options(),
			deserializer.read_handler(),
			deserializer.read_decoder_options(),
		)),

		LegacyOpCodeHandlerKind::Options_DontReadModRM => box_opcode_handler(OpCodeHandler_Options_DontReadModRM::new(
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_decoder_options(),
		)),

		LegacyOpCodeHandlerKind::AnotherTable => box_opcode_handler(OpCodeHandler_AnotherTable::new(
			deserializer.read_array_reference_no_clone(LegacyOpCodeHandlerKind::ArrayReference as u32),
		)),

		LegacyOpCodeHandlerKind::Group => {
			box_opcode_handler(OpCodeHandler_Group::new(deserializer.read_array_reference(LegacyOpCodeHandlerKind::ArrayReference as u32)))
		}

		LegacyOpCodeHandlerKind::Group8x64 => box_opcode_handler(OpCodeHandler_Group8x64::new(
			deserializer.read_array_reference(LegacyOpCodeHandlerKind::ArrayReference as u32),
			deserializer.read_array_reference(LegacyOpCodeHandlerKind::ArrayReference as u32),
		)),

		LegacyOpCodeHandlerKind::Group8x8 => box_opcode_handler(OpCodeHandler_Group8x8::new(
			deserializer.read_array_reference(LegacyOpCodeHandlerKind::ArrayReference as u32),
			deserializer.read_array_reference(LegacyOpCodeHandlerKind::ArrayReference as u32),
		)),

		LegacyOpCodeHandlerKind::MandatoryPrefix => box_opcode_handler(OpCodeHandler_MandatoryPrefix::new(
			true,
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
		)),

		LegacyOpCodeHandlerKind::MandatoryPrefix4 => box_opcode_handler(OpCodeHandler_MandatoryPrefix4::new(
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_u32(),
		)),

		LegacyOpCodeHandlerKind::MandatoryPrefix_NoModRM => box_opcode_handler(OpCodeHandler_MandatoryPrefix::new(
			false,
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
		)),

		LegacyOpCodeHandlerKind::MandatoryPrefix3 => box_opcode_handler(OpCodeHandler_MandatoryPrefix3::new(
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_handler(),
			deserializer.read_legacy_handler_flags(),
		)),

		LegacyOpCodeHandlerKind::D3NOW => box_opcode_handler(OpCodeHandler_D3NOW::new()),
		LegacyOpCodeHandlerKind::EVEX => box_opcode_handler(OpCodeHandler_EVEX::new(deserializer.read_handler())),
		LegacyOpCodeHandlerKind::VEX2 => box_opcode_handler(OpCodeHandler_VEX2::new(deserializer.read_handler())),
		LegacyOpCodeHandlerKind::VEX3 => box_opcode_handler(OpCodeHandler_VEX3::new(deserializer.read_handler())),
		LegacyOpCodeHandlerKind::XOP => box_opcode_handler(OpCodeHandler_XOP::new(deserializer.read_handler())),
		LegacyOpCodeHandlerKind::AL_DX => box_opcode_handler(OpCodeHandler_AL_DX::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Ap => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ap::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::B_BM => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_B_BM::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::B_Ev => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_B_Ev::new(code1, code2, deserializer.read_boolean()))
		}

		LegacyOpCodeHandlerKind::B_MIB => box_opcode_handler(OpCodeHandler_B_MIB::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::BM_B => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_BM_B::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::BranchIw => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_BranchIw::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::BranchSimple => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_BranchSimple::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::C_R_3a => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_C_R::new(code1, code2, deserializer.read_register()))
		}

		LegacyOpCodeHandlerKind::C_R_3b => {
			box_opcode_handler(OpCodeHandler_C_R::new(deserializer.read_code(), Code::INVALID, deserializer.read_register()))
		}

		LegacyOpCodeHandlerKind::DX_AL => box_opcode_handler(OpCodeHandler_DX_AL::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::DX_eAX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_DX_eAX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::eAX_DX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_eAX_DX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Eb_1 => box_opcode_handler(OpCodeHandler_Eb::new(deserializer.read_code(), 0)),
		LegacyOpCodeHandlerKind::Eb_2 => box_opcode_handler(OpCodeHandler_Eb::new(deserializer.read_code(), deserializer.read_handler_flags())),
		LegacyOpCodeHandlerKind::Eb_CL => box_opcode_handler(OpCodeHandler_Eb_CL::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::Eb_Gb_1 => box_opcode_handler(OpCodeHandler_Eb_Gb::new(deserializer.read_code(), 0)),
		LegacyOpCodeHandlerKind::Eb_Gb_2 => box_opcode_handler(OpCodeHandler_Eb_Gb::new(deserializer.read_code(), deserializer.read_handler_flags())),
		LegacyOpCodeHandlerKind::Eb_Ib_1 => box_opcode_handler(OpCodeHandler_Eb_Ib::new(deserializer.read_code(), 0)),
		LegacyOpCodeHandlerKind::Eb_Ib_2 => box_opcode_handler(OpCodeHandler_Eb_Ib::new(deserializer.read_code(), deserializer.read_handler_flags())),
		LegacyOpCodeHandlerKind::Eb1 => box_opcode_handler(OpCodeHandler_Eb_1::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Ed_V_Ib => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ed_V_Ib::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Ep => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ep::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Ev_3a => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev::new(code1, code2, code3, 0))
		}

		LegacyOpCodeHandlerKind::Ev_3b => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ev::new(code1, code2, Code::INVALID, 0))
		}

		LegacyOpCodeHandlerKind::Ev_4 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev::new(code1, code2, code3, deserializer.read_handler_flags()))
		}

		LegacyOpCodeHandlerKind::Ev_CL => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_CL::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Ev_Gv_32_64 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ev_Gv_32_64::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Ev_Gv_3a => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Gv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Ev_Gv_3b => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ev_Gv::new(code1, code2, Code::INVALID))
		}

		LegacyOpCodeHandlerKind::Ev_Gv_4 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Gv_flags::new(code1, code2, code3, deserializer.read_handler_flags()))
		}

		LegacyOpCodeHandlerKind::Ev_Gv_CL => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Gv_CL::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Ev_Gv_Ib => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Gv_Ib::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Ev_Gv_REX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ev_Gv_REX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Ev_Ib_3 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Ib::new(code1, code2, code3, 0))
		}

		LegacyOpCodeHandlerKind::Ev_Ib_4 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Ib::new(code1, code2, code3, deserializer.read_handler_flags()))
		}

		LegacyOpCodeHandlerKind::Ev_Ib2_3 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Ib2::new(code1, code2, code3, 0))
		}

		LegacyOpCodeHandlerKind::Ev_Ib2_4 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Ib2::new(code1, code2, code3, deserializer.read_handler_flags()))
		}

		LegacyOpCodeHandlerKind::Ev_Iz_3 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Iz::new(code1, code2, code3, 0))
		}

		LegacyOpCodeHandlerKind::Ev_Iz_4 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Iz::new(code1, code2, code3, deserializer.read_handler_flags()))
		}

		LegacyOpCodeHandlerKind::Ev_P => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ev_P::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Ev_REXW_1a => {
			let code = deserializer.read_code();
			box_opcode_handler(OpCodeHandler_Ev_REXW::new(code, Code::INVALID, deserializer.read_u32()))
		}

		LegacyOpCodeHandlerKind::Ev_REXW => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ev_REXW::new(code1, code2, deserializer.read_u32()))
		}

		LegacyOpCodeHandlerKind::Ev_Sw => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_Sw::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Ev_VX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Ev_VX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Ev1 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ev_1::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Evj => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Evj::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Evw => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Evw::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Ew => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ew::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gb_Eb => box_opcode_handler(OpCodeHandler_Gb_Eb::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Gdq_Ev => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gdq_Ev::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Eb => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Eb::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Eb_REX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_Eb_REX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Gv_Ev_32_64 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_Ev_32_64::new(code1, code2, deserializer.read_boolean(), deserializer.read_boolean()))
		}

		LegacyOpCodeHandlerKind::Gv_Ev_3a => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Ev::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Ev_3b => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_Ev::new(code1, code2, Code::INVALID))
		}

		LegacyOpCodeHandlerKind::Gv_Ev_Ib => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Ev_Ib::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Ev_Ib_REX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_Ev_Ib_REX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Gv_Ev_Iz => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Ev_Iz::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Ev_REX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_Ev_REX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Gv_Ev2 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Ev2::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Ev3 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Ev3::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Ew => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Ew::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_M => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_M::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_M_as => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_M_as::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Ma => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_Ma::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Gv_Mp_2 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_Mp::new(code1, code2, Code::INVALID))
		}

		LegacyOpCodeHandlerKind::Gv_Mp_3 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Mp::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_Mv => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Gv_Mv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Gv_N => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_N::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Gv_N_Ib_REX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_N_Ib_REX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Gv_RX => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_RX::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Gv_W => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Gv_W::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::GvM_VX_Ib => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_GvM_VX_Ib::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Ib => box_opcode_handler(OpCodeHandler_Ib::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::Ib3 => box_opcode_handler(OpCodeHandler_Ib3::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::IbReg => box_opcode_handler(OpCodeHandler_IbReg::new(deserializer.read_code(), deserializer.read_register())),

		LegacyOpCodeHandlerKind::IbReg2 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_IbReg2::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Iw_Ib => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Iw_Ib::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Jb => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Jb::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Jb2 => box_opcode_handler(OpCodeHandler_Jb2::new(
			deserializer.read_code(),
			deserializer.read_code(),
			deserializer.read_code(),
			deserializer.read_code(),
			deserializer.read_code(),
			deserializer.read_code(),
			deserializer.read_code(),
		)),

		LegacyOpCodeHandlerKind::Jdisp => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Jdisp::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Jx => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Jx::new(code1, code2, deserializer.read_code()))
		}

		LegacyOpCodeHandlerKind::Jz => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Jz::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::M_1 => box_opcode_handler(OpCodeHandler_M::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::M_2 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_M::new1(code1, code2))
		}

		LegacyOpCodeHandlerKind::M_REXW_2 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_M_REXW::new(code1, code2, 0, 0))
		}

		LegacyOpCodeHandlerKind::M_REXW_4 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_M_REXW::new(code1, code2, deserializer.read_handler_flags(), deserializer.read_handler_flags()))
		}

		LegacyOpCodeHandlerKind::MemBx => box_opcode_handler(OpCodeHandler_MemBx::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::Mf_1 => box_opcode_handler(OpCodeHandler_Mf::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Mf_2a => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Mf::new1(code1, code2))
		}

		LegacyOpCodeHandlerKind::Mf_2b => box_opcode_handler(OpCodeHandler_Mf::new1(deserializer.read_code(), deserializer.read_code())),
		LegacyOpCodeHandlerKind::MIB_B => box_opcode_handler(OpCodeHandler_MIB_B::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::MP => box_opcode_handler(OpCodeHandler_MP::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Ms => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ms::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::MV => box_opcode_handler(OpCodeHandler_MV::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Mv_Gv => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Mv_Gv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Mv_Gv_REXW => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Mv_Gv_REXW::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::NIb => box_opcode_handler(OpCodeHandler_NIb::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::Ob_Reg => box_opcode_handler(OpCodeHandler_Ob_Reg::new(deserializer.read_code(), deserializer.read_register())),

		LegacyOpCodeHandlerKind::Ov_Reg => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Ov_Reg::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::P_Ev => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_P_Ev::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::P_Ev_Ib => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_P_Ev_Ib::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::P_Q => box_opcode_handler(OpCodeHandler_P_Q::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::P_Q_Ib => box_opcode_handler(OpCodeHandler_P_Q_Ib::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::P_R => box_opcode_handler(OpCodeHandler_P_R::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::P_W => box_opcode_handler(OpCodeHandler_P_W::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::PushEv => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_PushEv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::PushIb2 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_PushIb2::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::PushIz => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_PushIz::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::PushOpSizeReg_4a => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_PushOpSizeReg::new(code1, code2, code3, deserializer.read_register()))
		}

		LegacyOpCodeHandlerKind::PushOpSizeReg_4b => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_PushOpSizeReg::new(code1, code2, Code::INVALID, deserializer.read_register()))
		}

		LegacyOpCodeHandlerKind::PushSimple2 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_PushSimple2::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::PushSimpleReg => {
			index = deserializer.read_u32();
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_PushSimpleReg::new(index, code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Q_P => box_opcode_handler(OpCodeHandler_Q_P::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::R_C_3a => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_R_C::new(code1, code2, deserializer.read_register()))
		}

		LegacyOpCodeHandlerKind::R_C_3b => {
			box_opcode_handler(OpCodeHandler_R_C::new(deserializer.read_code(), Code::INVALID, deserializer.read_register()))
		}

		LegacyOpCodeHandlerKind::rDI_P_N => box_opcode_handler(OpCodeHandler_rDI_P_N::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::rDI_VX_RX => box_opcode_handler(OpCodeHandler_rDI_VX_RX::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::Reg => box_opcode_handler(OpCodeHandler_Reg::new(deserializer.read_code(), deserializer.read_register())),

		LegacyOpCodeHandlerKind::Reg_Ib2 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Reg_Ib2::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Reg_Iz => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Reg_Iz::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Reg_Ob => box_opcode_handler(OpCodeHandler_Reg_Ob::new(deserializer.read_code(), deserializer.read_register())),

		LegacyOpCodeHandlerKind::Reg_Ov => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Reg_Ov::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Reg_Xb => box_opcode_handler(OpCodeHandler_Reg_Xb::new(deserializer.read_code(), deserializer.read_register())),

		LegacyOpCodeHandlerKind::Reg_Xv => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Reg_Xv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Reg_Xv2 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Reg_Xv2::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Reg_Yb => box_opcode_handler(OpCodeHandler_Reg_Yb::new(deserializer.read_code(), deserializer.read_register())),

		LegacyOpCodeHandlerKind::Reg_Yv => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Reg_Yv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::RegIb => box_opcode_handler(OpCodeHandler_RegIb::new(deserializer.read_code(), deserializer.read_register())),
		LegacyOpCodeHandlerKind::RegIb3 => box_opcode_handler(OpCodeHandler_RegIb3::new(deserializer.read_u32())),
		LegacyOpCodeHandlerKind::RegIz2 => box_opcode_handler(OpCodeHandler_RegIz2::new(deserializer.read_u32())),

		LegacyOpCodeHandlerKind::Reservednop => {
			box_opcode_handler(OpCodeHandler_Reservednop::new(deserializer.read_handler(), deserializer.read_handler()))
		}

		LegacyOpCodeHandlerKind::RIb => box_opcode_handler(OpCodeHandler_RIb::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::RIbIb => box_opcode_handler(OpCodeHandler_RIbIb::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Rv => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Rv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Rv_32_64 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Rv_32_64::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::RvMw_Gw => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_RvMw_Gw::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Simple => {
			let code = deserializer.read_code();
			if code == Code::Int3 {
				box_opcode_handler(OpCodeHandler_Int3::new())
			} else {
				box_opcode_handler(OpCodeHandler_Simple::new(code))
			}
		}
		LegacyOpCodeHandlerKind::Simple_ModRM => box_opcode_handler(OpCodeHandler_Simple::new_modrm(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Simple2_3a => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Simple2::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Simple2_3b => {
			box_opcode_handler(OpCodeHandler_Simple2::new(deserializer.read_code(), deserializer.read_code(), deserializer.read_code()))
		}

		LegacyOpCodeHandlerKind::Simple2Iw => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Simple2Iw::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Simple3 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Simple3::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Simple4 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Simple4::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Simple4b => {
			let code1 = deserializer.read_code();
			let code2 = deserializer.read_code();
			box_opcode_handler(OpCodeHandler_Simple4::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Simple5 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Simple5::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Simple5_a32 => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Simple5_a32::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Simple5_ModRM_as => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Simple5_ModRM_as::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::SimpleReg => box_opcode_handler(OpCodeHandler_SimpleReg::new(deserializer.read_code(), deserializer.read_u32())),
		LegacyOpCodeHandlerKind::ST_STi => box_opcode_handler(OpCodeHandler_ST_STi::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::STi => box_opcode_handler(OpCodeHandler_STi::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::STi_ST => box_opcode_handler(OpCodeHandler_STi_ST::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Sw_Ev => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Sw_Ev::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::V_Ev => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_V_Ev::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::VM => box_opcode_handler(OpCodeHandler_VM::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::VN => box_opcode_handler(OpCodeHandler_VN::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::VQ => box_opcode_handler(OpCodeHandler_VQ::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::VRIbIb => box_opcode_handler(OpCodeHandler_VRIbIb::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::VW_2 => box_opcode_handler(OpCodeHandler_VW::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::VW_3 => box_opcode_handler(OpCodeHandler_VW::new1(deserializer.read_code(), deserializer.read_code())),
		LegacyOpCodeHandlerKind::VWIb_2 => box_opcode_handler(OpCodeHandler_VWIb::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::VWIb_3 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_VWIb::new1(code1, code2))
		}

		LegacyOpCodeHandlerKind::VX_E_Ib => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_VX_E_Ib::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::VX_Ev => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_VX_Ev::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Wbinvd => box_opcode_handler(OpCodeHandler_Wbinvd::new()),
		LegacyOpCodeHandlerKind::WV => box_opcode_handler(OpCodeHandler_WV::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::Xb_Yb => box_opcode_handler(OpCodeHandler_Xb_Yb::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::Xchg_Reg_rAX => box_opcode_handler(OpCodeHandler_Xchg_Reg_rAX::new(deserializer.read_u32())),

		LegacyOpCodeHandlerKind::Xv_Yv => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Xv_Yv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Yb_Reg => box_opcode_handler(OpCodeHandler_Yb_Reg::new(deserializer.read_code(), deserializer.read_register())),
		LegacyOpCodeHandlerKind::Yb_Xb => box_opcode_handler(OpCodeHandler_Yb_Xb::new(deserializer.read_code())),

		LegacyOpCodeHandlerKind::Yv_Reg => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Yv_Reg::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::Yv_Reg2 => {
			let (code1, code2) = deserializer.read_code2();
			box_opcode_handler(OpCodeHandler_Yv_Reg2::new(code1, code2))
		}

		LegacyOpCodeHandlerKind::Yv_Xv => {
			let (code1, code2, code3) = deserializer.read_code3();
			box_opcode_handler(OpCodeHandler_Yv_Xv::new(code1, code2, code3))
		}

		LegacyOpCodeHandlerKind::M_Sw => {
			let code = deserializer.read_code();
			box_opcode_handler(OpCodeHandler_M_Sw::new(code))
		}

		LegacyOpCodeHandlerKind::Sw_M => {
			let code = deserializer.read_code();
			box_opcode_handler(OpCodeHandler_Sw_M::new(code))
		}

		LegacyOpCodeHandlerKind::Rq => box_opcode_handler(OpCodeHandler_Rq::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::Gd_Rd => box_opcode_handler(OpCodeHandler_Gd_Rd::new(deserializer.read_code())),
		LegacyOpCodeHandlerKind::PrefixEsCsSsDs => box_opcode_handler(OpCodeHandler_PrefixEsCsSsDs::new(deserializer.read_register())),
		LegacyOpCodeHandlerKind::PrefixFsGs => box_opcode_handler(OpCodeHandler_PrefixFsGs::new(deserializer.read_register())),
		LegacyOpCodeHandlerKind::Prefix66 => box_opcode_handler(OpCodeHandler_Prefix66::new()),
		LegacyOpCodeHandlerKind::Prefix67 => box_opcode_handler(OpCodeHandler_Prefix67::new()),
		LegacyOpCodeHandlerKind::PrefixF0 => box_opcode_handler(OpCodeHandler_PrefixF0::new()),
		LegacyOpCodeHandlerKind::PrefixF2 => box_opcode_handler(OpCodeHandler_PrefixF2::new()),
		LegacyOpCodeHandlerKind::PrefixF3 => box_opcode_handler(OpCodeHandler_PrefixF3::new()),
		LegacyOpCodeHandlerKind::PrefixREX => box_opcode_handler(OpCodeHandler_PrefixREX::new(deserializer.read_handler(), deserializer.read_u32())),
	};
	let handler = unsafe { &*handler_ptr };
	result.push((decode, handler));
}