VirtualBox

Changeset 39970 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 2, 2012 9:29:12 PM (13 years ago)
Author:
vboxsync
Message:

IEM: Implemented bswap. Fixed verification of INS.

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

Legend:

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

    r39962 r39970  
    50025002#define IEM_MC_STORE_GREG_U64_CONST                     IEM_MC_STORE_GREG_U64
    50035003#define IEM_MC_CLEAR_HIGH_GREG_U64(a_iGReg)             *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) &= UINT32_MAX
     5004#define IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(a_pu32Dst)    do { (a_pu32Dst)[1] = 0; } while (0)
    50045005
    50055006#define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg)           (a_pu8Dst) = iemGRegRefU8(pIemCpu, (a_iGReg))
    50065007#define IEM_MC_REF_GREG_U16(a_pu16Dst, a_iGReg)         (a_pu16Dst) = (uint16_t *)iemGRegRef(pIemCpu, (a_iGReg))
    5007 /** @todo User of IEM_MC_REF_GREG_U32 needs to clear the high bits on
    5008  *        commit. */
     5008/** @todo User of IEM_MC_REF_GREG_U32 needs to clear the high bits on commit.
     5009 *        Use IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF! */
    50095010#define IEM_MC_REF_GREG_U32(a_pu32Dst, a_iGReg)         (a_pu32Dst) = (uint32_t *)iemGRegRef(pIemCpu, (a_iGReg))
    50105011#define IEM_MC_REF_GREG_U64(a_pu64Dst, a_iGReg)         (a_pu64Dst) = (uint64_t *)iemGRegRef(pIemCpu, (a_iGReg))
     
    52395240    IEM_MC_RETURN_ON_FAILURE(iemOpHlpCalcRmEffAddr(pIemCpu, (bRm), &(a_GCPtrEff)))
    52405241
     5242#define IEM_MC_CALL_VOID_AIMPL_1(a_pfn, a0)               (a_pfn)((a0))
    52415243#define IEM_MC_CALL_VOID_AIMPL_2(a_pfn, a0, a1)           (a_pfn)((a0), (a1))
    52425244#define IEM_MC_CALL_VOID_AIMPL_3(a_pfn, a0, a1, a2)       (a_pfn)((a0), (a1), (a2))
     
    60006002    }
    60016003    pIemCpu->cIOReads++;
    6002     *pu32Value = 0xffffffff;
     6004    *pu32Value = 0xcccccccc;
    60036005    return VINF_SUCCESS;
    60046006}
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r38026 r39970  
    12341234IEMIMPL_DIV_OP idiv, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
    12351235
     1236
     1237;
     1238; BSWAP. No flag changes.
     1239;
     1240; Each function takes one argument, pointer to the value to bswap
     1241; (input/output). They all return void.
     1242;
     1243BEGINPROC_FASTCALL iemAImpl_bswap_u16, 4
     1244        PROLOGUE_1_ARGS
     1245        mov     T0_32, [A0]             ; just in case any of the upper bits are used.
     1246        db 66h
     1247        bswap   T0_32
     1248        mov     [A0], T0_32
     1249        EPILOGUE_1_ARGS 0
     1250ENDPROC iemAImpl_bswap_u16
     1251
     1252BEGINPROC_FASTCALL iemAImpl_bswap_u32, 4
     1253        PROLOGUE_1_ARGS
     1254        mov     T0_32, [A0]
     1255        bswap   T0_32
     1256        mov     [A0], T0_32
     1257        EPILOGUE_1_ARGS 0
     1258ENDPROC iemAImpl_bswap_u32
     1259
     1260BEGINPROC_FASTCALL iemAImpl_bswap_u64, 4
     1261%ifdef RT_ARCH_AMD64
     1262        PROLOGUE_1_ARGS
     1263        mov     T0, [A0]
     1264        bswap   T0
     1265        mov     [A0], T0
     1266        EPILOGUE_1_ARGS 0
     1267%else
     1268        PROLOGUE_1_ARGS
     1269        mov     T0, [A0]
     1270        mov     T1, [A0 + 4]
     1271        bswap   T0
     1272        bswap   T1
     1273        mov     [A0 + 4], T0
     1274        mov     [A0], T1
     1275        EPILOGUE_1_ARGS 0
     1276%endif
     1277ENDPROC iemAImpl_bswap_u64
     1278
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h

    r39958 r39970  
    11581158                return rcStrict;
    11591159
    1160             *puMem = u32Value;
     1160            *puMem = (OP_TYPE)u32Value;
    11611161            VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmap(pIemCpu, puMem, IEM_ACCESS_DATA_W);
    11621162            AssertLogRelReturn(rcStrict2 == VINF_SUCCESS, VERR_IEM_IPE_1); /* See non-rep version. */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r39958 r39970  
    41034103FNIEMOP_STUB(iemOp_Grp9);
    41044104
    4105 #if 0
     4105
    41064106/**
    41074107 * Common 'bswap register' helper.
    41084108 */
    4109 FNIEMOP_DEF_2(iemOpCommonBswapGReg, PCIEMOPUNARYSIZES, pImpl, uint8_t, iReg)
     4109FNIEMOP_DEF_1(iemOpCommonBswapGReg, uint8_t, iReg)
    41104110{
    41114111    IEMOP_HLP_NO_LOCK_PREFIX();
     
    41134113    {
    41144114        case IEMMODE_16BIT:
    4115             IEM_MC_BEGIN(2, 0);
    4116             IEM_MC_ARG(uint16_t *,  pu16Dst, 0);
    4117             IEM_MC_ARG(uint32_t *,  pEFlags, 1);
    4118             IEM_MC_REF_GREG_U16(pu16Dst, iReg);
    4119             IEM_MC_REF_EFLAGS(pEFlags);
    4120             IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU16, pu16Dst, pEFlags);
     4115            IEM_MC_BEGIN(1, 0);
     4116            IEM_MC_ARG(uint32_t *,  pu32Dst, 0);
     4117            IEM_MC_REF_GREG_U32(pu32Dst, iReg);     /* Don't clear the high dword! */
     4118            IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u16, pu32Dst);
    41214119            IEM_MC_ADVANCE_RIP();
    41224120            IEM_MC_END();
     
    41244122
    41254123        case IEMMODE_32BIT:
    4126             IEM_MC_BEGIN(2, 0);
     4124            IEM_MC_BEGIN(1, 0);
    41274125            IEM_MC_ARG(uint32_t *,  pu32Dst, 0);
    4128             IEM_MC_ARG(uint32_t *,  pEFlags, 1);
    41294126            IEM_MC_REF_GREG_U32(pu32Dst, iReg);
    4130             IEM_MC_REF_EFLAGS(pEFlags);
    4131             IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU32, pu32Dst, pEFlags);
     4127            IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Dst);
     4128            IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u32, pu32Dst);
    41324129            IEM_MC_ADVANCE_RIP();
    41334130            IEM_MC_END();
     
    41354132
    41364133        case IEMMODE_64BIT:
    4137             IEM_MC_BEGIN(2, 0);
     4134            IEM_MC_BEGIN(1, 0);
    41384135            IEM_MC_ARG(uint64_t *,  pu64Dst, 0);
    4139             IEM_MC_ARG(uint32_t *,  pEFlags, 1);
    41404136            IEM_MC_REF_GREG_U64(pu64Dst, iReg);
    4141             IEM_MC_REF_EFLAGS(pEFlags);
    4142             IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU64, pu64Dst, pEFlags);
     4137            IEM_MC_CALL_VOID_AIMPL_1(iemAImpl_bswap_u64, pu64Dst);
    41434138            IEM_MC_ADVANCE_RIP();
    41444139            IEM_MC_END();
    41454140            return VINF_SUCCESS;
    4146     }
    4147     return VINF_SUCCESS;
     4141
     4142        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     4143    }
    41484144}
    41494145
     
    41534149{
    41544150    IEMOP_MNEMONIC("bswap rAX/r8");
    4155     return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, &g_iemAImpl_inc, X86_GREG_xAX | pIemCpu->uRexReg);
    4156 }
    4157 
    4158 
    4159 #else
    4160 FNIEMOP_STUB(iemOp_bswap_rAX_r8);
    4161 #endif
     4151    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xAX | pIemCpu->uRexReg);
     4152}
     4153
     4154
    41624155/** Opcode 0x0f 0xc9. */
    4163 FNIEMOP_STUB(iemOp_bswap_rCX_r9);
     4156FNIEMOP_DEF(iemOp_bswap_rCX_r9)
     4157{
     4158    IEMOP_MNEMONIC("bswap rCX/r9");
     4159    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xCX | pIemCpu->uRexReg);
     4160}
     4161
     4162
    41644163/** Opcode 0x0f 0xca. */
    4165 FNIEMOP_STUB(iemOp_bswap_rDX_r10);
     4164FNIEMOP_DEF(iemOp_bswap_rDX_r10)
     4165{
     4166    IEMOP_MNEMONIC("bswap rDX/r9");
     4167    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDX | pIemCpu->uRexReg);
     4168}
     4169
     4170
    41664171/** Opcode 0x0f 0xcb. */
    4167 FNIEMOP_STUB(iemOp_bswap_rBX_r11);
     4172FNIEMOP_DEF(iemOp_bswap_rBX_r11)
     4173{
     4174    IEMOP_MNEMONIC("bswap rBX/r9");
     4175    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBX | pIemCpu->uRexReg);
     4176}
     4177
     4178
    41684179/** Opcode 0x0f 0xcc. */
    4169 FNIEMOP_STUB(iemOp_bswap_rSP_r12);
     4180FNIEMOP_DEF(iemOp_bswap_rSP_r12)
     4181{
     4182    IEMOP_MNEMONIC("bswap rSP/r12");
     4183    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSP | pIemCpu->uRexReg);
     4184}
     4185
     4186
    41704187/** Opcode 0x0f 0xcd. */
    4171 FNIEMOP_STUB(iemOp_bswap_rBP_r13);
     4188FNIEMOP_DEF(iemOp_bswap_rBP_r13)
     4189{
     4190    IEMOP_MNEMONIC("bswap rBP/r13");
     4191    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBP | pIemCpu->uRexReg);
     4192}
     4193
     4194
    41724195/** Opcode 0x0f 0xce. */
    4173 FNIEMOP_STUB(iemOp_bswap_rSI_r14);
     4196FNIEMOP_DEF(iemOp_bswap_rSI_r14)
     4197{
     4198    IEMOP_MNEMONIC("bswap rSI/r14");
     4199    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSI | pIemCpu->uRexReg);
     4200}
     4201
     4202
    41744203/** Opcode 0x0f 0xcf. */
    4175 FNIEMOP_STUB(iemOp_bswap_rDI_r15);
     4204FNIEMOP_DEF(iemOp_bswap_rDI_r15)
     4205{
     4206    IEMOP_MNEMONIC("bswap rDI/r15");
     4207    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDI | pIemCpu->uRexReg);
     4208}
     4209
     4210
    41764211
    41774212/** Opcode 0x0f 0xd0. */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r39944 r39970  
    671671/** @} */
    672672
     673/** @name Byte Swap.
     674 * @{  */
     675IEM_DECL_IMPL_TYPE(void, iemAImpl_bswap_u16,(uint32_t *pu32Dst)); /* Yes, 32-bit register access. */
     676IEM_DECL_IMPL_TYPE(void, iemAImpl_bswap_u32,(uint32_t *pu32Dst));
     677IEM_DECL_IMPL_TYPE(void, iemAImpl_bswap_u64,(uint64_t *pu64Dst));
     678/** @}  */
     679
    673680
    674681/** @name Function tables.
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r39402 r39970  
    268268#define IEM_MC_STORE_GREG_U64_CONST(a_iGReg, a_u64C)    do { AssertCompile((uint64_t)(a_u64C) == (a_u64C)); } while (0)
    269269#define IEM_MC_CLEAR_HIGH_GREG_U64(a_iGReg)             do {  } while (0)
     270#define IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(a_pu32Dst)    do { CHK_PTYPE(uint32_t *, a_pu32Dst); } while (0)
    270271#define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg)           do { (a_pu8Dst)  = (uint8_t  *)((uintptr_t)0); CHK_PTYPE(uint8_t  *, a_pu8Dst);  } while (0)
    271272#define IEM_MC_REF_GREG_U16(a_pu16Dst, a_iGReg)         do { (a_pu16Dst) = (uint16_t *)((uintptr_t)0); CHK_PTYPE(uint16_t *, a_pu16Dst); } while (0)
     
    372373#define IEM_MC_MEM_COMMIT_AND_UNMAP(a_pvMem, a_fAccess)                 do {} while (0)
    373374#define IEM_MC_CALC_RM_EFF_ADDR(a_GCPtrEff, bRm)                        do { (a_GCPtrEff) = 0; CHK_GCPTR(a_GCPtrEff); } while (0)
     375#define IEM_MC_CALL_VOID_AIMPL_1(a_pfn, a0)                             do {} while (0)
    374376#define IEM_MC_CALL_VOID_AIMPL_2(a_pfn, a0, a1)                         do {} while (0)
    375377#define IEM_MC_CALL_VOID_AIMPL_3(a_pfn, a0, a1, a2)                     do {} while (0)
Note: See TracChangeset for help on using the changeset viewer.

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