VirtualBox

Changeset 103931 in vbox


Ignore:
Timestamp:
Mar 19, 2024 11:47:19 PM (13 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162305
Message:

VMM/IEM,bs3-cpu-instr-3: Some vpextrb disas and special+illegal encoding test. bugref:9898

Location:
trunk/src/VBox
Files:
3 edited

Legend:

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

    r103926 r103931  
    542542FNIEMOP_DEF(iemOp_vpextrb_Eb_Vdq_Ib)
    543543{
    544     IEMOP_MNEMONIC3(VEX_MRI, VPEXTRB, vpextrb, Eb, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_V_ZERO); /** @todo */
     544    IEMOP_MNEMONIC3(VEX_MRI, VPEXTRB, vpextrb, Eb, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_V_ZERO | IEMOPHINT_IGNORES_REXW);
    545545    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    546546    if (IEM_IS_MODRM_REG_MODE(bRm))
     
    551551        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    552552        IEM_MC_BEGIN(0, 1, IEM_MC_F_NOT_286_OR_OLDER, 0);
    553         IEM_MC_LOCAL(uint8_t,   uValue);
    554 
    555553        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    556554        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    557555        IEM_MC_PREPARE_AVX_USAGE();
    558556
     557        IEM_MC_LOCAL(uint8_t, uValue);
    559558        IEM_MC_FETCH_XREG_U8(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 15 /*a_iByte*/);
    560559        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), uValue);
     
    569568        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
    570569        IEM_MC_BEGIN(0, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
    571         IEM_MC_LOCAL(uint8_t,   uValue);
    572570        IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    573571        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     
    577575        IEM_MC_PREPARE_AVX_USAGE();
    578576
     577        IEM_MC_LOCAL(uint8_t, uValue);
    579578        IEM_MC_FETCH_XREG_U8(uValue, IEM_GET_MODRM_REG(pVCpu, bRm), bImm & 15 /*a_iByte*/);
    580579        IEM_MC_STORE_MEM_U8(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uValue);
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-3-template.mac

    r103910 r103931  
    21822182EMIT_INSTR_PLUS_ICEBP_C64  vpextrb, FSxBX, XMM8, 0FFh
    21832183EMIT_INSTR_PLUS_ICEBP_C64  vpextrb, FSxBX, XMM8, 000h
     2184
     2185%ifnmacro vpextrb_w1b_edx_xmm1 1
     2186 ; special encoding to prove that VEX.W is effectively ignored everywhere and that VEX.B only matter in 64-bit code.
     2187 %macro vpextrb_w1b_edx_xmm1 1
     2188        db      X86_OP_VEX3, 3 | X86_OP_VEX3_BYTE1_X | X86_OP_VEX3_BYTE1_R
     2189        db      X86_OP_VEX3_BYTE2_P_066H | (X86_OP_VEX3_BYTE2_VVVV_NONE << X86_OP_VEX3_BYTE2_VVVV_SHIFT) | X86_OP_VEX3_BYTE2_W
     2190        db      14h, X86_MODRM_MAKE(X86_MOD_REG, 1, X86_GREG_xDX), %1
     2191 %endmacro
     2192
     2193 ; invalid coding where VEX.L=1.
     2194 %macro vpextrb_l1_edx_xmm1 1
     2195        db      X86_OP_VEX3, 3 | X86_OP_VEX3_BYTE1_X | X86_OP_VEX3_BYTE1_R | X86_OP_VEX3_BYTE1_B
     2196        db      X86_OP_VEX3_BYTE2_P_066H | (X86_OP_VEX3_BYTE2_VVVV_NONE << X86_OP_VEX3_BYTE2_VVVV_SHIFT) | X86_OP_VEX3_BYTE2_L
     2197        db      14h, X86_MODRM_MAKE(X86_MOD_REG, 1, X86_GREG_xDX), %1
     2198 %endmacro
     2199%endif
     2200EMIT_INSTR_PLUS_ICEBP      vpextrb_w1b_edx_xmm1, 0FFh
     2201EMIT_INSTR_PLUS_ICEBP      vpextrb_l1_edx_xmm1, 0FFh
    21842202
    21852203;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-3.c32

    r103910 r103931  
    97639763        {  bs3CpuInstr3_vpextrb_FSxBX_XMM1_0FFh_icebp_c16,   X86_XCPT_DB, RM_MEM8,  T_AVX_128, 1,  8, false, true, 255, 1, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b },
    97649764        {  bs3CpuInstr3_vpextrb_FSxBX_XMM1_000h_icebp_c16,   X86_XCPT_DB, RM_MEM8,  T_AVX_128, 1,  8, false, true, 255, 1, RT_ELEMENTS(s_aValues00_b),    s_aValues00_b },
     9765        {  bs3CpuInstr3_vpextrb_w1b_edx_xmm1_0FFh_icebp_c16, 255,         RM_REG,   T_AVX_128, 4, 32, false, true, 2,   1, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b },
     9766        {  bs3CpuInstr3_vpextrb_l1_edx_xmm1_0FFh_icebp_c16,  255,         RM_REG,   T_AVX_128, 4, 32, true,  true, 2,   1, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b },
    97659767
    97669768        {  bs3CpuInstr3_pextrw_EDX_MM1_000h_icebp_c16,       255,         RM_REG,   T_MMX_SSE, 4, 32, false, true, 2,   1, RT_ELEMENTS(s_aValues00_w),    s_aValues00_w },
     
    97999801        {  bs3CpuInstr3_vpextrb_FSxBX_XMM1_0FFh_icebp_c32,   X86_XCPT_DB, RM_MEM8,  T_AVX_128, 1,  8, false, true, 255, 1, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b },
    98009802        {  bs3CpuInstr3_vpextrb_FSxBX_XMM1_000h_icebp_c32,   X86_XCPT_DB, RM_MEM8,  T_AVX_128, 1,  8, false, true, 255, 1, RT_ELEMENTS(s_aValues00_b),    s_aValues00_b },
     9803        {  bs3CpuInstr3_vpextrb_w1b_edx_xmm1_0FFh_icebp_c32, 255,         RM_REG,   T_AVX_128, 4, 32, false, true, 2,   1, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b },
     9804        {  bs3CpuInstr3_vpextrb_l1_edx_xmm1_0FFh_icebp_c32,  255,         RM_REG,   T_AVX_128, 4, 32, true,  true, 2,   1, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b },
    98019805
    98029806        {  bs3CpuInstr3_pextrw_EDX_MM1_000h_icebp_c32,       255,         RM_REG,   T_MMX_SSE, 4, 32, false, true, 2,   1, RT_ELEMENTS(s_aValues00_w),    s_aValues00_w },
     
    98439847        {  bs3CpuInstr3_vpextrb_FSxBX_XMM8_0FFh_icebp_c64,   X86_XCPT_DB, RM_MEM8,  T_AVX_128, 1,  8, false, true, 255, 8, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b },
    98449848        {  bs3CpuInstr3_vpextrb_FSxBX_XMM8_000h_icebp_c64,   X86_XCPT_DB, RM_MEM8,  T_AVX_128, 1,  8, false, true, 255, 8, RT_ELEMENTS(s_aValues00_b),    s_aValues00_b },
     9849        {  bs3CpuInstr3_vpextrb_w1b_edx_xmm1_0FFh_icebp_c64, 255,         RM_REG,   T_AVX_128, 4, 32, false, true, 10,  1, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b }, /* manually setting VEX.B=1 */
     9850        {  bs3CpuInstr3_vpextrb_l1_edx_xmm1_0FFh_icebp_c64,  255,         RM_REG,   T_AVX_128, 4, 32, true,  true, 2,   1, RT_ELEMENTS(s_aValuesFF_b),    s_aValuesFF_b },
    98459851
    98469852        {  bs3CpuInstr3_pextrw_EDX_MM1_000h_icebp_c64,       255,         RM_REG,   T_MMX_SSE, 4, 32, false, true, 2,   1, RT_ELEMENTS(s_aValues00_w),    s_aValues00_w },
     
    99169922    static BS3CPUINSTR3_TEST2_MODE_T const s_aTests[3] = BS3CPUINSTR3_TEST2_MODES_INIT(s_aTests16, s_aTests32, s_aTests64);
    99179923    unsigned const                         iTest       = BS3CPUINSTR3_TEST_MODES_INDEX(bMode);
    9918     return  bs3CpuInstr3_WorkerTestType2(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests,
     9924    return bs3CpuInstr3_WorkerTestType2(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests,
    99199925                                        g_aXcptConfig5, RT_ELEMENTS(g_aXcptConfig5));
    99209926}
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