summaryrefslogtreecommitdiff
path: root/include/VBox/disopcode.h
blob: 22ca0909f597bddc45a3af9ca912b9c88244c29f (plain)
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
/** @file
 * Disassembler - opcode.h.
 */

/*
 * Copyright (C) 2006-2012 Oracle Corporation
 *
 * This file is part of VirtualBox Open Source Edition (OSE), as
 * available from http://www.virtualbox.org. This file is free software;
 * you can redistribute it and/or modify it under the terms of the GNU
 * General Public License (GPL) as published by the Free Software
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 *
 * The contents of this file may alternatively be used under the terms
 * of the Common Development and Distribution License Version 1.0
 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
 * VirtualBox OSE distribution, in which case the provisions of the
 * CDDL are applicable instead of those of the GPL.
 *
 * You may elect to license modified versions of this file under the
 * terms and conditions of either the GPL or the CDDL or both.
 */

#ifndef ___VBox_opcode_h
#define ___VBox_opcode_h

#define MODRM_MOD(a)    (a>>6)
#define MODRM_REG(a)    ((a>>3)&0x7)
#define MODRM_RM(a)     (a&0x7)
#define MAKE_MODRM(mod, reg, rm) (((mod&3) << 6) | ((reg&7) << 3) | (rm&7))

#define SIB_SCALE(a)    (a>>6)
#define SIB_INDEX(a)    ((a>>3)&0x7)
#define SIB_BASE(a)     (a&0x7)


/** @defgroup grp_dis_opcodes Opcodes (DISOPCODE::uOpCode)
 * @ingroup grp_dis
 * @{
 */

/** @name  Full Intel X86 opcode list
 * @{ */
#define OP_INVALID      0
#define OP_OPSIZE       1
#define OP_ADDRSIZE     2
#define OP_SEG          3
#define OP_REPNE        4
#define OP_REPE         5
#define OP_REX          6
#define OP_LOCK         7
#define OP_LAST_PREFIX  OP_LOCK   /* disassembler assumes this is the last prefix byte value!!!! */
#define OP_AND          8
#define OP_OR           9
#define OP_DAA          10
#define OP_SUB          11
#define OP_DAS          12
#define OP_XOR          13
#define OP_AAA          14
#define OP_CMP          15
#define OP_IMM_GRP1     16
#define OP_AAS          17
#define OP_INC          18
#define OP_DEC          19
#define OP_PUSHA        20
#define OP_POPA         21
#define OP_BOUND        22
#define OP_ARPL         23
#define OP_PUSH         24
#define OP_POP          25
#define OP_IMUL         26
#define OP_INSB         27
#define OP_INSWD        28
#define OP_OUTSB        29
#define OP_OUTSWD       30
#define OP_JO           31
#define OP_JNO          32
#define OP_JC           33
#define OP_JNC          34
#define OP_JE           35
#define OP_JNE          36
#define OP_JBE          37
#define OP_JNBE         38
#define OP_JS           39
#define OP_JNS          40
#define OP_JP           41
#define OP_JNP          42
#define OP_JL           43
#define OP_JNL          44
#define OP_JLE          45
#define OP_JNLE         46
#define OP_ADD          47
#define OP_TEST         48
#define OP_XCHG         49
#define OP_MOV          50
#define OP_LEA          51
#define OP_NOP          52
#define OP_CBW          53
#define OP_CWD          54
#define OP_CALL         55
#define OP_WAIT         56
#define OP_PUSHF        57
#define OP_POPF         58
#define OP_SAHF         59
#define OP_LAHF         60
#define OP_MOVSB        61
#define OP_MOVSWD       62
#define OP_CMPSB        63
#define OP_CMPWD        64
#define OP_STOSB        65
#define OP_STOSWD       66
#define OP_LODSB        67
#define OP_LODSWD       68
#define OP_SCASB        69
#define OP_SCASWD       70
#define OP_SHIFT_GRP2   71
#define OP_RETN         72
#define OP_LES          73
#define OP_LDS          74
#define OP_ENTER        75
#define OP_LEAVE        76
#define OP_RETF         77
#define OP_INT3         78
#define OP_INT          79
#define OP_INTO         80
#define OP_IRET         81
#define OP_AAM          82
#define OP_AAD          83
#define OP_XLAT         84
#define OP_ESCF0        85
#define OP_ESCF1        86
#define OP_ESCF2        87
#define OP_ESCF3        88
#define OP_ESCF4        89
#define OP_ESCF5        90
#define OP_ESCF6        91
#define OP_ESCF7        92
#define OP_LOOPNE       93
#define OP_LOOPE        94
#define OP_LOOP         95
#define OP_JECXZ        96
#define OP_IN           97
#define OP_OUT          98
#define OP_JMP          99
#define OP_2B_ESC       100
#define OP_ADC          101
#define OP_SBB          102
#define OP_HLT          103
#define OP_CMC          104
#define OP_UNARY_GRP3   105
#define OP_CLC          106
#define OP_STC          107
#define OP_CLI          108
#define OP_STI          109
#define OP_CLD          110
#define OP_STD          111
#define OP_INC_GRP4     112
#define OP_IND_GRP5     113
#define OP_GRP6         114
#define OP_GRP7         115
#define OP_LAR          116
#define OP_LSL          117
#define OP_SYSCALL      118
#define OP_CLTS         119
#define OP_SYSRET       120
#define OP_INVD         121
#define OP_WBINVD       122
#define OP_ILLUD2       123
#define OP_FEMMS        124
#define OP_3DNOW        125
#define OP_MOVUPS       126
#define OP_MOVLPS       127
#define OP_UNPCKLPS     128
#define OP_MOVHPS       129
#define OP_UNPCKHPS     130
#define OP_PREFETCH_GRP16   131
#define OP_MOV_CR       132
#define OP_MOVAPS       133
#define OP_CVTPI2PS     134
#define OP_MOVNTPS      135
#define OP_CVTTPS2PI    136
#define OP_CVTPS2PI     137
#define OP_UCOMISS      138
#define OP_COMISS       139
#define OP_WRMSR        140
#define OP_RDTSC        141
#define OP_RDMSR        142
#define OP_RDPMC        143
#define OP_SYSENTER     144
#define OP_SYSEXIT      145
#define OP_PAUSE        146
#define OP_CMOVO        147
#define OP_CMOVNO       148
#define OP_CMOVC        149
#define OP_CMOVNC       150
#define OP_CMOVZ        151
#define OP_CMOVNZ       152
#define OP_CMOVBE       153
#define OP_CMOVNBE      154
#define OP_CMOVS        155
#define OP_CMOVNS       156
#define OP_CMOVP        157
#define OP_CMOVNP       158
#define OP_CMOVL        159
#define OP_CMOVNL       160
#define OP_CMOVLE       161
#define OP_CMOVNLE      162
#define OP_MOVMSKPS     163
#define OP_SQRTPS       164
#define OP_RSQRTPS      165
#define OP_RCPPS        166
#define OP_ANDPS        167
#define OP_ANDNPS       168
#define OP_ORPS         169
#define OP_XORPS        170
#define OP_ADDPS        171
#define OP_MULPS        172
#define OP_CVTPS2PD     173
#define OP_CVTDQ2PS     174
#define OP_SUBPS        175
#define OP_MINPS        176
#define OP_DIVPS        177
#define OP_MAXPS        178
#define OP_PUNPCKLBW    179
#define OP_PUNPCKLWD    180
#define OP_PUNPCKLDQ    181
#define OP_PACKSSWB     182
#define OP_PCMPGTB      183
#define OP_PCMPGTW      184
#define OP_PCMPGTD      185
#define OP_PACKUSWB     186
#define OP_PUNPCKHBW    187
#define OP_PUNPCKHWD    188
#define OP_PUNPCKHDQ    189
#define OP_PACKSSDW     190
#define OP_MOVD         191
#define OP_MOVQ         192
#define OP_PSHUFW       193
#define OP_3B_ESC4      194
#define OP_3B_ESC5      195

