VirtualBox

Changeset 100591 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jul 15, 2023 1:20:13 AM (20 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158421
Message:

VMM/IEM: Must pass the FPU opcode word to the various MCs updating FOP as IEMCPU::uFpuOpcode isn't available during recompiled code execution. bugref:10369

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r100277 r100591  
    49314931 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    49324932 * @param   pResult             The FPU operation result to push.
    4933  */
    4934 void iemFpuPushResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult) RT_NOEXCEPT
     4933 * @param   uFpuOpcode          The FPU opcode value.
     4934 */
     4935void iemFpuPushResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint16_t uFpuOpcode) RT_NOEXCEPT
    49354936{
    49364937    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    4937     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     4938    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    49384939    iemFpuMaybePushResult(pVCpu, pResult, pFpuCtx);
    49394940}
     
    49484949 * @param   iEffSeg             The effective segment register.
    49494950 * @param   GCPtrEff            The effective address relative to @a iEffSeg.
    4950  */
    4951 void iemFpuPushResultWithMemOp(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT
     4951 * @param   uFpuOpcode          The FPU opcode value.
     4952 */
     4953void iemFpuPushResultWithMemOp(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iEffSeg, RTGCPTR GCPtrEff,
     4954                               uint16_t uFpuOpcode) RT_NOEXCEPT
    49524955{
    49534956    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    49544957    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    4955     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     4958    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    49564959    iemFpuMaybePushResult(pVCpu, pResult, pFpuCtx);
    49574960}
     
    49644967 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    49654968 * @param   pResult             The FPU operation result to store and push.
    4966  */
    4967 void iemFpuPushResultTwo(PVMCPUCC pVCpu, PIEMFPURESULTTWO pResult) RT_NOEXCEPT
     4969 * @param   uFpuOpcode          The FPU opcode value.
     4970 */
     4971void iemFpuPushResultTwo(PVMCPUCC pVCpu, PIEMFPURESULTTWO pResult, uint16_t uFpuOpcode) RT_NOEXCEPT
    49684972{
    49694973    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    4970     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     4974    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    49714975
    49724976    /* Update FSW and bail if there are pending exceptions afterwards. */
     
    50235027 * @param   pResult             The result to store.
    50245028 * @param   iStReg              Which FPU register to store it in.
    5025  */
    5026 void iemFpuStoreResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg) RT_NOEXCEPT
     5029 * @param   uFpuOpcode          The FPU opcode value.
     5030 */
     5031void iemFpuStoreResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT
    50275032{
    50285033    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5029     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5034    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    50305035    iemFpuStoreResultOnly(pVCpu, pFpuCtx, pResult, iStReg);
    50315036}
     
    50395044 * @param   pResult             The result to store.
    50405045 * @param   iStReg              Which FPU register to store it in.
    5041  */
    5042 void iemFpuStoreResultThenPop(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg) RT_NOEXCEPT
     5046 * @param   uFpuOpcode          The FPU opcode value.
     5047 */
     5048void iemFpuStoreResultThenPop(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT
    50435049{
    50445050    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5045     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5051    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    50465052    iemFpuStoreResultOnly(pVCpu, pFpuCtx, pResult, iStReg);
    50475053    iemFpuMaybePopOne(pFpuCtx);
     
    50585064 * @param   iEffSeg             The effective memory operand selector register.
    50595065 * @param   GCPtrEff            The effective memory operand offset.
     5066 * @param   uFpuOpcode          The FPU opcode value.
    50605067 */
    50615068void iemFpuStoreResultWithMemOp(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg,
    5062                                 uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT
     5069                                uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT
    50635070{
    50645071    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    50655072    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    5066     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5073    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    50675074    iemFpuStoreResultOnly(pVCpu, pFpuCtx, pResult, iStReg);
    50685075}
     
    50785085 * @param   iEffSeg             The effective memory operand selector register.
    50795086 * @param   GCPtrEff            The effective memory operand offset.
     5087 * @param   uFpuOpcode          The FPU opcode value.
    50805088 */
    50815089void iemFpuStoreResultWithMemOpThenPop(PVMCPUCC pVCpu, PIEMFPURESULT pResult,
    5082                                        uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT
     5090                                       uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT
    50835091{
    50845092    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    50855093    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    5086     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5094    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    50875095    iemFpuStoreResultOnly(pVCpu, pFpuCtx, pResult, iStReg);
    50885096    iemFpuMaybePopOne(pFpuCtx);
     
    50945102 *
    50955103 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    5096  */
    5097 void iemFpuUpdateOpcodeAndIp(PVMCPUCC pVCpu) RT_NOEXCEPT
     5104 * @param   uFpuOpcode          The FPU opcode value.
     5105 */
     5106void iemFpuUpdateOpcodeAndIp(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT
    50985107{
    50995108    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5100     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5109    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    51015110}
    51025111
     
    51075116 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    51085117 * @param   u16FSW              The FSW from the current instruction.
    5109  */
    5110 void iemFpuUpdateFSW(PVMCPUCC pVCpu, uint16_t u16FSW) RT_NOEXCEPT
     5118 * @param   uFpuOpcode          The FPU opcode value.
     5119 */
     5120void iemFpuUpdateFSW(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT
    51115121{
    51125122    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5113     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5123    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    51145124    iemFpuUpdateFSWOnly(pVCpu, pFpuCtx, u16FSW);
    51155125}
     
    51215131 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    51225132 * @param   u16FSW              The FSW from the current instruction.
    5123  */
    5124 void iemFpuUpdateFSWThenPop(PVMCPUCC pVCpu, uint16_t u16FSW) RT_NOEXCEPT
     5133 * @param   uFpuOpcode          The FPU opcode value.
     5134 */
     5135void iemFpuUpdateFSWThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT
    51255136{
    51265137    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5127     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5138    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    51285139    iemFpuUpdateFSWOnly(pVCpu, pFpuCtx, u16FSW);
    51295140    iemFpuMaybePopOne(pFpuCtx);
     
    51385149 * @param   iEffSeg             The effective memory operand selector register.
    51395150 * @param   GCPtrEff            The effective memory operand offset.
    5140  */
    5141 void iemFpuUpdateFSWWithMemOp(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT
     5151 * @param   uFpuOpcode          The FPU opcode value.
     5152 */
     5153void iemFpuUpdateFSWWithMemOp(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT
    51425154{
    51435155    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    51445156    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    5145     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5157    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    51465158    iemFpuUpdateFSWOnly(pVCpu, pFpuCtx, u16FSW);
    51475159}
     
    51535165 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    51545166 * @param   u16FSW              The FSW from the current instruction.
    5155  */
    5156 void iemFpuUpdateFSWThenPopPop(PVMCPUCC pVCpu, uint16_t u16FSW) RT_NOEXCEPT
     5167 * @param   uFpuOpcode          The FPU opcode value.
     5168 */
     5169void iemFpuUpdateFSWThenPopPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT
    51575170{
    51585171    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5159     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5172    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    51605173    iemFpuUpdateFSWOnly(pVCpu, pFpuCtx, u16FSW);
    51615174    iemFpuMaybePopOne(pFpuCtx);
     
    51715184 * @param   iEffSeg             The effective memory operand selector register.
    51725185 * @param   GCPtrEff            The effective memory operand offset.
    5173  */
    5174 void iemFpuUpdateFSWWithMemOpThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT
     5186 * @param   uFpuOpcode          The FPU opcode value.
     5187 */
     5188void iemFpuUpdateFSWWithMemOpThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff,
     5189                                     uint16_t uFpuOpcode) RT_NOEXCEPT
    51755190{
    51765191    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    51775192    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    5178     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5193    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    51795194    iemFpuUpdateFSWOnly(pVCpu, pFpuCtx, u16FSW);
    51805195    iemFpuMaybePopOne(pFpuCtx);
     
    52225237 *                              with QNaN if \#IS is not masked. Specify
    52235238 *                              UINT8_MAX if none (like for fcom).
    5224  */
    5225 void iemFpuStackUnderflow(PVMCPUCC pVCpu, uint8_t iStReg) RT_NOEXCEPT
     5239 * @param   uFpuOpcode          The FPU opcode value.
     5240 */
     5241void iemFpuStackUnderflow(PVMCPUCC pVCpu, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT
    52265242{
    52275243    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5228     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5244    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    52295245    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, iStReg);
    52305246}
    52315247
    52325248
    5233 void iemFpuStackUnderflowWithMemOp(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT
     5249void iemFpuStackUnderflowWithMemOp(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT
    52345250{
    52355251    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    52365252    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    5237     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5253    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    52385254    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, iStReg);
    52395255}
    52405256
    52415257
    5242 void iemFpuStackUnderflowThenPop(PVMCPUCC pVCpu, uint8_t iStReg) RT_NOEXCEPT
     5258void iemFpuStackUnderflowThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT
    52435259{
    52445260    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5245     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5261    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    52465262    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, iStReg);
    52475263    iemFpuMaybePopOne(pFpuCtx);
     
    52495265
    52505266
    5251 void iemFpuStackUnderflowWithMemOpThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT
     5267void iemFpuStackUnderflowWithMemOpThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff,
     5268                                          uint16_t uFpuOpcode) RT_NOEXCEPT
    52525269{
    52535270    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    52545271    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    5255     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5272    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    52565273    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, iStReg);
    52575274    iemFpuMaybePopOne(pFpuCtx);
     
    52595276
    52605277
    5261 void iemFpuStackUnderflowThenPopPop(PVMCPUCC pVCpu) RT_NOEXCEPT
     5278void iemFpuStackUnderflowThenPopPop(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT
    52625279{
    52635280    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5264     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5281    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    52655282    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, UINT8_MAX);
    52665283    iemFpuMaybePopOne(pFpuCtx);
     
    52695286
    52705287
    5271 void iemFpuStackPushUnderflow(PVMCPUCC pVCpu) RT_NOEXCEPT
     5288void iemFpuStackPushUnderflow(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT
    52725289{
    52735290    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5274     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5291    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    52755292
    52765293    if (pFpuCtx->FCW & X86_FCW_IM)
     
    52965313
    52975314
    5298 void iemFpuStackPushUnderflowTwo(PVMCPUCC pVCpu) RT_NOEXCEPT
     5315void iemFpuStackPushUnderflowTwo(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT
    52995316{
    53005317    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5301     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5318    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    53025319
    53035320    if (pFpuCtx->FCW & X86_FCW_IM)
     
    53605377 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    53615378 */
    5362 void iemFpuStackPushOverflow(PVMCPUCC pVCpu) RT_NOEXCEPT
     5379void iemFpuStackPushOverflow(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT
    53635380{
    53645381    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5365     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5382    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    53665383    iemFpuStackPushOverflowOnly(pVCpu, pFpuCtx);
    53675384}
     
    53755392 * @param   GCPtrEff            The effective memory operand offset.
    53765393 */
    5377 void iemFpuStackPushOverflowWithMemOp(PVMCPUCC pVCpu, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT
     5394void iemFpuStackPushOverflowWithMemOp(PVMCPUCC pVCpu, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT
    53785395{
    53795396    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    53805397    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    5381     iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     5398    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, uFpuOpcode);
    53825399    iemFpuStackPushOverflowOnly(pVCpu, pFpuCtx);
    53835400}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r100231 r100591  
    80618061    IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, IEM_GET_MODRM_RM_8(bRm)) {
    80628062        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pr80Value2);
    8063         IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
     8063        IEM_MC_STORE_FPU_RESULT(FpuRes, 0, pVCpu->iem.s.uFpuOpcode);
    80648064    } IEM_MC_ELSE() {
    8065         IEM_MC_FPU_STACK_UNDERFLOW(0);
     8065        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    80668066    } IEM_MC_ENDIF();
    80678067    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    80938093    IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, IEM_GET_MODRM_RM_8(bRm)) {
    80948094        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pu16Fsw, pr80Value1, pr80Value2);
    8095         IEM_MC_UPDATE_FSW(u16Fsw);
     8095        IEM_MC_UPDATE_FSW(u16Fsw, pVCpu->iem.s.uFpuOpcode);
    80968096    } IEM_MC_ELSE() {
    8097         IEM_MC_FPU_STACK_UNDERFLOW(UINT8_MAX);
     8097        IEM_MC_FPU_STACK_UNDERFLOW(UINT8_MAX, pVCpu->iem.s.uFpuOpcode);
    80988098    } IEM_MC_ENDIF();
    80998099    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    81258125    IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, IEM_GET_MODRM_RM_8(bRm)) {
    81268126        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pu16Fsw, pr80Value1, pr80Value2);
    8127         IEM_MC_UPDATE_FSW_THEN_POP(u16Fsw);
     8127        IEM_MC_UPDATE_FSW_THEN_POP(u16Fsw, pVCpu->iem.s.uFpuOpcode);
    81288128    } IEM_MC_ELSE() {
    8129         IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(UINT8_MAX);
     8129        IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(UINT8_MAX, pVCpu->iem.s.uFpuOpcode);
    81308130    } IEM_MC_ENDIF();
    81318131    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    82268226    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    82278227        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pr32Val2);
    8228         IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
     8228        IEM_MC_STORE_FPU_RESULT(FpuRes, 0, pVCpu->iem.s.uFpuOpcode);
    82298229    } IEM_MC_ELSE() {
    8230         IEM_MC_FPU_STACK_UNDERFLOW(0);
     8230        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    82318231    } IEM_MC_ENDIF();
    82328232    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    82758275    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    82768276        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r32, pu16Fsw, pr80Value1, pr32Val2);
    8277         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     8277        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    82788278    } IEM_MC_ELSE() {
    8279         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     8279        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    82808280    } IEM_MC_ENDIF();
    82818281    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    83088308    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    83098309        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r32, pu16Fsw, pr80Value1, pr32Val2);
    8310         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     8310        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    83118311    } IEM_MC_ELSE() {
    8312         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     8312        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    83138313    } IEM_MC_ENDIF();
    83148314    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    84108410    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    84118411    IEM_MC_FETCH_MEM_R32(r32Val, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    8412 
    84138412    IEM_MC_PREPARE_FPU_USAGE();
    84148413    IEM_MC_IF_FPUREG_IS_EMPTY(7) {
    84158414        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r80_from_r32, pFpuRes, pr32Val);
    8416         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     8415        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    84178416    } IEM_MC_ELSE() {
    8418         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     8417        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    84198418    } IEM_MC_ENDIF();
    84208419    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    84458444        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value);
    84468445        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    8447         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     8446        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    84488447    } IEM_MC_ELSE() {
    84498448        IEM_MC_IF_FCW_IM() {
     
    84518450            IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
    84528451        } IEM_MC_ENDIF();
    8453         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     8452        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    84548453    } IEM_MC_ENDIF();
    84558454    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    84808479        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value);
    84818480        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    8482         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     8481        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    84838482    } IEM_MC_ELSE() {
    84848483        IEM_MC_IF_FCW_IM() {
     
    84868485            IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
    84878486        } IEM_MC_ENDIF();
    8488         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     8487        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    84898488    } IEM_MC_ENDIF();
    84908489    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    85778576    /** @todo Testcase: looks like FNOP leaves FOP alone but updates FPUIP. Could be
    85788577     *        intel optimizations. Investigate. */
    8579     IEM_MC_UPDATE_FPU_OPCODE_IP();
     8578    IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    85808579    IEM_MC_ADVANCE_RIP_AND_FINISH(); /* C0-C3 are documented as undefined, we leave them unmodified. */
    85818580    IEM_MC_END();
     
    86008599    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, IEM_GET_MODRM_RM_8(bRm)) {
    86018600        IEM_MC_SET_FPU_RESULT(FpuRes, 0 /*FSW*/, pr80Value);
    8602         IEM_MC_PUSH_FPU_RESULT(FpuRes);
     8601        IEM_MC_PUSH_FPU_RESULT(FpuRes, pVCpu->iem.s.uFpuOpcode);
    86038602    } IEM_MC_ELSE() {
    8604         IEM_MC_FPU_STACK_PUSH_UNDERFLOW();
     8603        IEM_MC_FPU_STACK_PUSH_UNDERFLOW(pVCpu->iem.s.uFpuOpcode);
    86058604    } IEM_MC_ENDIF();
    86068605
     
    86318630        IEM_MC_SET_FPU_RESULT(FpuRes, X86_FSW_C1, pr80Value2);
    86328631        IEM_MC_STORE_FPUREG_R80_SRC_REF(IEM_GET_MODRM_RM_8(bRm), pr80Value1);
    8633         IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
     8632        IEM_MC_STORE_FPU_RESULT(FpuRes, 0, pVCpu->iem.s.uFpuOpcode);
    86348633    } IEM_MC_ELSE() {
    86358634        IEM_MC_CALL_CIMPL_2(IEM_CIMPL_F_FPU, iemCImpl_fxch_underflow, iStReg, uFpuOpcode);
     
    86588657        IEM_MC_PREPARE_FPU_USAGE();
    86598658        IEM_MC_IF_FPUREG_NOT_EMPTY(0) {
    8660             IEM_MC_UPDATE_FSW_THEN_POP(u16Fsw);
     8659            IEM_MC_UPDATE_FSW_THEN_POP(u16Fsw, pVCpu->iem.s.uFpuOpcode);
    86618660        } IEM_MC_ELSE() {
    8662             IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(0);
     8661            IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(0, pVCpu->iem.s.uFpuOpcode);
    86638662        } IEM_MC_ENDIF();
    86648663
     
    86778676        IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
    86788677            IEM_MC_SET_FPU_RESULT(FpuRes, 0 /*FSW*/, pr80Value);
    8679             IEM_MC_STORE_FPU_RESULT_THEN_POP(FpuRes, iDstReg);
     8678            IEM_MC_STORE_FPU_RESULT_THEN_POP(FpuRes, iDstReg, pVCpu->iem.s.uFpuOpcode);
    86808679        } IEM_MC_ELSE() {
    8681             IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(iDstReg);
     8680            IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(iDstReg, pVCpu->iem.s.uFpuOpcode);
    86828681        } IEM_MC_ENDIF();
    86838682
     
    87088707    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
    87098708        IEM_MC_CALL_FPU_AIMPL_2(pfnAImpl, pFpuRes, pr80Value);
    8710         IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
     8709        IEM_MC_STORE_FPU_RESULT(FpuRes, 0, pVCpu->iem.s.uFpuOpcode);
    87118710    } IEM_MC_ELSE() {
    8712         IEM_MC_FPU_STACK_UNDERFLOW(0);
     8711        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    87138712    } IEM_MC_ENDIF();
    87148713    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    87508749    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
    87518750        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_ftst_r80, pu16Fsw, pr80Value);
    8752         IEM_MC_UPDATE_FSW(u16Fsw);
     8751        IEM_MC_UPDATE_FSW(u16Fsw, pVCpu->iem.s.uFpuOpcode);
    87538752    } IEM_MC_ELSE() {
    8754         IEM_MC_FPU_STACK_UNDERFLOW(UINT8_MAX);
     8753        IEM_MC_FPU_STACK_UNDERFLOW(UINT8_MAX, pVCpu->iem.s.uFpuOpcode);
    87558754    } IEM_MC_ENDIF();
    87568755    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    87768775    IEM_MC_REF_FPUREG(pr80Value, 0);
    87778776    IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fxam_r80, pu16Fsw, pr80Value);
    8778     IEM_MC_UPDATE_FSW(u16Fsw);
     8777    IEM_MC_UPDATE_FSW(u16Fsw, pVCpu->iem.s.uFpuOpcode);
    87798778    IEM_MC_ADVANCE_RIP_AND_FINISH();
    87808779
     
    88018800    IEM_MC_IF_FPUREG_IS_EMPTY(7) {
    88028801        IEM_MC_CALL_FPU_AIMPL_1(pfnAImpl, pFpuRes);
    8803         IEM_MC_PUSH_FPU_RESULT(FpuRes);
     8802        IEM_MC_PUSH_FPU_RESULT(FpuRes, pVCpu->iem.s.uFpuOpcode);
    88048803    } IEM_MC_ELSE() {
    8805         IEM_MC_FPU_STACK_PUSH_OVERFLOW();
     8804        IEM_MC_FPU_STACK_PUSH_OVERFLOW(pVCpu->iem.s.uFpuOpcode);
    88068805    } IEM_MC_ENDIF();
    88078806    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    89038902    IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, IEM_GET_MODRM_RM_8(bRm), pr80Value2, 0) {
    89048903        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pr80Value2);
    8905         IEM_MC_STORE_FPU_RESULT_THEN_POP(FpuRes, IEM_GET_MODRM_RM_8(bRm));
     8904        IEM_MC_STORE_FPU_RESULT_THEN_POP(FpuRes, IEM_GET_MODRM_RM_8(bRm), pVCpu->iem.s.uFpuOpcode);
    89068905    } IEM_MC_ELSE() {
    8907         IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(IEM_GET_MODRM_RM_8(bRm));
     8906        IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(IEM_GET_MODRM_RM_8(bRm), pVCpu->iem.s.uFpuOpcode);
    89088907    } IEM_MC_ENDIF();
    89098908    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    89418940    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
    89428941        IEM_MC_CALL_FPU_AIMPL_2(pfnAImpl, pFpuResTwo, pr80Value);
    8943         IEM_MC_PUSH_FPU_RESULT_TWO(FpuResTwo);
     8942        IEM_MC_PUSH_FPU_RESULT_TWO(FpuResTwo, pVCpu->iem.s.uFpuOpcode);
    89448943    } IEM_MC_ELSE() {
    8945         IEM_MC_FPU_STACK_PUSH_UNDERFLOW_TWO();
     8944        IEM_MC_FPU_STACK_PUSH_UNDERFLOW_TWO(pVCpu->iem.s.uFpuOpcode);
    89468945    } IEM_MC_ENDIF();
    89478946    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    89998998    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    90008999    IEM_MC_FPU_STACK_DEC_TOP();
    9001     IEM_MC_UPDATE_FSW_CONST(0);
     9000    IEM_MC_UPDATE_FSW_CONST(0, pVCpu->iem.s.uFpuOpcode);
    90029001
    90039002    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    90229021    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    90239022    IEM_MC_FPU_STACK_INC_TOP();
    9024     IEM_MC_UPDATE_FSW_CONST(0);
     9023    IEM_MC_UPDATE_FSW_CONST(0, pVCpu->iem.s.uFpuOpcode);
    90259024
    90269025    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    91949193            IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
    91959194        } IEM_MC_ENDIF();
    9196         IEM_MC_UPDATE_FPU_OPCODE_IP();
     9195        IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    91979196    } IEM_MC_ELSE() {
    9198         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9197        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    91999198    } IEM_MC_ENDIF();
    92009199    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    92219220            IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
    92229221        } IEM_MC_ENDIF();
    9223         IEM_MC_UPDATE_FPU_OPCODE_IP();
     9222        IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    92249223    } IEM_MC_ELSE() {
    9225         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9224        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    92269225    } IEM_MC_ENDIF();
    92279226    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    92489247            IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
    92499248        } IEM_MC_ENDIF();
    9250         IEM_MC_UPDATE_FPU_OPCODE_IP();
     9249        IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    92519250    } IEM_MC_ELSE() {
    9252         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9251        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    92539252    } IEM_MC_ENDIF();
    92549253    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    92759274            IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
    92769275        } IEM_MC_ENDIF();
    9277         IEM_MC_UPDATE_FPU_OPCODE_IP();
     9276        IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    92789277    } IEM_MC_ELSE() {
    9279         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9278        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    92809279    } IEM_MC_ENDIF();
    92819280    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    93079306    IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, 0, pr80Value2, 1) {
    93089307        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pu16Fsw, pr80Value1, pr80Value2);
    9309         IEM_MC_UPDATE_FSW_THEN_POP_POP(u16Fsw);
     9308        IEM_MC_UPDATE_FSW_THEN_POP_POP(u16Fsw, pVCpu->iem.s.uFpuOpcode);
    93109309    } IEM_MC_ELSE() {
    9311         IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP_POP();
     9310        IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP_POP(pVCpu->iem.s.uFpuOpcode);
    93129311    } IEM_MC_ENDIF();
    93139312    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    93529351    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    93539352        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pi32Val2);
    9354         IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
     9353        IEM_MC_STORE_FPU_RESULT(FpuRes, 0, pVCpu->iem.s.uFpuOpcode);
    93559354    } IEM_MC_ELSE() {
    9356         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9355        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    93579356    } IEM_MC_ENDIF();
    93589357    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    94019400    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    94029401        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i32, pu16Fsw, pr80Value1, pi32Val2);
    9403         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     9402        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    94049403    } IEM_MC_ELSE() {
    9405         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     9404        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    94069405    } IEM_MC_ENDIF();
    94079406    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    94349433    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    94359434        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i32, pu16Fsw, pr80Value1, pi32Val2);
    9436         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     9435        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    94379436    } IEM_MC_ELSE() {
    9438         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     9437        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    94399438    } IEM_MC_ENDIF();
    94409439    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    95419540    IEM_MC_IF_FPUREG_IS_EMPTY(7) {
    95429541        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_r80_from_i32, pFpuRes, pi32Val);
    9543         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     9542        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    95449543    } IEM_MC_ELSE() {
    9545         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     9544        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    95469545    } IEM_MC_ENDIF();
    95479546    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    95729571        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    95739572        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    9574         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9573        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    95759574    } IEM_MC_ELSE() {
    95769575        IEM_MC_IF_FCW_IM() {
     
    95789577            IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
    95799578        } IEM_MC_ENDIF();
    9580         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9579        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    95819580    } IEM_MC_ENDIF();
    95829581    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    96079606        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    96089607        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    9609         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9608        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    96109609    } IEM_MC_ELSE() {
    96119610        IEM_MC_IF_FCW_IM() {
     
    96139612            IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
    96149613        } IEM_MC_ENDIF();
    9615         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9614        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    96169615    } IEM_MC_ENDIF();
    96179616    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    96429641        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    96439642        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    9644         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9643        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    96459644    } IEM_MC_ELSE() {
    96469645        IEM_MC_IF_FCW_IM() {
     
    96489647            IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
    96499648        } IEM_MC_ENDIF();
    9650         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9649        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    96519650    } IEM_MC_ENDIF();
    96529651    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    96789677    IEM_MC_IF_FPUREG_IS_EMPTY(7) {
    96799678        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r80_from_r80, pFpuRes, pr80Val);
    9680         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     9679        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    96819680    } IEM_MC_ELSE() {
    9682         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     9681        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    96839682    } IEM_MC_ENDIF();
    96849683    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    97099708        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r80, pu16Fsw, pr80Dst, pr80Value);
    97109709        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr80Dst, IEM_ACCESS_DATA_W, u16Fsw);
    9711         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9710        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    97129711    } IEM_MC_ELSE() {
    97139712        IEM_MC_IF_FCW_IM() {
     
    97159714            IEM_MC_MEM_COMMIT_AND_UNMAP(pr80Dst, IEM_ACCESS_DATA_W);
    97169715        } IEM_MC_ENDIF();
    9717         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     9716        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    97189717    } IEM_MC_ENDIF();
    97199718    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    97409739            IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
    97419740        } IEM_MC_ENDIF();
    9742         IEM_MC_UPDATE_FPU_OPCODE_IP();
     9741        IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    97439742    } IEM_MC_ELSE() {
    9744         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9743        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    97459744    } IEM_MC_ENDIF();
    97469745    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    97679766            IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
    97689767        } IEM_MC_ENDIF();
    9769         IEM_MC_UPDATE_FPU_OPCODE_IP();
     9768        IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    97709769    } IEM_MC_ELSE() {
    9771         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9770        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    97729771    } IEM_MC_ENDIF();
    97739772    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    97949793            IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
    97959794        } IEM_MC_ENDIF();
    9796         IEM_MC_UPDATE_FPU_OPCODE_IP();
     9795        IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    97979796    } IEM_MC_ELSE() {
    9798         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9797        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    97999798    } IEM_MC_ENDIF();
    98009799    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    98219820            IEM_MC_STORE_FPUREG_R80_SRC_REF(0, pr80ValueN);
    98229821        } IEM_MC_ENDIF();
    9823         IEM_MC_UPDATE_FPU_OPCODE_IP();
     9822        IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    98249823    } IEM_MC_ELSE() {
    9825         IEM_MC_FPU_STACK_UNDERFLOW(0);
     9824        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    98269825    } IEM_MC_ENDIF();
    98279826    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1000410003    IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(pr80Value1, IEM_GET_MODRM_RM_8(bRm), pr80Value2, 0) {
    1000510004        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pr80Value2);
    10006         IEM_MC_STORE_FPU_RESULT(FpuRes, IEM_GET_MODRM_RM_8(bRm));
     10005        IEM_MC_STORE_FPU_RESULT(FpuRes, IEM_GET_MODRM_RM_8(bRm), pVCpu->iem.s.uFpuOpcode);
    1000710006    } IEM_MC_ELSE() {
    10008         IEM_MC_FPU_STACK_UNDERFLOW(IEM_GET_MODRM_RM_8(bRm));
     10007        IEM_MC_FPU_STACK_UNDERFLOW(IEM_GET_MODRM_RM_8(bRm), pVCpu->iem.s.uFpuOpcode);
    1000910008    } IEM_MC_ENDIF();
    1001010009    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1008810087    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Factor1, 0) {
    1008910088        IEM_MC_CALL_FPU_AIMPL_3(pfnImpl, pFpuRes, pr80Factor1, pr64Factor2);
    10090         IEM_MC_STORE_FPU_RESULT_MEM_OP(FpuRes, 0, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10089        IEM_MC_STORE_FPU_RESULT_MEM_OP(FpuRes, 0, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1009110090    } IEM_MC_ELSE() {
    10092         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(0, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10091        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(0, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1009310092    } IEM_MC_ENDIF();
    1009410093    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1013710136    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    1013810137        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r64, pu16Fsw, pr80Value1, pr64Val2);
    10139         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10138        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1014010139    } IEM_MC_ELSE() {
    10141         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10140        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1014210141    } IEM_MC_ENDIF();
    1014310142    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1017010169    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    1017110170        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r64, pu16Fsw, pr80Value1, pr64Val2);
    10172         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10171        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1017310172    } IEM_MC_ELSE() {
    10174         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10173        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1017510174    } IEM_MC_ENDIF();
    1017610175    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1027410273    IEM_MC_IF_FPUREG_IS_EMPTY(7) {
    1027510274        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r80_from_r64, pFpuRes, pr64Val);
    10276         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10275        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1027710276    } IEM_MC_ELSE() {
    10278         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10277        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1027910278    } IEM_MC_ENDIF();
    1028010279    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1030510304        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i64, pu16Fsw, pi64Dst, pr80Value);
    1030610305        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw);
    10307         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10306        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1030810307    } IEM_MC_ELSE() {
    1030910308        IEM_MC_IF_FCW_IM() {
     
    1031110310            IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W);
    1031210311        } IEM_MC_ENDIF();
    10313         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10312        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1031410313    } IEM_MC_ENDIF();
    1031510314    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1034010339        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16Fsw, pr64Dst, pr80Value);
    1034110340        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw);
    10342         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10341        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1034310342    } IEM_MC_ELSE() {
    1034410343        IEM_MC_IF_FCW_IM() {
     
    1034610345            IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W);
    1034710346        } IEM_MC_ENDIF();
    10348         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10347        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1034910348    } IEM_MC_ENDIF();
    1035010349    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1037710376        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16Fsw, pr64Dst, pr80Value);
    1037810377        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw);
    10379         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10378        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1038010379    } IEM_MC_ELSE() {
    1038110380        IEM_MC_IF_FCW_IM() {
     
    1038310382            IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W);
    1038410383        } IEM_MC_ENDIF();
    10385         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10384        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1038610385    } IEM_MC_ENDIF();
    1038710386    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1046610465    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    1046710466    IEM_MC_FPU_STACK_FREE(IEM_GET_MODRM_RM_8(bRm));
    10468     IEM_MC_UPDATE_FPU_OPCODE_IP();
     10467    IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    1046910468
    1047010469    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1048810487    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
    1048910488        IEM_MC_SET_FPU_RESULT(FpuRes, 0 /*FSW*/, pr80Value);
    10490         IEM_MC_STORE_FPU_RESULT(FpuRes, IEM_GET_MODRM_RM_8(bRm));
     10489        IEM_MC_STORE_FPU_RESULT(FpuRes, IEM_GET_MODRM_RM_8(bRm), pVCpu->iem.s.uFpuOpcode);
    1049110490    } IEM_MC_ELSE() {
    10492         IEM_MC_FPU_STACK_UNDERFLOW(IEM_GET_MODRM_RM_8(bRm));
     10491        IEM_MC_FPU_STACK_UNDERFLOW(IEM_GET_MODRM_RM_8(bRm), pVCpu->iem.s.uFpuOpcode);
    1049310492    } IEM_MC_ENDIF();
    1049410493
     
    1063710636    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    1063810637        IEM_MC_CALL_FPU_AIMPL_3(pfnAImpl, pFpuRes, pr80Value1, pi16Val2);
    10639         IEM_MC_STORE_FPU_RESULT(FpuRes, 0);
     10638        IEM_MC_STORE_FPU_RESULT(FpuRes, 0, pVCpu->iem.s.uFpuOpcode);
    1064010639    } IEM_MC_ELSE() {
    10641         IEM_MC_FPU_STACK_UNDERFLOW(0);
     10640        IEM_MC_FPU_STACK_UNDERFLOW(0, pVCpu->iem.s.uFpuOpcode);
    1064210641    } IEM_MC_ENDIF();
    1064310642    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1068610685    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    1068710686        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i16, pu16Fsw, pr80Value1, pi16Val2);
    10688         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10687        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1068910688    } IEM_MC_ELSE() {
    10690         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10689        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1069110690    } IEM_MC_ENDIF();
    1069210691    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1071910718    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0) {
    1072010719        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i16, pu16Fsw, pr80Value1, pi16Val2);
    10721         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10720        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1072210721    } IEM_MC_ELSE() {
    10723         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10722        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1072410723    } IEM_MC_ENDIF();
    1072510724    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1081810817    IEM_MC_FPU_STACK_FREE(IEM_GET_MODRM_RM_8(bRm));
    1081910818    IEM_MC_FPU_STACK_INC_TOP();
    10820     IEM_MC_UPDATE_FPU_OPCODE_IP();
     10819    IEM_MC_UPDATE_FPU_OPCODE_IP(pVCpu->iem.s.uFpuOpcode);
    1082110820
    1082210821    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1088410883    IEM_MC_IF_FPUREG_IS_EMPTY(7) {
    1088510884        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_r80_from_i16, pFpuRes, pi16Val);
    10886         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10885        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1088710886    } IEM_MC_ELSE() {
    10888         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     10887        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1088910888    } IEM_MC_ENDIF();
    1089010889    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1091510914        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    1091610915        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
    10917         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10916        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1091810917    } IEM_MC_ELSE() {
    1091910918        IEM_MC_IF_FCW_IM() {
     
    1092110920            IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
    1092210921        } IEM_MC_ENDIF();
    10923         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10922        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1092410923    } IEM_MC_ENDIF();
    1092510924    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1095010949        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    1095110950        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
    10952         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10951        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1095310952    } IEM_MC_ELSE() {
    1095410953        IEM_MC_IF_FCW_IM() {
     
    1095610955            IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
    1095710956        } IEM_MC_ENDIF();
    10958         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10957        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1095910958    } IEM_MC_ENDIF();
    1096010959    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1098510984        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    1098610985        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
    10987         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10986        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1098810987    } IEM_MC_ELSE() {
    1098910988        IEM_MC_IF_FCW_IM() {
     
    1099110990            IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
    1099210991        } IEM_MC_ENDIF();
    10993         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10992        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1099410993    } IEM_MC_ENDIF();
    1099510994    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1102111020    IEM_MC_IF_FPUREG_IS_EMPTY(7) {
    1102211021        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r80_from_d80, pFpuRes, pd80Val);
    11023         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     11022        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1102411023    } IEM_MC_ELSE() {
    11025         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     11024        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1102611025    } IEM_MC_ENDIF();
    1102711026    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1105311052    IEM_MC_IF_FPUREG_IS_EMPTY(7) {
    1105411053        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_r80_from_i64, pFpuRes, pi64Val);
    11055         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     11054        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1105611055    } IEM_MC_ELSE() {
    11057         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     11056        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, pVCpu->iem.s.uFpuOpcode);
    1105811057    } IEM_MC_ENDIF();
    1105911058    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1108411083        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_d80, pu16Fsw, pd80Dst, pr80Value);
    1108511084        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pd80Dst, IEM_ACCESS_DATA_W, u16Fsw);
    11086         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     11085        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1108711086    } IEM_MC_ELSE() {
    1108811087        IEM_MC_IF_FCW_IM() {
     
    1109011089            IEM_MC_MEM_COMMIT_AND_UNMAP(pd80Dst, IEM_ACCESS_DATA_W);
    1109111090        } IEM_MC_ENDIF();
    11092         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     11091        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1109311092    } IEM_MC_ENDIF();
    1109411093    IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    1111911118        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i64, pu16Fsw, pi64Dst, pr80Value);
    1112011119        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw);
    11121         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     11120        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1112211121    } IEM_MC_ELSE() {
    1112311122        IEM_MC_IF_FCW_IM() {
     
    1112511124            IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W);
    1112611125        } IEM_MC_ENDIF();
    11127         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     11126        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1112811127    } IEM_MC_ENDIF();
    1112911128    IEM_MC_ADVANCE_RIP_AND_FINISH();
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