VirtualBox

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


Ignore:
Timestamp:
Mar 16, 2017 3:53:06 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
114038
Message:

IEM: Implemented AAA.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

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

    r66044 r66135  
    64746474
    64756475
     6476/**
     6477 * Implements 'AAA'.
     6478 */
     6479IEM_CIMPL_DEF_0(iemCImpl_aaa)
     6480{
     6481    PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
     6482
     6483    uint8_t const uMaskedAl = pCtx->al & 0xf;
     6484    if (   pCtx->eflags.Bits.u1AF
     6485        || uMaskedAl >= 10)
     6486    {
     6487        pCtx->ax += 0x106;
     6488        pCtx->al &= 0xf;
     6489        pCtx->eflags.Bits.u1AF = 1;
     6490        pCtx->eflags.Bits.u1CF = 1;
     6491    }
     6492    else
     6493    {
     6494        pCtx->eflags.Bits.u1AF = 0;
     6495        pCtx->eflags.Bits.u1CF = 0;
     6496        pCtx->al = uMaskedAl;
     6497    }
     6498
     6499    iemHlpUpdateArithEFlagsU8(pVCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
     6500    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
     6501    return VINF_SUCCESS;
     6502}
     6503
     6504
    64766505
    64776506
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r66132 r66135  
    2222extern const PFNIEMOP g_apfnOneByteMap[256]; /* not static since we need to forward declare it. */
    2323
    24 /** @def og_gen     General
    25  * @{
    26  */
    27 
    28 /** @def og_gen_arith   Arithmetic
    29  * @{
    30  */
    31 /** @defgroup og_gen_arith_bin      Binary numbers */
    32 /** @defgroup og_gen_arith_dec      Decimal numbers */
     24/* Instruction group definitions: */
     25
     26/** @defgroup og_gen    General
     27 * @{ */
     28 /** @defgroup og_gen_arith     Arithmetic
     29  * @{  */
     30  /** @defgroup og_gen_arith_bin    Binary numbers */
     31  /** @defgroup og_gen_arith_dec    Decimal numbers */
     32 /** @} */
    3333/** @} */
     34
     35/** @defgroup og_stack Stack
     36 * @{ */
     37 /** @defgroup og_stack_sreg    Segment registers */
     38/** @} */
     39
     40/** @defgroup og_prefix     Prefixes */
     41/** @defgroup og_escapes    Escape bytes */
    3442
    3543
     
    5159 * @ophints     harmless ignores_op_size
    5260 * @opstats     add_Eb_Gb
    53  * @opgroup     op_gen_arith_bin
     61 * @opgroup     og_gen_arith_bin
    5462 * @optest              op1=1   op2=1   -> op1=2   efl&|=nc,pe,na,nz,pl,nv
    5563 * @optest      efl|=cf op1=1   op2=2   -> op1=3   efl&|=nc,po,na,nz,pl,nv
     
    6674/**
    6775 * @opcode      0x01
    68  * @opgroup     op_gen_arith_bin
     76 * @opgroup     og_gen_arith_bin
    6977 * @opflmodify  cf,pf,af,zf,sf,of
    7078 * @optest               op1=1  op2=1  -> op1=2  efl&|=nc,pe,na,nz,pl,nv
     
    8290/**
    8391 * @opcode      0x02
    84  * @opgroup     op_gen_arith_bin
     92 * @opgroup     og_gen_arith_bin
    8593 * @opflmodify  cf,pf,af,zf,sf,of
    8694 * @opcopytests iemOp_add_Eb_Gb
     
    95103/**
    96104 * @opcode      0x03
    97  * @opgroup     op_gen_arith_bin
     105 * @opgroup     og_gen_arith_bin
    98106 * @opflmodify  cf,pf,af,zf,sf,of
    99107 * @opcopytests iemOp_add_Ev_Gv
     
    108116/**
    109117 * @opcode      0x04
    110  * @opgroup     op_gen_arith_bin
     118 * @opgroup     og_gen_arith_bin
    111119 * @opflmodify  cf,pf,af,zf,sf,of
    112120 * @opcopytests iemOp_add_Eb_Gb
     
    121129/**
    122130 * @opcode      0x05
    123  * @opgroup     op_gen_arith_bin
     131 * @opgroup     og_gen_arith_bin
    124132 * @opflmodify  cf,pf,af,zf,sf,of
    125133 * @optest      op1=1 op2=1 -> op1=2 efl&|=nv,pl,nz,na,pe
     
    137145/**
    138146 * @opcode      0x06
    139  * @opgroup     op_stack_sreg
     147 * @opgroup     og_stack_sreg
    140148 */
    141149FNIEMOP_DEF(iemOp_push_ES)
     
    149157/**
    150158 * @opcode      0x07
    151  * @opgroup     op_stack_sreg
     159 * @opgroup     og_stack_sreg
    152160 */
    153161FNIEMOP_DEF(iemOp_pop_ES)
     
    162170/**
    163171 * @opcode      0x08
    164  * @opgroup     op_gen_arith_bin
     172 * @opgroup     og_gen_arith_bin
    165173 * @opflmodify  cf,pf,af,zf,sf,of
    166174 * @opflundef   af
     
    181189/*
    182190 * @opcode      0x09
    183  * @opgroup     op_gen_arith_bin
     191 * @opgroup     og_gen_arith_bin
    184192 * @opflmodify  cf,pf,af,zf,sf,of
    185193 * @opflundef   af
     
    202210/**
    203211 * @opcode      0x0a
    204  * @opgroup     op_gen_arith_bin
     212 * @opgroup     og_gen_arith_bin
    205213 * @opflmodify  cf,pf,af,zf,sf,of
    206214 * @opflundef   af
     
    218226/**
    219227 * @opcode      0x0b
    220  * @opgroup     op_gen_arith_bin
     228 * @opgroup     og_gen_arith_bin
    221229 * @opflmodify  cf,pf,af,zf,sf,of
    222230 * @opflundef   af
     
    234242/**
    235243 * @opcode      0x0c
    236  * @opgroup     op_gen_arith_bin
     244 * @opgroup     og_gen_arith_bin
    237245 * @opflmodify  cf,pf,af,zf,sf,of
    238246 * @opflundef   af
     
    250258/**
    251259 * @opcode      0x0d
    252  * @opgroup     op_gen_arith_bin
     260 * @opgroup     og_gen_arith_bin
    253261 * @opflmodify  cf,pf,af,zf,sf,of
    254262 * @opflundef   af
     
    272280/**
    273281 * @opcode      0x0e
    274  * @opgroup     op_stack_sreg
     282 * @opgroup     og_stack_sreg
    275283 */
    276284FNIEMOP_DEF(iemOp_push_CS)
     
    288296 * @opdisenum   OP_2B_ESC
    289297 * @ophints     harmless
    290  * @opgroup     op_escapes
     298 * @opgroup     og_escapes
    291299 */
    292300FNIEMOP_DEF(iemOp_2byteEscape)
     
    326334/**
    327335 * @opcode      0x10
    328  * @opgroup     op_gen_arith_bin
     336 * @opgroup     og_gen_arith_bin
    329337 * @opfltest    cf
    330338 * @opflmodify  cf,pf,af,zf,sf,of
     
    344352/**
    345353 * @opcode      0x11
    346  * @opgroup     op_gen_arith_bin
     354 * @opgroup     og_gen_arith_bin
    347355 * @opfltest    cf
    348356 * @opflmodify  cf,pf,af,zf,sf,of
     
    362370/**
    363371 * @opcode      0x12
    364  * @opgroup     op_gen_arith_bin
     372 * @opgroup     og_gen_arith_bin
    365373 * @opfltest    cf
    366374 * @opflmodify  cf,pf,af,zf,sf,of
     
    376384/**
    377385 * @opcode      0x13
    378  * @opgroup     op_gen_arith_bin
     386 * @opgroup     og_gen_arith_bin
    379387 * @opfltest    cf
    380388 * @opflmodify  cf,pf,af,zf,sf,of
     
    390398/**
    391399 * @opcode      0x14
    392  * @opgroup     op_gen_arith_bin
     400 * @opgroup     og_gen_arith_bin
    393401 * @opfltest    cf
    394402 * @opflmodify  cf,pf,af,zf,sf,of
     
    404412/**
    405413 * @opcode      0x15
    406  * @opgroup     op_gen_arith_bin
     414 * @opgroup     og_gen_arith_bin
    407415 * @opfltest    cf
    408416 * @opflmodify  cf,pf,af,zf,sf,of
     
    429437/**
    430438 * @opcode      0x17
    431  * @opgroup     op_gen_arith_bin
     439 * @opgroup     og_gen_arith_bin
    432440 * @opfltest    cf
    433441 * @opflmodify  cf,pf,af,zf,sf,of
     
    444452/**
    445453 * @opcode      0x18
    446  * @opgroup     op_gen_arith_bin
     454 * @opgroup     og_gen_arith_bin
    447455 * @opfltest    cf
    448456 * @opflmodify  cf,pf,af,zf,sf,of
     
    457465/**
    458466 * @opcode      0x19
    459  * @opgroup     op_gen_arith_bin
     467 * @opgroup     og_gen_arith_bin
    460468 * @opfltest    cf
    461469 * @opflmodify  cf,pf,af,zf,sf,of
     
    470478/**
    471479 * @opcode      0x1a
    472  * @opgroup     op_gen_arith_bin
     480 * @opgroup     og_gen_arith_bin
    473481 * @opfltest    cf
    474482 * @opflmodify  cf,pf,af,zf,sf,of
     
    483491/**
    484492 * @opcode      0x1b
    485  * @opgroup     op_gen_arith_bin
     493 * @opgroup     og_gen_arith_bin
    486494 * @opfltest    cf
    487495 * @opflmodify  cf,pf,af,zf,sf,of
     
    496504/**
    497505 * @opcode      0x1c
    498  * @opgroup     op_gen_arith_bin
     506 * @opgroup     og_gen_arith_bin
    499507 * @opfltest    cf
    500508 * @opflmodify  cf,pf,af,zf,sf,of
     
    509517/**
    510518 * @opcode      0x1d
    511  * @opgroup     op_gen_arith_bin
     519 * @opgroup     og_gen_arith_bin
    512520 * @opfltest    cf
    513521 * @opflmodify  cf,pf,af,zf,sf,of
     
    522530/**
    523531 * @opcode      0x1e
    524  * @opgroup     op_stack_sreg
     532 * @opgroup     og_stack_sreg
    525533 */
    526534FNIEMOP_DEF(iemOp_push_DS)
     
    534542/**
    535543 * @opcode      0x1f
    536  * @opgroup     op_stack_sreg
     544 * @opgroup     og_stack_sreg
    537545 */
    538546FNIEMOP_DEF(iemOp_pop_DS)
     
    547555/**
    548556 * @opcode      0x20
    549  * @opgroup     op_gen_arith_bin
     557 * @opgroup     og_gen_arith_bin
    550558 * @opflmodify  cf,pf,af,zf,sf,of
    551559 * @opflundef   af
     
    562570/**
    563571 * @opcode      0x21
    564  * @opgroup     op_gen_arith_bin
     572 * @opgroup     og_gen_arith_bin
    565573 * @opflmodify  cf,pf,af,zf,sf,of
    566574 * @opflundef   af
     
    577585/**
    578586 * @opcode      0x22
    579  * @opgroup     op_gen_arith_bin
     587 * @opgroup     og_gen_arith_bin
    580588 * @opflmodify  cf,pf,af,zf,sf,of
    581589 * @opflundef   af
     
    592600/**
    593601 * @opcode      0x23
    594  * @opgroup     op_gen_arith_bin
     602 * @opgroup     og_gen_arith_bin
    595603 * @opflmodify  cf,pf,af,zf,sf,of
    596604 * @opflundef   af
     
    607615/**
    608616 * @opcode      0x24
    609  * @opgroup     op_gen_arith_bin
     617 * @opgroup     og_gen_arith_bin
    610618 * @opflmodify  cf,pf,af,zf,sf,of
    611619 * @opflundef   af
     
    622630/**
    623631 * @opcode      0x25
    624  * @opgroup     op_gen_arith_bin
     632 * @opgroup     og_gen_arith_bin
    625633 * @opflmodify  cf,pf,af,zf,sf,of
    626634 * @opflundef   af
     
    639647 * @opmnemonic  SEG
    640648 * @op1         ES
    641  * @opgroup     op_prefix
     649 * @opgroup     og_prefix
    642650 * @openc       prefix
    643651 * @opdisenum   OP_SEG
     
    673681/**
    674682 * @opcode      0x28
    675  * @opgroup     op_gen_arith_bin
     683 * @opgroup     og_gen_arith_bin
    676684 * @opflmodify  cf,pf,af,zf,sf,of
    677685 */
     
    685693/**
    686694 * @opcode      0x29
    687  * @opgroup     op_gen_arith_bin
     695 * @opgroup     og_gen_arith_bin
    688696 * @opflmodify  cf,pf,af,zf,sf,of
    689697 */
     
    697705/**
    698706 * @opcode      0x2a
    699  * @opgroup     op_gen_arith_bin
     707 * @opgroup     og_gen_arith_bin
    700708 * @opflmodify  cf,pf,af,zf,sf,of
    701709 */
     
    709717/**
    710718 * @opcode      0x2b
    711  * @opgroup     op_gen_arith_bin
     719 * @opgroup     og_gen_arith_bin
    712720 * @opflmodify  cf,pf,af,zf,sf,of
    713721 */
     
    721729/**
    722730 * @opcode      0x2c
    723  * @opgroup     op_gen_arith_bin
     731 * @opgroup     og_gen_arith_bin
    724732 * @opflmodify  cf,pf,af,zf,sf,of
    725733 */
     
    733741/**
    734742 * @opcode      0x2d
    735  * @opgroup     op_gen_arith_bin
     743 * @opgroup     og_gen_arith_bin
    736744 * @opflmodify  cf,pf,af,zf,sf,of
    737745 */
     
    747755 * @opmnemonic  SEG
    748756 * @op1         CS
    749  * @opgroup     op_prefix
     757 * @opgroup     og_prefix
    750758 * @openc       prefix
    751759 * @opdisenum   OP_SEG
     
    781789/**
    782790 * @opcode      0x30
    783  * @opgroup     op_gen_arith_bin
     791 * @opgroup     og_gen_arith_bin
    784792 * @opflmodify  cf,pf,af,zf,sf,of
    785793 * @opflundef   af
     
    796804/**
    797805 * @opcode      0x31
    798  * @opgroup     op_gen_arith_bin
     806 * @opgroup     og_gen_arith_bin
    799807 * @opflmodify  cf,pf,af,zf,sf,of
    800808 * @opflundef   af
     
    811819/**
    812820 * @opcode      0x32
    813  * @opgroup     op_gen_arith_bin
     821 * @opgroup     og_gen_arith_bin
    814822 * @opflmodify  cf,pf,af,zf,sf,of
    815823 * @opflundef   af
     
    826834/**
    827835 * @opcode      0x33
    828  * @opgroup     op_gen_arith_bin
     836 * @opgroup     og_gen_arith_bin
    829837 * @opflmodify  cf,pf,af,zf,sf,of
    830838 * @opflundef   af
     
    841849/**
    842850 * @opcode      0x34
    843  * @opgroup     op_gen_arith_bin
     851 * @opgroup     og_gen_arith_bin
    844852 * @opflmodify  cf,pf,af,zf,sf,of
    845853 * @opflundef   af
     
    856864/**
    857865 * @opcode      0x35
    858  * @opgroup     op_gen_arith_bin
     866 * @opgroup     og_gen_arith_bin
    859867 * @opflmodify  cf,pf,af,zf,sf,of
    860868 * @opflundef   af
     
    871879/**
    872880 * @opcode      0x36
     881 * @opmnemonic  SEG
     882 * @op1         SS
     883 * @opgroup     og_prefix
     884 * @openc       prefix
     885 * @opdisenum   OP_SEG
     886 * @ophints     harmless
    873887 */
    874888FNIEMOP_DEF(iemOp_seg_SS)
     
    885899/**
    886900 * @opcode      0x37
    887  */
    888 FNIEMOP_STUB(iemOp_aaa);
     901 * @opfltest    af,cf
     902 * @opflmodify  cf,pf,af,zf,sf,of
     903 * @opflundef   of
     904 * @opgroup     og_gen_arith_dec
     905 * @optest      efl&~=af ax=9      -> efl&|=nc,po,na,nz,pl,nv
     906 * @optest      efl&~=af ax=0      -> efl&|=nc,po,na,zf,pl,nv
     907 * @optest      efl|=af  ax=0      -> ax=0x0106 efl&|=cf,po,af,nz,pl,nv
     908 * @optest      efl|=af  ax=0x0100 -> ax=0x0206 efl&|=cf,po,af,nz,pl,nv
     909 * @optest      efl|=af  ax=0x000a -> ax=0x0100 efl&|=cf,po,af,zf,pl,nv
     910 * @optest      efl|=af  ax=0x010a -> ax=0x0200 efl&|=cf,po,af,zf,pl,nv
     911 * @optest      efl|=af  ax=0x0f0a -> ax=0x1000 efl&|=cf,po,af,zf,pl,nv
     912 * @optest      efl|=af  ax=0x7f0a -> ax=0x8000 efl&|=cf,po,af,zf,pl,nv
     913 * @optest      efl|=af  ax=0xff0a -> ax=0x0000 efl&|=cf,po,af,zf,pl,nv
     914 * @optest      efl&~=af ax=0xff0a -> ax=0x0000 efl&|=cf,po,af,zf,pl,nv
     915 * @optest      efl&~=af ax=0x000b -> ax=0x0101 efl&|=cf,pe,af,nz,pl,nv
     916 * @optest      efl&~=af ax=0x000c -> ax=0x0102 efl&|=cf,pe,af,nz,pl,nv
     917 * @optest      efl&~=af ax=0x000d -> ax=0x0103 efl&|=cf,po,af,nz,pl,nv
     918 * @optest      efl&~=af ax=0x000e -> ax=0x0104 efl&|=cf,pe,af,nz,pl,nv
     919 * @optest      efl&~=af ax=0x000f -> ax=0x0105 efl&|=cf,po,af,nz,pl,nv
     920 * @optest      efl&~=af ax=0x020f -> ax=0x0305 efl&|=cf,po,af,nz,pl,nv
     921 */
     922FNIEMOP_DEF(iemOp_aaa)
     923{
     924    IEMOP_MNEMONIC0(FIXED, AAA, aaa, DISOPTYPE_HARMLESS | DISOPTYPE_INVALID_64, 0); /* express implicit AL/AX register use */
     925    IEMOP_HLP_NO_64BIT();
     926    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     927    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF);
     928
     929    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_aaa);
     930}
    889931
    890932
     
    18531895 * @opmnemonic  segfs
    18541896 * @opmincpu    80386
    1855  * @opgroup     op_prefixes
     1897 * @opgroup     og_prefixes
    18561898 */
    18571899FNIEMOP_DEF(iemOp_seg_FS)
     
    18721914 * @opmnemonic  seggs
    18731915 * @opmincpu    80386
    1874  * @opgroup     op_prefixes
     1916 * @opgroup     og_prefixes
    18751917 */
    18761918FNIEMOP_DEF(iemOp_seg_GS)
     
    18931935 * @opmincpu    80386
    18941936 * @ophints     harmless
    1895  * @opgroup     op_prefixes
     1937 * @opgroup     og_prefixes
    18961938 */
    18971939FNIEMOP_DEF(iemOp_op_size)
     
    19191961 * @opmincpu    80386
    19201962 * @ophints     harmless
    1921  * @opgroup     op_prefixes
     1963 * @opgroup     og_prefixes
    19221964 */
    19231965FNIEMOP_DEF(iemOp_addr_size)
     
    31323174 * @opcode      0x82
    31333175 * @opmnemonic  grp1_82
    3134  * @opgroup     op_groups
     3176 * @opgroup     og_groups
    31353177 */
    31363178FNIEMOP_DEF(iemOp_Grp1_Eb_Ib_82)
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66128 r66135  
    12051205        self.oReStatsName   = re.compile('^[A-Za-z_][A-Za-z0-9_]*$');
    12061206        self.oReFunctionName= re.compile('^iemOp_[A-Za-z_][A-Za-z0-9_]*$');
    1207         self.oReGroupName   = re.compile('^op_[a-z0-9]+(|_[a-z0-9]+|_[a-z0-9]+_[a-z0-9]+)$');
     1207        self.oReGroupName   = re.compile('^og_[a-z0-9]+(|_[a-z0-9]+|_[a-z0-9]+_[a-z0-9]+)$');
    12081208        self.oReDisEnum     = re.compile('^OP_[A-Z0-9_]+$');
    12091209        self.fDebug         = True;
     
    25482548        IEMOP_MNEMONIC3, and IEMOP_MNEMONIC4 macros.
    25492549        """
    2550         if asOperands == 0:
     2550        if not asOperands:
    25512551            return self.workerIemOpMnemonicEx(sMacro, sLower, sLower, sForm, sUpper, sLower, sDisHints, sIemHints, asOperands);
    25522552        return self.workerIemOpMnemonicEx(sMacro, sLower + '_' + '_'.join(asOperands), sLower + ' ' + ','.join(asOperands),
Note: See TracChangeset for help on using the changeset viewer.

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