#define OP_PCMPEQB      196
#define OP_PCMPEQW      197
#define OP_PCMPEQD      198
#define OP_SETO         199
#define OP_SETNO        200
#define OP_SETC         201
#define OP_SETNC        202
#define OP_SETE         203
#define OP_SETNE        204
#define OP_SETBE        205
#define OP_SETNBE       206
#define OP_SETS         207
#define OP_SETNS        208
#define OP_SETP         209
#define OP_SETNP        210
#define OP_SETL         211
#define OP_SETNL        212
#define OP_SETLE        213
#define OP_SETNLE       214
#define OP_CPUID        215
#define OP_BT           216
#define OP_SHLD         217
#define OP_RSM          218
#define OP_BTS          219
#define OP_SHRD         220
#define OP_GRP15        221
#define OP_CMPXCHG      222
#define OP_LSS          223
#define OP_BTR          224
#define OP_LFS          225
#define OP_LGS          226
#define OP_MOVZX        227
#define OP_GRP10_INV    228
#define OP_GRP8         229
#define OP_BTC          230
#define OP_BSF          231
#define OP_BSR          232
#define OP_MOVSX        233
#define OP_XADD         234
#define OP_CMPPS        235
#define OP_MOVNTI       236
#define OP_PINSRW       237
#define OP_PEXTRW       238
#define OP_SHUFPS       239
#define OP_GRP9         240
#define OP_BSWAP        241
#define OP_PSRLW        242
#define OP_PSRLD        243
#define OP_PSRLQ        244
#define OP_PADDQ        245
#define OP_PMULLW       246
#define OP_PMOVMSKB     247
#define OP_PSUBUSB      248
#define OP_PSUBUSW      249
#define OP_PMINUB       250
#define OP_PAND         251
#define OP_PADDUSB      252
#define OP_PADDUSW      253
#define OP_PMAXUB       254
#define OP_PANDN        255
#define OP_PAVGN        256
#define OP_PSRAW        257
#define OP_PSRAD        258
#define OP_PAVGW        259
#define OP_PMULHUW      260
#define OP_PMULHW       261
#define OP_MOVNTQ       262
#define OP_PSUBSB       263
#define OP_PSUBSW       264
#define OP_PMINSW       265
#define OP_POR          266
#define OP_PADDSB       267
#define OP_PADDSW       268
#define OP_PMAXSW       269
#define OP_PXOR         270
#define OP_PSLLW        271
#define OP_PSLLD        272
#define OP_PSSQ         273
#define OP_PMULUDQ      274
#define OP_PADDWD       275
#define OP_PADBW        276
#define OP_PMASKMOVQ    277
#define OP_PSUBB        278
#define OP_PSUBW        279

#define OP_PSUBD        281
#define OP_PADDB        282
#define OP_PADDW        283
#define OP_PADDD        284
#define OP_MOVUPD       285
#define OP_MOVLPD       286
#define OP_UNPCKLPD     287
#define OP_UNPCKHPD     288
#define OP_MOVHPD       289

#define OP_MOVAPD       291
#define OP_CVTPI2PD     292
#define OP_MOVNTPD      293
#define OP_CVTTPD2PI    294
#define OP_CVTPD2PI     295
#define OP_UCOMISD      296
#define OP_COMISD       297
#define OP_MOVMSKPD     298
#define OP_SQRTPD       299
#define OP_ANDPD        301
#define OP_ANDNPD       302
#define OP_ORPD         303
#define OP_XORPD        304
#define OP_ADDPD        305
#define OP_MULPD        306
#define OP_CVTPD2PS     307
#define OP_CVTPS2DQ     308
#define OP_SUBPD        309
#define OP_MINPD        310
#define OP_DIVPD        311
#define OP_MAXPD        312

#define OP_GRP12        313
#define OP_GRP13        314
#define OP_GRP14        315
#define OP_EMMS         316
#define OP_MMX_UD78     317
#define OP_MMX_UD79     318
#define OP_MMX_UD7A     319
#define OP_MMX_UD7B     320
#define OP_MMX_UD7C     321
#define OP_MMX_UD7D     322


#define OP_PUNPCKLQDQ   325
#define OP_PUNPCKHQD    326

#define OP_MOVDQA       328
#define OP_PSHUFD       329



#define OP_CMPPD        334
#define OP_SHUFPD       337


#define OP_CVTTPD2DQ    353
#define OP_MOVNTDQ      354

#define OP_PSHUFB       355
#define OP_PHADDW       356
#define OP_PHADDD       357
#define OP_PHADDSW      358
#define OP_PMADDUBSW    359
#define OP_PHSUBW       360
#define OP_PHSUBD       361
#define OP_PHSUBSW      362
#define OP_PSIGNB       363
#define OP_PSIGNW       364
#define OP_PSIGND       365
#define OP_PMULHRSW     366
#define OP_PBLENDVB     367
#define OP_BLENDVPS     368
#define OP_BLENDVPD     369
#define OP_PTEST        370
#define OP_PABSB        371
#define OP_PABSW        372
#define OP_PABSD        373

#define OP_PMASKMOVDQU  376
#define OP_MOVSD        377
#define OP_CVTSI2SD     378
#define OP_CVTTSD2SI    379
#define OP_CVTSD2SI     380
#define OP_SQRTSD       381
#define OP_ADDSD        382
#define OP_MULSD        383
#define OP_CVTSD2SS     384
#define OP_SUBSD        385
#define OP_MINSD        386
#define OP_DIVSD        387
#define OP_MAXSD        388
#define OP_PSHUFLW      389
#define OP_CMPSD        390
#define OP_MOVDQ2Q      391
#define OP_CVTPD2DQ     392
#define OP_MOVSS        393
#define OP_CVTSI2SS     394
#define OP_CVTTSS2SI    395
#define OP_CVTSS2SI     396
#define OP_SQRTSS       397
#define OP_RSQRTSS      398
#define OP_ADDSS        399
#define OP_MULSS        401
#define OP_CVTTPS2DQ    403
#define OP_SUBSS        404
#define OP_MINSS        405
#define OP_DIVSS        406
#define OP_MAXSS        407
#define OP_MOVDQU       408
#define OP_PSHUFHW      409
#define OP_CMPSS        410
#define OP_MOVQ2DQ      411
#define OP_CVTDQ2PD     412
/** @} */

/** @name Floating point ops
 * @{
 */
#define OP_FADD         413
#define OP_FMUL         414
#define OP_FCOM         415
#define OP_FCOMP        416
#define OP_FSUB         417
#define OP_FSUBR        418
#define OP_FDIV         419
#define OP_FDIVR        420
#define OP_FLD          421
#define OP_FST          422
#define OP_FSTP         423
#define OP_FLDENV       424

#define OP_FSTENV       426
#define OP_FSTCW        427
#define OP_FXCH         428
#define OP_FNOP         429
#define OP_FCHS         430
#define OP_FABS         431

