VirtualBox

Changeset 67072 in vbox


Ignore:
Timestamp:
May 25, 2017 8:26:51 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115735
Message:

IEM: Tests and fixes for vmovntdqa Vx,Mx. Added a few strickness checks to the IEM python script and fixed a few issues found by it.

Location:
trunk/src/VBox
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/Makefile.kmk

    r67040 r67072  
    367367        $(QUIET)$(SED) \
    368368                -e '/IEMOP_MNEMONIC\(\|[01234]\|[01234]EX\)(/!d' \
     369               -e ':look-for-end-of-invocation' \
     370               -e '/)/bend-of-invocation' \
     371               -e 'N' \
     372               -e 'blook-for-end-of-invocation' \
     373               -e ':end-of-invocation' \
     374               -e 's/\n/ /g' \
     375               -e 's/  */ /g' \
    369376               -e 's/^.*IEMOP_MNEMONIC\(\|[01234]\|[01234]EX\)(/IEM_DO_INSTR_STAT\1(/' \
    370377               -e 's/;.*$(DOLLAR)//' \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r67042 r67072  
    206206##    - 2: disassembler format string version of the type.
    207207##    - 3: disassembler OP_PARAM_XXX (XXX only).
     208##    - 4: IEM form matching instruction.
    208209##
    209210## Note! See the A.2.1 in SDM vol 2 for the type names.
    210211g_kdOpTypes = {
    211212    # Fixed addresses
    212     'Ap':           ( 'IDX_ParseImmAddrF',  'imm',    '%Ap',  'Ap',      ),
     213    'Ap':           ( 'IDX_ParseImmAddrF',  'imm',    '%Ap',  'Ap',      'FIXED', ),
    213214
    214215    # ModR/M.rm
    215     'Eb':           ( 'IDX_UseModRM',       'rm',     '%Eb',  'Eb',      ),
    216     'Ed':           ( 'IDX_UseModRM',       'rm',     '%Ed',  'Ed',      ),
    217     'Ed_WO':        ( 'IDX_UseModRM',       'rm',     '%Ed',  'Ed',      ),
    218     'Eq':           ( 'IDX_UseModRM',       'rm',     '%Eq',  'Eq',      ),
    219     'Eq_WO':        ( 'IDX_UseModRM',       'rm',     '%Eq',  'Eq',      ),
    220     'Ew':           ( 'IDX_UseModRM',       'rm',     '%Ew',  'Ew',      ),
    221     'Ev':           ( 'IDX_UseModRM',       'rm',     '%Ev',  'Ev',      ),
    222     'Qq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      ),
    223     'Qq_WO':        ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      ),
    224     'Wss':          ( 'IDX_UseModRM',       'rm',     '%Wss', 'Wss',     ),
    225     'Wss_WO':       ( 'IDX_UseModRM',       'rm',     '%Wss', 'Wss',     ),
    226     'Wsd':          ( 'IDX_UseModRM',       'rm',     '%Wsd', 'Wsd',     ),
    227     'Wsd_WO':       ( 'IDX_UseModRM',       'rm',     '%Wsd', 'Wsd',     ),
    228     'Wps':          ( 'IDX_UseModRM',       'rm',     '%Wps', 'Wps',     ),
    229     'Wps_WO':       ( 'IDX_UseModRM',       'rm',     '%Wps', 'Wps',     ),
    230     'Wpd':          ( 'IDX_UseModRM',       'rm',     '%Wpd', 'Wpd',     ),
    231     'Wpd_WO':       ( 'IDX_UseModRM',       'rm',     '%Wpd', 'Wpd',     ),
    232     'Wdq':          ( 'IDX_UseModRM',       'rm',     '%Wdq', 'Wdq',     ),
    233     'Wdq_WO':       ( 'IDX_UseModRM',       'rm',     '%Wdq', 'Wdq',     ),
    234     'Wq':           ( 'IDX_UseModRM',       'rm',     '%Wq',  'Wq',      ),
    235     'Wq_WO':        ( 'IDX_UseModRM',       'rm',     '%Wq',  'Wq',      ),
    236     'WqZxReg_WO':   ( 'IDX_UseModRM',       'rm',     '%Wq',  'Wq',      ),
    237     'Wx':           ( 'IDX_UseModRM',       'rm',     '%Wx',  'Wx',      ),
    238     'Wx_WO':        ( 'IDX_UseModRM',       'rm',     '%Wx',  'Wx',      ),
     216    'Eb':           ( 'IDX_UseModRM',       'rm',     '%Eb',  'Eb',      'RM',    ),
     217    'Ed':           ( 'IDX_UseModRM',       'rm',     '%Ed',  'Ed',      'RM',    ),
     218    'Ed_WO':        ( 'IDX_UseModRM',       'rm',     '%Ed',  'Ed',      'RM',    ),
     219    'Eq':           ( 'IDX_UseModRM',       'rm',     '%Eq',  'Eq',      'RM',    ),
     220    'Eq_WO':        ( 'IDX_UseModRM',       'rm',     '%Eq',  'Eq',      'RM',    ),
     221    'Ew':           ( 'IDX_UseModRM',       'rm',     '%Ew',  'Ew',      'RM',    ),
     222    'Ev':           ( 'IDX_UseModRM',       'rm',     '%Ev',  'Ev',      'RM',    ),
     223    'Qq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      'RM',    ),
     224    'Qq_WO':        ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      'RM',    ),
     225    'Wss':          ( 'IDX_UseModRM',       'rm',     '%Wss', 'Wss',     'RM',    ),
     226    'Wss_WO':       ( 'IDX_UseModRM',       'rm',     '%Wss', 'Wss',     'RM',    ),
     227    'Wsd':          ( 'IDX_UseModRM',       'rm',     '%Wsd', 'Wsd',     'RM',    ),
     228    'Wsd_WO':       ( 'IDX_UseModRM',       'rm',     '%Wsd', 'Wsd',     'RM',    ),
     229    'Wps':          ( 'IDX_UseModRM',       'rm',     '%Wps', 'Wps',     'RM',    ),
     230    'Wps_WO':       ( 'IDX_UseModRM',       'rm',     '%Wps', 'Wps',     'RM',    ),
     231    'Wpd':          ( 'IDX_UseModRM',       'rm',     '%Wpd', 'Wpd',     'RM',    ),
     232    'Wpd_WO':       ( 'IDX_UseModRM',       'rm',     '%Wpd', 'Wpd',     'RM',    ),
     233    'Wdq':          ( 'IDX_UseModRM',       'rm',     '%Wdq', 'Wdq',     'RM',    ),
     234    'Wdq_WO':       ( 'IDX_UseModRM',       'rm',     '%Wdq', 'Wdq',     'RM',    ),
     235    'Wq':           ( 'IDX_UseModRM',       'rm',     '%Wq',  'Wq',      'RM',    ),
     236    'Wq_WO':        ( 'IDX_UseModRM',       'rm',     '%Wq',  'Wq',      'RM',    ),
     237    'WqZxReg_WO':   ( 'IDX_UseModRM',       'rm',     '%Wq',  'Wq',      'RM',    ),
     238    'Wx':           ( 'IDX_UseModRM',       'rm',     '%Wx',  'Wx',      'RM',    ),
     239    'Wx_WO':        ( 'IDX_UseModRM',       'rm',     '%Wx',  'Wx',      'RM',    ),
    239240
    240241    # ModR/M.rm - register only.
    241     'Uq':           ( 'IDX_UseModRM',       'rm',     '%Uq',  'Uq',      ),
    242     'UqHi':         ( 'IDX_UseModRM',       'rm',     '%Uq',  'UqHi',    ),
    243     'Uss':          ( 'IDX_UseModRM',       'rm',     '%Uss', 'Uss',     ),
    244     'Uss_WO':       ( 'IDX_UseModRM',       'rm',     '%Uss', 'Uss',     ),
    245     'Usd':          ( 'IDX_UseModRM',       'rm',     '%Usd', 'Usd',     ),
    246     'Usd_WO':       ( 'IDX_UseModRM',       'rm',     '%Usd', 'Usd',     ),
    247     'Nq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Nq',      ),
     242    'Uq':           ( 'IDX_UseModRM',       'rm',     '%Uq',  'Uq',      'REG'    ),
     243    'UqHi':         ( 'IDX_UseModRM',       'rm',     '%Uq',  'UqHi',    'REG'    ),
     244    'Uss':          ( 'IDX_UseModRM',       'rm',     '%Uss', 'Uss',     'REG'    ),
     245    'Uss_WO':       ( 'IDX_UseModRM',       'rm',     '%Uss', 'Uss',     'REG'    ),
     246    'Usd':          ( 'IDX_UseModRM',       'rm',     '%Usd', 'Usd',     'REG'    ),
     247    'Usd_WO':       ( 'IDX_UseModRM',       'rm',     '%Usd', 'Usd',     'REG'    ),
     248    'Nq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Nq',      'REG'    ),
    248249
    249250    # ModR/M.rm - memory only.
    250     'Ma':           ( 'IDX_UseModRM',       'rm',     '%Ma',  'Ma',      ), ##< Only used by BOUND.
    251     'Mb_RO':        ( 'IDX_UseModRM',       'rm',     '%Mb',  'Mb',      ),
    252     'Md':           ( 'IDX_UseModRM',       'rm',     '%Md',  'Md',      ),
    253     'Md_RO':        ( 'IDX_UseModRM',       'rm',     '%Md',  'Md',      ),
    254     'Md_WO':        ( 'IDX_UseModRM',       'rm',     '%Md',  'Md',      ),
    255     'Mdq':          ( 'IDX_UseModRM',       'rm',     '%Mdq', 'Mdq',     ),
    256     'Mdq_WO':       ( 'IDX_UseModRM',       'rm',     '%Mdq', 'Mdq',     ),
    257     'Mq':           ( 'IDX_UseModRM',       'rm',     '%Mq',  'Mq',      ),
    258     'Mq_WO':        ( 'IDX_UseModRM',       'rm',     '%Mq',  'Mq',      ),
    259     'Mps_WO':       ( 'IDX_UseModRM',       'rm',     '%Mps', 'Mps',     ),
    260     'Mpd_WO':       ( 'IDX_UseModRM',       'rm',     '%Mpd', 'Mpd',     ),
    261     'Mx':           ( 'IDX_UseModRM',       'rm',     '%Mx',  'Mx',      ),
    262     'Mx_WO':        ( 'IDX_UseModRM',       'rm',     '%Mx',  'Mx',      ),
    263     'M_RO':         ( 'IDX_UseModRM',       'rm',     '%M',   'M',       ),
    264     'M_RW':         ( 'IDX_UseModRM',       'rm',     '%M',   'M',       ),
     251    'Ma':           ( 'IDX_UseModRM',       'rm',     '%Ma',  'Ma',      'MEM',   ), ##< Only used by BOUND.
     252    'Mb_RO':        ( 'IDX_UseModRM',       'rm',     '%Mb',  'Mb',      'MEM',   ),
     253    'Md':           ( 'IDX_UseModRM',       'rm',     '%Md',  'Md',      'MEM',   ),
     254    'Md_RO':        ( 'IDX_UseModRM',       'rm',     '%Md',  'Md',      'MEM',   ),
     255    'Md_WO':        ( 'IDX_UseModRM',       'rm',     '%Md',  'Md',      'MEM',   ),
     256    'Mdq':          ( 'IDX_UseModRM',       'rm',     '%Mdq', 'Mdq',     'MEM',   ),
     257    'Mdq_WO':       ( 'IDX_UseModRM',       'rm',     '%Mdq', 'Mdq',     'MEM',   ),
     258    'Mq':           ( 'IDX_UseModRM',       'rm',     '%Mq',  'Mq',      'MEM',   ),
     259    'Mq_WO':        ( 'IDX_UseModRM',       'rm',     '%Mq',  'Mq',      'MEM',   ),
     260    'Mps_WO':       ( 'IDX_UseModRM',       'rm',     '%Mps', 'Mps',     'MEM',   ),
     261    'Mpd_WO':       ( 'IDX_UseModRM',       'rm',     '%Mpd', 'Mpd',     'MEM',   ),
     262    'Mx':           ( 'IDX_UseModRM',       'rm',     '%Mx',  'Mx',      'MEM',   ),
     263    'Mx_WO':        ( 'IDX_UseModRM',       'rm',     '%Mx',  'Mx',      'MEM',   ),
     264    'M_RO':         ( 'IDX_UseModRM',       'rm',     '%M',   'M',       'MEM',   ),
     265    'M_RW':         ( 'IDX_UseModRM',       'rm',     '%M',   'M',       'MEM',   ),
    265266
    266267    # ModR/M.reg
    267     'Gb':           ( 'IDX_UseModRM',       'reg',    '%Gb',  'Gb',      ),
    268     'Gw':           ( 'IDX_UseModRM',       'reg',    '%Gw',  'Gw',      ),
    269     'Gv':           ( 'IDX_UseModRM',       'reg',    '%Gv',  'Gv',      ),
    270     'Gv_RO':        ( 'IDX_UseModRM',       'reg',    '%Gv',  'Gv',      ),
    271     'Pd':           ( 'IDX_UseModRM',       'reg',    '%Pd',  'Pd',      ),
    272     'PdZx_WO':      ( 'IDX_UseModRM',       'reg',    '%Pd',  'PdZx',    ),
    273     'Pq':           ( 'IDX_UseModRM',       'reg',    '%Pq',  'Pq',      ),
    274     'Pq_WO':        ( 'IDX_UseModRM',       'reg',    '%Pq',  'Pq',      ),
    275     'Vd':           ( 'IDX_UseModRM',       'reg',    '%Vd',  'Vd',      ),
    276     'Vd_WO':        ( 'IDX_UseModRM',       'reg',    '%Vd',  'Vd',      ),
    277     'VdZx_WO':      ( 'IDX_UseModRM',       'reg',    '%Vd',  'Vd',      ),
    278     'Vdq':          ( 'IDX_UseModRM',       'reg',    '%Vdq', 'Vdq',     ),
    279     'Vss':          ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     ),
    280     'Vss_WO':       ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     ),
    281     'VssZx_WO':     ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     ),
    282     'Vsd':          ( 'IDX_UseModRM',       'reg',    '%Vsd', 'Vsd',     ),
    283     'Vsd_WO':       ( 'IDX_UseModRM',       'reg',    '%Vsd', 'Vsd',     ),
    284     'VsdZx_WO':     ( 'IDX_UseModRM',       'reg',    '%Vsd', 'Vsd',     ),
    285     'Vps':          ( 'IDX_UseModRM',       'reg',    '%Vps', 'Vps',     ),
    286     'Vps_WO':       ( 'IDX_UseModRM',       'reg',    '%Vps', 'Vps',     ),
    287     'Vpd':          ( 'IDX_UseModRM',       'reg',    '%Vpd', 'Vpd',     ),
    288     'Vpd_WO':       ( 'IDX_UseModRM',       'reg',    '%Vpd', 'Vpd',     ),
    289     'Vq':           ( 'IDX_UseModRM',       'reg',    '%Vq',  'Vq',      ),
    290     'Vq_WO':        ( 'IDX_UseModRM',       'reg',    '%Vq',  'Vq',      ),
    291     'Vdq_WO':       ( 'IDX_UseModRM',       'reg',    '%Vdq', 'Vdq',     ),
    292     'VqHi':         ( 'IDX_UseModRM',       'reg',    '%Vdq', 'VdqHi',   ),
    293     'VqHi_WO':      ( 'IDX_UseModRM',       'reg',    '%Vdq', 'VdqHi',   ),
    294     'VqZx_WO':      ( 'IDX_UseModRM',       'reg',    '%Vq',  'VqZx',    ),
    295     'Vx':           ( 'IDX_UseModRM',       'reg',    '%Vx',  'Vx',      ),
    296     'Vx_WO':        ( 'IDX_UseModRM',       'reg',    '%Vx',  'Vx',      ),
     268    'Gb':           ( 'IDX_UseModRM',       'reg',    '%Gb',  'Gb',      '',      ),
     269    'Gw':           ( 'IDX_UseModRM',       'reg',    '%Gw',  'Gw',      '',      ),
     270    'Gv':           ( 'IDX_UseModRM',       'reg',    '%Gv',  'Gv',      '',      ),
     271    'Gv_RO':        ( 'IDX_UseModRM',       'reg',    '%Gv',  'Gv',      '',      ),
     272    'Pd':           ( 'IDX_UseModRM',       'reg',    '%Pd',  'Pd',      '',      ),
     273    'PdZx_WO':      ( 'IDX_UseModRM',       'reg',    '%Pd',  'PdZx',    '',      ),
     274    'Pq':           ( 'IDX_UseModRM',       'reg',    '%Pq',  'Pq',      '',      ),
     275    'Pq_WO':        ( 'IDX_UseModRM',       'reg',    '%Pq',  'Pq',      '',      ),
     276    'Vd':           ( 'IDX_UseModRM',       'reg',    '%Vd',  'Vd',      '',      ),
     277    'Vd_WO':        ( 'IDX_UseModRM',       'reg',    '%Vd',  'Vd',      '',      ),
     278    'VdZx_WO':      ( 'IDX_UseModRM',       'reg',    '%Vd',  'Vd',      '',      ),
     279    'Vdq':          ( 'IDX_UseModRM',       'reg',    '%Vdq', 'Vdq',     '',      ),
     280    'Vss':          ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     '',      ),
     281    'Vss_WO':       ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     '',      ),
     282    'VssZx_WO':     ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     '',      ),
     283    'Vsd':          ( 'IDX_UseModRM',       'reg',    '%Vsd', 'Vsd',     '',      ),
     284    'Vsd_WO':       ( 'IDX_UseModRM',       'reg',    '%Vsd', 'Vsd',     '',      ),
     285    'VsdZx_WO':     ( 'IDX_UseModRM',       'reg',    '%Vsd', 'Vsd',     '',      ),
     286    'Vps':          ( 'IDX_UseModRM',       'reg',    '%Vps', 'Vps',     '',      ),
     287    'Vps_WO':       ( 'IDX_UseModRM',       'reg',    '%Vps', 'Vps',     '',      ),
     288    'Vpd':          ( 'IDX_UseModRM',       'reg',    '%Vpd', 'Vpd',     '',      ),
     289    'Vpd_WO':       ( 'IDX_UseModRM',       'reg',    '%Vpd', 'Vpd',     '',      ),
     290    'Vq':           ( 'IDX_UseModRM',       'reg',    '%Vq',  'Vq',      '',      ),
     291    'Vq_WO':        ( 'IDX_UseModRM',       'reg',    '%Vq',  'Vq',      '',      ),
     292    'Vdq_WO':       ( 'IDX_UseModRM',       'reg',    '%Vdq', 'Vdq',     '',      ),
     293    'VqHi':         ( 'IDX_UseModRM',       'reg',    '%Vdq', 'VdqHi',   '',      ),
     294    'VqHi_WO':      ( 'IDX_UseModRM',       'reg',    '%Vdq', 'VdqHi',   '',      ),
     295    'VqZx_WO':      ( 'IDX_UseModRM',       'reg',    '%Vq',  'VqZx',    '',      ),
     296    'Vx':           ( 'IDX_UseModRM',       'reg',    '%Vx',  'Vx',      '',      ),
     297    'Vx_WO':        ( 'IDX_UseModRM',       'reg',    '%Vx',  'Vx',      '',      ),
    297298
    298299    # VEX.vvvv
    299     'HssHi':        ( 'IDX_UseModRM',       'vvvv',   '%Hx',  'HssHi',   ),
    300     'HsdHi':        ( 'IDX_UseModRM',       'vvvv',   '%Hx',  'HsdHi',   ),
    301     'HqHi':         ( 'IDX_UseModRM',       'vvvv',   '%Hq',  'HqHi',    ),
     300    'HssHi':        ( 'IDX_UseModRM',       'vvvv',   '%Hx',  'HssHi',   'V',     ),
     301    'HsdHi':        ( 'IDX_UseModRM',       'vvvv',   '%Hx',  'HsdHi',   'V',     ),
     302    'HqHi':         ( 'IDX_UseModRM',       'vvvv',   '%Hq',  'HqHi',    'V',     ),
    302303
    303304    # Immediate values.
    304     'Ib':           ( 'IDX_ParseImmByte',   'imm',    '%Ib',  'Ib',     ), ##< NB! Could be IDX_ParseImmByteSX for some instrs.
    305     'Iw':           ( 'IDX_ParseImmUshort', 'imm',    '%Iw',  'Iw',      ),
    306     'Id':           ( 'IDX_ParseImmUlong',  'imm',    '%Id',  'Id',      ),
    307     'Iq':           ( 'IDX_ParseImmQword',  'imm',    '%Iq',  'Iq',      ),
    308     'Iv':           ( 'IDX_ParseImmV',      'imm',    '%Iv',  'Iv',      ), ##< o16: word, o32: dword, o64: qword
    309     'Iz':           ( 'IDX_ParseImmZ',      'imm',    '%Iz',  'Iz',      ), ##< o16: word, o32|o64:dword
     305    'Ib':           ( 'IDX_ParseImmByte',   'imm',    '%Ib',  'Ib',   '', ), ##< NB! Could be IDX_ParseImmByteSX for some instrs.
     306    'Iw':           ( 'IDX_ParseImmUshort', 'imm',    '%Iw',  'Iw',      '',      ),
     307    'Id':           ( 'IDX_ParseImmUlong',  'imm',    '%Id',  'Id',      '',      ),
     308    'Iq':           ( 'IDX_ParseImmQword',  'imm',    '%Iq',  'Iq',      '',      ),
     309    'Iv':           ( 'IDX_ParseImmV',      'imm',    '%Iv',  'Iv',      '',      ), ##< o16: word, o32: dword, o64: qword
     310    'Iz':           ( 'IDX_ParseImmZ',      'imm',    '%Iz',  'Iz',      '',      ), ##< o16: word, o32|o64:dword
    310311
    311312    # Address operands (no ModR/M).
    312     'Ob':           ( 'IDX_ParseImmAddr',   'imm',    '%Ob',  'Ob',      ),
    313     'Ov':           ( 'IDX_ParseImmAddr',   'imm',    '%Ov',  'Ov',      ),
     313    'Ob':           ( 'IDX_ParseImmAddr',   'imm',    '%Ob',  'Ob',      '',      ),
     314    'Ov':           ( 'IDX_ParseImmAddr',   'imm',    '%Ov',  'Ov',      '',      ),
    314315
    315316    # Relative jump targets
    316     'Jb':           ( 'IDX_ParseImmBRel',   'imm',    '%Jb',  'Jb',      ),
    317     'Jv':           ( 'IDX_ParseImmVRel',   'imm',    '%Jv',  'Jv',      ),
     317    'Jb':           ( 'IDX_ParseImmBRel',   'imm',    '%Jb',  'Jb',      '',      ),
     318    'Jv':           ( 'IDX_ParseImmVRel',   'imm',    '%Jv',  'Jv',      '',      ),
    318319
    319320    # DS:rSI
    320     'Xb':           ( 'IDX_ParseXb',        'rSI',    '%eSI', 'Xb',      ),
    321     'Xv':           ( 'IDX_ParseXv',        'rSI',    '%eSI', 'Xv',      ),
     321    'Xb':           ( 'IDX_ParseXb',        'rSI',    '%eSI', 'Xb',      '',      ),
     322    'Xv':           ( 'IDX_ParseXv',        'rSI',    '%eSI', 'Xv',      '',      ),
    322323    # ES:rDI
    323     'Yb':           ( 'IDX_ParseYb',        'rDI',    '%eDI', 'Yb',      ),
    324     'Yv':           ( 'IDX_ParseYv',        'rDI',    '%eDI', 'Yv',      ),
    325 
    326     'Fv':           ( 'IDX_ParseFixedReg',  'rFLAGS', '%Fv',  'Fv',      ),
     324    'Yb':           ( 'IDX_ParseYb',        'rDI',    '%eDI', 'Yb',      '',      ),
     325    'Yv':           ( 'IDX_ParseYv',        'rDI',    '%eDI', 'Yv',      '',      ),
     326
     327    'Fv':           ( 'IDX_ParseFixedReg',  'rFLAGS', '%Fv',  'Fv',      '',      ),
    327328
    328329    # Fixed registers.
    329     'AL':           ( 'IDX_ParseFixedReg',  'AL',     'al',   'REG_AL',  ),
    330     'rAX':          ( 'IDX_ParseFixedReg',  'rAX',    '%eAX', 'REG_EAX', ),
    331     'CS':           ( 'IDX_ParseFixedReg',  'CS',     'cs',   'REG_CS',  ), # 8086: push CS
    332     'DS':           ( 'IDX_ParseFixedReg',  'DS',     'ds',   'REG_DS',  ),
    333     'ES':           ( 'IDX_ParseFixedReg',  'ES',     'es',   'REG_ES',  ),
    334     'FS':           ( 'IDX_ParseFixedReg',  'FS',     'fs',   'REG_FS',  ),
    335     'GS':           ( 'IDX_ParseFixedReg',  'GS',     'gs',   'REG_GS',  ),
    336     'SS':           ( 'IDX_ParseFixedReg',  'SS',     'ss',   'REG_SS',  ),
     330    'AL':           ( 'IDX_ParseFixedReg',  'AL',     'al',   'REG_AL',  '',      ),
     331    'rAX':          ( 'IDX_ParseFixedReg',  'rAX',    '%eAX', 'REG_EAX', '',      ),
     332    'CS':           ( 'IDX_ParseFixedReg',  'CS',     'cs',   'REG_CS',  '',      ), # 8086: push CS
     333    'DS':           ( 'IDX_ParseFixedReg',  'DS',     'ds',   'REG_DS',  '',      ),
     334    'ES':           ( 'IDX_ParseFixedReg',  'ES',     'es',   'REG_ES',  '',      ),
     335    'FS':           ( 'IDX_ParseFixedReg',  'FS',     'fs',   'REG_FS',  '',      ),
     336    'GS':           ( 'IDX_ParseFixedReg',  'GS',     'gs',   'REG_GS',  '',      ),
     337    'SS':           ( 'IDX_ParseFixedReg',  'SS',     'ss',   'REG_SS',  '',      ),
    337338};
    338339
     
    342343
    343344## IEMFORM_XXX mappings.
    344 g_kdIemForms = {     # sEncoding,   [ sWhere1, ... ]
    345     'RM':           ( 'ModR/M',     [ 'reg', 'rm' ], ),
    346     'RM_REG':       ( 'ModR/M',     [ 'reg', 'rm' ], ),
    347     'RM_MEM':       ( 'ModR/M',     [ 'reg', 'rm' ], ),
    348     'MR':           ( 'ModR/M',     [ 'rm', 'reg' ], ),
    349     'MR_REG':       ( 'ModR/M',     [ 'rm', 'reg' ], ),
    350     'MR_MEM':       ( 'ModR/M',     [ 'rm', 'reg' ], ),
    351     'M':            ( 'ModR/M',     [ 'rm', ], ),
    352     'M_REG':        ( 'ModR/M',     [ 'rm', ], ),
    353     'M_MEM':        ( 'ModR/M',     [ 'rm', ], ),
    354     'R':            ( 'ModR/M',     [ 'reg', ], ),
    355 
    356     'VEX_RM':       ( 'VEX.ModR/M', [ 'reg', 'rm' ], ),
    357     'VEX_RM_REG':   ( 'VEX.ModR/M', [ 'reg', 'rm' ], ),
    358     'VEX_RM_MEM':   ( 'VEX.ModR/M', [ 'reg', 'rm' ], ),
    359     'VEX_XM':       ( 'VEX.ModR/M', [ 'reg', 'rm' ], ), # same as VEX_RM_MEM, typo?
    360     'VEX_MR':       ( 'VEX.ModR/M', [ 'rm', 'reg' ], ),
    361     'VEX_MR_REG':   ( 'VEX.ModR/M', [ 'rm', 'reg' ], ),
    362     'VEX_MR_MEM':   ( 'VEX.ModR/M', [ 'rm', 'reg' ], ),
    363     'VEX_M':        ( 'VEX.ModR/M', [ 'rm', ], ),
    364     'VEX_M_REG':    ( 'VEX.ModR/M', [ 'rm', ], ),
    365     'VEX_M_MEM':    ( 'VEX.ModR/M', [ 'rm', ], ),
    366     'VEX_R':        ( 'VEX.ModR/M', [ 'reg', ], ),
    367     'VEX_RVM':      ( 'VEX.ModR/M', [ 'reg', 'vvvv', 'rm'], ),
    368     'VEX_RVM_REG':  ( 'VEX.ModR/M', [ 'reg', 'vvvv', 'rm'], ),
    369     'VEX_RVM_MEM':  ( 'VEX.ModR/M', [ 'reg', 'vvvv', 'rm'], ),
    370     'VEX_MVR':      ( 'VEX.ModR/M', [ 'rm', 'vvvv', 'reg'], ),
    371     'VEX_MVR_REG':  ( 'VEX.ModR/M', [ 'rm', 'vvvv', 'reg'], ),
    372     'VEX_MVR_MEM':  ( 'VEX.ModR/M', [ 'rm', 'vvvv', 'reg'], ),
    373 
    374     'FIXED':        ( 'fixed',      None, )
     345g_kdIemForms = {     # sEncoding,   [ sWhere1, ... ]         opcodesub      ),
     346    'RM':           ( 'ModR/M',     [ 'reg', 'rm' ],         '',            ),
     347    'RM_REG':       ( 'ModR/M',     [ 'reg', 'rm' ],         '11 mr/reg',   ),
     348    'RM_MEM':       ( 'ModR/M',     [ 'reg', 'rm' ],         '!11 mr/reg',  ),
     349    'MR':           ( 'ModR/M',     [ 'rm', 'reg' ],         '',            ),
     350    'MR_REG':       ( 'ModR/M',     [ 'rm', 'reg' ],         '11 mr/reg',   ),
     351    'MR_MEM':       ( 'ModR/M',     [ 'rm', 'reg' ],         '!11 mr/reg',  ),
     352    'M':            ( 'ModR/M',     [ 'rm', ],               '',            ),
     353    'M_REG':        ( 'ModR/M',     [ 'rm', ],               '',            ),
     354    'M_MEM':        ( 'ModR/M',     [ 'rm', ],               '',            ),
     355    'R':            ( 'ModR/M',     [ 'reg', ],              '',            ),
     356
     357    'VEX_RM':       ( 'VEX.ModR/M', [ 'reg', 'rm' ],         '',            ),
     358    'VEX_RM_REG':   ( 'VEX.ModR/M', [ 'reg', 'rm' ],         '11 mr/reg',   ),
     359    'VEX_RM_MEM':   ( 'VEX.ModR/M', [ 'reg', 'rm' ],         '!11 mr/reg',  ),
     360    'VEX_MR':       ( 'VEX.ModR/M', [ 'rm', 'reg' ],         '',            ),
     361    'VEX_MR_REG':   ( 'VEX.ModR/M', [ 'rm', 'reg' ],         '11 mr/reg',   ),
     362    'VEX_MR_MEM':   ( 'VEX.ModR/M', [ 'rm', 'reg' ],         '!11 mr/reg',  ),
     363    'VEX_M':        ( 'VEX.ModR/M', [ 'rm', ],               '' ),
     364    'VEX_M_REG':    ( 'VEX.ModR/M', [ 'rm', ],               '' ),
     365    'VEX_M_MEM':    ( 'VEX.ModR/M', [ 'rm', ],               '' ),
     366    'VEX_R':        ( 'VEX.ModR/M', [ 'reg', ],              '' ),
     367    'VEX_RVM':      ( 'VEX.ModR/M', [ 'reg', 'vvvv', 'rm' ], '',            ),
     368    'VEX_RVM_REG':  ( 'VEX.ModR/M', [ 'reg', 'vvvv', 'rm' ], '11 mr/reg',   ),
     369    'VEX_RVM_MEM':  ( 'VEX.ModR/M', [ 'reg', 'vvvv', 'rm' ], '!11 mr/reg',  ),
     370    'VEX_MVR':      ( 'VEX.ModR/M', [ 'rm', 'vvvv', 'reg' ], '',            ),
     371    'VEX_MVR_REG':  ( 'VEX.ModR/M', [ 'rm', 'vvvv', 'reg' ], '11 mr/reg',   ),
     372    'VEX_MVR_MEM':  ( 'VEX.ModR/M', [ 'rm', 'vvvv', 'reg' ], '!11 mr/reg',  ),
     373
     374    'FIXED':        ( 'fixed',      None,                    '',            ),
    375375};
    376376
     
    394394
    395395## Special \@opcodesub tag values.
     396## The first value is the real value for aliases.
     397## The second value is for bs3cg1.
    396398g_kdSubOpcodes = {
    397     'none':         [ None,         ],
    398     '11 mr/reg':    [ '11 mr/reg',  ],
    399     '11':           [ '11 mr/reg',  ],      ##< alias
    400     '!11 mr/reg':   [ '!11 mr/reg', ],
    401     '!11':          [ '!11 mr/reg', ],      ##< alias
    402     'rex.w=0':      [ 'rex.w=0',    ],
    403     'w=0':          [ 'rex.w=0',    ],      ##< alias
    404     'rex.w=1':      [ 'rex.w=1',    ],
    405     'w=1':          [ 'rex.w=1',    ],      ##< alias
     399    'none':                 [ None,                 '',         ],
     400    '11 mr/reg':            [ '11 mr/reg',          '',         ],
     401    '11':                   [ '11 mr/reg',          '',         ], ##< alias
     402    '!11 mr/reg':           [ '!11 mr/reg',         '',         ],
     403    '!11':                  [ '!11 mr/reg',         '',         ], ##< alias
     404    'rex.w=0':              [ 'rex.w=0',            'WZ',       ],
     405    'w=0':                  [ 'rex.w=0',            '',         ], ##< alias
     406    'rex.w=1':              [ 'rex.w=1',            'WNZ',      ],
     407    'w=1':                  [ 'rex.w=1',            '',         ], ##< alias
     408    'vex.l=0':              [ 'vex.l=0',            'L0',       ],
     409    'vex.l=1':              [ 'vex.l=0',            'L1',       ],
     410    '11 mr/reg vex.l=0':    [ '11 mr/reg vex.l=0',  'L0',       ],
     411    '11 mr/reg vex.l=1':    [ '11 mr/reg vex.l=1',  'L1',       ],
     412    '!11 mr/reg vex.l=0':   [ '!11 mr/reg vex.l=0', 'L0',       ],
     413    '!11 mr/reg vex.l=1':   [ '!11 mr/reg vex.l=1', 'L1',       ],
    406414};
    407415
     
    463471    'xsave':        'X86_CPUID_FEATURE_ECX_XSAVE',
    464472    'avx':          'X86_CPUID_FEATURE_ECX_AVX',
     473    'avx2':         'X86_CPUID_STEXT_FEATURE_EBX_AVX2',
    465474    'f16c':         'X86_CPUID_FEATURE_ECX_F16C',
    466475    'rdrand':       'X86_CPUID_FEATURE_ECX_RDRAND',
     
    512521    'ignores_rexw':          '',                                ##< Ignores REX.W.
    513522    'ignores_op_sizes':      '',                                ##< Shorthand for "ignores_oz_pfx | ignores_op_sizes".
    514     'ignores_vex_l':         '',                                ##< Ignores VEX.L.
    515523    'vex_l_zero':            '',                                ##< VEX.L must be 0.
     524    'vex_l_ignored':         '',                                ##< VEX.L is ignored.
    516525    'lock_allowed':          '',                                ##< Lock prefix allowed.
    517526};
     
    16851694        return False;
    16861695
     1696    def errorOnLine(self, iLine, sMessage):
     1697        """
     1698        Adds an error.
     1699        returns False;
     1700        """
     1701        self.asErrors.append(u'%s:%d: error: %s\n' % (self.sSrcFile, iLine, sMessage,));
     1702        return False;
     1703
    16871704    def errorComment(self, iLineInComment, sMessage):
    16881705        """
     
    21652182        """
    21662183        Tag:        \@opcodesub
    2167         Value:      none | 11 mr/reg | !11 mr/reg
     2184        Value:      none | 11 mr/reg | !11 mr/reg | rex.w=0 | rex.w=1 | vex.l=0 | vex.l=1
     2185                    | 11 mr/reg vex.l=0 | 11 mr/reg vex.l=1 | !11 mr/reg vex.l=0 | !11 mr/reg vex.l=1
    21682186
    21692187        This is a simple way of dealing with encodings where the mod=3 and mod!=3
     
    28942912        off      = offOpen + 1;
    28952913        offStart = off;
     2914        chQuote  = None;
    28962915        while cDepth > 0:
    28972916            if off >= len(sInvocation):
    28982917                if iLine >= len(self.asLines):
    2899                     return self.error('macro invocation beyond end of file');
     2918                    self.error('macro invocation beyond end of file');
     2919                    return (off, asRet);
    29002920                sInvocation += self.asLines[iLine];
    29012921                iLine += 1;
    29022922            ch = sInvocation[off];
    29032923
    2904             if ch == ',' or ch == ')':
     2924            if chQuote:
     2925                if ch == '\\' and off + 1 < len(sInvocation):
     2926                    off += 1;
     2927                elif ch == chQuote:
     2928                    chQuote = None;
     2929            elif ch == '"' or ch == '\'':
     2930                chQuote = ch;
     2931            elif ch == ',' or ch == ')':
    29052932                if cDepth == 1:
    29062933                    asRet.append(sInvocation[offStart:off].strip());
     
    30213048                            self.error('%s: current instruction @op%u and a_Form location does not match: %s vs %s (%s)'
    30223049                                       % (sMacro, iOperand + 1, oInstr.aoOperands[iOperand].sWhere, sWhere, sForm,));
     3050                        sOpFormMatch = g_kdOpTypes[oInstr.aoOperands[iOperand].sType][4];
     3051                        if    (sOpFormMatch in [ 'REG', 'MEM', ] and sForm.find('_' + sOpFormMatch) < 0) \
     3052                           or (sOpFormMatch in [ 'FIXED', ]      and sForm.find(sOpFormMatch) < 0) \
     3053                           or (sOpFormMatch == 'RM' and (sForm.find('_MEM') > 0 or sForm.find('_REG') > 0) ) \
     3054                           or (sOpFormMatch == 'V'  and (   not (sForm.find('VEX') > 0 or sForm.find('XOP')) \
     3055                                                         or sForm.replace('VEX','').find('V') < 0) ):
     3056                            self.error('%s: current instruction @op%u and a_Form type does not match: %s/%s vs %s'
     3057                                       % (sMacro, iOperand + 1, oInstr.aoOperands[iOperand].sType, sOpFormMatch, sForm, ));
     3058
     3059            # Check @opcodesub
     3060            if oInstr.sSubOpcode \
     3061              and g_kdIemForms[sForm][2] \
     3062              and oInstr.sSubOpcode.find(g_kdIemForms[sForm][2]) < 0:
     3063                self.error('%s: current instruction @opcodesub and a_Form does not match: %s vs %s (%s)'
     3064                            % (sMacro, oInstr.sSubOpcode, g_kdIemForms[sForm][2], sForm,));
    30233065
    30243066        # Stats.
     
    30533095            elif sHint != '0':
    30543096                self.error('%s: expected a_fIemHints value: %s' % (sMacro, sHint,));
    3055 
    30563097
    30573098        _ = sAsm;
     
    30993140                    self.doneInstructions();
    31003141                return True;
     3142
     3143            # IEMOP_HLP_DONE_VEX_DECODING_*
     3144            asArgs = self.findAndParseFirstMacroInvocation(sCode,
     3145                                                           [ 'IEMOP_HLP_DONE_VEX_DECODING',
     3146                                                             'IEMOP_HLP_DONE_VEX_DECODING_L0',
     3147                                                             'IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV',
     3148                                                             'IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV',
     3149                                                             ]);
     3150            if asArgs is not None:
     3151                sMacro = asArgs[0];
     3152                if sMacro in ('IEMOP_HLP_DONE_VEX_DECODING_L0', 'IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV', ):
     3153                    for oInstr in self.aoCurInstrs:
     3154                        if 'vex_l_zero' not in oInstr.dHints:
     3155                            if oInstr.iLineMnemonicMacro >= 0:
     3156                                self.errorOnLine(oInstr.iLineMnemonicMacro,
     3157                                                 'Missing IEMOPHINT_VEX_L_ZERO! (%s on line %d)' % (sMacro, self.iLine,));
     3158                            oInstr.dHints['vex_l_zero'] = True;
     3159                return True;
     3160
     3161            #
     3162            # IEMOP_MNEMONIC*
     3163            #
    31013164
    31023165            # IEMOP_MNEMONIC(a_Stats, a_szMnemonic) IEMOP_INC_STATS(a_Stats)
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r67037 r67072  
    221221         * @note        HssHi refers to bits 127:32.
    222222         */
    223         IEMOP_MNEMONIC3(VEX_RVM, VMOVSS, vmovss, Vss_WO, HssHi, Uss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_IGNORES_VEX_L);
     223        IEMOP_MNEMONIC3(VEX_RVM_REG, VMOVSS, vmovss, Vss_WO, HssHi, Uss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    224224        IEMOP_HLP_DONE_VEX_DECODING();
    225225        IEM_MC_BEGIN(0, 0);
     
    239239         * @opcode      0x10
    240240         * @oppfx       0xf3
    241          * @opcodesub   11 mr/reg
     241         * @opcodesub   !11 mr/reg
    242242         * @opcpuid     avx
    243243         * @opgroup     og_avx_simdfp_datamove
     
    247247         * @optest      op1=0 op2=-22 -> op1=-22
    248248         */
    249         IEMOP_MNEMONIC2(VEX_XM, VMOVSS, vmovss, VssZx_WO, Md, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_IGNORES_VEX_L);
     249        IEMOP_MNEMONIC2(VEX_RM_MEM, VMOVSS, vmovss, VssZx_WO, Md, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    250250        IEM_MC_BEGIN(0, 2);
    251251        IEM_MC_LOCAL(uint32_t,                  uSrc);
     
    287287         * @optest      op1=3 op2=0x42 op3=0x77 -> op1=0x420000000000000077
    288288         */
    289         IEMOP_MNEMONIC3(VEX_RVM, VMOVSD, vmovsd, Vsd_WO, HsdHi, Usd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_IGNORES_VEX_L);
     289        IEMOP_MNEMONIC3(VEX_RVM_REG, VMOVSD, vmovsd, Vsd_WO, HsdHi, Usd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    290290        IEMOP_HLP_DONE_VEX_DECODING();
    291291        IEM_MC_BEGIN(0, 0);
     
    305305         * @opcode      0x10
    306306         * @oppfx       0xf2
    307          * @opcodesub   11 mr/reg
     307         * @opcodesub   !11 mr/reg
    308308         * @opcpuid     avx
    309309         * @opgroup     og_avx_simdfp_datamove
     
    313313         * @optest      op1=0 op2=-22 -> op1=-22
    314314         */
    315         IEMOP_MNEMONIC2(VEX_XM, VMOVSD, vmovsd, VsdZx_WO, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_IGNORES_VEX_L);
     315        IEMOP_MNEMONIC2(VEX_RM_MEM, VMOVSD, vmovsd, VsdZx_WO, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    316316        IEM_MC_BEGIN(0, 2);
    317317        IEM_MC_LOCAL(uint64_t,                  uSrc);
     
    504504         * @optest      op1=3 op2=0x42 op3=0x77 -> op1=0x4200000077
    505505         */
    506         IEMOP_MNEMONIC3(VEX_MVR, VMOVSS, vmovss, Uss_WO, HssHi, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_IGNORES_VEX_L);
     506        IEMOP_MNEMONIC3(VEX_MVR_REG, VMOVSS, vmovss, Uss_WO, HssHi, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    507507        IEMOP_HLP_DONE_VEX_DECODING();
    508508        IEM_MC_BEGIN(0, 0);
     
    522522         * @opcode      0x11
    523523         * @oppfx       0xf3
    524          * @opcodesub   11 mr/reg
     524         * @opcodesub   !11 mr/reg
    525525         * @opcpuid     avx
    526526         * @opgroup     og_avx_simdfp_datamove
     
    530530         * @optest      op1=0 op2=-22 -> op1=-22
    531531         */
    532         IEMOP_MNEMONIC2(VEX_MR, VMOVSS, vmovss, Md_WO, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_IGNORES_VEX_L);
     532        IEMOP_MNEMONIC2(VEX_MR_MEM, VMOVSS, vmovss, Md_WO, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    533533        IEM_MC_BEGIN(0, 2);
    534534        IEM_MC_LOCAL(uint32_t,                  uSrc);
     
    570570         * @optest      op2=0x42 op3=0x77 -> op1=0x420000000000000077
    571571         */
    572         IEMOP_MNEMONIC3(VEX_MVR, VMOVSD, vmovsd, Usd_WO, HsdHi, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_IGNORES_VEX_L);
     572        IEMOP_MNEMONIC3(VEX_MVR_REG, VMOVSD, vmovsd, Usd_WO, HsdHi, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    573573        IEMOP_HLP_DONE_VEX_DECODING();
    574574        IEM_MC_BEGIN(0, 0);
     
    588588         * @opcode      0x11
    589589         * @oppfx       0xf2
    590          * @opcodesub   11 mr/reg
     590         * @opcodesub   !11 mr/reg
    591591         * @opcpuid     avx
    592592         * @opgroup     og_avx_simdfp_datamove
     
    596596         * @optest      op1=0 op2=-22 -> op1=-22
    597597         */
    598         IEMOP_MNEMONIC2(VEX_MR, VMOVSD, vmovsd, Mq_WO, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_IGNORES_VEX_L);
     598        IEMOP_MNEMONIC2(VEX_MR_MEM, VMOVSD, vmovsd, Mq_WO, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    599599        IEM_MC_BEGIN(0, 2);
    600600        IEM_MC_LOCAL(uint64_t,                  uSrc);
     
    635635         * @note        op3 and op2 are only the 8-byte high XMM register halfs.
    636636         */
    637         IEMOP_MNEMONIC3(VEX_RVM, VMOVHLPS, vmovhlps, Vq_WO, HqHi, UqHi, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
     637        IEMOP_MNEMONIC3(VEX_RVM_REG, VMOVHLPS, vmovhlps, Vq_WO, HqHi, UqHi, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
    638638
    639639        IEMOP_HLP_DONE_VEX_DECODING_L0();
     
    20572057         * @optest      64-bit / op1=0 op2=-42 -> op1=-42
    20582058         */
    2059         IEMOP_MNEMONIC2(VEX_RM, VMOVQ, vmovq, Vq_WO, Eq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     2059        IEMOP_MNEMONIC2(VEX_RM, VMOVQ, vmovq, Vq_WO, Eq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX | IEMOPHINT_VEX_L_ZERO);
    20602060        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    20612061        {
     
    21072107         * @optest      op1=0 op2=-42 -> op1=-42
    21082108         */
    2109         IEMOP_MNEMONIC2(VEX_RM, VMOVD, vmovd, Vd_WO, Ed, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     2109        IEMOP_MNEMONIC2(VEX_RM, VMOVD, vmovd, Vd_WO, Ed, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX | IEMOPHINT_VEX_L_ZERO);
    21102110        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    21112111        {
     
    27502750         * @optest      64-bit / op1=0 op2=-42 -> op1=-42
    27512751         */
    2752         IEMOP_MNEMONIC2(VEX_MR, VMOVQ, vmovq, Eq_WO, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     2752        IEMOP_MNEMONIC2(VEX_MR, VMOVQ, vmovq, Eq_WO, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX | IEMOPHINT_VEX_L_ZERO);
    27532753        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    27542754        {
     
    28002800         * @optest      op1=0 op2=-42 -> op1=-42
    28012801         */
    2802         IEMOP_MNEMONIC2(VEX_MR, VMOVD, vmovd, Ed_WO, Vd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     2802        IEMOP_MNEMONIC2(VEX_MR, VMOVD, vmovd, Ed_WO, Vd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX | IEMOPHINT_VEX_L_ZERO);
    28032803        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    28042804        {
     
    28502850FNIEMOP_DEF(iemOp_vmovq_Vq_Wq)
    28512851{
    2852     IEMOP_MNEMONIC2(VEX_RM, VMOVQ, vmovq, Vq_WO, Wq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     2852    IEMOP_MNEMONIC2(VEX_RM, VMOVQ, vmovq, Vq_WO, Wq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
    28532853    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    28542854    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    31813181FNIEMOP_DEF_1(iemOp_VGrp15_vstmxcsr,  uint8_t, bRm)
    31823182{
    3183     IEMOP_MNEMONIC1(VEX_M_MEM, VSTMXCSR, vstmxcsr, Md_WO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     3183    IEMOP_MNEMONIC1(VEX_M_MEM, VSTMXCSR, vstmxcsr, Md_WO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
    31843184    IEM_MC_BEGIN(2, 0);
    31853185    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
     
    33673367FNIEMOP_DEF(iemOp_vmovq_Wq_Vq)
    33683368{
    3369     IEMOP_MNEMONIC2(VEX_MR, VMOVQ, vmovq, Wq_WO, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     3369    IEMOP_MNEMONIC2(VEX_MR, VMOVQ, vmovq, Wq_WO, Vq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
    33703370    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    33713371    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    35553555FNIEMOP_DEF(iemOp_vmovntdq_Mx_Vx)
    35563556{
    3557     IEMOP_MNEMONIC2(VEX_MR, VMOVNTDQ, vmovntdq, Mx_WO, Vx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     3557    IEMOP_MNEMONIC2(VEX_MR_MEM, VMOVNTDQ, vmovntdq, Mx_WO, Vx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    35583558    Assert(pVCpu->iem.s.uVexLength <= 1);
    35593559    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r67042 r67072  
    135135FNIEMOP_STUB(iemOp_vpcmpeqq_Vx_Hx_Wx);
    136136
    137 /** Opcode VEX.66.0F38 0x2a. */
    138 /*
    139  * @ opcode      0x2a
    140  * @ opcodesub   !11 mr/reg vex.l=0
    141  * @ oppfx       0x66
    142  * @ opcpuid     avx
    143  * @ opgroup     og_avx_cachect
    144  * @ opxcpttype  1
    145  * @ optest      op1=-1 op2=2  -> op1=2
    146  * @ optest      op1=0 op2=-42 -> op1=-42
    147  */
     137
    148138FNIEMOP_DEF(iemOp_vmovntdqa_Vx_Mx)
    149139{
    150140    Assert(pVCpu->iem.s.uVexLength <= 1);
    151     IEMOP_MNEMONIC2(VEX_RM, VMOVNTDQA, vmovntdqa, Vx_WO, Mx, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    152141    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    153142    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     
    155144        if (pVCpu->iem.s.uVexLength == 0)
    156145        {
    157             /*
    158              * 128-bit: Memory, register.
     146            /**
     147             * @opcode      0x2a
     148             * @opcodesub   !11 mr/reg vex.l=0
     149             * @oppfx       0x66
     150             * @opcpuid     avx
     151             * @opgroup     og_avx_cachect
     152             * @opxcpttype  1
     153             * @optest      op1=-1 op2=2  -> op1=2
     154             * @optest      op1=0 op2=-42 -> op1=-42
    159155             */
     156            /* 128-bit: Memory, register. */
     157            IEMOP_MNEMONIC2EX(vmovntdqa_Vdq_WO_Mdq_L0, "vmovntdqa, Vdq_WO, Mdq", VEX_RM_MEM, VMOVNTDQA, vmovntdqa, Vx_WO, Mx,
     158                              DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    160159            IEM_MC_BEGIN(0, 2);
    161160            IEM_MC_LOCAL(RTUINT128U,                uSrc);
     
    175174        else
    176175        {
    177 /*
    178  * @ opdone
    179  * @ opcode      0x2a
    180  * @ opcodesub   !11 mr/reg vex.l=1
    181  * @ oppfx       0x66
    182  * @ opcpuid     avx2
    183  * @ opgroup     og_avx2_cachect
    184  * @ opxcpttype  1
    185  * @ optest      op1=-1 op2=2  -> op1=2
    186  * @ optest      op1=0 op2=-42 -> op1=-42
    187  */
    188             /*
    189              * 256-bit: Memory, register.
     176            /**
     177             * @opdone
     178             * @opcode      0x2a
     179             * @opcodesub   !11 mr/reg vex.l=1
     180             * @oppfx       0x66
     181             * @opcpuid     avx2
     182             * @opgroup     og_avx2_cachect
     183             * @opxcpttype  1
     184             * @optest      op1=-1 op2=2  -> op1=2
     185             * @optest      op1=0 op2=-42 -> op1=-42
    190186             */
     187            /* 256-bit: Memory, register. */
     188            IEMOP_MNEMONIC2EX(vmovntdqa_Vqq_WO_Mqq_L1, "vmovntdqa, Vqq_WO,Mqq", VEX_RM_MEM, VMOVNTDQA, vmovntdqa, Vx_WO, Mx,
     189                              DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    191190            IEM_MC_BEGIN(0, 2);
    192191            IEM_MC_LOCAL(RTUINT256U,                uSrc);
     
    196195            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    197196            IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
    198             IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
    199 
    200             IEM_MC_FETCH_YREG_U256(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    201             IEM_MC_STORE_MEM_U256_ALIGN_AVX(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     197            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     198
     199            IEM_MC_FETCH_MEM_U256_ALIGN_AVX(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     200            IEM_MC_STORE_YREG_U256_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
    202201
    203202            IEM_MC_ADVANCE_RIP();
     
    206205        return VINF_SUCCESS;
    207206    }
     207
    208208    /**
    209209     * @opdone
    210      * @opmnemonic  udvex660f382areg
     210     * @opmnemonic  udvex660f382arg
    211211     * @opcode      0x2a
    212212     * @opcodesub   11 mr/reg
     
    215215     * @opcpuid     avx
    216216     * @optest      ->
    217      * @oponly
    218217     */
    219218    return IEMOP_RAISE_INVALID_OPCODE();
    220219
    221220}
     221
    222222
    223223/** Opcode VEX.66.0F38 0x2b. */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r67003 r67072  
    914914/** VEX+ModR/M: reg, r/m (memory)   */
    915915#define IEMOPFORM_VEX_RM_MEM    (IEMOPFORM_VEX_RM | IEMOPFORM_NOT_MOD3)
    916 #define IEMOPFORM_VEX_XM        IEMOPFORM_VEX_RM_MEM
    917916/** VEX+ModR/M: r/m, reg */
    918917#define IEMOPFORM_VEX_MR        5
     
    956955/** Ignores the operand size prefix (66h). */
    957956#define IEMOPHINT_IGNORES_OZ_PFX    RT_BIT_32(10)
    958 /** Ignores REX.W. */
     957/** Ignores REX.W (aka WIG). */
    959958#define IEMOPHINT_IGNORES_REXW      RT_BIT_32(11)
    960959/** Both the operand size prefixes (66h + REX.W) are ignored. */
     
    963962#define IEMOPHINT_LOCK_ALLOWED      RT_BIT_32(11)
    964963/** The VEX.L value is ignored (aka LIG). */
    965 #define IEMOPHINT_IGNORES_VEX_L     RT_BIT_32(12)
    966 /** The VEX.L value must be zero (i.e. 128-bit width). */
     964#define IEMOPHINT_VEX_L_IGNORED     RT_BIT_32(12)
     965/** The VEX.L value must be zero (i.e. 128-bit width only). */
    967966#define IEMOPHINT_VEX_L_ZERO        RT_BIT_32(13)
    968967
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r67042 r67072  
    119119#define IEMOP_HLP_DEFAULT_64BIT_OP_SIZE()                   do { } while (0)
    120120#define IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE(a_szPrf)      do { } while (0)
    121 #define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV()         do { } while (0)
    122121#define IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX()            do { } while (0)
    123 #define IEMOP_HLP_DONE_VEX_DECODING()             do { } while (0)
    124 #define IEMOP_HLP_DONE_VEX_DECODING_L0()      do { } while (0)
    125 #define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV() do { } while (0)
     122#define IEMOP_HLP_DONE_VEX_DECODING()                       do { } while (0)
     123#define IEMOP_HLP_DONE_VEX_DECODING_L0()                    do { } while (0)
     124#define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV()               do { } while (0)
     125#define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV()        do { } while (0)
    126126#define IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES()                                    do { } while (0)
    127127
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-data.py

    r67040 r67072  
    305305        for oOp in oInstr.aoOperands:
    306306            self.sEncoding     += '_' + oOp.sType;
    307         if oInstr.sSubOpcode == 'rex.w=1':      self.sEncoding += '_WNZ';
    308         elif oInstr.sSubOpcode == 'rex.w=0':    self.sEncoding += '_WZ';
     307        if oInstr.sSubOpcode and iai.g_kdSubOpcodes[oInstr.sSubOpcode][1]:
     308            self.sEncoding     += '_' + iai.g_kdSubOpcodes[oInstr.sSubOpcode][1];
    309309
    310310        if oInstr.fUnused:
     
    334334        if 'vex_l_zero' in oInstr.dHints:
    335335            self.asFlags.append('BS3CG1INSTR_F_VEX_L_ZERO');
     336        if 'vex_l_ignored' in oInstr.dHints:
     337            self.asFlags.append('BS3CG1INSTR_F_VEX_L_IGNORED');
    336338
    337339        self.fAdvanceMnemonic   = True; ##< Set by the caller.
     
    367369        return ', '.join(['(uint8_t)BS3CG1OP_%s' % (oOp.sType,) for oOp in self.oInstr.aoOperands]);
    368370
     371    def getOpcodeMap(self):
     372        """ Returns the opcode map number for the BS3CG1INSTR structure. """
     373        sEncoding = self.oInstr.aoMaps[0].sEncoding;
     374        if sEncoding == 'legacy':   return 0;
     375        if sEncoding == 'vex1':     return 1;
     376        if sEncoding == 'vex2':     return 2;
     377        if sEncoding == 'vex3':     return 3;
     378        if sEncoding == 'xop8':     return 8;
     379        if sEncoding == 'xop9':     return 9;
     380        if sEncoding == 'xop10':    return 10;
     381        assert False, sEncoding;
     382        return 3;
     383
    369384    def getInstructionEntry(self):
    370385        """ Returns an array of BS3CG1INSTR member initializers. """
     386        assert len(self.oInstr.sMnemonic) < 16;
    371387        sOperands = ', '.join([oOp.sType for oOp in self.oInstr.aoOperands]);
    372388        if sOperands:
     
    379395            '        /* offTests = */         %s,' % (self.oTests.offTests,),
    380396            '        /* enmEncoding = */      (unsigned)%s,' % (self.sEncoding,),
     397            '        /* uOpcodeMap = */       (unsigned)%s,' % (self.getOpcodeMap(),),
    381398            '        /* enmPrefixKind = */    (unsigned)%s,' % (self.sPfxKind,),
    382399            '        /* enmCpuTest = */       (unsigned)%s,' % (self.sCpu,),
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r67040 r67072  
    147147    /** The encoding. */
    148148    BS3CG1ENC               enmEncoding;
    149     /** The non-invalid encoding.  This differs from enmEncoding when
     149    /** The non-invalid encoding.  This may differ from enmEncoding when
    150150     * Bs3Cg1CalcNoneIntelInvalidEncoding has been called. */
    151151    BS3CG1ENC               enmEncodingNonInvalid;
     
    167167    /** Whether to advance the mnemonic pointer or not. */
    168168    uint8_t                 fAdvanceMnemonic;
     169    /** The opcode map number.  */
     170    uint8_t                 uOpcodeMap;
    169171    /** The number of opcode bytes.   */
    170172    uint8_t                 cbOpcodes;
     
    275277    /** Set by the encoding method to indicating invalid encoding. */
    276278    bool                    fInvalidEncoding;
     279    /** The result of Bs3Cg1CpuSetupFirst(). */
     280    bool                    fCpuSetupFirstResult;
    277281
    278282    /** The context we're working on. */
     
    885889AssertCompile(RT_ELEMENTS(g_aoffBs3Cg1DstFields) == BS3CG1DST_END);
    886890
    887 #ifdef BS3CG1_DEBUG_CTX_MOD
    888891/** Destination field names. */
    889892static const struct { char sz[12]; } g_aszBs3Cg1DstFields[] =
     
    11571160AssertCompile(RT_ELEMENTS(g_aszBs3Cg1DstFields) == BS3CG1DST_END);
    11581161
    1159 #endif
    11601162
    11611163#if 0
     
    25962598
    25972599/**
     2600 * Inserts a 3-byte VEX prefix.
     2601 *
     2602 * @returns New offDst value.
     2603 * @param   pThis       The state.
     2604 * @param   offDst      The current instruction offset.
     2605 * @param   uVexL       The VEX.L value.
     2606 * @param   uVexV       The VEX.V value (caller inverted it already).
     2607 * @param   uVexR       The VEX.R value (caller inverted it already).
     2608 * @param   uVexX       The VEX.X value (caller inverted it already).
     2609 * @param   uVexB       The VEX.B value (caller inverted it already).
     2610 * @param   uVexW       The VEX.W value (straight).
     2611 */
     2612DECLINLINE(unsigned) BS3_NEAR_CODE Bs3Cg1InsertVex3bPrefix(PBS3CG1STATE pThis, unsigned offDst, uint8_t uVexV, uint8_t uVexL,
     2613                                                           uint8_t uVexR, uint8_t uVexX, uint8_t uVexB, uint8_t uVexW)
     2614{
     2615    uint8_t b1;
     2616    uint8_t b2;
     2617    b1        = uVexR << 7;
     2618    b1       |= uVexX << 6;
     2619    b1       |= uVexB << 5;
     2620    b1       |= pThis->uOpcodeMap;
     2621    b2        = uVexV << 3;
     2622    b2       |= uVexW << 7;
     2623    b2       |= uVexL << 2;
     2624    switch (pThis->enmPrefixKind)
     2625    {
     2626        case BS3CG1PFXKIND_NO_F2_F3_66:     b2 |= 0; break;
     2627        case BS3CG1PFXKIND_REQ_66:          b2 |= 1; break;
     2628        case BS3CG1PFXKIND_REQ_F3:          b2 |= 2; break;
     2629        case BS3CG1PFXKIND_REQ_F2:          b2 |= 3; break;
     2630        default:
     2631            Bs3TestFailedF("enmPrefixKind=%d not supported for VEX!\n", pThis->enmPrefixKind);
     2632            break;
     2633    }
     2634
     2635    pThis->abCurInstr[offDst]     = 0xc4; /* vex3 */
     2636    pThis->abCurInstr[offDst + 1] = b1;
     2637    pThis->abCurInstr[offDst + 2] = b2;
     2638    pThis->uVexL                  = uVexL;
     2639    return offDst + 3;
     2640}
     2641
     2642
     2643/**
    25982644 * Inserts a 2-byte VEX prefix.
     2645 *
     2646 * @note    Will switch to 3-byte VEX prefix if uOpcodeMap isn't one.
    25992647 *
    26002648 * @returns New offDst value.
     
    26082656                                                           uint8_t uVexV, uint8_t uVexL, uint8_t uVexR)
    26092657{
    2610     uint8_t b = uVexR << 7;
    2611     b        |= uVexV << 3;
    2612     b        |= uVexL << 2;
    2613     switch (pThis->enmPrefixKind)
    2614     {
    2615         case BS3CG1PFXKIND_NO_F2_F3_66:     b |= 0; break;
    2616         case BS3CG1PFXKIND_REQ_66:          b |= 1; break;
    2617         case BS3CG1PFXKIND_REQ_F3:          b |= 2; break;
    2618         case BS3CG1PFXKIND_REQ_F2:          b |= 3; break;
    2619         default:
    2620             Bs3TestFailedF("enmPrefixKind=%d not supported for VEX!\n");
    2621             break;
    2622     }
    2623 
    2624     pThis->abCurInstr[offDst]     = 0xc5; /* vex2 */
    2625     pThis->abCurInstr[offDst + 1] = b;
    2626     pThis->uVexL                  = uVexL;
    2627     return offDst + 2;
    2628 }
    2629 
    2630 
    2631 /**
    2632  * Inserts a 3-byte VEX prefix.
    2633  *
    2634  * @returns New offDst value.
    2635  * @param   pThis       The state.
    2636  * @param   offDst      The current instruction offset.
    2637  * @param   uVexL       The VEX.L value.
    2638  * @param   uVexV       The VEX.V value (caller inverted it already).
    2639  * @param   uVexR       The VEX.R value (caller inverted it already).
    2640  * @param   uVexR       The VEX.X value (caller inverted it already).
    2641  * @param   uVexR       The VEX.B value (caller inverted it already).
    2642  * @param   uVexR       The VEX.W value (straight).
    2643  */
    2644 DECLINLINE(unsigned) BS3_NEAR_CODE Bs3Cg1InsertVex3bPrefix(PBS3CG1STATE pThis, unsigned offDst, uint8_t uVexV, uint8_t uVexL,
    2645                                                            uint8_t uVexR, uint8_t uVexX, uint8_t uVexB, uint8_t uVexW)
    2646 {
    2647     uint8_t b1;
    2648     uint8_t b2;
    2649     b1        = uVexR << 7;
    2650     b1       |= uVexX << 6;
    2651     b1       |= uVexB << 5;
    2652     b1       |= 1; /* VEX.mmmmm = 1*/ /** @todo three byte opcode tables */
    2653     b2        = uVexV << 3;
    2654     b2       |= uVexW << 7;
    2655     b2       |= uVexL << 2;
    2656     switch (pThis->enmPrefixKind)
    2657     {
    2658         case BS3CG1PFXKIND_NO_F2_F3_66:     b2 |= 0; break;
    2659         case BS3CG1PFXKIND_REQ_66:          b2 |= 1; break;
    2660         case BS3CG1PFXKIND_REQ_F3:          b2 |= 2; break;
    2661         case BS3CG1PFXKIND_REQ_F2:          b2 |= 3; break;
    2662         default:
    2663             Bs3TestFailedF("enmPrefixKind=%d not supported for VEX!\n", pThis->enmPrefixKind);
    2664             break;
    2665     }
    2666 
    2667     pThis->abCurInstr[offDst]     = 0xc4; /* vex3 */
    2668     pThis->abCurInstr[offDst + 1] = b1;
    2669     pThis->abCurInstr[offDst + 2] = b2;
    2670     pThis->uVexL                  = uVexL;
    2671     return offDst + 3;
     2658    if (pThis->uOpcodeMap == 1)
     2659    {
     2660        uint8_t b = uVexR << 7;
     2661        b        |= uVexV << 3;
     2662        b        |= uVexL << 2;
     2663        switch (pThis->enmPrefixKind)
     2664        {
     2665            case BS3CG1PFXKIND_NO_F2_F3_66:     b |= 0; break;
     2666            case BS3CG1PFXKIND_REQ_66:          b |= 1; break;
     2667            case BS3CG1PFXKIND_REQ_F3:          b |= 2; break;
     2668            case BS3CG1PFXKIND_REQ_F2:          b |= 3; break;
     2669            default:
     2670                Bs3TestFailedF("enmPrefixKind=%d not supported for VEX!\n");
     2671                break;
     2672        }
     2673
     2674        pThis->abCurInstr[offDst]     = 0xc5; /* vex2 */
     2675        pThis->abCurInstr[offDst + 1] = b;
     2676        pThis->uVexL                  = uVexL;
     2677        return offDst + 2;
     2678    }
     2679    return Bs3Cg1InsertVex3bPrefix(pThis, offDst, uVexV, uVexL, uVexR, 1 /*uVexX*/, 1 /*uVexB*/, 0/*uVexW*/);
    26722680}
    26732681
     
    34323440 */
    34333441static unsigned BS3_NEAR_CODE
    3434 Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_L0_OR_ViceVersa(PBS3CG1STATE pThis, unsigned iEncoding)
     3442Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lmbz_OR_ViceVersa(PBS3CG1STATE pThis, unsigned iEncoding)
    34353443{
    34363444    unsigned off;
     
    35203528    return iEncoding + 1;
    35213529}
     3530
     3531
     3532/**
     3533 * Wip - VEX.W ignored.
     3534 */
     3535static unsigned BS3_NEAR_CODE
     3536Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lxx_OR_ViceVersa(PBS3CG1STATE pThis, unsigned iEncoding, uint8_t uVexL)
     3537{
     3538    unsigned off;
     3539    switch (iEncoding)
     3540    {
     3541        case 0:
     3542            off = Bs3Cg1InsertVex2bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, uVexL, 1 /*~R*/);
     3543            off = Bs3Cg1InsertOpcodes(pThis, off);
     3544            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 0, 0);
     3545            iEncoding += !BS3CG1_IS_64BIT_TARGET(pThis) ? 1 : 0;
     3546            break;
     3547#if ARCH_BITS == 64
     3548        case 1:
     3549            off = Bs3Cg1InsertVex2bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, uVexL, 0 /*~R*/);
     3550            off = Bs3Cg1InsertOpcodes(pThis, off);
     3551            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 7 + 8, 0);
     3552            break;
     3553#endif
     3554        case 2:
     3555            off = Bs3Cg1InsertVex2bPrefix(pThis, 0 /*offDst*/, 0xe /*~V*/, uVexL, 1 /*~R*/);
     3556            off = Bs3Cg1InsertOpcodes(pThis, off);
     3557            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 0, 0);
     3558            pThis->fInvalidEncoding = true;
     3559            break;
     3560        case 3:
     3561            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, uVexL, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
     3562            off = Bs3Cg1InsertOpcodes(pThis, off);
     3563            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 1, 0);
     3564            break;
     3565        case 4:
     3566            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, uVexL, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 1 /*W-ignored*/);
     3567            off = Bs3Cg1InsertOpcodes(pThis, off);
     3568            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 5, 0);
     3569            iEncoding += !BS3CG1_IS_64BIT_TARGET(pThis) ? 3 : 0;
     3570            break;
     3571#if ARCH_BITS == 64
     3572        case 5:
     3573            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, uVexL, 0 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
     3574            off = Bs3Cg1InsertOpcodes(pThis, off);
     3575            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 5+8, 0);
     3576            break;
     3577        case 6:
     3578            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, uVexL, 1 /*~R*/, 1 /*~X*/, 0 /*~B-ignored*/, 0 /*W*/);
     3579            off = Bs3Cg1InsertOpcodes(pThis, off);
     3580            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 1, 0);
     3581            break;
     3582        case 7:
     3583            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, uVexL, 1 /*~R*/, 0 /*~X-ignored*/, 1 /*~B*/, 0 /*W*/);
     3584            off = Bs3Cg1InsertOpcodes(pThis, off);
     3585            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 2, 0);
     3586            break;
     3587#endif
     3588        case 8:
     3589            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0 /*~V*/, uVexL, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
     3590            off = Bs3Cg1InsertOpcodes(pThis, off);
     3591            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 5, 0);
     3592            pThis->fInvalidEncoding = true;
     3593            break;
     3594        case 9:
     3595            off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 7 /*~V*/, uVexL, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
     3596            off = Bs3Cg1InsertOpcodes(pThis, off);
     3597            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 2, 0);
     3598            pThis->fInvalidEncoding = true;
     3599            break;
     3600        default:
     3601            return 0;
     3602    }
     3603    pThis->cbCurInstr = off;
     3604    return iEncoding + 1;
     3605}
     3606
     3607
     3608/**
     3609 * Wip - VEX.W ignored.
     3610 * L0 - VEX.L is zero (encoding may exist where it isn't).
     3611 */
     3612static unsigned BS3_NEAR_CODE
     3613Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_L0_OR_ViceVersa(PBS3CG1STATE pThis, unsigned iEncoding)
     3614{
     3615    return Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lxx_OR_ViceVersa(pThis, iEncoding, 0 /*uVexL*/);
     3616}
     3617
     3618
     3619/**
     3620 * Wip - VEX.W ignored.
     3621 * L1 - VEX.L is one (encoding may exist where it isn't).
     3622 */
     3623static unsigned BS3_NEAR_CODE
     3624Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_L1_OR_ViceVersa(PBS3CG1STATE pThis, unsigned iEncoding)
     3625{
     3626    return Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lxx_OR_ViceVersa(pThis, iEncoding, 1 /*uVexL*/);
     3627}
     3628
    35223629
    35233630
     
    37163823/**
    37173824 * Wip = VEX.W ignored.
    3718  * L0 = VEX.L must be zero.
     3825 * Lmbz = VEX.L must be zero.
    37193826 */
    37203827static unsigned BS3_NEAR_CODE
    3721 Bs3Cg1EncodeNext_VEX_MODRM_WsomethingWO_Vsomething_Wip_L0_OR_ViceVersa(PBS3CG1STATE pThis, unsigned iEncoding)
     3828Bs3Cg1EncodeNext_VEX_MODRM_WsomethingWO_Vsomething_Wip_Lmbz_OR_ViceVersa(PBS3CG1STATE pThis, unsigned iEncoding)
    37223829{
    37233830    unsigned off;
     
    47294836            break;
    47304837
     4838        case BS3CG1ENC_VEX_MODRM_Vx_WO_Mx_L0:
     4839            BS3_ASSERT(!(pThis->fFlags & BS3CG1INSTR_F_VEX_L_ZERO));
     4840            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_L0_OR_ViceVersa;
     4841            pThis->iRegOp            = 0;
     4842            pThis->iRmOp             = 1;
     4843            pThis->aOperands[0].cbOp = 16;
     4844            pThis->aOperands[1].cbOp = 16;
     4845            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_CTX_ZX_VLMAX;
     4846            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_MEM;
     4847            pThis->aOperands[0].idxFieldBase = BS3CG1DST_XMM0;
     4848            break;
     4849
     4850        case BS3CG1ENC_VEX_MODRM_Vx_WO_Mx_L1:
     4851            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_L1_OR_ViceVersa;
     4852            pThis->iRegOp            = 0;
     4853            pThis->iRmOp             = 1;
     4854            pThis->aOperands[0].cbOp = 32;
     4855            pThis->aOperands[1].cbOp = 32;
     4856            pThis->aOperands[0].enmLocation  = BS3CG1OPLOC_CTX_ZX_VLMAX;
     4857            pThis->aOperands[1].enmLocation  = BS3CG1OPLOC_MEM;
     4858            pThis->aOperands[0].idxFieldBase = BS3CG1DST_YMM0;
     4859            break;
     4860
    47314861        case BS3CG1ENC_VEX_MODRM_Vsd_WO_HsdHi_Usd:
    47324862            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Hsomething_Usomething_Lip_Wip_OR_ViceVersa;
     
    47754905
    47764906        case BS3CG1ENC_VEX_MODRM_Vq_WO_Wq:
    4777             pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_WsomethingWO_Vsomething_Wip_L0_OR_ViceVersa;
     4907            BS3_ASSERT(pThis->fFlags & BS3CG1INSTR_F_VEX_L_ZERO);
     4908            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_WsomethingWO_Vsomething_Wip_Lmbz_OR_ViceVersa;
    47784909            pThis->iRegOp            = 0;
    47794910            pThis->iRmOp             = 1;
     
    48504981
    48514982        case BS3CG1ENC_VEX_MODRM_Mq_WO_Vq:
     4983            BS3_ASSERT(pThis->fFlags & (BS3CG1INSTR_F_VEX_L_ZERO | BS3CG1INSTR_F_VEX_L_IGNORED));
    48524984            pThis->pfnEncoder        = pThis->fFlags & BS3CG1INSTR_F_VEX_L_ZERO
    4853                                      ? Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_L0_OR_ViceVersa
     4985                                     ? Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lmbz_OR_ViceVersa
    48544986                                     : Bs3Cg1EncodeNext_VEX_MODRM_VsomethingWO_Msomething_Wip_Lig_OR_ViceVersa;
    48554987            pThis->iRmOp             = 0;
     
    49335065
    49345066        case BS3CG1ENC_VEX_MODRM_Wq_WO_Vq:
    4935             pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_WsomethingWO_Vsomething_Wip_L0_OR_ViceVersa;
     5067            BS3_ASSERT(pThis->fFlags & BS3CG1INSTR_F_VEX_L_ZERO);
     5068            pThis->pfnEncoder        = Bs3Cg1EncodeNext_VEX_MODRM_WsomethingWO_Vsomething_Wip_Lmbz_OR_ViceVersa;
    49365069            pThis->iRegOp            = 1;
    49375070            pThis->iRmOp             = 0;
     
    55425675                     && offField - sizeof(BS3REGCTX) < RT_UOFFSET_AFTER(BS3EXTCTX, Ctx.x87.aXMM[15]))
    55435676            {
    5544                 if (!pThis->fWorkExtCtx)
    5545                     return Bs3TestFailedF("Extended context disabled: Field %d @ %#x LB %u\n", idxField, offField, cbDst);
    5546                 PtrField.pb = (uint8_t *)pThis->pExtCtx + offField - sizeof(BS3REGCTX);
     5677                if (pThis->fWorkExtCtx)
     5678                    PtrField.pb = (uint8_t *)pThis->pExtCtx + offField - sizeof(BS3REGCTX);
     5679                else if (!pThis->fCpuSetupFirstResult)
     5680                {
     5681                    BS3CG1_DPRINTF(("dbg: Extended context disabled: skipping modification (<=8)\n"));
     5682                    goto l_advance_to_next;
     5683                }
     5684                else
     5685                    return Bs3TestFailedF("Extended context disabled: Field %d (%s) @ %#x LB %u\n",
     5686                                          idxField, g_aszBs3Cg1DstFields[idxField].sz, offField, cbDst);
    55475687            }
    55485688            /** @todo other FPU fields and FPU state formats. */
    55495689            else
    5550                 return Bs3TestFailedF("Todo implement me: cbDst=%u idxField=%d offField=%#x (<= 8)", cbDst, idxField, offField);
     5690                return Bs3TestFailedF("Todo implement me: cbDst=%u idxField=%d %s offField=%#x (<= 8)",
     5691                                      cbDst, idxField, g_aszBs3Cg1DstFields[idxField].sz, offField);
    55515692
    55525693#ifdef BS3CG1_DEBUG_CTX_MOD
     
    56615802         * Deal with larger field (FPU, SSE, AVX, ...).
    56625803         */
    5663         else
     5804        else if (pThis->fWorkExtCtx)
    56645805        {
    56655806            union
     
    56755816            unsigned const  offField = g_aoffBs3Cg1DstFields[idxField];
    56765817            unsigned        iReg;
    5677 
    5678             if (!pThis->fWorkExtCtx)
    5679                 return Bs3TestFailedF("Extended context disabled: Field %d @ %#x LB %u\n", idxField, offField, cbDst);
    56805818
    56815819            /* Copy the value into the union, doing the zero padding / extending. */
     
    58295967                Bs3MemCpy(pbMemCopy, PtrField.pv, cbDst);
    58305968        }
     5969        /* !pThis->fWorkExtCtx: */
     5970        else if (pThis->fCpuSetupFirstResult)
     5971            return Bs3TestFailedF("Extended context disabled: Field %d (%s) @ %#x LB %u\n",
     5972                                  idxField, g_aszBs3Cg1DstFields[idxField].sz, g_aoffBs3Cg1DstFields[idxField], cbDst);
     5973        else
     5974            BS3CG1_DPRINTF(("dbg: Extended context disabled: skipping modification [> 8]\n"));
    58315975
    58325976        /*
     
    64396583            Bs3TestSubF("%s / %.*s", pThis->pszModeShort, pThis->cchMnemonic, pThis->pchMnemonic);
    64406584        pThis->fAdvanceMnemonic         = pInstr->fAdvanceMnemonic;
     6585        pThis->uOpcodeMap               = pInstr->uOpcodeMap;
    64416586        pThis->cOperands                = pInstr->cOperands;
    64426587        pThis->cbOpcodes                = pInstr->cbOpcodes;
     
    64596604         * Check if the CPU supports the instruction.
    64606605         */
    6461         if (   !Bs3Cg1CpuSetupFirst(pThis)
     6606        pThis->fCpuSetupFirstResult = Bs3Cg1CpuSetupFirst(pThis);
     6607        if (   !pThis->fCpuSetupFirstResult
    64626608            || (pThis->fFlags & (BS3CG1INSTR_F_UNUSED | BS3CG1INSTR_F_INVALID)))
    64636609            fOuterInvalidInstr = true;
     
    65666712                                else
    65676713                                {
    6568                                     Bs3TestPrintf("Bs3Cg1RunContextModifier(out): iEncoding=%u iTest=%u\n", iEncoding, pThis->iTest);
     6714                                    Bs3TestPrintf("Bs3Cg1RunContextModifier(out): iEncoding=%u iTest=%RU32 iInstr=%u %.*s\n",
     6715                                                  iEncoding, pThis->iTest, pThis->iInstr, pThis->cchMnemonic, pThis->pchMnemonic);
    65696716                                    ASMHalt();
    65706717                                }
     
    66046751                            else
    66056752                            {
    6606                                 Bs3TestPrintf("Bs3Cg1RunContextModifier(in): iEncoding=%u iTest=%u\n", iEncoding, pThis->iTest);
     6753                                Bs3TestPrintf("Bs3Cg1RunContextModifier(in): iEncoding=%u iTest=%u iInstr=%RU32 %.*s\n",
     6754                                              iEncoding, pThis->iTest, pThis->iInstr, pThis->cchMnemonic, pThis->pchMnemonic);
    66076755                                ASMHalt();
    66086756                            }
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r67040 r67072  
    123123    BS3CG1OP_Mps_WO,
    124124    BS3CG1OP_Mpd_WO,
     125    BS3CG1OP_Mx,
    125126    BS3CG1OP_Mx_WO,
    126127
     
    195196    BS3CG1ENC_VEX_MODRM_VssZx_WO_Md,
    196197    BS3CG1ENC_VEX_MODRM_VsdZx_WO_Mq,
     198    BS3CG1ENC_VEX_MODRM_Vx_WO_Mx_L0,
     199    BS3CG1ENC_VEX_MODRM_Vx_WO_Mx_L1,
    197200    BS3CG1ENC_VEX_MODRM_Vx_WO_Wx,
    198201    BS3CG1ENC_VEX_MODRM_Ed_WO_Vd_WZ,
     
    335338    /** BS3CG1ENC values. */
    336339    uint32_t    enmEncoding : 10;
     340    /** The VEX, EVEX or XOP opcode map number (VEX.mmmm). */
     341    uint32_t    uOpcodeMap : 4;
    337342    /** BS3CG1PFXKIND values. */
    338343    uint32_t    enmPrefixKind : 4;
     
    342347    uint32_t    enmXcptType : 5;
    343348    /** Currently unused bits. */
    344     uint32_t    uUnused : 6;
     349    uint32_t    uUnused : 3;
    345350    /** BS3CG1INSTR_F_XXX. */
    346351    uint32_t    fFlags;
     
    366371/** VEX.L must be zero (IEMOPHINT_VEX_L_ZERO). */
    367372#define BS3CG1INSTR_F_VEX_L_ZERO            UINT32_C(0x00000020)
     373/** VEX.L is ignored (IEMOPHINT_VEX_L_IGNORED). */
     374#define BS3CG1INSTR_F_VEX_L_IGNORED         UINT32_C(0x00000040)
    368375/** @} */
    369376
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