Changeset 103646 in vbox
- Timestamp:
- Mar 2, 2024 2:24:18 AM (11 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h
r103645 r103646 939 939 IEMOP_MNEMONIC2(MR, OR, or, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 940 940 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 941 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked, or, 0, 0);941 IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked, or, RT_ARCH_VAL_AMD64, 0); 942 942 } 943 943 … … 959 959 IEMOP_MNEMONIC2(MR, OR, or, Ev, Gv, DISOPTYPE_HARMLESS, IEMOPHINT_LOCK_ALLOWED); 960 960 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 961 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_or_u16, iemAImpl_or_u32, iemAImpl_or_u64, or, 0, 0);961 IEMOP_BODY_BINARY_rm_rv_RW( iemAImpl_or_u16, iemAImpl_or_u32, iemAImpl_or_u64, or, RT_ARCH_VAL_AMD64, 0); 962 962 IEMOP_BODY_BINARY_rm_rv_LOCKED(iemAImpl_or_u16_locked, iemAImpl_or_u32_locked, iemAImpl_or_u64_locked); 963 963 } … … 974 974 IEMOP_MNEMONIC2(RM, OR, or, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED); 975 975 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 976 IEMOP_BODY_BINARY_r8_rm(iemAImpl_or_u8, or, 0);976 IEMOP_BODY_BINARY_r8_rm(iemAImpl_or_u8, or, RT_ARCH_VAL_AMD64); 977 977 } 978 978 … … 989 989 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF); 990 990 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 991 IEMOP_BODY_BINARY_rv_rm(bRm, iemAImpl_or_u16, iemAImpl_or_u32, iemAImpl_or_u64, 1, 0, or, 0);991 IEMOP_BODY_BINARY_rv_rm(bRm, iemAImpl_or_u16, iemAImpl_or_u32, iemAImpl_or_u64, 1, 0, or, RT_ARCH_VAL_AMD64); 992 992 } 993 993 -
trunk/src/VBox/VMM/VMMAll/target-x86/IEMAllN8veEmit-x86.h
r103645 r103646 201 201 uint8_t idxVarDst, uint8_t idxVarSrc, uint8_t idxVarEfl, uint8_t cOpBits) 202 202 { 203 RT_NOREF(idxVarDst, idxVarSrc, idxVarEfl, cOpBits); 204 AssertFailed(); 205 return iemNativeEmitBrk(pReNative, off, 0x666); 203 /* 204 * The OR instruction will clear OF, CF and AF (latter is off undefined), 205 * so we don't need the initial destination value. 206 * 207 * On AMD64 we must use the correctly sized OR instructions to get the 208 * right EFLAGS.SF value, while the rest will just lump 16-bit and 8-bit 209 * in the 32-bit ones. 210 */ 211 uint8_t const idxRegDst = iemNativeVarRegisterAcquire(pReNative, idxVarDst, &off, true /*fInitialized*/); 212 uint8_t const idxRegSrc = iemNativeVarRegisterAcquire(pReNative, idxVarSrc, &off, true /*fInitialized*/); 213 //off = iemNativeEmitBrk(pReNative, off, 0x2222); 214 switch (cOpBits) 215 { 216 case 32: 217 #ifndef RT_ARCH_AMD64 218 case 16: 219 case 8: 220 #endif 221 off = iemNativeEmitOrGpr32ByGpr(pReNative, off, idxRegDst, idxRegSrc); 222 break; 223 224 default: AssertFailed(); RT_FALL_THRU(); 225 case 64: 226 off = iemNativeEmitOrGprByGpr(pReNative, off, idxRegDst, idxRegSrc); 227 break; 228 229 #ifdef RT_ARCH_AMD64 230 case 16: 231 { 232 PIEMNATIVEINSTR pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); 233 pCodeBuf[off++] = X86_OP_PRF_SIZE_OP; 234 off = iemNativeEmitOrGpr32ByGpr(pReNative, off, idxRegDst, idxRegSrc); 235 break; 236 } 237 238 case 8: 239 { 240 PIEMNATIVEINSTR pCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 3); 241 if (idxRegDst >= 8 || idxRegSrc >= 8) 242 pCodeBuf[off++] = (idxRegDst >= 8 ? X86_OP_REX_R : 0) | (idxRegSrc >= 8 ? X86_OP_REX_B : 0); 243 else if (idxRegDst >= 4 || idxRegSrc >= 4) 244 pCodeBuf[off++] = X86_OP_REX; 245 pCodeBuf[off++] = 0x0a; 246 pCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, idxRegDst & 7, idxRegSrc & 7); 247 IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); 248 break; 249 } 250 #endif 251 } 252 iemNativeVarRegisterRelease(pReNative, idxVarSrc); 253 254 off = iemNativeEmitEFlagsForLogical(pReNative, off, idxVarEfl, cOpBits, idxRegDst); 255 iemNativeVarRegisterRelease(pReNative, idxVarDst); 256 return off; 206 257 } 207 258 -
trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h
r103622 r103646 4369 4369 4370 4370 /** 4371 * Emits code for OR'ing two 64-bit GPRs. 4372 */ 4373 DECL_INLINE_THROW(uint32_t) 4374 iemNativeEmitOrGprByGpr(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t iGprDst, uint8_t iGprSrc) 4375 { 4376 #if defined(RT_ARCH_AMD64) 4377 off = iemNativeEmitOrGprByGprEx(iemNativeInstrBufEnsure(pReNative, off, 3), off, iGprDst, iGprSrc); 4378 #elif defined(RT_ARCH_ARM64) 4379 off = iemNativeEmitOrGprByGprEx(iemNativeInstrBufEnsure(pReNative, off, 1), off, iGprDst, iGprSrc); 4380 #else 4381 # error "Port me" 4382 #endif 4383 IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); 4384 return off; 4385 } 4386 4387 4388 /** 4371 4389 * Emits code for OR'ing two 32-bit GPRs. 4372 4390 * @note Bits 63:32 of the destination GPR will be cleared.
Note:
See TracChangeset
for help on using the changeset viewer.