Changeset 96852 in vbox
- Timestamp:
- Sep 26, 2022 6:06:05 AM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153756
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
r96811 r96852 8421 8421 */ 8422 8422 PX86XSAVEAREA pXState = &pVCpu->cpum.GstCtx.XState; 8423 8424 /* Rotate the stack to account for changed TOS. */ 8425 iemFpuRotateStackSetTop(&pXState->x87, 0); 8426 8423 8427 pXState->x87.FCW = 0x37f; 8424 8428 pXState->x87.FSW = 0; … … 9342 9346 if (rcStrict != VINF_SUCCESS) 9343 9347 return rcStrict; 9348 9349 /* Rotate the stack to account for changed TOS. */ 9350 iemFpuRotateStackSetTop(pFpuCtx, 0); 9344 9351 9345 9352 /* -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r96807 r96852 56 56 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 57 57 IEM_MC_PREPARE_FPU_USAGE(); 58 IEM_MC_FPU_TO_MMX_MODE(); 59 58 60 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 59 61 IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm)); 60 62 IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc); 61 63 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 62 IEM_MC_FPU_TO_MMX_MODE(); 64 63 65 IEM_MC_ADVANCE_RIP(); 64 66 IEM_MC_END(); … … 81 83 82 84 IEM_MC_PREPARE_FPU_USAGE(); 85 IEM_MC_FPU_TO_MMX_MODE(); 86 83 87 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 84 88 IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc); 85 89 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 86 IEM_MC_FPU_TO_MMX_MODE();87 90 88 91 IEM_MC_ADVANCE_RIP(); … … 116 119 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 117 120 IEM_MC_PREPARE_FPU_USAGE(); 121 IEM_MC_FPU_TO_MMX_MODE(); 122 118 123 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 119 124 IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm)); 120 125 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc); 121 126 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 122 IEM_MC_FPU_TO_MMX_MODE(); 127 123 128 IEM_MC_ADVANCE_RIP(); 124 129 IEM_MC_END(); … … 141 146 142 147 IEM_MC_PREPARE_FPU_USAGE(); 148 IEM_MC_FPU_TO_MMX_MODE(); 149 143 150 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 144 151 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc); 145 152 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 146 IEM_MC_FPU_TO_MMX_MODE();147 153 148 154 IEM_MC_ADVANCE_RIP(); … … 174 180 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 175 181 IEM_MC_PREPARE_FPU_USAGE(); 182 IEM_MC_FPU_TO_MMX_MODE(); 183 176 184 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 177 185 IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm)); 178 186 IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc); 179 187 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 180 IEM_MC_FPU_TO_MMX_MODE(); 188 181 189 IEM_MC_ADVANCE_RIP(); 182 190 IEM_MC_END(); … … 199 207 200 208 IEM_MC_PREPARE_FPU_USAGE(); 209 IEM_MC_FPU_TO_MMX_MODE(); 210 201 211 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 202 212 IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc); 203 213 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 204 IEM_MC_FPU_TO_MMX_MODE();205 214 206 215 IEM_MC_ADVANCE_RIP(); … … 235 244 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 236 245 IEM_MC_PREPARE_FPU_USAGE(); 246 IEM_MC_FPU_TO_MMX_MODE(); 247 237 248 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 238 249 IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm)); 239 250 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc); 240 251 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 241 IEM_MC_FPU_TO_MMX_MODE(); 252 242 253 IEM_MC_ADVANCE_RIP(); 243 254 IEM_MC_END(); … … 260 271 261 272 IEM_MC_PREPARE_FPU_USAGE(); 273 IEM_MC_FPU_TO_MMX_MODE(); 274 262 275 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 263 276 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, pSrc); 264 277 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 265 IEM_MC_FPU_TO_MMX_MODE();266 278 267 279 IEM_MC_ADVANCE_RIP(); … … 293 305 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_EX(fSupported); 294 306 IEM_MC_PREPARE_FPU_USAGE(); 307 IEM_MC_FPU_TO_MMX_MODE(); 308 295 309 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 296 310 IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm)); 297 311 IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc); 298 312 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 299 IEM_MC_FPU_TO_MMX_MODE(); 313 300 314 IEM_MC_ADVANCE_RIP(); 301 315 IEM_MC_END(); … … 318 332 319 333 IEM_MC_PREPARE_FPU_USAGE(); 334 IEM_MC_FPU_TO_MMX_MODE(); 335 320 336 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 321 337 IEM_MC_CALL_MMX_AIMPL_2(pfnU64, pDst, pSrc); 322 338 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 323 IEM_MC_FPU_TO_MMX_MODE();324 339 325 340 IEM_MC_ADVANCE_RIP(); … … 466 481 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 467 482 IEM_MC_PREPARE_FPU_USAGE(); 483 IEM_MC_FPU_TO_MMX_MODE(); 484 468 485 IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 469 486 IEM_MC_REF_MREG_U64_CONST(puSrc, IEM_GET_MODRM_RM_8(bRm)); 470 487 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc); 471 488 IEM_MC_MODIFIED_MREG_BY_REF(puDst); 472 IEM_MC_FPU_TO_MMX_MODE(); 489 473 490 IEM_MC_ADVANCE_RIP(); 474 491 IEM_MC_END(); … … 491 508 492 509 IEM_MC_PREPARE_FPU_USAGE(); 510 IEM_MC_FPU_TO_MMX_MODE(); 511 493 512 IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 494 513 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc); 495 514 IEM_MC_MODIFIED_MREG_BY_REF(puDst); 496 IEM_MC_FPU_TO_MMX_MODE();497 515 498 516 IEM_MC_ADVANCE_RIP(); … … 648 666 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 649 667 IEM_MC_PREPARE_FPU_USAGE(); 668 IEM_MC_FPU_TO_MMX_MODE(); 669 650 670 IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 651 671 IEM_MC_REF_MREG_U64_CONST(puSrc, IEM_GET_MODRM_RM_8(bRm)); 652 672 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc); 653 673 IEM_MC_MODIFIED_MREG_BY_REF(puDst); 654 IEM_MC_FPU_TO_MMX_MODE(); 674 655 675 IEM_MC_ADVANCE_RIP(); 656 676 IEM_MC_END(); … … 673 693 674 694 IEM_MC_PREPARE_FPU_USAGE(); 695 IEM_MC_FPU_TO_MMX_MODE(); 696 675 697 IEM_MC_REF_MREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 676 698 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, puDst, puSrc); 677 699 IEM_MC_MODIFIED_MREG_BY_REF(puDst); 678 IEM_MC_FPU_TO_MMX_MODE();679 700 680 701 IEM_MC_ADVANCE_RIP(); … … 5769 5790 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 5770 5791 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 5792 IEM_MC_FPU_TO_MMX_MODE(); 5771 5793 5772 5794 IEM_MC_FETCH_GREG_U64(u64Tmp, IEM_GET_MODRM_RM(pVCpu, bRm)); 5773 5795 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp); 5774 IEM_MC_FPU_TO_MMX_MODE();5775 5796 5776 5797 IEM_MC_ADVANCE_RIP(); … … 5788 5809 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 5789 5810 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 5811 IEM_MC_FPU_TO_MMX_MODE(); 5790 5812 5791 5813 IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 5792 5814 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp); 5793 IEM_MC_FPU_TO_MMX_MODE();5794 5815 5795 5816 IEM_MC_ADVANCE_RIP(); … … 5821 5842 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 5822 5843 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 5844 IEM_MC_FPU_TO_MMX_MODE(); 5823 5845 5824 5846 IEM_MC_FETCH_GREG_U32_ZX_U64(u64Tmp, IEM_GET_MODRM_RM(pVCpu, bRm)); 5825 5847 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp); 5826 IEM_MC_FPU_TO_MMX_MODE();5827 5848 5828 5849 IEM_MC_ADVANCE_RIP(); … … 5840 5861 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 5841 5862 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 5863 IEM_MC_FPU_TO_MMX_MODE(); 5842 5864 5843 5865 IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 5844 5866 IEM_MC_STORE_MREG_U32_ZX_U64(IEM_GET_MODRM_REG_8(bRm), u32Tmp); 5845 IEM_MC_FPU_TO_MMX_MODE();5846 5867 5847 5868 IEM_MC_ADVANCE_RIP(); … … 5983 6004 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 5984 6005 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 6006 IEM_MC_FPU_TO_MMX_MODE(); 5985 6007 5986 6008 IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_RM_8(bRm)); 5987 6009 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp); 5988 IEM_MC_FPU_TO_MMX_MODE();5989 6010 5990 6011 IEM_MC_ADVANCE_RIP(); … … 6004 6025 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 6005 6026 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 6027 IEM_MC_FPU_TO_MMX_MODE(); 6006 6028 6007 6029 IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 6008 6030 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), u64Tmp); 6009 IEM_MC_FPU_TO_MMX_MODE();6010 6031 6011 6032 IEM_MC_ADVANCE_RIP(); … … 6136 6157 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 6137 6158 IEM_MC_PREPARE_FPU_USAGE(); 6159 IEM_MC_FPU_TO_MMX_MODE(); 6160 6138 6161 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 6139 6162 IEM_MC_REF_MREG_U64_CONST(pSrc, IEM_GET_MODRM_RM_8(bRm)); 6140 6163 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pshufw_u64, pDst, pSrc, bEvilArg); 6141 6164 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 6142 IEM_MC_FPU_TO_MMX_MODE(); 6165 6143 6166 IEM_MC_ADVANCE_RIP(); 6144 6167 IEM_MC_END(); … … 6160 6183 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 6161 6184 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 6162 6163 6185 IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 6186 6164 6187 IEM_MC_PREPARE_FPU_USAGE(); 6188 IEM_MC_FPU_TO_MMX_MODE(); 6189 6165 6190 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_REG_8(bRm)); 6166 6191 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_pshufw_u64, pDst, pSrc, bEvilArg); 6167 6192 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 6168 IEM_MC_FPU_TO_MMX_MODE();6169 6193 6170 6194 IEM_MC_ADVANCE_RIP(); … … 6287 6311 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 6288 6312 IEM_MC_PREPARE_FPU_USAGE(); 6313 IEM_MC_FPU_TO_MMX_MODE(); 6314 6289 6315 IEM_MC_REF_MREG_U64(pDst, IEM_GET_MODRM_RM_8(bRm)); 6290 6316 IEM_MC_CALL_VOID_AIMPL_2(pfnU64, pDst, bShiftArg); 6291 6317 IEM_MC_MODIFIED_MREG_BY_REF(pDst); 6292 IEM_MC_FPU_TO_MMX_MODE(); 6318 6293 6319 IEM_MC_ADVANCE_RIP(); 6294 6320 IEM_MC_END(); … … 6894 6920 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 6895 6921 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 6922 IEM_MC_FPU_TO_MMX_MODE(); 6896 6923 6897 6924 IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_REG_8(bRm)); 6898 6925 IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Tmp); 6899 IEM_MC_FPU_TO_MMX_MODE();6900 6926 6901 6927 IEM_MC_ADVANCE_RIP(); … … 6913 6939 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 6914 6940 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 6941 IEM_MC_FPU_TO_MMX_MODE(); 6915 6942 6916 6943 IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_REG_8(bRm)); 6917 6944 IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp); 6918 IEM_MC_FPU_TO_MMX_MODE();6919 6945 6920 6946 IEM_MC_ADVANCE_RIP(); … … 6946 6972 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 6947 6973 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 6974 IEM_MC_FPU_TO_MMX_MODE(); 6948 6975 6949 6976 IEM_MC_FETCH_MREG_U32(u32Tmp, IEM_GET_MODRM_REG_8(bRm)); 6950 6977 IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_RM(pVCpu, bRm), u32Tmp); 6951 IEM_MC_FPU_TO_MMX_MODE();6952 6978 6953 6979 IEM_MC_ADVANCE_RIP(); … … 6965 6991 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 6966 6992 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 6993 IEM_MC_FPU_TO_MMX_MODE(); 6967 6994 6968 6995 IEM_MC_FETCH_MREG_U32(u32Tmp, IEM_GET_MODRM_REG_8(bRm)); 6969 6996 IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u32Tmp); 6970 IEM_MC_FPU_TO_MMX_MODE();6971 6997 6972 6998 IEM_MC_ADVANCE_RIP(); … … 7158 7184 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 7159 7185 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 7186 IEM_MC_FPU_TO_MMX_MODE(); 7187 7160 7188 IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_REG_8(bRm)); 7161 7189 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM_8(bRm), u64Tmp); 7162 IEM_MC_FPU_TO_MMX_MODE(); 7190 7163 7191 IEM_MC_ADVANCE_RIP(); 7164 7192 IEM_MC_END(); … … 7177 7205 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 7178 7206 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 7207 IEM_MC_FPU_TO_MMX_MODE(); 7179 7208 7180 7209 IEM_MC_FETCH_MREG_U64(u64Tmp, IEM_GET_MODRM_REG_8(bRm)); 7181 7210 IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp); 7182 IEM_MC_FPU_TO_MMX_MODE();7183 7211 7184 7212 IEM_MC_ADVANCE_RIP(); … … 12193 12221 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 12194 12222 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 12223 IEM_MC_FPU_TO_MMX_MODE(); 12195 12224 12196 12225 IEM_MC_FETCH_MREG_U64(uSrc, IEM_GET_MODRM_RM_8(bRm)); 12197 12226 IEM_MC_STORE_XREG_U64_ZX_U128(IEM_GET_MODRM_REG(pVCpu, bRm), uSrc); 12198 IEM_MC_FPU_TO_MMX_MODE();12199 12227 12200 12228 IEM_MC_ADVANCE_RIP(); … … 12245 12273 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 12246 12274 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 12275 IEM_MC_FPU_TO_MMX_MODE(); 12247 12276 12248 12277 IEM_MC_FETCH_XREG_U64(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 12249 12278 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG_8(bRm), uSrc); 12250 IEM_MC_FPU_TO_MMX_MODE();12251 12279 12252 12280 IEM_MC_ADVANCE_RIP(); … … 12284 12312 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT(); 12285 12313 IEM_MC_PREPARE_FPU_USAGE(); 12314 IEM_MC_FPU_TO_MMX_MODE(); 12315 12286 12316 IEM_MC_REF_GREG_U64(puDst, IEM_GET_MODRM_REG_8(bRm)); 12287 12317 IEM_MC_REF_MREG_U64_CONST(puSrc, IEM_GET_MODRM_RM_8(bRm)); 12288 12318 IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_pmovmskb_u64, puDst, puSrc); 12289 IEM_MC_FPU_TO_MMX_MODE(); 12319 12290 12320 IEM_MC_ADVANCE_RIP(); 12291 12321 IEM_MC_END(); … … 12642 12672 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 12643 12673 IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE(); 12674 IEM_MC_FPU_TO_MMX_MODE(); 12644 12675 12645 12676 IEM_MC_FETCH_MREG_U64(uSrc, IEM_GET_MODRM_REG_8(bRm)); 12646 12677 IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc); 12647 IEM_MC_FPU_TO_MMX_MODE();12648 12678 12649 12679 IEM_MC_ADVANCE_RIP(); -
trunk/src/VBox/VMM/include/IEMInline.h
r96723 r96852 2152 2152 2153 2153 /** 2154 * Rotates the stack registers when setting new TOS. 2155 * 2156 * @param pFpuCtx The FPU context. 2157 * @param iNewTop New TOS value. 2158 * @remarks We only do this to speed up fxsave/fxrstor which 2159 * arrange the FP registers in stack order. 2160 * MUST be done before writing the new TOS (FSW). 2161 */ 2162 DECLINLINE(void) iemFpuRotateStackSetTop(PX86FXSTATE pFpuCtx, uint16_t iNewTop) 2163 { 2164 uint16_t iOldTop = X86_FSW_TOP_GET(pFpuCtx->FSW); 2165 RTFLOAT80U ar80Temp[8]; 2166 2167 if (iOldTop == iNewTop) 2168 return; 2169 2170 /* Unscrew the stack and get it into 'native' order. */ 2171 ar80Temp[0] = pFpuCtx->aRegs[(8 - iOldTop + 0) & X86_FSW_TOP_SMASK].r80; 2172 ar80Temp[1] = pFpuCtx->aRegs[(8 - iOldTop + 1) & X86_FSW_TOP_SMASK].r80; 2173 ar80Temp[2] = pFpuCtx->aRegs[(8 - iOldTop + 2) & X86_FSW_TOP_SMASK].r80; 2174 ar80Temp[3] = pFpuCtx->aRegs[(8 - iOldTop + 3) & X86_FSW_TOP_SMASK].r80; 2175 ar80Temp[4] = pFpuCtx->aRegs[(8 - iOldTop + 4) & X86_FSW_TOP_SMASK].r80; 2176 ar80Temp[5] = pFpuCtx->aRegs[(8 - iOldTop + 5) & X86_FSW_TOP_SMASK].r80; 2177 ar80Temp[6] = pFpuCtx->aRegs[(8 - iOldTop + 6) & X86_FSW_TOP_SMASK].r80; 2178 ar80Temp[7] = pFpuCtx->aRegs[(8 - iOldTop + 7) & X86_FSW_TOP_SMASK].r80; 2179 2180 /* Now rotate the stack to the new position. */ 2181 pFpuCtx->aRegs[0].r80 = ar80Temp[(iNewTop + 0) & X86_FSW_TOP_SMASK]; 2182 pFpuCtx->aRegs[1].r80 = ar80Temp[(iNewTop + 1) & X86_FSW_TOP_SMASK]; 2183 pFpuCtx->aRegs[2].r80 = ar80Temp[(iNewTop + 2) & X86_FSW_TOP_SMASK]; 2184 pFpuCtx->aRegs[3].r80 = ar80Temp[(iNewTop + 3) & X86_FSW_TOP_SMASK]; 2185 pFpuCtx->aRegs[4].r80 = ar80Temp[(iNewTop + 4) & X86_FSW_TOP_SMASK]; 2186 pFpuCtx->aRegs[5].r80 = ar80Temp[(iNewTop + 5) & X86_FSW_TOP_SMASK]; 2187 pFpuCtx->aRegs[6].r80 = ar80Temp[(iNewTop + 6) & X86_FSW_TOP_SMASK]; 2188 pFpuCtx->aRegs[7].r80 = ar80Temp[(iNewTop + 7) & X86_FSW_TOP_SMASK]; 2189 } 2190 2191 2192 /** 2154 2193 * Updates the FPU exception status after FCW is changed. 2155 2194 * … … 2201 2240 uTag = 2; /* Must be special. */ 2202 2241 2203 u16Ftw |= uTag << (iReg * 2); /* empty */2242 u16Ftw |= uTag << (iReg * 2); 2204 2243 } 2205 2244 } -
trunk/src/VBox/VMM/include/IEMMc.h
r96789 r96852 416 416 /** Switches the FPU state to MMX mode (FSW.TOS=0, FTW=0) if necessary. */ 417 417 #define IEM_MC_FPU_TO_MMX_MODE() do { \ 418 iemFpuRotateStackSetTop(&pVCpu->cpum.GstCtx.XState.x87, 0); \ 418 419 pVCpu->cpum.GstCtx.XState.x87.FSW &= ~X86_FSW_TOP_MASK; \ 419 420 pVCpu->cpum.GstCtx.XState.x87.FTW = 0xff; \ 420 421 } while (0) 421 422 422 /** Switches the FPU state from MMX mode (F TW=0xffff). */423 /** Switches the FPU state from MMX mode (FSW.TOS=0, FTW=0xffff). */ 423 424 #define IEM_MC_FPU_FROM_MMX_MODE() do { \ 425 iemFpuRotateStackSetTop(&pVCpu->cpum.GstCtx.XState.x87, 0); \ 426 pVCpu->cpum.GstCtx.XState.x87.FSW &= ~X86_FSW_TOP_MASK; \ 424 427 pVCpu->cpum.GstCtx.XState.x87.FTW = 0; \ 425 428 } while (0)
Note:
See TracChangeset
for help on using the changeset viewer.