VirtualBox

Changeset 104129 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 2, 2024 12:37:36 PM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162550
Message:

VMM/IEM: Rework MXCSR handling for SSE instructions, bugref:10641

The old approach by referencing the X86FXSTATE and accessing the MXCSR value there
prevents us from keeping the MXCSR shadowed in a host register for SIMD guest code
causing unecessary memory accesses. It also prevents avoiding skipping dirty guest registers
because the instruction helpers would have access the to CPUMCTX structure.

The new approach passes the guest MXCSR as the first argument of the helper callback and
the helper returns the MXCSR with the new exception flags being set as a return value.
With this the helpers only work on arguments supplied and don't access anything in CPUMCTX
directly which allows the recompiler to avoid flushing pending register writes unless they get
used.

As a bonus this also gets rid of the IEMSSERESULT struct which was required because the helpers
are restricted to 4 arguments due to restrictions on x86 for the assembly helpers in IEMAllAImpl.asm

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

Legend:

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

    r103951 r104129  
    54835483}
    54845484
    5485 /** @}  */
    5486 
    5487 
    5488 /** @name   SSE+AVX SIMD access and helpers.
    5489  *
    5490  * @{
    5491  */
    5492 /**
    5493  * Stores a result in a SIMD XMM register, updates the MXCSR.
    5494  *
    5495  * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    5496  * @param   pResult             The result to store.
    5497  * @param   iXmmReg             Which SIMD XMM register to store the result in.
    5498  */
    5499 void iemSseStoreResult(PVMCPUCC pVCpu, PCIEMSSERESULT pResult, uint8_t iXmmReg) RT_NOEXCEPT
    5500 {
    5501     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5502     pFpuCtx->MXCSR |= pResult->MXCSR & X86_MXCSR_XCPT_FLAGS;
    5503 
    5504     /* The result is only updated if there is no unmasked exception pending. */
    5505     if ((  ~((pFpuCtx->MXCSR & X86_MXCSR_XCPT_MASK) >> X86_MXCSR_XCPT_MASK_SHIFT)
    5506          & (pFpuCtx->MXCSR & X86_MXCSR_XCPT_FLAGS)) == 0)
    5507         pVCpu->cpum.GstCtx.XState.x87.aXMM[iXmmReg] = pResult->uResult;
    5508 }
    5509 
    5510 
    5511 /**
    5512  * Updates the MXCSR.
    5513  *
    5514  * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    5515  * @param   fMxcsr              The new MXCSR value.
    5516  */
    5517 void iemSseUpdateMxcsr(PVMCPUCC pVCpu, uint32_t fMxcsr) RT_NOEXCEPT
    5518 {
    5519     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    5520     pFpuCtx->MXCSR |= fMxcsr & X86_MXCSR_XCPT_FLAGS;
    5521 }
    55225485/** @}  */
    55235486
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r104128 r104129  
    55
    66;
    7 ; Copyright (C) 2011-2023 Oracle and/or its affiliates.
     7; Copyright (C) 2011-2024 Oracle and/or its affiliates.
    88;
    99; This file is part of VirtualBox base platform packages, as
     
    184184 %define T2_16      r10w
    185185 %define T2_8       r10b
     186
     187 ;
     188 ; Return value, same as T0 but to make it more obvious
     189 ; that this is a return value.
     190 ;
     191 %define R0         rax
     192 %define R0_32      eax
     193 %define R0_16      ax
     194 %define R0_8       al
    186195
    187196%else
     
    48104819; Need to move this as well somewhere better?
    48114820;
    4812 struc IEMSSERESULT
    4813     .uResult      resd 4
    4814     .MXCSR        resd 1
    4815 endstruc
    4816 
    4817 
    4818 ;;
    4819 ; Need to move this as well somewhere better?
    4820 ;
    48214821struc IEMAVX128RESULT
    48224822    .uResult      resd 4
     
    48364836;;
    48374837; Initialize the SSE MXCSR register using the guest value partially to
    4838 ; account for rounding mode.
     4838; account for rounding mode, load the value from the given register.
    48394839;
    48404840; @uses     4 bytes of stack to save the original value, T0.
    4841 ; @param    1       Expression giving the address of the FXSTATE of the guest.
    4842 ;
    4843 %macro SSE_LD_FXSTATE_MXCSR 1
     4841; @param    1       Expression giving the register holding the guest's MXCSR.
     4842;
     4843%macro SSE_LD_MXCSR 1
    48444844        sub     xSP, 4
    48454845
    48464846        stmxcsr [xSP]
    4847         mov     T0_32, [%1 + X86FXSTATE.MXCSR]
     4847        mov     T0_32, %1
    48484848        and     T0_32, X86_MXCSR_FZ | X86_MXCSR_RC_MASK | X86_MXCSR_DAZ
    48494849        or      T0_32, X86_MXCSR_XCPT_MASK
     
    48594859;
    48604860; @uses     4 bytes of stack to save the content of MXCSR value, T0, T1.
    4861 ; @param    1       Expression giving the address where to return the MXCSR value.
    4862 ; @param    2       Expression giving the address of the FXSTATE of the guest.
     4861; @param    1       Expression giving the register to return the new guest's MXCSR value.
     4862; @param    2       Expression giving the register holding original guest's MXCSR value.
    48634863;
    48644864; @note Restores the stack pointer.
    48654865;
    4866 %macro SSE_ST_FXSTATE_MXCSR 2
     4866%macro SSE_ST_MXCSR 2
    48674867        sub     xSP, 4
    48684868        stmxcsr [xSP]
    4869         mov     T0_32, [xSP]
     4869        mov     %1, [xSP]
    48704870        add     xSP, 4
    48714871        ; Merge the status bits into the original MXCSR value.
    4872         mov     T1_32, [%2 + X86FXSTATE.MXCSR]
    4873         and     T0_32, X86_MXCSR_XCPT_FLAGS
    4874         or      T0_32, T1_32
    4875         mov     [%1 + IEMSSERESULT.MXCSR], T0_32
     4872        and     %1, X86_MXCSR_XCPT_FLAGS
     4873        or      %1, %2
    48764874
    48774875        ldmxcsr [xSP]
     
    49364934; @param    2       Flag whether the AVX variant of the instruction takes two or three operands, 0 to disable AVX variants
    49374935;
    4938 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    4939 ; @param    A1      Where to return the result including the MXCSR value.
     4936; @returns  R0_32   The new MXCSR value of the guest.
     4937; @param    A0      The guest's MXCSR register value to use.
     4938; @param    A1      Where to return the result.
    49404939; @param    A2      Pointer to the first media register size operand (input/output).
    49414940; @param    A3      Pointer to the second media register size operand (input).
     
    49454944        PROLOGUE_4_ARGS
    49464945        IEMIMPL_SSE_PROLOGUE
    4947         SSE_LD_FXSTATE_MXCSR A0
     4946        SSE_LD_MXCSR A0_32
    49484947
    49494948        movdqu   xmm0, [A2]
    49504949        movdqu   xmm1, [A3]
    49514950        %1       xmm0, xmm1
    4952         movdqu   [A1 + IEMSSERESULT.uResult], xmm0
    4953 
    4954         SSE_ST_FXSTATE_MXCSR A1, A0
     4951        movdqu   [A1], xmm0
     4952
     4953        SSE_ST_MXCSR R0_32, A0_32
    49554954        IEMIMPL_SSE_PROLOGUE
    49564955        EPILOGUE_4_ARGS
     
    50625061; @param    1       The instruction
    50635062;
    5064 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    5065 ; @param    A1      Where to return the result including the MXCSR value.
     5063; @return   R0_32   The new MXCSR value of the guest.
     5064; @param    A0      The guest's MXCSR register value to use.
     5065; @param    A1      Where to return the result.
    50665066; @param    A2      Pointer to the first media register size operand (input/output).
    50675067; @param    A3      Pointer to the second single precision floating point value (input).
     
    50715071        PROLOGUE_4_ARGS
    50725072        IEMIMPL_SSE_PROLOGUE
    5073         SSE_LD_FXSTATE_MXCSR A0
     5073        SSE_LD_MXCSR A0_32
    50745074
    50755075        movdqu   xmm0, [A2]
    50765076        movd     xmm1, [A3]
    50775077        %1       xmm0, xmm1
    5078         movdqu   [A1 + IEMSSERESULT.uResult], xmm0
    5079 
    5080         SSE_ST_FXSTATE_MXCSR A1, A0
     5078        movdqu   [A1], xmm0
     5079
     5080        SSE_ST_MXCSR R0_32, A0_32
    50815081        IEMIMPL_SSE_EPILOGUE
    50825082        EPILOGUE_4_ARGS
     
    51165116; @param    1       The instruction
    51175117;
    5118 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    5119 ; @param    A1      Where to return the result including the MXCSR value.
     5118; @return   R0_32   The new MXCSR value of the guest.
     5119; @param    A0      The guest's MXCSR register value to use.
     5120; @param    A1      Where to return the result.
    51205121; @param    A2      Pointer to the first media register size operand (input/output).
    51215122; @param    A3      Pointer to the second double precision floating point value (input).
     
    51255126        PROLOGUE_4_ARGS
    51265127        IEMIMPL_SSE_PROLOGUE
    5127         SSE_LD_FXSTATE_MXCSR A0
     5128        SSE_LD_MXCSR A0_32
    51285129
    51295130        movdqu   xmm0, [A2]
    51305131        movq     xmm1, [A3]
    51315132        %1       xmm0, xmm1
    5132         movdqu   [A1 + IEMSSERESULT.uResult], xmm0
    5133 
    5134         SSE_ST_FXSTATE_MXCSR A1, A0
     5133        movdqu   [A1], xmm0
     5134
     5135        SSE_ST_MXCSR R0_32, A0_32
    51355136        IEMIMPL_SSE_EPILOGUE
    51365137        EPILOGUE_4_ARGS
     
    51695170;           2       Whether the AVX256 result is 128-bit (0) or 256-bit (1).
    51705171;
    5171 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    5172 ; @param    A1      Where to return the result including the MXCSR value.
     5172; @return   R0_32   The new MXCSR value of the guest.
     5173; @param    A0_32   The guest's MXCSR register value to use.
     5174; @param    A1      Where to return the result.
    51735175; @param    A2      Pointer to the first media register size operand (input/output).
    51745176; @param    A3      Pointer to the second media register size operand (input).
     
    51785180        PROLOGUE_4_ARGS
    51795181        IEMIMPL_SSE_PROLOGUE
    5180         SSE_LD_FXSTATE_MXCSR A0
     5182        SSE_LD_MXCSR A0_32
    51815183
    51825184        movdqu   xmm0, [A2]
    51835185        movdqu   xmm1, [A3]
    51845186        %1       xmm0, xmm1
    5185         movdqu   [A1 + IEMSSERESULT.uResult], xmm0
    5186 
    5187         SSE_ST_FXSTATE_MXCSR A1, A0
     5187        movdqu   [A1], xmm0
     5188
     5189        SSE_ST_MXCSR R0_32, A0_32
    51885190        IEMIMPL_SSE_EPILOGUE
    51895191        EPILOGUE_4_ARGS
     
    59785980
    59795981;;
    5980 ; Restores the SSE MXCSR register with the original value.
    5981 ;
    5982 ; @uses     4 bytes of stack to save the content of MXCSR value, T0, T1.
    5983 ; @param    1       Expression giving the address where to return the MXCSR value - only the MXCSR is stored, no IEMSSERESULT is used.
    5984 ; @param    2       Expression giving the address of the FXSTATE of the guest.
    5985 ;
    5986 ; @note Restores the stack pointer.
    5987 ;
    5988 %macro SSE_ST_FXSTATE_MXCSR_ONLY 2
    5989         sub     xSP, 4
    5990         stmxcsr [xSP]
    5991         mov     T0_32, [xSP]
    5992         add     xSP, 4
    5993         ; Merge the status bits into the original MXCSR value.
    5994         mov     T1_32, [%2 + X86FXSTATE.MXCSR]
    5995         and     T0_32, X86_MXCSR_XCPT_FLAGS
    5996         or      T0_32, T1_32
    5997         mov     [%1], T0_32
    5998 
    5999         ldmxcsr [xSP]
    6000         add     xSP, 4
    6001 %endmacro
    6002 
    6003 
    6004 ;;
    60055982; cvttsd2si instruction - 32-bit variant.
    60065983;
    6007 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6008 ; @param    A1      Where to return the MXCSR value.
    6009 ; @param    A2      Pointer to the result operand (output).
    6010 ; @param    A3      Pointer to the second operand (input).
     5984; @return   R0_32   The new MXCSR value of the guest.
     5985; @param    A0_32   The guest's MXCSR register value to use.
     5986; @param    A1      Pointer to the result operand (output).
     5987; @param    A2      Pointer to the second operand (input).
    60115988;
    60125989BEGINPROC_FASTCALL iemAImpl_cvttsd2si_i32_r64, 16
    60135990        PROLOGUE_4_ARGS
    60145991        IEMIMPL_SSE_PROLOGUE
    6015         SSE_LD_FXSTATE_MXCSR A0
    6016 
    6017         cvttsd2si T0_32, [A3]
    6018         mov       dword [A2], T0_32
    6019 
    6020         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     5992        SSE_LD_MXCSR A0_32
     5993
     5994        cvttsd2si T0_32, [A2]
     5995        mov       dword [A1], T0_32
     5996
     5997        SSE_ST_MXCSR R0_32, A0_32
    60215998        IEMIMPL_SSE_EPILOGUE
    60225999        EPILOGUE_4_ARGS
     
    60266003; cvttsd2si instruction - 64-bit variant.
    60276004;
    6028 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6029 ; @param    A1      Where to return the MXCSR value.
    6030 ; @param    A2      Pointer to the result operand (output).
    6031 ; @param    A3      Pointer to the second operand (input).
     6005; @return   R0_32   The new MXCSR value of the guest.
     6006; @param    A0_32   The guest's MXCSR register value to use.
     6007; @param    A1      Pointer to the result operand (output).
     6008; @param    A2      Pointer to the second operand (input).
    60326009;
    60336010BEGINPROC_FASTCALL iemAImpl_cvttsd2si_i64_r64, 16
    6034         PROLOGUE_4_ARGS
     6011        PROLOGUE_3_ARGS
    60356012        IEMIMPL_SSE_PROLOGUE
    6036         SSE_LD_FXSTATE_MXCSR A0
    6037 
    6038         cvttsd2si T0, [A3]
    6039         mov       qword [A2], T0
    6040 
    6041         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6013        SSE_LD_MXCSR A0_32
     6014
     6015        cvttsd2si T0, [A2]
     6016        mov       qword [A1], T0
     6017
     6018        SSE_ST_MXCSR R0_32, A0_32
    60426019        IEMIMPL_SSE_EPILOGUE
    6043         EPILOGUE_4_ARGS
     6020        EPILOGUE_3_ARGS
    60446021ENDPROC iemAImpl_cvttsd2si_i64_r64
    60456022
     
    60486025; cvtsd2si instruction - 32-bit variant.
    60496026;
    6050 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6051 ; @param    A1      Where to return the MXCSR value.
    6052 ; @param    A2      Pointer to the result operand (output).
    6053 ; @param    A3      Pointer to the second operand (input).
     6027; @return   R0_32   The new MXCSR value of the guest.
     6028; @param    A0_32   The guest's MXCSR register value to use.
     6029; @param    A1      Pointer to the result operand (output).
     6030; @param    A2      Pointer to the second operand (input).
    60546031;
    60556032BEGINPROC_FASTCALL iemAImpl_cvtsd2si_i32_r64, 16
    6056         PROLOGUE_4_ARGS
     6033        PROLOGUE_3_ARGS
    60576034        IEMIMPL_SSE_PROLOGUE
    6058         SSE_LD_FXSTATE_MXCSR A0
    6059 
    6060         cvtsd2si  T0_32, [A3]
    6061         mov       dword [A2], T0_32
    6062 
    6063         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6035        SSE_LD_MXCSR A0_32
     6036
     6037        cvtsd2si  T0_32, [A2]
     6038        mov       dword [A1], T0_32
     6039
     6040        SSE_ST_MXCSR R0_32, A0_32
    60646041        IEMIMPL_SSE_EPILOGUE
    6065         EPILOGUE_4_ARGS
     6042        EPILOGUE_3_ARGS
    60666043ENDPROC iemAImpl_cvtsd2si_i32_r64
    60676044
     
    60696046; cvtsd2si instruction - 64-bit variant.
    60706047;
    6071 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6072 ; @param    A1      Where to return the MXCSR value.
    6073 ; @param    A2      Pointer to the result operand (output).
    6074 ; @param    A3      Pointer to the second operand (input).
     6048; @return   R0_32   The new MXCSR value of the guest.
     6049; @param    A0_32   The guest's MXCSR register value to use.
     6050; @param    A1      Pointer to the result operand (output).
     6051; @param    A2      Pointer to the second operand (input).
    60756052;
    60766053BEGINPROC_FASTCALL iemAImpl_cvtsd2si_i64_r64, 16
    6077         PROLOGUE_4_ARGS
     6054        PROLOGUE_3_ARGS
    60786055        IEMIMPL_SSE_PROLOGUE
    6079         SSE_LD_FXSTATE_MXCSR A0
    6080 
    6081         cvtsd2si  T0, [A3]
    6082         mov       qword [A2], T0
    6083 
    6084         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6056        SSE_LD_MXCSR A0_32
     6057
     6058        cvtsd2si  T0, [A2]
     6059        mov       qword [A1], T0
     6060
     6061        SSE_ST_MXCSR R0_32, A0_32
    60856062        IEMIMPL_SSE_EPILOGUE
    6086         EPILOGUE_4_ARGS
     6063        EPILOGUE_3_ARGS
    60876064ENDPROC iemAImpl_cvtsd2si_i64_r64
    60886065
     
    60916068; cvttss2si instruction - 32-bit variant.
    60926069;
    6093 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6094 ; @param    A1      Where to return the MXCSR value.
    6095 ; @param    A2      Pointer to the result operand (output).
    6096 ; @param    A3      Pointer to the second operand (input).
     6070; @return   R0_32   The new MXCSR value of the guest.
     6071; @param    A0_32   The guest's MXCSR register value to use.
     6072; @param    A1      Pointer to the result operand (output).
     6073; @param    A2      Pointer to the second operand (input).
    60976074;
    60986075BEGINPROC_FASTCALL iemAImpl_cvttss2si_i32_r32, 16
    6099         PROLOGUE_4_ARGS
     6076        PROLOGUE_3_ARGS
    61006077        IEMIMPL_SSE_PROLOGUE
    6101         SSE_LD_FXSTATE_MXCSR A0
    6102 
    6103         cvttss2si T0_32, [A3]
    6104         mov       dword [A2], T0_32
    6105 
    6106         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6078        SSE_LD_MXCSR A0_32
     6079
     6080        cvttss2si T0_32, [A2]
     6081        mov       dword [A1], T0_32
     6082
     6083        SSE_ST_MXCSR R0_32, A0_32
    61076084        IEMIMPL_SSE_EPILOGUE
    6108         EPILOGUE_4_ARGS
     6085        EPILOGUE_3_ARGS
    61096086ENDPROC iemAImpl_cvttss2si_i32_r32
    61106087
     
    61126089; cvttss2si instruction - 64-bit variant.
    61136090;
    6114 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6115 ; @param    A1      Where to return the MXCSR value.
    6116 ; @param    A2      Pointer to the result operand (output).
    6117 ; @param    A3      Pointer to the second operand (input).
     6091; @return   R0_32   The new MXCSR value of the guest.
     6092; @param    A0_32   The guest's MXCSR register value to use.
     6093; @param    A1      Pointer to the result operand (output).
     6094; @param    A2      Pointer to the second operand (input).
    61186095;
    61196096BEGINPROC_FASTCALL iemAImpl_cvttss2si_i64_r32, 16
    6120         PROLOGUE_4_ARGS
     6097        PROLOGUE_3_ARGS
    61216098        IEMIMPL_SSE_PROLOGUE
    6122         SSE_LD_FXSTATE_MXCSR A0
    6123 
    6124         cvttss2si T0, [A3]
    6125         mov       qword [A2], T0
    6126 
    6127         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6099        SSE_LD_MXCSR A0_32
     6100
     6101        cvttss2si T0, [A2]
     6102        mov       qword [A1], T0
     6103
     6104        SSE_ST_MXCSR R0_32, A0_32
    61286105        IEMIMPL_SSE_EPILOGUE
    6129         EPILOGUE_4_ARGS
     6106        EPILOGUE_3_ARGS
    61306107ENDPROC iemAImpl_cvttss2si_i64_r32
    61316108
     
    61346111; cvtss2si instruction - 32-bit variant.
    61356112;
    6136 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6137 ; @param    A1      Where to return the MXCSR value.
    6138 ; @param    A2      Pointer to the result operand (output).
    6139 ; @param    A3      Pointer to the second operand (input).
     6113; @return   R0_32   The new MXCSR value of the guest.
     6114; @param    A0_32   The guest's MXCSR register value to use.
     6115; @param    A1      Pointer to the result operand (output).
     6116; @param    A2      Pointer to the second operand (input).
    61406117;
    61416118BEGINPROC_FASTCALL iemAImpl_cvtss2si_i32_r32, 16
    6142         PROLOGUE_4_ARGS
     6119        PROLOGUE_3_ARGS
    61436120        IEMIMPL_SSE_PROLOGUE
    6144         SSE_LD_FXSTATE_MXCSR A0
    6145 
    6146         cvtss2si  T0_32, [A3]
    6147         mov       dword [A2], T0_32
    6148 
    6149         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6121        SSE_LD_MXCSR A0_32
     6122
     6123        cvtss2si  T0_32, [A2]
     6124        mov       dword [A1], T0_32
     6125
     6126        SSE_ST_MXCSR R0_32, A0_32
    61506127        IEMIMPL_SSE_EPILOGUE
    6151         EPILOGUE_4_ARGS
     6128        EPILOGUE_3_ARGS
    61526129ENDPROC iemAImpl_cvtss2si_i32_r32
    61536130
     
    61556132; cvtss2si instruction - 64-bit variant.
    61566133;
    6157 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6158 ; @param    A1      Where to return the MXCSR value.
    6159 ; @param    A2      Pointer to the result operand (output).
    6160 ; @param    A3      Pointer to the second operand (input).
     6134; @return   R0_32   The new MXCSR value of the guest.
     6135; @param    A0_32   The guest's MXCSR register value to use.
     6136; @param    A1      Pointer to the result operand (output).
     6137; @param    A2      Pointer to the second operand (input).
    61616138;
    61626139BEGINPROC_FASTCALL iemAImpl_cvtss2si_i64_r32, 16
    6163         PROLOGUE_4_ARGS
     6140        PROLOGUE_3_ARGS
    61646141        IEMIMPL_SSE_PROLOGUE
    6165         SSE_LD_FXSTATE_MXCSR A0
    6166 
    6167         cvtss2si  T0, [A3]
    6168         mov       qword [A2], T0
    6169 
    6170         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6142        SSE_LD_MXCSR A0_32
     6143
     6144        cvtss2si  T0, [A2]
     6145        mov       qword [A1], T0
     6146
     6147        SSE_ST_MXCSR R0_32, A0_32
    61716148        IEMIMPL_SSE_EPILOGUE
    6172         EPILOGUE_4_ARGS
     6149        EPILOGUE_3_ARGS
    61736150ENDPROC iemAImpl_cvtss2si_i64_r32
    61746151
     
    61776154; cvtsi2ss instruction - 32-bit variant.
    61786155;
    6179 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6180 ; @param    A1      Where to return the MXCSR value.
    6181 ; @param    A2      Pointer to the result operand (output).
    6182 ; @param    A3      Pointer to the second operand (input).
     6156; @return   R0_32   The new MXCSR value of the guest.
     6157; @param    A0_32   The guest's MXCSR register value to use.
     6158; @param    A1      Pointer to the result operand (output).
     6159; @param    A2      Pointer to the second operand (input).
    61836160;
    61846161BEGINPROC_FASTCALL iemAImpl_cvtsi2ss_r32_i32, 16
    6185         PROLOGUE_4_ARGS
     6162        PROLOGUE_3_ARGS
    61866163        IEMIMPL_SSE_PROLOGUE
    6187         SSE_LD_FXSTATE_MXCSR A0
    6188 
    6189         cvtsi2ss  xmm0, dword [A3]
    6190         movd      dword [A2], xmm0
    6191 
    6192         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6164        SSE_LD_MXCSR A0_32
     6165
     6166        cvtsi2ss  xmm0, dword [A2]
     6167        movd      dword [A1], xmm0
     6168
     6169        SSE_ST_MXCSR R0_32, A0_32
    61936170        IEMIMPL_SSE_EPILOGUE
    6194         EPILOGUE_4_ARGS
     6171        EPILOGUE_3_ARGS
    61956172ENDPROC iemAImpl_cvtsi2ss_r32_i32
    61966173
     
    61986175; cvtsi2ss instruction - 64-bit variant.
    61996176;
    6200 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6201 ; @param    A1      Where to return the MXCSR value.
    6202 ; @param    A2      Pointer to the result operand (output).
    6203 ; @param    A3      Pointer to the second operand (input).
     6177; @return   R0_32   The new MXCSR value of the guest.
     6178; @param    A0_32   The guest's MXCSR register value to use.
     6179; @param    A1      Pointer to the result operand (output).
     6180; @param    A2      Pointer to the second operand (input).
    62046181;
    62056182BEGINPROC_FASTCALL iemAImpl_cvtsi2ss_r32_i64, 16
    6206         PROLOGUE_4_ARGS
     6183        PROLOGUE_3_ARGS
    62076184        IEMIMPL_SSE_PROLOGUE
    6208         SSE_LD_FXSTATE_MXCSR A0
    6209 
    6210         cvtsi2ss  xmm0, qword [A3]
    6211         movd      dword [A2], xmm0
    6212 
    6213         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6185        SSE_LD_MXCSR A0_32
     6186
     6187        cvtsi2ss  xmm0, qword [A2]
     6188        movd      dword [A1], xmm0
     6189
     6190        SSE_ST_MXCSR R0_32, A0_32
    62146191        IEMIMPL_SSE_EPILOGUE
    6215         EPILOGUE_4_ARGS
     6192        EPILOGUE_3_ARGS
    62166193ENDPROC iemAImpl_cvtsi2ss_r32_i64
    62176194
     
    62206197; cvtsi2sd instruction - 32-bit variant.
    62216198;
    6222 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6223 ; @param    A1      Where to return the MXCSR value.
    6224 ; @param    A2      Pointer to the result operand (output).
    6225 ; @param    A3      Pointer to the second operand (input).
     6199; @return   R0_32   The new MXCSR value of the guest.
     6200; @param    A0_32   The guest's MXCSR register value to use.
     6201; @param    A1      Pointer to the result operand (output).
     6202; @param    A2      Pointer to the second operand (input).
    62266203;
    62276204BEGINPROC_FASTCALL iemAImpl_cvtsi2sd_r64_i32, 16
    6228         PROLOGUE_4_ARGS
     6205        PROLOGUE_3_ARGS
    62296206        IEMIMPL_SSE_PROLOGUE
    6230         SSE_LD_FXSTATE_MXCSR A0
    6231 
    6232         cvtsi2sd  xmm0, dword [A3]
    6233         movq      [A2], xmm0
    6234 
    6235         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6207        SSE_LD_MXCSR A0_32
     6208
     6209        cvtsi2sd  xmm0, dword [A2]
     6210        movq      [A1], xmm0
     6211
     6212        SSE_ST_MXCSR R0_32, A0_32
    62366213        IEMIMPL_SSE_EPILOGUE
    6237         EPILOGUE_4_ARGS
     6214        EPILOGUE_3_ARGS
    62386215ENDPROC iemAImpl_cvtsi2sd_r64_i32
    62396216
     
    62416218; cvtsi2sd instruction - 64-bit variant.
    62426219;
    6243 ; @param    A0      FPU context (FXSTATE or XSAVEAREA).
    6244 ; @param    A1      Where to return the MXCSR value.
    6245 ; @param    A2      Pointer to the result operand (output).
    6246 ; @param    A3      Pointer to the second operand (input).
     6220; @return   R0_32   The new MXCSR value of the guest.
     6221; @param    A0_32   The guest's MXCSR register value to use.
     6222; @param    A1      Pointer to the result operand (output).
     6223; @param    A2      Pointer to the second operand (input).
    62476224;
    62486225BEGINPROC_FASTCALL iemAImpl_cvtsi2sd_r64_i64, 16
    6249         PROLOGUE_4_ARGS
     6226        PROLOGUE_3_ARGS
    62506227        IEMIMPL_SSE_PROLOGUE
    6251         SSE_LD_FXSTATE_MXCSR A0
    6252 
    6253         cvtsi2sd  xmm0, qword [A3]
    6254         movq      [A2], xmm0
    6255 
    6256         SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     6228        SSE_LD_MXCSR A0_32
     6229
     6230        cvtsi2sd  xmm0, qword [A2]
     6231        movq      [A1], xmm0
     6232
     6233        SSE_ST_MXCSR R0_32, A0_32
    62576234        IEMIMPL_SSE_EPILOGUE
    6258         EPILOGUE_4_ARGS
     6235        EPILOGUE_3_ARGS
    62596236ENDPROC iemAImpl_cvtsi2sd_r64_i64
     6237
     6238
     6239;
     6240; UCOMISS (SSE)
     6241;
     6242; @return   R0_32   The new MXCSR value of the guest.
     6243; @param    A0_32   The guest's MXCSR register value to use (input).
     6244; @param    A1      Pointer to the EFLAGS value (input/output).
     6245; @param    A2      Pointer to the first source operand (aka readonly destination).
     6246; @param    A3      Pointer to the second source operand.
     6247;
     6248BEGINPROC_FASTCALL  iemAImpl_ucomiss_u128, 16
     6249        PROLOGUE_4_ARGS
     6250        IEMIMPL_SSE_PROLOGUE
     6251        SSE_LD_MXCSR A0_32
     6252
     6253        movdqu  xmm0, [A2]
     6254        movdqu  xmm1, [A3]
     6255        ucomiss xmm0, xmm1
     6256        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6257
     6258        SSE_ST_MXCSR R0_32, A0_32
     6259        IEMIMPL_SSE_EPILOGUE
     6260        EPILOGUE_4_ARGS
     6261ENDPROC             iemAImpl_ucomiss_u128
     6262
     6263BEGINPROC_FASTCALL  iemAImpl_vucomiss_u128, 16
     6264        PROLOGUE_4_ARGS
     6265        IEMIMPL_SSE_PROLOGUE
     6266        SSE_LD_MXCSR A0_32
     6267
     6268        movdqu  xmm0, [A2]
     6269        movdqu  xmm1, [A3]
     6270        vucomiss xmm0, xmm1
     6271        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6272
     6273        SSE_ST_MXCSR R0_32, A0_32
     6274        IEMIMPL_SSE_EPILOGUE
     6275        EPILOGUE_3_ARGS
     6276ENDPROC             iemAImpl_vucomiss_u128
     6277
     6278
     6279;
     6280; UCOMISD (SSE)
     6281;
     6282; @return   R0_32   The new MXCSR value of the guest.
     6283; @param    A0_32   The guest's MXCSR register value to use (input).
     6284; @param    A1      Pointer to the EFLAGS value (input/output).
     6285; @param    A2      Pointer to the first source operand (aka readonly destination).
     6286; @param    A3      Pointer to the second source operand.
     6287;
     6288BEGINPROC_FASTCALL  iemAImpl_ucomisd_u128, 16
     6289        PROLOGUE_4_ARGS
     6290        IEMIMPL_SSE_PROLOGUE
     6291        SSE_LD_MXCSR A0_32
     6292
     6293        movdqu  xmm0, [A2]
     6294        movdqu  xmm1, [A3]
     6295        ucomisd xmm0, xmm1
     6296        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6297
     6298        SSE_ST_MXCSR R0_32, A0_32
     6299        IEMIMPL_SSE_EPILOGUE
     6300        EPILOGUE_4_ARGS
     6301ENDPROC             iemAImpl_ucomisd_u128
     6302
     6303BEGINPROC_FASTCALL  iemAImpl_vucomisd_u128, 16
     6304        PROLOGUE_4_ARGS
     6305        IEMIMPL_SSE_PROLOGUE
     6306        SSE_LD_MXCSR A0_32
     6307
     6308        movdqu  xmm0, [A2]
     6309        movdqu  xmm1, [A3]
     6310        vucomisd xmm0, xmm1
     6311        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6312
     6313        SSE_ST_MXCSR R0_32, A0_32
     6314        IEMIMPL_SSE_EPILOGUE
     6315        EPILOGUE_4_ARGS
     6316ENDPROC             iemAImpl_vucomisd_u128
     6317
     6318;
     6319; COMISS (SSE)
     6320;
     6321; @return   R0_32   The new MXCSR value of the guest.
     6322; @param    A0_32   The guest's MXCSR register value to use (input).
     6323; @param    A1      Pointer to the EFLAGS value (input/output).
     6324; @param    A2      Pointer to the first source operand (aka readonly destination).
     6325; @param    A3      Pointer to the second source operand.
     6326;
     6327BEGINPROC_FASTCALL  iemAImpl_comiss_u128, 16
     6328        PROLOGUE_4_ARGS
     6329        IEMIMPL_SSE_PROLOGUE
     6330        SSE_LD_MXCSR A0_32
     6331
     6332        movdqu  xmm0, [A2]
     6333        movdqu  xmm1, [A3]
     6334        comiss xmm0, xmm1
     6335        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6336
     6337        SSE_ST_MXCSR R0_32, A0_32
     6338        IEMIMPL_SSE_EPILOGUE
     6339        EPILOGUE_4_ARGS
     6340ENDPROC             iemAImpl_comiss_u128
     6341
     6342BEGINPROC_FASTCALL  iemAImpl_vcomiss_u128, 16
     6343        PROLOGUE_4_ARGS
     6344        IEMIMPL_SSE_PROLOGUE
     6345        SSE_LD_MXCSR A0_32
     6346
     6347        movdqu  xmm0, [A2]
     6348        movdqu  xmm1, [A3]
     6349        vcomiss xmm0, xmm1
     6350        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6351
     6352        SSE_ST_MXCSR R0_32, A0_32
     6353        IEMIMPL_SSE_EPILOGUE
     6354        EPILOGUE_4_ARGS
     6355ENDPROC             iemAImpl_vcomiss_u128
     6356
     6357
     6358;
     6359; COMISD (SSE)
     6360;
     6361; @return   R0_32   The new MXCSR value of the guest.
     6362; @param    A0_32   The guest's MXCSR register value to use (input).
     6363; @param    A1      Pointer to the EFLAGS value (input/output).
     6364; @param    A2      Pointer to the first source operand (aka readonly destination).
     6365; @param    A3      Pointer to the second source operand.
     6366;
     6367BEGINPROC_FASTCALL  iemAImpl_comisd_u128, 16
     6368        PROLOGUE_4_ARGS
     6369        IEMIMPL_SSE_PROLOGUE
     6370        SSE_LD_MXCSR A0_32
     6371
     6372        movdqu  xmm0, [A2]
     6373        movdqu  xmm1, [A3]
     6374        comisd xmm0, xmm1
     6375        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6376
     6377        SSE_ST_MXCSR R0_32, A0_32
     6378        IEMIMPL_SSE_EPILOGUE
     6379        EPILOGUE_4_ARGS
     6380ENDPROC             iemAImpl_comisd_u128
     6381
     6382BEGINPROC_FASTCALL  iemAImpl_vcomisd_u128, 16
     6383        PROLOGUE_4_ARGS
     6384        IEMIMPL_SSE_PROLOGUE
     6385        SSE_LD_MXCSR A0_32
     6386
     6387        movdqu  xmm0, [A2]
     6388        movdqu  xmm1, [A3]
     6389        vcomisd xmm0, xmm1
     6390        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
     6391
     6392        SSE_ST_MXCSR R0_32, A0_32
     6393        IEMIMPL_SSE_EPILOGUE
     6394        EPILOGUE_4_ARGS
     6395ENDPROC             iemAImpl_vcomisd_u128
    62606396
    62616397
     
    63036439        add     xSP, 4
    63046440%endmacro
    6305 
    6306 
    6307 ;
    6308 ; UCOMISS (SSE)
    6309 ;
    6310 ; @param    A0      Pointer to the MXCSR value (input/output).
    6311 ; @param    A1      Pointer to the EFLAGS value (input/output).
    6312 ; @param    A2      Pointer to the first source operand (aka readonly destination).
    6313 ; @param    A3      Pointer to the second source operand.
    6314 ;
    6315 BEGINPROC_FASTCALL  iemAImpl_ucomiss_u128, 16
    6316         PROLOGUE_4_ARGS
    6317         IEMIMPL_SSE_PROLOGUE
    6318         SSE_LD_FXSTATE_MXCSR_ONLY A0
    6319 
    6320         movdqu  xmm0, [A2]
    6321         movdqu  xmm1, [A3]
    6322         ucomiss xmm0, xmm1
    6323         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    6324 
    6325         SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
    6326         IEMIMPL_SSE_EPILOGUE
    6327         EPILOGUE_4_ARGS
    6328 ENDPROC             iemAImpl_ucomiss_u128
    6329 
    6330 BEGINPROC_FASTCALL  iemAImpl_vucomiss_u128, 16
    6331         PROLOGUE_4_ARGS
    6332         IEMIMPL_SSE_PROLOGUE
    6333         SSE_LD_FXSTATE_MXCSR_ONLY A0
    6334 
    6335         movdqu  xmm0, [A2]
    6336         movdqu  xmm1, [A3]
    6337         vucomiss xmm0, xmm1
    6338         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    6339 
    6340         SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
    6341         IEMIMPL_SSE_EPILOGUE
    6342         EPILOGUE_4_ARGS
    6343 ENDPROC             iemAImpl_vucomiss_u128
    6344 
    6345 
    6346 ;
    6347 ; UCOMISD (SSE)
    6348 ;
    6349 ; @param    A0      Pointer to the MXCSR value (input/output).
    6350 ; @param    A1      Pointer to the EFLAGS value (input/output).
    6351 ; @param    A2      Pointer to the first source operand (aka readonly destination).
    6352 ; @param    A3      Pointer to the second source operand.
    6353 ;
    6354 BEGINPROC_FASTCALL  iemAImpl_ucomisd_u128, 16
    6355         PROLOGUE_4_ARGS
    6356         IEMIMPL_SSE_PROLOGUE
    6357         SSE_LD_FXSTATE_MXCSR_ONLY A0
    6358 
    6359         movdqu  xmm0, [A2]
    6360         movdqu  xmm1, [A3]
    6361         ucomisd xmm0, xmm1
    6362         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    6363 
    6364         SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
    6365         IEMIMPL_SSE_EPILOGUE
    6366         EPILOGUE_4_ARGS
    6367 ENDPROC             iemAImpl_ucomisd_u128
    6368 
    6369 BEGINPROC_FASTCALL  iemAImpl_vucomisd_u128, 16
    6370         PROLOGUE_4_ARGS
    6371         IEMIMPL_SSE_PROLOGUE
    6372         SSE_LD_FXSTATE_MXCSR_ONLY A0
    6373 
    6374         movdqu  xmm0, [A2]
    6375         movdqu  xmm1, [A3]
    6376         vucomisd xmm0, xmm1
    6377         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    6378 
    6379         SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
    6380         IEMIMPL_SSE_EPILOGUE
    6381         EPILOGUE_4_ARGS
    6382 ENDPROC             iemAImpl_vucomisd_u128
    6383 
    6384 ;
    6385 ; COMISS (SSE)
    6386 ;
    6387 ; @param    A0      Pointer to the MXCSR value (input/output).
    6388 ; @param    A1      Pointer to the EFLAGS value (input/output).
    6389 ; @param    A2      Pointer to the first source operand (aka readonly destination).
    6390 ; @param    A3      Pointer to the second source operand.
    6391 ;
    6392 BEGINPROC_FASTCALL  iemAImpl_comiss_u128, 16
    6393         PROLOGUE_4_ARGS
    6394         IEMIMPL_SSE_PROLOGUE
    6395         SSE_LD_FXSTATE_MXCSR_ONLY A0
    6396 
    6397         movdqu  xmm0, [A2]
    6398         movdqu  xmm1, [A3]
    6399         comiss xmm0, xmm1
    6400         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    6401 
    6402         SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
    6403         IEMIMPL_SSE_EPILOGUE
    6404         EPILOGUE_4_ARGS
    6405 ENDPROC             iemAImpl_comiss_u128
    6406 
    6407 BEGINPROC_FASTCALL  iemAImpl_vcomiss_u128, 16
    6408         PROLOGUE_4_ARGS
    6409         IEMIMPL_SSE_PROLOGUE
    6410         SSE_LD_FXSTATE_MXCSR_ONLY A0
    6411 
    6412         movdqu  xmm0, [A2]
    6413         movdqu  xmm1, [A3]
    6414         vcomiss xmm0, xmm1
    6415         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    6416 
    6417         SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
    6418         IEMIMPL_SSE_EPILOGUE
    6419         EPILOGUE_4_ARGS
    6420 ENDPROC             iemAImpl_vcomiss_u128
    6421 
    6422 
    6423 ;
    6424 ; COMISD (SSE)
    6425 ;
    6426 ; @param    A0      Pointer to the MXCSR value (input/output).
    6427 ; @param    A1      Pointer to the EFLAGS value (input/output).
    6428 ; @param    A2      Pointer to the first source operand (aka readonly destination).
    6429 ; @param    A3      Pointer to the second source operand.
    6430 ;
    6431 BEGINPROC_FASTCALL  iemAImpl_comisd_u128, 16
    6432         PROLOGUE_4_ARGS
    6433         IEMIMPL_SSE_PROLOGUE
    6434         SSE_LD_FXSTATE_MXCSR_ONLY A0
    6435 
    6436         movdqu  xmm0, [A2]
    6437         movdqu  xmm1, [A3]
    6438         comisd xmm0, xmm1
    6439         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    6440 
    6441         SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
    6442         IEMIMPL_SSE_EPILOGUE
    6443         EPILOGUE_4_ARGS
    6444 ENDPROC             iemAImpl_comisd_u128
    6445 
    6446 BEGINPROC_FASTCALL  iemAImpl_vcomisd_u128, 16
    6447         PROLOGUE_4_ARGS
    6448         IEMIMPL_SSE_PROLOGUE
    6449         SSE_LD_FXSTATE_MXCSR_ONLY A0
    6450 
    6451         movdqu  xmm0, [A2]
    6452         movdqu  xmm1, [A3]
    6453         vcomisd xmm0, xmm1
    6454         IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    6455 
    6456         SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
    6457         IEMIMPL_SSE_EPILOGUE
    6458         EPILOGUE_4_ARGS
    6459 ENDPROC             iemAImpl_vcomisd_u128
    64606441
    64616442
     
    68466827IEMIMPL_ADX_32 adox, X86_EFL_OF
    68476828IEMIMPL_ADX_64 adox, X86_EFL_OF
     6829
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r104103 r104129  
    55
    66/*
    7  * Copyright (C) 2011-2023 Oracle and/or its affiliates.
     7 * Copyright (C) 2011-2024 Oracle and/or its affiliates.
    88 *
    99 * This file is part of VirtualBox base platform packages, as
     
    1582815828
    1582915829
    15830 IEM_DECL_IMPL_DEF(void, iemAImpl_addps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    15831 {
    15832     pResult->MXCSR  = iemAImpl_addps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc2->ar32[0]);
    15833     pResult->MXCSR |= iemAImpl_addps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[1], &puSrc2->ar32[1]);
    15834     pResult->MXCSR |= iemAImpl_addps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc2->ar32[2]);
    15835     pResult->MXCSR |= iemAImpl_addps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     15830IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_addps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     15831{
     15832    return   iemAImpl_addps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     15833           | iemAImpl_addps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     15834           | iemAImpl_addps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     15835           | iemAImpl_addps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
    1583615836}
    1583715837#endif
     
    1584215842 */
    1584315843#ifdef IEM_WITHOUT_ASSEMBLY
    15844 IEM_DECL_IMPL_DEF(void, iemAImpl_addss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    15845 {
    15846     pResult->MXCSR = iemAImpl_addps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], pr32Src2);
    15847     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    15848     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    15849     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     15844IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_addss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     15845{
     15846    pResult->ar32[1] = puSrc1->ar32[1];
     15847    pResult->ar32[2] = puSrc1->ar32[2];
     15848    pResult->ar32[3] = puSrc1->ar32[3];
     15849    return iemAImpl_addps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], pr32Src2);
    1585015850}
    1585115851#endif
     
    1587015870
    1587115871
    15872 IEM_DECL_IMPL_DEF(void, iemAImpl_addpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    15873 {
    15874     pResult->MXCSR  = iemAImpl_addpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc2->ar64[0]);
    15875     pResult->MXCSR |= iemAImpl_addpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc1->ar64[1], &puSrc2->ar64[1]);
     15872IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_addpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     15873{
     15874    return   iemAImpl_addpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     15875           | iemAImpl_addpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
    1587615876}
    1587715877#endif
     
    1588215882 */
    1588315883#ifdef IEM_WITHOUT_ASSEMBLY
    15884 IEM_DECL_IMPL_DEF(void, iemAImpl_addsd_u128_r64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
    15885 {
    15886     pResult->MXCSR = iemAImpl_addpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], pr64Src2);
    15887     pResult->uResult.ar64[1] = puSrc1->ar64[1];
     15884IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_addsd_u128_r64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     15885{
     15886    pResult->ar64[1] = puSrc1->ar64[1];
     15887    return iemAImpl_addpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], pr64Src2);
    1588815888}
    1588915889#endif
     
    1590815908
    1590915909
    15910 IEM_DECL_IMPL_DEF(void, iemAImpl_mulps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    15911 {
    15912     pResult->MXCSR  = iemAImpl_mulps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc2->ar32[0]);
    15913     pResult->MXCSR |= iemAImpl_mulps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[1], &puSrc2->ar32[1]);
    15914     pResult->MXCSR |= iemAImpl_mulps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc2->ar32[2]);
    15915     pResult->MXCSR |= iemAImpl_mulps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     15910IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_mulps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     15911{
     15912    return   iemAImpl_mulps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     15913           | iemAImpl_mulps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     15914           | iemAImpl_mulps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     15915           | iemAImpl_mulps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
    1591615916}
    1591715917#endif
     
    1592215922 */
    1592315923#ifdef IEM_WITHOUT_ASSEMBLY
    15924 IEM_DECL_IMPL_DEF(void, iemAImpl_mulss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    15925 {
    15926     pResult->MXCSR = iemAImpl_mulps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], pr32Src2);
    15927     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    15928     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    15929     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     15924IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_mulss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     15925{
     15926    pResult->ar32[1] = puSrc1->ar32[1];
     15927    pResult->ar32[2] = puSrc1->ar32[2];
     15928    pResult->ar32[3] = puSrc1->ar32[3];
     15929    return iemAImpl_mulps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], pr32Src2);
    1593015930}
    1593115931#endif
     
    1595015950
    1595115951
    15952 IEM_DECL_IMPL_DEF(void, iemAImpl_mulpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    15953 {
    15954     pResult->MXCSR  = iemAImpl_mulpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc2->ar64[0]);
    15955     pResult->MXCSR |= iemAImpl_mulpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc1->ar64[1], &puSrc2->ar64[1]);
     15952IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_mulpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     15953{
     15954    return   iemAImpl_mulpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     15955           | iemAImpl_mulpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
    1595615956}
    1595715957#endif
     
    1596215962 */
    1596315963#ifdef IEM_WITHOUT_ASSEMBLY
    15964 IEM_DECL_IMPL_DEF(void, iemAImpl_mulsd_u128_r64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
    15965 {
    15966     pResult->MXCSR = iemAImpl_mulpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], pr64Src2);
    15967     pResult->uResult.ar64[1] = puSrc1->ar64[1];
     15964IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_mulsd_u128_r64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     15965{
     15966    pResult->ar64[1] = puSrc1->ar64[1];
     15967    return iemAImpl_mulpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], pr64Src2);
    1596815968}
    1596915969#endif
     
    1598815988
    1598915989
    15990 IEM_DECL_IMPL_DEF(void, iemAImpl_subps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    15991 {
    15992     pResult->MXCSR  = iemAImpl_subps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc2->ar32[0]);
    15993     pResult->MXCSR |= iemAImpl_subps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[1], &puSrc2->ar32[1]);
    15994     pResult->MXCSR |= iemAImpl_subps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc2->ar32[2]);
    15995     pResult->MXCSR |= iemAImpl_subps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     15990IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_subps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     15991{
     15992    return   iemAImpl_subps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     15993           | iemAImpl_subps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     15994           | iemAImpl_subps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     15995           | iemAImpl_subps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
    1599615996}
    1599715997#endif
     
    1600216002 */
    1600316003#ifdef IEM_WITHOUT_ASSEMBLY
    16004 IEM_DECL_IMPL_DEF(void, iemAImpl_subss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    16005 {
    16006     pResult->MXCSR = iemAImpl_subps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], pr32Src2);
    16007     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    16008     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    16009     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     16004IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_subss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     16005{
     16006    pResult->ar32[1] = puSrc1->ar32[1];
     16007    pResult->ar32[2] = puSrc1->ar32[2];
     16008    pResult->ar32[3] = puSrc1->ar32[3];
     16009    return iemAImpl_subps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], pr32Src2);
    1601016010}
    1601116011#endif
     
    1603016030
    1603116031
    16032 IEM_DECL_IMPL_DEF(void, iemAImpl_subpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16033 {
    16034     pResult->MXCSR  = iemAImpl_subpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc2->ar64[0]);
    16035     pResult->MXCSR |= iemAImpl_subpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc1->ar64[1], &puSrc2->ar64[1]);
     16032IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_subpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16033{
     16034    return   iemAImpl_subpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     16035           | iemAImpl_subpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
    1603616036}
    1603716037#endif
     
    1604216042 */
    1604316043#ifdef IEM_WITHOUT_ASSEMBLY
    16044 IEM_DECL_IMPL_DEF(void, iemAImpl_subsd_u128_r64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
    16045 {
    16046     pResult->MXCSR = iemAImpl_subpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], pr64Src2);
    16047     pResult->uResult.ar64[1] = puSrc1->ar64[1];
     16044IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_subsd_u128_r64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     16045{
     16046    pResult->ar64[1] = puSrc1->ar64[1];
     16047    return iemAImpl_subpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], pr64Src2);
    1604816048}
    1604916049#endif
     
    1608216082
    1608316083
    16084 IEM_DECL_IMPL_DEF(void, iemAImpl_minps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16085 {
    16086     pResult->MXCSR  = iemAImpl_minps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc2->ar32[0]);
    16087     pResult->MXCSR |= iemAImpl_minps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[1], &puSrc2->ar32[1]);
    16088     pResult->MXCSR |= iemAImpl_minps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc2->ar32[2]);
    16089     pResult->MXCSR |= iemAImpl_minps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     16084IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_minps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16085{
     16086    return   iemAImpl_minps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     16087           | iemAImpl_minps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     16088           | iemAImpl_minps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     16089           | iemAImpl_minps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
    1609016090}
    1609116091#endif
     
    1609616096 */
    1609716097#ifdef IEM_WITHOUT_ASSEMBLY
    16098 IEM_DECL_IMPL_DEF(void, iemAImpl_minss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    16099 {
    16100     pResult->MXCSR = iemAImpl_minps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], pr32Src2);
    16101     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    16102     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    16103     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     16098IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_minss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     16099{
     16100    pResult->ar32[1] = puSrc1->ar32[1];
     16101    pResult->ar32[2] = puSrc1->ar32[2];
     16102    pResult->ar32[3] = puSrc1->ar32[3];
     16103    return iemAImpl_minps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], pr32Src2);
    1610416104}
    1610516105#endif
     
    1613816138
    1613916139
    16140 IEM_DECL_IMPL_DEF(void, iemAImpl_minpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16141 {
    16142     pResult->MXCSR  = iemAImpl_minpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc2->ar64[0]);
    16143     pResult->MXCSR |= iemAImpl_minpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc1->ar64[1], &puSrc2->ar64[1]);
     16140IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_minpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16141{
     16142    return   iemAImpl_minpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     16143           | iemAImpl_minpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
    1614416144}
    1614516145#endif
     
    1615016150 */
    1615116151#ifdef IEM_WITHOUT_ASSEMBLY
    16152 IEM_DECL_IMPL_DEF(void, iemAImpl_minsd_u128_r64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
    16153 {
    16154     pResult->MXCSR = iemAImpl_minpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], pr64Src2);
    16155     pResult->uResult.ar64[1] = puSrc1->ar64[1];
     16152IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_minsd_u128_r64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     16153{
     16154    pResult->ar64[1] = puSrc1->ar64[1];
     16155    return iemAImpl_minpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], pr64Src2);
    1615616156}
    1615716157#endif
     
    1619616196
    1619716197
    16198 IEM_DECL_IMPL_DEF(void, iemAImpl_divps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16199 {
    16200     pResult->MXCSR  = iemAImpl_divps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc2->ar32[0]);
    16201     pResult->MXCSR |= iemAImpl_divps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[1], &puSrc2->ar32[1]);
    16202     pResult->MXCSR |= iemAImpl_divps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc2->ar32[2]);
    16203     pResult->MXCSR |= iemAImpl_divps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     16198IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_divps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16199{
     16200    return   iemAImpl_divps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     16201           | iemAImpl_divps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     16202           | iemAImpl_divps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     16203           | iemAImpl_divps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
    1620416204}
    1620516205#endif
     
    1621016210 */
    1621116211#ifdef IEM_WITHOUT_ASSEMBLY
    16212 IEM_DECL_IMPL_DEF(void, iemAImpl_divss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    16213 {
    16214     pResult->MXCSR = iemAImpl_divps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], pr32Src2);
    16215     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    16216     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    16217     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     16212IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_divss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     16213{
     16214    pResult->ar32[1] = puSrc1->ar32[1];
     16215    pResult->ar32[2] = puSrc1->ar32[2];
     16216    pResult->ar32[3] = puSrc1->ar32[3];
     16217    return iemAImpl_divps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], pr32Src2);
    1621816218}
    1621916219#endif
     
    1625816258
    1625916259
    16260 IEM_DECL_IMPL_DEF(void, iemAImpl_divpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16261 {
    16262     pResult->MXCSR  = iemAImpl_divpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc2->ar64[0]);
    16263     pResult->MXCSR |= iemAImpl_divpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc1->ar64[1], &puSrc2->ar64[1]);
     16260IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_divpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16261{
     16262    return   iemAImpl_divpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     16263           | iemAImpl_divpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
    1626416264}
    1626516265#endif
     
    1627016270 */
    1627116271#ifdef IEM_WITHOUT_ASSEMBLY
    16272 IEM_DECL_IMPL_DEF(void, iemAImpl_divsd_u128_r64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
    16273 {
    16274     pResult->MXCSR = iemAImpl_divpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], pr64Src2);
    16275     pResult->uResult.ar64[1] = puSrc1->ar64[1];
     16272IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_divsd_u128_r64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     16273{
     16274    pResult->ar64[1] = puSrc1->ar64[1];
     16275    return iemAImpl_divpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], pr64Src2);
    1627616276}
    1627716277#endif
     
    1631016310
    1631116311
    16312 IEM_DECL_IMPL_DEF(void, iemAImpl_maxps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16313 {
    16314     pResult->MXCSR  = iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc2->ar32[0]);
    16315     pResult->MXCSR |= iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[1], &puSrc2->ar32[1]);
    16316     pResult->MXCSR |= iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc2->ar32[2]);
    16317     pResult->MXCSR |= iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     16312IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_maxps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16313{
     16314    return   iemAImpl_maxps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     16315           | iemAImpl_maxps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     16316           | iemAImpl_maxps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     16317           | iemAImpl_maxps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
    1631816318}
    1631916319#endif
     
    1632416324 */
    1632516325#ifdef IEM_WITHOUT_ASSEMBLY
    16326 IEM_DECL_IMPL_DEF(void, iemAImpl_maxss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    16327 {
    16328     pResult->MXCSR = iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], pr32Src2);
    16329     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    16330     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    16331     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     16326IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_maxss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     16327{
     16328    pResult->ar32[1] = puSrc1->ar32[1];
     16329    pResult->ar32[2] = puSrc1->ar32[2];
     16330    pResult->ar32[3] = puSrc1->ar32[3];
     16331    return iemAImpl_maxps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], pr32Src2);
    1633216332}
    1633316333#endif
     
    1636616366
    1636716367
    16368 IEM_DECL_IMPL_DEF(void, iemAImpl_maxpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16369 {
    16370     pResult->MXCSR  = iemAImpl_maxpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc2->ar64[0]);
    16371     pResult->MXCSR |= iemAImpl_maxpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc1->ar64[1], &puSrc2->ar64[1]);
     16368IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_maxpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16369{
     16370    return   iemAImpl_maxpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     16371           | iemAImpl_maxpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
    1637216372}
    1637316373#endif
     
    1637816378 */
    1637916379#ifdef IEM_WITHOUT_ASSEMBLY
    16380 IEM_DECL_IMPL_DEF(void, iemAImpl_maxsd_u128_r64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
    16381 {
    16382     pResult->MXCSR = iemAImpl_maxpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], pr64Src2);
    16383     pResult->uResult.ar64[1] = puSrc1->ar64[1];
     16380IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_maxsd_u128_r64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     16381{
     16382    pResult->ar64[1] = puSrc1->ar64[1];
     16383    return iemAImpl_maxpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], pr64Src2);
    1638416384}
    1638516385#endif
     
    1640116401
    1640216402
    16403 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtss2sd_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    16404 {
    16405     pResult->MXCSR = iemAImpl_cvtss2sd_u128_r32_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, pr32Src2);
    16406     pResult->uResult.ar64[1] = puSrc1->ar64[1];
     16403IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtss2sd_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     16404{
     16405    pResult->ar64[1] = puSrc1->ar64[1];
     16406    return iemAImpl_cvtss2sd_u128_r32_worker(&pResult->ar64[0], uMxCsrIn, pr32Src2);
    1640716407}
    1640816408#endif
     
    1642416424
    1642516425
    16426 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsd2ss_u128_r64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
    16427 {
    16428     pResult->MXCSR = iemAImpl_cvtsd2ss_u128_r64_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, pr64Src2);
    16429     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    16430     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    16431     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     16426IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtsd2ss_u128_r64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     16427{
     16428    pResult->ar32[1] = puSrc1->ar32[1];
     16429    pResult->ar32[2] = puSrc1->ar32[2];
     16430    pResult->ar32[3] = puSrc1->ar32[3];
     16431    return iemAImpl_cvtsd2ss_u128_r64_worker(&pResult->ar32[0], uMxCsrIn, pr64Src2);
    1643216432}
    1643316433#endif
     
    1643816438 */
    1643916439#ifdef IEM_WITHOUT_ASSEMBLY
    16440 IEM_DECL_IMPL_DEF(void, iemAImpl_haddps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16441 {
    16442     pResult->MXCSR  = iemAImpl_addps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc1->ar32[1]);
    16443     pResult->MXCSR |= iemAImpl_addps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc1->ar32[3]);
    16444     pResult->MXCSR |= iemAImpl_addps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc2->ar32[0], &puSrc2->ar32[1]);
    16445     pResult->MXCSR |= iemAImpl_addps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc2->ar32[2], &puSrc2->ar32[3]);
     16440IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_haddps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16441{
     16442    return   iemAImpl_addps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc1->ar32[1])
     16443           | iemAImpl_addps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[2], &puSrc1->ar32[3])
     16444           | iemAImpl_addps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc2->ar32[0], &puSrc2->ar32[1])
     16445           | iemAImpl_addps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc2->ar32[2], &puSrc2->ar32[3]);
    1644616446}
    1644716447#endif
     
    1645216452 */
    1645316453#ifdef IEM_WITHOUT_ASSEMBLY
    16454 IEM_DECL_IMPL_DEF(void, iemAImpl_haddpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16455 {
    16456     pResult->MXCSR  = iemAImpl_addpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc1->ar64[1]);
    16457     pResult->MXCSR |= iemAImpl_addpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc2->ar64[0], &puSrc2->ar64[1]);
     16454IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_haddpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16455{
     16456    return   iemAImpl_addpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc1->ar64[1])
     16457           | iemAImpl_addpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc2->ar64[0], &puSrc2->ar64[1]);
    1645816458}
    1645916459#endif
     
    1646416464 */
    1646516465#ifdef IEM_WITHOUT_ASSEMBLY
    16466 IEM_DECL_IMPL_DEF(void, iemAImpl_hsubps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16467 {
    16468     pResult->MXCSR  = iemAImpl_subps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc1->ar32[1]);
    16469     pResult->MXCSR |= iemAImpl_subps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc1->ar32[3]);
    16470     pResult->MXCSR |= iemAImpl_subps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc2->ar32[0], &puSrc2->ar32[1]);
    16471     pResult->MXCSR |= iemAImpl_subps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc2->ar32[2], &puSrc2->ar32[3]);
     16466IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_hsubps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16467{
     16468    return   iemAImpl_subps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc1->ar32[1])
     16469           | iemAImpl_subps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[2], &puSrc1->ar32[3])
     16470           | iemAImpl_subps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc2->ar32[0], &puSrc2->ar32[1])
     16471           | iemAImpl_subps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc2->ar32[2], &puSrc2->ar32[3]);
    1647216472}
    1647316473#endif
     
    1647816478 */
    1647916479#ifdef IEM_WITHOUT_ASSEMBLY
    16480 IEM_DECL_IMPL_DEF(void, iemAImpl_hsubpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    16481 {
    16482     pResult->MXCSR  = iemAImpl_subpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc1->ar64[1]);
    16483     pResult->MXCSR |= iemAImpl_subpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc2->ar64[0], &puSrc2->ar64[1]);
     16480IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_hsubpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16481{
     16482    return   iemAImpl_subpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc1->ar64[1])
     16483           | iemAImpl_subpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc2->ar64[0], &puSrc2->ar64[1]);
    1648416484}
    1648516485#endif
     
    1651416514
    1651516515
    16516 IEM_DECL_IMPL_DEF(void, iemAImpl_sqrtps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16516IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sqrtps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1651716517{
    1651816518    RT_NOREF(puSrc1);
    1651916519
    16520     pResult->MXCSR  = iemAImpl_sqrtps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc2->ar32[0]);
    16521     pResult->MXCSR |= iemAImpl_sqrtps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc2->ar32[1]);
    16522     pResult->MXCSR |= iemAImpl_sqrtps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc2->ar32[2]);
    16523     pResult->MXCSR |= iemAImpl_sqrtps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc2->ar32[3]);
     16520    return   iemAImpl_sqrtps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc2->ar32[0])
     16521           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc2->ar32[1])
     16522           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc2->ar32[2])
     16523           | iemAImpl_sqrtps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc2->ar32[3]);
    1652416524}
    1652516525#endif
     
    1653016530 */
    1653116531#ifdef IEM_WITHOUT_ASSEMBLY
    16532 IEM_DECL_IMPL_DEF(void, iemAImpl_sqrtss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    16533 {
    16534     pResult->MXCSR = iemAImpl_sqrtps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, pr32Src2);
    16535     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    16536     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    16537     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     16532IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sqrtss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     16533{
     16534    pResult->ar32[1] = puSrc1->ar32[1];
     16535    pResult->ar32[2] = puSrc1->ar32[2];
     16536    pResult->ar32[3] = puSrc1->ar32[3];
     16537    return iemAImpl_sqrtps_u128_worker(&pResult->ar32[0], uMxCsrIn, pr32Src2);
    1653816538}
    1653916539#endif
     
    1656816568
    1656916569
    16570 IEM_DECL_IMPL_DEF(void, iemAImpl_sqrtpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16570IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sqrtpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1657116571{
    1657216572    RT_NOREF(puSrc1);
    1657316573
    16574     pResult->MXCSR  = iemAImpl_sqrtpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc2->ar64[0]);
    16575     pResult->MXCSR |= iemAImpl_sqrtpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc2->ar64[1]);
     16574    return   iemAImpl_sqrtpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc2->ar64[0])
     16575           | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc2->ar64[1]);
    1657616576}
    1657716577#endif
     
    1658216582 */
    1658316583#ifdef IEM_WITHOUT_ASSEMBLY
    16584 IEM_DECL_IMPL_DEF(void, iemAImpl_sqrtsd_u128_r64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
    16585 {
    16586     pResult->MXCSR = iemAImpl_sqrtpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, pr64Src2);
    16587     pResult->uResult.ar64[1] = puSrc1->ar64[1];
     16584IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sqrtsd_u128_r64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2))
     16585{
     16586    pResult->ar64[1] = puSrc1->ar64[1];
     16587    return iemAImpl_sqrtpd_u128_worker(&pResult->ar64[0], uMxCsrIn, pr64Src2);
    1658816588}
    1658916589#endif
     
    1661816618
    1661916619
    16620 IEM_DECL_IMPL_DEF(void, iemAImpl_rsqrtps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16620IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_rsqrtps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1662116621{
    1662216622    RT_NOREF(puSrc1);
    1662316623
    16624     pResult->MXCSR  = iemAImpl_rsqrt_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc2->ar32[0]);
    16625     pResult->MXCSR |= iemAImpl_rsqrt_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc2->ar32[1]);
    16626     pResult->MXCSR |= iemAImpl_rsqrt_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc2->ar32[2]);
    16627     pResult->MXCSR |= iemAImpl_rsqrt_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc2->ar32[3]);
     16624    return   iemAImpl_rsqrt_worker(&pResult->ar32[0], uMxCsrIn, &puSrc2->ar32[0])
     16625           | iemAImpl_rsqrt_worker(&pResult->ar32[1], uMxCsrIn, &puSrc2->ar32[1])
     16626           | iemAImpl_rsqrt_worker(&pResult->ar32[2], uMxCsrIn, &puSrc2->ar32[2])
     16627           | iemAImpl_rsqrt_worker(&pResult->ar32[3], uMxCsrIn, &puSrc2->ar32[3]);
    1662816628}
    1662916629
     
    1663216632 * RSQRTSS
    1663316633 */
    16634 IEM_DECL_IMPL_DEF(void, iemAImpl_rsqrtss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    16635 {
    16636     pResult->MXCSR = iemAImpl_rsqrt_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, pr32Src2);
    16637     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    16638     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    16639     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     16634IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_rsqrtss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     16635{
     16636    pResult->ar32[1] = puSrc1->ar32[1];
     16637    pResult->ar32[2] = puSrc1->ar32[2];
     16638    pResult->ar32[3] = puSrc1->ar32[3];
     16639    return iemAImpl_rsqrt_worker(&pResult->ar32[0], uMxCsrIn, pr32Src2);
    1664016640}
    1664116641#endif
     
    1666516665
    1666616666
    16667 IEM_DECL_IMPL_DEF(void, iemAImpl_rcpps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16667IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_rcpps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1666816668{
    1666916669    RT_NOREF(puSrc1);
    1667016670
    16671     pResult->MXCSR  = iemAImpl_rcp_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc2->ar32[0]);
    16672     pResult->MXCSR |= iemAImpl_rcp_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc2->ar32[1]);
    16673     pResult->MXCSR |= iemAImpl_rcp_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc2->ar32[2]);
    16674     pResult->MXCSR |= iemAImpl_rcp_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc2->ar32[3]);
     16671    return   iemAImpl_rcp_worker(&pResult->ar32[0], uMxCsrIn, &puSrc2->ar32[0])
     16672           | iemAImpl_rcp_worker(&pResult->ar32[1], uMxCsrIn, &puSrc2->ar32[1])
     16673           | iemAImpl_rcp_worker(&pResult->ar32[2], uMxCsrIn, &puSrc2->ar32[2])
     16674           | iemAImpl_rcp_worker(&pResult->ar32[3], uMxCsrIn, &puSrc2->ar32[3]);
    1667516675}
    1667616676
     
    1667916679 * RCPSS
    1668016680 */
    16681 IEM_DECL_IMPL_DEF(void, iemAImpl_rcpss_u128_r32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
    16682 {
    16683     pResult->MXCSR = iemAImpl_rcp_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, pr32Src2);
    16684     pResult->uResult.ar32[1] = puSrc1->ar32[1];
    16685     pResult->uResult.ar32[2] = puSrc1->ar32[2];
    16686     pResult->uResult.ar32[3] = puSrc1->ar32[3];
     16681IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_rcpss_u128_r32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2))
     16682{
     16683    pResult->ar32[1] = puSrc1->ar32[1];
     16684    pResult->ar32[2] = puSrc1->ar32[2];
     16685    pResult->ar32[3] = puSrc1->ar32[3];
     16686    return iemAImpl_rcp_worker(&pResult->ar32[0], uMxCsrIn, pr32Src2);
    1668716687}
    1668816688#endif
     
    1669316693 */
    1669416694#ifdef IEM_WITHOUT_ASSEMBLY
    16695 IEM_DECL_IMPL_DEF(void, iemAImpl_addsubps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16695IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_addsubps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1669616696{
    1669716697    RT_NOREF(puSrc1);
    1669816698
    16699     pResult->MXCSR  = iemAImpl_subps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc2->ar32[0]);
    16700     pResult->MXCSR |= iemAImpl_addps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[1], &puSrc2->ar32[1]);
    16701     pResult->MXCSR |= iemAImpl_subps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc2->ar32[2]);
    16702     pResult->MXCSR |= iemAImpl_addps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc1->ar32[3], &puSrc2->ar32[3]);
     16699    return   iemAImpl_subps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc1->ar32[0], &puSrc2->ar32[0])
     16700           | iemAImpl_addps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc1->ar32[1], &puSrc2->ar32[1])
     16701           | iemAImpl_subps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc1->ar32[2], &puSrc2->ar32[2])
     16702           | iemAImpl_addps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc1->ar32[3], &puSrc2->ar32[3]);
    1670316703}
    1670416704#endif
     
    1670916709 */
    1671016710#ifdef IEM_WITHOUT_ASSEMBLY
    16711 IEM_DECL_IMPL_DEF(void, iemAImpl_addsubpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16711IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_addsubpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1671216712{
    1671316713    RT_NOREF(puSrc1);
    1671416714
    16715     pResult->MXCSR  = iemAImpl_subpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc2->ar64[0]);
    16716     pResult->MXCSR |= iemAImpl_addpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc1->ar64[1], &puSrc2->ar64[1]);
     16715    return   iemAImpl_subpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc1->ar64[0], &puSrc2->ar64[0])
     16716           | iemAImpl_addpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc1->ar64[1], &puSrc2->ar64[1]);
    1671716717}
    1671816718#endif
     
    1673416734
    1673516735
    16736 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtpd2ps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16736IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtpd2ps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1673716737{
    1673816738    RT_NOREF(puSrc1);
    1673916739
    16740     pResult->MXCSR  = iemAImpl_cvtpd2ps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc2->ar64[0]);
    16741     pResult->MXCSR |= iemAImpl_cvtpd2ps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc2->ar64[1]);
    16742     pResult->uResult.au32[2] = 0;
    16743     pResult->uResult.au32[3] = 0;
     16740    pResult->au32[2] = 0;
     16741    pResult->au32[3] = 0;
     16742    return   iemAImpl_cvtpd2ps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc2->ar64[0])
     16743           | iemAImpl_cvtpd2ps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc2->ar64[1]);
    1674416744}
    1674516745#endif
     
    1676116761
    1676216762
    16763 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtps2pd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16763IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtps2pd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1676416764{
    1676516765    RT_NOREF(puSrc1);
    1676616766
    16767     pResult->MXCSR  = iemAImpl_cvtps2pd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc2->ar32[0]);
    16768     pResult->MXCSR |= iemAImpl_cvtps2pd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc2->ar32[1]);
     16767    return   iemAImpl_cvtps2pd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc2->ar32[0])
     16768           | iemAImpl_cvtps2pd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc2->ar32[1]);
    1676916769}
    1677016770#endif
     
    1678316783
    1678416784
    16785 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtdq2ps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16785IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtdq2ps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1678616786{
    1678716787    RT_NOREF(puSrc1);
    1678816788
    16789     pResult->MXCSR  = iemAImpl_cvtdq2ps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, puSrc2->ai32[0]);
    16790     pResult->MXCSR |= iemAImpl_cvtdq2ps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, puSrc2->ai32[1]);
    16791     pResult->MXCSR |= iemAImpl_cvtdq2ps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, puSrc2->ai32[2]);
    16792     pResult->MXCSR |= iemAImpl_cvtdq2ps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, puSrc2->ai32[3]);
     16789    return   iemAImpl_cvtdq2ps_u128_worker(&pResult->ar32[0], uMxCsrIn, puSrc2->ai32[0])
     16790           | iemAImpl_cvtdq2ps_u128_worker(&pResult->ar32[1], uMxCsrIn, puSrc2->ai32[1])
     16791           | iemAImpl_cvtdq2ps_u128_worker(&pResult->ar32[2], uMxCsrIn, puSrc2->ai32[2])
     16792           | iemAImpl_cvtdq2ps_u128_worker(&pResult->ar32[3], uMxCsrIn, puSrc2->ai32[3]);
    1679316793}
    1679416794#endif
     
    1681016810
    1681116811
    16812 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtps2dq_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16812IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtps2dq_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1681316813{
    1681416814    RT_NOREF(puSrc1);
    1681516815
    16816     pResult->MXCSR  = iemAImpl_cvtps2dq_u128_worker(&pResult->uResult.ai32[0], pFpuState->MXCSR, &puSrc2->ar32[0]);
    16817     pResult->MXCSR |= iemAImpl_cvtps2dq_u128_worker(&pResult->uResult.ai32[1], pFpuState->MXCSR, &puSrc2->ar32[1]);
    16818     pResult->MXCSR |= iemAImpl_cvtps2dq_u128_worker(&pResult->uResult.ai32[2], pFpuState->MXCSR, &puSrc2->ar32[2]);
    16819     pResult->MXCSR |= iemAImpl_cvtps2dq_u128_worker(&pResult->uResult.ai32[3], pFpuState->MXCSR, &puSrc2->ar32[3]);
     16816    return   iemAImpl_cvtps2dq_u128_worker(&pResult->ai32[0], uMxCsrIn, &puSrc2->ar32[0])
     16817           | iemAImpl_cvtps2dq_u128_worker(&pResult->ai32[1], uMxCsrIn, &puSrc2->ar32[1])
     16818           | iemAImpl_cvtps2dq_u128_worker(&pResult->ai32[2], uMxCsrIn, &puSrc2->ar32[2])
     16819           | iemAImpl_cvtps2dq_u128_worker(&pResult->ai32[3], uMxCsrIn, &puSrc2->ar32[3]);
    1682016820}
    1682116821#endif
     
    1683816838
    1683916839
    16840 IEM_DECL_IMPL_DEF(void, iemAImpl_cvttps2dq_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16840IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvttps2dq_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1684116841{
    1684216842    RT_NOREF(puSrc1);
    1684316843
    16844     pResult->MXCSR  = iemAImpl_cvttps2dq_u128_worker(&pResult->uResult.ai32[0], pFpuState->MXCSR, &puSrc2->ar32[0]);
    16845     pResult->MXCSR |= iemAImpl_cvttps2dq_u128_worker(&pResult->uResult.ai32[1], pFpuState->MXCSR, &puSrc2->ar32[1]);
    16846     pResult->MXCSR |= iemAImpl_cvttps2dq_u128_worker(&pResult->uResult.ai32[2], pFpuState->MXCSR, &puSrc2->ar32[2]);
    16847     pResult->MXCSR |= iemAImpl_cvttps2dq_u128_worker(&pResult->uResult.ai32[3], pFpuState->MXCSR, &puSrc2->ar32[3]);
     16844    return   iemAImpl_cvttps2dq_u128_worker(&pResult->ai32[0], uMxCsrIn, &puSrc2->ar32[0])
     16845           | iemAImpl_cvttps2dq_u128_worker(&pResult->ai32[1], uMxCsrIn, &puSrc2->ar32[1])
     16846           | iemAImpl_cvttps2dq_u128_worker(&pResult->ai32[2], uMxCsrIn, &puSrc2->ar32[2])
     16847           | iemAImpl_cvttps2dq_u128_worker(&pResult->ai32[3], uMxCsrIn, &puSrc2->ar32[3]);
    1684816848}
    1684916849#endif
     
    1686616866
    1686716867
    16868 IEM_DECL_IMPL_DEF(void, iemAImpl_cvttpd2dq_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16868IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvttpd2dq_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1686916869{
    1687016870    RT_NOREF(puSrc1);
    1687116871
    16872     pResult->MXCSR  = iemAImpl_cvttpd2dq_u128_worker(&pResult->uResult.ai32[0], pFpuState->MXCSR, &puSrc2->ar64[0]);
    16873     pResult->MXCSR |= iemAImpl_cvttpd2dq_u128_worker(&pResult->uResult.ai32[1], pFpuState->MXCSR, &puSrc2->ar64[1]);
    16874     pResult->uResult.au64[1] = 0;
     16872    pResult->au64[1] = 0;
     16873    return   iemAImpl_cvttpd2dq_u128_worker(&pResult->ai32[0], uMxCsrIn, &puSrc2->ar64[0])
     16874           | iemAImpl_cvttpd2dq_u128_worker(&pResult->ai32[1], uMxCsrIn, &puSrc2->ar64[1]);
    1687516875}
    1687616876#endif
     
    1688916889
    1689016890
    16891 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtdq2pd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16891IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtdq2pd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1689216892{
    1689316893    RT_NOREF(puSrc1);
    1689416894
    16895     pResult->MXCSR  = iemAImpl_cvtdq2pd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, puSrc2->ai32[0]);
    16896     pResult->MXCSR |= iemAImpl_cvtdq2pd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, puSrc2->ai32[1]);
     16895    return   iemAImpl_cvtdq2pd_u128_worker(&pResult->ar64[0], uMxCsrIn, puSrc2->ai32[0])
     16896           | iemAImpl_cvtdq2pd_u128_worker(&pResult->ar64[1], uMxCsrIn, puSrc2->ai32[1]);
    1689716897}
    1689816898#endif
     
    1691416914
    1691516915
    16916 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtpd2dq_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     16916IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtpd2dq_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1691716917{
    1691816918    RT_NOREF(puSrc1);
    1691916919
    16920     pResult->MXCSR  = iemAImpl_cvtpd2dq_u128_worker(&pResult->uResult.ai32[0], pFpuState->MXCSR, &puSrc2->ar64[0]);
    16921     pResult->MXCSR |= iemAImpl_cvtpd2dq_u128_worker(&pResult->uResult.ai32[1], pFpuState->MXCSR, &puSrc2->ar64[1]);
    16922     pResult->uResult.au64[1] = 0;
     16920    pResult->au64[1] = 0;
     16921    return   iemAImpl_cvtpd2dq_u128_worker(&pResult->ai32[0], uMxCsrIn, &puSrc2->ar64[0])
     16922           | iemAImpl_cvtpd2dq_u128_worker(&pResult->ai32[1], uMxCsrIn, &puSrc2->ar64[1]);
    1692316923}
    1692416924#endif
     
    1823218232 */
    1823318233#ifdef IEM_WITHOUT_ASSEMBLY
    18234 IEM_DECL_IMPL_DEF(void, iemAImpl_cvttsd2si_i32_r64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint64_t *pu64Src))
     18234IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvttsd2si_i32_r64,(uint32_t uMxCsrIn, int32_t *pi32Dst, const uint64_t *pu64Src))
    1823518235{
    1823618236    RTFLOAT64U r64Src;
    1823718237
    1823818238    r64Src.u = *pu64Src;
    18239     iemSsePrepareValueR64(&r64Src, pFpuState->MXCSR, &r64Src); /* The de-normal flag is not set. */
    18240 
    18241     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18239    iemSsePrepareValueR64(&r64Src, uMxCsrIn, &r64Src); /* The de-normal flag is not set. */
     18240
     18241    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1824218242    *pi32Dst = f64_to_i32_r_minMag(iemFpSoftF64FromIprt(&r64Src), true /*exact*/, &SoftState);
    18243     *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
    18244 }
    18245 
    18246 
    18247 IEM_DECL_IMPL_DEF(void, iemAImpl_cvttsd2si_i64_r64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint64_t *pu64Src))
     18243    return uMxCsrIn | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     18244}
     18245
     18246
     18247IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvttsd2si_i64_r64,(uint32_t uMxCsrIn, int64_t *pi64Dst, const uint64_t *pu64Src))
    1824818248{
    1824918249    RTFLOAT64U r64Src;
    1825018250
    1825118251    r64Src.u = *pu64Src;
    18252     iemSsePrepareValueR64(&r64Src, pFpuState->MXCSR, &r64Src); /* The de-normal flag is not set. */
    18253 
    18254     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18252    iemSsePrepareValueR64(&r64Src, uMxCsrIn, &r64Src); /* The de-normal flag is not set. */
     18253
     18254    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1825518255    *pi64Dst = f64_to_i64_r_minMag(iemFpSoftF64FromIprt(&r64Src), true /*exact*/, &SoftState);
    18256     *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     18256    return uMxCsrIn | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
    1825718257}
    1825818258#endif
     
    1826318263 */
    1826418264#ifdef IEM_WITHOUT_ASSEMBLY
    18265 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsd2si_i32_r64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint64_t *pu64Src))
     18265IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtsd2si_i32_r64,(uint32_t uMxCsrIn, int32_t *pi32Dst, const uint64_t *pu64Src))
    1826618266{
    1826718267    RTFLOAT64U r64Src;
    1826818268
    1826918269    r64Src.u = *pu64Src;
    18270     iemSsePrepareValueR64(&r64Src, pFpuState->MXCSR, &r64Src); /* The de-normal flag is not set. */
    18271 
    18272     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18270    iemSsePrepareValueR64(&r64Src, uMxCsrIn, &r64Src); /* The de-normal flag is not set. */
     18271
     18272    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1827318273    *pi32Dst = f64_to_i32(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, true /*exact*/, &SoftState);
    18274     *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
    18275 }
    18276 
    18277 
    18278 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsd2si_i64_r64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint64_t *pu64Src))
     18274    return uMxCsrIn | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     18275}
     18276
     18277
     18278IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtsd2si_i64_r64,(uint32_t uMxCsrIn, int64_t *pi64Dst, const uint64_t *pu64Src))
    1827918279{
    1828018280    RTFLOAT64U r64Src;
    1828118281
    1828218282    r64Src.u = *pu64Src;
    18283     iemSsePrepareValueR64(&r64Src, pFpuState->MXCSR, &r64Src); /* The de-normal flag is not set. */
    18284 
    18285     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18283    iemSsePrepareValueR64(&r64Src, uMxCsrIn, &r64Src); /* The de-normal flag is not set. */
     18284
     18285    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1828618286    *pi64Dst = f64_to_i64(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, true /*exact*/, &SoftState);
    18287     *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     18287    return uMxCsrIn | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
    1828818288}
    1828918289#endif
     
    1829418294 */
    1829518295#ifdef IEM_WITHOUT_ASSEMBLY
    18296 IEM_DECL_IMPL_DEF(void, iemAImpl_cvttss2si_i32_r32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint32_t *pu32Src))
     18296IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvttss2si_i32_r32,(uint32_t uMxCsrIn, int32_t *pi32Dst, const uint32_t *pu32Src))
    1829718297{
    1829818298    RTFLOAT32U r32Src;
    1829918299
    1830018300    r32Src.u = *pu32Src;
    18301     iemSsePrepareValueR32(&r32Src, pFpuState->MXCSR, &r32Src); /* The de-normal flag is not set. */
    18302 
    18303     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18301    iemSsePrepareValueR32(&r32Src, uMxCsrIn, &r32Src); /* The de-normal flag is not set. */
     18302
     18303    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1830418304    *pi32Dst = f32_to_i32_r_minMag(iemFpSoftF32FromIprt(&r32Src), true /*exact*/, &SoftState);
    18305     *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
    18306 }
    18307 
    18308 
    18309 IEM_DECL_IMPL_DEF(void, iemAImpl_cvttss2si_i64_r32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint32_t *pu32Src))
     18305    return uMxCsrIn | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     18306}
     18307
     18308
     18309IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvttss2si_i64_r32,(uint32_t uMxCsrIn, int64_t *pi64Dst, const uint32_t *pu32Src))
    1831018310{
    1831118311    RTFLOAT32U r32Src;
    1831218312
    1831318313    r32Src.u = *pu32Src;
    18314     iemSsePrepareValueR32(&r32Src, pFpuState->MXCSR, &r32Src); /* The de-normal flag is not set. */
    18315 
    18316     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18314    iemSsePrepareValueR32(&r32Src, uMxCsrIn, &r32Src); /* The de-normal flag is not set. */
     18315
     18316    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1831718317    *pi64Dst = f32_to_i64_r_minMag(iemFpSoftF32FromIprt(&r32Src), true /*exact*/, &SoftState);
    18318     *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     18318    return uMxCsrIn | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
    1831918319}
    1832018320#endif
     
    1832518325 */
    1832618326#ifdef IEM_WITHOUT_ASSEMBLY
    18327 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtss2si_i32_r32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint32_t *pu32Src))
     18327IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtss2si_i32_r32,(uint32_t uMxCsrIn, int32_t *pi32Dst, const uint32_t *pu32Src))
    1832818328{
    1832918329    RTFLOAT32U r32Src;
    1833018330
    1833118331    r32Src.u = *pu32Src;
    18332     iemSsePrepareValueR32(&r32Src, pFpuState->MXCSR, &r32Src); /* The de-normal flag is not set. */
    18333 
    18334     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18332    iemSsePrepareValueR32(&r32Src, uMxCsrIn, &r32Src); /* The de-normal flag is not set. */
     18333
     18334    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1833518335    *pi32Dst = f32_to_i32(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, true /*exact*/, &SoftState);
    18336     *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
    18337 }
    18338 
    18339 
    18340 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtss2si_i64_r32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint32_t *pu32Src))
     18336    return uMxCsrIn | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     18337}
     18338
     18339
     18340IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtss2si_i64_r32,(uint32_t uMxCsrIn, int64_t *pi64Dst, const uint32_t *pu32Src))
    1834118341{
    1834218342    RTFLOAT32U r32Src;
    1834318343
    1834418344    r32Src.u = *pu32Src;
    18345     iemSsePrepareValueR32(&r32Src, pFpuState->MXCSR, &r32Src); /* The de-normal flag is not set. */
    18346 
    18347     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18345    iemSsePrepareValueR32(&r32Src, uMxCsrIn, &r32Src); /* The de-normal flag is not set. */
     18346
     18347    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1834818348    *pi64Dst = f32_to_i64(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, true /*exact*/, &SoftState);
    18349     *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     18349    return uMxCsrIn | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
    1835018350}
    1835118351#endif
     
    1835618356 */
    1835718357#ifdef IEM_WITHOUT_ASSEMBLY
    18358 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsi2sd_r64_i32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, PRTFLOAT64U pr64Dst, const int32_t *pi32Src))
    18359 {
    18360     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18358IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtsi2sd_r64_i32,(uint32_t uMxCsrIn, PRTFLOAT64U pr64Dst, const int32_t *pi32Src))
     18359{
     18360    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1836118361    float64_t r64Res = i32_to_f64(*pi32Src, &SoftState);
    18362     *pfMxcsr = iemSseSoftStateAndR64ToMxcsrAndIprtResult(&SoftState, r64Res, pr64Dst, pFpuState->MXCSR);
    18363 }
    18364 
    18365 
    18366 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsi2sd_r64_i64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, PRTFLOAT64U pr64Dst, const int64_t *pi64Src))
    18367 {
    18368     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18362    return iemSseSoftStateAndR64ToMxcsrAndIprtResult(&SoftState, r64Res, pr64Dst, uMxCsrIn);
     18363}
     18364
     18365
     18366IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtsi2sd_r64_i64,(uint32_t uMxCsrIn, PRTFLOAT64U pr64Dst, const int64_t *pi64Src))
     18367{
     18368    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1836918369    float64_t r64Res = i64_to_f64(*pi64Src, &SoftState);
    18370     *pfMxcsr = iemSseSoftStateAndR64ToMxcsrAndIprtResult(&SoftState, r64Res, pr64Dst, pFpuState->MXCSR);
     18370    return iemSseSoftStateAndR64ToMxcsrAndIprtResult(&SoftState, r64Res, pr64Dst, uMxCsrIn);
    1837118371}
    1837218372#endif
     
    1837718377 */
    1837818378#ifdef IEM_WITHOUT_ASSEMBLY
    18379 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsi2ss_r32_i32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, PRTFLOAT32U pr32Dst, const int32_t *pi32Src))
    18380 {
    18381     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18379IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtsi2ss_r32_i32,(uint32_t uMxCsrIn, PRTFLOAT32U pr32Dst, const int32_t *pi32Src))
     18380{
     18381    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1838218382    float32_t r32Res = i32_to_f32(*pi32Src, &SoftState);
    18383     *pfMxcsr = iemSseSoftStateAndR32ToMxcsrAndIprtResult(&SoftState, r32Res, pr32Dst, pFpuState->MXCSR);
    18384 }
    18385 
    18386 
    18387 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsi2ss_r32_i64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, PRTFLOAT32U pr32Dst, const int64_t *pi64Src))
    18388 {
    18389     softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     18383    return iemSseSoftStateAndR32ToMxcsrAndIprtResult(&SoftState, r32Res, pr32Dst, uMxCsrIn);
     18384}
     18385
     18386
     18387IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_cvtsi2ss_r32_i64,(uint32_t uMxCsrIn, PRTFLOAT32U pr32Dst, const int64_t *pi64Src))
     18388{
     18389    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1839018390    float32_t r32Res = i64_to_f32(*pi64Src, &SoftState);
    18391     *pfMxcsr = iemSseSoftStateAndR32ToMxcsrAndIprtResult(&SoftState, r32Res, pr32Dst, pFpuState->MXCSR);
     18391    return iemSseSoftStateAndR32ToMxcsrAndIprtResult(&SoftState, r32Res, pr32Dst, uMxCsrIn);
    1839218392}
    1839318393#endif
     
    1839818398 */
    1839918399#ifdef IEM_WITHOUT_ASSEMBLY
    18400 IEM_DECL_IMPL_DEF(void, iemAImpl_ucomiss_u128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     18400IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_ucomiss_u128,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1840118401{
    1840218402    uint32_t fEFlagsNew = *pfEFlags & ~X86_EFL_STATUS_BITS;
     
    1840418404    if (RTFLOAT32U_IS_SIGNALLING_NAN(&puSrc1->ar32[0]) || RTFLOAT32U_IS_SIGNALLING_NAN(&puSrc2->ar32[0]))
    1840518405    {
    18406         *pfMxcsr   |= X86_MXCSR_IE;
     18406        uMxCsrIn   |= X86_MXCSR_IE;
    1840718407        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
    1840818408    }
     
    1841418414    else
    1841518415    {
    18416         softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     18416        softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1841718417
    1841818418        RTFLOAT32U r32Src1, r32Src2;
    18419         uint32_t fDe  = iemSsePrepareValueR32(&r32Src1, *pfMxcsr, &puSrc1->ar32[0]);
    18420                  fDe |= iemSsePrepareValueR32(&r32Src2, *pfMxcsr, &puSrc2->ar32[0]);
     18419        uint32_t fDe  = iemSsePrepareValueR32(&r32Src1, uMxCsrIn, &puSrc1->ar32[0]);
     18420                 fDe |= iemSsePrepareValueR32(&r32Src2, uMxCsrIn, &puSrc2->ar32[0]);
    1842118421
    1842218422        float32_t f32Src1 = iemFpSoftF32FromIprt(&r32Src1);
     
    1842818428        /* else:                         GREATER_THAN 000 */
    1842918429
    18430         *pfMxcsr |= fDe;
     18430        uMxCsrIn |= fDe;
    1843118431    }
    1843218432
    1843318433    *pfEFlags = fEFlagsNew;
    18434 }
    18435 #endif
    18436 
    18437 IEM_DECL_IMPL_DEF(void, iemAImpl_vucomiss_u128_fallback,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    18438 {
    18439     iemAImpl_ucomiss_u128(pfMxcsr, pfEFlags, puSrc1, puSrc2);
     18434    return uMxCsrIn;
     18435}
     18436#endif
     18437
     18438IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vucomiss_u128_fallback,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     18439{
     18440    return iemAImpl_ucomiss_u128(uMxCsrIn, pfEFlags, puSrc1, puSrc2);
    1844018441}
    1844118442
     
    1844518446 */
    1844618447#ifdef IEM_WITHOUT_ASSEMBLY
    18447 IEM_DECL_IMPL_DEF(void, iemAImpl_ucomisd_u128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     18448IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_ucomisd_u128,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1844818449{
    1844918450    uint32_t fEFlagsNew = *pfEFlags & ~X86_EFL_STATUS_BITS;
     
    1845118452    if (RTFLOAT64U_IS_SIGNALLING_NAN(&puSrc1->ar64[0]) || RTFLOAT64U_IS_SIGNALLING_NAN(&puSrc2->ar64[0]))
    1845218453    {
    18453         *pfMxcsr   |= X86_MXCSR_IE;
     18454        uMxCsrIn   |= X86_MXCSR_IE;
    1845418455        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
    1845518456    }
     
    1846118462    else
    1846218463    {
    18463         softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     18464        softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1846418465
    1846518466        RTFLOAT64U r64Src1, r64Src2;
    18466         uint32_t fDe = iemSsePrepareValueR64(&r64Src1, *pfMxcsr, &puSrc1->ar64[0])
    18467                      | iemSsePrepareValueR64(&r64Src2, *pfMxcsr, &puSrc2->ar64[0]);
     18467        uint32_t fDe = iemSsePrepareValueR64(&r64Src1, uMxCsrIn, &puSrc1->ar64[0])
     18468                     | iemSsePrepareValueR64(&r64Src2, uMxCsrIn, &puSrc2->ar64[0]);
    1846818469
    1846918470        float64_t f64Src1 = iemFpSoftF64FromIprt(&r64Src1);
     
    1847518476        /* else:                         GREATER_THAN 000 */
    1847618477
    18477         *pfMxcsr |= fDe;
     18478        uMxCsrIn |= fDe;
    1847818479    }
    1847918480
    1848018481    *pfEFlags = fEFlagsNew;
    18481 }
    18482 #endif
    18483 
    18484 IEM_DECL_IMPL_DEF(void, iemAImpl_vucomisd_u128_fallback,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    18485 {
    18486     iemAImpl_ucomisd_u128(pfMxcsr, pfEFlags, puSrc1, puSrc2);
     18482    return uMxCsrIn;
     18483}
     18484#endif
     18485
     18486IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vucomisd_u128_fallback,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     18487{
     18488    return iemAImpl_ucomisd_u128(uMxCsrIn, pfEFlags, puSrc1, puSrc2);
    1848718489}
    1848818490
     
    1849218494 */
    1849318495#ifdef IEM_WITHOUT_ASSEMBLY
    18494 IEM_DECL_IMPL_DEF(void, iemAImpl_comiss_u128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     18496IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_comiss_u128,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1849518497{
    1849618498    uint32_t fEFlagsNew = *pfEFlags & ~X86_EFL_STATUS_BITS;
     
    1849918501        || RTFLOAT32U_IS_QUIET_NAN(&puSrc1->ar32[0]) || RTFLOAT32U_IS_QUIET_NAN(&puSrc2->ar32[0]))
    1850018502    {
    18501         *pfMxcsr   |= X86_MXCSR_IE;
     18503        uMxCsrIn   |= X86_MXCSR_IE;
    1850218504        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
    1850318505    }
    1850418506    else
    1850518507    {
    18506         softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     18508        softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1850718509
    1850818510        RTFLOAT32U r32Src1, r32Src2;
    18509         uint32_t fDe = iemSsePrepareValueR32(&r32Src1, *pfMxcsr, &puSrc1->ar32[0])
    18510                      | iemSsePrepareValueR32(&r32Src2, *pfMxcsr, &puSrc2->ar32[0]);
     18511        uint32_t fDe = iemSsePrepareValueR32(&r32Src1, uMxCsrIn, &puSrc1->ar32[0])
     18512                     | iemSsePrepareValueR32(&r32Src2, uMxCsrIn, &puSrc2->ar32[0]);
    1851118513
    1851218514        float32_t f32Src1 = iemFpSoftF32FromIprt(&r32Src1);
     
    1851818520        /* else:                         GREATER_THAN 000 */
    1851918521
    18520         *pfMxcsr |= fDe;
     18522        uMxCsrIn |= fDe;
    1852118523    }
    1852218524
    1852318525    *pfEFlags = fEFlagsNew;
    18524 }
    18525 #endif
    18526 
    18527 
    18528 IEM_DECL_IMPL_DEF(void, iemAImpl_vcomiss_u128_fallback,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    18529 {
    18530     iemAImpl_comiss_u128(pfMxcsr, pfEFlags, puSrc1, puSrc2);
     18526    return uMxCsrIn;
     18527}
     18528#endif
     18529
     18530
     18531IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vcomiss_u128_fallback,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     18532{
     18533    return iemAImpl_comiss_u128(uMxCsrIn, pfEFlags, puSrc1, puSrc2);
    1853118534}
    1853218535
     
    1853618539 */
    1853718540#ifdef IEM_WITHOUT_ASSEMBLY
    18538 IEM_DECL_IMPL_DEF(void, iemAImpl_comisd_u128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     18541IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_comisd_u128,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    1853918542{
    1854018543    uint32_t fEFlagsNew = *pfEFlags & ~X86_EFL_STATUS_BITS;
     
    1854318546        || RTFLOAT64U_IS_QUIET_NAN(&puSrc1->ar64[0]) || RTFLOAT64U_IS_QUIET_NAN(&puSrc2->ar64[0]))
    1854418547    {
    18545         *pfMxcsr   |= X86_MXCSR_IE;
     18548        uMxCsrIn   |= X86_MXCSR_IE;
    1854618549        fEFlagsNew |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; /* UNORDERED 111 */
    1854718550    }
    1854818551    else
    1854918552    {
    18550         softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr);
     18553        softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(uMxCsrIn);
    1855118554
    1855218555        RTFLOAT64U r64Src1, r64Src2;
    18553         uint32_t fDe  = iemSsePrepareValueR64(&r64Src1, *pfMxcsr, &puSrc1->ar64[0]);
    18554                  fDe |= iemSsePrepareValueR64(&r64Src2, *pfMxcsr, &puSrc2->ar64[0]);
     18556        uint32_t fDe  = iemSsePrepareValueR64(&r64Src1, uMxCsrIn, &puSrc1->ar64[0]);
     18557                 fDe |= iemSsePrepareValueR64(&r64Src2, uMxCsrIn, &puSrc2->ar64[0]);
    1855518558
    1855618559        float64_t f64Src1 = iemFpSoftF64FromIprt(&r64Src1);
     
    1856218565        /* else:                         GREATER_THAN 000 */
    1856318566
    18564         *pfMxcsr |= fDe;
     18567        uMxCsrIn |= fDe;
    1856518568    }
    1856618569
    1856718570    *pfEFlags = fEFlagsNew;
    18568 }
    18569 #endif
    18570 
    18571 IEM_DECL_IMPL_DEF(void, iemAImpl_vcomisd_u128_fallback,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
    18572 {
    18573     iemAImpl_comisd_u128(pfMxcsr, pfEFlags, puSrc1, puSrc2);
     18571    return uMxCsrIn;
     18572}
     18573#endif
     18574
     18575IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vcomisd_u128_fallback,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     18576{
     18577    return iemAImpl_comisd_u128(uMxCsrIn, pfEFlags, puSrc1, puSrc2);
    1857418578}
    1857518579
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r104099 r104129  
    29952995    'IEM_MC_CALL_AVX_AIMPL_2':                                   (McBlock.parseMcCallAvxAImpl,      True,  True,  g_fNativeSimd),
    29962996    'IEM_MC_CALL_AVX_AIMPL_3':                                   (McBlock.parseMcCallAvxAImpl,      True,  True,  g_fNativeSimd),
     2997    'IEM_MC_CALL_AVX_AIMPL_NEW_3':                               (McBlock.parseMcCallAvxAImpl,      True,  True,  False, ),
    29972998    'IEM_MC_CALL_CIMPL_0':                                       (McBlock.parseMcCallCImpl,         True,  True,  False, ),
    29982999    'IEM_MC_CALL_CIMPL_1':                                       (McBlock.parseMcCallCImpl,         True,  True,  False, ),
     
    30553056    'IEM_MC_FETCH_MEM_I16':                                      (McBlock.parseMcGeneric,           True,  True,  False, ),
    30563057    'IEM_MC_FETCH_MEM_I32':                                      (McBlock.parseMcGeneric,           True,  True,  False, ),
    3057     'IEM_MC_FETCH_MEM_I64':                                      (McBlock.parseMcGeneric,           True,  True,  False, ),
     3058    'IEM_MC_FETCH_MEM_I64':                                      (McBlock.parseMcGeneric,           True,  True,  False,  ),
    30583059    'IEM_MC_FETCH_MEM_R32':                                      (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
    30593060    'IEM_MC_FETCH_MEM_R64':                                      (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h

    r104118 r104129  
    654654        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    655655        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    656         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
    657         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     656        IEM_MC_LOCAL(X86XMMREG,             SseRes);
     657        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    658658        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    659659        IEM_MC_ARG(PCX86XMMREG,             pSrc2,                      2);
     
    675675         */
    676676        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    677         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
     677        IEM_MC_LOCAL(X86XMMREG,             SseRes);
    678678        IEM_MC_LOCAL(X86XMMREG,             uSrc2);
    679         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     679        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    680680        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    681681        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   pSrc2, uSrc2,               2);
     
    718718        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    719719        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    720         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
    721         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     720        IEM_MC_LOCAL(X86XMMREG,             SseRes);
     721        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    722722        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    723723        IEM_MC_ARG(PCRTFLOAT32U,            pSrc2,                      2);
     
    739739         */
    740740        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    741         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
     741        IEM_MC_LOCAL(X86XMMREG,             SseRes);
    742742        IEM_MC_LOCAL(RTFLOAT32U,            r32Src2);
    743         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     743        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    744744        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    745745        IEM_MC_ARG_LOCAL_REF(PCRTFLOAT32U,  pr32Src2,       r32Src2,    2);
     
    782782        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    783783        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    784         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
    785         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     784        IEM_MC_LOCAL(X86XMMREG,             SseRes);
     785        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    786786        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    787787        IEM_MC_ARG(PCX86XMMREG,             pSrc2,                      2);
     
    803803         */
    804804        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    805         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
     805        IEM_MC_LOCAL(X86XMMREG,             SseRes);
    806806        IEM_MC_LOCAL(X86XMMREG,             uSrc2);
    807         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     807        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    808808        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    809809        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   pSrc2, uSrc2,               2);
     
    846846        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    847847        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    848         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
    849         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     848        IEM_MC_LOCAL(X86XMMREG,             SseRes);
     849        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    850850        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    851851        IEM_MC_ARG(PCRTFLOAT64U,            pSrc2,                      2);
     
    867867         */
    868868        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    869         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
     869        IEM_MC_LOCAL(X86XMMREG,             SseRes);
    870870        IEM_MC_LOCAL(RTFLOAT64U,            r64Src2);
    871         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     871        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    872872        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    873873        IEM_MC_ARG_LOCAL_REF(PCRTFLOAT64U,  pr64Src2,       r64Src2,    2);
     
    970970        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    971971        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse3);
    972         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
    973         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     972        IEM_MC_LOCAL(X86XMMREG,             SseRes);
     973        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    974974        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    975975        IEM_MC_ARG(PCX86XMMREG,             pSrc2,                      2);
     
    991991         */
    992992        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    993         IEM_MC_LOCAL(IEMSSERESULT,          SseRes);
     993        IEM_MC_LOCAL(X86XMMREG,             SseRes);
    994994        IEM_MC_LOCAL(X86XMMREG,             uSrc2);
    995         IEM_MC_ARG_LOCAL_REF(PIEMSSERESULT, pSseRes,        SseRes,     0);
     995        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pSseRes,        SseRes,     0);
    996996        IEM_MC_ARG(PCX86XMMREG,             pSrc1,                      1);
    997997        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   pSrc2, uSrc2,               2);
     
    36143614            /* XMM, greg64 */
    36153615            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    3616             IEM_MC_LOCAL(uint32_t,    fMxcsr);
    36173616            IEM_MC_LOCAL(RTFLOAT32U,  r32Dst);
    3618             IEM_MC_ARG_LOCAL_REF(uint32_t *,    pfMxcsr, fMxcsr,  0);
    3619             IEM_MC_ARG_LOCAL_REF(PRTFLOAT32U,   pr32Dst, r32Dst,  1);
    3620             IEM_MC_ARG(const int64_t *,         pi64Src,          2);
     3617            IEM_MC_ARG_LOCAL_REF(PRTFLOAT32U,   pr32Dst, r32Dst,  0);
     3618            IEM_MC_ARG(const int64_t *,         pi64Src,          1);
    36213619
    36223620            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    36233621            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    3624             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3622            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    36253623
    36263624            IEM_MC_REF_GREG_I64_CONST(pi64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    3627             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsi2ss_r32_i64, pfMxcsr, pr32Dst, pi64Src);
    3628             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3625            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2ss_r32_i64, pr32Dst, pi64Src);
    36293626            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    36303627                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    36413638            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    36423639            IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
    3643             IEM_MC_LOCAL(uint32_t,   fMxcsr);
    36443640            IEM_MC_LOCAL(RTFLOAT32U, r32Dst);
    36453641            IEM_MC_LOCAL(int64_t,    i64Src);
    3646             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    3647             IEM_MC_ARG_LOCAL_REF(PRTFLOAT32U,       pr32Dst, r32Dst,     1);
    3648             IEM_MC_ARG_LOCAL_REF(const int64_t *,   pi64Src, i64Src,     2);
     3642            IEM_MC_ARG_LOCAL_REF(PRTFLOAT32U,       pr32Dst, r32Dst,     0);
     3643            IEM_MC_ARG_LOCAL_REF(const int64_t *,   pi64Src, i64Src,     1);
    36493644
    36503645            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    36513646            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    36523647            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    3653             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3648            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    36543649
    36553650            IEM_MC_FETCH_MEM_I64(i64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    3656             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsi2ss_r32_i64, pfMxcsr, pr32Dst, pi64Src);
    3657             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3651            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2ss_r32_i64, pr32Dst, pi64Src);
    36583652            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    36593653                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    36723666            /* greg, XMM */
    36733667            IEM_MC_BEGIN(0, 0);
    3674             IEM_MC_LOCAL(uint32_t,   fMxcsr);
    36753668            IEM_MC_LOCAL(RTFLOAT32U, r32Dst);
    3676             IEM_MC_ARG_LOCAL_REF(uint32_t *,  pfMxcsr, fMxcsr,     0);
    3677             IEM_MC_ARG_LOCAL_REF(PRTFLOAT32U, pr32Dst, r32Dst,     1);
    3678             IEM_MC_ARG(const int32_t *,       pi32Src,             2);
     3669            IEM_MC_ARG_LOCAL_REF(PRTFLOAT32U, pr32Dst, r32Dst,     0);
     3670            IEM_MC_ARG(const int32_t *,       pi32Src,             1);
    36793671
    36803672            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    36813673            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    3682             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3674            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    36833675
    36843676            IEM_MC_REF_GREG_I32_CONST(pi32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    3685             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsi2ss_r32_i32, pfMxcsr, pr32Dst, pi32Src);
    3686             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3677            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2ss_r32_i32, pr32Dst, pi32Src);
    36873678            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    36883679                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    36993690            IEM_MC_BEGIN(0, 0);
    37003691            IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
    3701             IEM_MC_LOCAL(uint32_t,   fMxcsr);
    37023692            IEM_MC_LOCAL(RTFLOAT32U, r32Dst);
    37033693            IEM_MC_LOCAL(int32_t,    i32Src);
    3704             IEM_MC_ARG_LOCAL_REF(uint32_t *,       pfMxcsr, fMxcsr,     0);
    3705             IEM_MC_ARG_LOCAL_REF(PRTFLOAT32U,      pr32Dst, r32Dst,     1);
    3706             IEM_MC_ARG_LOCAL_REF(const int32_t *,  pi32Src, i32Src,     2);
     3694            IEM_MC_ARG_LOCAL_REF(PRTFLOAT32U,      pr32Dst, r32Dst,     0);
     3695            IEM_MC_ARG_LOCAL_REF(const int32_t *,  pi32Src, i32Src,     1);
    37073696
    37083697            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    37093698            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    37103699            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    3711             IEM_MC_PREPARE_SSE_USAGE(); /** @todo This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3700            IEM_MC_PREPARE_SSE_USAGE(); /** @todo This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    37123701
    37133702            IEM_MC_FETCH_MEM_I32(i32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    3714             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsi2ss_r32_i32, pfMxcsr, pr32Dst, pi32Src);
    3715             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3703            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2ss_r32_i32, pr32Dst, pi32Src);
    37163704            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    37173705                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    37393727            /* XMM, greg64 */
    37403728            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    3741             IEM_MC_LOCAL(uint32_t,    fMxcsr);
    37423729            IEM_MC_LOCAL(RTFLOAT64U,  r64Dst);
    3743             IEM_MC_ARG_LOCAL_REF(uint32_t *,    pfMxcsr, fMxcsr,  0);
    3744             IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U,   pr64Dst, r64Dst,  1);
    3745             IEM_MC_ARG(const int64_t *,         pi64Src,          2);
     3730            IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U,   pr64Dst, r64Dst,  0);
     3731            IEM_MC_ARG(const int64_t *,         pi64Src,          1);
    37463732
    37473733            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    37483734            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    3749             IEM_MC_PREPARE_SSE_USAGE(); /** @todo This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3735            IEM_MC_PREPARE_SSE_USAGE(); /** @todo This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    37503736
    37513737            IEM_MC_REF_GREG_I64_CONST(pi64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    3752             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsi2sd_r64_i64, pfMxcsr, pr64Dst, pi64Src);
    3753             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3738            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2sd_r64_i64, pr64Dst, pi64Src);
    37543739            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    37553740                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    37663751            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    37673752            IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
    3768             IEM_MC_LOCAL(uint32_t,   fMxcsr);
    37693753            IEM_MC_LOCAL(RTFLOAT64U, r64Dst);
    37703754            IEM_MC_LOCAL(int64_t,    i64Src);
    3771             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    3772             IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U,       pr64Dst, r64Dst,     1);
    3773             IEM_MC_ARG_LOCAL_REF(const int64_t *,   pi64Src, i64Src,     2);
     3755            IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U,       pr64Dst, r64Dst,     0);
     3756            IEM_MC_ARG_LOCAL_REF(const int64_t *,   pi64Src, i64Src,     1);
    37743757
    37753758            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    37763759            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    37773760            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    3778             IEM_MC_PREPARE_SSE_USAGE(); /** @todo This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3761            IEM_MC_PREPARE_SSE_USAGE(); /** @todo This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    37793762
    37803763            IEM_MC_FETCH_MEM_I64(i64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    3781             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsi2sd_r64_i64, pfMxcsr, pr64Dst, pi64Src);
    3782             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3764            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2sd_r64_i64, pr64Dst, pi64Src);
    37833765            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    37843766                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    37973779            /* XMM, greg32 */
    37983780            IEM_MC_BEGIN(0, 0);
    3799             IEM_MC_LOCAL(uint32_t,   fMxcsr);
    38003781            IEM_MC_LOCAL(RTFLOAT64U, r64Dst);
    3801             IEM_MC_ARG_LOCAL_REF(uint32_t *,  pfMxcsr, fMxcsr,     0);
    3802             IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U, pr64Dst, r64Dst,     1);
    3803             IEM_MC_ARG(const int32_t *,       pi32Src,             2);
     3782            IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U, pr64Dst, r64Dst,     0);
     3783            IEM_MC_ARG(const int32_t *,       pi32Src,             1);
    38043784
    38053785            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    38063786            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    3807             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3787            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    38083788
    38093789            IEM_MC_REF_GREG_I32_CONST(pi32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    3810             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsi2sd_r64_i32, pfMxcsr, pr64Dst, pi32Src);
    3811             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3790            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2sd_r64_i32, pr64Dst, pi32Src);
    38123791            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    38133792                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    38243803            IEM_MC_BEGIN(0, 0);
    38253804            IEM_MC_LOCAL(RTGCPTR,    GCPtrEffSrc);
    3826             IEM_MC_LOCAL(uint32_t,   fMxcsr);
    38273805            IEM_MC_LOCAL(RTFLOAT64U, r64Dst);
    38283806            IEM_MC_LOCAL(int32_t,    i32Src);
    3829             IEM_MC_ARG_LOCAL_REF(uint32_t *,       pfMxcsr, fMxcsr,     0);
    3830             IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U,      pr64Dst, r64Dst,     1);
    3831             IEM_MC_ARG_LOCAL_REF(const int32_t *,  pi32Src, i32Src,     2);
     3807            IEM_MC_ARG_LOCAL_REF(PRTFLOAT64U,      pr64Dst, r64Dst,     0);
     3808            IEM_MC_ARG_LOCAL_REF(const int32_t *,  pi32Src, i32Src,     1);
    38323809
    38333810            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    38343811            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    38353812            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    3836             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3813            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    38373814
    38383815            IEM_MC_FETCH_MEM_I32(i32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    3839             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsi2sd_r64_i32, pfMxcsr, pr64Dst, pi32Src);
    3840             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3816            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsi2sd_r64_i32, pr64Dst, pi32Src);
    38413817            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    38423818                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    40814057            /* greg64, XMM */
    40824058            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    4083             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    40844059            IEM_MC_LOCAL(int64_t,   i64Dst);
    4085             IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
    4086             IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     1);
    4087             IEM_MC_ARG(const uint32_t *,     pu32Src,             2);
     4060            IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     0);
     4061            IEM_MC_ARG(const uint32_t *,     pu32Src,             1);
    40884062
    40894063            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    40904064            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4091             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4065            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    40924066
    40934067            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    4094             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttss2si_i64_r32, pfMxcsr, pi64Dst, pu32Src);
    4095             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4068            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttss2si_i64_r32, pi64Dst, pu32Src);
    40964069            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    40974070                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    41084081            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    41094082            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    4110             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    41114083            IEM_MC_LOCAL(int64_t,   i64Dst);
    41124084            IEM_MC_LOCAL(uint32_t,  u32Src);
    4113             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    4114             IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     1);
    4115             IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     2);
     4085            IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     0);
     4086            IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     1);
    41164087
    41174088            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    41184089            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    41194090            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4120             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4091            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    41214092
    41224093            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    4123             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttss2si_i64_r32, pfMxcsr, pi64Dst, pu32Src);
    4124             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4094            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttss2si_i64_r32, pi64Dst, pu32Src);
    41254095            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    41264096                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    41394109            /* greg, XMM */
    41404110            IEM_MC_BEGIN(0, 0);
    4141             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    41424111            IEM_MC_LOCAL(int32_t,   i32Dst);
    4143             IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
    4144             IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     1);
    4145             IEM_MC_ARG(const uint32_t *,     pu32Src,             2);
     4112            IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     0);
     4113            IEM_MC_ARG(const uint32_t *,     pu32Src,             1);
    41464114
    41474115            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    41484116            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4149             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4117            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    41504118
    41514119            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    4152             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttss2si_i32_r32, pfMxcsr, pi32Dst, pu32Src);
    4153             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4120            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttss2si_i32_r32, pi32Dst, pu32Src);
    41544121            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    41554122                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    41664133            IEM_MC_BEGIN(0, 0);
    41674134            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    4168             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    41694135            IEM_MC_LOCAL(int32_t,   i32Dst);
    41704136            IEM_MC_LOCAL(uint32_t,  u32Src);
    4171             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    4172             IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     1);
    4173             IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     2);
     4137            IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     0);
     4138            IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     1);
    41744139
    41754140            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    41764141            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    41774142            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4178             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4143            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    41794144
    41804145            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    4181             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttss2si_i32_r32, pfMxcsr, pi32Dst, pu32Src);
    4182             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4146            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttss2si_i32_r32, pi32Dst, pu32Src);
    41834147            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    41844148                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    42064170            /* greg64, XMM */
    42074171            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    4208             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    42094172            IEM_MC_LOCAL(int64_t,   i64Dst);
    4210             IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
    4211             IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     1);
    4212             IEM_MC_ARG(const uint64_t *,     pu64Src,             2);
     4173            IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     0);
     4174            IEM_MC_ARG(const uint64_t *,     pu64Src,             1);
    42134175
    42144176            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    42154177            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4216             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4178            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    42174179
    42184180            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    4219             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttsd2si_i64_r64, pfMxcsr, pi64Dst, pu64Src);
    4220             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4181            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttsd2si_i64_r64, pi64Dst, pu64Src);
    42214182            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    42224183                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    42334194            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    42344195            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    4235             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    42364196            IEM_MC_LOCAL(int64_t,   i64Dst);
    42374197            IEM_MC_LOCAL(uint64_t,  u64Src);
    4238             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    4239             IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     1);
    4240             IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     2);
     4198            IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     0);
     4199            IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     1);
    42414200
    42424201            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    42434202            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    42444203            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4245             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4204            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    42464205
    42474206            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    4248             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttsd2si_i64_r64, pfMxcsr, pi64Dst, pu64Src);
    4249             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4207            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttsd2si_i64_r64, pi64Dst, pu64Src);
    42504208            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    42514209                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    42644222            /* greg, XMM */
    42654223            IEM_MC_BEGIN(0, 0);
    4266             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    42674224            IEM_MC_LOCAL(int32_t,   i32Dst);
    4268             IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
    4269             IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     1);
    4270             IEM_MC_ARG(const uint64_t *,     pu64Src,             2);
     4225            IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     0);
     4226            IEM_MC_ARG(const uint64_t *,     pu64Src,             1);
    42714227
    42724228            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    42734229            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4274             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4230            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    42754231
    42764232            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    4277             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttsd2si_i32_r64, pfMxcsr, pi32Dst, pu64Src);
    4278             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4233            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttsd2si_i32_r64, pi32Dst, pu64Src);
    42794234            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    42804235                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    42914246            IEM_MC_BEGIN(0, 0);
    42924247            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    4293             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    42944248            IEM_MC_LOCAL(int32_t,   i32Dst);
    42954249            IEM_MC_LOCAL(uint64_t,  u64Src);
    4296             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    4297             IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     1);
    4298             IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     2);
     4250            IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     0);
     4251            IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     1);
    42994252
    43004253            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    43014254            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    43024255            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4303             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4256            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    43044257
    43054258            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    4306             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttsd2si_i32_r64, pfMxcsr, pi32Dst, pu64Src);
    4307             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4259            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvttsd2si_i32_r64, pi32Dst, pu64Src);
    43084260            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    43094261                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    44694421            /* greg64, XMM */
    44704422            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    4471             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    44724423            IEM_MC_LOCAL(int64_t,   i64Dst);
    4473             IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
    4474             IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     1);
    4475             IEM_MC_ARG(const uint32_t *,     pu32Src,             2);
     4424            IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     0);
     4425            IEM_MC_ARG(const uint32_t *,     pu32Src,             1);
    44764426
    44774427            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    44784428            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4479             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4429            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    44804430
    44814431            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    4482             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtss2si_i64_r32, pfMxcsr, pi64Dst, pu32Src);
    4483             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4432            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtss2si_i64_r32, pi64Dst, pu32Src);
    44844433            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    44854434                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    44964445            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    44974446            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    4498             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    44994447            IEM_MC_LOCAL(int64_t,   i64Dst);
    45004448            IEM_MC_LOCAL(uint32_t,  u32Src);
    4501             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    4502             IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     1);
    4503             IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     2);
     4449            IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     0);
     4450            IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     1);
    45044451
    45054452            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    45064453            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    45074454            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4508             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4455            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    45094456
    45104457            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    4511             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtss2si_i64_r32, pfMxcsr, pi64Dst, pu32Src);
    4512             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4458            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtss2si_i64_r32, pi64Dst, pu32Src);
    45134459            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    45144460                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    45274473            /* greg, XMM */
    45284474            IEM_MC_BEGIN(0, 0);
    4529             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    45304475            IEM_MC_LOCAL(int32_t,   i32Dst);
    4531             IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
    4532             IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     1);
    4533             IEM_MC_ARG(const uint32_t *,     pu32Src,             2);
     4476            IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     0);
     4477            IEM_MC_ARG(const uint32_t *,     pu32Src,             1);
    45344478
    45354479            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    45364480            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4537             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4481            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    45384482
    45394483            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    4540             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtss2si_i32_r32, pfMxcsr, pi32Dst, pu32Src);
    4541             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4484            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtss2si_i32_r32,  pi32Dst, pu32Src);
    45424485            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    45434486                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    45544497            IEM_MC_BEGIN(0, 0);
    45554498            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    4556             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    45574499            IEM_MC_LOCAL(int32_t,   i32Dst);
    45584500            IEM_MC_LOCAL(uint32_t,  u32Src);
    4559             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    4560             IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     1);
    4561             IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     2);
     4501            IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     0);
     4502            IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     1);
    45624503
    45634504            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    45644505            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    45654506            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4566             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4507            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    45674508
    45684509            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    4569             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtss2si_i32_r32, pfMxcsr, pi32Dst, pu32Src);
    4570             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4510            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtss2si_i32_r32, pi32Dst, pu32Src);
    45714511            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    45724512                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    45944534            /* greg64, XMM */
    45954535            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    4596             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    45974536            IEM_MC_LOCAL(int64_t,   i64Dst);
    4598             IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
    4599             IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     1);
    4600             IEM_MC_ARG(const uint64_t *,     pu64Src,             2);
     4537            IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     0);
     4538            IEM_MC_ARG(const uint64_t *,     pu64Src,             1);
    46014539
    46024540            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    46034541            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4604             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4542            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    46054543
    46064544            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    4607             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsd2si_i64_r64, pfMxcsr, pi64Dst, pu64Src);
    4608             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4545            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsd2si_i64_r64, pi64Dst, pu64Src);
    46094546            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    46104547                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    46214558            IEM_MC_BEGIN(IEM_MC_F_64BIT, 0);
    46224559            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    4623             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    46244560            IEM_MC_LOCAL(int64_t,   i64Dst);
    46254561            IEM_MC_LOCAL(uint64_t,  u64Src);
    4626             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    4627             IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     1);
    4628             IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     2);
     4562            IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     0);
     4563            IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     1);
    46294564
    46304565            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     
    46344569
    46354570            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    4636             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsd2si_i64_r64, pfMxcsr, pi64Dst, pu64Src);
    4637             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4571            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsd2si_i64_r64, pi64Dst, pu64Src);
    46384572            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    46394573                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    46524586            /* greg32, XMM */
    46534587            IEM_MC_BEGIN(0, 0);
    4654             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    46554588            IEM_MC_LOCAL(int32_t,   i32Dst);
    4656             IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
    4657             IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     1);
    4658             IEM_MC_ARG(const uint64_t *,     pu64Src,             2);
     4589            IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     0);
     4590            IEM_MC_ARG(const uint64_t *,     pu64Src,             1);
    46594591
    46604592            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    46614593            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4662             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4594            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    46634595
    46644596            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
    4665             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsd2si_i32_r64, pfMxcsr, pi32Dst, pu64Src);
    4666             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4597            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsd2si_i32_r64, pi32Dst, pu64Src);
    46674598            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    46684599                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    46794610            IEM_MC_BEGIN(0, 0);
    46804611            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    4681             IEM_MC_LOCAL(uint32_t,  fMxcsr);
    46824612            IEM_MC_LOCAL(int32_t,   i32Dst);
    46834613            IEM_MC_LOCAL(uint64_t,  u64Src);
    4684             IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
    4685             IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     1);
    4686             IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     2);
     4614            IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     0);
     4615            IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     1);
    46874616
    46884617            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    46894618            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    46904619            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    4691             IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4620            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_2() is calling this but the tstIEMCheckMc testcase depends on it. */
    46924621
    46934622            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    4694             IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsd2si_i32_r64, pfMxcsr, pi32Dst, pu64Src);
    4695             IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4623            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_cvtsd2si_i32_r64, pi32Dst, pu64Src);
    46964624            IEM_MC_IF_MXCSR_XCPT_PENDING() {
    46974625                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    47254653        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    47264654        IEM_MC_LOCAL(uint32_t, fEFlags);
    4727         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    4728         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    4729         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
    4730         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     4655        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     4656        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
     4657        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
    47314658        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    47324659        IEM_MC_PREPARE_SSE_USAGE();
    47334660        IEM_MC_FETCH_EFLAGS(fEFlags);
    4734         IEM_MC_REF_MXCSR(pfMxcsr);
    47354661        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    47364662        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    4737         IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_ucomiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4663        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomiss_u128, pEFlags, puSrc1, puSrc2);
    47384664        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    47394665            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    47524678        IEM_MC_BEGIN(0, 0);
    47534679        IEM_MC_LOCAL(uint32_t, fEFlags);
    4754         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    4755         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    4756         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4680        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     4681        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    47574682        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    4758         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     4683        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
    47594684        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    47604685
     
    47664691        IEM_MC_PREPARE_SSE_USAGE();
    47674692        IEM_MC_FETCH_EFLAGS(fEFlags);
    4768         IEM_MC_REF_MXCSR(pfMxcsr);
    47694693        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    4770         IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_ucomiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4694        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomiss_u128, pEFlags, puSrc1, puSrc2);
    47714695        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    47724696            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    47994723        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    48004724        IEM_MC_LOCAL(uint32_t, fEFlags);
    4801         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    4802         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    4803         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
    4804         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     4725        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     4726        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
     4727        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
    48054728        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    48064729        IEM_MC_PREPARE_SSE_USAGE();
    48074730        IEM_MC_FETCH_EFLAGS(fEFlags);
    4808         IEM_MC_REF_MXCSR(pfMxcsr);
    48094731        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    48104732        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    4811         IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_ucomisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4733        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomisd_u128, pEFlags, puSrc1, puSrc2);
    48124734        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    48134735            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    48264748        IEM_MC_BEGIN(0, 0);
    48274749        IEM_MC_LOCAL(uint32_t, fEFlags);
    4828         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    4829         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    4830         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4750        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     4751        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    48314752        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    4832         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     4753        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
    48334754        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    48344755
     
    48404761        IEM_MC_PREPARE_SSE_USAGE();
    48414762        IEM_MC_FETCH_EFLAGS(fEFlags);
    4842         IEM_MC_REF_MXCSR(pfMxcsr);
    48434763        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    4844         IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_ucomisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4764        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_ucomisd_u128, pEFlags, puSrc1, puSrc2);
    48454765        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    48464766            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    48774797        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse);
    48784798        IEM_MC_LOCAL(uint32_t, fEFlags);
    4879         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    4880         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    4881         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
    4882         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     4799        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     4800        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
     4801        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
    48834802        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    48844803        IEM_MC_PREPARE_SSE_USAGE();
    48854804        IEM_MC_FETCH_EFLAGS(fEFlags);
    4886         IEM_MC_REF_MXCSR(pfMxcsr);
    48874805        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    48884806        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    4889         IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_comiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4807        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comiss_u128, pEFlags, puSrc1, puSrc2);
    48904808        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    48914809            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    49044822        IEM_MC_BEGIN(0, 0);
    49054823        IEM_MC_LOCAL(uint32_t, fEFlags);
    4906         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    4907         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    4908         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4824        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     4825        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    49094826        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    4910         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     4827        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
    49114828        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    49124829
     
    49184835        IEM_MC_PREPARE_SSE_USAGE();
    49194836        IEM_MC_FETCH_EFLAGS(fEFlags);
    4920         IEM_MC_REF_MXCSR(pfMxcsr);
    49214837        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    4922         IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_comiss_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4838        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comiss_u128, pEFlags, puSrc1, puSrc2);
    49234839        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    49244840            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    49514867        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse2);
    49524868        IEM_MC_LOCAL(uint32_t, fEFlags);
    4953         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    4954         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    4955         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
    4956         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     4869        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     4870        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
     4871        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
    49574872        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    49584873        IEM_MC_PREPARE_SSE_USAGE();
    49594874        IEM_MC_FETCH_EFLAGS(fEFlags);
    4960         IEM_MC_REF_MXCSR(pfMxcsr);
    49614875        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    49624876        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    4963         IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_comisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4877        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comisd_u128, pEFlags, puSrc1, puSrc2);
    49644878        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    49654879            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    49784892        IEM_MC_BEGIN(0, 0);
    49794893        IEM_MC_LOCAL(uint32_t, fEFlags);
    4980         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    4981         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    4982         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     4894        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     4895        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    49834896        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    4984         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     4897        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
    49854898        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    49864899
     
    49924905        IEM_MC_PREPARE_SSE_USAGE();
    49934906        IEM_MC_FETCH_EFLAGS(fEFlags);
    4994         IEM_MC_REF_MXCSR(pfMxcsr);
    49954907        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    4996         IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_comisd_u128, pfMxcsr, pEFlags, puSrc1, puSrc2);
     4908        IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_comisd_u128, pEFlags, puSrc1, puSrc2);
    49974909        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    49984910            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r104076 r104129  
    22962296        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    22972297        IEM_MC_LOCAL(uint32_t, fEFlags);
    2298         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    2299         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    2300         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
    2301         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     2298        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     2299        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
     2300        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
    23022301        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    23032302        IEM_MC_PREPARE_AVX_USAGE();
    23042303        IEM_MC_FETCH_EFLAGS(fEFlags);
    2305         IEM_MC_REF_MXCSR(pfMxcsr);
    23062304        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    23072305        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    2308         IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomiss_u128, iemAImpl_vucomiss_u128_fallback),
    2309                                  pfMxcsr, pEFlags, puSrc1, puSrc2);
     2306        IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomiss_u128, iemAImpl_vucomiss_u128_fallback),
     2307                                   pEFlags, puSrc1, puSrc2);
    23102308        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    23112309            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    23242322        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    23252323        IEM_MC_LOCAL(uint32_t, fEFlags);
    2326         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    2327         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    2328         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2324        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     2325        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    23292326        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    2330         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     2327        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
    23312328        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    23322329
     
    23382335        IEM_MC_PREPARE_AVX_USAGE();
    23392336        IEM_MC_FETCH_EFLAGS(fEFlags);
    2340         IEM_MC_REF_MXCSR(pfMxcsr);
    23412337        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    2342         IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomiss_u128, iemAImpl_vucomiss_u128_fallback),
    2343                                  pfMxcsr, pEFlags, puSrc1, puSrc2);
     2338        IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomiss_u128, iemAImpl_vucomiss_u128_fallback),
     2339                                   pEFlags, puSrc1, puSrc2);
    23442340        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    23452341            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    23722368        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    23732369        IEM_MC_LOCAL(uint32_t, fEFlags);
    2374         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    2375         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    2376         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
    2377         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     2370        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     2371        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
     2372        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
    23782373        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    23792374        IEM_MC_PREPARE_AVX_USAGE();
    23802375        IEM_MC_FETCH_EFLAGS(fEFlags);
    2381         IEM_MC_REF_MXCSR(pfMxcsr);
    23822376        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    23832377        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    2384         IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomisd_u128, iemAImpl_vucomisd_u128_fallback),
    2385                                  pfMxcsr, pEFlags, puSrc1, puSrc2);
     2378        IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomisd_u128, iemAImpl_vucomisd_u128_fallback),
     2379                                   pEFlags, puSrc1, puSrc2);
    23862380        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    23872381            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    24002394        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    24012395        IEM_MC_LOCAL(uint32_t, fEFlags);
    2402         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    2403         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    2404         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2396        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     2397        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    24052398        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    2406         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     2399        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
    24072400        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    24082401
     
    24142407        IEM_MC_PREPARE_AVX_USAGE();
    24152408        IEM_MC_FETCH_EFLAGS(fEFlags);
    2416         IEM_MC_REF_MXCSR(pfMxcsr);
    24172409        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    2418         IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomisd_u128, iemAImpl_vucomisd_u128_fallback),
    2419                                  pfMxcsr, pEFlags, puSrc1, puSrc2);
     2410        IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomisd_u128, iemAImpl_vucomisd_u128_fallback),
     2411                                   pEFlags, puSrc1, puSrc2);
    24202412        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    24212413            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    24512443        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    24522444        IEM_MC_LOCAL(uint32_t, fEFlags);
    2453         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    2454         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    2455         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
    2456         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     2445        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     2446        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
     2447        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
    24572448        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    24582449        IEM_MC_PREPARE_AVX_USAGE();
    24592450        IEM_MC_FETCH_EFLAGS(fEFlags);
    2460         IEM_MC_REF_MXCSR(pfMxcsr);
    24612451        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    24622452        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    2463         IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomiss_u128, iemAImpl_vcomiss_u128_fallback),
    2464                                  pfMxcsr, pEFlags, puSrc1, puSrc2);
     2453        IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomiss_u128, iemAImpl_vcomiss_u128_fallback),
     2454                                   pEFlags, puSrc1, puSrc2);
    24652455        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    24662456            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    24792469        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    24802470        IEM_MC_LOCAL(uint32_t, fEFlags);
    2481         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    2482         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    2483         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2471        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     2472        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    24842473        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    2485         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     2474        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
    24862475        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    24872476
     
    24932482        IEM_MC_PREPARE_AVX_USAGE();
    24942483        IEM_MC_FETCH_EFLAGS(fEFlags);
    2495         IEM_MC_REF_MXCSR(pfMxcsr);
    24962484        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    2497         IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomiss_u128, iemAImpl_vcomiss_u128_fallback),
    2498                                  pfMxcsr, pEFlags, puSrc1, puSrc2);
     2485        IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomiss_u128, iemAImpl_vcomiss_u128_fallback),
     2486                                   pEFlags, puSrc1, puSrc2);
    24992487        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    25002488            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    25272515        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    25282516        IEM_MC_LOCAL(uint32_t, fEFlags);
    2529         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    2530         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    2531         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
    2532         IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             3);
     2517        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     2518        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
     2519        IEM_MC_ARG(PCX86XMMREG,                 puSrc2,             2);
    25332520        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    25342521        IEM_MC_PREPARE_AVX_USAGE();
    25352522        IEM_MC_FETCH_EFLAGS(fEFlags);
    2536         IEM_MC_REF_MXCSR(pfMxcsr);
    25372523        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    25382524        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    2539         IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomisd_u128, iemAImpl_vcomisd_u128_fallback),
    2540                                  pfMxcsr, pEFlags, puSrc1, puSrc2);
     2525        IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomisd_u128, iemAImpl_vcomisd_u128_fallback),
     2526                                   pEFlags, puSrc1, puSrc2);
    25412527        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    25422528            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    25552541        IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0);
    25562542        IEM_MC_LOCAL(uint32_t, fEFlags);
    2557         IEM_MC_ARG(uint32_t *,                  pfMxcsr,            0);
    2558         IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   1);
    2559         IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             2);
     2543        IEM_MC_ARG_LOCAL_REF(uint32_t *,        pEFlags, fEFlags,   0);
     2544        IEM_MC_ARG(PCX86XMMREG,                 puSrc1,             1);
    25602545        IEM_MC_LOCAL(X86XMMREG,                 uSrc2);
    2561         IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      3);
     2546        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,       puSrc2, uSrc2,      2);
    25622547        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    25632548
     
    25692554        IEM_MC_PREPARE_AVX_USAGE();
    25702555        IEM_MC_FETCH_EFLAGS(fEFlags);
    2571         IEM_MC_REF_MXCSR(pfMxcsr);
    25722556        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    2573         IEM_MC_CALL_VOID_AIMPL_4(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomisd_u128, iemAImpl_vcomisd_u128_fallback),
    2574                                  pfMxcsr, pEFlags, puSrc1, puSrc2);
     2557        IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomisd_u128, iemAImpl_vcomisd_u128_fallback),
     2558                                   pEFlags, puSrc1, puSrc2);
    25752559        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    25762560            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.cpp

    r104099 r104129  
    10811081#define IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE()                                                 NOP()
    10821082
    1083 #define IEM_MC_STORE_SSE_RESULT(a_SseData, a_iXmmReg)                                           IEM_LIVENESS_MXCSR_MODIFY() //; IEM_LIVENESS_XREG_CLOBBER(a_iXmmReg)
     1083#define IEM_MC_STORE_SSE_RESULT(a_SseData, a_iXmmReg)                                           NOP() //IEM_LIVENESS_XREG_CLOBBER(a_iXmmReg)
    10841084#define IEM_MC_SSE_UPDATE_MXCSR(a_fMxcsr)                                                       IEM_LIVENESS_MXCSR_MODIFY()
    10851085
     
    10941094#define IEM_MC_CALL_MMX_AIMPL_2(a_pfnAImpl, a0, a1)                                             NOP()
    10951095#define IEM_MC_CALL_MMX_AIMPL_3(a_pfnAImpl, a0, a1, a2)                                         NOP()
    1096 #define IEM_MC_CALL_SSE_AIMPL_2(a_pfnAImpl, a0, a1)                                             NOP()
    1097 #define IEM_MC_CALL_SSE_AIMPL_3(a_pfnAImpl, a0, a1, a2)                                         NOP()
     1096#define IEM_MC_CALL_SSE_AIMPL_2(a_pfnAImpl, a0, a1)                                             IEM_LIVENESS_MXCSR_MODIFY()
     1097#define IEM_MC_CALL_SSE_AIMPL_3(a_pfnAImpl, a0, a1, a2)                                         IEM_LIVENESS_MXCSR_MODIFY()
    10981098#define IEM_MC_CALL_AVX_AIMPL_2(a_pfnAImpl, a0, a1)                                             NOP()
    10991099#define IEM_MC_CALL_AVX_AIMPL_3(a_pfnAImpl, a0, a1, a2)                                         NOP()
     1100#define IEM_MC_CALL_AVX_AIMPL_NEW_3(a_pfnAImpl, a0, a1, a2)                                     IEM_LIVENESS_MXCSR_MODIFY()
    11001101
    11011102#define IEM_LIVENESS_ONE_STATUS_EFLAG_INPUT(a_fBit) \
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h

    r104107 r104129  
    11501150#ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
    11511151#define IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT() \
    1152     off = iemNativeEmitSimdMaybeRaiseSseAvxSimdFpOrUdXcpt(pReNative, off)
     1152    off = iemNativeEmitSimdMaybeRaiseSseAvxSimdFpOrUdXcpt(pReNative, off, pCallEntry->idxInstr)
    11531153
    11541154/** Emits code for IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT. */
    11551155DECL_INLINE_THROW(uint32_t)
    1156 iemNativeEmitSimdMaybeRaiseSseAvxSimdFpOrUdXcpt(PIEMRECOMPILERSTATE pReNative, uint32_t off)
    1157 {
     1156iemNativeEmitSimdMaybeRaiseSseAvxSimdFpOrUdXcpt(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr)
     1157{
     1158    /*
     1159     * Make sure we don't have any outstanding guest register writes as we may
     1160     * raise an \#UD or \#XF and all guest register must be up to date in CPUMCTX.
     1161     */
     1162    off = iemNativeRegFlushPendingWrites(pReNative, off);
     1163
     1164#ifdef IEMNATIVE_WITH_INSTRUCTION_COUNTING
     1165    off = iemNativeEmitStoreImmToVCpuU8(pReNative, off, idxInstr, RT_UOFFSETOF(VMCPUCC, iem.s.idxTbCurInstr));
     1166#else
     1167    RT_NOREF(idxInstr);
     1168#endif
     1169
    11581170    uint8_t const idxLabelRaiseSseAvxFpRelated = iemNativeLabelCreate(pReNative, kIemNativeLabelType_RaiseSseAvxFpRelated);
    11591171    uint8_t const idxRegMxCsr = iemNativeRegAllocTmpForGuestReg(pReNative, &off, kIemNativeGstReg_MxCsr, kIemNativeGstRegUse_ReadOnly);
     
    85508562
    85518563
    8552 #define IEM_MC_SSE_UPDATE_MXCSR(a_fMxcsr) \
    8553     off = iemNativeEmitSimdSseUpdateMxcsr(pReNative, off, a_fMxcsr)
    8554 
    8555 /** Emits code for IEM_MC_SSE_UPDATE_MXCSR. */
    8556 DECL_INLINE_THROW(uint32_t)
    8557 iemNativeEmitSimdSseUpdateMxcsr(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxMxCsrVar)
    8558 {
    8559     IEMNATIVE_ASSERT_VAR_IDX(pReNative, idxMxCsrVar);
    8560     IEMNATIVE_ASSERT_VAR_SIZE(pReNative, idxMxCsrVar, sizeof(uint32_t));
    8561 
    8562     uint8_t const idxRegMxCsr    = iemNativeRegAllocTmpForGuestReg(pReNative, &off, kIemNativeGstReg_MxCsr, kIemNativeGstRegUse_ForUpdate);
    8563     uint8_t const idxVarRegMxCsr = iemNativeVarRegisterAcquire(pReNative, idxMxCsrVar, &off, true /*fInitalized*/);
    8564     uint8_t const idxVarRegTmp   = iemNativeRegAllocTmp(pReNative, &off);
    8565 
    8566     /** @todo r=aeichner I think it would be safe to spare the temporary register and trash
    8567      *                   the variable MXCSR register as it isn't used afterwards in the microcode block anyway.
    8568      *                   Needs verification though, so play it safe for now.
    8569      */
    8570     /* mov tmp, varmxcsr */
    8571     off = iemNativeEmitLoadGprFromGpr32(pReNative, off, idxVarRegTmp, idxVarRegMxCsr);
    8572     /* and tmp, X86_MXCSR_XCPT_FLAGS */
    8573     off = iemNativeEmitAndGpr32ByImm(pReNative, off, idxVarRegTmp, X86_MXCSR_XCPT_FLAGS);
    8574     /* or mxcsr, tmp */
    8575     off = iemNativeEmitOrGpr32ByGpr(pReNative, off, idxRegMxCsr, idxVarRegTmp);
    8576 
    8577     /* Writeback the MXCSR register value (there is no delayed writeback for such registers at the moment). */
    8578     off = iemNativeEmitStoreGprToVCpuU32(pReNative, off, idxRegMxCsr, RT_UOFFSETOF_DYN(VMCPU, cpum.GstCtx.XState.x87.MXCSR));
    8579 
    8580     /* Free but don't flush the MXCSR register. */
    8581     iemNativeRegFreeTmp(pReNative, idxRegMxCsr);
    8582     iemNativeVarRegisterRelease(pReNative, idxMxCsrVar);
    8583     iemNativeRegFreeTmp(pReNative, idxVarRegTmp);
    8584 
    8585     return off;
    8586 }
    8587 
    8588 
    85898564#define IEM_MC_STORE_SSE_RESULT(a_SseData, a_iXmmReg) \
    85908565    off = iemNativeEmitSimdSseStoreResult(pReNative, off, a_SseData, a_iXmmReg)
     
    85928567/** Emits code for IEM_MC_STORE_SSE_RESULT. */
    85938568DECL_INLINE_THROW(uint32_t)
    8594 iemNativeEmitSimdSseStoreResult(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxSseDataVar, uint8_t iXReg)
    8595 {
    8596     IEMNATIVE_ASSERT_VAR_IDX(pReNative, idxSseDataVar);
    8597     IEMNATIVE_ASSERT_VAR_SIZE(pReNative, idxSseDataVar, sizeof(IEMSSERESULT));
    8598 
    8599     /** @todo r=aeichner We probably need to rework this MC statement and the users to make thing more efficient. */
    8600     uint8_t const idxSimdRegDst    = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(iXReg),
    8601                                                                              kIemNativeGstSimdRegLdStSz_Low128, kIemNativeGstRegUse_ForFullWrite);
    8602     uint8_t const idxRegMxCsr      = iemNativeRegAllocTmpForGuestReg(pReNative, &off, kIemNativeGstReg_MxCsr, kIemNativeGstRegUse_ForUpdate);
    8603     uint8_t const idxVarRegResAddr = iemNativeRegAllocTmp(pReNative, &off);
    8604     uint8_t const idxRegTmp        = iemNativeRegAllocTmp(pReNative, &off);
    8605 
    8606     off = iemNativeEmitLoadArgGregWithVarAddr(pReNative, off, idxVarRegResAddr, idxSseDataVar, false /*fFlushShadows*/);
    8607 
    8608     /* Update MXCSR. */
    8609     off = iemNativeEmitLoadGprByGprU32(pReNative, off, idxRegTmp, idxVarRegResAddr, RT_UOFFSETOF_DYN(IEMSSERESULT, MXCSR));
    8610     /* tmp &= X86_MXCSR_XCPT_FLAGS. */
    8611     off = iemNativeEmitAndGpr32ByImm(pReNative, off, idxRegTmp, X86_MXCSR_XCPT_FLAGS);
    8612     /* mxcsr |= tmp */
    8613     off = iemNativeEmitOrGpr32ByGpr(pReNative, off, idxRegMxCsr, idxRegTmp);
    8614 
    8615     /* Writeback the MXCSR register value (there is no delayed writeback for such registers at the moment). */
    8616     off = iemNativeEmitStoreGprToVCpuU32(pReNative, off, idxRegMxCsr, RT_UOFFSETOF_DYN(VMCPU, cpum.GstCtx.XState.x87.MXCSR));
     8569iemNativeEmitSimdSseStoreResult(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxSseRes, uint8_t iXReg)
     8570{
     8571    IEMNATIVE_ASSERT_VAR_IDX(pReNative, idxSseRes);
     8572    IEMNATIVE_ASSERT_VAR_SIZE(pReNative, idxSseRes, sizeof(X86XMMREG));
     8573
     8574    /* The ForUpdate is important as we might end up not writing the result value to the register in case of an unmasked exception. */
     8575    uint8_t const idxSimdRegDst = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(iXReg),
     8576                                                                          kIemNativeGstSimdRegLdStSz_Low128, kIemNativeGstRegUse_ForUpdate);
     8577    uint8_t const idxVarRegRes  = iemNativeVarSimdRegisterAcquire(pReNative, idxSseRes, &off, true /*fInitalized*/);
     8578    uint8_t const idxRegMxCsr   = iemNativeRegAllocTmpForGuestReg(pReNative, &off, kIemNativeGstReg_MxCsr, kIemNativeGstRegUse_ReadOnly);
     8579    uint8_t const idxRegTmp     = iemNativeRegAllocTmp(pReNative, &off);
    86178580
    86188581    /* Update the value if there is no unmasked exception. */
     
    86318594    uint32_t offFixup = off;
    86328595    off = iemNativeEmitJnzToFixed(pReNative, off, off);
    8633     AssertCompileMemberSize(IEMSSERESULT, uResult, sizeof(RTFLOAT128U));
    8634     off = iemNativeEmitLoadVecRegByGprU128(pReNative, off, idxSimdRegDst, idxVarRegResAddr, RT_UOFFSETOF_DYN(IEMSSERESULT, uResult));
     8596    off = iemNativeEmitSimdLoadVecRegFromVecRegU128(pReNative, off, idxSimdRegDst, idxVarRegRes);
    86358597    iemNativeFixupFixedJump(pReNative, offFixup, off);
    86368598
    86378599    /* Free but don't flush the shadowed register. */
     8600    iemNativeVarRegisterRelease(pReNative, idxSseRes);
    86388601    iemNativeSimdRegFreeTmp(pReNative, idxSimdRegDst);
    86398602    iemNativeRegFreeTmp(pReNative, idxRegMxCsr);
    8640     iemNativeRegFreeTmp(pReNative, idxVarRegResAddr);
    86418603    iemNativeRegFreeTmp(pReNative, idxRegTmp);
    86428604
     
    86558617iemNativeEmitCallSseAImplCommon(PIEMRECOMPILERSTATE pReNative, uint32_t off, uintptr_t pfnAImpl, uint8_t cArgs)
    86568618{
     8619    /* Grab the MXCSR register, it must not be call volatile or we end up freeing it when setting up the call below. */
     8620    uint8_t const  idxRegMxCsr = iemNativeRegAllocTmpForGuestReg(pReNative, &off, kIemNativeGstReg_MxCsr,
     8621                                                                 kIemNativeGstRegUse_ForUpdate, true /*fNoVolatileRegs*/);
     8622    AssertRelease(!(RT_BIT_32(idxRegMxCsr) & IEMNATIVE_CALL_VOLATILE_GREG_MASK));
     8623
    86578624    /*
    86588625     * Need to do the FPU preparation.
     
    86638630     * Do all the call setup and cleanup.
    86648631     */
    8665     off = iemNativeEmitCallCommon(pReNative, off, cArgs + IEM_SSE_AIMPL_HIDDEN_ARGS, IEM_SSE_AIMPL_HIDDEN_ARGS);
     8632    off = iemNativeEmitCallCommon(pReNative, off, cArgs + IEM_SSE_AIMPL_HIDDEN_ARGS, IEM_SSE_AIMPL_HIDDEN_ARGS, false /*fFlushPendingWrites*/);
    86668633
    86678634    /*
    8668      * Load the XState::x87 pointer.
     8635     * Load the MXCSR register into the first argument and mask out the current exception flags.
    86698636     */
    8670     off = iemNativeEmitLeaGprByGstRegRef(pReNative, off, IEMNATIVE_CALL_ARG0_GREG, kIemNativeGstRegRef_X87, 0 /*idxRegInClass*/);
     8637    off = iemNativeEmitLoadGprFromGpr32(pReNative, off, IEMNATIVE_CALL_ARG0_GREG, idxRegMxCsr);
     8638    off = iemNativeEmitAndGpr32ByImm(pReNative, off, IEMNATIVE_CALL_ARG0_GREG, ~X86_MXCSR_XCPT_FLAGS);
    86718639
    86728640    /*
     
    86758643    off = iemNativeEmitCallImm(pReNative, off, pfnAImpl);
    86768644
     8645    /*
     8646     * The updated MXCSR is in the return register.
     8647     */
     8648    off = iemNativeEmitLoadGprFromGpr32(pReNative, off, idxRegMxCsr, IEMNATIVE_CALL_RET_GREG);
     8649
     8650#ifndef IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK
     8651    /* Writeback the MXCSR register value (there is no delayed writeback for such registers at the moment). */
     8652    off = iemNativeEmitStoreGprToVCpuU32(pReNative, off, idxRegMxCsr, RT_UOFFSETOF_DYN(VMCPU, cpum.GstCtx.XState.x87.MXCSR));
     8653#endif
     8654    iemNativeRegFreeTmp(pReNative, idxRegMxCsr);
     8655
    86778656    return off;
    86788657}
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r104115 r104129  
    26402640    uint8_t const idxHstReg = pReNative->Core.aidxGstRegShadows[enmGstReg];
    26412641
    2642     Assert(enmGstReg >= kIemNativeGstReg_GprFirst && enmGstReg <= kIemNativeGstReg_GprLast);
     2642    Assert(   (   enmGstReg >= kIemNativeGstReg_GprFirst
     2643               && enmGstReg <= kIemNativeGstReg_GprLast)
     2644           || enmGstReg == kIemNativeGstReg_MxCsr);
    26432645    Assert(   idxHstReg != UINT8_MAX
    26442646           && pReNative->Core.bmGstRegShadowDirty & RT_BIT_64(enmGstReg));
     
    33243326        if (   (   enmIntendedUse == kIemNativeGstRegUse_ForFullWrite
    33253327                || enmIntendedUse == kIemNativeGstRegUse_ForUpdate)
    3326             && enmGstReg >= kIemNativeGstReg_GprFirst
    3327             && enmGstReg <= kIemNativeGstReg_GprLast
    3328             )
     3328            && (   (   enmGstReg >= kIemNativeGstReg_GprFirst
     3329                    && enmGstReg <= kIemNativeGstReg_GprLast)
     3330                || enmGstReg == kIemNativeGstReg_MxCsr))
    33293331        {
    33303332# ifdef IEMNATIVE_WITH_TB_DEBUG_INFO
     
    33563358    if (   (   enmIntendedUse == kIemNativeGstRegUse_ForFullWrite
    33573359            || enmIntendedUse == kIemNativeGstRegUse_ForUpdate)
    3358         && enmGstReg >= kIemNativeGstReg_GprFirst
    3359         && enmGstReg <= kIemNativeGstReg_GprLast
    3360         )
     3360        && (   (   enmGstReg >= kIemNativeGstReg_GprFirst
     3361                && enmGstReg <= kIemNativeGstReg_GprLast)
     3362            || enmGstReg == kIemNativeGstReg_MxCsr))
    33613363    {
    33623364# ifdef IEMNATIVE_WITH_TB_DEBUG_INFO
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r104099 r104129  
    8282    'RTUINT128U':       (  128,   False, 'RTUINT128U',      ),
    8383    'X86XMMREG':        (  128,   False, 'X86XMMREG',       ),
    84     'IEMSSERESULT':     ( 128+32, False, 'IEMSSERESULT',    ),
    8584    'IEMMEDIAF2XMMSRC': (  256,   False, 'IEMMEDIAF2XMMSRC',),
    8685    'RTUINT256U':       (  256,   False, 'RTUINT256U',      ),
     
    18981897        'IEM_MC_CALL_AVX_AIMPL_4':                  '__aimpl_avx',
    18991898        'IEM_MC_CALL_AVX_AIMPL_5':                  '__aimpl_avx',
     1899        'IEM_MC_CALL_AVX_AIMPL_NEW_3':              '__aimpl_avx',
    19001900    };
    19011901    def analyzeAndAnnotateName(self, aoStmts: List[iai.McStmt]):
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r104115 r104129  
    55
    66/*
    7  * Copyright (C) 2011-2023 Oracle and/or its affiliates.
     7 * Copyright (C) 2011-2024 Oracle and/or its affiliates.
    88 *
    99 * This file is part of VirtualBox base platform packages, as
     
    38503850FNIEMAIMPLF2EFL256 iemAImpl_vptest_u256, iemAImpl_vptest_u256_fallback;
    38513851
    3852 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2I32U64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint64_t *pu64Src)); /* pu64Src is a double precision floating point. */
     3852typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSSEF2I32U64,(uint32_t uMxCsrIn, int32_t *pi32Dst, const uint64_t *pu64Src)); /* pu64Src is a double precision floating point. */
    38533853typedef FNIEMAIMPLSSEF2I32U64 *PFNIEMAIMPLSSEF2I32U64;
    3854 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2I64U64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint64_t *pu64Src)); /* pu64Src is a double precision floating point. */
     3854typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSSEF2I64U64,(uint32_t uMxCsrIn, int64_t *pi64Dst, const uint64_t *pu64Src)); /* pu64Src is a double precision floating point. */
    38553855typedef FNIEMAIMPLSSEF2I64U64 *PFNIEMAIMPLSSEF2I64U64;
    3856 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2I32U32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint32_t *pu32Src)); /* pu32Src is a single precision floating point. */
     3856typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSSEF2I32U32,(uint32_t uMxCsrIn, int32_t *pi32Dst, const uint32_t *pu32Src)); /* pu32Src is a single precision floating point. */
    38573857typedef FNIEMAIMPLSSEF2I32U32 *PFNIEMAIMPLSSEF2I32U32;
    3858 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2I64U32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint32_t *pu32Src)); /* pu32Src is a single precision floating point. */
     3858typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSSEF2I64U32,(uint32_t uMxCsrIn, int64_t *pi64Dst, const uint32_t *pu32Src)); /* pu32Src is a single precision floating point. */
    38593859typedef FNIEMAIMPLSSEF2I64U32 *PFNIEMAIMPLSSEF2I64U32;
    38603860
     
    38713871FNIEMAIMPLSSEF2I64U32 iemAImpl_cvtss2si_i64_r32;
    38723872
    3873 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2R32I32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, PRTFLOAT32U pr32Dst, const int32_t *pi32Src));
     3873typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSSEF2R32I32,(uint32_t uMxCsrIn, PRTFLOAT32U pr32Dst, const int32_t *pi32Src));
    38743874typedef FNIEMAIMPLSSEF2R32I32 *PFNIEMAIMPLSSEF2R32I32;
    3875 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2R32I64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, PRTFLOAT32U pr32Dst, const int64_t *pi64Src));
     3875typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSSEF2R32I64,(uint32_t uMxCsrIn, PRTFLOAT32U pr32Dst, const int64_t *pi64Src));
    38763876typedef FNIEMAIMPLSSEF2R32I64 *PFNIEMAIMPLSSEF2R32I64;
    38773877
     
    38793879FNIEMAIMPLSSEF2R32I64 iemAImpl_cvtsi2ss_r32_i64;
    38803880
    3881 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2R64I32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, PRTFLOAT64U pr64Dst, const int32_t *pi32Src));
     3881typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSSEF2R64I32,(uint32_t uMxCsrIn, PRTFLOAT64U pr64Dst, const int32_t *pi32Src));
    38823882typedef FNIEMAIMPLSSEF2R64I32 *PFNIEMAIMPLSSEF2R64I32;
    3883 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2R64I64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, PRTFLOAT64U pr64Dst, const int64_t *pi64Src));
     3883typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLSSEF2R64I64,(uint32_t uMxCsrIn, PRTFLOAT64U pr64Dst, const int64_t *pi64Src));
    38843884typedef FNIEMAIMPLSSEF2R64I64 *PFNIEMAIMPLSSEF2R64I64;
    38853885
     
    38883888
    38893889
    3890 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLF2EFLMXCSR128,(uint32_t *pfMxcsr, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
     3890typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLF2EFLMXCSR128,(uint32_t uMxCsrIn, uint32_t *pfEFlags, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
    38913891typedef FNIEMAIMPLF2EFLMXCSR128 *PFNIEMAIMPLF2EFLMXCSR128;
    38923892
     
    42474247 * @{ */
    42484248/**
    4249  * A SSE result.
    4250  */
    4251 typedef struct IEMSSERESULT
    4252 {
    4253     /** The output value. */
    4254     X86XMMREG       uResult;
    4255     /** The output status. */
    4256     uint32_t        MXCSR;
    4257 } IEMSSERESULT;
    4258 AssertCompileMemberOffset(IEMSSERESULT, MXCSR, 128 / 8);
    4259 /** Pointer to a SSE result. */
    4260 typedef IEMSSERESULT *PIEMSSERESULT;
    4261 /** Pointer to a const SSE result. */
    4262 typedef IEMSSERESULT const *PCIEMSSERESULT;
    4263 
    4264 
    4265 /**
    42664249 * A AVX128 result.
    42674250 */
     
    42974280
    42984281
    4299 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPSSEF2U128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
     4282typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLFPSSEF2U128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
    43004283typedef FNIEMAIMPLFPSSEF2U128  *PFNIEMAIMPLFPSSEF2U128;
    4301 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPSSEF2U128R32,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2));
     4284typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLFPSSEF2U128R32,(uint32_t uMxCsrIn, PX86XMMREG Result, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2));
    43024285typedef FNIEMAIMPLFPSSEF2U128R32  *PFNIEMAIMPLFPSSEF2U128R32;
    4303 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPSSEF2U128R64,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2));
     4286typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLFPSSEF2U128R64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2));
    43044287typedef FNIEMAIMPLFPSSEF2U128R64  *PFNIEMAIMPLFPSSEF2U128R64;
    43054288
     
    54795462/** @name SSE+AVX SIMD access and helpers.
    54805463 * @{ */
    5481 void            iemSseStoreResult(PVMCPUCC pVCpu, PCIEMSSERESULT pResult, uint8_t iXmmReg) RT_NOEXCEPT;
    54825464void            iemSseUpdateMxcsr(PVMCPUCC pVCpu, uint32_t fMxcsr) RT_NOEXCEPT;
    54835465/** @} */
  • trunk/src/VBox/VMM/include/IEMMc.h

    r104099 r104129  
    29602960
    29612961/** Stores SSE SIMD result updating MXCSR. */
    2962 #define IEM_MC_STORE_SSE_RESULT(a_SseData, a_iXmmReg) \
    2963     iemSseStoreResult(pVCpu, &a_SseData, a_iXmmReg)
    2964 /** Updates MXCSR. */
    2965 #define IEM_MC_SSE_UPDATE_MXCSR(a_fMxcsr) \
    2966     iemSseUpdateMxcsr(pVCpu, a_fMxcsr)
     2962#define IEM_MC_STORE_SSE_RESULT(a_Res, a_iXmmReg) \
     2963    do { \
     2964        PCX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87; \
     2965        if ((  ~((pFpuCtx->MXCSR & X86_MXCSR_XCPT_MASK) >> X86_MXCSR_XCPT_MASK_SHIFT) \
     2966             & (pFpuCtx->MXCSR & X86_MXCSR_XCPT_FLAGS)) == 0) \
     2967            pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXmmReg)] = (a_Res); \
     2968    } while (0)
    29672969
    29682970/** Prepares for using the SSE state.
     
    30243026    do { \
    30253027        IEM_MC_PREPARE_SSE_USAGE(); \
    3026         a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0), (a1)); \
     3028        pVCpu->cpum.GstCtx.XState.x87.MXCSR = a_pfnAImpl(pVCpu->cpum.GstCtx.XState.x87.MXCSR & ~X86_MXCSR_XCPT_FLAGS, \
     3029                                                        (a0), (a1)); \
    30273030    } while (0)
    30283031
     
    30383041    do { \
    30393042        IEM_MC_PREPARE_SSE_USAGE(); \
    3040         a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0), (a1), (a2)); \
     3043        pVCpu->cpum.GstCtx.XState.x87.MXCSR = a_pfnAImpl(pVCpu->cpum.GstCtx.XState.x87.MXCSR & ~X86_MXCSR_XCPT_FLAGS, \
     3044                                                         (a0), (a1), (a2)); \
    30413045    } while (0)
    30423046
     
    30713075        IEM_MC_PREPARE_AVX_USAGE(); \
    30723076        a_pfnAImpl(&pVCpu->cpum.GstCtx.XState, (a1), (a2), (a3)); \
     3077    } while (0)
     3078
     3079/**
     3080 * Calls a AVX assembly implementation taking three visible arguments.
     3081 *
     3082 * @param   a_pfnAImpl      Pointer to the assembly SSE routine.
     3083 * @param   a0              The first extra argument.
     3084 * @param   a1              The second extra argument.
     3085 * @param   a2              The third extra argument.
     3086 *
     3087 * @note The and'ing with X86_MXCSR_XCPT_FLAGS is just a precaution as
     3088 *       the called helper should return an MXCSR with only new exception flags
     3089 *       added.
     3090 * @note This is temporarily required for the v(u)comis* stuff because
     3091 *       tstIEMAImpl will not compile otherwise, will be removed once the AVX
     3092 *       stuff is reworked, see @bugref{10641}
     3093 */
     3094#define IEM_MC_CALL_AVX_AIMPL_NEW_3(a_pfnAImpl, a0, a1, a2) \
     3095    do { \
     3096        IEM_MC_PREPARE_SSE_USAGE(); \
     3097        pVCpu->cpum.GstCtx.XState.x87.MXCSR |=   a_pfnAImpl(pVCpu->cpum.GstCtx.XState.x87.MXCSR, (a0), (a1), (a2)) \
     3098                                               & X86_MXCSR_XCPT_FLAGS; \
    30733099    } while (0)
    30743100
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp

    r104051 r104129  
    55
    66/*
    7  * Copyright (C) 2022-2023 Oracle and/or its affiliates.
     7 * Copyright (C) 2022-2024 Oracle and/or its affiliates.
    88 *
    99 * This file is part of VirtualBox base platform packages, as
     
    55945594    };
    55955595
    5596     X86FXSTATE State;
    5597     RT_ZERO(State);
    55985596    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    55995597    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR32); iFn++)
     
    56355633                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    56365634                    {
    5637                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    5638                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    5639                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    5640                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    5641                                     | X86_MXCSR_XCPT_MASK;
    5642                         IEMSSERESULT ResM; RT_ZERO(ResM);
    5643                         pfn(&State, &ResM, &TestData.InVal1, &TestData.InVal2);
    5644                         TestData.fMxcsrIn  = State.MXCSR;
    5645                         TestData.fMxcsrOut = ResM.MXCSR;
    5646                         TestData.OutVal    = ResM.uResult;
     5635                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     5636                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     5637                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     5638                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     5639                                          | X86_MXCSR_XCPT_MASK;
     5640                        X86XMMREG ResM; RT_ZERO(ResM);
     5641                        uint32_t uMxCsrOutM = pfn(uMxCsrIn, &ResM, &TestData.InVal1, &TestData.InVal2);
     5642                        TestData.fMxcsrIn  = uMxCsrIn;
     5643                        TestData.fMxcsrOut = uMxCsrOutM;
     5644                        TestData.OutVal    = ResM;
    56475645                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    56485646
    5649                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
    5650                         IEMSSERESULT ResU; RT_ZERO(ResU);
    5651                         pfn(&State, &ResU, &TestData.InVal1, &TestData.InVal2);
    5652                         TestData.fMxcsrIn  = State.MXCSR;
    5653                         TestData.fMxcsrOut = ResU.MXCSR;
    5654                         TestData.OutVal    = ResU.uResult;
     5647                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
     5648                        X86XMMREG ResU; RT_ZERO(ResU);
     5649                        uint32_t uMxCsrOutU = pfn(uMxCsrIn, &ResU, &TestData.InVal1, &TestData.InVal2);
     5650                        TestData.fMxcsrIn  = uMxCsrIn;
     5651                        TestData.fMxcsrOut = uMxCsrOutU;
     5652                        TestData.OutVal    = ResU;
    56555653                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    56565654
    5657                         uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS;
     5655                        uint16_t fXcpt = (uMxCsrOutM | uMxCsrOutU) & X86_MXCSR_XCPT_FLAGS;
    56585656                        if (fXcpt)
    56595657                        {
    5660                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    5661                             IEMSSERESULT Res1; RT_ZERO(Res1);
    5662                             pfn(&State, &Res1, &TestData.InVal1, &TestData.InVal2);
    5663                             TestData.fMxcsrIn  = State.MXCSR;
    5664                             TestData.fMxcsrOut = Res1.MXCSR;
    5665                             TestData.OutVal    = Res1.uResult;
     5658                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     5659                            X86XMMREG Res1; RT_ZERO(Res1);
     5660                            uint32_t uMxCsrOut1 = pfn(uMxCsrIn, &Res1, &TestData.InVal1, &TestData.InVal2);
     5661                            TestData.fMxcsrIn  = uMxCsrIn;
     5662                            TestData.fMxcsrOut = uMxCsrOut1;
     5663                            TestData.OutVal    = Res1;
    56665664                            GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    56675665
    5668                             if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS))
     5666                            if (((uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS))
    56695667                            {
    5670                                 fXcpt |= Res1.MXCSR & X86_MXCSR_XCPT_FLAGS;
    5671                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    5672                                 IEMSSERESULT Res2; RT_ZERO(Res2);
    5673                                 pfn(&State, &Res2, &TestData.InVal1, &TestData.InVal2);
    5674                                 TestData.fMxcsrIn  = State.MXCSR;
    5675                                 TestData.fMxcsrOut = Res2.MXCSR;
    5676                                 TestData.OutVal    = Res2.uResult;
     5668                                fXcpt |= uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS;
     5669                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     5670                                X86XMMREG Res2; RT_ZERO(Res2);
     5671                                uint32_t uMxCsrOut2 = pfn(uMxCsrIn, &Res2, &TestData.InVal1, &TestData.InVal2);
     5672                                TestData.fMxcsrIn  = uMxCsrIn;
     5673                                TestData.fMxcsrOut = uMxCsrOut2;
     5674                                TestData.OutVal    = Res2;
    56775675                                GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    56785676                            }
     
    56815679                                    if (fUnmasked & fXcpt)
    56825680                                    {
    5683                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    5684                                         IEMSSERESULT Res3; RT_ZERO(Res3);
    5685                                         pfn(&State, &Res3, &TestData.InVal1, &TestData.InVal2);
    5686                                         TestData.fMxcsrIn  = State.MXCSR;
    5687                                         TestData.fMxcsrOut = Res3.MXCSR;
    5688                                         TestData.OutVal    = Res3.uResult;
     5681                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     5682                                        X86XMMREG Res3; RT_ZERO(Res3);
     5683                                        uint32_t uMxCsrOut3 = pfn(uMxCsrIn, &Res3, &TestData.InVal1, &TestData.InVal2);
     5684                                        TestData.fMxcsrIn  = uMxCsrIn;
     5685                                        TestData.fMxcsrOut = uMxCsrOut3;
     5686                                        TestData.OutVal    = Res3;
    56895687                                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    56905688                                    }
     
    57015699static void SseBinaryR32Test(void)
    57025700{
    5703     X86FXSTATE State;
    5704     RT_ZERO(State);
    57055701    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR32); iFn++)
    57065702    {
     
    57175713            for (uint32_t iTest = 0; iTest < cbTests / sizeof(paTests[0]); iTest++)
    57185714            {
    5719                 IEMSSERESULT Res; RT_ZERO(Res);
    5720 
    5721                 State.MXCSR = paTests[iTest].fMxcsrIn;
    5722                 pfn(&State, &Res, &paTests[iTest].InVal1, &paTests[iTest].InVal2);
    5723                 bool fValsIdentical =    RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[0], &paTests[iTest].OutVal.ar32[0])
    5724                                       && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[1], &paTests[iTest].OutVal.ar32[1])
    5725                                       && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[2], &paTests[iTest].OutVal.ar32[2])
    5726                                       && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[3], &paTests[iTest].OutVal.ar32[3]);
    5727                 if (   Res.MXCSR != paTests[iTest].fMxcsrOut
     5715                X86XMMREG Res; RT_ZERO(Res);
     5716
     5717                uint32_t uMxCsrOut = pfn(paTests[iTest].fMxcsrIn, &Res, &paTests[iTest].InVal1, &paTests[iTest].InVal2);
     5718                bool fValsIdentical =    RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[0], &paTests[iTest].OutVal.ar32[0])
     5719                                      && RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[1], &paTests[iTest].OutVal.ar32[1])
     5720                                      && RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[2], &paTests[iTest].OutVal.ar32[2])
     5721                                      && RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[3], &paTests[iTest].OutVal.ar32[3]);
     5722                if (   uMxCsrOut != paTests[iTest].fMxcsrOut
    57285723                    || !fValsIdentical)
    57295724                    RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s'%s'%s in2=%s'%s'%s'%s\n"
     
    57355730                                 FormatR32(&paTests[iTest].InVal2.ar32[0]), FormatR32(&paTests[iTest].InVal2.ar32[1]),
    57365731                                 FormatR32(&paTests[iTest].InVal2.ar32[2]), FormatR32(&paTests[iTest].InVal2.ar32[3]),
    5737                                  iVar ? "  " : "", Res.MXCSR,
    5738                                  FormatR32(&Res.uResult.ar32[0]), FormatR32(&Res.uResult.ar32[1]),
    5739                                  FormatR32(&Res.uResult.ar32[2]), FormatR32(&Res.uResult.ar32[3]),
     5732                                 iVar ? "  " : "", uMxCsrOut,
     5733                                 FormatR32(&Res.ar32[0]), FormatR32(&Res.ar32[1]),
     5734                                 FormatR32(&Res.ar32[2]), FormatR32(&Res.ar32[3]),
    57405735                                 iVar ? "  " : "", paTests[iTest].fMxcsrOut,
    57415736                                 FormatR32(&paTests[iTest].OutVal.ar32[0]), FormatR32(&paTests[iTest].OutVal.ar32[1]),
    57425737                                 FormatR32(&paTests[iTest].OutVal.ar32[2]), FormatR32(&paTests[iTest].OutVal.ar32[3]),
    5743                                  MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut),
     5738                                 MxcsrDiff(uMxCsrOut, paTests[iTest].fMxcsrOut),
    57445739                                 !fValsIdentical ? " - val" : "",
    57455740                                 FormatMxcsr(paTests[iTest].fMxcsrIn) );
     
    57865781    };
    57875782
    5788     X86FXSTATE State;
    5789     RT_ZERO(State);
    57905783    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    57915784    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR64); iFn++)
     
    58205813                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    58215814                    {
    5822                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    5823                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    5824                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    5825                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    5826                                     | X86_MXCSR_XCPT_MASK;
    5827                         IEMSSERESULT ResM; RT_ZERO(ResM);
    5828                         pfn(&State, &ResM, &TestData.InVal1, &TestData.InVal2);
    5829                         TestData.fMxcsrIn  = State.MXCSR;
    5830                         TestData.fMxcsrOut = ResM.MXCSR;
    5831                         TestData.OutVal    = ResM.uResult;
     5815                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     5816                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     5817                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     5818                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     5819                                          | X86_MXCSR_XCPT_MASK;
     5820                        X86XMMREG ResM; RT_ZERO(ResM);
     5821                        uint32_t uMxCsrOutM = pfn(uMxCsrIn, &ResM, &TestData.InVal1, &TestData.InVal2);
     5822                        TestData.fMxcsrIn  = uMxCsrIn;
     5823                        TestData.fMxcsrOut = uMxCsrOutM;
     5824                        TestData.OutVal    = ResM;
    58325825                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    58335826
    5834                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
    5835                         IEMSSERESULT ResU; RT_ZERO(ResU);
    5836                         pfn(&State, &ResU, &TestData.InVal1, &TestData.InVal2);
    5837                         TestData.fMxcsrIn  = State.MXCSR;
    5838                         TestData.fMxcsrOut = ResU.MXCSR;
    5839                         TestData.OutVal    = ResU.uResult;
     5827                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
     5828                        X86XMMREG ResU; RT_ZERO(ResU);
     5829                        uint32_t uMxCsrOutU = pfn(uMxCsrIn, &ResU, &TestData.InVal1, &TestData.InVal2);
     5830                        TestData.fMxcsrIn  = uMxCsrIn;
     5831                        TestData.fMxcsrOut = uMxCsrOutU;
     5832                        TestData.OutVal    = ResU;
    58405833                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    58415834
    5842                         uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS;
     5835                        uint16_t fXcpt = (uMxCsrOutM | uMxCsrOutU) & X86_MXCSR_XCPT_FLAGS;
    58435836                        if (fXcpt)
    58445837                        {
    5845                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    5846                             IEMSSERESULT Res1; RT_ZERO(Res1);
    5847                             pfn(&State, &Res1, &TestData.InVal1, &TestData.InVal2);
    5848                             TestData.fMxcsrIn  = State.MXCSR;
    5849                             TestData.fMxcsrOut = Res1.MXCSR;
    5850                             TestData.OutVal    = Res1.uResult;
     5838                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     5839                            X86XMMREG Res1; RT_ZERO(Res1);
     5840                            uint32_t uMxCsrOut1 = pfn(uMxCsrIn, &Res1, &TestData.InVal1, &TestData.InVal2);
     5841                            TestData.fMxcsrIn  = uMxCsrIn;
     5842                            TestData.fMxcsrOut = uMxCsrOut1;
     5843                            TestData.OutVal    = Res1;
    58515844                            GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    58525845
    5853                             if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS))
     5846                            if (((uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS))
    58545847                            {
    5855                                 fXcpt |= Res1.MXCSR & X86_MXCSR_XCPT_FLAGS;
    5856                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    5857                                 IEMSSERESULT Res2; RT_ZERO(Res2);
    5858                                 pfn(&State, &Res2, &TestData.InVal1, &TestData.InVal2);
    5859                                 TestData.fMxcsrIn  = State.MXCSR;
    5860                                 TestData.fMxcsrOut = Res2.MXCSR;
    5861                                 TestData.OutVal    = Res2.uResult;
     5848                                fXcpt |= uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS;
     5849                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     5850                                X86XMMREG Res2; RT_ZERO(Res2);
     5851                                uint32_t uMxCsrOut2 = pfn(uMxCsrIn, &Res2, &TestData.InVal1, &TestData.InVal2);
     5852                                TestData.fMxcsrIn  = uMxCsrIn;
     5853                                TestData.fMxcsrOut = uMxCsrOut2;
     5854                                TestData.OutVal    = Res2;
    58625855                                GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    58635856                            }
     
    58665859                                    if (fUnmasked & fXcpt)
    58675860                                    {
    5868                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    5869                                         IEMSSERESULT Res3; RT_ZERO(Res3);
    5870                                         pfn(&State, &Res3, &TestData.InVal1, &TestData.InVal2);
    5871                                         TestData.fMxcsrIn  = State.MXCSR;
    5872                                         TestData.fMxcsrOut = Res3.MXCSR;
    5873                                         TestData.OutVal    = Res3.uResult;
     5861                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     5862                                        X86XMMREG Res3; RT_ZERO(Res3);
     5863                                        uint32_t uMxCsrOut3 = pfn(uMxCsrIn, &Res3, &TestData.InVal1, &TestData.InVal2);
     5864                                        TestData.fMxcsrIn  = uMxCsrIn;
     5865                                        TestData.fMxcsrOut = uMxCsrOut3;
     5866                                        TestData.OutVal    = Res3;
    58745867                                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    58755868                                    }
     
    58875880static void SseBinaryR64Test(void)
    58885881{
    5889     X86FXSTATE State;
    5890     RT_ZERO(State);
    58915882    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR64); iFn++)
    58925883    {
     
    59035894            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    59045895            {
    5905                 IEMSSERESULT Res; RT_ZERO(Res);
    5906 
    5907                 State.MXCSR = paTests[iTest].fMxcsrIn;
    5908                 pfn(&State, &Res, &paTests[iTest].InVal1, &paTests[iTest].InVal2);
    5909                 if (   Res.MXCSR != paTests[iTest].fMxcsrOut
    5910                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest].OutVal.ar64[0])
    5911                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest].OutVal.ar64[1]))
     5896                X86XMMREG Res; RT_ZERO(Res);
     5897
     5898                uint32_t uMxCsrIn = paTests[iTest].fMxcsrIn;
     5899                uint32_t uMxCsrOut = pfn(uMxCsrIn, &Res, &paTests[iTest].InVal1, &paTests[iTest].InVal2);
     5900                if (   uMxCsrOut != paTests[iTest].fMxcsrOut
     5901                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[0], &paTests[iTest].OutVal.ar64[0])
     5902                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[1], &paTests[iTest].OutVal.ar64[1]))
    59125903                    RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s in2=%s'%s\n"
    59135904                                          "%s               -> mxcsr=%#08x    %s'%s\n"
     
    59165907                                 FormatR64(&paTests[iTest].InVal1.ar64[0]), FormatR64(&paTests[iTest].InVal1.ar64[1]),
    59175908                                 FormatR64(&paTests[iTest].InVal2.ar64[0]), FormatR64(&paTests[iTest].InVal2.ar64[1]),
    5918                                  iVar ? "  " : "", Res.MXCSR,
    5919                                  FormatR64(&Res.uResult.ar64[0]), FormatR64(&Res.uResult.ar64[1]),
     5909                                 iVar ? "  " : "", uMxCsrOut,
     5910                                 FormatR64(&Res.ar64[0]), FormatR64(&Res.ar64[1]),
    59205911                                 iVar ? "  " : "", paTests[iTest].fMxcsrOut,
    59215912                                 FormatR64(&paTests[iTest].OutVal.ar64[0]), FormatR64(&paTests[iTest].OutVal.ar64[1]),
    5922                                  MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut),
    5923                                    (   !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest].OutVal.ar64[0])
    5924                                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest].OutVal.ar64[1]))
     5913                                 MxcsrDiff(uMxCsrOut, paTests[iTest].fMxcsrOut),
     5914                                   (   !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[0], &paTests[iTest].OutVal.ar64[0])
     5915                                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[1], &paTests[iTest].OutVal.ar64[1]))
    59255916                                 ? " - val" : "",
    59265917                                 FormatMxcsr(paTests[iTest].fMxcsrIn) );
     
    59635954    };
    59645955
    5965     X86FXSTATE State;
    5966     RT_ZERO(State);
    59675956    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    59685957    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryU128R32); iFn++)
     
    60025991                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    60035992                    {
    6004                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    6005                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    6006                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    6007                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    6008                                     | X86_MXCSR_XCPT_MASK;
    6009                         IEMSSERESULT ResM; RT_ZERO(ResM);
    6010                         pfn(&State, &ResM, &TestData.InVal1, &TestData.r32Val2);
    6011                         TestData.fMxcsrIn  = State.MXCSR;
    6012                         TestData.fMxcsrOut = ResM.MXCSR;
    6013                         TestData.OutVal    = ResM.uResult;
     5993                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     5994                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     5995                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     5996                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     5997                                          | X86_MXCSR_XCPT_MASK;
     5998                        X86XMMREG ResM; RT_ZERO(ResM);
     5999                        uint32_t uMxCsrOutM = pfn(uMxCsrIn, &ResM, &TestData.InVal1, &TestData.r32Val2);
     6000                        TestData.fMxcsrIn  = uMxCsrIn;
     6001                        TestData.fMxcsrOut = uMxCsrOutM;
     6002                        TestData.OutVal    = ResM;
    60146003                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    60156004
    6016                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
    6017                         IEMSSERESULT ResU; RT_ZERO(ResU);
    6018                         pfn(&State, &ResU, &TestData.InVal1, &TestData.r32Val2);
    6019                         TestData.fMxcsrIn  = State.MXCSR;
    6020                         TestData.fMxcsrOut = ResU.MXCSR;
    6021                         TestData.OutVal    = ResU.uResult;
     6005                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
     6006                        X86XMMREG ResU; RT_ZERO(ResU);
     6007                        uint32_t uMxCsrOutU = pfn(uMxCsrIn, &ResU, &TestData.InVal1, &TestData.r32Val2);
     6008                        TestData.fMxcsrIn  = uMxCsrIn;
     6009                        TestData.fMxcsrOut = uMxCsrOutU;
     6010                        TestData.OutVal    = ResU;
    60226011                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    60236012
    6024                         uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS;
     6013                        uint16_t fXcpt = (uMxCsrOutM | uMxCsrOutU) & X86_MXCSR_XCPT_FLAGS;
    60256014                        if (fXcpt)
    60266015                        {
    6027                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    6028                             IEMSSERESULT Res1; RT_ZERO(Res1);
    6029                             pfn(&State, &Res1, &TestData.InVal1, &TestData.r32Val2);
    6030                             TestData.fMxcsrIn  = State.MXCSR;
    6031                             TestData.fMxcsrOut = Res1.MXCSR;
    6032                             TestData.OutVal    = Res1.uResult;
     6016                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     6017                            X86XMMREG Res1; RT_ZERO(Res1);
     6018                            uint32_t uMxCsrOut1 = pfn(uMxCsrIn, &Res1, &TestData.InVal1, &TestData.r32Val2);
     6019                            TestData.fMxcsrIn  = uMxCsrIn;
     6020                            TestData.fMxcsrOut = uMxCsrOut1;
     6021                            TestData.OutVal    = Res1;
    60336022                            GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    60346023
    6035                             if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS))
     6024                            if (((uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS))
    60366025                            {
    6037                                 fXcpt |= Res1.MXCSR & X86_MXCSR_XCPT_FLAGS;
    6038                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    6039                                 IEMSSERESULT Res2; RT_ZERO(Res2);
    6040                                 pfn(&State, &Res2, &TestData.InVal1, &TestData.r32Val2);
    6041                                 TestData.fMxcsrIn  = State.MXCSR;
    6042                                 TestData.fMxcsrOut = Res2.MXCSR;
    6043                                 TestData.OutVal    = Res2.uResult;
     6026                                fXcpt |= uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS;
     6027                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     6028                                X86XMMREG Res2; RT_ZERO(Res2);
     6029                                uint32_t uMxCsrOut2 = pfn(uMxCsrIn, &Res2, &TestData.InVal1, &TestData.r32Val2);
     6030                                TestData.fMxcsrIn  = uMxCsrIn;
     6031                                TestData.fMxcsrOut = uMxCsrOut2;
     6032                                TestData.OutVal    = Res2;
    60446033                                GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    60456034                            }
     
    60486037                                    if (fUnmasked & fXcpt)
    60496038                                    {
    6050                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    6051                                         IEMSSERESULT Res3; RT_ZERO(Res3);
    6052                                         pfn(&State, &Res3, &TestData.InVal1, &TestData.r32Val2);
    6053                                         TestData.fMxcsrIn  = State.MXCSR;
    6054                                         TestData.fMxcsrOut = Res3.MXCSR;
    6055                                         TestData.OutVal    = Res3.uResult;
     6039                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     6040                                        X86XMMREG Res3; RT_ZERO(Res3);
     6041                                        uint32_t uMxCsrOut3 = pfn(uMxCsrIn, &Res3, &TestData.InVal1, &TestData.r32Val2);
     6042                                        TestData.fMxcsrIn  = uMxCsrIn;
     6043                                        TestData.fMxcsrOut = uMxCsrOut3;
     6044                                        TestData.OutVal    = Res3;
    60566045                                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    60576046                                    }
     
    60686057static void SseBinaryU128R32Test(void)
    60696058{
    6070     X86FXSTATE State;
    6071     RT_ZERO(State);
    60726059    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryU128R32); iFn++)
    60736060    {
     
    60846071            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    60856072            {
    6086                 IEMSSERESULT Res; RT_ZERO(Res);
    6087 
    6088                 State.MXCSR = paTests[iTest].fMxcsrIn;
    6089                 pfn(&State, &Res, &paTests[iTest].InVal1, &paTests[iTest].r32Val2);
    6090                 bool fValsIdentical =    RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[0], &paTests[iTest].OutVal.ar32[0])
    6091                                       && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[1], &paTests[iTest].OutVal.ar32[1])
    6092                                       && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[2], &paTests[iTest].OutVal.ar32[2])
    6093                                       && RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[3], &paTests[iTest].OutVal.ar32[3]);
    6094                 if (   Res.MXCSR != paTests[iTest].fMxcsrOut
     6073                X86XMMREG Res; RT_ZERO(Res);
     6074
     6075                uint32_t uMxCsrIn = paTests[iTest].fMxcsrIn;
     6076                uint32_t uMxCsrOut = pfn(uMxCsrIn, &Res, &paTests[iTest].InVal1, &paTests[iTest].r32Val2);
     6077                bool fValsIdentical =    RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[0], &paTests[iTest].OutVal.ar32[0])
     6078                                      && RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[1], &paTests[iTest].OutVal.ar32[1])
     6079                                      && RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[2], &paTests[iTest].OutVal.ar32[2])
     6080                                      && RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[3], &paTests[iTest].OutVal.ar32[3]);
     6081                if (   uMxCsrOut != paTests[iTest].fMxcsrOut
    60956082                    || !fValsIdentical)
    60966083                    RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s'%s'%s in2=%s\n"
     
    61016088                                 FormatR32(&paTests[iTest].InVal1.ar32[2]), FormatR32(&paTests[iTest].InVal1.ar32[3]),
    61026089                                 FormatR32(&paTests[iTest].r32Val2),
    6103                                  iVar ? "  " : "", Res.MXCSR,
    6104                                  FormatR32(&Res.uResult.ar32[0]), FormatR32(&Res.uResult.ar32[1]),
    6105                                  FormatR32(&Res.uResult.ar32[2]), FormatR32(&Res.uResult.ar32[3]),
     6090                                 iVar ? "  " : "", uMxCsrOut,
     6091                                 FormatR32(&Res.ar32[0]), FormatR32(&Res.ar32[1]),
     6092                                 FormatR32(&Res.ar32[2]), FormatR32(&Res.ar32[3]),
    61066093                                 iVar ? "  " : "", paTests[iTest].fMxcsrOut,
    61076094                                 FormatR32(&paTests[iTest].OutVal.ar32[0]), FormatR32(&paTests[iTest].OutVal.ar32[1]),
    61086095                                 FormatR32(&paTests[iTest].OutVal.ar32[2]), FormatR32(&paTests[iTest].OutVal.ar32[3]),
    6109                                  MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut),
     6096                                 MxcsrDiff(uMxCsrOut, paTests[iTest].fMxcsrOut),
    61106097                                 !fValsIdentical ? " - val" : "",
    61116098                                 FormatMxcsr(paTests[iTest].fMxcsrIn) );
     
    61476134    };
    61486135
    6149     X86FXSTATE State;
    6150     RT_ZERO(State);
    61516136    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    61526137    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryU128R64); iFn++)
     
    61806165                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    61816166                    {
    6182                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    6183                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    6184                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    6185                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    6186                                     | X86_MXCSR_XCPT_MASK;
    6187                         IEMSSERESULT ResM; RT_ZERO(ResM);
    6188                         pfn(&State, &ResM, &TestData.InVal1, &TestData.r64Val2);
    6189                         TestData.fMxcsrIn  = State.MXCSR;
    6190                         TestData.fMxcsrOut = ResM.MXCSR;
    6191                         TestData.OutVal    = ResM.uResult;
     6167                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     6168                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     6169                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     6170                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     6171                                          | X86_MXCSR_XCPT_MASK;
     6172                        uint32_t uMxCsrOutM = pfn(uMxCsrIn, &TestData.OutVal, &TestData.InVal1, &TestData.r64Val2);
     6173                        TestData.fMxcsrIn  = uMxCsrIn;
     6174                        TestData.fMxcsrOut = uMxCsrOutM;
    61926175                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    61936176
    6194                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
    6195                         IEMSSERESULT ResU; RT_ZERO(ResU);
    6196                         pfn(&State, &ResU, &TestData.InVal1, &TestData.r64Val2);
    6197                         TestData.fMxcsrIn  = State.MXCSR;
    6198                         TestData.fMxcsrOut = ResU.MXCSR;
    6199                         TestData.OutVal    = ResU.uResult;
     6177                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
     6178                        uint32_t uMxCsrOutU = pfn(uMxCsrIn, &TestData.OutVal, &TestData.InVal1, &TestData.r64Val2);
     6179                        TestData.fMxcsrIn  = uMxCsrIn;
     6180                        TestData.fMxcsrOut = uMxCsrOutU;
    62006181                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    62016182
    6202                         uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS;
     6183                        uint16_t fXcpt = (uMxCsrOutM | uMxCsrOutU) & X86_MXCSR_XCPT_FLAGS;
    62036184                        if (fXcpt)
    62046185                        {
    6205                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    6206                             IEMSSERESULT Res1; RT_ZERO(Res1);
    6207                             pfn(&State, &Res1, &TestData.InVal1, &TestData.r64Val2);
    6208                             TestData.fMxcsrIn  = State.MXCSR;
    6209                             TestData.fMxcsrOut = Res1.MXCSR;
    6210                             TestData.OutVal    = Res1.uResult;
     6186                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     6187                            uint32_t uMxCsrOut1 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.InVal1, &TestData.r64Val2);
     6188                            TestData.fMxcsrIn  = uMxCsrIn;
     6189                            TestData.fMxcsrOut = uMxCsrOut1;
    62116190                            GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    62126191
    6213                             if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS))
     6192                            if (((uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS))
    62146193                            {
    6215                                 fXcpt |= Res1.MXCSR & X86_MXCSR_XCPT_FLAGS;
    6216                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    6217                                 IEMSSERESULT Res2; RT_ZERO(Res2);
    6218                                 pfn(&State, &Res2, &TestData.InVal1, &TestData.r64Val2);
    6219                                 TestData.fMxcsrIn  = State.MXCSR;
    6220                                 TestData.fMxcsrOut = Res2.MXCSR;
    6221                                 TestData.OutVal    = Res2.uResult;
     6194                                fXcpt |= uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS;
     6195                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     6196                                uint32_t uMxCsrOut2 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.InVal1, &TestData.r64Val2);
     6197                                TestData.fMxcsrIn  = uMxCsrIn;
     6198                                TestData.fMxcsrOut = uMxCsrOut2;
    62226199                                GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    62236200                            }
     
    62266203                                    if (fUnmasked & fXcpt)
    62276204                                    {
    6228                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    6229                                         IEMSSERESULT Res3; RT_ZERO(Res3);
    6230                                         pfn(&State, &Res3, &TestData.InVal1, &TestData.r64Val2);
    6231                                         TestData.fMxcsrIn  = State.MXCSR;
    6232                                         TestData.fMxcsrOut = Res3.MXCSR;
    6233                                         TestData.OutVal    = Res3.uResult;
     6205                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     6206                                        uint32_t uMxCsrOut3 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.InVal1, &TestData.r64Val2);
     6207                                        TestData.fMxcsrIn  = uMxCsrIn;
     6208                                        TestData.fMxcsrOut = uMxCsrOut3;
    62346209                                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    62356210                                    }
     
    62476222static void SseBinaryU128R64Test(void)
    62486223{
    6249     X86FXSTATE State;
    6250     RT_ZERO(State);
    62516224    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryU128R64); iFn++)
    62526225    {
     
    62636236            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    62646237            {
    6265                 IEMSSERESULT Res; RT_ZERO(Res);
    6266 
    6267                 State.MXCSR = paTests[iTest].fMxcsrIn;
    6268                 pfn(&State, &Res, &paTests[iTest].InVal1, &paTests[iTest].r64Val2);
    6269                 if (   Res.MXCSR != paTests[iTest].fMxcsrOut
    6270                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest].OutVal.ar64[0])
    6271                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest].OutVal.ar64[1]))
     6238                X86XMMREG Res; RT_ZERO(Res);
     6239
     6240                uint32_t uMxCsrIn = paTests[iTest].fMxcsrIn;
     6241                uint32_t uMxCsrOut = pfn(uMxCsrIn, &Res, &paTests[iTest].InVal1, &paTests[iTest].r64Val2);
     6242                if (   uMxCsrOut != paTests[iTest].fMxcsrOut
     6243                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[0], &paTests[iTest].OutVal.ar64[0])
     6244                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[1], &paTests[iTest].OutVal.ar64[1]))
    62726245                    RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s in2=%s\n"
    62736246                                          "%s               -> mxcsr=%#08x    %s'%s\n"
     
    62766249                                 FormatR64(&paTests[iTest].InVal1.ar64[0]), FormatR64(&paTests[iTest].InVal1.ar64[1]),
    62776250                                 FormatR64(&paTests[iTest].r64Val2),
    6278                                  iVar ? "  " : "", Res.MXCSR,
    6279                                  FormatR64(&Res.uResult.ar64[0]), FormatR64(&Res.uResult.ar64[1]),
     6251                                 iVar ? "  " : "", uMxCsrOut,
     6252                                 FormatR64(&Res.ar64[0]), FormatR64(&Res.ar64[1]),
    62806253                                 iVar ? "  " : "", paTests[iTest].fMxcsrOut,
    62816254                                 FormatR64(&paTests[iTest].OutVal.ar64[0]), FormatR64(&paTests[iTest].OutVal.ar64[1]),
    6282                                  MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut),
    6283                                    (   !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest].OutVal.ar64[0])
    6284                                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest].OutVal.ar64[1]))
     6255                                 MxcsrDiff(uMxCsrOut, paTests[iTest].fMxcsrOut),
     6256                                   (   !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[0], &paTests[iTest].OutVal.ar64[0])
     6257                                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[1], &paTests[iTest].OutVal.ar64[1]))
    62856258                                 ? " - val" : "",
    62866259                                 FormatMxcsr(paTests[iTest].fMxcsrIn) );
     
    63166289    };
    63176290
    6318     X86FXSTATE State;
    6319     RT_ZERO(State);
    63206291    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    63216292    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryI32R64); iFn++)
     
    63466317                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    63476318                    {
    6348                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    6349                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    6350                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    6351                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    6352                                     | X86_MXCSR_XCPT_MASK;
     6319                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     6320                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     6321                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     6322                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     6323                                          | X86_MXCSR_XCPT_MASK;
    63536324                        uint32_t fMxcsrM; int32_t i32OutM;
    6354                         pfn(&State, &fMxcsrM, &i32OutM, &TestData.r64ValIn.u);
    6355                         TestData.fMxcsrIn  = State.MXCSR;
     6325                        fMxcsrM = pfn(uMxCsrIn, &i32OutM, &TestData.r64ValIn.u);
     6326                        TestData.fMxcsrIn  = uMxCsrIn;
    63566327                        TestData.fMxcsrOut = fMxcsrM;
    63576328                        TestData.i32ValOut = i32OutM;
    63586329                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    63596330
    6360                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
     6331                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
    63616332                        uint32_t fMxcsrU; int32_t i32OutU;
    6362                         pfn(&State, &fMxcsrU, &i32OutU, &TestData.r64ValIn.u);
    6363                         TestData.fMxcsrIn  = State.MXCSR;
     6333                        fMxcsrU = pfn(uMxCsrIn, &i32OutU, &TestData.r64ValIn.u);
     6334                        TestData.fMxcsrIn  = uMxCsrIn;
    63646335                        TestData.fMxcsrOut = fMxcsrU;
    63656336                        TestData.i32ValOut = i32OutU;
     
    63696340                        if (fXcpt)
    63706341                        {
    6371                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     6342                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    63726343                            uint32_t fMxcsr1; int32_t i32Out1;
    6373                             pfn(&State, &fMxcsr1, &i32Out1, &TestData.r64ValIn.u);
    6374                             TestData.fMxcsrIn  = State.MXCSR;
     6344                            fMxcsr1 = pfn(uMxCsrIn, &i32Out1, &TestData.r64ValIn.u);
     6345                            TestData.fMxcsrIn  = uMxCsrIn;
    63756346                            TestData.fMxcsrOut = fMxcsr1;
    63766347                            TestData.i32ValOut = i32Out1;
     
    63806351                            {
    63816352                                fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS;
    6382                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     6353                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    63836354                                uint32_t fMxcsr2; int32_t i32Out2;
    6384                                 pfn(&State, &fMxcsr2, &i32Out2, &TestData.r64ValIn.u);
    6385                                 TestData.fMxcsrIn  = State.MXCSR;
     6355                                fMxcsr2 = pfn(uMxCsrIn, &i32Out2, &TestData.r64ValIn.u);
     6356                                TestData.fMxcsrIn  = uMxCsrIn;
    63866357                                TestData.fMxcsrOut = fMxcsr2;
    63876358                                TestData.i32ValOut = i32Out2;
     
    63926363                                    if (fUnmasked & fXcpt)
    63936364                                    {
    6394                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     6365                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    63956366                                        uint32_t fMxcsr3; int32_t i32Out3;
    6396                                         pfn(&State, &fMxcsr3, &i32Out3, &TestData.r64ValIn.u);
    6397                                         TestData.fMxcsrIn  = State.MXCSR;
     6367                                        fMxcsr3 = pfn(uMxCsrIn, &i32Out3, &TestData.r64ValIn.u);
     6368                                        TestData.fMxcsrIn  = uMxCsrIn;
    63986369                                        TestData.fMxcsrOut = fMxcsr3;
    63996370                                        TestData.i32ValOut = i32Out3;
     
    64296400            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    64306401            {
    6431                 uint32_t fMxcsr = 0;
    64326402                int32_t i32Dst = 0;
    64336403
    6434                 State.MXCSR = paTests[iTest].fMxcsrIn;
    6435                 pfn(&State, &fMxcsr, &i32Dst, &paTests[iTest].r64ValIn.u);
     6404                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &i32Dst, &paTests[iTest].r64ValIn.u);
    64366405                if (   fMxcsr != paTests[iTest].fMxcsrOut
    64376406                    || i32Dst != paTests[iTest].i32ValOut)
     
    64786447    };
    64796448
    6480     X86FXSTATE State;
    6481     RT_ZERO(State);
    64826449    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    64836450    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryI64R64); iFn++)
     
    65086475                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    65096476                    {
    6510                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    6511                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    6512                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    6513                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    6514                                     | X86_MXCSR_XCPT_MASK;
     6477                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     6478                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     6479                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     6480                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     6481                                          | X86_MXCSR_XCPT_MASK;
    65156482                        uint32_t fMxcsrM; int64_t i64OutM;
    6516                         pfn(&State, &fMxcsrM, &i64OutM, &TestData.r64ValIn.u);
    6517                         TestData.fMxcsrIn  = State.MXCSR;
     6483                        fMxcsrM = pfn(uMxCsrIn, &i64OutM, &TestData.r64ValIn.u);
     6484                        TestData.fMxcsrIn  = uMxCsrIn;
    65186485                        TestData.fMxcsrOut = fMxcsrM;
    65196486                        TestData.i64ValOut = i64OutM;
    65206487                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    65216488
    6522                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
     6489                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
    65236490                        uint32_t fMxcsrU; int64_t i64OutU;
    6524                         pfn(&State, &fMxcsrU, &i64OutU, &TestData.r64ValIn.u);
    6525                         TestData.fMxcsrIn  = State.MXCSR;
     6491                        fMxcsrU =pfn(uMxCsrIn, &i64OutU, &TestData.r64ValIn.u);
     6492                        TestData.fMxcsrIn  = uMxCsrIn;
    65266493                        TestData.fMxcsrOut = fMxcsrU;
    65276494                        TestData.i64ValOut = i64OutU;
     
    65316498                        if (fXcpt)
    65326499                        {
    6533                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     6500                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    65346501                            uint32_t fMxcsr1; int64_t i64Out1;
    6535                             pfn(&State, &fMxcsr1, &i64Out1, &TestData.r64ValIn.u);
    6536                             TestData.fMxcsrIn  = State.MXCSR;
     6502                            fMxcsr1 = pfn(uMxCsrIn, &i64Out1, &TestData.r64ValIn.u);
     6503                            TestData.fMxcsrIn  = uMxCsrIn;
    65376504                            TestData.fMxcsrOut = fMxcsr1;
    65386505                            TestData.i64ValOut = i64Out1;
     
    65426509                            {
    65436510                                fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS;
    6544                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     6511                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    65456512                                uint32_t fMxcsr2; int64_t i64Out2;
    6546                                 pfn(&State, &fMxcsr2, &i64Out2, &TestData.r64ValIn.u);
    6547                                 TestData.fMxcsrIn  = State.MXCSR;
     6513                                fMxcsr2 = pfn(uMxCsrIn, &i64Out2, &TestData.r64ValIn.u);
     6514                                TestData.fMxcsrIn  = uMxCsrIn;
    65486515                                TestData.fMxcsrOut = fMxcsr2;
    65496516                                TestData.i64ValOut = i64Out2;
     
    65546521                                    if (fUnmasked & fXcpt)
    65556522                                    {
    6556                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     6523                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    65576524                                        uint32_t fMxcsr3; int64_t i64Out3;
    6558                                         pfn(&State, &fMxcsr3, &i64Out3, &TestData.r64ValIn.u);
    6559                                         TestData.fMxcsrIn  = State.MXCSR;
     6525                                        fMxcsr3 = pfn(uMxCsrIn, &i64Out3, &TestData.r64ValIn.u);
     6526                                        TestData.fMxcsrIn  = uMxCsrIn;
    65606527                                        TestData.fMxcsrOut = fMxcsr3;
    65616528                                        TestData.i64ValOut = i64Out3;
     
    65916558            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    65926559            {
    6593                 uint32_t fMxcsr = 0;
    65946560                int64_t i64Dst = 0;
    6595 
    6596                 State.MXCSR = paTests[iTest].fMxcsrIn;
    6597                 pfn(&State, &fMxcsr, &i64Dst, &paTests[iTest].r64ValIn.u);
     6561                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &i64Dst, &paTests[iTest].r64ValIn.u);
    65986562                if (   fMxcsr != paTests[iTest].fMxcsrOut
    65996563                    || i64Dst != paTests[iTest].i64ValOut)
     
    66406604    };
    66416605
    6642     X86FXSTATE State;
    6643     RT_ZERO(State);
    66446606    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    66456607    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryI32R32); iFn++)
     
    66706632                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    66716633                    {
    6672                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    6673                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    6674                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    6675                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    6676                                     | X86_MXCSR_XCPT_MASK;
     6634                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     6635                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     6636                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     6637                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     6638                                          | X86_MXCSR_XCPT_MASK;
    66776639                        uint32_t fMxcsrM; int32_t i32OutM;
    6678                         pfn(&State, &fMxcsrM, &i32OutM, &TestData.r32ValIn.u);
    6679                         TestData.fMxcsrIn  = State.MXCSR;
     6640                        fMxcsrM = pfn(uMxCsrIn, &i32OutM, &TestData.r32ValIn.u);
     6641                        TestData.fMxcsrIn  = uMxCsrIn;
    66806642                        TestData.fMxcsrOut = fMxcsrM;
    66816643                        TestData.i32ValOut = i32OutM;
    66826644                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    66836645
    6684                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
     6646                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
    66856647                        uint32_t fMxcsrU; int32_t i32OutU;
    6686                         pfn(&State, &fMxcsrU, &i32OutU, &TestData.r32ValIn.u);
    6687                         TestData.fMxcsrIn  = State.MXCSR;
     6648                        fMxcsrU = pfn(uMxCsrIn, &i32OutU, &TestData.r32ValIn.u);
     6649                        TestData.fMxcsrIn  = uMxCsrIn;
    66886650                        TestData.fMxcsrOut = fMxcsrU;
    66896651                        TestData.i32ValOut = i32OutU;
     
    66936655                        if (fXcpt)
    66946656                        {
    6695                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     6657                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    66966658                            uint32_t fMxcsr1; int32_t i32Out1;
    6697                             pfn(&State, &fMxcsr1, &i32Out1, &TestData.r32ValIn.u);
    6698                             TestData.fMxcsrIn  = State.MXCSR;
     6659                            fMxcsr1 = pfn(uMxCsrIn, &i32Out1, &TestData.r32ValIn.u);
     6660                            TestData.fMxcsrIn  = uMxCsrIn;
    66996661                            TestData.fMxcsrOut = fMxcsr1;
    67006662                            TestData.i32ValOut = i32Out1;
     
    67046666                            {
    67056667                                fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS;
    6706                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     6668                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    67076669                                uint32_t fMxcsr2; int32_t i32Out2;
    6708                                 pfn(&State, &fMxcsr2, &i32Out2, &TestData.r32ValIn.u);
    6709                                 TestData.fMxcsrIn  = State.MXCSR;
     6670                                fMxcsr2 = pfn(uMxCsrIn, &i32Out2, &TestData.r32ValIn.u);
     6671                                TestData.fMxcsrIn  = uMxCsrIn;
    67106672                                TestData.fMxcsrOut = fMxcsr2;
    67116673                                TestData.i32ValOut = i32Out2;
     
    67166678                                    if (fUnmasked & fXcpt)
    67176679                                    {
    6718                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     6680                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    67196681                                        uint32_t fMxcsr3; int32_t i32Out3;
    6720                                         pfn(&State, &fMxcsr3, &i32Out3, &TestData.r32ValIn.u);
    6721                                         TestData.fMxcsrIn  = State.MXCSR;
     6682                                        fMxcsr3 = pfn(uMxCsrIn, &i32Out3, &TestData.r32ValIn.u);
     6683                                        TestData.fMxcsrIn  = uMxCsrIn;
    67226684                                        TestData.fMxcsrOut = fMxcsr3;
    67236685                                        TestData.i32ValOut = i32Out3;
     
    67536715            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    67546716            {
    6755                 uint32_t fMxcsr = 0;
    67566717                int32_t i32Dst = 0;
    67576718
    6758                 State.MXCSR = paTests[iTest].fMxcsrIn;
    6759                 pfn(&State, &fMxcsr, &i32Dst, &paTests[iTest].r32ValIn.u);
     6719                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &i32Dst, &paTests[iTest].r32ValIn.u);
    67606720                if (   fMxcsr != paTests[iTest].fMxcsrOut
    67616721                    || i32Dst != paTests[iTest].i32ValOut)
     
    68326792                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    68336793                    {
    6834                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    6835                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    6836                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    6837                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    6838                                     | X86_MXCSR_XCPT_MASK;
     6794                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     6795                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     6796                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     6797                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     6798                                          | X86_MXCSR_XCPT_MASK;
    68396799                        uint32_t fMxcsrM; int64_t i64OutM;
    6840                         pfn(&State, &fMxcsrM, &i64OutM, &TestData.r32ValIn.u);
     6800                        fMxcsrM = pfn(uMxCsrIn, &i64OutM, &TestData.r32ValIn.u);
    68416801                        TestData.fMxcsrIn  = State.MXCSR;
    68426802                        TestData.fMxcsrOut = fMxcsrM;
     
    68446804                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    68456805
    6846                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
     6806                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
    68476807                        uint32_t fMxcsrU; int64_t i64OutU;
    6848                         pfn(&State, &fMxcsrU, &i64OutU, &TestData.r32ValIn.u);
     6808                        fMxcsrU = pfn(uMxCsrIn, &i64OutU, &TestData.r32ValIn.u);
    68496809                        TestData.fMxcsrIn  = State.MXCSR;
    68506810                        TestData.fMxcsrOut = fMxcsrU;
     
    68556815                        if (fXcpt)
    68566816                        {
    6857                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     6817                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    68586818                            uint32_t fMxcsr1; int64_t i64Out1;
    6859                             pfn(&State, &fMxcsr1, &i64Out1, &TestData.r32ValIn.u);
     6819                            fMxcsr1 = pfn(uMxCsrIn, &i64Out1, &TestData.r32ValIn.u);
    68606820                            TestData.fMxcsrIn  = State.MXCSR;
    68616821                            TestData.fMxcsrOut = fMxcsr1;
     
    68666826                            {
    68676827                                fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS;
    6868                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     6828                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    68696829                                uint32_t fMxcsr2; int64_t i64Out2;
    6870                                 pfn(&State, &fMxcsr2, &i64Out2, &TestData.r32ValIn.u);
     6830                                fMxcsr2 = pfn(uMxCsrIn, &i64Out2, &TestData.r32ValIn.u);
    68716831                                TestData.fMxcsrIn  = State.MXCSR;
    68726832                                TestData.fMxcsrOut = fMxcsr2;
     
    68786838                                    if (fUnmasked & fXcpt)
    68796839                                    {
    6880                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     6840                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    68816841                                        uint32_t fMxcsr3; int64_t i64Out3;
    6882                                         pfn(&State, &fMxcsr3, &i64Out3, &TestData.r32ValIn.u);
     6842                                        fMxcsr3 = pfn(uMxCsrIn, &i64Out3, &TestData.r32ValIn.u);
    68836843                                        TestData.fMxcsrIn  = State.MXCSR;
    68846844                                        TestData.fMxcsrOut = fMxcsr3;
     
    69156875            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    69166876            {
    6917                 uint32_t fMxcsr = 0;
    69186877                int64_t i64Dst = 0;
    69196878
    6920                 State.MXCSR = paTests[iTest].fMxcsrIn;
    6921                 pfn(&State, &fMxcsr, &i64Dst, &paTests[iTest].r32ValIn.u);
     6879                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &i64Dst, &paTests[iTest].r32ValIn.u);
    69226880                if (   fMxcsr != paTests[iTest].fMxcsrOut
    69236881                    || i64Dst != paTests[iTest].i64ValOut)
     
    69646922    };
    69656923
    6966     X86FXSTATE State;
    6967     RT_ZERO(State);
    69686924    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR64I32); iFn++)
    69696925    {
     
    69846940                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    69856941                    {
    6986                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    6987                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    6988                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    6989                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    6990                                     | X86_MXCSR_XCPT_MASK;
     6942                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     6943                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     6944                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     6945                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     6946                                          | X86_MXCSR_XCPT_MASK;
    69916947                        uint32_t fMxcsrM; RTFLOAT64U r64OutM;
    6992                         pfn(&State, &fMxcsrM, &r64OutM, &TestData.i32ValIn);
    6993                         TestData.fMxcsrIn  = State.MXCSR;
     6948                        fMxcsrM = pfn(uMxCsrIn, &r64OutM, &TestData.i32ValIn);
     6949                        TestData.fMxcsrIn  = uMxCsrIn;
    69946950                        TestData.fMxcsrOut = fMxcsrM;
    69956951                        TestData.r64ValOut = r64OutM;
    69966952                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    69976953
    6998                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
     6954                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
    69996955                        uint32_t fMxcsrU; RTFLOAT64U r64OutU;
    7000                         pfn(&State, &fMxcsrU, &r64OutU, &TestData.i32ValIn);
    7001                         TestData.fMxcsrIn  = State.MXCSR;
     6956                        fMxcsrU = pfn(uMxCsrIn, &r64OutU, &TestData.i32ValIn);
     6957                        TestData.fMxcsrIn  = uMxCsrIn;
    70026958                        TestData.fMxcsrOut = fMxcsrU;
    70036959                        TestData.r64ValOut = r64OutU;
     
    70076963                        if (fXcpt)
    70086964                        {
    7009                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     6965                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    70106966                            uint32_t fMxcsr1; RTFLOAT64U r64Out1;
    7011                             pfn(&State, &fMxcsr1, &r64Out1, &TestData.i32ValIn);
    7012                             TestData.fMxcsrIn  = State.MXCSR;
     6967                            fMxcsr1 = pfn(uMxCsrIn, &r64Out1, &TestData.i32ValIn);
     6968                            TestData.fMxcsrIn  = uMxCsrIn;
    70136969                            TestData.fMxcsrOut = fMxcsr1;
    70146970                            TestData.r64ValOut = r64Out1;
     
    70186974                            {
    70196975                                fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS;
    7020                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     6976                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    70216977                                uint32_t fMxcsr2; RTFLOAT64U r64Out2;
    7022                                 pfn(&State, &fMxcsr2, &r64Out2, &TestData.i32ValIn);
    7023                                 TestData.fMxcsrIn  = State.MXCSR;
     6978                                fMxcsr2 = pfn(uMxCsrIn, &r64Out2, &TestData.i32ValIn);
     6979                                TestData.fMxcsrIn  = uMxCsrIn;
    70246980                                TestData.fMxcsrOut = fMxcsr2;
    70256981                                TestData.r64ValOut = r64Out2;
     
    70306986                                    if (fUnmasked & fXcpt)
    70316987                                    {
    7032                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     6988                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    70336989                                        uint32_t fMxcsr3; RTFLOAT64U r64Out3;
    7034                                         pfn(&State, &fMxcsr3, &r64Out3, &TestData.i32ValIn);
    7035                                         TestData.fMxcsrIn  = State.MXCSR;
     6990                                        fMxcsr3 = pfn(uMxCsrIn, &r64Out3, &TestData.i32ValIn);
     6991                                        TestData.fMxcsrIn  = uMxCsrIn;
    70366992                                        TestData.fMxcsrOut = fMxcsr3;
    70376993                                        TestData.r64ValOut = r64Out3;
     
    70517007static void SseBinaryR64I32Test(void)
    70527008{
    7053     X86FXSTATE State;
    7054     RT_ZERO(State);
    70557009    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR64I32); iFn++)
    70567010    {
     
    70677021            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    70687022            {
    7069                 uint32_t fMxcsr = 0;
    70707023                RTFLOAT64U r64Dst; RT_ZERO(r64Dst);
    70717024
    7072                 State.MXCSR = paTests[iTest].fMxcsrIn;
    7073                 pfn(&State, &fMxcsr, &r64Dst, &paTests[iTest].i32ValIn);
     7025                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &r64Dst, &paTests[iTest].i32ValIn);
    70747026                if (   fMxcsr != paTests[iTest].fMxcsrOut
    70757027                    || !RTFLOAT64U_ARE_IDENTICAL(&r64Dst, &paTests[iTest].r64ValOut))
     
    71167068    };
    71177069
    7118     X86FXSTATE State;
    7119     RT_ZERO(State);
    71207070    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR64I64); iFn++)
    71217071    {
     
    71367086                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    71377087                    {
    7138                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    7139                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    7140                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    7141                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    7142                                     | X86_MXCSR_XCPT_MASK;
     7088                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     7089                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     7090                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     7091                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     7092                                          | X86_MXCSR_XCPT_MASK;
    71437093                        uint32_t fMxcsrM; RTFLOAT64U r64OutM;
    7144                         pfn(&State, &fMxcsrM, &r64OutM, &TestData.i64ValIn);
    7145                         TestData.fMxcsrIn  = State.MXCSR;
     7094                        fMxcsrM = pfn(uMxCsrIn, &r64OutM, &TestData.i64ValIn);
     7095                        TestData.fMxcsrIn  = uMxCsrIn;
    71467096                        TestData.fMxcsrOut = fMxcsrM;
    71477097                        TestData.r64ValOut = r64OutM;
    71487098                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    71497099
    7150                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
     7100                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
    71517101                        uint32_t fMxcsrU; RTFLOAT64U r64OutU;
    7152                         pfn(&State, &fMxcsrU, &r64OutU, &TestData.i64ValIn);
    7153                         TestData.fMxcsrIn  = State.MXCSR;
     7102                        fMxcsrU = pfn(uMxCsrIn, &r64OutU, &TestData.i64ValIn);
     7103                        TestData.fMxcsrIn  = uMxCsrIn;
    71547104                        TestData.fMxcsrOut = fMxcsrU;
    71557105                        TestData.r64ValOut = r64OutU;
     
    71597109                        if (fXcpt)
    71607110                        {
    7161                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     7111                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    71627112                            uint32_t fMxcsr1; RTFLOAT64U r64Out1;
    7163                             pfn(&State, &fMxcsr1, &r64Out1, &TestData.i64ValIn);
    7164                             TestData.fMxcsrIn  = State.MXCSR;
     7113                            fMxcsr1 = pfn(uMxCsrIn, &r64Out1, &TestData.i64ValIn);
     7114                            TestData.fMxcsrIn  = uMxCsrIn;
    71657115                            TestData.fMxcsrOut = fMxcsr1;
    71667116                            TestData.r64ValOut = r64Out1;
     
    71707120                            {
    71717121                                fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS;
    7172                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     7122                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    71737123                                uint32_t fMxcsr2; RTFLOAT64U r64Out2;
    7174                                 pfn(&State, &fMxcsr2, &r64Out2, &TestData.i64ValIn);
    7175                                 TestData.fMxcsrIn  = State.MXCSR;
     7124                                fMxcsr2 = pfn(uMxCsrIn, &r64Out2, &TestData.i64ValIn);
     7125                                TestData.fMxcsrIn  = uMxCsrIn;
    71767126                                TestData.fMxcsrOut = fMxcsr2;
    71777127                                TestData.r64ValOut = r64Out2;
     
    71827132                                    if (fUnmasked & fXcpt)
    71837133                                    {
    7184                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     7134                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    71857135                                        uint32_t fMxcsr3; RTFLOAT64U r64Out3;
    7186                                         pfn(&State, &fMxcsr3, &r64Out3, &TestData.i64ValIn);
    7187                                         TestData.fMxcsrIn  = State.MXCSR;
     7136                                        fMxcsr3 = pfn(uMxCsrIn, &r64Out3, &TestData.i64ValIn);
     7137                                        TestData.fMxcsrIn  = uMxCsrIn;
    71887138                                        TestData.fMxcsrOut = fMxcsr3;
    71897139                                        TestData.r64ValOut = r64Out3;
     
    72037153static void SseBinaryR64I64Test(void)
    72047154{
    7205     X86FXSTATE State;
    7206     RT_ZERO(State);
    72077155    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR64I64); iFn++)
    72087156    {
     
    72197167            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    72207168            {
    7221                 uint32_t fMxcsr = 0;
    72227169                RTFLOAT64U r64Dst; RT_ZERO(r64Dst);
    72237170
    7224                 State.MXCSR = paTests[iTest].fMxcsrIn;
    7225                 pfn(&State, &fMxcsr, &r64Dst, &paTests[iTest].i64ValIn);
     7171                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &r64Dst, &paTests[iTest].i64ValIn);
    72267172                if (   fMxcsr != paTests[iTest].fMxcsrOut
    72277173                    || !RTFLOAT64U_ARE_IDENTICAL(&r64Dst, &paTests[iTest].r64ValOut))
     
    72687214    };
    72697215
    7270     X86FXSTATE State;
    7271     RT_ZERO(State);
    72727216    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR32I32); iFn++)
    72737217    {
     
    72887232                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    72897233                    {
    7290                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    7291                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    7292                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    7293                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    7294                                     | X86_MXCSR_XCPT_MASK;
     7234                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     7235                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     7236                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     7237                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     7238                                          | X86_MXCSR_XCPT_MASK;
    72957239                        uint32_t fMxcsrM; RTFLOAT32U r32OutM;
    7296                         pfn(&State, &fMxcsrM, &r32OutM, &TestData.i32ValIn);
    7297                         TestData.fMxcsrIn  = State.MXCSR;
     7240                        fMxcsrM = pfn(uMxCsrIn, &r32OutM, &TestData.i32ValIn);
     7241                        TestData.fMxcsrIn  = uMxCsrIn;
    72987242                        TestData.fMxcsrOut = fMxcsrM;
    72997243                        TestData.r32ValOut = r32OutM;
    73007244                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    73017245
    7302                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
     7246                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
    73037247                        uint32_t fMxcsrU; RTFLOAT32U r32OutU;
    7304                         pfn(&State, &fMxcsrU, &r32OutU, &TestData.i32ValIn);
    7305                         TestData.fMxcsrIn  = State.MXCSR;
     7248                        fMxcsrU = pfn(uMxCsrIn, &r32OutU, &TestData.i32ValIn);
     7249                        TestData.fMxcsrIn  = uMxCsrIn;
    73067250                        TestData.fMxcsrOut = fMxcsrU;
    73077251                        TestData.r32ValOut = r32OutU;
     
    73117255                        if (fXcpt)
    73127256                        {
    7313                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     7257                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    73147258                            uint32_t fMxcsr1; RTFLOAT32U r32Out1;
    7315                             pfn(&State, &fMxcsr1, &r32Out1, &TestData.i32ValIn);
    7316                             TestData.fMxcsrIn  = State.MXCSR;
     7259                            fMxcsr1 = pfn(uMxCsrIn, &r32Out1, &TestData.i32ValIn);
     7260                            TestData.fMxcsrIn  = uMxCsrIn;
    73177261                            TestData.fMxcsrOut = fMxcsr1;
    73187262                            TestData.r32ValOut = r32Out1;
     
    73227266                            {
    73237267                                fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS;
    7324                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     7268                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    73257269                                uint32_t fMxcsr2; RTFLOAT32U r32Out2;
    7326                                 pfn(&State, &fMxcsr2, &r32Out2, &TestData.i32ValIn);
    7327                                 TestData.fMxcsrIn  = State.MXCSR;
     7270                                fMxcsr2 = pfn(uMxCsrIn, &r32Out2, &TestData.i32ValIn);
     7271                                TestData.fMxcsrIn  = uMxCsrIn;
    73287272                                TestData.fMxcsrOut = fMxcsr2;
    73297273                                TestData.r32ValOut = r32Out2;
     
    73347278                                    if (fUnmasked & fXcpt)
    73357279                                    {
    7336                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     7280                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    73377281                                        uint32_t fMxcsr3; RTFLOAT32U r32Out3;
    7338                                         pfn(&State, &fMxcsr3, &r32Out3, &TestData.i32ValIn);
    7339                                         TestData.fMxcsrIn  = State.MXCSR;
     7282                                        fMxcsr3 = pfn(uMxCsrIn, &r32Out3, &TestData.i32ValIn);
     7283                                        TestData.fMxcsrIn  = uMxCsrIn;
    73407284                                        TestData.fMxcsrOut = fMxcsr3;
    73417285                                        TestData.r32ValOut = r32Out3;
     
    73557299static void SseBinaryR32I32Test(void)
    73567300{
    7357     X86FXSTATE State;
    7358     RT_ZERO(State);
    73597301    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR32I32); iFn++)
    73607302    {
     
    73717313            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    73727314            {
    7373                 uint32_t fMxcsr = 0;
    73747315                RTFLOAT32U r32Dst; RT_ZERO(r32Dst);
    73757316
    7376                 State.MXCSR = paTests[iTest].fMxcsrIn;
    7377                 pfn(&State, &fMxcsr, &r32Dst, &paTests[iTest].i32ValIn);
     7317                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &r32Dst, &paTests[iTest].i32ValIn);
    73787318                if (   fMxcsr != paTests[iTest].fMxcsrOut
    73797319                    || !RTFLOAT32U_ARE_IDENTICAL(&r32Dst, &paTests[iTest].r32ValOut))
     
    74207360    };
    74217361
    7422     X86FXSTATE State;
    7423     RT_ZERO(State);
    74247362    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR32I64); iFn++)
    74257363    {
     
    74407378                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    74417379                    {
    7442                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    7443                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    7444                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    7445                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    7446                                     | X86_MXCSR_XCPT_MASK;
     7380                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     7381                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     7382                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     7383                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     7384                                          | X86_MXCSR_XCPT_MASK;
    74477385                        uint32_t fMxcsrM; RTFLOAT32U r32OutM;
    7448                         pfn(&State, &fMxcsrM, &r32OutM, &TestData.i64ValIn);
    7449                         TestData.fMxcsrIn  = State.MXCSR;
     7386                        fMxcsrM = pfn(uMxCsrIn, &r32OutM, &TestData.i64ValIn);
     7387                        TestData.fMxcsrIn  = uMxCsrIn;
    74507388                        TestData.fMxcsrOut = fMxcsrM;
    74517389                        TestData.r32ValOut = r32OutM;
    74527390                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    74537391
    7454                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
     7392                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
    74557393                        uint32_t fMxcsrU; RTFLOAT32U r32OutU;
    7456                         pfn(&State, &fMxcsrU, &r32OutU, &TestData.i64ValIn);
    7457                         TestData.fMxcsrIn  = State.MXCSR;
     7394                        fMxcsrU = pfn(uMxCsrIn, &r32OutU, &TestData.i64ValIn);
     7395                        TestData.fMxcsrIn  = uMxCsrIn;
    74587396                        TestData.fMxcsrOut = fMxcsrU;
    74597397                        TestData.r32ValOut = r32OutU;
     
    74637401                        if (fXcpt)
    74647402                        {
    7465                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     7403                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    74667404                            uint32_t fMxcsr1; RTFLOAT32U r32Out1;
    7467                             pfn(&State, &fMxcsr1, &r32Out1, &TestData.i64ValIn);
    7468                             TestData.fMxcsrIn  = State.MXCSR;
     7405                            fMxcsr1 = pfn(uMxCsrIn, &r32Out1, &TestData.i64ValIn);
     7406                            TestData.fMxcsrIn  = uMxCsrIn;
    74697407                            TestData.fMxcsrOut = fMxcsr1;
    74707408                            TestData.r32ValOut = r32Out1;
     
    74747412                            {
    74757413                                fXcpt |= fMxcsr1 & X86_MXCSR_XCPT_FLAGS;
    7476                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     7414                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    74777415                                uint32_t fMxcsr2; RTFLOAT32U r32Out2;
    7478                                 pfn(&State, &fMxcsr2, &r32Out2, &TestData.i64ValIn);
    7479                                 TestData.fMxcsrIn  = State.MXCSR;
     7416                                fMxcsr2 = pfn(uMxCsrIn, &r32Out2, &TestData.i64ValIn);
     7417                                TestData.fMxcsrIn  = uMxCsrIn;
    74807418                                TestData.fMxcsrOut = fMxcsr2;
    74817419                                TestData.r32ValOut = r32Out2;
     
    74867424                                    if (fUnmasked & fXcpt)
    74877425                                    {
    7488                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     7426                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    74897427                                        uint32_t fMxcsr3; RTFLOAT32U r32Out3;
    7490                                         pfn(&State, &fMxcsr3, &r32Out3, &TestData.i64ValIn);
    7491                                         TestData.fMxcsrIn  = State.MXCSR;
     7428                                        fMxcsr3 = pfn(uMxCsrIn, &r32Out3, &TestData.i64ValIn);
     7429                                        TestData.fMxcsrIn  = uMxCsrIn;
    74927430                                        TestData.fMxcsrOut = fMxcsr3;
    74937431                                        TestData.r32ValOut = r32Out3;
     
    75077445static void SseBinaryR32I64Test(void)
    75087446{
    7509     X86FXSTATE State;
    7510     RT_ZERO(State);
    75117447    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseBinaryR32I64); iFn++)
    75127448    {
     
    75237459            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    75247460            {
    7525                 uint32_t fMxcsr = 0;
    75267461                RTFLOAT32U r32Dst; RT_ZERO(r32Dst);
    75277462
    7528                 State.MXCSR = paTests[iTest].fMxcsrIn;
    7529                 pfn(&State, &fMxcsr, &r32Dst, &paTests[iTest].i64ValIn);
     7463                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &r32Dst, &paTests[iTest].i64ValIn);
    75307464                if (   fMxcsr != paTests[iTest].fMxcsrOut
    75317465                    || !RTFLOAT32U_ARE_IDENTICAL(&r32Dst, &paTests[iTest].r32ValOut))
     
    76247558                        uint32_t fMxcsrM  = fMxcsrIn;
    76257559                        uint32_t fEFlagsM = fEFlags;
    7626                         pfn(&fMxcsrM, &fEFlagsM, &ValIn1, &ValIn2);
     7560                        fMxcsrM = pfn(fMxcsrIn, &fEFlagsM, &ValIn1, &ValIn2);
    76277561                        TestData.fMxcsrIn   = fMxcsrIn;
    76287562                        TestData.fMxcsrOut  = fMxcsrM;
     
    76347568                        uint32_t fMxcsrU  = fMxcsrIn;
    76357569                        uint32_t fEFlagsU = fEFlags;
    7636                         pfn(&fMxcsrU, &fEFlagsU, &ValIn1, &ValIn2);
     7570                        fMxcsrU = pfn(fMxcsrIn, &fEFlagsU, &ValIn1, &ValIn2);
    76377571                        TestData.fMxcsrIn   = fMxcsrIn;
    76387572                        TestData.fMxcsrOut  = fMxcsrU;
     
    76477581                            uint32_t fMxcsr1  = fMxcsrIn;
    76487582                            uint32_t fEFlags1 = fEFlags;
    7649                             pfn(&fMxcsr1, &fEFlags1, &ValIn1, &ValIn2);
     7583                            fMxcsr1 = pfn(fMxcsrIn, &fEFlags1, &ValIn1, &ValIn2);
    76507584                            TestData.fMxcsrIn   = fMxcsrIn;
    76517585                            TestData.fMxcsrOut  = fMxcsr1;
     
    76607594                                uint32_t fMxcsr2  = fMxcsrIn;
    76617595                                uint32_t fEFlags2 = fEFlags;
    7662                                 pfn(&fMxcsr2, &fEFlags2, &ValIn1, &ValIn2);
     7596                                fMxcsr2 = pfn(fMxcsrIn, &fEFlags2, &ValIn1, &ValIn2);
    76637597                                TestData.fMxcsrIn   = fMxcsrIn;
    76647598                                TestData.fMxcsrOut  = fMxcsr2;
     
    76747608                                        uint32_t fMxcsr3  = fMxcsrIn;
    76757609                                        uint32_t fEFlags3 = fEFlags;
    7676                                         pfn(&fMxcsr3, &fEFlags3, &ValIn1, &ValIn2);
     7610                                        fMxcsr3 = pfn(fMxcsrIn, &fEFlags3, &ValIn1, &ValIn2);
    76777611                                        TestData.fMxcsrIn   = fMxcsrIn;
    76787612                                        TestData.fMxcsrOut  = fMxcsr3;
     
    77127646                ValIn1.ar32[0] = paTests[iTest].r32ValIn1;
    77137647                ValIn2.ar32[0] = paTests[iTest].r32ValIn2;
    7714                 uint32_t fMxcsr = paTests[iTest].fMxcsrIn;
    77157648                uint32_t fEFlags = paTests[iTest].fEflIn;
    7716                 pfn(&fMxcsr, &fEFlags, &ValIn1, &ValIn2);
     7649                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &fEFlags, &ValIn1, &ValIn2);
    77177650                if (   fMxcsr != paTests[iTest].fMxcsrOut
    77187651                    || fEFlags != paTests[iTest].fEflOut)
     
    78107743                        uint32_t fMxcsrM  = fMxcsrIn;
    78117744                        uint32_t fEFlagsM = fEFlags;
    7812                         pfn(&fMxcsrM, &fEFlagsM, &ValIn1, &ValIn2);
     7745                        fMxcsrM = pfn(fMxcsrIn, &fEFlagsM, &ValIn1, &ValIn2);
    78137746                        TestData.fMxcsrIn   = fMxcsrIn;
    78147747                        TestData.fMxcsrOut  = fMxcsrM;
     
    78207753                        uint32_t fMxcsrU  = fMxcsrIn;
    78217754                        uint32_t fEFlagsU = fEFlags;
    7822                         pfn(&fMxcsrU, &fEFlagsU, &ValIn1, &ValIn2);
     7755                        fMxcsrU = pfn(fMxcsrIn, &fEFlagsU, &ValIn1, &ValIn2);
    78237756                        TestData.fMxcsrIn   = fMxcsrIn;
    78247757                        TestData.fMxcsrOut  = fMxcsrU;
     
    78337766                            uint32_t fMxcsr1  = fMxcsrIn;
    78347767                            uint32_t fEFlags1 = fEFlags;
    7835                             pfn(&fMxcsr1, &fEFlags1, &ValIn1, &ValIn2);
     7768                            fMxcsr1 = pfn(fMxcsrIn, &fEFlags1, &ValIn1, &ValIn2);
    78367769                            TestData.fMxcsrIn   = fMxcsrIn;
    78377770                            TestData.fMxcsrOut  = fMxcsr1;
     
    78467779                                uint32_t fMxcsr2  = fMxcsrIn;
    78477780                                uint32_t fEFlags2 = fEFlags;
    7848                                 pfn(&fMxcsr2, &fEFlags2, &ValIn1, &ValIn2);
     7781                                fMxcsr2 = pfn(fMxcsrIn, &fEFlags2, &ValIn1, &ValIn2);
    78497782                                TestData.fMxcsrIn   = fMxcsrIn;
    78507783                                TestData.fMxcsrOut  = fMxcsr2;
     
    78607793                                        uint32_t fMxcsr3  = fMxcsrIn;
    78617794                                        uint32_t fEFlags3 = fEFlags;
    7862                                         pfn(&fMxcsr3, &fEFlags3, &ValIn1, &ValIn2);
     7795                                        fMxcsr3 = pfn(fMxcsrIn, &fEFlags3, &ValIn1, &ValIn2);
    78637796                                        TestData.fMxcsrIn   = fMxcsrIn;
    78647797                                        TestData.fMxcsrOut  = fMxcsr3;
     
    78987831                ValIn1.ar64[0] = paTests[iTest].r64ValIn1;
    78997832                ValIn2.ar64[0] = paTests[iTest].r64ValIn2;
    7900                 uint32_t fMxcsr = paTests[iTest].fMxcsrIn;
    79017833                uint32_t fEFlags = paTests[iTest].fEflIn;
    7902                 pfn(&fMxcsr, &fEFlags, &ValIn1, &ValIn2);
     7834                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &fEFlags, &ValIn1, &ValIn2);
    79037835                if (   fMxcsr != paTests[iTest].fMxcsrOut
    79047836                    || fEFlags != paTests[iTest].fEflOut)
     
    83558287        AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseConvertXmmI32R32[iFn]), RTEXITCODE_FAILURE);
    83568288
    8357         X86FXSTATE State;
    8358         RT_ZERO(State);
    83598289        for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1)
    83608290        {
     
    83718301                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    83728302                    {
    8373                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    8374                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    8375                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    8376                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    8377                                     | X86_MXCSR_XCPT_MASK;
    8378                         IEMSSERESULT ResM; RT_ZERO(ResM);
    8379                         pfn(&State, &ResM, &ResM.uResult, &TestData.InVal);
    8380                         TestData.fMxcsrIn  = State.MXCSR;
    8381                         TestData.fMxcsrOut = ResM.MXCSR;
    8382                         TestData.OutVal    = ResM.uResult;
     8303                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     8304                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     8305                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     8306                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     8307                                          | X86_MXCSR_XCPT_MASK;
     8308                        uint32_t uMxCsrOutM = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8309                        TestData.fMxcsrIn  = uMxCsrIn;
     8310                        TestData.fMxcsrOut = uMxCsrOutM;
    83838311                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    83848312
    8385                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
    8386                         IEMSSERESULT ResU; RT_ZERO(ResU);
    8387                         pfn(&State, &ResU, &ResU.uResult, &TestData.InVal);
    8388                         TestData.fMxcsrIn  = State.MXCSR;
    8389                         TestData.fMxcsrOut = ResU.MXCSR;
    8390                         TestData.OutVal    = ResU.uResult;
     8313                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
     8314                        uint32_t uMxCsrOutU = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8315                        TestData.fMxcsrIn  = uMxCsrIn;
     8316                        TestData.fMxcsrOut = uMxCsrOutU;
    83918317                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    83928318
    8393                         uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS;
     8319                        uint16_t fXcpt = (uMxCsrOutM | uMxCsrOutU) & X86_MXCSR_XCPT_FLAGS;
    83948320                        if (fXcpt)
    83958321                        {
    8396                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    8397                             IEMSSERESULT Res1; RT_ZERO(Res1);
    8398                             pfn(&State, &Res1, &Res1.uResult, &TestData.InVal);
    8399                             TestData.fMxcsrIn  = State.MXCSR;
    8400                             TestData.fMxcsrOut = Res1.MXCSR;
    8401                             TestData.OutVal    = Res1.uResult;
     8322                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     8323                            uint32_t uMxCsrOut1 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8324                            TestData.fMxcsrIn  = uMxCsrIn;
     8325                            TestData.fMxcsrOut = uMxCsrOut1;
    84028326                            GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    84038327
    8404                             if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS))
     8328                            if (((uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS))
    84058329                            {
    8406                                 fXcpt |= Res1.MXCSR & X86_MXCSR_XCPT_FLAGS;
    8407                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    8408                                 IEMSSERESULT Res2; RT_ZERO(Res2);
    8409                                 pfn(&State, &Res2, &Res2.uResult, &TestData.InVal);
    8410                                 TestData.fMxcsrIn  = State.MXCSR;
    8411                                 TestData.fMxcsrOut = Res2.MXCSR;
    8412                                 TestData.OutVal    = Res2.uResult;
     8330                                fXcpt |= uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS;
     8331                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     8332                                uint32_t uMxCsrOut2 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8333                                TestData.fMxcsrIn  = uMxCsrIn;
     8334                                TestData.fMxcsrOut = uMxCsrOut2;
    84138335                                GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    84148336                            }
     
    84178339                                    if (fUnmasked & fXcpt)
    84188340                                    {
    8419                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    8420                                         IEMSSERESULT Res3; RT_ZERO(Res3);
    8421                                         pfn(&State, &Res3, &Res3.uResult, &TestData.InVal);
    8422                                         TestData.fMxcsrIn  = State.MXCSR;
    8423                                         TestData.fMxcsrOut = Res3.MXCSR;
    8424                                         TestData.OutVal    = Res3.uResult;
     8341                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     8342                                        uint32_t uMxCsrOut3 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8343                                        TestData.fMxcsrIn  = uMxCsrIn;
     8344                                        TestData.fMxcsrOut = uMxCsrOut3;
    84258345                                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    84268346                                    }
     
    84378357static void SseConvertXmmI32R32Test(void)
    84388358{
    8439     X86FXSTATE State;
    8440     RT_ZERO(State);
    8441 
    84428359    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertXmmI32R32); iFn++)
    84438360    {
     
    84548371            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    84558372            {
    8456                 IEMSSERESULT Res; RT_ZERO(Res);
    8457 
    8458                 State.MXCSR = paTests[iTest].fMxcsrIn;
    8459                 pfn(&State, &Res, &Res.uResult, &paTests[iTest].InVal);
    8460                 if (   Res.MXCSR != paTests[iTest].fMxcsrOut
    8461                     || !RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[0], &paTests[iTest].OutVal.ar32[0])
    8462                     || !RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[1], &paTests[iTest].OutVal.ar32[1])
    8463                     || !RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[2], &paTests[iTest].OutVal.ar32[2])
    8464                     || !RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[3], &paTests[iTest].OutVal.ar32[3]))
     8373                X86XMMREG Res; RT_ZERO(Res);
     8374
     8375                uint32_t fMxCsr = pfn(paTests[iTest].fMxcsrIn, &Res, &Res, &paTests[iTest].InVal);
     8376                if (   fMxCsr != paTests[iTest].fMxcsrOut
     8377                    || !RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[0], &paTests[iTest].OutVal.ar32[0])
     8378                    || !RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[1], &paTests[iTest].OutVal.ar32[1])
     8379                    || !RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[2], &paTests[iTest].OutVal.ar32[2])
     8380                    || !RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[3], &paTests[iTest].OutVal.ar32[3]))
    84658381                    RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%RI32'%RI32'%RI32'%RI32 \n"
    84668382                                          "%s               -> mxcsr=%#08x    %s'%s'%s'%s\n"
     
    84698385                                 paTests[iTest].InVal.ai32[0], paTests[iTest].InVal.ai32[1],
    84708386                                 paTests[iTest].InVal.ai32[2], paTests[iTest].InVal.ai32[3],
    8471                                  iVar ? "  " : "", Res.MXCSR,
    8472                                  FormatR32(&Res.uResult.ar32[0]), FormatR32(&Res.uResult.ar32[1]),
    8473                                  FormatR32(&Res.uResult.ar32[2]), FormatR32(&Res.uResult.ar32[3]),
     8387                                 iVar ? "  " : "", fMxCsr,
     8388                                 FormatR32(&Res.ar32[0]), FormatR32(&Res.ar32[1]),
     8389                                 FormatR32(&Res.ar32[2]), FormatR32(&Res.ar32[3]),
    84748390                                 iVar ? "  " : "", paTests[iTest].fMxcsrOut,
    84758391                                 FormatR32(&paTests[iTest].OutVal.ar32[0]), FormatR32(&paTests[iTest].OutVal.ar32[1]),
    84768392                                 FormatR32(&paTests[iTest].OutVal.ar32[2]), FormatR32(&paTests[iTest].OutVal.ar32[3]),
    8477                                  MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut),
    8478                                    (   !RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[0], &paTests[iTest].OutVal.ar32[0])
    8479                                     || !RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[1], &paTests[iTest].OutVal.ar32[1])
    8480                                     || !RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[2], &paTests[iTest].OutVal.ar32[2])
    8481                                     || !RTFLOAT32U_ARE_IDENTICAL(&Res.uResult.ar32[3], &paTests[iTest].OutVal.ar32[3]))
     8393                                 MxcsrDiff(fMxCsr, paTests[iTest].fMxcsrOut),
     8394                                   (   !RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[0], &paTests[iTest].OutVal.ar32[0])
     8395                                    || !RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[1], &paTests[iTest].OutVal.ar32[1])
     8396                                    || !RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[2], &paTests[iTest].OutVal.ar32[2])
     8397                                    || !RTFLOAT32U_ARE_IDENTICAL(&Res.ar32[3], &paTests[iTest].OutVal.ar32[3]))
    84828398                                 ? " - val" : "",
    84838399                                 FormatMxcsr(paTests[iTest].fMxcsrIn));
     
    85148430    };
    85158431
    8516     X86FXSTATE State;
    8517     RT_ZERO(State);
    85188432    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    85198433    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertXmmR32I32); iFn++)
     
    85508464                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    85518465                    {
    8552                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    8553                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    8554                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    8555                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    8556                                     | X86_MXCSR_XCPT_MASK;
    8557                         IEMSSERESULT ResM; RT_ZERO(ResM);
    8558                         pfn(&State, &ResM, &ResM.uResult, &TestData.InVal);
    8559                         TestData.fMxcsrIn  = State.MXCSR;
    8560                         TestData.fMxcsrOut = ResM.MXCSR;
    8561                         TestData.OutVal    = ResM.uResult;
     8466                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     8467                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     8468                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     8469                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     8470                                          | X86_MXCSR_XCPT_MASK;
     8471                        uint32_t uMxCsrOutM = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8472                        TestData.fMxcsrIn  = uMxCsrIn;
     8473                        TestData.fMxcsrOut = uMxCsrOutM;
    85628474                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    85638475
    8564                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
    8565                         IEMSSERESULT ResU; RT_ZERO(ResU);
    8566                         pfn(&State, &ResU, &ResU.uResult, &TestData.InVal);
    8567                         TestData.fMxcsrIn  = State.MXCSR;
    8568                         TestData.fMxcsrOut = ResU.MXCSR;
    8569                         TestData.OutVal    = ResU.uResult;
     8476                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
     8477                        uint32_t uMxCsrOutU = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8478                        TestData.fMxcsrIn  = uMxCsrIn;
     8479                        TestData.fMxcsrOut = uMxCsrOutU;
    85708480                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    85718481
    8572                         uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS;
     8482                        uint16_t fXcpt = (uMxCsrOutM | uMxCsrOutU) & X86_MXCSR_XCPT_FLAGS;
    85738483                        if (fXcpt)
    85748484                        {
    8575                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    8576                             IEMSSERESULT Res1; RT_ZERO(Res1);
    8577                             pfn(&State, &Res1, &Res1.uResult, &TestData.InVal);
    8578                             TestData.fMxcsrIn  = State.MXCSR;
    8579                             TestData.fMxcsrOut = Res1.MXCSR;
    8580                             TestData.OutVal    = Res1.uResult;
     8485                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     8486                            uint32_t uMxCsrOut1 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8487                            TestData.fMxcsrIn  = uMxCsrIn;
     8488                            TestData.fMxcsrOut = uMxCsrOut1;
    85818489                            GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    85828490
    8583                             if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS))
     8491                            if (((uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS))
    85848492                            {
    8585                                 fXcpt |= Res1.MXCSR & X86_MXCSR_XCPT_FLAGS;
    8586                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    8587                                 IEMSSERESULT Res2; RT_ZERO(Res2);
    8588                                 pfn(&State, &Res2, &Res2.uResult, &TestData.InVal);
    8589                                 TestData.fMxcsrIn  = State.MXCSR;
    8590                                 TestData.fMxcsrOut = Res2.MXCSR;
    8591                                 TestData.OutVal    = Res2.uResult;
     8493                                fXcpt |= uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS;
     8494                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     8495                                uint32_t uMxCsrOut2 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8496                                TestData.fMxcsrIn  = uMxCsrIn;
     8497                                TestData.fMxcsrOut = uMxCsrOut2;
    85928498                                GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    85938499                            }
     
    85968502                                    if (fUnmasked & fXcpt)
    85978503                                    {
    8598                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    8599                                         IEMSSERESULT Res3; RT_ZERO(Res3);
    8600                                         pfn(&State, &Res3, &Res3.uResult, &TestData.InVal);
    8601                                         TestData.fMxcsrIn  = State.MXCSR;
    8602                                         TestData.fMxcsrOut = Res3.MXCSR;
    8603                                         TestData.OutVal    = Res3.uResult;
     8504                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     8505                                        uint32_t uMxCsrOut3 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8506                                        TestData.fMxcsrIn  = uMxCsrIn;
     8507                                        TestData.fMxcsrOut = uMxCsrOut3;
    86048508                                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    86058509                                    }
     
    86168520static void SseConvertXmmR32I32Test(void)
    86178521{
    8618     X86FXSTATE State;
    8619     RT_ZERO(State);
    8620 
    86218522    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertXmmR32I32); iFn++)
    86228523    {
     
    86338534            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    86348535            {
    8635                 IEMSSERESULT Res; RT_ZERO(Res);
    8636 
    8637                 State.MXCSR = paTests[iTest].fMxcsrIn;
    8638                 pfn(&State, &Res, &Res.uResult, &paTests[iTest].InVal);
    8639                 if (   Res.MXCSR != paTests[iTest].fMxcsrOut
    8640                     || Res.uResult.ai32[0] != paTests[iTest].OutVal.ai32[0]
    8641                     || Res.uResult.ai32[1] != paTests[iTest].OutVal.ai32[1]
    8642                     || Res.uResult.ai32[2] != paTests[iTest].OutVal.ai32[2]
    8643                     || Res.uResult.ai32[3] != paTests[iTest].OutVal.ai32[3])
     8536                X86XMMREG Res; RT_ZERO(Res);
     8537
     8538                uint32_t fMxCsr = pfn(paTests[iTest].fMxcsrIn, &Res, &Res, &paTests[iTest].InVal);
     8539                if (   fMxCsr != paTests[iTest].fMxcsrOut
     8540                    || Res.ai32[0] != paTests[iTest].OutVal.ai32[0]
     8541                    || Res.ai32[1] != paTests[iTest].OutVal.ai32[1]
     8542                    || Res.ai32[2] != paTests[iTest].OutVal.ai32[2]
     8543                    || Res.ai32[3] != paTests[iTest].OutVal.ai32[3])
    86448544                    RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s'%s'%s \n"
    86458545                                          "%s               -> mxcsr=%#08x    %RI32'%RI32'%RI32'%RI32\n"
     
    86488548                                 FormatR32(&paTests[iTest].InVal.ar32[0]), FormatR32(&paTests[iTest].InVal.ar32[1]),
    86498549                                 FormatR32(&paTests[iTest].InVal.ar32[2]), FormatR32(&paTests[iTest].InVal.ar32[3]),
    8650                                  iVar ? "  " : "", Res.MXCSR,
    8651                                  Res.uResult.ai32[0], Res.uResult.ai32[1],
    8652                                  Res.uResult.ai32[2], Res.uResult.ai32[3],
     8550                                 iVar ? "  " : "", fMxCsr,
     8551                                 Res.ai32[0], Res.ai32[1],
     8552                                 Res.ai32[2], Res.ai32[3],
    86538553                                 iVar ? "  " : "", paTests[iTest].fMxcsrOut,
    86548554                                 paTests[iTest].OutVal.ai32[0], paTests[iTest].OutVal.ai32[1],
    86558555                                 paTests[iTest].OutVal.ai32[2], paTests[iTest].OutVal.ai32[3],
    8656                                  MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut),
    8657                                    (   Res.uResult.ai32[0] != paTests[iTest].OutVal.ai32[0]
    8658                                     || Res.uResult.ai32[1] != paTests[iTest].OutVal.ai32[1]
    8659                                     || Res.uResult.ai32[2] != paTests[iTest].OutVal.ai32[2]
    8660                                     || Res.uResult.ai32[3] != paTests[iTest].OutVal.ai32[3])
     8556                                 MxcsrDiff(fMxCsr, paTests[iTest].fMxcsrOut),
     8557                                   (   Res.ai32[0] != paTests[iTest].OutVal.ai32[0]
     8558                                    || Res.ai32[1] != paTests[iTest].OutVal.ai32[1]
     8559                                    || Res.ai32[2] != paTests[iTest].OutVal.ai32[2]
     8560                                    || Res.ai32[3] != paTests[iTest].OutVal.ai32[3])
    86618561                                 ? " - val" : "",
    86628562                                 FormatMxcsr(paTests[iTest].fMxcsrIn));
     
    87018601        AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseConvertXmmI32R64[iFn]), RTEXITCODE_FAILURE);
    87028602
    8703         X86FXSTATE State;
    8704         RT_ZERO(State);
    87058603        for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1)
    87068604        {
     
    87178615                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    87188616                    {
    8719                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    8720                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    8721                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    8722                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    8723                                     | X86_MXCSR_XCPT_MASK;
    8724                         IEMSSERESULT ResM; RT_ZERO(ResM);
    8725                         pfn(&State, &ResM, &ResM.uResult, &TestData.InVal);
    8726                         TestData.fMxcsrIn  = State.MXCSR;
    8727                         TestData.fMxcsrOut = ResM.MXCSR;
    8728                         TestData.OutVal    = ResM.uResult;
     8617                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     8618                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     8619                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     8620                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     8621                                          | X86_MXCSR_XCPT_MASK;
     8622                        uint32_t uMxCsrOutM = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8623                        TestData.fMxcsrIn  = uMxCsrIn;
     8624                        TestData.fMxcsrOut = uMxCsrOutM;
    87298625                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    87308626
    8731                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
    8732                         IEMSSERESULT ResU; RT_ZERO(ResU);
    8733                         pfn(&State, &ResU, &ResU.uResult, &TestData.InVal);
    8734                         TestData.fMxcsrIn  = State.MXCSR;
    8735                         TestData.fMxcsrOut = ResU.MXCSR;
    8736                         TestData.OutVal    = ResU.uResult;
     8627                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
     8628                        uint32_t uMxCsrOutU = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8629                        TestData.fMxcsrIn  = uMxCsrIn;
     8630                        TestData.fMxcsrOut = uMxCsrOutU;
    87378631                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    87388632
    8739                         uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS;
     8633                        uint16_t fXcpt = (uMxCsrOutM | uMxCsrOutU) & X86_MXCSR_XCPT_FLAGS;
    87408634                        if (fXcpt)
    87418635                        {
    8742                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    8743                             IEMSSERESULT Res1; RT_ZERO(Res1);
    8744                             pfn(&State, &Res1, &Res1.uResult, &TestData.InVal);
    8745                             TestData.fMxcsrIn  = State.MXCSR;
    8746                             TestData.fMxcsrOut = Res1.MXCSR;
    8747                             TestData.OutVal    = Res1.uResult;
     8636                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     8637                            uint32_t uMxCsrOut1 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8638                            TestData.fMxcsrIn  = uMxCsrIn;
     8639                            TestData.fMxcsrOut = uMxCsrOut1;
    87488640                            GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    87498641
    8750                             if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS))
     8642                            if (((uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS))
    87518643                            {
    8752                                 fXcpt |= Res1.MXCSR & X86_MXCSR_XCPT_FLAGS;
    8753                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    8754                                 IEMSSERESULT Res2; RT_ZERO(Res2);
    8755                                 pfn(&State, &Res2, &Res2.uResult, &TestData.InVal);
    8756                                 TestData.fMxcsrIn  = State.MXCSR;
    8757                                 TestData.fMxcsrOut = Res2.MXCSR;
    8758                                 TestData.OutVal    = Res2.uResult;
     8644                                fXcpt |= uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS;
     8645                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     8646                                uint32_t uMxCsrOut2 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8647                                TestData.fMxcsrIn  = uMxCsrIn;
     8648                                TestData.fMxcsrOut = uMxCsrOut2;
    87598649                                GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    87608650                            }
     
    87638653                                    if (fUnmasked & fXcpt)
    87648654                                    {
    8765                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    8766                                         IEMSSERESULT Res3; RT_ZERO(Res3);
    8767                                         pfn(&State, &Res3, &Res3.uResult, &TestData.InVal);
    8768                                         TestData.fMxcsrIn  = State.MXCSR;
    8769                                         TestData.fMxcsrOut = Res3.MXCSR;
    8770                                         TestData.OutVal    = Res3.uResult;
     8655                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     8656                                        uint32_t uMxCsrOut3 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8657                                        TestData.fMxcsrIn  = uMxCsrIn;
     8658                                        TestData.fMxcsrOut = uMxCsrOut3;
    87718659                                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    87728660                                    }
     
    87838671static void SseConvertXmmI32R64Test(void)
    87848672{
    8785     X86FXSTATE State;
    8786     RT_ZERO(State);
    8787 
    87888673    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertXmmI32R64); iFn++)
    87898674    {
     
    88008685            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    88018686            {
    8802                 IEMSSERESULT Res; RT_ZERO(Res);
    8803 
    8804                 State.MXCSR = paTests[iTest].fMxcsrIn;
    8805                 pfn(&State, &Res, &Res.uResult, &paTests[iTest].InVal);
    8806                 if (   Res.MXCSR != paTests[iTest].fMxcsrOut
    8807                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest].OutVal.ar64[0])
    8808                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest].OutVal.ar64[1]))
     8687                X86XMMREG Res; RT_ZERO(Res);
     8688
     8689                uint32_t fMxCsr = pfn(paTests[iTest].fMxcsrIn, &Res, &Res, &paTests[iTest].InVal);
     8690                if (   fMxCsr != paTests[iTest].fMxcsrOut
     8691                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[0], &paTests[iTest].OutVal.ar64[0])
     8692                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[1], &paTests[iTest].OutVal.ar64[1]))
    88098693                    RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%RI32'%RI32'%RI32'%RI32 \n"
    88108694                                          "%s               -> mxcsr=%#08x    %s'%s\n"
     
    88138697                                 paTests[iTest].InVal.ai32[0], paTests[iTest].InVal.ai32[1],
    88148698                                 paTests[iTest].InVal.ai32[2], paTests[iTest].InVal.ai32[3],
    8815                                  iVar ? "  " : "", Res.MXCSR,
    8816                                  FormatR64(&Res.uResult.ar64[0]), FormatR64(&Res.uResult.ar64[1]),
     8699                                 iVar ? "  " : "", fMxCsr,
     8700                                 FormatR64(&Res.ar64[0]), FormatR64(&Res.ar64[1]),
    88178701                                 iVar ? "  " : "", paTests[iTest].fMxcsrOut,
    88188702                                 FormatR64(&paTests[iTest].OutVal.ar64[0]), FormatR64(&paTests[iTest].OutVal.ar64[1]),
    8819                                  MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut),
    8820                                    (   !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[0], &paTests[iTest].OutVal.ar64[0])
    8821                                     || !RTFLOAT64U_ARE_IDENTICAL(&Res.uResult.ar64[1], &paTests[iTest].OutVal.ar64[1]))
     8703                                 MxcsrDiff(fMxCsr, paTests[iTest].fMxcsrOut),
     8704                                   (   !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[0], &paTests[iTest].OutVal.ar64[0])
     8705                                    || !RTFLOAT64U_ARE_IDENTICAL(&Res.ar64[1], &paTests[iTest].OutVal.ar64[1]))
    88228706                                 ? " - val" : "",
    88238707                                 FormatMxcsr(paTests[iTest].fMxcsrIn));
     
    88548738    };
    88558739
    8856     X86FXSTATE State;
    8857     RT_ZERO(State);
    88588740    uint32_t cMinNormalPairs       = (cTests - 144) / 4;
    88598741    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertXmmR64I32); iFn++)
     
    88868768                    for (uint8_t iFz = 0; iFz < 2; iFz++)
    88878769                    {
    8888                         State.MXCSR = (fMxcsr & ~X86_MXCSR_RC_MASK)
    8889                                     | (iRounding  << X86_MXCSR_RC_SHIFT)
    8890                                     | (iDaz ? X86_MXCSR_DAZ : 0)
    8891                                     | (iFz  ? X86_MXCSR_FZ  : 0)
    8892                                     | X86_MXCSR_XCPT_MASK;
    8893                         IEMSSERESULT ResM; RT_ZERO(ResM);
    8894                         pfn(&State, &ResM, &ResM.uResult, &TestData.InVal);
    8895                         TestData.fMxcsrIn  = State.MXCSR;
    8896                         TestData.fMxcsrOut = ResM.MXCSR;
    8897                         TestData.OutVal    = ResM.uResult;
     8770                        uint32_t uMxCsrIn = (fMxcsr & ~X86_MXCSR_RC_MASK)
     8771                                          | (iRounding  << X86_MXCSR_RC_SHIFT)
     8772                                          | (iDaz ? X86_MXCSR_DAZ : 0)
     8773                                          | (iFz  ? X86_MXCSR_FZ  : 0)
     8774                                          | X86_MXCSR_XCPT_MASK;
     8775                        uint32_t uMxCsrOutM = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8776                        TestData.fMxcsrIn  = uMxCsrIn;
     8777                        TestData.fMxcsrOut = uMxCsrOutM;
    88988778                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    88998779
    8900                         State.MXCSR = State.MXCSR & ~X86_MXCSR_XCPT_MASK;
    8901                         IEMSSERESULT ResU; RT_ZERO(ResU);
    8902                         pfn(&State, &ResU, &ResU.uResult, &TestData.InVal);
    8903                         TestData.fMxcsrIn  = State.MXCSR;
    8904                         TestData.fMxcsrOut = ResU.MXCSR;
    8905                         TestData.OutVal    = ResU.uResult;
     8780                        uMxCsrIn = uMxCsrIn & ~X86_MXCSR_XCPT_MASK;
     8781                        uint32_t uMxCsrOutU = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8782                        TestData.fMxcsrIn  = uMxCsrIn;
     8783                        TestData.fMxcsrOut = uMxCsrOutU;
    89068784                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    89078785
    8908                         uint16_t fXcpt = (ResM.MXCSR | ResU.MXCSR) & X86_MXCSR_XCPT_FLAGS;
     8786                        uint16_t fXcpt = (uMxCsrOutM | uMxCsrOutU) & X86_MXCSR_XCPT_FLAGS;
    89098787                        if (fXcpt)
    89108788                        {
    8911                             State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | fXcpt;
    8912                             IEMSSERESULT Res1; RT_ZERO(Res1);
    8913                             pfn(&State, &Res1, &Res1.uResult, &TestData.InVal);
    8914                             TestData.fMxcsrIn  = State.MXCSR;
    8915                             TestData.fMxcsrOut = Res1.MXCSR;
    8916                             TestData.OutVal    = Res1.uResult;
     8789                            uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | fXcpt;
     8790                            uint32_t uMxCsrOut1 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8791                            TestData.fMxcsrIn  = uMxCsrIn;
     8792                            TestData.fMxcsrOut = uMxCsrOut1;
    89178793                            GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    89188794
    8919                             if (((Res1.MXCSR & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (Res1.MXCSR & X86_MXCSR_XCPT_FLAGS))
     8795                            if (((uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS) & fXcpt) != (uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS))
    89208796                            {
    8921                                 fXcpt |= Res1.MXCSR & X86_MXCSR_XCPT_FLAGS;
    8922                                 State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
    8923                                 IEMSSERESULT Res2; RT_ZERO(Res2);
    8924                                 pfn(&State, &Res2, &Res2.uResult, &TestData.InVal);
    8925                                 TestData.fMxcsrIn  = State.MXCSR;
    8926                                 TestData.fMxcsrOut = Res2.MXCSR;
    8927                                 TestData.OutVal    = Res2.uResult;
     8797                                fXcpt |= uMxCsrOut1 & X86_MXCSR_XCPT_FLAGS;
     8798                                uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | (fXcpt << X86_MXCSR_XCPT_MASK_SHIFT);
     8799                                uint32_t uMxCsrOut2 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8800                                TestData.fMxcsrIn  = uMxCsrIn;
     8801                                TestData.fMxcsrOut = uMxCsrOut2;
    89288802                                GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    89298803                            }
     
    89328806                                    if (fUnmasked & fXcpt)
    89338807                                    {
    8934                                         State.MXCSR = (State.MXCSR & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
    8935                                         IEMSSERESULT Res3; RT_ZERO(Res3);
    8936                                         pfn(&State, &Res3, &Res3.uResult, &TestData.InVal);
    8937                                         TestData.fMxcsrIn  = State.MXCSR;
    8938                                         TestData.fMxcsrOut = Res3.MXCSR;
    8939                                         TestData.OutVal    = Res3.uResult;
     8808                                        uMxCsrIn = (uMxCsrIn & ~X86_MXCSR_XCPT_MASK) | ((fXcpt & ~fUnmasked) << X86_MXCSR_XCPT_MASK_SHIFT);
     8809                                        uint32_t uMxCsrOut3 = pfn(uMxCsrIn, &TestData.OutVal, &TestData.OutVal, &TestData.InVal);
     8810                                        TestData.fMxcsrIn  = uMxCsrIn;
     8811                                        TestData.fMxcsrOut = uMxCsrOut3;
    89408812                                        GenerateBinaryWrite(&BinOut, &TestData, sizeof(TestData));
    89418813                                    }
     
    89528824static void SseConvertXmmR64I32Test(void)
    89538825{
    8954     X86FXSTATE State;
    8955     RT_ZERO(State);
    8956 
    89578826    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertXmmR64I32); iFn++)
    89588827    {
     
    89698838            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    89708839            {
    8971                 IEMSSERESULT Res; RT_ZERO(Res);
    8972 
    8973                 State.MXCSR = paTests[iTest].fMxcsrIn;
    8974                 pfn(&State, &Res, &Res.uResult, &paTests[iTest].InVal);
    8975                 if (   Res.MXCSR != paTests[iTest].fMxcsrOut
    8976                     || Res.uResult.ai32[0] != paTests[iTest].OutVal.ai32[0]
    8977                     || Res.uResult.ai32[1] != paTests[iTest].OutVal.ai32[1]
    8978                     || Res.uResult.ai32[2] != paTests[iTest].OutVal.ai32[2]
    8979                     || Res.uResult.ai32[3] != paTests[iTest].OutVal.ai32[3])
     8840                X86XMMREG Res; RT_ZERO(Res);
     8841
     8842                uint32_t fMxCsr = pfn(paTests[iTest].fMxcsrIn, &Res, &Res, &paTests[iTest].InVal);
     8843                if (   fMxCsr != paTests[iTest].fMxcsrOut
     8844                    || Res.ai32[0] != paTests[iTest].OutVal.ai32[0]
     8845                    || Res.ai32[1] != paTests[iTest].OutVal.ai32[1]
     8846                    || Res.ai32[2] != paTests[iTest].OutVal.ai32[2]
     8847                    || Res.ai32[3] != paTests[iTest].OutVal.ai32[3])
    89808848                    RTTestFailed(g_hTest, "#%04u%s: mxcsr=%#08x in1=%s'%s \n"
    89818849                                          "%s               -> mxcsr=%#08x    %RI32'%RI32'%RI32'%RI32\n"
     
    89838851                                 iTest, iVar ? "/n" : "", paTests[iTest].fMxcsrIn,
    89848852                                 FormatR64(&paTests[iTest].InVal.ar64[0]), FormatR64(&paTests[iTest].InVal.ar64[1]),
    8985                                  iVar ? "  " : "", Res.MXCSR,
    8986                                  Res.uResult.ai32[0], Res.uResult.ai32[1],
    8987                                  Res.uResult.ai32[2], Res.uResult.ai32[3],
     8853                                 iVar ? "  " : "", fMxCsr,
     8854                                 Res.ai32[0], Res.ai32[1],
     8855                                 Res.ai32[2], Res.ai32[3],
    89888856                                 iVar ? "  " : "", paTests[iTest].fMxcsrOut,
    89898857                                 paTests[iTest].OutVal.ai32[0], paTests[iTest].OutVal.ai32[1],
    89908858                                 paTests[iTest].OutVal.ai32[2], paTests[iTest].OutVal.ai32[3],
    8991                                  MxcsrDiff(Res.MXCSR, paTests[iTest].fMxcsrOut),
    8992                                    (   Res.uResult.ai32[0] != paTests[iTest].OutVal.ai32[0]
    8993                                     || Res.uResult.ai32[1] != paTests[iTest].OutVal.ai32[1]
    8994                                     || Res.uResult.ai32[2] != paTests[iTest].OutVal.ai32[2]
    8995                                     || Res.uResult.ai32[3] != paTests[iTest].OutVal.ai32[3])
     8859                                 MxcsrDiff(fMxCsr, paTests[iTest].fMxcsrOut),
     8860                                   (   Res.ai32[0] != paTests[iTest].OutVal.ai32[0]
     8861                                    || Res.ai32[1] != paTests[iTest].OutVal.ai32[1]
     8862                                    || Res.ai32[2] != paTests[iTest].OutVal.ai32[2]
     8863                                    || Res.ai32[3] != paTests[iTest].OutVal.ai32[3])
    89968864                                 ? " - val" : "",
    89978865                                 FormatMxcsr(paTests[iTest].fMxcsrIn));
     
    91318999static void SseConvertMmXmmTest(void)
    91329000{
    9133     X86FXSTATE State;
    9134     RT_ZERO(State);
    9135 
    91369001    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseConvertMmXmm); iFn++)
    91379002    {
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r104099 r104129  
    10781078#define IEM_MC_CALL_AVX_AIMPL_3(a_pfnAImpl, a0, a1, a2) \
    10791079    do { (void)fAvxHost; (void)fAvxWrite; CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); (void)fMcBegin; } while (0)
     1080#define IEM_MC_CALL_AVX_AIMPL_NEW_3(a_pfnAImpl, a0, a1, a2) \
     1081    do { (void)fAvxHost; (void)fAvxWrite; CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); (void)fMcBegin; } while (0)
    10801082#define IEM_MC_CALL_AVX_AIMPL_4(a_pfnAImpl, a0, a1, a2, a3) \
    10811083    do { (void)fAvxHost; (void)fAvxWrite; CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); CHK_CALL_ARG(a3, 3); (void)fMcBegin; } while (0)
Note: See TracChangeset for help on using the changeset viewer.

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