VirtualBox

Changeset 65876 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Feb 25, 2017 12:47:44 AM (8 years ago)
Author:
vboxsync
Message:

IEM,DIS: Updates

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r65871 r65876  
    4444 * @opcode      0x00
    4545 * @opmnemonic  add
    46  * @op1         reg:Eb
    47  * @op2         rm:Gb
     46 * @op1         rm:Eb
     47 * @op2         reg:Gb
    4848 * @opmaps      one
    4949 * @openc       ModR/M
     
    5656FNIEMOP_DEF(iemOp_add_Eb_Gb)
    5757{
    58     IEMOP_MNEMONIC2(RM, ADD, add, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     58    IEMOP_MNEMONIC2(MR, ADD, add, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    5959    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_add);
    6060}
    6161
    6262
    63 /** Opcode 0x01. */
     63/**
     64 * @opcode      0x01
     65 * @opgroup     op_gen_arith_bin
     66 * @opflmodify  of,sf,zf,af,pf,cf
     67 */
    6468FNIEMOP_DEF(iemOp_add_Ev_Gv)
    6569{
    66     IEMOP_MNEMONIC2(RM, ADD, add, Ev, Gv, DISOPTYPE_HARMLESS, 0);
     70    IEMOP_MNEMONIC2(MR, ADD, add, Ev, Gv, DISOPTYPE_HARMLESS, 0);
    6771    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_add);
    6872}
    6973
    7074
    71 /** Opcode 0x02. */
     75/**
     76 * @opcode      0x02
     77 * @opgroup     op_gen_arith_bin
     78 * @opflmodify  of,sf,zf,af,pf,cf
     79 */
    7280FNIEMOP_DEF(iemOp_add_Gb_Eb)
    7381{
    74     IEMOP_MNEMONIC2(MR, ADD, add, Gb, Ev, DISOPTYPE_HARMLESS, 0);
     82    IEMOP_MNEMONIC2(RM, ADD, add, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    7583    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_add);
    7684}
    7785
    7886
    79 /** Opcode 0x03. */
     87/**
     88 * @opcode      0x03
     89 * @opgroup     op_gen_arith_bin
     90 * @opflmodify  of,sf,zf,af,pf,cf
     91 */
    8092FNIEMOP_DEF(iemOp_add_Gv_Ev)
    8193{
    82     IEMOP_MNEMONIC(add_Gv_Ev, "add Gv,Ev");
     94    IEMOP_MNEMONIC2(RM, ADD, add, Gv, Ev, DISOPTYPE_HARMLESS, 0);
    8395    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_add);
    8496}
    8597
    8698
    87 /** Opcode 0x04. */
     99/**
     100 * @opcode      0x04
     101 * @opgroup     op_gen_arith_bin
     102 * @opflmodify  of,sf,zf,af,pf,cf
     103 */
    88104FNIEMOP_DEF(iemOp_add_Al_Ib)
    89105{
    90     IEMOP_MNEMONIC(add_al_Ib, "add al,Ib");
     106    IEMOP_MNEMONIC2(FIXED, ADD, add, AL, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    91107    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_add);
    92108}
    93109
    94110
    95 /** Opcode 0x05. */
     111/**
     112 * @opcode      0x05
     113 * @opgroup     op_gen_arith_bin
     114 * @opflmodify  of,sf,zf,af,pf,cf
     115 */
    96116FNIEMOP_DEF(iemOp_add_eAX_Iz)
    97117{
    98     IEMOP_MNEMONIC(add_rAX_Iz, "add rAX,Iz");
     118    IEMOP_MNEMONIC2(FIXED, ADD, add, rAX, Iz, DISOPTYPE_HARMLESS, 0);
    99119    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_add);
    100120}
    101121
    102122
    103 /** Opcode 0x06. */
     123/**
     124 * @opcode      0x06
     125 * @opgroup     op_stack_sreg
     126 */
    104127FNIEMOP_DEF(iemOp_push_ES)
    105128{
    106     IEMOP_MNEMONIC(push_es, "push es");
     129    IEMOP_MNEMONIC1(FIXED, PUSH, push, ES, DISOPTYPE_HARMLESS | DISOPTYPE_INVALID_64, 0);
     130    IEMOP_HLP_NO_64BIT();
    107131    return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_ES);
    108132}
    109133
    110134
    111 /** Opcode 0x07. */
     135/**
     136 * @opcode      0x07
     137 * @opgroup     op_stack_sreg
     138 */
    112139FNIEMOP_DEF(iemOp_pop_ES)
    113140{
    114     IEMOP_MNEMONIC(pop_es, "pop es");
     141    IEMOP_MNEMONIC1(FIXED, POP, pop, ES, DISOPTYPE_HARMLESS | DISOPTYPE_INVALID_64, 0);
    115142    IEMOP_HLP_NO_64BIT();
    116143    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     
    119146
    120147
    121 /** Opcode 0x08. */
     148/**
     149 * @opcode      0x08
     150 * @opgroup     op_gen_arith_bin
     151 * @opflmodify  of,sf,zf,af,pf,cf
     152 * @opflundef   af
     153 * @opflclear   of,cf
     154 */
    122155FNIEMOP_DEF(iemOp_or_Eb_Gb)
    123156{
    124     IEMOP_MNEMONIC(or_Eb_Gb, "or  Eb,Gb");
     157    IEMOP_MNEMONIC2(MR, OR, or, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    125158    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    126159    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_r8, &g_iemAImpl_or);
     
    128161
    129162
    130 /** Opcode 0x09. */
     163/**
     164 * @opcode      0x09
     165 * @opgroup     op_gen_arith_bin
     166 * @opflmodify  of,sf,zf,af,pf,cf
     167 * @opflundef   af
     168 * @opflclear   of,cf
     169 */
    131170FNIEMOP_DEF(iemOp_or_Ev_Gv)
    132171{
    133     IEMOP_MNEMONIC(or_Ev_Gv, "or  Ev,Gv");
     172    IEMOP_MNEMONIC2(MR, OR, or, Ev, Gv, DISOPTYPE_HARMLESS, 0);
    134173    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    135174    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rm_rv, &g_iemAImpl_or);
     
    137176
    138177
    139 /** Opcode 0x0a. */
     178/**
     179 * @opcode      0x0a
     180 * @opgroup     op_gen_arith_bin
     181 * @opflmodify  of,sf,zf,af,pf,cf
     182 * @opflundef   af
     183 * @opflclear   of,cf
     184 */
    140185FNIEMOP_DEF(iemOp_or_Gb_Eb)
    141186{
    142     IEMOP_MNEMONIC(or_Gb_Eb, "or  Gb,Eb");
     187    IEMOP_MNEMONIC2(RM, OR, or, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    143188    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    144189    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_r8_rm, &g_iemAImpl_or);
     
    146191
    147192
    148 /** Opcode 0x0b. */
     193/**
     194 * @opcode      0x0b
     195 * @opgroup     op_gen_arith_bin
     196 * @opflmodify  of,sf,zf,af,pf,cf
     197 * @opflundef   af
     198 * @opflclear   of,cf
     199 */
    149200FNIEMOP_DEF(iemOp_or_Gv_Ev)
    150201{
    151     IEMOP_MNEMONIC(or_Gv_Ev, "or  Gv,Ev");
     202    IEMOP_MNEMONIC2(RM, OR, or, Gv, Ev, DISOPTYPE_HARMLESS, 0);
    152203    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    153204    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rv_rm, &g_iemAImpl_or);
     
    155206
    156207
    157 /** Opcode 0x0c. */
     208/**
     209 * @opcode      0x0c
     210 * @opgroup     op_gen_arith_bin
     211 * @opflmodify  of,sf,zf,af,pf,cf
     212 * @opflundef   af
     213 * @opflclear   of,cf
     214 */
    158215FNIEMOP_DEF(iemOp_or_Al_Ib)
    159216{
    160     IEMOP_MNEMONIC(or_al_Ib, "or  al,Ib");
     217    IEMOP_MNEMONIC2(FIXED, OR, or, AL, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    161218    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    162219    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_AL_Ib, &g_iemAImpl_or);
     
    164221
    165222
    166 /** Opcode 0x0d. */
     223/**
     224 * @opcode      0x0d
     225 * @opgroup     op_gen_arith_bin
     226 * @opflmodify  of,sf,zf,af,pf,cf
     227 * @opflundef   af
     228 * @opflclear   of,cf
     229 */
    167230FNIEMOP_DEF(iemOp_or_eAX_Iz)
    168231{
    169     IEMOP_MNEMONIC(or_rAX_Iz, "or  rAX,Iz");
     232    IEMOP_MNEMONIC2(FIXED, OR, or, rAX, Iz, DISOPTYPE_HARMLESS, 0);
    170233    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    171234    return FNIEMOP_CALL_1(iemOpHlpBinaryOperator_rAX_Iz, &g_iemAImpl_or);
     
    173236
    174237
    175 /** Opcode 0x0e. */
     238/**
     239 * @opcode      0x0e
     240 * @opgroup     op_stack_sreg
     241 */
    176242FNIEMOP_DEF(iemOp_push_CS)
    177243{
    178     IEMOP_MNEMONIC(push_cs, "push cs");
     244    IEMOP_MNEMONIC1(FIXED, PUSH, push, CS, DISOPTYPE_HARMLESS | DISOPTYPE_POTENTIALLY_DANGEROUS | DISOPTYPE_INVALID_64, 0);
     245    IEMOP_HLP_NO_64BIT();
    179246    return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_CS);
    180247}
    181248
    182249
    183 /** Opcode 0x0f. */
     250/**
     251 * @opcode      0x0f
     252 * @mnemonic    2byteescape
     253 * @encoding    two0f
     254 * @opdisenum   OP_2B_ESC
     255 * @ophints     harmless
     256 * @opgroup     op_escapes
     257 */
    184258FNIEMOP_DEF(iemOp_2byteEscape)
    185259{
    186260#ifdef VBOX_STRICT
     261    /* Sanity check the table the first time around. */
    187262    static bool s_fTested = false;
    188263    if (RT_LIKELY(s_fTested)) { /* likely */  }
     
    197272#endif
    198273
    199     uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
    200 
    201     /** @todo PUSH CS on 8086, undefined on 80186. */
    202     IEMOP_HLP_MIN_286();
    203     return FNIEMOP_CALL(g_apfnTwoByteMap[(uintptr_t)b * 4 + pVCpu->iem.s.idxPrefix]);
     274    if (RT_LIKELY(IEM_GET_TARGET_CPU(pVCpu) >= IEMTARGETCPU_286))
     275    {
     276        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     277        IEMOP_HLP_MIN_286();
     278        return FNIEMOP_CALL(g_apfnTwoByteMap[(uintptr_t)b * 4 + pVCpu->iem.s.idxPrefix]);
     279    }
     280
     281    /*
     282     * On the 8086 this is a POP CS instruction.
     283     * For the time being we don't specify this this.
     284     */
     285    IEMOP_MNEMONIC1(FIXED, POP, pop, CS, DISOPTYPE_HARMLESS | DISOPTYPE_POTENTIALLY_DANGEROUS | DISOPTYPE_INVALID_64, IEMOPHINT_SKIP_PYTHON);
     286    IEMOP_HLP_NO_64BIT();
     287    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     288    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_ES, pVCpu->iem.s.enmEffOpSize);
    204289}
    205290
     
    226311
    227312
    228 /** Opcode 0x11. */
     313/**
     314 * @opcode      0x11
     315 */
    229316FNIEMOP_DEF(iemOp_adc_Ev_Gv)
    230317{
     
    234321
    235322
    236 /** Opcode 0x12. */
     323/**
     324 * @opcode      0x12
     325 */
    237326FNIEMOP_DEF(iemOp_adc_Gb_Eb)
    238327{
     
    242331
    243332
    244 /** Opcode 0x13. */
     333/**
     334 * @opcode      0x13
     335 */
    245336FNIEMOP_DEF(iemOp_adc_Gv_Ev)
    246337{
     
    250341
    251342
    252 /** Opcode 0x14. */
     343/**
     344 * @opcode      0x14
     345 */
    253346FNIEMOP_DEF(iemOp_adc_Al_Ib)
    254347{
     
    258351
    259352
    260 /** Opcode 0x15. */
     353/**
     354 * @opcode      0x15
     355 */
    261356FNIEMOP_DEF(iemOp_adc_eAX_Iz)
    262357{
     
    266361
    267362
    268 /** Opcode 0x16. */
     363/**
     364 * @opcode      0x16
     365 */
    269366FNIEMOP_DEF(iemOp_push_SS)
    270367{
    271368    IEMOP_MNEMONIC(push_ss, "push ss");
     369    IEMOP_HLP_NO_64BIT();
    272370    return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_SS);
    273371}
    274372
    275373
    276 /** Opcode 0x17. */
     374/**
     375 * @opcode      0x17
     376 */
    277377FNIEMOP_DEF(iemOp_pop_SS)
    278378{
     
    284384
    285385
    286 /** Opcode 0x18. */
     386/**
     387 * @opcode      0x18
     388 */
    287389FNIEMOP_DEF(iemOp_sbb_Eb_Gb)
    288390{
     
    292394
    293395
    294 /** Opcode 0x19. */
     396/**
     397 * @opcode      0x19
     398 */
    295399FNIEMOP_DEF(iemOp_sbb_Ev_Gv)
    296400{
     
    300404
    301405
    302 /** Opcode 0x1a. */
     406/**
     407 * @opcode      0x1a
     408 */
    303409FNIEMOP_DEF(iemOp_sbb_Gb_Eb)
    304410{
     
    308414
    309415
    310 /** Opcode 0x1b. */
     416/**
     417 * @opcode      0x1b
     418 */
    311419FNIEMOP_DEF(iemOp_sbb_Gv_Ev)
    312420{
     
    316424
    317425
    318 /** Opcode 0x1c. */
     426/**
     427 * @opcode      0x1c
     428 */
    319429FNIEMOP_DEF(iemOp_sbb_Al_Ib)
    320430{
     
    324434
    325435
    326 /** Opcode 0x1d. */
     436/**
     437 * @opcode      0x1d
     438 */
    327439FNIEMOP_DEF(iemOp_sbb_eAX_Iz)
    328440{
     
    332444
    333445
    334 /** Opcode 0x1e. */
     446/**
     447 * @opcode      0x1e
     448 */
    335449FNIEMOP_DEF(iemOp_push_DS)
    336450{
    337451    IEMOP_MNEMONIC(push_ds, "push ds");
     452    IEMOP_HLP_NO_64BIT();
    338453    return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_DS);
    339454}
    340455
    341456
    342 /** Opcode 0x1f. */
     457/**
     458 * @opcode      0x1f
     459 */
    343460FNIEMOP_DEF(iemOp_pop_DS)
    344461{
     
    350467
    351468
    352 /** Opcode 0x20. */
     469/**
     470 * @opcode      0x20
     471 */
    353472FNIEMOP_DEF(iemOp_and_Eb_Gb)
    354473{
     
    359478
    360479
    361 /** Opcode 0x21. */
     480/**
     481 * @opcode      0x21
     482 */
    362483FNIEMOP_DEF(iemOp_and_Ev_Gv)
    363484{
     
    368489
    369490
    370 /** Opcode 0x22. */
     491/**
     492 * @opcode      0x22
     493 */
    371494FNIEMOP_DEF(iemOp_and_Gb_Eb)
    372495{
     
    377500
    378501
    379 /** Opcode 0x23. */
     502/**
     503 * @opcode      0x23
     504 */
    380505FNIEMOP_DEF(iemOp_and_Gv_Ev)
    381506{
     
    386511
    387512
    388 /** Opcode 0x24. */
     513/**
     514 * @opcode      0x24
     515 */
    389516FNIEMOP_DEF(iemOp_and_Al_Ib)
    390517{
     
    395522
    396523
    397 /** Opcode 0x25. */
     524/**
     525 * @opcode      0x25
     526 */
    398527FNIEMOP_DEF(iemOp_and_eAX_Iz)
    399528{
     
    404533
    405534
    406 /** Opcode 0x26. */
     535/**
     536 * @opcode      0x26
     537 */
    407538FNIEMOP_DEF(iemOp_seg_ES)
    408539{
     
    416547
    417548
    418 /** Opcode 0x27. */
     549/**
     550 * @opcode      0x27
     551 */
    419552FNIEMOP_DEF(iemOp_daa)
    420553{
     
    427560
    428561
    429 /** Opcode 0x28. */
     562/**
     563 * @opcode      0x28
     564 */
    430565FNIEMOP_DEF(iemOp_sub_Eb_Gb)
    431566{
     
    435570
    436571
    437 /** Opcode 0x29. */
     572/**
     573 * @opcode      0x29
     574 */
    438575FNIEMOP_DEF(iemOp_sub_Ev_Gv)
    439576{
     
    443580
    444581
    445 /** Opcode 0x2a. */
     582/**
     583 * @opcode      0x2a
     584 */
    446585FNIEMOP_DEF(iemOp_sub_Gb_Eb)
    447586{
     
    451590
    452591
    453 /** Opcode 0x2b. */
     592/**
     593 * @opcode      0x2b
     594 */
    454595FNIEMOP_DEF(iemOp_sub_Gv_Ev)
    455596{
     
    459600
    460601
    461 /** Opcode 0x2c. */
     602/**
     603 * @opcode      0x2c
     604 */
    462605FNIEMOP_DEF(iemOp_sub_Al_Ib)
    463606{
     
    467610
    468611
    469 /** Opcode 0x2d. */
     612/**
     613 * @opcode      0x2d
     614 */
    470615FNIEMOP_DEF(iemOp_sub_eAX_Iz)
    471616{
     
    475620
    476621
    477 /** Opcode 0x2e. */
     622/**
     623 * @opcode      0x2e
     624 */
    478625FNIEMOP_DEF(iemOp_seg_CS)
    479626{
     
    487634
    488635
    489 /** Opcode 0x2f. */
     636/**
     637 * @opcode      0x2f
     638 */
    490639FNIEMOP_DEF(iemOp_das)
    491640{
     
    498647
    499648
    500 /** Opcode 0x30. */
     649/**
     650 * @opcode      0x30
     651 */
    501652FNIEMOP_DEF(iemOp_xor_Eb_Gb)
    502653{
     
    507658
    508659
    509 /** Opcode 0x31. */
     660/**
     661 * @opcode      0x31
     662 */
    510663FNIEMOP_DEF(iemOp_xor_Ev_Gv)
    511664{
     
    516669
    517670
    518 /** Opcode 0x32. */
     671/**
     672 * @opcode      0x32
     673 */
    519674FNIEMOP_DEF(iemOp_xor_Gb_Eb)
    520675{
     
    525680
    526681
    527 /** Opcode 0x33. */
     682/**
     683 * @opcode      0x33
     684 */
    528685FNIEMOP_DEF(iemOp_xor_Gv_Ev)
    529686{
     
    534691
    535692
    536 /** Opcode 0x34. */
     693/**
     694 * @opcode      0x34
     695 */
    537696FNIEMOP_DEF(iemOp_xor_Al_Ib)
    538697{
     
    543702
    544703
    545 /** Opcode 0x35. */
     704/**
     705 * @opcode      0x35
     706 */
    546707FNIEMOP_DEF(iemOp_xor_eAX_Iz)
    547708{
     
    552713
    553714
    554 /** Opcode 0x36. */
     715/**
     716 * @opcode      0x36
     717 */
    555718FNIEMOP_DEF(iemOp_seg_SS)
    556719{
     
    564727
    565728
    566 /** Opcode 0x37. */
     729/**
     730 * @opcode      0x37
     731 */
    567732FNIEMOP_STUB(iemOp_aaa);
    568733
    569734
    570 /** Opcode 0x38. */
     735/**
     736 * @opcode      0x38
     737 */
    571738FNIEMOP_DEF(iemOp_cmp_Eb_Gb)
    572739{
     
    576743
    577744
    578 /** Opcode 0x39. */
     745/**
     746 * @opcode      0x39
     747 */
    579748FNIEMOP_DEF(iemOp_cmp_Ev_Gv)
    580749{
     
    584753
    585754
    586 /** Opcode 0x3a. */
     755/**
     756 * @opcode      0x3a
     757 */
    587758FNIEMOP_DEF(iemOp_cmp_Gb_Eb)
    588759{
     
    592763
    593764
    594 /** Opcode 0x3b. */
     765/**
     766 * @opcode      0x3b
     767 */
    595768FNIEMOP_DEF(iemOp_cmp_Gv_Ev)
    596769{
     
    600773
    601774
    602 /** Opcode 0x3c. */
     775/**
     776 * @opcode      0x3c
     777 */
    603778FNIEMOP_DEF(iemOp_cmp_Al_Ib)
    604779{
     
    608783
    609784
    610 /** Opcode 0x3d. */
     785/**
     786 * @opcode      0x3d
     787 */
    611788FNIEMOP_DEF(iemOp_cmp_eAX_Iz)
    612789{
     
    616793
    617794
    618 /** Opcode 0x3e. */
     795/**
     796 * @opcode      0x3e
     797 */
    619798FNIEMOP_DEF(iemOp_seg_DS)
    620799{
     
    628807
    629808
    630 /** Opcode 0x3f. */
     809/**
     810 * @opcode      0x3f
     811 */
    631812FNIEMOP_STUB(iemOp_aas);
    632813
     
    677858
    678859
    679 /** Opcode 0x40. */
     860/**
     861 * @opcode      0x40
     862 */
    680863FNIEMOP_DEF(iemOp_inc_eAX)
    681864{
     
    697880
    698881
    699 /** Opcode 0x41. */
     882/**
     883 * @opcode      0x41
     884 */
    700885FNIEMOP_DEF(iemOp_inc_eCX)
    701886{
     
    718903
    719904
    720 /** Opcode 0x42. */
     905/**
     906 * @opcode      0x42
     907 */
    721908FNIEMOP_DEF(iemOp_inc_eDX)
    722909{
     
    740927
    741928
    742 /** Opcode 0x43. */
     929/**
     930 * @opcode      0x43
     931 */
    743932FNIEMOP_DEF(iemOp_inc_eBX)
    744933{
     
    762951
    763952
    764 /** Opcode 0x44. */
     953/**
     954 * @opcode      0x44
     955 */
    765956FNIEMOP_DEF(iemOp_inc_eSP)
    766957{
     
    783974
    784975
    785 /** Opcode 0x45. */
     976/**
     977 * @opcode      0x45
     978 */
    786979FNIEMOP_DEF(iemOp_inc_eBP)
    787980{
     
    805998
    806999
    807 /** Opcode 0x46. */
     1000/**
     1001 * @opcode      0x46
     1002 */
    8081003FNIEMOP_DEF(iemOp_inc_eSI)
    8091004{
     
    8271022
    8281023
    829 /** Opcode 0x47. */
     1024/**
     1025 * @opcode      0x47
     1026 */
    8301027FNIEMOP_DEF(iemOp_inc_eDI)
    8311028{
     
    8501047
    8511048
    852 /** Opcode 0x48. */
     1049/**
     1050 * @opcode      0x48
     1051 */
    8531052FNIEMOP_DEF(iemOp_dec_eAX)
    8541053{
     
    8711070
    8721071
    873 /** Opcode 0x49. */
     1072/**
     1073 * @opcode      0x49
     1074 */
    8741075FNIEMOP_DEF(iemOp_dec_eCX)
    8751076{
     
    8931094
    8941095
    895 /** Opcode 0x4a. */
     1096/**
     1097 * @opcode      0x4a
     1098 */
    8961099FNIEMOP_DEF(iemOp_dec_eDX)
    8971100{
     
    9151118
    9161119
    917 /** Opcode 0x4b. */
     1120/**
     1121 * @opcode      0x4b
     1122 */
    9181123FNIEMOP_DEF(iemOp_dec_eBX)
    9191124{
     
    9381143
    9391144
    940 /** Opcode 0x4c. */
     1145/**
     1146 * @opcode      0x4c
     1147 */
    9411148FNIEMOP_DEF(iemOp_dec_eSP)
    9421149{
     
    9601167
    9611168
    962 /** Opcode 0x4d. */
     1169/**
     1170 * @opcode      0x4d
     1171 */
    9631172FNIEMOP_DEF(iemOp_dec_eBP)
    9641173{
     
    9831192
    9841193
    985 /** Opcode 0x4e. */
     1194/**
     1195 * @opcode      0x4e
     1196 */
    9861197FNIEMOP_DEF(iemOp_dec_eSI)
    9871198{
     
    10061217
    10071218
    1008 /** Opcode 0x4f. */
     1219/**
     1220 * @opcode      0x4f
     1221 */
    10091222FNIEMOP_DEF(iemOp_dec_eDI)
    10101223{
     
    10771290
    10781291
    1079 /** Opcode 0x50. */
     1292/**
     1293 * @opcode      0x50
     1294 */
    10801295FNIEMOP_DEF(iemOp_push_eAX)
    10811296{
     
    10851300
    10861301
    1087 /** Opcode 0x51. */
     1302/**
     1303 * @opcode      0x51
     1304 */
    10881305FNIEMOP_DEF(iemOp_push_eCX)
    10891306{
     
    10931310
    10941311
    1095 /** Opcode 0x52. */
     1312/**
     1313 * @opcode      0x52
     1314 */
    10961315FNIEMOP_DEF(iemOp_push_eDX)
    10971316{
     
    11011320
    11021321
    1103 /** Opcode 0x53. */
     1322/**
     1323 * @opcode      0x53
     1324 */
    11041325FNIEMOP_DEF(iemOp_push_eBX)
    11051326{
     
    11091330
    11101331
    1111 /** Opcode 0x54. */
     1332/**
     1333 * @opcode      0x54
     1334 */
    11121335FNIEMOP_DEF(iemOp_push_eSP)
    11131336{
     
    11271350
    11281351
    1129 /** Opcode 0x55. */
     1352/**
     1353 * @opcode      0x55
     1354 */
    11301355FNIEMOP_DEF(iemOp_push_eBP)
    11311356{
     
    11351360
    11361361
    1137 /** Opcode 0x56. */
     1362/**
     1363 * @opcode      0x56
     1364 */
    11381365FNIEMOP_DEF(iemOp_push_eSI)
    11391366{
     
    11431370
    11441371
    1145 /** Opcode 0x57. */
     1372/**
     1373 * @opcode      0x57
     1374 */
    11461375FNIEMOP_DEF(iemOp_push_eDI)
    11471376{
     
    11991428
    12001429
    1201 /** Opcode 0x58. */
     1430/**
     1431 * @opcode      0x58
     1432 */
    12021433FNIEMOP_DEF(iemOp_pop_eAX)
    12031434{
     
    12071438
    12081439
    1209 /** Opcode 0x59. */
     1440/**
     1441 * @opcode      0x59
     1442 */
    12101443FNIEMOP_DEF(iemOp_pop_eCX)
    12111444{
     
    12151448
    12161449
    1217 /** Opcode 0x5a. */
     1450/**
     1451 * @opcode      0x5a
     1452 */
    12181453FNIEMOP_DEF(iemOp_pop_eDX)
    12191454{
     
    12231458
    12241459
    1225 /** Opcode 0x5b. */
     1460/**
     1461 * @opcode      0x5b
     1462 */
    12261463FNIEMOP_DEF(iemOp_pop_eBX)
    12271464{
     
    12311468
    12321469
    1233 /** Opcode 0x5c. */
     1470/**
     1471 * @opcode      0x5c
     1472 */
    12341473FNIEMOP_DEF(iemOp_pop_eSP)
    12351474{
     
    12801519
    12811520
    1282 /** Opcode 0x5d. */
     1521/**
     1522 * @opcode      0x5d
     1523 */
    12831524FNIEMOP_DEF(iemOp_pop_eBP)
    12841525{
     
    12881529
    12891530
    1290 /** Opcode 0x5e. */
     1531/**
     1532 * @opcode      0x5e
     1533 */
    12911534FNIEMOP_DEF(iemOp_pop_eSI)
    12921535{
     
    12961539
    12971540
    1298 /** Opcode 0x5f. */
     1541/**
     1542 * @opcode      0x5f
     1543 */
    12991544FNIEMOP_DEF(iemOp_pop_eDI)
    13001545{
     
    13041549
    13051550
    1306 /** Opcode 0x60. */
     1551/**
     1552 * @opcode      0x60
     1553 */
    13071554FNIEMOP_DEF(iemOp_pusha)
    13081555{
     
    13171564
    13181565
    1319 /** Opcode 0x61. */
     1566/**
     1567 * @opcode      0x61
     1568 */
    13201569FNIEMOP_DEF(iemOp_popa__mvex)
    13211570{
     
    13361585
    13371586
    1338 /** Opcode 0x62. */
     1587/**
     1588 * @opcode      0x62
     1589 * @opmnemonic  bound
     1590 * @op1         Gv
     1591 * @op2         Ma
     1592 * @opmincpu    80186
     1593 * @ophints     harmless invalid_64
     1594 */
    13391595FNIEMOP_STUB(iemOp_bound_Gv_Ma__evex);
    13401596//    IEMOP_HLP_MIN_186();
     
    13921648
    13931649
    1394 /** Opcode 0x63.
     1650/**
     1651 * @opcode 0x63
     1652 *
    13951653 * @note This is a weird one. It works like a regular move instruction if
    13961654 *       REX.W isn't set, at least according to AMD docs (rev 3.15, 2009-11).
     
    14351693
    14361694
    1437 /** Opcode 0x64. */
     1695/**
     1696 * @opcode      0x64
     1697 * @opmnemonic  segfs
     1698 * @opmincpu    80386
     1699 * @opgroup     op_prefixes
     1700 */
    14381701FNIEMOP_DEF(iemOp_seg_FS)
    14391702{
     
    14491712
    14501713
    1451 /** Opcode 0x65. */
     1714/**
     1715 * @opcode      0x65
     1716 * @opmnemonic  seggs
     1717 * @opmincpu    80386
     1718 * @opgroup     op_prefixes
     1719 */
    14521720FNIEMOP_DEF(iemOp_seg_GS)
    14531721{
     
    14631731
    14641732
    1465 /** Opcode 0x66. */
     1733/**
     1734 * @opcode      0x66
     1735 * @opmnemonic  opsize
     1736 * @openc       prefix
     1737 * @opmincpu    80386
     1738 * @ophints     harmless
     1739 * @opgroup     op_prefixes
     1740 */
    14661741FNIEMOP_DEF(iemOp_op_size)
    14671742{
     
    14821757
    14831758
    1484 /** Opcode 0x67. */
     1759/**
     1760 * @opcode      0x67
     1761 * @opmnemonic  addrsize
     1762 * @openc       prefix
     1763 * @opmincpu    80386
     1764 * @ophints     harmless
     1765 * @opgroup     op_prefixes
     1766 */
    14851767FNIEMOP_DEF(iemOp_addr_size)
    14861768{
     
    15021784
    15031785
    1504 /** Opcode 0x68. */
     1786/**
     1787 * @opcode      0x68
     1788 */
    15051789FNIEMOP_DEF(iemOp_push_Iz)
    15061790{
     
    15481832
    15491833
    1550 /** Opcode 0x69. */
     1834/**
     1835 * @opcode      0x69
     1836 */
    15511837FNIEMOP_DEF(iemOp_imul_Gv_Ev_Iz)
    15521838{
     
    17091995
    17101996
    1711 /** Opcode 0x6a. */
     1997/**
     1998 * @opcode      0x6a
     1999 */
    17122000FNIEMOP_DEF(iemOp_push_Ib)
    17132001{
     
    17372025
    17382026
    1739 /** Opcode 0x6b. */
     2027/**
     2028 * @opcode      0x6b
     2029 */
    17402030FNIEMOP_DEF(iemOp_imul_Gv_Ev_Ib)
    17412031{
     
    18922182
    18932183
    1894 /** Opcode 0x6c. */
     2184/**
     2185 * @opcode      0x6c
     2186 */
    18952187FNIEMOP_DEF(iemOp_insb_Yb_DX)
    18962188{
     
    19222214
    19232215
    1924 /** Opcode 0x6d. */
     2216/**
     2217 * @opcode      0x6d
     2218 */
    19252219FNIEMOP_DEF(iemOp_inswd_Yv_DX)
    19262220{
     
    19842278
    19852279
    1986 /** Opcode 0x6e. */
     2280/**
     2281 * @opcode      0x6e
     2282 */
    19872283FNIEMOP_DEF(iemOp_outsb_Yb_DX)
    19882284{
     
    20142310
    20152311
    2016 /** Opcode 0x6f. */
     2312/**
     2313 * @opcode      0x6f
     2314 */
    20172315FNIEMOP_DEF(iemOp_outswd_Yv_DX)
    20182316{
     
    20762374
    20772375
    2078 /** Opcode 0x70. */
     2376/**
     2377 * @opcode      0x70
     2378 */
    20792379FNIEMOP_DEF(iemOp_jo_Jb)
    20802380{
     
    20952395
    20962396
    2097 /** Opcode 0x71. */
     2397/**
     2398 * @opcode      0x71
     2399 */
    20982400FNIEMOP_DEF(iemOp_jno_Jb)
    20992401{
     
    21132415}
    21142416
    2115 /** Opcode 0x72. */
     2417/**
     2418 * @opcode      0x72
     2419 */
    21162420FNIEMOP_DEF(iemOp_jc_Jb)
    21172421{
     
    21322436
    21332437
    2134 /** Opcode 0x73. */
     2438/**
     2439 * @opcode      0x73
     2440 */
    21352441FNIEMOP_DEF(iemOp_jnc_Jb)
    21362442{
     
    21512457
    21522458
    2153 /** Opcode 0x74. */
     2459/**
     2460 * @opcode      0x74
     2461 */
    21542462FNIEMOP_DEF(iemOp_je_Jb)
    21552463{
     
    21702478
    21712479
    2172 /** Opcode 0x75. */
     2480/**
     2481 * @opcode      0x75
     2482 */
    21732483FNIEMOP_DEF(iemOp_jne_Jb)
    21742484{
     
    21892499
    21902500
    2191 /** Opcode 0x76. */
     2501/**
     2502 * @opcode      0x76
     2503 */
    21922504FNIEMOP_DEF(iemOp_jbe_Jb)
    21932505{
     
    22082520
    22092521
    2210 /** Opcode 0x77. */
     2522/**
     2523 * @opcode      0x77
     2524 */
    22112525FNIEMOP_DEF(iemOp_jnbe_Jb)
    22122526{
     
    22272541
    22282542
    2229 /** Opcode 0x78. */
     2543/**
     2544 * @opcode      0x78
     2545 */
    22302546FNIEMOP_DEF(iemOp_js_Jb)
    22312547{
     
    22462562
    22472563
    2248 /** Opcode 0x79. */
     2564/**
     2565 * @opcode      0x79
     2566 */
    22492567FNIEMOP_DEF(iemOp_jns_Jb)
    22502568{
     
    22652583
    22662584
    2267 /** Opcode 0x7a. */
     2585/**
     2586 * @opcode      0x7a
     2587 */
    22682588FNIEMOP_DEF(iemOp_jp_Jb)
    22692589{
     
    22842604
    22852605
    2286 /** Opcode 0x7b. */
     2606/**
     2607 * @opcode      0x7b
     2608 */
    22872609FNIEMOP_DEF(iemOp_jnp_Jb)
    22882610{
     
    23032625
    23042626
    2305 /** Opcode 0x7c. */
     2627/**
     2628 * @opcode      0x7c
     2629 */
    23062630FNIEMOP_DEF(iemOp_jl_Jb)
    23072631{
     
    23222646
    23232647
    2324 /** Opcode 0x7d. */
     2648/**
     2649 * @opcode      0x7d
     2650 */
    23252651FNIEMOP_DEF(iemOp_jnl_Jb)
    23262652{
     
    23412667
    23422668
    2343 /** Opcode 0x7e. */
     2669/**
     2670 * @opcode      0x7e
     2671 */
    23442672FNIEMOP_DEF(iemOp_jle_Jb)
    23452673{
     
    23602688
    23612689
    2362 /** Opcode 0x7f. */
     2690/**
     2691 * @opcode      0x7f
     2692 */
    23632693FNIEMOP_DEF(iemOp_jnle_Jb)
    23642694{
     
    23792709
    23802710
    2381 /** Opcode 0x80. */
     2711/**
     2712 * @opcode      0x80
     2713 */
    23822714FNIEMOP_DEF(iemOp_Grp1_Eb_Ib_80)
    23832715{
     
    24502782
    24512783
    2452 /** Opcode 0x81. */
     2784/**
     2785 * @opcode      0x81
     2786 */
    24532787FNIEMOP_DEF(iemOp_Grp1_Ev_Iz)
    24542788{
     
    26392973
    26402974
    2641 /** Opcode 0x82. */
     2975/**
     2976 * @opcode      0x82
     2977 * @opmnemonic  grp1_82
     2978 * @opgroup     op_groups
     2979 */
    26422980FNIEMOP_DEF(iemOp_Grp1_Eb_Ib_82)
    26432981{
     
    26472985
    26482986
    2649 /** Opcode 0x83. */
     2987/**
     2988 * @opcode      0x83
     2989 */
    26502990FNIEMOP_DEF(iemOp_Grp1_Ev_Ib)
    26512991{
     
    28313171
    28323172
    2833 /** Opcode 0x84. */
     3173/**
     3174 * @opcode      0x84
     3175 */
    28343176FNIEMOP_DEF(iemOp_test_Eb_Gb)
    28353177{
     
    28403182
    28413183
    2842 /** Opcode 0x85. */
     3184/**
     3185 * @opcode      0x85
     3186 */
    28433187FNIEMOP_DEF(iemOp_test_Ev_Gv)
    28443188{
     
    28493193
    28503194
    2851 /** Opcode 0x86. */
     3195/**
     3196 * @opcode      0x86
     3197 */
    28523198FNIEMOP_DEF(iemOp_xchg_Eb_Gb)
    28533199{
     
    28983244
    28993245
    2900 /** Opcode 0x87. */
     3246/**
     3247 * @opcode      0x87
     3248 */
    29013249FNIEMOP_DEF(iemOp_xchg_Ev_Gv)
    29023250{
     
    30213369
    30223370
    3023 /** Opcode 0x88. */
     3371/**
     3372 * @opcode      0x88
     3373 */
    30243374FNIEMOP_DEF(iemOp_mov_Eb_Gb)
    30253375{
     
    30623412
    30633413
    3064 /** Opcode 0x89. */
     3414/**
     3415 * @opcode      0x89
     3416 */
    30653417FNIEMOP_DEF(iemOp_mov_Ev_Gv)
    30663418{
     
    31533505
    31543506
    3155 /** Opcode 0x8a. */
     3507/**
     3508 * @opcode      0x8a
     3509 */
    31563510FNIEMOP_DEF(iemOp_mov_Gb_Eb)
    31573511{
     
    31923546
    31933547
    3194 /** Opcode 0x8b. */
     3548/**
     3549 * @opcode      0x8b
     3550 */
    31953551FNIEMOP_DEF(iemOp_mov_Gv_Ev)
    31963552{
     
    32833639
    32843640
    3285 /** Opcode 0x63. */
     3641/**
     3642 * opcode      0x63
     3643 * @todo Table fixme
     3644 */
    32863645FNIEMOP_DEF(iemOp_arpl_Ew_Gw_movsx_Gv_Ev)
    32873646{
     
    32943653
    32953654
    3296 /** Opcode 0x8c. */
     3655/**
     3656 * @opcode      0x8c
     3657 */
    32973658FNIEMOP_DEF(iemOp_mov_Ev_Sw)
    32983659{
     
    33713732
    33723733
    3373 /** Opcode 0x8d. */
     3734/**
     3735 * @opcode      0x8d
     3736 */
    33743737FNIEMOP_DEF(iemOp_lea_Gv_M)
    33753738{
     
    34193782
    34203783
    3421 /** Opcode 0x8e. */
     3784/**
     3785 * @opcode      0x8e
     3786 */
    34223787FNIEMOP_DEF(iemOp_mov_Sw_Ev)
    34233788{
     
    35713936
    35723937
    3573 /** Opcode 0x8f. */
     3938/**
     3939 * @opcode      0x8f
     3940 */
    35743941FNIEMOP_DEF(iemOp_Grp1A__xop)
    35753942{
     
    36844051
    36854052
    3686 /** Opcode 0x90. */
     4053/**
     4054 * @opcode      0x90
     4055 */
    36874056FNIEMOP_DEF(iemOp_nop)
    36884057{
     
    37054074
    37064075
    3707 /** Opcode 0x91. */
     4076/**
     4077 * @opcode      0x91
     4078 */
    37084079FNIEMOP_DEF(iemOp_xchg_eCX_eAX)
    37094080{
     
    37134084
    37144085
    3715 /** Opcode 0x92. */
     4086/**
     4087 * @opcode      0x92
     4088 */
    37164089FNIEMOP_DEF(iemOp_xchg_eDX_eAX)
    37174090{
     
    37214094
    37224095
    3723 /** Opcode 0x93. */
     4096/**
     4097 * @opcode      0x93
     4098 */
    37244099FNIEMOP_DEF(iemOp_xchg_eBX_eAX)
    37254100{
     
    37294104
    37304105
    3731 /** Opcode 0x94. */
     4106/**
     4107 * @opcode      0x94
     4108 */
    37324109FNIEMOP_DEF(iemOp_xchg_eSP_eAX)
    37334110{
     
    37374114
    37384115
    3739 /** Opcode 0x95. */
     4116/**
     4117 * @opcode      0x95
     4118 */
    37404119FNIEMOP_DEF(iemOp_xchg_eBP_eAX)
    37414120{
     
    37454124
    37464125
    3747 /** Opcode 0x96. */
     4126/**
     4127 * @opcode      0x96
     4128 */
    37484129FNIEMOP_DEF(iemOp_xchg_eSI_eAX)
    37494130{
     
    37534134
    37544135
    3755 /** Opcode 0x97. */
     4136/**
     4137 * @opcode      0x97
     4138 */
    37564139FNIEMOP_DEF(iemOp_xchg_eDI_eAX)
    37574140{
     
    37614144
    37624145
    3763 /** Opcode 0x98. */
     4146/**
     4147 * @opcode      0x98
     4148 */
    37644149FNIEMOP_DEF(iemOp_cbw)
    37654150{
     
    38084193
    38094194
    3810 /** Opcode 0x99. */
     4195/**
     4196 * @opcode      0x99
     4197 */
    38114198FNIEMOP_DEF(iemOp_cwd)
    38124199{
     
    38554242
    38564243
    3857 /** Opcode 0x9a. */
     4244/**
     4245 * @opcode      0x9a
     4246 */
    38584247FNIEMOP_DEF(iemOp_call_Ap)
    38594248{
     
    38884277
    38894278
    3890 /** Opcode 0x9c. */
     4279/**
     4280 * @opcode      0x9c
     4281 */
    38914282FNIEMOP_DEF(iemOp_pushf_Fv)
    38924283{
     
    38974288
    38984289
    3899 /** Opcode 0x9d. */
     4290/**
     4291 * @opcode      0x9d
     4292 */
    39004293FNIEMOP_DEF(iemOp_popf_Fv)
    39014294{
     
    39064299
    39074300
    3908 /** Opcode 0x9e. */
     4301/**
     4302 * @opcode      0x9e
     4303 */
    39094304FNIEMOP_DEF(iemOp_sahf)
    39104305{
     
    39304325
    39314326
    3932 /** Opcode 0x9f. */
     4327/**
     4328 * @opcode      0x9f
     4329 */
    39334330FNIEMOP_DEF(iemOp_lahf)
    39344331{
     
    39494346
    39504347/**
    3951  * Macro used by iemOp_mov_Al_Ob, iemOp_mov_rAX_Ov, iemOp_mov_Ob_AL and
     4348 * Macro used by iemOp_mov_AL_Ob, iemOp_mov_rAX_Ov, iemOp_mov_Ob_AL and
    39524349 * iemOp_mov_Ov_rAX to fetch the moffsXX bit of the opcode and fend of lock
    39534350 * prefixes.  Will return on failures.
     
    39734370    } while (0)
    39744371
    3975 /** Opcode 0xa0. */
    3976 FNIEMOP_DEF(iemOp_mov_Al_Ob)
     4372/**
     4373 * @opcode      0xa0
     4374 */
     4375FNIEMOP_DEF(iemOp_mov_AL_Ob)
    39774376{
    39784377    /*
     
    39954394
    39964395
    3997 /** Opcode 0xa1. */
     4396/**
     4397 * @opcode      0xa1
     4398 */
    39984399FNIEMOP_DEF(iemOp_mov_rAX_Ov)
    39994400{
     
    40424443
    40434444
    4044 /** Opcode 0xa2. */
     4445/**
     4446 * @opcode      0xa2
     4447 */
    40454448FNIEMOP_DEF(iemOp_mov_Ob_AL)
    40464449{
     
    40644467
    40654468
    4066 /** Opcode 0xa3. */
     4469/**
     4470 * @opcode      0xa3
     4471 */
    40674472FNIEMOP_DEF(iemOp_mov_Ov_rAX)
    40684473{
     
    41284533        IEM_MC_END();
    41294534
    4130 /** Opcode 0xa4. */
     4535/**
     4536 * @opcode      0xa4
     4537 */
    41314538FNIEMOP_DEF(iemOp_movsb_Xb_Yb)
    41324539{
     
    41634570
    41644571
    4165 /** Opcode 0xa5. */
     4572/**
     4573 * @opcode      0xa5
     4574 */
    41664575FNIEMOP_DEF(iemOp_movswd_Xv_Yv)
    41674576{
     
    42754684        IEM_MC_END(); \
    42764685
    4277 /** Opcode 0xa6. */
     4686/**
     4687 * @opcode      0xa6
     4688 */
    42784689FNIEMOP_DEF(iemOp_cmpsb_Xb_Yb)
    42794690{
     
    43224733
    43234734
    4324 /** Opcode 0xa7. */
     4735/**
     4736 * @opcode      0xa7
     4737 */
    43254738FNIEMOP_DEF(iemOp_cmpswd_Xv_Yv)
    43264739{
     
    44434856#undef IEM_CMPS_CASE
    44444857
    4445 /** Opcode 0xa8. */
     4858/**
     4859 * @opcode      0xa8
     4860 */
    44464861FNIEMOP_DEF(iemOp_test_AL_Ib)
    44474862{
     
    44524867
    44534868
    4454 /** Opcode 0xa9. */
     4869/**
     4870 * @opcode      0xa9
     4871 */
    44554872FNIEMOP_DEF(iemOp_test_eAX_Iz)
    44564873{
     
    44774894        IEM_MC_END(); \
    44784895
    4479 /** Opcode 0xaa. */
     4896/**
     4897 * @opcode      0xaa
     4898 */
    44804899FNIEMOP_DEF(iemOp_stosb_Yb_AL)
    44814900{
     
    45124931
    45134932
    4514 /** Opcode 0xab. */
     4933/**
     4934 * @opcode      0xab
     4935 */
    45154936FNIEMOP_DEF(iemOp_stoswd_Yv_eAX)
    45164937{
     
    46135034        IEM_MC_END();
    46145035
    4615 /** Opcode 0xac. */
     5036/**
     5037 * @opcode      0xac
     5038 */
    46165039FNIEMOP_DEF(iemOp_lodsb_AL_Xb)
    46175040{
     
    46485071
    46495072
    4650 /** Opcode 0xad. */
     5073/**
     5074 * @opcode      0xad
     5075 */
    46515076FNIEMOP_DEF(iemOp_lodswd_eAX_Xv)
    46525077{
     
    47555180        IEM_MC_END();
    47565181
    4757 /** Opcode 0xae. */
     5182/**
     5183 * @opcode      0xae
     5184 */
    47585185FNIEMOP_DEF(iemOp_scasb_AL_Xb)
    47595186{
     
    48015228
    48025229
    4803 /** Opcode 0xaf. */
     5230/**
     5231 * @opcode      0xaf
     5232 */
    48045233FNIEMOP_DEF(iemOp_scaswd_eAX_Xv)
    48055234{
     
    49375366
    49385367
    4939 /** Opcode 0xb0. */
     5368/**
     5369 * @opcode      0xb0
     5370 */
    49405371FNIEMOP_DEF(iemOp_mov_AL_Ib)
    49415372{
     
    49455376
    49465377
    4947 /** Opcode 0xb1. */
     5378/**
     5379 * @opcode      0xb1
     5380 */
    49485381FNIEMOP_DEF(iemOp_CL_Ib)
    49495382{
     
    49535386
    49545387
    4955 /** Opcode 0xb2. */
     5388/**
     5389 * @opcode      0xb2
     5390 */
    49565391FNIEMOP_DEF(iemOp_DL_Ib)
    49575392{
     
    49615396
    49625397
    4963 /** Opcode 0xb3. */
     5398/**
     5399 * @opcode      0xb3
     5400 */
    49645401FNIEMOP_DEF(iemOp_BL_Ib)
    49655402{
     
    49695406
    49705407
    4971 /** Opcode 0xb4. */
     5408/**
     5409 * @opcode      0xb4
     5410 */
    49725411FNIEMOP_DEF(iemOp_mov_AH_Ib)
    49735412{
     
    49775416
    49785417
    4979 /** Opcode 0xb5. */
     5418/**
     5419 * @opcode      0xb5
     5420 */
    49805421FNIEMOP_DEF(iemOp_CH_Ib)
    49815422{
     
    49855426
    49865427
    4987 /** Opcode 0xb6. */
     5428/**
     5429 * @opcode      0xb6
     5430 */
    49885431FNIEMOP_DEF(iemOp_DH_Ib)
    49895432{
     
    49935436
    49945437
    4995 /** Opcode 0xb7. */
     5438/**
     5439 * @opcode      0xb7
     5440 */
    49965441FNIEMOP_DEF(iemOp_BH_Ib)
    49975442{
     
    50515496
    50525497
    5053 /** Opcode 0xb8. */
     5498/**
     5499 * @opcode      0xb8
     5500 */
    50545501FNIEMOP_DEF(iemOp_eAX_Iv)
    50555502{
     
    50595506
    50605507
    5061 /** Opcode 0xb9. */
     5508/**
     5509 * @opcode      0xb9
     5510 */
    50625511FNIEMOP_DEF(iemOp_eCX_Iv)
    50635512{
     
    50675516
    50685517
    5069 /** Opcode 0xba. */
     5518/**
     5519 * @opcode      0xba
     5520 */
    50705521FNIEMOP_DEF(iemOp_eDX_Iv)
    50715522{
     
    50755526
    50765527
    5077 /** Opcode 0xbb. */
     5528/**
     5529 * @opcode      0xbb
     5530 */
    50785531FNIEMOP_DEF(iemOp_eBX_Iv)
    50795532{
     
    50835536
    50845537
    5085 /** Opcode 0xbc. */
     5538/**
     5539 * @opcode      0xbc
     5540 */
    50865541FNIEMOP_DEF(iemOp_eSP_Iv)
    50875542{
     
    50915546
    50925547
    5093 /** Opcode 0xbd. */
     5548/**
     5549 * @opcode      0xbd
     5550 */
    50945551FNIEMOP_DEF(iemOp_eBP_Iv)
    50955552{
     
    50995556
    51005557
    5101 /** Opcode 0xbe. */
     5558/**
     5559 * @opcode      0xbe
     5560 */
    51025561FNIEMOP_DEF(iemOp_eSI_Iv)
    51035562{
     
    51075566
    51085567
    5109 /** Opcode 0xbf. */
     5568/**
     5569 * @opcode      0xbf
     5570 */
    51105571FNIEMOP_DEF(iemOp_eDI_Iv)
    51115572{
     
    51155576
    51165577
    5117 /** Opcode 0xc0. */
     5578/**
     5579 * @opcode      0xc0
     5580 */
    51185581FNIEMOP_DEF(iemOp_Grp2_Eb_Ib)
    51195582{
     
    51765639
    51775640
    5178 /** Opcode 0xc1. */
     5641/**
     5642 * @opcode      0xc1
     5643 */
    51795644FNIEMOP_DEF(iemOp_Grp2_Ev_Ib)
    51805645{
     
    53175782
    53185783
    5319 /** Opcode 0xc2. */
     5784/**
     5785 * @opcode      0xc2
     5786 */
    53205787FNIEMOP_DEF(iemOp_retn_Iw)
    53215788{
     
    53285795
    53295796
    5330 /** Opcode 0xc3. */
     5797/**
     5798 * @opcode      0xc3
     5799 */
    53315800FNIEMOP_DEF(iemOp_retn)
    53325801{
     
    53385807
    53395808
    5340 /** Opcode 0xc4. */
     5809/**
     5810 * @opcode      0xc4
     5811 */
    53415812FNIEMOP_DEF(iemOp_les_Gv_Mp__vex2)
    53425813{
     
    53815852
    53825853
    5383 /** Opcode 0xc5. */
     5854/**
     5855 * @opcode      0xc5
     5856 */
    53845857FNIEMOP_DEF(iemOp_lds_Gv_Mp__vex3)
    53855858{
     
    54505923
    54515924
    5452 /** Opcode 0xc6. */
     5925/**
     5926 * @opcode      0xc6
     5927 */
    54535928FNIEMOP_DEF(iemOp_Grp11_Eb_Ib)
    54545929{
     
    54845959
    54855960
    5486 /** Opcode 0xc7. */
     5961/**
     5962 * @opcode      0xc7
     5963 */
    54875964FNIEMOP_DEF(iemOp_Grp11_Ev_Iz)
    54885965{
     
    55736050
    55746051
    5575 /** Opcode 0xc8. */
     6052/**
     6053 * @opcode      0xc8
     6054 */
    55766055FNIEMOP_DEF(iemOp_enter_Iw_Ib)
    55776056{
     
    55866065
    55876066
    5588 /** Opcode 0xc9. */
     6067/**
     6068 * @opcode      0xc9
     6069 */
    55896070FNIEMOP_DEF(iemOp_leave)
    55906071{
     
    55976078
    55986079
    5599 /** Opcode 0xca. */
     6080/**
     6081 * @opcode      0xca
     6082 */
    56006083FNIEMOP_DEF(iemOp_retf_Iw)
    56016084{
     
    56086091
    56096092
    5610 /** Opcode 0xcb. */
     6093/**
     6094 * @opcode      0xcb
     6095 */
    56116096FNIEMOP_DEF(iemOp_retf)
    56126097{
     
    56186103
    56196104
    5620 /** Opcode 0xcc. */
    5621 FNIEMOP_DEF(iemOp_int_3)
     6105/**
     6106 * @opcode      0xcc
     6107 */
     6108FNIEMOP_DEF(iemOp_int3)
    56226109{
    56236110    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     
    56266113
    56276114
    5628 /** Opcode 0xcd. */
     6115/**
     6116 * @opcode      0xcd
     6117 */
    56296118FNIEMOP_DEF(iemOp_int_Ib)
    56306119{
     
    56356124
    56366125
    5637 /** Opcode 0xce. */
     6126/**
     6127 * @opcode      0xce
     6128 */
    56386129FNIEMOP_DEF(iemOp_into)
    56396130{
     
    56506141
    56516142
    5652 /** Opcode 0xcf. */
     6143/**
     6144 * @opcode      0xcf
     6145 */
    56536146FNIEMOP_DEF(iemOp_iret)
    56546147{
     
    56596152
    56606153
    5661 /** Opcode 0xd0. */
     6154/**
     6155 * @opcode      0xd0
     6156 */
    56626157FNIEMOP_DEF(iemOp_Grp2_Eb_1)
    56636158{
     
    57176212
    57186213
    5719 /** Opcode 0xd1. */
     6214/**
     6215 * @opcode      0xd1
     6216 */
    57206217FNIEMOP_DEF(iemOp_Grp2_Ev_1)
    57216218{
     
    58506347
    58516348
    5852 /** Opcode 0xd2. */
     6349/**
     6350 * @opcode      0xd2
     6351 */
    58536352FNIEMOP_DEF(iemOp_Grp2_Eb_CL)
    58546353{
     
    59096408
    59106409
    5911 /** Opcode 0xd3. */
     6410/**
     6411 * @opcode      0xd3
     6412 */
    59126413FNIEMOP_DEF(iemOp_Grp2_Ev_CL)
    59136414{
     
    60476548}
    60486549
    6049 /** Opcode 0xd4. */
     6550/**
     6551 * @opcode      0xd4
     6552 */
    60506553FNIEMOP_DEF(iemOp_aam_Ib)
    60516554{
     
    60606563
    60616564
    6062 /** Opcode 0xd5. */
     6565/**
     6566 * @opcode      0xd5
     6567 */
    60636568FNIEMOP_DEF(iemOp_aad_Ib)
    60646569{
     
    60716576
    60726577
    6073 /** Opcode 0xd6. */
     6578/**
     6579 * @opcode      0xd6
     6580 */
    60746581FNIEMOP_DEF(iemOp_salc)
    60756582{
     
    60926599
    60936600
    6094 /** Opcode 0xd7. */
     6601/**
     6602 * @opcode      0xd7
     6603 */
    60956604FNIEMOP_DEF(iemOp_xlat)
    60966605{
     
    64536962
    64546963
    6455 /** Opcode 0xd8. */
     6964/**
     6965 * @opcode      0xd8
     6966 */
    64566967FNIEMOP_DEF(iemOp_EscF0)
    64576968{
     
    72397750
    72407751
    7241 /** Opcode 0xd9. */
     7752/**
     7753 * @opcode      0xd9
     7754 */
    72427755FNIEMOP_DEF(iemOp_EscF1)
    72437756{
     
    75898102
    75908103
    7591 /** Opcode 0xda. */
     8104/**
     8105 * @opcode      0xda
     8106 */
    75928107FNIEMOP_DEF(iemOp_EscF2)
    75938108{
     
    80498564
    80508565
    8051 /** Opcode 0xdb. */
     8566/**
     8567 * @opcode      0xdb
     8568 */
    80528569FNIEMOP_DEF(iemOp_EscF3)
    80538570{
     
    83338850
    83348851
    8335 /** Opcode 0xdc. */
     8852/**
     8853 * @opcode      0xdc
     8854 */
    83368855FNIEMOP_DEF(iemOp_EscF4)
    83378856{
     
    86439162
    86449163
    8645 /** Opcode 0xdd. */
     9164/**
     9165 * @opcode      0xdd
     9166 */
    86469167FNIEMOP_DEF(iemOp_EscF5)
    86479168{
     
    88909411
    88919412
    8892 /** Opcode 0xde. */
     9413/**
     9414 * @opcode      0xde
     9415 */
    88939416FNIEMOP_DEF(iemOp_EscF6)
    88949417{
     
    92059728
    92069729
    9207 /** Opcode 0xdf. */
     9730/**
     9731 * @opcode      0xdf
     9732 */
    92089733FNIEMOP_DEF(iemOp_EscF7)
    92099734{
     
    92449769
    92459770
    9246 /** Opcode 0xe0. */
     9771/**
     9772 * @opcode      0xe0
     9773 */
    92479774FNIEMOP_DEF(iemOp_loopne_Jb)
    92489775{
     
    92929819
    92939820
    9294 /** Opcode 0xe1. */
     9821/**
     9822 * @opcode      0xe1
     9823 */
    92959824FNIEMOP_DEF(iemOp_loope_Jb)
    92969825{
     
    93409869
    93419870
    9342 /** Opcode 0xe2. */
     9871/**
     9872 * @opcode      0xe2
     9873 */
    93439874FNIEMOP_DEF(iemOp_loop_Jb)
    93449875{
     
    94159946
    94169947
    9417 /** Opcode 0xe3. */
     9948/**
     9949 * @opcode      0xe3
     9950 */
    94189951FNIEMOP_DEF(iemOp_jecxz_Jb)
    94199952{
     
    950010033
    950110034
    9502 /** Opcode 0xe8. */
     10035/**
     10036 * @opcode      0xe8
     10037 */
    950310038FNIEMOP_DEF(iemOp_call_Jv)
    950410039{
     
    953010065
    953110066
    9532 /** Opcode 0xe9. */
     10067/**
     10068 * @opcode      0xe9
     10069 */
    953310070FNIEMOP_DEF(iemOp_jmp_Jv)
    953410071{
     
    956110098
    956210099
    9563 /** Opcode 0xea. */
     10100/**
     10101 * @opcode      0xea
     10102 */
    956410103FNIEMOP_DEF(iemOp_jmp_Ap)
    956510104{
     
    957910118
    958010119
    9581 /** Opcode 0xeb. */
     10120/**
     10121 * @opcode      0xeb
     10122 */
    958210123FNIEMOP_DEF(iemOp_jmp_Jb)
    958310124{
     
    963010171
    963110172
    9632 /** Opcode 0xf0. */
     10173/**
     10174 * @opcode      0xf0
     10175 */
    963310176FNIEMOP_DEF(iemOp_lock)
    963410177{
     
    964110184
    964210185
    9643 /** Opcode 0xf1. */
    9644 FNIEMOP_DEF(iemOp_int_1)
     10186/**
     10187 * @opcode      0xf1
     10188 */
     10189FNIEMOP_DEF(iemOp_int1)
    964510190{
    964610191    IEMOP_MNEMONIC(int1, "int1"); /* icebp */
     
    965110196
    965210197
    9653 /** Opcode 0xf2. */
     10198/**
     10199 * @opcode      0xf2
     10200 */
    965410201FNIEMOP_DEF(iemOp_repne)
    965510202{
     
    966810215
    966910216
    9670 /** Opcode 0xf3. */
     10217/**
     10218 * @opcode      0xf3
     10219 */
    967110220FNIEMOP_DEF(iemOp_repe)
    967210221{
     
    968510234
    968610235
    9687 /** Opcode 0xf4. */
     10236/**
     10237 * @opcode      0xf4
     10238 */
    968810239FNIEMOP_DEF(iemOp_hlt)
    968910240{
     
    969310244
    969410245
    9695 /** Opcode 0xf5. */
     10246/**
     10247 * @opcode      0xf5
     10248 */
    969610249FNIEMOP_DEF(iemOp_cmc)
    969710250{
     
    1025710810}
    1025810811
    10259 /** Opcode 0xf6. */
     10812/**
     10813 * @opcode      0xf6
     10814 */
    1026010815FNIEMOP_DEF(iemOp_Grp3_Eb)
    1026110816{
     
    1029510850
    1029610851
    10297 /** Opcode 0xf7. */
     10852/**
     10853 * @opcode      0xf7
     10854 */
    1029810855FNIEMOP_DEF(iemOp_Grp3_Ev)
    1029910856{
     
    1033310890
    1033410891
    10335 /** Opcode 0xf8. */
     10892/**
     10893 * @opcode      0xf8
     10894 */
    1033610895FNIEMOP_DEF(iemOp_clc)
    1033710896{
     
    1034610905
    1034710906
    10348 /** Opcode 0xf9. */
     10907/**
     10908 * @opcode      0xf9
     10909 */
    1034910910FNIEMOP_DEF(iemOp_stc)
    1035010911{
     
    1035910920
    1036010921
    10361 /** Opcode 0xfa. */
     10922/**
     10923 * @opcode      0xfa
     10924 */
    1036210925FNIEMOP_DEF(iemOp_cli)
    1036310926{
     
    1037610939
    1037710940
    10378 /** Opcode 0xfc. */
     10941/**
     10942 * @opcode      0xfc
     10943 */
    1037910944FNIEMOP_DEF(iemOp_cld)
    1038010945{
     
    1038910954
    1039010955
    10391 /** Opcode 0xfd. */
     10956/**
     10957 * @opcode      0xfd
     10958 */
    1039210959FNIEMOP_DEF(iemOp_std)
    1039310960{
     
    1040210969
    1040310970
    10404 /** Opcode 0xfe. */
     10971/**
     10972 * @opcode      0xfe
     10973 */
    1040510974FNIEMOP_DEF(iemOp_Grp4)
    1040610975{
     
    1073911308
    1074011309
    10741 /** Opcode 0xff. */
     11310/**
     11311 * @opcode      0xff
     11312 */
    1074211313FNIEMOP_DEF(iemOp_Grp5)
    1074311314{
     
    1081211383    /* 0x98 */  iemOp_cbw,              iemOp_cwd,              iemOp_call_Ap,          iemOp_wait,
    1081311384    /* 0x9c */  iemOp_pushf_Fv,         iemOp_popf_Fv,          iemOp_sahf,             iemOp_lahf,
    10814     /* 0xa0 */  iemOp_mov_Al_Ob,        iemOp_mov_rAX_Ov,       iemOp_mov_Ob_AL,        iemOp_mov_Ov_rAX,
     11385    /* 0xa0 */  iemOp_mov_AL_Ob,        iemOp_mov_rAX_Ov,       iemOp_mov_Ob_AL,        iemOp_mov_Ov_rAX,
    1081511386    /* 0xa4 */  iemOp_movsb_Xb_Yb,      iemOp_movswd_Xv_Yv,     iemOp_cmpsb_Xb_Yb,      iemOp_cmpswd_Xv_Yv,
    1081611387    /* 0xa8 */  iemOp_test_AL_Ib,       iemOp_test_eAX_Iz,      iemOp_stosb_Yb_AL,      iemOp_stoswd_Yv_eAX,
     
    1082311394    /* 0xc4 */  iemOp_les_Gv_Mp__vex2,  iemOp_lds_Gv_Mp__vex3,  iemOp_Grp11_Eb_Ib,      iemOp_Grp11_Ev_Iz,
    1082411395    /* 0xc8 */  iemOp_enter_Iw_Ib,      iemOp_leave,            iemOp_retf_Iw,          iemOp_retf,
    10825     /* 0xcc */  iemOp_int_3,            iemOp_int_Ib,           iemOp_into,             iemOp_iret,
     11396    /* 0xcc */  iemOp_int3,             iemOp_int_Ib,           iemOp_into,             iemOp_iret,
    1082611397    /* 0xd0 */  iemOp_Grp2_Eb_1,        iemOp_Grp2_Ev_1,        iemOp_Grp2_Eb_CL,       iemOp_Grp2_Ev_CL,
    1082711398    /* 0xd4 */  iemOp_aam_Ib,           iemOp_aad_Ib,           iemOp_salc,             iemOp_xlat,
     
    1083211403    /* 0xe8 */  iemOp_call_Jv,          iemOp_jmp_Jv,           iemOp_jmp_Ap,           iemOp_jmp_Jb,
    1083311404    /* 0xec */  iemOp_in_AL_DX,         iemOp_eAX_DX,           iemOp_out_DX_AL,        iemOp_out_DX_eAX,
    10834     /* 0xf0 */  iemOp_lock,             iemOp_int_1,            iemOp_repne,            iemOp_repe,
     11405    /* 0xf0 */  iemOp_lock,             iemOp_int1,             iemOp_repne,            iemOp_repe,
    1083511406    /* 0xf4 */  iemOp_hlt,              iemOp_cmc,              iemOp_Grp3_Eb,          iemOp_Grp3_Ev,
    1083611407    /* 0xf8 */  iemOp_clc,              iemOp_stc,              iemOp_cli,              iemOp_sti,
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r65869 r65876  
    7474};
    7575
     76## \@op[1-4] locations
     77g_kdOpLocations = {
     78    'reg':      [], ## modrm.reg
     79    'rm':       [], ## modrm.rm
     80    'imm':      [], ## immediate instruction data
     81    'vvvv':     [], ## VEX.vvvv
     82
     83    # fixed registers.
     84    'AL':       [],
     85    'rAX':      [],
     86    'rSI':      [],
     87    'rDI':      [],
     88    'rFLAGS':   [],
     89    'CS':       [],
     90    'DS':       [],
     91    'ES':       [],
     92    'FS':       [],
     93    'GS':       [],
     94    'SS':       [],
     95};
     96
     97## \@op[1-4] types
     98##
     99## First value entry is the normal IDX_ParseXXX handler (IDX_UseModRM == IDX_ParseModRM).
     100## Second value entry is the location (g_kdOpLocations).
     101## Third value entry is disassembler format string version of the type.
     102##
     103## Note! See the A.2.1 in SDM vol 2 for the type names.
     104g_kdOpTypes = {
     105    # Fixed addresses
     106    'Ap':   ( 'IDX_ParseImmAddrF',  'imm', '%Ap',  ),
     107
     108    # ModR/M.rm
     109    'Eb':   ( 'IDX_UseModRM',       'rm',  '%Eb',  ),
     110    'Ew':   ( 'IDX_UseModRM',       'rm',  '%Ew',  ),
     111    'Ev':   ( 'IDX_UseModRM',       'rm',  '%Ev',  ),
     112
     113    # ModR/M.rm - memory only.
     114    'Ma':   ( 'IDX_UseModRM',        'rm', '%Ma',  ), ##< Only used by BOUND.
     115
     116    # ModR/M.reg
     117    'Gb':   ( 'IDX_UseModRM',       'reg', '%Gb',  ),
     118    'Gw':   ( 'IDX_UseModRM',       'reg', '%Gw',  ),
     119    'Gv':   ( 'IDX_UseModRM',       'reg', '%Gv',  ),
     120
     121    # Immediate values.
     122    'Ib':   ( 'IDX_ParseImmByte',   'imm', '%Ib',  ), ##< NB! Could be IDX_ParseImmByteSX for some instructions.
     123    'Iw':   ( 'IDX_ParseImmUshort', 'imm', '%Iw',  ),
     124    'Id':   ( 'IDX_ParseImmUlong',  'imm', '%Id',  ),
     125    'Iq':   ( 'IDX_ParseImmQword',  'imm', '%Iq',  ),
     126    'Iv':   ( 'IDX_ParseImmV',      'imm', '%Iv',  ), ##< o16: word, o32: dword, o64: qword
     127    'Iz':   ( 'IDX_ParseImmZ',      'imm', '%Iz',  ), ##< o16: word, o32|o64:dword
     128
     129    # Address operands (no ModR/M).
     130    'Ob':   ( 'IDX_ParseImmAddr',   'imm', '%Ob',  ),
     131    'Ov':   ( 'IDX_ParseImmAddr',   'imm', '%Ov',  ),
     132
     133    # Relative jump targets
     134    'Jb':   ( 'IDX_ParseImmBRel',   'imm', '%Jb',  ),
     135    'Jv':   ( 'IDX_ParseImmVRel',   'imm', '%Jv',  ),
     136
     137    # DS:rSI
     138    'Xb':   ( 'IDX_ParseXb',        'rSI', '%eSI', ),
     139    'Xv':   ( 'IDX_ParseXv',        'rSI', '%eSI', ),
     140    # ES:rDI
     141    'Yb':   ( 'IDX_ParseYb',        'rDI', '%eDI', ),
     142    'Yv':   ( 'IDX_ParseYv',        'rDI', '%eDI', ),
     143
     144    'Fv':   ( 'IDX_ParseFixedReg',  'rFLAGS', '%Fv', ),
     145
     146    # Fixed registers.
     147    'AL':   ( 'IDX_ParseFixedReg',  'AL',  'al'   ),
     148    'rAX':  ( 'IDX_ParseFixedReg',  'rAX', '%eAX', ),
     149    'CS':   ( 'IDX_ParseFixedReg',  'CS',  'cs'   ), # 8086: push CS
     150    'DS':   ( 'IDX_ParseFixedReg',  'DS',  'ds'   ),
     151    'ES':   ( 'IDX_ParseFixedReg',  'ES',  'es'   ),
     152    'FS':   ( 'IDX_ParseFixedReg',  'FS',  'fs'   ),
     153    'GS':   ( 'IDX_ParseFixedReg',  'GS',  'gs'   ),
     154    'SS':   ( 'IDX_ParseFixedReg',  'SS',  'ss'   ),
     155};
     156
     157# IDX_ParseFixedReg
     158# IDX_ParseVexDest
     159
     160
     161## IEMFORM_XXX mappings.
     162g_kdIemForms = { # sEncoding,    [sWhere,]
     163    'RM':       ( 'ModR/M',     [ 'reg', 'rm' ], ),
     164    'RM_REG':   ( 'ModR/M',     [ 'reg', 'rm' ], ),
     165    'RM_MEM':   ( 'ModR/M',     [ 'reg', 'rm' ], ),
     166    'MR':       ( 'ModR/M',     [ 'rm', 'reg' ], ),
     167    'MR_REG':   ( 'ModR/M',     [ 'rm', 'reg' ], ),
     168    'MR_MEM':   ( 'ModR/M',     [ 'rm', 'reg' ], ),
     169    'M':        ( 'ModR/M',     [ 'rm', ], ),
     170    'M_REG':    ( 'ModR/M',     [ 'rm', ], ),
     171    'M_MEM':    ( 'ModR/M',     [ 'rm', ], ),
     172    'R':        ( 'ModR/M',     [ 'reg', ], ),
     173    'RVM':      ( 'ModR/M+VEX', [ 'reg', 'vvvv', 'rm'], ),
     174    'MVR':      ( 'ModR/M+VEX', [ 'rm', 'vvvv', 'reg'], ),
     175    'FIXED':    ( 'fixed',      None, )
     176};
     177
     178## \@oppfx values.
     179g_kdPrefixes = {
     180    '0x66': [],
     181    '0xf3': [],
     182    '0xf2': [],
     183};
     184
     185## Special \@opcode tag values.
     186g_kdSpecialOpcodes = {
     187    '/reg':         [],
     188    'mr/reg':       [],
     189    '11 /reg':      [],
     190    '!11 /reg':     [],
     191    '11 mr/reg':    [],
     192    '!11 mr/reg':   [],
     193};
     194
     195## Valid values for \@openc
     196g_kdEncodings = {
     197    'ModR/M': [],       ##< ModR/M
     198    'fixed':  [],       ##< Fixed encoding (address, registers, etc).
     199    'prefix': [],       ##< Prefix
     200};
     201
     202## \@opunused, \@opinvalid, \@opinvlstyle
     203g_kdInvalidStyles = {
     204    'immediate':                [], ##< CPU stops decoding immediately after the opcode.
     205    'intel-modrm':              [], ##< Intel decodes ModR/M.
     206    'intel-modrm-imm8':         [], ##< Intel decodes ModR/M and an 8-byte immediate.
     207    'intel-opcode-modrm':       [], ##< Intel decodes another opcode byte followed by ModR/M. (Unused extension tables.)
     208    'intel-opcode-modrm-imm8':  [], ##< Intel decodes another opcode byte followed by ModR/M and an 8-byte immediate.
     209};
     210
     211g_kdCpuNames = {
     212    '8086':     (),
     213    '80186':    (),
     214    '80286':    (),
     215    '80386':    (),
     216    '80486':    (),
     217};
     218
     219## \@opcpuid
     220g_kdCpuIdFlags = {
     221    'vme':      'X86_CPUID_FEATURE_EDX_VME',
     222    'tsc':      'X86_CPUID_FEATURE_EDX_TSC',
     223    'msr':      'X86_CPUID_FEATURE_EDX_MSR',
     224    'cx8':      'X86_CPUID_FEATURE_EDX_CX8',
     225    'sep':      'X86_CPUID_FEATURE_EDX_SEP',
     226    'cmov':     'X86_CPUID_FEATURE_EDX_CMOV',
     227    'clfsh':    'X86_CPUID_FEATURE_EDX_CLFSH',
     228    'mmx':      'X86_CPUID_FEATURE_EDX_MMX',
     229    'fxsr':     'X86_CPUID_FEATURE_EDX_FXSR',
     230    'sse':      'X86_CPUID_FEATURE_EDX_SSE',
     231    'sse2':     'X86_CPUID_FEATURE_EDX_SSE2',
     232    'sse3':     'X86_CPUID_FEATURE_ECX_SSE3',
     233    'pclmul':   'X86_CPUID_FEATURE_ECX_DTES64',
     234    'monitor':  'X86_CPUID_FEATURE_ECX_CPLDS',
     235    'vmx':      'X86_CPUID_FEATURE_ECX_VMX',
     236    'smx':      'X86_CPUID_FEATURE_ECX_TM2',
     237    'ssse3':    'X86_CPUID_FEATURE_ECX_SSSE3',
     238    'fma':      'X86_CPUID_FEATURE_ECX_FMA',
     239    'cx16':     'X86_CPUID_FEATURE_ECX_CX16',
     240    'pcid':     'X86_CPUID_FEATURE_ECX_PCID',
     241    'sse41':    'X86_CPUID_FEATURE_ECX_SSE4_1',
     242    'sse42':    'X86_CPUID_FEATURE_ECX_SSE4_2',
     243    'movbe':    'X86_CPUID_FEATURE_ECX_MOVBE',
     244    'popcnt':   'X86_CPUID_FEATURE_ECX_POPCNT',
     245    'aes':      'X86_CPUID_FEATURE_ECX_AES',
     246    'xsave':    'X86_CPUID_FEATURE_ECX_XSAVE',
     247    'avx':      'X86_CPUID_FEATURE_ECX_AVX',
     248    'f16c':     'X86_CPUID_FEATURE_ECX_F16C',
     249    'rdrand':   'X86_CPUID_FEATURE_ECX_RDRAND',
     250
     251    'axmmx':    'X86_CPUID_AMD_FEATURE_EDX_AXMMX',
     252    '3dnowext': 'X86_CPUID_AMD_FEATURE_EDX_3DNOW_EX',
     253    '3dnow':    'X86_CPUID_AMD_FEATURE_EDX_3DNOW',
     254    'svm':      'X86_CPUID_AMD_FEATURE_ECX_SVM',
     255    'cr8l':     'X86_CPUID_AMD_FEATURE_ECX_CR8L',
     256    'abm':      'X86_CPUID_AMD_FEATURE_ECX_ABM',
     257    'sse4a':    'X86_CPUID_AMD_FEATURE_ECX_SSE4A',
     258    '3dnowprf': 'X86_CPUID_AMD_FEATURE_ECX_3DNOWPRF',
     259    'xop':      'X86_CPUID_AMD_FEATURE_ECX_XOP',
     260    'fma4':     'X86_CPUID_AMD_FEATURE_ECX_FMA4',
     261};
     262
     263## \@ophints values.
     264g_kdHints = {
     265    'invalid':               'DISOPTYPE_INVALID',               ##<
     266    'harmless':              'DISOPTYPE_HARMLESS',              ##<
     267    'controlflow':           'DISOPTYPE_CONTROLFLOW',           ##<
     268    'potentially_dangerous': 'DISOPTYPE_POTENTIALLY_DANGEROUS', ##<
     269    'dangerous':             'DISOPTYPE_DANGEROUS',             ##<
     270    'portio':                'DISOPTYPE_PORTIO',                ##<
     271    'privileged':            'DISOPTYPE_PRIVILEGED',            ##<
     272    'privileged_notrap':     'DISOPTYPE_PRIVILEGED_NOTRAP',     ##<
     273    'uncond_controlflow':    'DISOPTYPE_UNCOND_CONTROLFLOW',    ##<
     274    'relative_controlflow':  'DISOPTYPE_RELATIVE_CONTROLFLOW',  ##<
     275    'cond_controlflow':      'DISOPTYPE_COND_CONTROLFLOW',      ##<
     276    'interrupt':             'DISOPTYPE_INTERRUPT',             ##<
     277    'illegal':               'DISOPTYPE_ILLEGAL',               ##<
     278    'rrm_dangerous':         'DISOPTYPE_RRM_DANGEROUS',         ##< Some additional dangerous ones when recompiling raw r0. */
     279    'rrm_dangerous_16':      'DISOPTYPE_RRM_DANGEROUS_16',      ##< Some additional dangerous ones when recompiling 16-bit raw r0. */
     280    'inhibit_irqs':          'DISOPTYPE_INHIBIT_IRQS',          ##< Will or can inhibit irqs (sti, pop ss, mov ss) */
     281    'portio_read':           'DISOPTYPE_PORTIO_READ',           ##<
     282    'portio_write':          'DISOPTYPE_PORTIO_WRITE',          ##<
     283    'invalid_64':            'DISOPTYPE_INVALID_64',            ##< Invalid in 64 bits mode */
     284    'only_64':               'DISOPTYPE_ONLY_64',               ##< Only valid in 64 bits mode */
     285    'default_64_op_size':    'DISOPTYPE_DEFAULT_64_OP_SIZE',    ##< Default 64 bits operand size */
     286    'forced_64_op_size':     'DISOPTYPE_FORCED_64_OP_SIZE',     ##< Forced 64 bits operand size; regardless of prefix bytes */
     287    'rexb_extends_opreg':    'DISOPTYPE_REXB_EXTENDS_OPREG',    ##< REX.B extends the register field in the opcode byte */
     288    'mod_fixed_11':          'DISOPTYPE_MOD_FIXED_11',          ##< modrm.mod is always 11b */
     289    'forced_32_op_size_x86': 'DISOPTYPE_FORCED_32_OP_SIZE_X86', ##< Forced 32 bits operand size; regardless of prefix bytes (only in 16 & 32 bits mode!) */
     290    'sse':                   'DISOPTYPE_SSE',                   ##< SSE,SSE2,SSE3,AVX,++ instruction. Not implemented yet! */
     291    'mmx':                   'DISOPTYPE_MMX',                   ##< MMX,MMXExt,3DNow,++ instruction. Not implemented yet! */
     292    'fpu':                   'DISOPTYPE_FPU',                   ##< FPU instruction. Not implemented yet! */
     293    'ignores_op_size':       '',                                ##< Ignores both operand size prefixes.
     294};
     295
    76296
    77297def _isValidOpcodeByte(sOpcode):
     
    197417                if oExisting is None:
    198418                    aoTable[idxOpcode] = oInstr;
    199                 elif not isinstance(oInstance, list):
    200                     aoTable[idxOpcode] = list(oExisting, oInstr);
     419                elif not isinstance(oExisting, list):
     420                    aoTable[idxOpcode] = list([oExisting, oInstr]);
    201421                else:
    202422                    oExisting.append(oInstr);
     
    606826    """
    607827
    608     ## \@op[1-4]
    609     kdLocations = {
    610         'reg':  [], ## modrm.reg
    611         'rm':   [], ## modrm.rm
    612     };
    613 
    614     ## \@op[1-4]
    615     ## First value entry is the normal IDX_ParseXXX handler (IDX_UseModRM == IDX_ParseModRM).
    616     ## Note! See the A.2.1 in SDM vol 2 for the type names.
    617     kdTypes = {
    618         # Fixed addresses
    619         'Ap':   ( 'IDX_ParseImmAddrF',  ),
    620 
    621         # ModR/M.rm
    622         'Eb':   ( 'IDX_UseModRM',       ),
    623         'Ev':   ( 'IDX_UseModRM',       ),
    624 
    625         # ModR/M.reg
    626         'Gb':   ( 'IDX_UseModRM',       ),
    627         'Gv':   ( 'IDX_UseModRM',       ),
    628 
    629         # Immediate values.
    630         'Ib':   ( 'IDX_ParseImmByte',   ), ##< NB! Could be IDX_ParseImmByteSX for some instructions.
    631         'Iw':   ( 'IDX_ParseImmUshort', ),
    632         'Id':   ( 'IDX_ParseImmUlong',  ),
    633         'Iq':   ( 'IDX_ParseImmQword',  ),
    634         'Iv':   ( 'IDX_ParseImmV',      ), ##< o16: word, o32: dword, o64: qword
    635         'Iz':   ( 'IDX_ParseImmZ',      ), ##< o16: word, o32|o64:dword
    636 
    637         # Address operands (no ModR/M).
    638         'Ob':   ( 'IDX_ParseImmAddr',   ),
    639         'Ov':   ( 'IDX_ParseImmAddr',   ),
    640 
    641         # Relative jump targets
    642         'Jb':   ( 'IDX_ParseImmBRel',   ),
    643         'Jv':   ( 'IDX_ParseImmVRel',   ),
    644 
    645         # DS:rSI
    646         'Xb':   ( 'IDX_ParseXb',        ),
    647         'Xv':   ( 'IDX_ParseXv',        ),
    648         # ES:rDI
    649         'Yb':   ( 'IDX_ParseYb',        ),
    650         'Yv':   ( 'IDX_ParseYv',        ),
    651 
    652     };
    653 
    654     # IDX_ParseFixedReg
    655     # IDX_ParseVexDest
    656 
    657828    def __init__(self, sWhere, sType):
    658         assert sWhere in self.kdLocations;
    659         assert sType  in self.kdTypes;
    660         self.sWhere = sWhere;           ##< kdLocations
    661         self.sType  = sType;            ##< kdTypes
     829        assert sWhere in g_kdOpLocations, sWhere;
     830        assert sType  in g_kdOpTypes, sType;
     831        self.sWhere = sWhere;           ##< g_kdOpLocations
     832        self.sType  = sType;            ##< g_kdOpTypes
    662833
    663834    def usesModRM(self):
    664835        """ Returns True if using some form of ModR/M encoding. """
    665         return self.sType[0] in ['E', 'G'];
     836        return self.sType[0] in ['E', 'G', 'M'];
    666837
    667838
     
    693864        self.asReqFeatures  = [];       ##< Which features are required to be enabled to run this instruction.
    694865        self.aoTests        = [];       # type: list(InstructionTest)
    695         self.oCpus          = None;     ##< Some CPU restriction expression...
     866        self.sMinCpu        = None;     ##< Indicates the minimum CPU required for the instruction. Not set when oCpuExpr is.
     867        self.oCpuExpr       = None;     ##< Some CPU restriction expression...
    696868        self.sGroup         = None;
    697869        self.fUnused        = False;    ##< Unused instruction.
     
    714886        self.iLineCompleted = None;
    715887        self.cOpTags        = 0;
     888        self.iLineFnIemOpMacro  = -1;
     889        self.iLineMnemonicMacro = -1;
    716890        ## @}
    717891
     
    723897        self.sRawOldOpcodes = None;
    724898        ## @}
     899
     900    def toString(self, fRepr = False):
     901        """ Turn object into a string. """
     902        aasFields = [];
     903
     904        aasFields.append(['opcode',    self.sOpcode]);
     905        aasFields.append(['mnemonic',  self.sMnemonic]);
     906        for iOperand, oOperand in enumerate(self.aoOperands):
     907            aasFields.append(['op%u' % (iOperand + 1,), '%s:%s' % (oOperand.sWhere, oOperand.sType,)]);
     908        if self.aoMaps:         aasFields.append(['maps', ','.join([oMap.sName for oMap in self.aoMaps])]);
     909        aasFields.append(['encoding',  self.sEncoding]);
     910        if self.dHints:         aasFields.append(['hints', ','.join(self.dHints.keys())]);
     911        aasFields.append(['disenum',   self.sDisEnum]);
     912        if self.asCpuIds:       aasFields.append(['cpuid', ','.join(self.asCpuIds)]);
     913        aasFields.append(['group',     self.sGroup]);
     914        if self.fUnused:        aasFields.append(['unused', 'True']);
     915        if self.fInvalid:       aasFields.append(['invalid', 'True']);
     916        aasFields.append(['invlstyle', self.sInvalidStyle]);
     917        aasFields.append(['fltest',    self.asFlTest]);
     918        aasFields.append(['flmodify',  self.asFlModify]);
     919        aasFields.append(['flundef',   self.asFlUndefined]);
     920        aasFields.append(['flset',     self.asFlSet]);
     921        aasFields.append(['flclear',   self.asFlClear]);
     922        aasFields.append(['mincpu',    self.sMinCpu]);
     923        aasFields.append(['stats',     self.sStats]);
     924        aasFields.append(['sFunction', self.sFunction]);
     925        if self.fStub:          aasFields.append(['fStub', 'True']);
     926        if self.fUdStub:        aasFields.append(['fUdStub', 'True']);
     927        if self.cOpTags:        aasFields.append(['optags', str(self.cOpTags)]);
     928        if self.iLineFnIemOpMacro  != -1: aasFields.append(['FNIEMOP_XXX', str(self.iLineFnIemOpMacro)]);
     929        if self.iLineMnemonicMacro != -1: aasFields.append(['IEMOP_MNEMMONICn', str(self.iLineMnemonicMacro)]);
     930
     931        sRet = '<' if fRepr else '';
     932        for sField, sValue in aasFields:
     933            if sValue != None:
     934                if len(sRet) > 1:
     935                    sRet += '; ';
     936                sRet += '%s=%s' % (sField, sValue,);
     937        if fRepr:
     938            sRet += '>';
     939
     940        return sRet;
     941
     942    def __str__(self):
     943        """ Provide string represenation. """
     944        return self.toString(False);
     945
     946    def __repr__(self):
     947        """ Provide unambigious string representation. """
     948        return self.toString(True);
    725949
    726950    def getOpcodeByte(self):
     
    8351059        self.sComment       = '';
    8361060        self.iCommentLine   = 0;
    837         self.asCurInstr     = [];
     1061        self.aoCurInstrs    = [];
    8381062
    8391063        assert sDefaultMap in g_dInstructionMaps;
     
    8711095            '@ophints':     self.parseTagOpHints,
    8721096            '@opdisenum':   self.parseTagOpDisEnum,
     1097            '@opmincpu':    self.parseTagOpMinCpu,
    8731098            '@opcpuid':     self.parseTagOpCpuId,
    8741099            '@opgroup':     self.parseTagOpGroup,
     
    9341159        oInstr = Instruction(self.sSrcFile, self.iLine if iLine is None else iLine);
    9351160        g_aoAllInstructions.append(oInstr);
    936         self.asCurInstr.append(oInstr);
     1161        self.aoCurInstrs.append(oInstr);
    9371162        return oInstr;
     1163
     1164    def deriveMnemonicAndOperandsFromStats(self, oInstr, sStats):
     1165        """
     1166        Derives the mnemonic and operands from a IEM stats base name like string.
     1167        """
     1168        if oInstr.sMnemonic is None:
     1169            asWords = sStats.split('_');
     1170            oInstr.sMnemonic = asWords[0].lower();
     1171            if len(asWords) > 1 and len(oInstr.aoOperands) == 0:
     1172                for sType in asWords[1:]:
     1173                    if sType in g_kdOpTypes:
     1174                        oInstr.aoOperands.append(Operand(g_kdOpTypes[sType][1], sType));
     1175                    else:
     1176                        #return self.error('unknown operand type: %s (instruction: %s)' % (sType, oInstr))
     1177                        return False;
     1178        return True;
    9381179
    9391180    def doneInstructionOne(self, oInstr, iLine):
     
    9651206        # Common defaults.
    9661207        #
     1208
     1209        # Guess mnemonic and operands from stats if the former is missing.
     1210        if oInstr.sMnemonic is None:
     1211            if oInstr.sStats is not None:
     1212                self.deriveMnemonicAndOperandsFromStats(oInstr, oInstr.sStats);
     1213            elif oInstr.sFunction is not None:
     1214                self.deriveMnemonicAndOperandsFromStats(oInstr, oInstr.sFunction.replace('iemOp_', ''));
     1215
     1216        # Derive the disassembler op enum constant from the mnemonic.
    9671217        if oInstr.sDisEnum is None and oInstr.sMnemonic is not None:
    9681218            oInstr.sDisEnum = 'OP_' + oInstr.sMnemonic.upper();
    9691219
     1220        # Derive the IEM statistics base name from mnemonic and operand types.
    9701221        if oInstr.sStats is None:
    9711222            if oInstr.sFunction is not None:
     
    9771228                        oInstr.sStats += '_' + oOperand.sType;
    9781229
     1230        # Derive the IEM function name from mnemonic and operand types.
    9791231        if oInstr.sFunction is None:
    9801232            if oInstr.sMnemonic is not None:
     
    9861238                oInstr.sFunction = 'iemOp_' + oInstr.sStats;
    9871239
     1240        # Derive encoding from operands.
     1241        if oInstr.sEncoding is None:
     1242            if len(oInstr.aoOperands) == 0:
     1243                oInstr.sEncoding = 'fixed';
     1244            elif oInstr.aoOperands[0].usesModRM():
     1245                if len(oInstr.aoOperands) >= 2 and oInstr.aoOperands[1].sWhere == 'vvvv':
     1246                    oInstr.sEncoding = 'ModR/M+VEX';
     1247                else:
     1248                    oInstr.sEncoding = 'ModR/M';
     1249
    9881250        #
    9891251        # Apply default map and then add the instruction to all it's groups.
     
    10011263        Done with current instruction.
    10021264        """
    1003         for oInstr in self.asCurInstr:
     1265        for oInstr in self.aoCurInstrs:
    10041266            self.doneInstructionOne(oInstr, self.iLine if iLineInComment is None else self.iCommentLine + iLineInComment);
    10051267            if oInstr.fStub:
    10061268                self.cTotalStubs += 1;
    10071269
    1008         self.cTotalInstr += len(self.asCurInstr);
     1270        self.cTotalInstr += len(self.aoCurInstrs);
    10091271
    10101272        self.sComment     = '';
    1011         self.asCurInstr   = [];
     1273        self.aoCurInstrs   = [];
    10121274        return True;
    10131275
     
    10171279        is False, only None values and empty strings are replaced.
    10181280        """
    1019         for oInstr in self.asCurInstr:
     1281        for oInstr in self.aoCurInstrs:
    10201282            if fOverwrite is not True:
    10211283                oOldValue = getattr(oInstr, sAttrib);
     
    10291291        If fOverwrite is False, only None values and empty strings are replaced.
    10301292        """
    1031         for oInstr in self.asCurInstr:
     1293        for oInstr in self.aoCurInstrs:
    10321294            aoArray = getattr(oInstr, sAttrib);
    10331295            while len(aoArray) <= iEntry:
     
    10541316    def ensureInstructionForOpTag(self, iTagLine):
    10551317        """ Ensure there is an instruction for the op-tag being parsed. """
    1056         if len(self.asCurInstr) == 0:
     1318        if len(self.aoCurInstrs) == 0:
    10571319            self.addInstruction(self.iCommentLine + iTagLine);
    1058         for oInstr in self.asCurInstr:
     1320        for oInstr in self.aoCurInstrs:
    10591321            oInstr.cOpTags += 1;
    10601322            if oInstr.cOpTags == 1:
    10611323                self.cTotalTagged += 1;
    1062         return self.asCurInstr[-1];
     1324        return self.aoCurInstrs[-1];
    10631325
    10641326    @staticmethod
     
    11681430        """
    11691431        Tags:  \@op1, \@op2, \@op3, \@op4
    1170         Value: where:type
     1432        Value: [where:]type
    11711433
    11721434        The 'where' value indicates where the operand is found, like the 'reg'
     
    11861448        sFlattened = self.flattenAllSections(aasSections);
    11871449        asSplit = sFlattened.split(':');
    1188         if len(asSplit) != 2:
    1189             return self.errorComment(iTagLine, 'expected %s value on format "<where>:<type>" not "%s"' % (sTag, sFlattened,));
    1190 
    1191         (sWhere, sType) = asSplit;
    1192         if sWhere not in Operand.kdLocations:
     1450        if len(asSplit) == 1:
     1451            sType  = asSplit[0];
     1452            sWhere = None;
     1453        elif len(asSplit) == 2:
     1454            (sWhere, sType) = asSplit;
     1455        else:
     1456            return self.errorComment(iTagLine, 'expected %s value on format "[<where>:]<type>" not "%s"' % (sTag, sFlattened,));
     1457
     1458        if sType not in g_kdOpTypes:
    11931459            return self.errorComment(iTagLine, '%s: invalid where value "%s", valid: %s'
    1194                                                % (sTag, sWhere, ', '.join(Operand.kdLocations.keys()),), iTagLine);
    1195 
    1196         if sType not in Operand.kdTypes:
     1460                                               % (sTag, sType, ', '.join(g_kdOpTypes.keys()),));
     1461        if sWhere is None:
     1462            sWhere = g_kdOpTypes[sType][1];
     1463        elif sWhere not in g_kdOpLocations:
    11971464            return self.errorComment(iTagLine, '%s: invalid where value "%s", valid: %s'
    1198                                                % (sTag, sType, ', '.join(Operand.kdTypes.keys()),));
     1465                                               % (sTag, sWhere, ', '.join(g_kdOpLocations.keys()),), iTagLine);
    11991466
    12001467        # Insert the operand, refusing to overwrite an existing one.
     
    12451512        return True;
    12461513
    1247     ## \@oppfx values.
    1248     kdPrefixes = {
    1249         '0x66': [],
    1250         '0xf3': [],
    1251         '0xf2': [],
    1252     };
    1253 
    12541514    def parseTagOpPfx(self, sTag, aasSections, iTagLine, iEndLine):
    12551515        """
     
    12771537                return self.errorComment(iTagLine, '%s: invalid prefix: %s' % (sTag, sPrefix,));
    12781538
    1279         if sPrefix is not None and sPrefix not in self.kdPrefixes:
    1280             return self.errorComment(iTagLine, '%s: invalid prefix: %s (valid %s)' % (sTag, sPrefix, self.kdPrefixes,));
     1539        if sPrefix is not None and sPrefix not in g_kdPrefixes:
     1540            return self.errorComment(iTagLine, '%s: invalid prefix: %s (valid %s)' % (sTag, sPrefix, g_kdPrefixes,));
    12811541
    12821542        # Set it.
     
    12881548        return True;
    12891549
    1290     ## Special \@opcode tag values.
    1291     kdSpecialOpcodes = {
    1292         '/reg':         [],
    1293         'mr/reg':       [],
    1294         '11 /reg':      [],
    1295         '!11 /reg':     [],
    1296         '11 mr/reg':    [],
    1297         '!11 mr/reg':   [],
    1298     };
    1299 
    13001550    def parseTagOpcode(self, sTag, aasSections, iTagLine, iEndLine):
    13011551        """
     
    13091559        # Flatten and validate the value.
    13101560        sOpcode = self.flattenAllSections(aasSections);
    1311         if sOpcode in self.kdSpecialOpcodes:
     1561        if sOpcode in g_kdSpecialOpcodes:
    13121562            pass;
    13131563        elif not _isValidOpcodeByte(sOpcode):
     
    13221572        return True;
    13231573
    1324     ## Valid values for \@openc
    1325     kdEncodings = {
    1326         'ModR/M': [],       ##< ModR/M
    1327         'prefix': [],       ##< Prefix
    1328     };
    1329 
    13301574    def parseTagOpEnc(self, sTag, aasSections, iTagLine, iEndLine):
    13311575        """
     
    13391583        # Flatten and validate the value.
    13401584        sEncoding = self.flattenAllSections(aasSections);
    1341         if sEncoding in self.kdEncodings:
     1585        if sEncoding in g_kdEncodings:
    13421586            pass;
    13431587        elif not _isValidOpcodeByte(sEncoding):
     
    14411685        return True;
    14421686
    1443     ## \@ophints values.
    1444     kdHints = {
    1445         'invalid':               'DISOPTYPE_INVALID',               ##<
    1446         'harmless':              'DISOPTYPE_HARMLESS',              ##<
    1447         'controlflow':           'DISOPTYPE_CONTROLFLOW',           ##<
    1448         'potentially_dangerous': 'DISOPTYPE_POTENTIALLY_DANGEROUS', ##<
    1449         'dangerous':             'DISOPTYPE_DANGEROUS',             ##<
    1450         'portio':                'DISOPTYPE_PORTIO',                ##<
    1451         'privileged':            'DISOPTYPE_PRIVILEGED',            ##<
    1452         'privileged_notrap':     'DISOPTYPE_PRIVILEGED_NOTRAP',     ##<
    1453         'uncond_controlflow':    'DISOPTYPE_UNCOND_CONTROLFLOW',    ##<
    1454         'relative_controlflow':  'DISOPTYPE_RELATIVE_CONTROLFLOW',  ##<
    1455         'cond_controlflow':      'DISOPTYPE_COND_CONTROLFLOW',      ##<
    1456         'interrupt':             'DISOPTYPE_INTERRUPT',             ##<
    1457         'illegal':               'DISOPTYPE_ILLEGAL',               ##<
    1458         'rrm_dangerous':         'DISOPTYPE_RRM_DANGEROUS',         ##< Some additional dangerous ones when recompiling raw r0. */
    1459         'rrm_dangerous_16':      'DISOPTYPE_RRM_DANGEROUS_16',      ##< Some additional dangerous ones when recompiling 16-bit raw r0. */
    1460         'inhibit_irqs':          'DISOPTYPE_INHIBIT_IRQS',          ##< Will or can inhibit irqs (sti, pop ss, mov ss) */
    1461         'portio_read':           'DISOPTYPE_PORTIO_READ',           ##<
    1462         'portio_write':          'DISOPTYPE_PORTIO_WRITE',          ##<
    1463         'invalid_64':            'DISOPTYPE_INVALID_64',            ##< Invalid in 64 bits mode */
    1464         'only_64':               'DISOPTYPE_ONLY_64',               ##< Only valid in 64 bits mode */
    1465         'default_64_op_size':    'DISOPTYPE_DEFAULT_64_OP_SIZE',    ##< Default 64 bits operand size */
    1466         'forced_64_op_size':     'DISOPTYPE_FORCED_64_OP_SIZE',     ##< Forced 64 bits operand size; regardless of prefix bytes */
    1467         'rexb_extends_opreg':    'DISOPTYPE_REXB_EXTENDS_OPREG',    ##< REX.B extends the register field in the opcode byte */
    1468         'mod_fixed_11':          'DISOPTYPE_MOD_FIXED_11',          ##< modrm.mod is always 11b */
    1469         'forced_32_op_size_x86': 'DISOPTYPE_FORCED_32_OP_SIZE_X86', ##< Forced 32 bits operand size; regardless of prefix bytes (only in 16 & 32 bits mode!) */
    1470         'sse':                   'DISOPTYPE_SSE',                   ##< SSE,SSE2,SSE3,AVX,++ instruction. Not implemented yet! */
    1471         'mmx':                   'DISOPTYPE_MMX',                   ##< MMX,MMXExt,3DNow,++ instruction. Not implemented yet! */
    1472         'fpu':                   'DISOPTYPE_FPU',                   ##< FPU instruction. Not implemented yet! */
    1473         'ignores_op_size':       '',                                ##< Ignores both operand size prefixes.
    1474     };
    1475 
    14761687    def parseTagOpHints(self, sTag, aasSections, iTagLine, iEndLine):
    14771688        """
     
    14901701            fRc = True;
    14911702            for iHint, sHint in enumerate(asHints):
    1492                 if sHint not in self.kdHints:
    1493                     if sHint.strip() in self.kdHints:
     1703                if sHint not in g_kdHints:
     1704                    if sHint.strip() in g_kdHints:
    14941705                        sHint[iHint] = sHint.strip();
    14951706                    else:
     
    15251736                return False;
    15261737        sDisEnum = asWords[0];
    1527         if not self.oReGroupName.match(sDisEnum):
    1528             return self.errorComment(iTagLine, '%s: invalid disassembler OP_XXXX enum: %s' % (sTag, sDisEnum,));
     1738        if not self.oReDisEnum.match(sDisEnum):
     1739            return self.errorComment(iTagLine, '%s: invalid disassembler OP_XXXX enum: %s (pattern: %s)'
     1740                                               % (sTag, sDisEnum, self.oReDisEnum.pattern));
    15291741
    15301742        # Set it.
     
    15361748        return True;
    15371749
    1538     ## \@opcpuid
    1539     kdCpuIdFlags =  {
    1540         'vme':      'X86_CPUID_FEATURE_EDX_VME',
    1541         'tsc':      'X86_CPUID_FEATURE_EDX_TSC',
    1542         'msr':      'X86_CPUID_FEATURE_EDX_MSR',
    1543         'cx8':      'X86_CPUID_FEATURE_EDX_CX8',
    1544         'sep':      'X86_CPUID_FEATURE_EDX_SEP',
    1545         'cmov':     'X86_CPUID_FEATURE_EDX_CMOV',
    1546         'clfsh':    'X86_CPUID_FEATURE_EDX_CLFSH',
    1547         'mmx':      'X86_CPUID_FEATURE_EDX_MMX',
    1548         'fxsr':     'X86_CPUID_FEATURE_EDX_FXSR',
    1549         'sse':      'X86_CPUID_FEATURE_EDX_SSE',
    1550         'sse2':     'X86_CPUID_FEATURE_EDX_SSE2',
    1551         'sse3':     'X86_CPUID_FEATURE_ECX_SSE3',
    1552         'pclmul':   'X86_CPUID_FEATURE_ECX_DTES64',
    1553         'monitor':  'X86_CPUID_FEATURE_ECX_CPLDS',
    1554         'vmx':      'X86_CPUID_FEATURE_ECX_VMX',
    1555         'smx':      'X86_CPUID_FEATURE_ECX_TM2',
    1556         'ssse3':    'X86_CPUID_FEATURE_ECX_SSSE3',
    1557         'fma':      'X86_CPUID_FEATURE_ECX_FMA',
    1558         'cx16':     'X86_CPUID_FEATURE_ECX_CX16',
    1559         'pcid':     'X86_CPUID_FEATURE_ECX_PCID',
    1560         'sse41':    'X86_CPUID_FEATURE_ECX_SSE4_1',
    1561         'sse42':    'X86_CPUID_FEATURE_ECX_SSE4_2',
    1562         'movbe':    'X86_CPUID_FEATURE_ECX_MOVBE',
    1563         'popcnt':   'X86_CPUID_FEATURE_ECX_POPCNT',
    1564         'aes':      'X86_CPUID_FEATURE_ECX_AES',
    1565         'xsave':    'X86_CPUID_FEATURE_ECX_XSAVE',
    1566         'avx':      'X86_CPUID_FEATURE_ECX_AVX',
    1567         'f16c':     'X86_CPUID_FEATURE_ECX_F16C',
    1568         'rdrand':   'X86_CPUID_FEATURE_ECX_RDRAND',
    1569 
    1570         'axmmx':    'X86_CPUID_AMD_FEATURE_EDX_AXMMX',
    1571         '3dnowext': 'X86_CPUID_AMD_FEATURE_EDX_3DNOW_EX',
    1572         '3dnow':    'X86_CPUID_AMD_FEATURE_EDX_3DNOW',
    1573         'svm':      'X86_CPUID_AMD_FEATURE_ECX_SVM',
    1574         'cr8l':     'X86_CPUID_AMD_FEATURE_ECX_CR8L',
    1575         'abm':      'X86_CPUID_AMD_FEATURE_ECX_ABM',
    1576         'sse4a':    'X86_CPUID_AMD_FEATURE_ECX_SSE4A',
    1577         '3dnowprf': 'X86_CPUID_AMD_FEATURE_ECX_3DNOWPRF',
    1578         'xop':      'X86_CPUID_AMD_FEATURE_ECX_XOP',
    1579         'fma4':     'X86_CPUID_AMD_FEATURE_ECX_FMA4',
    1580     };
     1750    def parseTagOpMinCpu(self, sTag, aasSections, iTagLine, iEndLine):
     1751        """
     1752        Tag:        \@opmincpu
     1753        Value:      <simple CPU name>
     1754
     1755        Indicates when this instruction was introduced.
     1756        """
     1757        oInstr = self.ensureInstructionForOpTag(iTagLine);
     1758
     1759        # Flatten the value, split into words, make sure there's just one, valid it.
     1760        asCpus = self.flattenAllSections(aasSections).split();
     1761        if len(asCpus) > 1:
     1762            self.errorComment(iTagLine, '%s: exactly one CPU name, please: %s' % (sTag, ' '.join(asCpus),));
     1763
     1764        sMinCpu = asCpus[0];
     1765        if sMinCpu in g_kdCpuNames:
     1766            self.sMinCpu = sMinCpu;
     1767        else:
     1768            return self.errorComment(iTagLine, '%s: invalid CPU name: %s  (names: %s)'
     1769                                               % (sTag, sMinCpu, ','.join(sorted(g_kdCpuNames)),));
     1770
     1771        # Set it.
     1772        if oInstr.sMinCpu is None:
     1773            oInstr.sMinCpu = sMinCpu;
     1774        elif oInstr.sMinCpu != sMinCpu:
     1775            self.errorComment(iTagLine, '%s: attemting to overwrite "%s" with "%s"' % (sTag, oInstr.sMinCpu, sMinCpu,));
     1776
     1777        _ = iEndLine;
     1778        return True;
    15811779
    15821780    def parseTagOpCpuId(self, sTag, aasSections, iTagLine, iEndLine):
     
    15961794            fRc = True;
    15971795            for iCpuId, sCpuId in enumerate(asCpuIds):
    1598                 if sCpuId not in self.kdCpuIds:
    1599                     if sCpuId.strip() in self.kdCpuIds:
     1796                if sCpuId not in g_kdCpuIdFlags:
     1797                    if sCpuId.strip() in g_kdCpuIdFlags:
    16001798                        sCpuId[iCpuId] = sCpuId.strip();
    16011799                    else:
     
    16401838        return True;
    16411839
    1642     ## \@opunused, \@opinvalid, \@opinvlstyle
    1643     kdInvalidStyles = {
    1644         'immediate':                [], ##< CPU stops decoding immediately after the opcode.
    1645         'intel-modrm':              [], ##< Intel decodes ModR/M.
    1646         'intel-modrm-imm8':         [], ##< Intel decodes ModR/M and an 8-byte immediate.
    1647         'intel-opcode-modrm':       [], ##< Intel decodes another opcode byte followed by ModR/M. (Unused extension tables.)
    1648         'intel-opcode-modrm-imm8':  [], ##< Intel decodes another opcode byte followed by ModR/M and an 8-byte immediate.
    1649     };
    1650 
    16511840    def parseTagOpUnusedInvalid(self, sTag, aasSections, iTagLine, iEndLine):
    16521841        """
     
    16701859            return self.errorComment(iTagLine, '%s: exactly one invalid behviour style, please: %s' % (sTag, asStyles,));
    16711860        sStyle = asStyles[0];
    1672         if sStyle not in self.kdInvalidStyle:
     1861        if sStyle not in g_kdInvalidStyles:
    16731862            return self.errorComment(iTagLine, '%s: invalid invalid behviour style: %s (valid: %s)'
    1674                                                % (sTag, sStyle, self.kdInvalidStyles.keys(),));
     1863                                               % (sTag, sStyle, g_kdInvalidStyles.keys(),));
    16751864        # Set it.
    16761865        if oInstr.sInvlStyle is not None:
     
    20332222        return (off, asRet);
    20342223
    2035     def findAndParseMacroInvocation(self, sCode, sMacro):
     2224    def findAndParseMacroInvocationEx(self, sCode, sMacro):
    20362225        """
    20372226        Returns (len(sCode), None) if not found, parseMacroInvocation result if found.
     
    20432232        return (len(sCode), None);
    20442233
     2234    def findAndParseMacroInvocation(self, sCode, sMacro):
     2235        """
     2236        Returns None if not found, arguments as per parseMacroInvocation if found.
     2237        """
     2238        return self.findAndParseMacroInvocationEx(sCode, sMacro)[1];
     2239
    20452240    def findAndParseFirstMacroInvocation(self, sCode, asMacro):
    20462241        """
    2047         Returns (len(sCode), None) if not found, parseMacroInvocation result if found.
     2242        Returns same as findAndParseMacroInvocation.
    20482243        """
    20492244        for sMacro in asMacro:
    2050             offAfter, asRet = self.findAndParseMacroInvocation(sCode, sMacro);
     2245            asRet = self.findAndParseMacroInvocation(sCode, sMacro);
    20512246            if asRet is not None:
    2052                 return (offAfter, asRet);
    2053         return (len(sCode), None);
     2247                return asRet;
     2248        return None;
     2249
     2250    def workerIemOpMnemonicEx(self, sMacro, sStats, sAsm, sForm, sUpper, sLower, sDisHints, sIemHints, asOperands):
     2251        """
     2252        Processes one of the a IEMOP_MNEMONIC0EX, IEMOP_MNEMONIC1EX, IEMOP_MNEMONIC2EX,
     2253        IEMOP_MNEMONIC3EX, and IEMOP_MNEMONIC4EX macros.
     2254        """
     2255        #
     2256        # Some invocation checks.
     2257        #
     2258        if sUpper != sUpper.upper():
     2259            self.error('%s: bad a_Upper parameter: %s' % (sMacro, sUpper,));
     2260        if sLower != sLower.lower():
     2261            self.error('%s: bad a_Lower parameter: %s' % (sMacro, sLower,));
     2262        if sUpper.lower() != sLower:
     2263            self.error('%s: a_Upper and a_Lower parameters does not match: %s vs %s' % (sMacro, sUpper, sLower,));
     2264        if not self.oReMnemonic.match(sLower):
     2265            self.error('%s: invalid a_Lower: %s  (valid: %s)' % (sMacro, sLower, self.oReMnemonic.pattern,));
     2266
     2267        #
     2268        # Check if sIemHints tells us to not consider this macro invocation.
     2269        #
     2270        if sIemHints.find('IEMOPHINT_SKIP_PYTHON') >= 0:
     2271            return True;
     2272
     2273        # Apply to the last instruction only for now.
     2274        if len(self.aoCurInstrs) == 0:
     2275            self.addInstruction();
     2276        oInstr = self.aoCurInstrs[-1];
     2277        if oInstr.iLineMnemonicMacro == -1:
     2278            oInstr.iLineMnemonicMacro = self.iLine;
     2279        else:
     2280            self.error('%s: already saw a IEMOP_MNEMONIC* macro on line %u for this instruction'
     2281                       % (sMacro, self.iLineMnemonicMacro,));
     2282
     2283        # Mnemonic
     2284        if oInstr.sMnemonic is None:
     2285            oInstr.sMnemonic = sLower;
     2286        elif oInstr.sMnemonic != sLower:
     2287            self.error('%s: current instruction and a_Lower does not match: %s vs %s' % (sMacro, oInstr.sMnemonic, sLower,));
     2288
     2289        # Process operands.
     2290        if len(oInstr.aoOperands) not in [0, len(asOperands)]:
     2291            self.error('%s: number of operands given by @opN does not match macro: %s vs %s'
     2292                       % (sMacro, len(oInstr.aoOperands), len(aoOperands),));
     2293        for iOperand, sType in enumerate(asOperands):
     2294            sWhere = g_kdOpTypes.get(sType, [None, None])[1];
     2295            if sWhere is None:
     2296                self.error('%s: unknown a_Op%u value: %s' % (sMacro, iOperand + 1, sType));
     2297                if iOperand < len(oInstr.aoOperands): # error recovery.
     2298                    sWhere = oInstr.aoOperands[iOperand].sWhere;
     2299                    sType  = oInstr.aoOperands[iOperand].sType;
     2300                else:
     2301                    sWhere = 'reg';
     2302                    sType  = 'Gb';
     2303            if iOperand == len(oInstr.aoOperands):
     2304                oInstr.aoOperands.append(Operand(sWhere, sType))
     2305            elif oInstr.aoOperands[iOperand].sWhere != sWhere or oInstr.aoOperands[iOperand].sType != sType:
     2306                self.error('%s: @op%u and a_Op%u mismatch: %s:%s vs %s:%s'
     2307                           % (sMacro, iOperand + 1, iOperand + 1, oInstr.aoOperands[iOperand].sWhere,
     2308                              oInstr.aoOperands[iOperand].sType, sWhere, sType,));
     2309
     2310        # Encoding.
     2311        if sForm not in g_kdIemForms:
     2312            self.error('%s: unknown a_Form value: %s' % (sMacro, sForm,));
     2313        else:
     2314            if oInstr.sEncoding is None:
     2315                oInstr.sEncoding = g_kdIemForms[sForm][0];
     2316            elif g_kdIemForms[sForm][0] != oInstr.sEncoding:
     2317                self.error('%s: current instruction @openc and a_Form does not match: %s vs %s (%s)'
     2318                           % (sMacro, oInstr.sEncoding, g_kdIemForms[sForm], sForm));
     2319
     2320            # Check the parameter locations for the encoding.
     2321            if g_kdIemForms[sForm][1] is not None:
     2322                for iOperand, sWhere in enumerate(g_kdIemForms[sForm][1]):
     2323                    if oInstr.aoOperands[iOperand].sWhere != sWhere:
     2324                        self.error('%s: current instruction @op%u and a_Form location does not match: %s vs %s (%s)'
     2325                                   % (sMacro, iOperand + 1, oInstr.aoOperands[iOperand].sWhere, sWhere, sForm,));
     2326
     2327        # Stats.
     2328        if not self.oReStatsName.match(sStats):
     2329            self.error('%s: invalid a_Stats value: %s' % (sMacro, sStats,));
     2330        elif oInstr.sStats is None:
     2331            oInstr.sStats = sStats;
     2332        elif oInstr.sStats != sStats:
     2333            self.error('%s: mismatching @opstats and a_Stats value: %s vs %s'
     2334                       % (sMacro, oInstr.sStats, sStats,));
     2335
     2336        # Process the hints (simply merge with @ophints w/o checking anything).
     2337        for sHint in sDisHints.split('|'):
     2338            sHint = sHint.strip();
     2339            if sHint.startswith('DISOPTYPE_'):
     2340                sShortHint = sHint[len('DISOPTYPE_'):].lower();
     2341                if sShortHint in g_kdHints:
     2342                    oInstr.dHints[sShortHint] = True; # (dummy value, using dictionary for speed)
     2343                else:
     2344                    self.error('%s: unknown a_fDisHints value: %s' % (sMacro, sHint,));
     2345            elif sHint != '0':
     2346                self.error('%s: expected a_fDisHints value: %s' % (sMacro, sHint,));
     2347
     2348        for sHint in sIemHints.split('|'):
     2349            sHint = sHint.strip();
     2350            if sHint.startswith('IEMOPHINT_'):
     2351                sShortHint = sHint[len('IEMOPHINT_'):].lower();
     2352                if sShortHint in g_kdHints:
     2353                    oInstr.dHints[sShortHint] = True; # (dummy value, using dictionary for speed)
     2354                else:
     2355                    self.error('%s: unknown a_fIemHints value: %s' % (sMacro, sHint,));
     2356            elif sHint != '0':
     2357                self.error('%s: expected a_fIemHints value: %s' % (sMacro, sHint,));
     2358
     2359
     2360        return True;
     2361
     2362    def workerIemOpMnemonic(self, sMacro, sForm, sUpper, sLower, sDisHints, sIemHints, asOperands):
     2363        """
     2364        Processes one of the a IEMOP_MNEMONIC0, IEMOP_MNEMONIC1, IEMOP_MNEMONIC2,
     2365        IEMOP_MNEMONIC3, and IEMOP_MNEMONIC4 macros.
     2366        """
     2367        if asOperands == 0:
     2368            return self.workerIemOpMnemonicEx(sLower, sLower, sForm, sUpper, sLower, sDisHints, sIemHints, asOperands);
     2369        return self.workerIemOpMnemonicEx(sMacro, sLower + '_' + '_'.join(asOperands), sLower + ' ' + ','.join(asOperands),
     2370                                          sForm, sUpper, sLower, sDisHints, sIemHints, asOperands);
    20542371
    20552372    def checkCodeForMacro(self, sCode):
     
    20622379        if sCode.find('(') > 0:
    20632380            # Look for instruction decoder function definitions. ASSUME single line.
    2064             (_, asArgs) = self.findAndParseFirstMacroInvocation(sCode,
    2065                                                                 [ 'FNIEMOP_DEF',
    2066                                                                   'FNIEMOP_STUB',
    2067                                                                   'FNIEMOP_STUB_1',
    2068                                                                   'FNIEMOP_UD_STUB',
    2069                                                                   'FNIEMOP_UD_STUB_1' ]);
     2381            asArgs = self.findAndParseFirstMacroInvocation(sCode,
     2382                                                           [ 'FNIEMOP_DEF',
     2383                                                             'FNIEMOP_STUB',
     2384                                                             'FNIEMOP_STUB_1',
     2385                                                             'FNIEMOP_UD_STUB',
     2386                                                             'FNIEMOP_UD_STUB_1' ]);
    20702387            if asArgs is not None:
    20712388                sFunction = asArgs[1];
    20722389
    2073                 if len(self.asCurInstr) == 0:
    2074                     self.addInstruction().sMnemonic = sFunction.split('_')[1];
     2390                if len(self.aoCurInstrs) == 0:
     2391                    self.addInstruction();
     2392                for oInstr in self.aoCurInstrs:
     2393                    if oInstr.iLineFnIemOpMacro == -1:
     2394                        oInstr.iLineFnIemOpMacro = self.iLine;
     2395                    else:
     2396                        self.error('%s: already seen a FNIEMOP_XXX macro for %s' % (asArgs[0], oInstr,) );
    20752397                self.setInstrunctionAttrib('sFunction', sFunction);
    20762398                self.setInstrunctionAttrib('fStub', asArgs[0].find('STUB') > 0, fOverwrite = True);
     
    20812403
    20822404            # IEMOP_MNEMONIC(a_Stats, a_szMnemonic) IEMOP_INC_STATS(a_Stats)
    2083             (_, asArgs) = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC');
     2405            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC');
    20842406            if asArgs is not None:
    2085                 if len(self.asCurInstr) == 1:
    2086                     self.setInstrunctionAttrib('sStats', asArgs[1]);
    2087                     self.setInstrunctionAttrib('sMnemonic', asArgs[1].split('_')[0]);
    2088 
    2089             # IEMOP_HLP_DECODED_NL_1(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_fDisOpType)
    2090             (_, asArgs) = self.findAndParseMacroInvocation(sCode, 'IEMOP_HLP_DECODED_NL_1');
     2407                if len(self.aoCurInstrs) == 1:
     2408                    oInstr = self.aoCurInstrs[0];
     2409                    if oInstr.sStats is None:
     2410                        oInstr.sStats = asArgs[1];
     2411                    self.deriveMnemonicAndOperandsFromStats(oInstr, asArgs[1]);
     2412
     2413            # IEMOP_MNEMONIC0EX(a_Stats, a_szMnemonic, a_Form, a_Upper, a_Lower, a_fDisHints, a_fIemHints)
     2414            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC0EX');
    20912415            if asArgs is not None:
    2092                 if len(self.asCurInstr) == 1:
    2093                     self.setInstrunctionAttrib('sRawDisOpNo', asArgs[1]);
    2094                     self.setInstrunctionAttrib('sRawIemOpFlags', asArgs[2]);
    2095                     self.setInstrunctionArrayAttrib('asRawDisParams', 0, asArgs[3]);
    2096 
    2097             # IEMOP_HLP_DECODED_NL_2(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_uDisParam1, a_fDisOpType)
    2098             (_, asArgs) = self.findAndParseMacroInvocation(sCode, 'IEMOP_HLP_DECODED_NL_2');
     2416                self.workerIemOpMnemonicEx(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[4], asArgs[5], asArgs[6], asArgs[7],
     2417                                           []);
     2418            # IEMOP_MNEMONIC1EX(a_Stats, a_szMnemonic, a_Form, a_Upper, a_Lower, a_Op1, a_fDisHints, a_fIemHints)
     2419            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC1EX');
    20992420            if asArgs is not None:
    2100                 if len(self.asCurInstr) == 1:
    2101                     self.setInstrunctionAttrib('sRawDisOpNo', asArgs[1]);
    2102                     self.setInstrunctionAttrib('sRawIemOpFlags', asArgs[2]);
    2103                     self.setInstrunctionArrayAttrib('asRawDisParams', 0, asArgs[3]);
    2104                     self.setInstrunctionArrayAttrib('asRawDisParams', 1, asArgs[4]);
     2421                self.workerIemOpMnemonicEx(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[4], asArgs[5], asArgs[7], asArgs[8],
     2422                                           [asArgs[6],]);
     2423            # IEMOP_MNEMONIC2EX(a_Stats, a_szMnemonic, a_Form, a_Upper, a_Lower, a_Op1, a_Op2, a_fDisHints, a_fIemHints) \
     2424            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC2EX');
     2425            if asArgs is not None:
     2426                self.workerIemOpMnemonicEx(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[4], asArgs[5], asArgs[8], asArgs[9],
     2427                                           [asArgs[6], asArgs[7]]);
     2428            # IEMOP_MNEMONIC3EX(a_Stats, a_szMnemonic, a_Form, a_Upper, a_Lower, a_Op1, a_Op2, a_Op3, a_fDisHints, a_fIemHints) \
     2429            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC3EX');
     2430            if asArgs is not None:
     2431                self.workerIemOpMnemonicEx(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[4], asArgs[5], asArgs[9],
     2432                                           asArgs[10], [asArgs[6], asArgs[7], asArgs[8],]);
     2433            # IEMOP_MNEMONIC4EX(a_Stats, a_szMnemonic, a_Form, a_Upper, a_Lower, a_Op1, a_Op2, a_Op3, a_Op4, a_fDisHints, a_fIemHints) \
     2434            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC4EX');
     2435            if asArgs is not None:
     2436                self.workerIemOpMnemonicEx(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[4], asArgs[5], asArgs[10],
     2437                                           asArgs[11], [asArgs[6], asArgs[7], asArgs[8], asArgs[9],]);
     2438
     2439            # IEMOP_MNEMONIC0(a_Form, a_Upper, a_Lower, a_fDisHints, a_fIemHints)
     2440            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC0');
     2441            if asArgs is not None:
     2442                self.workerIemOpMnemonic(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[4], asArgs[5], []);
     2443            # IEMOP_MNEMONIC1(a_Form, a_Upper, a_Lower, a_Op1, a_fDisHints, a_fIemHints)
     2444            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC1');
     2445            if asArgs is not None:
     2446                self.workerIemOpMnemonic(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[5], asArgs[6], [asArgs[4],]);
     2447            # IEMOP_MNEMONIC2(a_Form, a_Upper, a_Lower, a_Op1, a_Op2, a_fDisHints, a_fIemHints) \
     2448            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC2');
     2449            if asArgs is not None:
     2450                self.workerIemOpMnemonic(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[6], asArgs[7],
     2451                                         [asArgs[4], asArgs[5],]);
     2452            # IEMOP_MNEMONIC3(a_Form, a_Upper, a_Lower, a_Op1, a_Op2, a_Op3, a_fDisHints, a_fIemHints) \
     2453            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC3');
     2454            if asArgs is not None:
     2455                self.workerIemOpMnemonic(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[7], asArgs[8],
     2456                                         [asArgs[4], asArgs[5], asArgs[6],]);
     2457            # IEMOP_MNEMONIC4(a_Form, a_Upper, a_Lower, a_Op1, a_Op2, a_Op3, a_Op4, a_fDisHints, a_fIemHints) \
     2458            asArgs = self.findAndParseMacroInvocation(sCode, 'IEMOP_MNEMONIC4');
     2459            if asArgs is not None:
     2460                self.workerIemOpMnemonic(asArgs[0], asArgs[1], asArgs[2], asArgs[3], asArgs[8], asArgs[9],
     2461                                         [asArgs[4], asArgs[5], asArgs[6], asArgs[7],]);
    21052462
    21062463        return False;
     
    22692626                for iOperand, oOperand in enumerate(oInstr.aoOperands):
    22702627                    sTmp += ' ' if iOperand == 0 else ',';
    2271                     sTmp += '%' + oOperand.sType;
     2628                    sTmp += g_kdOpTypes[oOperand.sType][2];
    22722629                sTmp += '",';
    22732630                asColumns = [ sTmp, ];
     
    22772634                #
    22782635                iStart = len(asColumns);
    2279                 if oInstr.sEncoding == 'ModR/M':
     2636                if oInstr.sEncoding is None:
     2637                    pass;
     2638                elif oInstr.sEncoding == 'ModR/M':
    22802639                    # ASSUME the first operand is using the ModR/M encoding
    22812640                    assert len(oInstr.aoOperands) >= 1 and oInstr.aoOperands[0].usesModRM();
     
    22852644                    if len(oInstr.aoOperands) > 1 and oInstr.aoOperands[1].usesModRM():
    22862645                        asColumns.append('IDX_UseModRM,')
    2287                 elif oInstr.sEncoding == 'prefix':
     2646                elif oInstr.sEncoding in ['prefix', 'fixed' ]:
    22882647                    pass;
    22892648                elif oInstr.sEncoding == 'vex2':
     
    23202679                # Check for immediates and stuff in the remaining operands.
    23212680                for oOperand in oInstr.aoOperands[len(asColumns) - iStart:]:
    2322                     sIdx = Operand.kdTypes[oOperand.sType];
     2681                    sIdx = g_kdOpTypes[oOperand.sType][0];
    23232682                    if sIdx != 'IDX_UseModRM':
    23242683                        asColumns.append(sIdx + ',');
     
    23282687                # Opcode and operands.
    23292688                #
     2689                assert oInstr.sDisEnum, str(oInstr);
    23302690                asColumns.append(oInstr.sDisEnum + ',');
    23312691                iStart = len(asColumns)
     
    23392699                sTmp = '';
    23402700                for sHint in sorted(oInstr.dHints.keys()):
    2341                     sDefine = SimpleParser.kdHints[sHint];
     2701                    sDefine = g_kdHints[sHint];
    23422702                    if sDefine.startswith('DISOPTYPE_'):
    23432703                        if sTmp:
     
    23802740
    23812741
     2742
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r65784 r65876  
    47714771{
    47724772    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    4773     if (iReg < X86_SREG_FS)
    4774         IEMOP_HLP_NO_64BIT();
     4773    Assert(iReg < X86_SREG_FS || pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT);
    47754774    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    47764775
     
    48144813    IEMOP_MNEMONIC(push_fs, "push fs");
    48154814    IEMOP_HLP_MIN_386();
     4815    IEMOP_HLP_NO_64BIT();
    48164816    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    48174817    return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_FS);
     
    53485348    IEMOP_MNEMONIC(push_gs, "push gs");
    53495349    IEMOP_HLP_MIN_386();
     5350    IEMOP_HLP_NO_64BIT();
    53505351    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    53515352    return FNIEMOP_CALL_1(iemOpCommonPushSReg, X86_SREG_GS);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r65871 r65876  
    867867#define IEMOPFORM_R             3
    868868
     869/** ModR/M + VEX.vvvv: reg, vvvv, r/m */
     870#define IEMOPFORM_RVM           4
     871
     872/** ModR/M + VEX.vvvv: r/m, vvvv, reg */
     873#define IEMOPFORM_MVR           5
     874
    869875/** Fixed register instruction, no R/M. */
    870 #define IEMOPFORM_FIXED         4
     876#define IEMOPFORM_FIXED         6
    871877
    872878/** The r/m is a register. */
     
    880886 * @{ */
    881887/** Both the operand size prefixes are ignored. */
    882 #define IEMOPHINT_IGNORES_OP_SIZE  RT_BIT_32(10)
     888#define IEMOPHINT_IGNORES_OP_SIZE   RT_BIT_32(10)
     889/** Hint to IEMAllInstructionPython.py that this macro should be skipped.  */
     890#define IEMOPHINT_SKIP_PYTHON       RT_BIT_32(31)
    883891/** @} */
    884892
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette