Changeset 103635 in vbox for trunk/src/VBox
- Timestamp:
- Mar 1, 2024 2:43:15 PM (11 months ago)
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h
r103613 r103635 1556 1556 IEM_MC_BEGIN(3, 0, 0, 0); 1557 1557 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 1558 IEM_MC_ARG(uint16_t *, pu16Dst, 0);1559 1558 IEM_MC_ARG(uint16_t, u16Src, 1); 1560 IEM_MC_ARG(uint32_t *, pEFlags, 2);1561 1559 IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_RM(pVCpu, bRm)); 1562 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); 1563 IEM_MC_REF_EFLAGS(pEFlags); 1564 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u16, pu16Dst, u16Src, pEFlags); 1560 IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) { 1561 IEM_MC_LOCAL(uint16_t, u16Dst); 1562 IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); 1563 /// @todo IEM_MC_LOCAL_EFLAGS(uEFlags); 1564 IEM_MC_LOCAL(uint32_t, uEFlags); 1565 IEM_MC_FETCH_EFLAGS(uEFlags); 1566 IEM_MC_NATIVE_EMIT_4(iemNativeEmit_xor_r_r_efl, u16Dst, u16Src, uEFlags, 16); 1567 IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst); 1568 IEM_MC_COMMIT_EFLAGS(uEFlags); 1569 } IEM_MC_NATIVE_ELSE() { 1570 IEM_MC_ARG(uint16_t *, pu16Dst, 0); 1571 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); 1572 IEM_MC_ARG(uint32_t *, pEFlags, 2); 1573 IEM_MC_REF_EFLAGS(pEFlags); 1574 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u16, pu16Dst, u16Src, pEFlags); 1575 } IEM_MC_NATIVE_ENDIF(); 1565 1576 IEM_MC_ADVANCE_RIP_AND_FINISH(); 1566 1577 IEM_MC_END(); … … 1596 1607 IEM_MC_BEGIN(3, 0, IEM_MC_F_64BIT, 0); 1597 1608 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 1598 IEM_MC_ARG(uint64_t *, pu64Dst, 0);1599 1609 IEM_MC_ARG(uint64_t, u64Src, 1); 1600 IEM_MC_ARG(uint32_t *, pEFlags, 2);1601 1602 1610 IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm)); 1603 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); 1604 IEM_MC_REF_EFLAGS(pEFlags); 1605 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u64, pu64Dst, u64Src, pEFlags); 1606 1611 IEM_MC_NATIVE_IF(RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64) { 1612 IEM_MC_LOCAL(uint64_t, u64Dst); 1613 IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); 1614 /// @todo IEM_MC_LOCAL_EFLAGS(uEFlags); 1615 IEM_MC_LOCAL(uint32_t, uEFlags); 1616 IEM_MC_FETCH_EFLAGS(uEFlags); 1617 IEM_MC_NATIVE_EMIT_4(iemNativeEmit_xor_r_r_efl, u64Dst, u64Src, uEFlags, 64); 1618 IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst); 1619 IEM_MC_COMMIT_EFLAGS(uEFlags); 1620 } IEM_MC_NATIVE_ELSE() { 1621 IEM_MC_ARG(uint64_t *, pu64Dst, 0); 1622 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); 1623 IEM_MC_ARG(uint32_t *, pEFlags, 2); 1624 IEM_MC_REF_EFLAGS(pEFlags); 1625 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xor_u64, pu64Dst, u64Src, pEFlags); 1626 } IEM_MC_NATIVE_ENDIF(); 1607 1627 IEM_MC_ADVANCE_RIP_AND_FINISH(); 1608 1628 IEM_MC_END(); -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp
r103627 r103635 6246 6246 else 6247 6247 off = iemNativeEmitCmpGpr32WithGprEx(pCodeBuf, off, idxRegResult, ARMV8_A64_REG_XZR); 6248 # if 06249 off = iemNativeEmitLoadGpr32ImmEx(pCodeBuf, off, idxTmpReg, X86_EFL_ZF);6250 pCodeBuf[off++] = Armv8A64MkInstrCSel(idxTmpReg, idxTmpReg, ARMV8_A64_REG_XZR, kArmv8InstrCond_Eq, false /*f64Bit*/);6251 pCodeBuf[off++] = Armv8A64MkInstrOrr(idxRegEfl, idxRegEfl, idxTmpReg, false /*f64Bit*/);6252 # else6253 6248 pCodeBuf[off++] = Armv8A64MkInstrCSet(idxTmpReg, kArmv8InstrCond_Eq, false /*f64Bit*/); 6254 6249 pCodeBuf[off++] = Armv8A64MkInstrOrr(idxRegEfl, idxRegEfl, idxTmpReg, false /*f64Bit*/, X86_EFL_ZF_BIT); 6255 # endif6256 6250 6257 6251 /* Calculate signed: We could use the native SF flag, but it's just as simple to calculate it by shifting. */ 6258 6252 pCodeBuf[off++] = Armv8A64MkInstrLsrImm(idxTmpReg, idxRegResult, cOpBits - 1, cOpBits > 32 /*f64Bit*/); 6253 # if 0 /* BFI and ORR hsould have the same performance characteristics, so use BFI like we'll have to do for SUB/ADD/++. */ 6259 6254 pCodeBuf[off++] = Armv8A64MkInstrOrr(idxRegEfl, idxRegEfl, idxTmpReg, false /*f64Bit*/, X86_EFL_SF_BIT); 6255 # else 6256 pCodeBuf[off++] = Armv8A64MkInstrBfi(idxRegEfl, idxTmpReg, X86_EFL_SF_BIT, 1, false /*f64Bit*/); 6257 # endif 6260 6258 6261 6259 /* Calculate 8-bit parity of the result. */ … … 6288 6286 * The XOR instruction will clear OF, CF and AF (latter is off undefined), 6289 6287 * so we don't need the initial destination value. 6288 * 6289 * On AMD64 we must use the correctly sizeed XOR instructions to get the 6290 * right EFLAGS.SF value, while the rest will just lump 16-bit and 8-bit 6291 * in the 32-bit ones. 6290 6292 */ 6291 6293 uint8_t const idxRegDst = iemNativeVarRegisterAcquire(pReNative, idxVarDst, &off, true /*fInitialized*/); 6292 6294 uint8_t const idxRegSrc = iemNativeVarRegisterAcquire(pReNative, idxVarSrc, &off, true /*fInitialized*/); 6293 6295 //off = iemNativeEmitBrk(pReNative, off, 0x2222); 6294 if (cOpBits > 32) 6295 off = iemNativeEmitXorGprByGpr(pReNative, off, idxRegDst, idxRegSrc); 6296 else 6297 off = iemNativeEmitXorGpr32ByGpr32(pReNative, off, idxRegDst, idxRegSrc); 6296 switch (cOpBits) 6297 { 6298 case 32: 6299 #ifndef RT_ARCH_AMD64 6300 case 16: 6301 case 8: 6302 #endif 6303 off = iemNativeEmitXorGpr32ByGpr32(pReNative, off, idxRegDst, idxRegSrc); 6304 break; 6305 6306 default: AssertFailed(); RT_FALL_THRU(); 6307 case 64: 6308 off = iemNativeEmitXorGprByGpr(pReNative, off, idxRegDst, idxRegSrc); 6309 break; 6310 6311 #ifdef RT_ARCH_AMD64 6312 case 16: 6313 { 6314 PIEMNATIVEINSTR pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); 6315 pCodeBuf[off++] = X86_OP_PRF_SIZE_OP; 6316 off = iemNativeEmitXorGpr32ByGpr32(pReNative, off, idxRegDst, idxRegSrc); 6317 break; 6318 } 6319 6320 case 8: 6321 { 6322 PIEMNATIVEINSTR pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 3); 6323 if (idxRegDst >= 8 || idxRegSrc >= 8) 6324 pCodeBuf[off++] = (idxRegDst >= 8 ? X86_OP_REX_R : 0) | (idxRegSrc >= 8 ? X86_OP_REX_B : 0); 6325 else if (idxRegDst >= 4 || idxRegSrc >= 4) 6326 pCodeBuf[off++] = X86_OP_REX; 6327 pCodeBuf[off++] = 0x32; 6328 pCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, idxRegDst & 7, idxRegSrc & 7); 6329 IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); 6330 break; 6331 } 6332 #endif 6333 } 6298 6334 iemNativeVarRegisterRelease(pReNative, idxVarSrc); 6299 6335
Note:
See TracChangeset
for help on using the changeset viewer.