#define OP_FLD1         433
#define OP_FLDL2T       434
#define OP_FLDL2E       435
#define OP_FLDPI        436
#define OP_FLDLG2       437
#define OP_FLDLN2       438
#define OP_FLDZ         439
#define OP_F2XM1        440
#define OP_FYL2X        441
#define OP_FPTAN        442
#define OP_FPATAN       443
#define OP_FXTRACT      444
#define OP_FREM1        445
#define OP_FDECSTP      446
#define OP_FINCSTP      447
#define OP_FPREM        448
#define OP_FYL2XP1      449
#define OP_FSQRT        450
#define OP_FSINCOS      451
#define OP_FRNDINT      452
#define OP_FSCALE       453
#define OP_FSIN         454
#define OP_FCOS         455
#define OP_FIADD        456
#define OP_FIMUL        457
#define OP_FISUB        460
#define OP_FISUBR       461
#define OP_FIDIV        462
#define OP_FIDIVR       463
#define OP_FCMOVB       464
#define OP_FCMOVE       465
#define OP_FCMOVBE      466
#define OP_FCMOVU       467
#define OP_FUCOMPP      468
#define OP_FILD         469
#define OP_FIST         470
#define OP_FISTP        471
#define OP_FCMOVNB      474
#define OP_FCMOVNE      475
#define OP_FCMOVNBE     476
#define OP_FCMOVNU      477
#define OP_FCLEX        478
#define OP_FINIT        479
#define OP_FUCOMI       480
#define OP_FCOMI        481
#define OP_FRSTOR       482
#define OP_FSAVE        483
#define OP_FNSTSW       484
#define OP_FFREE        485
#define OP_FUCOM        486
#define OP_FUCOMP       487
#define OP_FICOM        490
#define OP_FICOMP       491
#define OP_FADDP        496
#define OP_FMULP        497
#define OP_FCOMPP       498
#define OP_FSUBRP       499
#define OP_FSUBP        500
#define OP_FDIVRP       501
#define OP_FDIVP        502
#define OP_FBLD         503
#define OP_FBSTP        504
#define OP_FCOMIP       506
#define OP_FUCOMIP      507
/** @} */

/** @name 3DNow!
 * @{
 */
#define OP_PI2FW        508
#define OP_PI2FD        509
#define OP_PF2IW        510
#define OP_PF2ID        511
#define OP_PFPNACC      512
#define OP_PFCMPGE      513
#define OP_PFMIN        514
#define OP_PFRCP        515
#define OP_PFRSQRT      516
#define OP_PFSUB        517
#define OP_PFADD        518
#define OP_PFCMPGT      519
#define OP_PFMAX        520
#define OP_PFRCPIT1     521
#define OP_PFRSQRTIT1   522
#define OP_PFSUBR       523
#define OP_PFACC        524
#define OP_PFCMPEQ      525
#define OP_PFMUL        526
#define OP_PFRCPIT2     527
#define OP_PFMULHRW     528
#define OP_PFSWAPD      529
#define OP_PAVGUSB      530
#define OP_PFNACC       531
#define OP_ROL          532
#define OP_ROR          533
#define OP_RCL          534
#define OP_RCR          535
#define OP_SHL          536
#define OP_SHR          537
#define OP_SAR          538
#define OP_NOT          539
#define OP_NEG          540
#define OP_MUL          541
#define OP_DIV          542
#define OP_IDIV         543
#define OP_SLDT         544
#define OP_STR          545
#define OP_LLDT         546
#define OP_LTR          547
#define OP_VERR         548
#define OP_VERW         549
#define OP_SGDT         550
#define OP_LGDT         551
#define OP_SIDT         552
#define OP_LIDT         553
#define OP_SMSW         554
#define OP_LMSW         555
#define OP_INVLPG       556
#define OP_CMPXCHG8B    557
#define OP_PSLLQ        558
#define OP_PSRLDQ       559
#define OP_PSLLDQ       560
#define OP_FXSAVE       561
#define OP_FXRSTOR      562
#define OP_LDMXCSR      563
#define OP_STMXCSR      564
#define OP_LFENCE       565
#define OP_MFENCE       566
#define OP_SFENCE       567
#define OP_PREFETCH     568
#define OP_MONITOR      569
#define OP_MWAIT        570
#define OP_CLFLUSH      571

#define OP_MOV_DR       600
#define OP_MOV_TR       601

#define OP_SWAPGS       610

/** @name VT-x instructions
 * @{ */
#define OP_VMREAD       650
#define OP_VMWRITE      651
#define OP_VMCALL       652
#define OP_VMXON        653
#define OP_VMXOFF       654
#define OP_VMCLEAR      655
#define OP_VMLAUNCH     656
#define OP_VMRESUME     657
#define OP_VMPTRLD      658
#define OP_VMPTRST      659
#define OP_INVEPT       660
#define OP_INVVPID      661
/** @}  */

/** @name 64 bits instruction
 * @{ */
#define OP_MOVSXD       700
/** @}  */

/** @} */


/** @defgroup grp_dis_opparam Opcode parameters (DISOPCODE::fParam1,
 *            DISOPCODE::fParam2, DISOPCODE::fParam3)
 * @ingroup grp_dis
 * @{
 */

/* NOTE: Register order is important for translations!! */
#define OP_PARM_NONE            0
#define OP_PARM_REG_EAX         1
#define OP_PARM_REG_GEN32_START OP_PARM_REG_EAX
#define OP_PARM_REG_ECX         2
#define OP_PARM_REG_EDX         3
#define OP_PARM_REG_EBX         4
#define OP_PARM_REG_ESP         5
#define OP_PARM_REG_EBP         6
#define OP_PARM_REG_ESI         7
#define OP_PARM_REG_EDI         8
#define OP_PARM_REG_GEN32_END   OP_PARM_REG_EDI

#define OP_PARM_REG_ES          9
#define OP_PARM_REG_SEG_START   OP_PARM_REG_ES
#define OP_PARM_REG_CS          10
#define OP_PARM_REG_SS          11
#define OP_PARM_REG_DS          12
#define OP_PARM_REG_FS          13
#define OP_PARM_REG_GS          14
#define OP_PARM_REG_SEG_END     OP_PARM_REG_GS

#define OP_PARM_REG_AX          15
#define OP_PARM_REG_GEN16_START   OP_PARM_REG_AX
#define OP_PARM_REG_CX          16
#define OP_PARM_REG_DX          17
#define OP_PARM_REG_BX          18
#define OP_PARM_REG_SP          19
#define OP_PARM_REG_BP          20
#define OP_PARM_REG_SI          21
#define OP_PARM_REG_DI          22
#define OP_PARM_REG_GEN16_END   OP_PARM_REG_DI

#define OP_PARM_REG_AL          23
#define OP_PARM_REG_GEN8_START  OP_PARM_REG_AL
#define OP_PARM_REG_CL          24
#define OP_PARM_REG_DL          25
#define OP_PARM_REG_BL          26
#define OP_PARM_REG_AH          27
#define OP_PARM_REG_CH          28
#define OP_PARM_REG_DH          29
#define OP_PARM_REG_BH          30
#define OP_PARM_REG_GEN8_END    OP_PARM_REG_BH

#define OP_PARM_REGFP_0         31
#define OP_PARM_REG_FP_START    OP_PARM_REGFP_0
#define OP_PARM_REGFP_1         32
#define OP_PARM_REGFP_2         33
#define OP_PARM_REGFP_3         34
#define OP_PARM_REGFP_4         35
#define OP_PARM_REGFP_5         36
#define OP_PARM_REGFP_6         37
#define OP_PARM_REGFP_7         38
#define OP_PARM_REG_FP_END      OP_PARM_REGFP_7

#define OP_PARM_NTA             39
#define OP_PARM_T0              40
#define OP_PARM_T1              41
#define OP_PARM_T2              42

#define OP_PARM_1               43

#define OP_PARM_REX             50
#define OP_PARM_REX_START       OP_PARM_REX
#define OP_PARM_REX_B           51
#define OP_PARM_REX_X           52
#define OP_PARM_REX_XB          53
#define OP_PARM_REX_R           54
#define OP_PARM_REX_RB          55
#define OP_PARM_REX_RX          56
#define OP_PARM_REX_RXB         57
#define OP_PARM_REX_W           58
#define OP_PARM_REX_WB          59
#define OP_PARM_REX_WX          60
#define OP_PARM_REX_WXB         61
#define OP_PARM_REX_WR          62
#define OP_PARM_REX_WRB         63
#define OP_PARM_REX_WRX         64
#define OP_PARM_REX_WRXB        65

