VirtualBox

Changeset 104135 in vbox


Ignore:
Timestamp:
Apr 3, 2024 1:18:38 PM (8 months ago)
Author:
vboxsync
Message:

VMM/IEM: Rework MXCSR handling for AVX instructions. See r162550 for an explanation, bugref:10641

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r104132 r104135  
    48174817
    48184818;;
    4819 ; Need to move this as well somewhere better?
    4820 ;
    4821 struc IEMAVX128RESULT
    4822     .uResult      resd 4
    4823     .MXCSR        resd 1
    4824 endstruc
    4825 
    4826 
    4827 ;;
    4828 ; Need to move this as well somewhere better?
    4829 ;
    4830 struc IEMAVX256RESULT
    4831     .uResult      resd 8
    4832     .MXCSR        resd 1
    4833 endstruc
    4834 
    4835 
    4836 ;;
    48374819; Initialize the SSE MXCSR register using the guest value partially to
    48384820; account for rounding mode, load the value from the given register.
     
    48414823; @param    1       Expression giving the register holding the guest's MXCSR.
    48424824;
    4843 %macro SSE_LD_MXCSR 1
     4825%macro SSE_AVX_LD_MXCSR 1
    48444826        sub     xSP, 4
    48454827
     
    48644846; @note Restores the stack pointer.
    48654847;
    4866 %macro SSE_ST_MXCSR 2
     4848%macro SSE_AVX_ST_MXCSR 2
    48674849        sub     xSP, 4
    48684850        stmxcsr [xSP]
     
    48794861
    48804862;;
    4881 ; Initialize the SSE MXCSR register using the guest value partially to
    4882 ; account for rounding mode.
    4883 ;
    4884 ; @uses     4 bytes of stack to save the original value.
    4885 ; @param    1       Expression giving the address of the FXSTATE of the guest.
    4886 ;
    4887 %macro AVX_LD_XSAVEAREA_MXCSR 1
    4888         sub     xSP, 4
    4889 
    4890         stmxcsr [xSP]
    4891         mov     T0_32, [%1 + X86FXSTATE.MXCSR]
    4892         and     T0_32, X86_MXCSR_FZ | X86_MXCSR_RC_MASK | X86_MXCSR_DAZ
    4893         sub     xSP, 4
    4894         mov     [xSP], T0_32
    4895         ldmxcsr [xSP]
    4896         add     xSP, 4
    4897 %endmacro
    4898 
    4899 
    4900 ;;
    4901 ; Restores the AVX128 MXCSR register with the original value.
    4902 ;
    4903 ; @param    1       Expression giving the address where to return the MXCSR value.
    4904 ;
    4905 ; @note Restores the stack pointer.
    4906 ;
    4907 %macro AVX128_ST_XSAVEAREA_MXCSR 1
    4908         stmxcsr [%1 + IEMAVX128RESULT.MXCSR]
    4909 
    4910         ldmxcsr [xSP]
    4911         add     xSP, 4
    4912 %endmacro
    4913 
    4914 
    4915 ;;
    4916 ; Restores the AVX256 MXCSR register with the original value.
    4917 ;
    4918 ; @param    1       Expression giving the address where to return the MXCSR value.
    4919 ;
    4920 ; @note Restores the stack pointer.
    4921 ;
    4922 %macro AVX256_ST_XSAVEAREA_MXCSR 1
    4923         stmxcsr [%1 + IEMAVX256RESULT.MXCSR]
    4924 
    4925         ldmxcsr [xSP]
    4926         add     xSP, 4
    4927 %endmacro
    4928 
    4929 
    4930 ;;
    49314863; Floating point instruction working on two full sized registers.
    49324864;
     
    49444876        PROLOGUE_4_ARGS
    49454877        IEMIMPL_SSE_PROLOGUE
    4946         SSE_LD_MXCSR A0_32
     4878        SSE_AVX_LD_MXCSR A0_32
    49474879
    49484880        movdqu   xmm0, [A2]
     
    49514883        movdqu   [A1], xmm0
    49524884
    4953         SSE_ST_MXCSR R0_32, A0_32
     4885        SSE_AVX_ST_MXCSR R0_32, A0_32
    49544886        IEMIMPL_SSE_PROLOGUE
    49554887        EPILOGUE_4_ARGS
     
    49604892        PROLOGUE_4_ARGS
    49614893        IEMIMPL_AVX_PROLOGUE
    4962         AVX_LD_XSAVEAREA_MXCSR A0
     4894        SSE_AVX_LD_MXCSR A0_32
    49634895
    49644896        vmovdqu  xmm0, [A2]
     
    49674899        vmovdqu  [A1 + IEMAVX128RESULT.uResult], xmm0
    49684900
    4969         AVX128_ST_XSAVEAREA_MXCSR A1
     4901        SSE_AVX_ST_MXCSR R0_32, A0_32
    49704902        IEMIMPL_AVX_PROLOGUE
    49714903        EPILOGUE_4_ARGS
     
    49754907        PROLOGUE_4_ARGS
    49764908        IEMIMPL_AVX_PROLOGUE
    4977         AVX_LD_XSAVEAREA_MXCSR A0
     4909        SSE_AVX_LD_MXCSR A0_32
    49784910
    49794911        vmovdqu  ymm0, [A2]
     
    49824914        vmovdqu  [A1 + IEMAVX256RESULT.uResult], ymm0
    49834915
    4984         AVX256_ST_XSAVEAREA_MXCSR A1
     4916        SSE_AVX_ST_MXCSR R0_32, A0_32
    49854917        IEMIMPL_AVX_PROLOGUE
    49864918        EPILOGUE_4_ARGS
     
    49904922        PROLOGUE_4_ARGS
    49914923        IEMIMPL_AVX_PROLOGUE
    4992         AVX_LD_XSAVEAREA_MXCSR A0
     4924        SSE_AVX_LD_MXCSR A0_32
    49934925
    49944926        vmovdqu  xmm0, [A2]
     
    49974929        vmovdqu  [A1 + IEMAVX128RESULT.uResult], xmm0
    49984930
    4999         AVX128_ST_XSAVEAREA_MXCSR A1
     4931        SSE_AVX_ST_MXCSR R0_32, A0_32
    50004932        IEMIMPL_AVX_PROLOGUE
    50014933        EPILOGUE_4_ARGS
     
    50054937        PROLOGUE_4_ARGS
    50064938        IEMIMPL_AVX_PROLOGUE
    5007         AVX_LD_XSAVEAREA_MXCSR A0
     4939        SSE_AVX_LD_MXCSR A0_32
    50084940
    50094941        vmovdqu  ymm0, [A2]
     
    50124944        vmovdqu  [A1 + IEMAVX256RESULT.uResult], ymm0
    50134945
    5014         AVX256_ST_XSAVEAREA_MXCSR A1
     4946        SSE_AVX_ST_MXCSR R0_32, A0_32
    50154947        IEMIMPL_AVX_PROLOGUE
    50164948        EPILOGUE_4_ARGS
     
    50715003        PROLOGUE_4_ARGS
    50725004        IEMIMPL_SSE_PROLOGUE
    5073         SSE_LD_MXCSR A0_32
     5005        SSE_AVX_LD_MXCSR A0_32
    50745006
    50755007        movdqu   xmm0, [A2]
     
    50785010        movdqu   [A1], xmm0
    50795011
    5080         SSE_ST_MXCSR R0_32, A0_32
     5012        SSE_AVX_ST_MXCSR R0_32, A0_32
    50815013        IEMIMPL_SSE_EPILOGUE
    50825014        EPILOGUE_4_ARGS
     
    51265058        PROLOGUE_4_ARGS
    51275059        IEMIMPL_SSE_PROLOGUE
    5128         SSE_LD_MXCSR A0_32
     5060        SSE_AVX_LD_MXCSR A0_32
    51295061
    51305062        movdqu   xmm0, [A2]
     
    51335065        movdqu   [A1], xmm0
    51345066
    5135         SSE_ST_MXCSR R0_32, A0_32
     5067        SSE_AVX_ST_MXCSR R0_32, A0_32
    51365068        IEMIMPL_SSE_EPILOGUE
    51375069        EPILOGUE_4_ARGS
     
    51805112        PROLOGUE_4_ARGS
    51815113        IEMIMPL_SSE_PROLOGUE
    5182         SSE_LD_MXCSR A0_32
     5114        SSE_AVX_LD_MXCSR A0_32
    51835115
    51845116        movdqu   xmm0, [A2]
     
    51875119        movdqu   [A1], xmm0
    51885120
    5189         SSE_ST_MXCSR R0_32, A0_32
     5121        SSE_AVX_ST_MXCSR R0_32, A0_32
    51905122        IEMIMPL_SSE_EPILOGUE
    51915123        EPILOGUE_4_ARGS
     
    59905922        PROLOGUE_4_ARGS
    59915923        IEMIMPL_SSE_PROLOGUE
    5992         SSE_LD_MXCSR A0_32
     5924        SSE_AVX_LD_MXCSR A0_32
    59935925
    59945926        cvttsd2si T0_32, [A2]
    59955927        mov       dword [A1], T0_32
    59965928
    5997         SSE_ST_MXCSR R0_32, A0_32
     5929        SSE_AVX_ST_MXCSR R0_32, A0_32
    59985930        IEMIMPL_SSE_EPILOGUE
    59995931        EPILOGUE_4_ARGS
     
    60115943        PROLOGUE_3_ARGS
    60125944        IEMIMPL_SSE_PROLOGUE
    6013         SSE_LD_MXCSR A0_32
     5945        SSE_AVX_LD_MXCSR A0_32
    60145946
    60155947        cvttsd2si T0, [A2]
    60165948        mov       qword [A1], T0
    60175949
    6018         SSE_ST_MXCSR R0_32, A0_32
     5950        SSE_AVX_ST_MXCSR R0_32, A0_32
    60195951        IEMIMPL_SSE_EPILOGUE
    60205952        EPILOGUE_3_ARGS
     
    60335965        PROLOGUE_3_ARGS
    60345966        IEMIMPL_SSE_PROLOGUE
    6035         SSE_LD_MXCSR A0_32
     5967        SSE_AVX_LD_MXCSR A0_32
    60365968
    60375969        cvtsd2si  T0_32, [A2]
    60385970        mov       dword [A1], T0_32
    60395971
    6040         SSE_ST_MXCSR R0_32, A0_32
     5972        SSE_AVX_ST_MXCSR R0_32, A0_32
    60415973        IEMIMPL_SSE_EPILOGUE
    60425974        EPILOGUE_3_ARGS
     
    60545986        PROLOGUE_3_ARGS
    60555987        IEMIMPL_SSE_PROLOGUE
    6056         SSE_LD_MXCSR A0_32
     5988        SSE_AVX_LD_MXCSR A0_32
    60575989
    60585990        cvtsd2si  T0, [A2]
    60595991        mov       qword [A1], T0
    60605992
    6061         SSE_ST_MXCSR R0_32, A0_32
     5993        SSE_AVX_ST_MXCSR R0_32, A0_32
    60625994        IEMIMPL_SSE_EPILOGUE
    60635995        EPILOGUE_3_ARGS
     
    60766008        PROLOGUE_3_ARGS
    60776009        IEMIMPL_SSE_PROLOGUE
    6078         SSE_LD_MXCSR A0_32
     6010        SSE_AVX_LD_MXCSR A0_32
    60796011
    60806012        cvttss2si T0_32, [A2]
    60816013        mov       dword [A1], T0_32
    60826014
    6083         SSE_ST_MXCSR R0_32, A0_32
     6015        SSE_AVX_ST_MXCSR R0_32, A0_32
    60846016        IEMIMPL_SSE_EPILOGUE
    60856017        EPILOGUE_3_ARGS
     
    60976029        PROLOGUE_3_ARGS
    60986030        IEMIMPL_SSE_PROLOGUE
    6099         SSE_LD_MXCSR A0_32
     6031        SSE_AVX_LD_MXCSR A0_32
    61006032
    61016033        cvttss2si T0, [A2]
    61026034        mov       qword [A1], T0
    61036035
    6104         SSE_ST_MXCSR R0_32, A0_32
     6036        SSE_AVX_ST_MXCSR R0_32, A0_32
    61056037        IEMIMPL_SSE_EPILOGUE
    61066038        EPILOGUE_3_ARGS
     
    61196051        PROLOGUE_3_ARGS
    61206052        IEMIMPL_SSE_PROLOGUE
    6121         SSE_LD_MXCSR A0_32
     6053        SSE_AVX_LD_MXCSR A0_32
    61226054
    61236055        cvtss2si  T0_32, [A2]
    61246056        mov       dword [A1], T0_32
    61256057
    6126         SSE_ST_MXCSR R0_32, A0_32
     6058        SSE_AVX_ST_MXCSR R0_32, A0_32
    61276059        IEMIMPL_SSE_EPILOGUE
    61286060        EPILOGUE_3_ARGS
     
    61406072        PROLOGUE_3_ARGS
    61416073        IEMIMPL_SSE_PROLOGUE
    6142         SSE_LD_MXCSR A0_32
     6074        SSE_AVX_LD_MXCSR A0_32
    61436075
    61446076        cvtss2si  T0, [A2]
    61456077        mov       qword [A1], T0
    61466078
    6147         SSE_ST_MXCSR R0_32, A0_32
     6079        SSE_AVX_ST_MXCSR R0_32, A0_32
    61486080        IEMIMPL_SSE_EPILOGUE
    61496081        EPILOGUE_3_ARGS
     
    61626094        PROLOGUE_3_ARGS
    61636095        IEMIMPL_SSE_PROLOGUE
    6164         SSE_LD_MXCSR A0_32
     6096        SSE_AVX_LD_MXCSR A0_32
    61656097
    61666098        cvtsi2ss  xmm0, dword [A2]
    61676099        movd      dword [A1], xmm0
    61686100
    6169         SSE_ST_MXCSR R0_32, A0_32
     6101        SSE_AVX_ST_MXCSR R0_32, A0_32
    61706102        IEMIMPL_SSE_EPILOGUE
    61716103        EPILOGUE_3_ARGS
     
    61836115        PROLOGUE_3_ARGS
    61846116        IEMIMPL_SSE_PROLOGUE
    6185         SSE_LD_MXCSR A0_32
     6117        SSE_AVX_LD_MXCSR A0_32
    61866118
    61876119        cvtsi2ss  xmm0, qword [A2]
    61886120        movd      dword [A1], xmm0
    61896121
    6190         SSE_ST_MXCSR R0_32, A0_32
     6122        SSE_AVX_ST_MXCSR R0_32, A0_32
    61916123        IEMIMPL_SSE_EPILOGUE
    61926124        EPILOGUE_3_ARGS
     
    62056137        PROLOGUE_3_ARGS
    62066138        IEMIMPL_SSE_PROLOGUE
    6207         SSE_LD_MXCSR A0_32
     6139        SSE_AVX_LD_MXCSR A0_32
    62086140
    62096141        cvtsi2sd  xmm0, dword [A2]
    62106142        movq      [A1], xmm0
    62116143
    6212         SSE_ST_MXCSR R0_32, A0_32
     6144        SSE_AVX_ST_MXCSR R0_32, A0_32
    62136145        IEMIMPL_SSE_EPILOGUE
    62146146        EPILOGUE_3_ARGS
     
    62266158        PROLOGUE_3_ARGS
    62276159        IEMIMPL_SSE_PROLOGUE
    6228         SSE_LD_MXCSR A0_32
     6160        SSE_AVX_LD_MXCSR A0_32
    62296161
    62306162        cvtsi2sd  xmm0, qword [A2]
    62316163        movq      [A1], xmm0
    62326164
    6233         SSE_ST_MXCSR R0_32, A0_32
     6165        SSE_AVX_ST_MXCSR R0_32, A0_32
    62346166        IEMIMPL_SSE_EPILOGUE
    62356167        EPILOGUE_3_ARGS
     
    62496181        PROLOGUE_4_ARGS
    62506182        IEMIMPL_SSE_PROLOGUE
    6251         SSE_LD_MXCSR A0_32
     6183        SSE_AVX_LD_MXCSR A0_32
    62526184
    62536185        movdqu  xmm0, [A2]
     
    62566188        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    62576189
    6258         SSE_ST_MXCSR R0_32, A0_32
     6190        SSE_AVX_ST_MXCSR R0_32, A0_32
    62596191        IEMIMPL_SSE_EPILOGUE
    62606192        EPILOGUE_4_ARGS
     
    62646196        PROLOGUE_4_ARGS
    62656197        IEMIMPL_SSE_PROLOGUE
    6266         SSE_LD_MXCSR A0_32
     6198        SSE_AVX_LD_MXCSR A0_32
    62676199
    62686200        movdqu  xmm0, [A2]
     
    62716203        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    62726204
    6273         SSE_ST_MXCSR R0_32, A0_32
     6205        SSE_AVX_ST_MXCSR R0_32, A0_32
    62746206        IEMIMPL_SSE_EPILOGUE
    62756207        EPILOGUE_3_ARGS
     
    62896221        PROLOGUE_4_ARGS
    62906222        IEMIMPL_SSE_PROLOGUE
    6291         SSE_LD_MXCSR A0_32
     6223        SSE_AVX_LD_MXCSR A0_32
    62926224
    62936225        movdqu  xmm0, [A2]
     
    62966228        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    62976229
    6298         SSE_ST_MXCSR R0_32, A0_32
     6230        SSE_AVX_ST_MXCSR R0_32, A0_32
    62996231        IEMIMPL_SSE_EPILOGUE
    63006232        EPILOGUE_4_ARGS
     
    63046236        PROLOGUE_4_ARGS
    63056237        IEMIMPL_SSE_PROLOGUE
    6306         SSE_LD_MXCSR A0_32
     6238        SSE_AVX_LD_MXCSR A0_32
    63076239
    63086240        movdqu  xmm0, [A2]
     
    63116243        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    63126244
    6313         SSE_ST_MXCSR R0_32, A0_32
     6245        SSE_AVX_ST_MXCSR R0_32, A0_32
    63146246        IEMIMPL_SSE_EPILOGUE
    63156247        EPILOGUE_4_ARGS
     
    63286260        PROLOGUE_4_ARGS
    63296261        IEMIMPL_SSE_PROLOGUE
    6330         SSE_LD_MXCSR A0_32
     6262        SSE_AVX_LD_MXCSR A0_32
    63316263
    63326264        movdqu  xmm0, [A2]
     
    63356267        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    63366268
    6337         SSE_ST_MXCSR R0_32, A0_32
     6269        SSE_AVX_ST_MXCSR R0_32, A0_32
    63386270        IEMIMPL_SSE_EPILOGUE
    63396271        EPILOGUE_4_ARGS
     
    63436275        PROLOGUE_4_ARGS
    63446276        IEMIMPL_SSE_PROLOGUE
    6345         SSE_LD_MXCSR A0_32
     6277        SSE_AVX_LD_MXCSR A0_32
    63466278
    63476279        movdqu  xmm0, [A2]
     
    63506282        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    63516283
    6352         SSE_ST_MXCSR R0_32, A0_32
     6284        SSE_AVX_ST_MXCSR R0_32, A0_32
    63536285        IEMIMPL_SSE_EPILOGUE
    63546286        EPILOGUE_4_ARGS
     
    63686300        PROLOGUE_4_ARGS
    63696301        IEMIMPL_SSE_PROLOGUE
    6370         SSE_LD_MXCSR A0_32
     6302        SSE_AVX_LD_MXCSR A0_32
    63716303
    63726304        movdqu  xmm0, [A2]
     
    63756307        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    63766308
    6377         SSE_ST_MXCSR R0_32, A0_32
     6309        SSE_AVX_ST_MXCSR R0_32, A0_32
    63786310        IEMIMPL_SSE_EPILOGUE
    63796311        EPILOGUE_4_ARGS
     
    63836315        PROLOGUE_4_ARGS
    63846316        IEMIMPL_SSE_PROLOGUE
    6385         SSE_LD_MXCSR A0_32
     6317        SSE_AVX_LD_MXCSR A0_32
    63866318
    63876319        movdqu  xmm0, [A2]
     
    63906322        IEM_SAVE_FLAGS A1, X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF, 0, X86_EFL_OF | X86_EFL_SF | X86_EFL_AF
    63916323
    6392         SSE_ST_MXCSR R0_32, A0_32
     6324        SSE_AVX_ST_MXCSR R0_32, A0_32
    63936325        IEMIMPL_SSE_EPILOGUE
    63946326        EPILOGUE_4_ARGS
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r104133 r104135  
    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, ),
    29982997    'IEM_MC_CALL_CIMPL_0':                                       (McBlock.parseMcCallCImpl,         True,  True,  False, ),
    29992998    'IEM_MC_CALL_CIMPL_1':                                       (McBlock.parseMcCallCImpl,         True,  True,  False, ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h

    r104133 r104135  
    23432343        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    23442344        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    2345         IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomiss_u128, iemAImpl_vucomiss_u128_fallback),
    2346                                     pEFlags, puSrc1, puSrc2);
     2345        IEM_MC_CALL_AVX_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomiss_u128, iemAImpl_vucomiss_u128_fallback),
     2346                                pEFlags, puSrc1, puSrc2);
    23472347        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    23482348            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    23752375        IEM_MC_FETCH_EFLAGS(fEFlags);
    23762376        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    2377         IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomiss_u128, iemAImpl_vucomiss_u128_fallback),
    2378                                     pEFlags, puSrc1, puSrc2);
     2377        IEM_MC_CALL_AVX_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomiss_u128, iemAImpl_vucomiss_u128_fallback),
     2378                                pEFlags, puSrc1, puSrc2);
    23792379        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    23802380            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    24152415        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    24162416        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    2417         IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomisd_u128, iemAImpl_vucomisd_u128_fallback),
    2418                                     pEFlags, puSrc1, puSrc2);
     2417        IEM_MC_CALL_AVX_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomisd_u128, iemAImpl_vucomisd_u128_fallback),
     2418                                pEFlags, puSrc1, puSrc2);
    24192419        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    24202420            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    24472447        IEM_MC_FETCH_EFLAGS(fEFlags);
    24482448        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    2449         IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomisd_u128, iemAImpl_vucomisd_u128_fallback),
    2450                                     pEFlags, puSrc1, puSrc2);
     2449        IEM_MC_CALL_AVX_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vucomisd_u128, iemAImpl_vucomisd_u128_fallback),
     2450                                pEFlags, puSrc1, puSrc2);
    24512451        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    24522452            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    24902490        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    24912491        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    2492         IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomiss_u128, iemAImpl_vcomiss_u128_fallback),
    2493                                     pEFlags, puSrc1, puSrc2);
     2492        IEM_MC_CALL_AVX_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomiss_u128, iemAImpl_vcomiss_u128_fallback),
     2493                                pEFlags, puSrc1, puSrc2);
    24942494        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    24952495            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    25222522        IEM_MC_FETCH_EFLAGS(fEFlags);
    25232523        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    2524         IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomiss_u128, iemAImpl_vcomiss_u128_fallback),
    2525                                     pEFlags, puSrc1, puSrc2);
     2524        IEM_MC_CALL_AVX_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomiss_u128, iemAImpl_vcomiss_u128_fallback),
     2525                                pEFlags, puSrc1, puSrc2);
    25262526        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    25272527            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    25622562        IEM_MC_REF_XREG_XMM_CONST(puSrc1,      IEM_GET_MODRM_REG(pVCpu, bRm));
    25632563        IEM_MC_REF_XREG_XMM_CONST(puSrc2,      IEM_GET_MODRM_RM(pVCpu, bRm));
    2564         IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomisd_u128, iemAImpl_vcomisd_u128_fallback),
    2565                                     pEFlags, puSrc1, puSrc2);
     2564        IEM_MC_CALL_AVX_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomisd_u128, iemAImpl_vcomisd_u128_fallback),
     2565                                pEFlags, puSrc1, puSrc2);
    25662566        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    25672567            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     
    25942594        IEM_MC_FETCH_EFLAGS(fEFlags);
    25952595        IEM_MC_REF_XREG_XMM_CONST(puSrc1,       IEM_GET_MODRM_REG(pVCpu, bRm));
    2596         IEM_MC_CALL_AVX_AIMPL_NEW_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomisd_u128, iemAImpl_vcomisd_u128_fallback),
    2597                                     pEFlags, puSrc1, puSrc2);
     2596        IEM_MC_CALL_AVX_AIMPL_3(IEM_SELECT_HOST_OR_FALLBACK(fAvx, iemAImpl_vcomisd_u128, iemAImpl_vcomisd_u128_fallback),
     2597                                pEFlags, puSrc1, puSrc2);
    25982598        IEM_MC_IF_MXCSR_XCPT_PENDING() {
    25992599            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.cpp

    r104133 r104135  
    11021102#define IEM_MC_CALL_SSE_AIMPL_2(a_pfnAImpl, a0, a1)                                             IEM_LIVENESS_MXCSR_MODIFY()
    11031103#define IEM_MC_CALL_SSE_AIMPL_3(a_pfnAImpl, a0, a1, a2)                                         IEM_LIVENESS_MXCSR_MODIFY()
    1104 #define IEM_MC_CALL_AVX_AIMPL_2(a_pfnAImpl, a0, a1)                                             NOP()
    1105 #define IEM_MC_CALL_AVX_AIMPL_3(a_pfnAImpl, a0, a1, a2)                                         NOP()
    1106 #define IEM_MC_CALL_AVX_AIMPL_NEW_3(a_pfnAImpl, a0, a1, a2)                                     IEM_LIVENESS_MXCSR_MODIFY()
     1104#define IEM_MC_CALL_AVX_AIMPL_2(a_pfnAImpl, a0, a1)                                             IEM_LIVENESS_MXCSR_MODIFY()
     1105#define IEM_MC_CALL_AVX_AIMPL_3(a_pfnAImpl, a0, a1, a2)                                         IEM_LIVENESS_MXCSR_MODIFY()
    11071106
    11081107#define IEM_LIVENESS_ONE_STATUS_EFLAG_INPUT(a_fBit) \
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h

    r104133 r104135  
    87188718
    87198719/**
    8720  * Common worker for IEM_MC_CALL_SSE_AIMPL_XXX.
     8720 * Common worker for IEM_MC_CALL_SSE_AIMPL_XXX/IEM_MC_CALL_AVX_AIMPL_XXX.
    87218721 */
    87228722DECL_INLINE_THROW(uint32_t)
    8723 iemNativeEmitCallSseAImplCommon(PIEMRECOMPILERSTATE pReNative, uint32_t off, uintptr_t pfnAImpl, uint8_t cArgs)
     8723iemNativeEmitCallSseAvxAImplCommon(PIEMRECOMPILERSTATE pReNative, uint32_t off, uintptr_t pfnAImpl, uint8_t cArgs)
    87248724{
    87258725    /* Grab the MXCSR register, it must not be call volatile or we end up freeing it when setting up the call below. */
     
    87738773    IEMNATIVE_ASSERT_ARG_VAR_IDX(pReNative, idxArg0, 0 + IEM_SSE_AIMPL_HIDDEN_ARGS);
    87748774    IEMNATIVE_ASSERT_ARG_VAR_IDX(pReNative, idxArg1, 1 + IEM_SSE_AIMPL_HIDDEN_ARGS);
    8775     return iemNativeEmitCallSseAImplCommon(pReNative, off, pfnAImpl, 2);
     8775    return iemNativeEmitCallSseAvxAImplCommon(pReNative, off, pfnAImpl, 2);
    87768776}
    87778777
     
    87878787    IEMNATIVE_ASSERT_ARG_VAR_IDX(pReNative, idxArg1, 1 + IEM_SSE_AIMPL_HIDDEN_ARGS);
    87888788    IEMNATIVE_ASSERT_ARG_VAR_IDX(pReNative, idxArg2, 2 + IEM_SSE_AIMPL_HIDDEN_ARGS);
    8789     return iemNativeEmitCallSseAImplCommon(pReNative, off, pfnAImpl, 3);
     8789    return iemNativeEmitCallSseAvxAImplCommon(pReNative, off, pfnAImpl, 3);
    87908790}
    87918791
     
    87958795*********************************************************************************************************************************/
    87968796
    8797 /**
    8798  * Common worker for IEM_MC_CALL_AVX_AIMPL_XXX.
    8799  */
    8800 DECL_INLINE_THROW(uint32_t)
    8801 iemNativeEmitCallAvxAImplCommon(PIEMRECOMPILERSTATE pReNative, uint32_t off, uintptr_t pfnAImpl, uint8_t cArgs)
    8802 {
    8803     /*
    8804      * Need to do the FPU preparation.
    8805      */
    8806     off = iemNativeEmitPrepareFpuForUse(pReNative, off, true /*fForChange*/);
    8807 
    8808     /*
    8809      * Do all the call setup and cleanup.
    8810      */
    8811     off = iemNativeEmitCallCommon(pReNative, off, cArgs + IEM_AVX_AIMPL_HIDDEN_ARGS, IEM_AVX_AIMPL_HIDDEN_ARGS);
    8812 
    8813     /*
    8814      * Load the XState pointer.
    8815      */
    8816     off = iemNativeEmitLeaGprByGstRegRef(pReNative, off, IEMNATIVE_CALL_ARG0_GREG, kIemNativeGstRegRef_XState, 0 /*idxRegInClass*/);
    8817 
    8818     /*
    8819      * Make the call.
    8820      */
    8821     off = iemNativeEmitCallImm(pReNative, off, pfnAImpl);
    8822 
    8823     return off;
    8824 }
    8825 
    8826 
    88278797#define IEM_MC_CALL_AVX_AIMPL_2(a_pfnAImpl, a0, a1) \
    88288798    off = iemNativeEmitCallAvxAImpl2(pReNative, off, (uintptr_t)(a_pfnAImpl), (a0), (a1))
     
    88348804    IEMNATIVE_ASSERT_ARG_VAR_IDX(pReNative, idxArg0, 0 + IEM_AVX_AIMPL_HIDDEN_ARGS);
    88358805    IEMNATIVE_ASSERT_ARG_VAR_IDX(pReNative, idxArg1, 1 + IEM_AVX_AIMPL_HIDDEN_ARGS);
    8836     return iemNativeEmitCallAvxAImplCommon(pReNative, off, pfnAImpl, 2);
     8806    return iemNativeEmitCallSseAvxAImplCommon(pReNative, off, pfnAImpl, 2);
    88378807}
    88388808
     
    88488818    IEMNATIVE_ASSERT_ARG_VAR_IDX(pReNative, idxArg1, 1 + IEM_AVX_AIMPL_HIDDEN_ARGS);
    88498819    IEMNATIVE_ASSERT_ARG_VAR_IDX(pReNative, idxArg2, 2 + IEM_AVX_AIMPL_HIDDEN_ARGS);
    8850     return iemNativeEmitCallAvxAImplCommon(pReNative, off, pfnAImpl, 3);
     8820    return iemNativeEmitCallSseAvxAImplCommon(pReNative, off, pfnAImpl, 3);
    88518821}
    88528822#endif /* IEMNATIVE_WITH_SIMD_REG_ALLOCATOR */
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r104129 r104135  
    18971897        'IEM_MC_CALL_AVX_AIMPL_4':                  '__aimpl_avx',
    18981898        'IEM_MC_CALL_AVX_AIMPL_5':                  '__aimpl_avx',
    1899         'IEM_MC_CALL_AVX_AIMPL_NEW_3':              '__aimpl_avx',
    19001899    };
    19011900    def analyzeAndAnnotateName(self, aoStmts: List[iai.McStmt]):
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r104133 r104135  
    42394239/** @name SSE/AVX single/double precision floating point operations.
    42404240 * @{ */
    4241 /**
    4242  * A AVX128 result.
    4243  */
    4244 typedef struct IEMAVX128RESULT
    4245 {
    4246     /** The output value. */
    4247     X86XMMREG       uResult;
    4248     /** The output status. */
    4249     uint32_t        MXCSR;
    4250 } IEMAVX128RESULT;
    4251 AssertCompileMemberOffset(IEMAVX128RESULT, MXCSR, 128 / 8);
    4252 /** Pointer to a AVX128 result. */
    4253 typedef IEMAVX128RESULT *PIEMAVX128RESULT;
    4254 /** Pointer to a const AVX128 result. */
    4255 typedef IEMAVX128RESULT const *PCIEMAVX128RESULT;
    4256 
    4257 
    4258 /**
    4259  * A AVX256 result.
    4260  */
    4261 typedef struct IEMAVX256RESULT
    4262 {
    4263     /** The output value. */
    4264     X86YMMREG       uResult;
    4265     /** The output status. */
    4266     uint32_t        MXCSR;
    4267 } IEMAVX256RESULT;
    4268 AssertCompileMemberOffset(IEMAVX256RESULT, MXCSR, 256 / 8);
    4269 /** Pointer to a AVX256 result. */
    4270 typedef IEMAVX256RESULT *PIEMAVX256RESULT;
    4271 /** Pointer to a const AVX256 result. */
    4272 typedef IEMAVX256RESULT const *PCIEMAVX256RESULT;
    4273 
    4274 
    42754241typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLFPSSEF2U128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
    42764242typedef FNIEMAIMPLFPSSEF2U128  *PFNIEMAIMPLFPSSEF2U128;
     
    42804246typedef FNIEMAIMPLFPSSEF2U128R64  *PFNIEMAIMPLFPSSEF2U128R64;
    42814247
    4282 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPAVXF3U128,(PX86XSAVEAREA pExtState, PIEMAVX128RESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
     4248typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLFPAVXF3U128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2));
    42834249typedef FNIEMAIMPLFPAVXF3U128  *PFNIEMAIMPLFPAVXF3U128;
    4284 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPAVXF3U128R32,(PX86XSAVEAREA pExtState, PIEMAVX128RESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2));
     4250typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLFPAVXF3U128R32,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT32U pr32Src2));
    42854251typedef FNIEMAIMPLFPAVXF3U128R32  *PFNIEMAIMPLFPAVXF3U128R32;
    4286 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPAVXF3U128R64,(PX86XSAVEAREA pExtState, PIEMAVX128RESULT pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2));
     4252typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLFPAVXF3U128R64,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCRTFLOAT64U pr64Src2));
    42874253typedef FNIEMAIMPLFPAVXF3U128R64  *PFNIEMAIMPLFPAVXF3U128R64;
    42884254
    4289 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPAVXF3U256,(PX86XSAVEAREA pExtState, PIEMAVX256RESULT pResult, PCX86YMMREG puSrc1, PCX86YMMREG puSrc2));
     4255typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLFPAVXF3U256,(uint32_t uMxCsrIn, PX86YMMREG pResult, PCX86YMMREG puSrc1, PCX86YMMREG puSrc2));
    42904256typedef FNIEMAIMPLFPAVXF3U256  *PFNIEMAIMPLFPAVXF3U256;
    42914257
  • trunk/src/VBox/VMM/include/IEMMc.h

    r104134 r104135  
    30793079 * @param   a2              The second extra argument.
    30803080 */
    3081 #define IEM_MC_CALL_AVX_AIMPL_2(a_pfnAImpl, a1, a2) \
     3081#define IEM_MC_CALL_AVX_AIMPL_2(a_pfnAImpl, a0, a1) \
    30823082    do { \
    30833083        IEM_MC_PREPARE_AVX_USAGE(); \
    3084         a_pfnAImpl(&pVCpu->cpum.GstCtx.XState, (a1), (a2)); \
     3084        pVCpu->cpum.GstCtx.XState.x87.MXCSR = a_pfnAImpl(pVCpu->cpum.GstCtx.XState.x87.MXCSR & ~X86_MXCSR_XCPT_FLAGS, \
     3085                                                         (a0), (a1)); \
    30853086    } while (0)
    30863087
     
    30953096 * @param   a3              The third extra argument.
    30963097 */
    3097 #define IEM_MC_CALL_AVX_AIMPL_3(a_pfnAImpl, a1, a2, a3) \
     3098#define IEM_MC_CALL_AVX_AIMPL_3(a_pfnAImpl, a0, a1, a2) \
    30983099    do { \
    30993100        IEM_MC_PREPARE_AVX_USAGE(); \
    3100         a_pfnAImpl(&pVCpu->cpum.GstCtx.XState, (a1), (a2), (a3)); \
    3101     } while (0)
    3102 
    3103 /**
    3104  * Calls a AVX assembly implementation taking three visible arguments.
    3105  *
    3106  * @param   a_pfnAImpl      Pointer to the assembly SSE routine.
    3107  * @param   a0              The first extra argument.
    3108  * @param   a1              The second extra argument.
    3109  * @param   a2              The third extra argument.
    3110  *
    3111  * @note The and'ing with X86_MXCSR_XCPT_FLAGS is just a precaution as
    3112  *       the called helper should return an MXCSR with only new exception flags
    3113  *       added.
    3114  * @note This is temporarily required for the v(u)comis* stuff because
    3115  *       tstIEMAImpl will not compile otherwise, will be removed once the AVX
    3116  *       stuff is reworked, see @bugref{10641}
    3117  */
    3118 #define IEM_MC_CALL_AVX_AIMPL_NEW_3(a_pfnAImpl, a0, a1, a2) \
    3119     do { \
    3120         IEM_MC_PREPARE_SSE_USAGE(); \
    3121         pVCpu->cpum.GstCtx.XState.x87.MXCSR |=   a_pfnAImpl(pVCpu->cpum.GstCtx.XState.x87.MXCSR, (a0), (a1), (a2)) \
    3122                                                & X86_MXCSR_XCPT_FLAGS; \
     3101        pVCpu->cpum.GstCtx.XState.x87.MXCSR = a_pfnAImpl(pVCpu->cpum.GstCtx.XState.x87.MXCSR & ~X86_MXCSR_XCPT_FLAGS, \
     3102                                                         (a0), (a1), (a2)); \
    31233103    } while (0)
    31243104
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r104133 r104135  
    10821082#define IEM_MC_CALL_AVX_AIMPL_3(a_pfnAImpl, a0, a1, a2) \
    10831083    do { (void)fAvxHost; (void)fAvxWrite; CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); (void)fMcBegin; } while (0)
    1084 #define IEM_MC_CALL_AVX_AIMPL_NEW_3(a_pfnAImpl, a0, a1, a2) \
    1085     do { (void)fAvxHost; (void)fAvxWrite; CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); (void)fMcBegin; } while (0)
    10861084#define IEM_MC_CALL_AVX_AIMPL_4(a_pfnAImpl, a0, a1, a2, a3) \
    10871085    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.

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