#define OP_PARM_REG_RAX         100
#define OP_PARM_REG_GEN64_START OP_PARM_REG_RAX
#define OP_PARM_REG_RCX         101
#define OP_PARM_REG_RDX         102
#define OP_PARM_REG_RBX         103
#define OP_PARM_REG_RSP         104
#define OP_PARM_REG_RBP         105
#define OP_PARM_REG_RSI         106
#define OP_PARM_REG_RDI         107
#define OP_PARM_REG_R8          108
#define OP_PARM_REG_R9          109
#define OP_PARM_REG_R10         110
#define OP_PARM_REG_R11         111
#define OP_PARM_REG_R12         112
#define OP_PARM_REG_R13         113
#define OP_PARM_REG_R14         114
#define OP_PARM_REG_R15         115
#define OP_PARM_REG_GEN64_END   OP_PARM_REG_R15


#define OP_PARM_VTYPE(a)        ((unsigned)a & 0xFE0)
#define OP_PARM_VSUBTYPE(a)     ((unsigned)a & 0x01F)

#define OP_PARM_A               0x100
#define OP_PARM_VARIABLE        OP_PARM_A
#define OP_PARM_E               0x120
#define OP_PARM_F               0x140
#define OP_PARM_G               0x160
#define OP_PARM_I               0x180
#define OP_PARM_J               0x1A0
#define OP_PARM_M               0x1C0
#define OP_PARM_O               0x1E0
#define OP_PARM_R               0x200
#define OP_PARM_X               0x220
#define OP_PARM_Y               0x240

/* Grouped rare parameters for optimization purposes */
#define IS_OP_PARM_RARE(a)      ((a & 0xF00) == 0x300)
#define OP_PARM_C               0x300       /* control register */
#define OP_PARM_D               0x320       /* debug register */
#define OP_PARM_S               0x340       /* segment register */
#define OP_PARM_T               0x360       /* test register */
#define OP_PARM_Q               0x380
#define OP_PARM_P               0x3A0       /* mmx register */
#define OP_PARM_W               0x3C0       /* xmm register */
#define OP_PARM_V               0x3E0

#define OP_PARM_NONE            0
#define OP_PARM_a               0x1
#define OP_PARM_b               0x2
#define OP_PARM_d               0x3
#define OP_PARM_dq              0x4
#define OP_PARM_p               0x5
#define OP_PARM_pd              0x6
#define OP_PARM_pi              0x7
#define OP_PARM_ps              0x8
#define OP_PARM_pq              0x9
#define OP_PARM_q               0xA
#define OP_PARM_s               0xB
#define OP_PARM_sd              0xC
#define OP_PARM_ss              0xD
#define OP_PARM_v               0xE
#define OP_PARM_w               0xF
#define OP_PARM_z               0x10


#define OP_PARM_Ap              (OP_PARM_A+OP_PARM_p)
#define OP_PARM_Cd              (OP_PARM_C+OP_PARM_d)
#define OP_PARM_Dd              (OP_PARM_D+OP_PARM_d)
#define OP_PARM_Eb              (OP_PARM_E+OP_PARM_b)
#define OP_PARM_Ed              (OP_PARM_E+OP_PARM_d)
#define OP_PARM_Ep              (OP_PARM_E+OP_PARM_p)
#define OP_PARM_Ev              (OP_PARM_E+OP_PARM_v)
#define OP_PARM_Ew              (OP_PARM_E+OP_PARM_w)
#define OP_PARM_Fv              (OP_PARM_F+OP_PARM_v)
#define OP_PARM_Gb              (OP_PARM_G+OP_PARM_b)
#define OP_PARM_Gd              (OP_PARM_G+OP_PARM_d)
#define OP_PARM_Gv              (OP_PARM_G+OP_PARM_v)
#define OP_PARM_Gw              (OP_PARM_G+OP_PARM_w)
#define OP_PARM_Ib              (OP_PARM_I+OP_PARM_b)
#define OP_PARM_Id              (OP_PARM_I+OP_PARM_d)
#define OP_PARM_Iq              (OP_PARM_I+OP_PARM_q)
#define OP_PARM_Iw              (OP_PARM_I+OP_PARM_w)
#define OP_PARM_Iv              (OP_PARM_I+OP_PARM_v)
#define OP_PARM_Iz              (OP_PARM_I+OP_PARM_z)
#define OP_PARM_Jb              (OP_PARM_J+OP_PARM_b)
#define OP_PARM_Jv              (OP_PARM_J+OP_PARM_v)
#define OP_PARM_Ma              (OP_PARM_M+OP_PARM_a)
#define OP_PARM_Mb              (OP_PARM_M+OP_PARM_b)
#define OP_PARM_Mw              (OP_PARM_M+OP_PARM_w)
#define OP_PARM_Md              (OP_PARM_M+OP_PARM_d)
#define OP_PARM_Mp              (OP_PARM_M+OP_PARM_p)
#define OP_PARM_Mq              (OP_PARM_M+OP_PARM_q)
#define OP_PARM_Mdq             (OP_PARM_M+OP_PARM_dq)
#define OP_PARM_Ms              (OP_PARM_M+OP_PARM_s)
#define OP_PARM_Ob              (OP_PARM_O+OP_PARM_b)
#define OP_PARM_Ov              (OP_PARM_O+OP_PARM_v)
#define OP_PARM_Pq              (OP_PARM_P+OP_PARM_q)
#define OP_PARM_Pd              (OP_PARM_P+OP_PARM_d)
#define OP_PARM_Qd              (OP_PARM_Q+OP_PARM_d)
#define OP_PARM_Qq              (OP_PARM_Q+OP_PARM_q)
#define OP_PARM_Rd              (OP_PARM_R+OP_PARM_d)
#define OP_PARM_Rw              (OP_PARM_R+OP_PARM_w)
#define OP_PARM_Sw              (OP_PARM_S+OP_PARM_w)
#define OP_PARM_Td              (OP_PARM_T+OP_PARM_d)
#define OP_PARM_Vq              (OP_PARM_V+OP_PARM_q)
#define OP_PARM_Wq              (OP_PARM_W+OP_PARM_q)
#define OP_PARM_Ws              (OP_PARM_W+OP_PARM_s)
#define OP_PARM_Xb              (OP_PARM_X+OP_PARM_b)
#define OP_PARM_Xv              (OP_PARM_X+OP_PARM_v)
#define OP_PARM_Yb              (OP_PARM_Y+OP_PARM_b)
#define OP_PARM_Yv              (OP_PARM_Y+OP_PARM_v)

#define OP_PARM_Vps             (OP_PARM_V+OP_PARM_ps)
#define OP_PARM_Vss             (OP_PARM_V+OP_PARM_ss)
#define OP_PARM_Vpd             (OP_PARM_V+OP_PARM_pd)
#define OP_PARM_Vdq             (OP_PARM_V+OP_PARM_dq)
#define OP_PARM_Wps             (OP_PARM_W+OP_PARM_ps)
#define OP_PARM_Wpd             (OP_PARM_W+OP_PARM_pd)
#define OP_PARM_Wss             (OP_PARM_W+OP_PARM_ss)
#define OP_PARM_Wdq             (OP_PARM_W+OP_PARM_dq)
#define OP_PARM_Ppi             (OP_PARM_P+OP_PARM_pi)
#define OP_PARM_Qpi             (OP_PARM_Q+OP_PARM_pi)
#define OP_PARM_Qdq             (OP_PARM_Q+OP_PARM_dq)
#define OP_PARM_Vsd             (OP_PARM_V+OP_PARM_sd)
#define OP_PARM_Wsd             (OP_PARM_W+OP_PARM_sd)
#define OP_PARM_Vpq             (OP_PARM_V+OP_PARM_pq)
#define OP_PARM_Pdq             (OP_PARM_P+OP_PARM_dq)

/** @} */

#endif