Changeset 106453 in vbox for trunk/src/VBox/VMM/include
- Timestamp:
- Oct 17, 2024 1:54:35 PM (7 months ago)
- svn:sync-xref-src-repo-rev:
- 165272
- Location:
- trunk/src/VBox/VMM/include
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/include/IEMInternal.h
r106406 r106453 120 120 #endif 121 121 122 /** Enables the SIMD register allocator @bugref{10614}. */123 #if defined(DOXYGEN_RUNNING) || 1124 # define IEMNATIVE_WITH_SIMD_REG_ALLOCATOR125 #endif126 122 /** Enables access to even callee saved registers. */ 127 / /# define IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS123 /*# define IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS*/ 128 124 129 125 #if defined(DOXYGEN_RUNNING) || 1 … … 2277 2273 STAMCOUNTER StatNativeEndIfOtherBranchDirty; 2278 2274 2279 //#ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2280 2275 /** Native recompiler: Number of calls to iemNativeSimdRegAllocFindFree. */ 2281 2276 STAMCOUNTER StatNativeSimdRegFindFree; … … 2310 2305 /** Native recompiler: Number of IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT() checks omitted. */ 2311 2306 STAMCOUNTER StatNativeMaybeAvxXcptCheckOmitted; 2312 //#endif2313 2307 2314 2308 /** Native recompiler: The TB finished executing completely without jumping to a an exit label. -
trunk/src/VBox/VMM/include/IEMN8veRecompiler.h
r106408 r106453 204 204 * Mask GPRs with fixes assignments, either by us or dictated by the CPU/OS 205 205 * architecture. */ 206 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR207 206 /** @def IEMNATIVE_SIMD_REG_FIXED_TMP0 208 207 * Mask SIMD registers with fixes assignments, either by us or dictated by the CPU/OS … … 210 209 /** @def IEMNATIVE_SIMD_REG_FIXED_TMP0 211 210 * Dedicated temporary SIMD register. */ 212 #endif213 211 #if defined(RT_ARCH_ARM64) || defined(DOXYGEN_RUNNING) /* arm64 goes first because of doxygen */ 214 212 # define IEMNATIVE_REG_FIXED_PVMCPU ARMV8_A64_REG_X28 … … 234 232 | IEMNATIVE_REG_FIXED_MASK_ADD) 235 233 236 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR237 234 # define IEMNATIVE_SIMD_REG_FIXED_TMP0 ARMV8_A64_REG_Q30 238 # 239 # define IEMNATIVE_SIMD_REG_FIXED_MASKRT_BIT_32(ARMV8_A64_REG_Q30)240 # 235 # if defined(IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS) 236 # define IEMNATIVE_SIMD_REG_FIXED_MASK RT_BIT_32(ARMV8_A64_REG_Q30) 237 # else 241 238 /** @note 242 239 * ARM64 has 32 registers, but they are only 128-bit wide. So, in order to … … 251 248 * prologue/epilogue. 252 249 */ 253 # define IEMNATIVE_SIMD_REG_FIXED_MASK( UINT32_C(0xff00) \250 # define IEMNATIVE_SIMD_REG_FIXED_MASK ( UINT32_C(0xff00) \ 254 251 | RT_BIT_32(ARMV8_A64_REG_Q31) \ 255 252 | RT_BIT_32(ARMV8_A64_REG_Q30) \ … … 269 266 | RT_BIT_32(ARMV8_A64_REG_Q3) \ 270 267 | RT_BIT_32(ARMV8_A64_REG_Q1)) 271 # endif272 268 # endif 273 269 … … 281 277 | RT_BIT_32(X86_GREG_xBP) ) 282 278 283 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR 284 # define IEMNATIVE_SIMD_REG_FIXED_TMP0 5 /* xmm5/ymm5 */ 285 # ifndef IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS 286 # ifndef _MSC_VER 287 # define IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS 288 # endif 279 # define IEMNATIVE_SIMD_REG_FIXED_TMP0 5 /* xmm5/ymm5 */ 280 # ifndef IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS 281 # ifndef _MSC_VER 282 # define IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS 289 283 # endif 290 # ifdef IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS 291 # define IEMNATIVE_SIMD_REG_FIXED_MASK (RT_BIT_32(IEMNATIVE_SIMD_REG_FIXED_TMP0)) 292 # else 284 # endif 285 # ifdef IEMNATIVE_WITH_SIMD_REG_ACCESS_ALL_REGISTERS 286 # define IEMNATIVE_SIMD_REG_FIXED_MASK (RT_BIT_32(IEMNATIVE_SIMD_REG_FIXED_TMP0)) 287 # else 293 288 /** @note On Windows/AMD64 xmm6 through xmm15 are marked as callee saved. */ 294 # define IEMNATIVE_SIMD_REG_FIXED_MASK( UINT32_C(0xffc0) \289 # define IEMNATIVE_SIMD_REG_FIXED_MASK ( UINT32_C(0xffc0) \ 295 290 | RT_BIT_32(IEMNATIVE_SIMD_REG_FIXED_TMP0)) 296 # endif297 291 # endif 298 292 … … 338 332 | RT_BIT_32(X86_GREG_x10) \ 339 333 | RT_BIT_32(X86_GREG_x11) ) 340 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR341 334 /* xmm0 - xmm5 are marked as volatile. */ 342 # define IEMNATIVE_CALL_VOLATILE_SIMD_REG_MASK (UINT32_C(0x3f)) 343 # endif 335 # define IEMNATIVE_CALL_VOLATILE_SIMD_REG_MASK (UINT32_C(0x3f)) 344 336 345 337 # else /* !RT_OS_WINDOWS */ … … 366 358 | RT_BIT_32(X86_GREG_x10) \ 367 359 | RT_BIT_32(X86_GREG_x11) ) 368 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR369 360 /* xmm0 - xmm15 are marked as volatile. */ 370 # define IEMNATIVE_CALL_VOLATILE_SIMD_REG_MASK (UINT32_C(0xffff)) 371 # endif 361 # define IEMNATIVE_CALL_VOLATILE_SIMD_REG_MASK (UINT32_C(0xffff)) 372 362 # endif /* !RT_OS_WINDOWS */ 373 363 … … 409 399 | RT_BIT_32(ARMV8_A64_REG_X16) \ 410 400 | RT_BIT_32(ARMV8_A64_REG_X17) ) 411 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR412 401 /* The low 64 bits of v8 - v15 marked as callee saved but the rest is volatile, 413 402 * so to simplify our life a bit we just mark everything as volatile. */ 414 # define IEMNATIVE_CALL_VOLATILE_SIMD_REG_MASK (UINT32_C(0xffffffff)) 415 # endif 403 # define IEMNATIVE_CALL_VOLATILE_SIMD_REG_MASK UINT32_C(0xffffffff) 416 404 417 405 #endif … … 453 441 * Mask corresponding to IEMNATIVE_HST_GREG_COUNT that can be applied to 454 442 * inverted register masks and such to get down to a correct set of regs. */ 455 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR456 443 /** @def IEMNATIVE_HST_SIMD_REG_COUNT 457 444 * Number of host SIMD registers we track. */ … … 459 446 * Mask corresponding to IEMNATIVE_HST_SIMD_REG_COUNT that can be applied to 460 447 * inverted register masks and such to get down to a correct set of regs. */ 461 #endif462 448 #ifdef RT_ARCH_AMD64 463 449 # define IEMNATIVE_HST_GREG_COUNT 16 464 450 # define IEMNATIVE_HST_GREG_MASK UINT32_C(0xffff) 465 451 466 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR 467 # define IEMNATIVE_HST_SIMD_REG_COUNT 16 468 # define IEMNATIVE_HST_SIMD_REG_MASK UINT32_C(0xffff) 469 # endif 452 # define IEMNATIVE_HST_SIMD_REG_COUNT 16 453 # define IEMNATIVE_HST_SIMD_REG_MASK UINT32_C(0xffff) 470 454 471 455 #elif defined(RT_ARCH_ARM64) … … 473 457 # define IEMNATIVE_HST_GREG_MASK UINT32_MAX 474 458 475 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR 476 # define IEMNATIVE_HST_SIMD_REG_COUNT 32 477 # define IEMNATIVE_HST_SIMD_REG_MASK UINT32_MAX 478 # endif 459 # define IEMNATIVE_HST_SIMD_REG_COUNT 32 460 # define IEMNATIVE_HST_SIMD_REG_MASK UINT32_MAX 479 461 480 462 #else … … 1248 1230 /** Info about a host register shadowing a guest register. */ 1249 1231 kIemTbDbgEntryType_GuestRegShadowing, 1250 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1251 1232 /** Info about a host SIMD register shadowing a guest SIMD register. */ 1252 1233 kIemTbDbgEntryType_GuestSimdRegShadowing, 1253 #endif1254 1234 #ifdef IEMNATIVE_WITH_DELAYED_PC_UPDATING 1255 1235 /** Info about a delayed RIP update. */ 1256 1236 kIemTbDbgEntryType_DelayedPcUpdate, 1257 1237 #endif 1258 #if defined(IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK) || defined(IEMNATIVE_WITH_SIMD_REG_ALLOCATOR)1259 1238 /** Info about a shadowed guest register becoming dirty. */ 1260 1239 kIemTbDbgEntryType_GuestRegDirty, 1261 1240 /** Info about register writeback/flush oepration. */ 1262 1241 kIemTbDbgEntryType_GuestRegWriteback, 1263 #endif1264 1242 #ifdef IEMNATIVE_WITH_EFLAGS_POSTPONING 1265 1243 /** Info about a delayed EFLAGS calculation. */ … … 1338 1316 } GuestRegShadowing; 1339 1317 1340 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1341 1318 struct 1342 1319 { … … 1351 1328 uint32_t idxHstSimdRegPrev : 8; 1352 1329 } GuestSimdRegShadowing; 1353 #endif1354 1330 1355 1331 #ifdef IEMNATIVE_WITH_DELAYED_PC_UPDATING … … 1365 1341 #endif 1366 1342 1367 #if defined(IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK) || defined(IEMNATIVE_WITH_SIMD_REG_ALLOCATOR)1368 1343 struct 1369 1344 { … … 1390 1365 uint32_t fGstReg : 25; 1391 1366 } GuestRegWriteback; 1392 #endif1393 1367 1394 1368 #ifdef IEMNATIVE_WITH_EFLAGS_POSTPONING … … 1480 1454 /** @} */ 1481 1455 1482 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1483 1456 1484 1457 /** … … 1517 1490 } IEMNATIVEGSTSIMDREGLDSTSZ; 1518 1491 1519 #endif /* IEMNATIVE_WITH_SIMD_REG_ALLOCATOR */1520 1492 1521 1493 /** … … 1602 1574 * @todo not sure what this really is for... */ 1603 1575 IEMNATIVEGSTREG enmGstReg; 1604 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1605 1576 /** Flag whether this variable is held in a SIMD register (only supported for 128-bit and 256-bit variables), 1606 1577 * only valid when idxReg is not UINT8_MAX. */ … … 1609 1580 * variable is idle and the register can be grabbed. */ 1610 1581 bool fRegAcquired : 1; 1611 #else1612 /** Set if the registered is currently used exclusively, false if the1613 * variable is idle and the register can be grabbed. */1614 bool fRegAcquired;1615 #endif1616 1582 1617 1583 union … … 1707 1673 1708 1674 1709 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1710 1675 /** 1711 1676 * Host SIMD register entry - this tracks a virtual 256-bit register split into two 128-bit … … 1736 1701 uint8_t abAlign[5]; 1737 1702 } IEMNATIVEHSTSIMDREG; 1738 #endif1739 1703 1740 1704 … … 1769 1733 #endif 1770 1734 1771 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1772 1735 /** Allocation bitmap for aHstSimdRegs. */ 1773 1736 uint32_t bmHstSimdRegs; … … 1782 1745 /** Bitmap marking whether the high 128-bit of the shadowed guest register are dirty and need writeback. */ 1783 1746 uint64_t bmGstSimdRegShadowDirtyHi128; 1784 #endif1785 1747 1786 1748 union … … 1802 1764 * there are no duplicate copies or ambiguities like that). */ 1803 1765 uint8_t aidxGstRegShadows[kIemNativeGstReg_End]; 1804 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1805 1766 /** Maps a guest SIMD register to a host SIMD register (index by IEMNATIVEGSTSIMDREG). 1806 1767 * Entries are only valid if the corresponding bit in bmGstSimdRegShadows is set. … … 1808 1769 * there are no duplicate copies or ambiguities like that). */ 1809 1770 uint8_t aidxGstSimdRegShadows[kIemNativeGstSimdReg_End]; 1810 #endif1811 1771 1812 1772 /** Host register allocation tracking. */ 1813 1773 IEMNATIVEHSTREG aHstRegs[IEMNATIVE_HST_GREG_COUNT]; 1814 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1815 1774 /** Host SIMD register allocation tracking. */ 1816 1775 IEMNATIVEHSTSIMDREG aHstSimdRegs[IEMNATIVE_HST_SIMD_REG_COUNT]; 1817 #endif1818 1776 1819 1777 /** Variables and arguments. */ … … 1845 1803 1846 1804 1847 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR1848 1805 /** Clear the dirty state of the given guest SIMD register. */ 1849 # 1806 #define IEMNATIVE_SIMD_REG_STATE_CLR_DIRTY(a_pReNative, a_iSimdReg) \ 1850 1807 do { \ 1851 1808 (a_pReNative)->Core.bmGstSimdRegShadowDirtyLo128 &= ~RT_BIT_64(a_iSimdReg); \ … … 1854 1811 1855 1812 /** Returns whether the low 128-bits of the given guest SIMD register are dirty. */ 1856 # 1813 #define IEMNATIVE_SIMD_REG_STATE_IS_DIRTY_LO_U128(a_pReNative, a_iSimdReg) \ 1857 1814 RT_BOOL((a_pReNative)->Core.bmGstSimdRegShadowDirtyLo128 & RT_BIT_64(a_iSimdReg)) 1858 1815 /** Returns whether the high 128-bits of the given guest SIMD register are dirty. */ 1859 # 1816 #define IEMNATIVE_SIMD_REG_STATE_IS_DIRTY_HI_U128(a_pReNative, a_iSimdReg) \ 1860 1817 RT_BOOL((a_pReNative)->Core.bmGstSimdRegShadowDirtyHi128 & RT_BIT_64(a_iSimdReg)) 1861 1818 /** Returns whether the given guest SIMD register is dirty. */ 1862 # 1819 #define IEMNATIVE_SIMD_REG_STATE_IS_DIRTY_U256(a_pReNative, a_iSimdReg) \ 1863 1820 RT_BOOL(((a_pReNative)->Core.bmGstSimdRegShadowDirtyLo128 | (a_pReNative)->Core.bmGstSimdRegShadowDirtyHi128) & RT_BIT_64(a_iSimdReg)) 1864 1821 1865 1822 /** Set the low 128-bits of the given guest SIMD register to the dirty state. */ 1866 # 1823 #define IEMNATIVE_SIMD_REG_STATE_SET_DIRTY_LO_U128(a_pReNative, a_iSimdReg) \ 1867 1824 ((a_pReNative)->Core.bmGstSimdRegShadowDirtyLo128 |= RT_BIT_64(a_iSimdReg)) 1868 1825 /** Set the high 128-bits of the given guest SIMD register to the dirty state. */ 1869 # 1826 #define IEMNATIVE_SIMD_REG_STATE_SET_DIRTY_HI_U128(a_pReNative, a_iSimdReg) \ 1870 1827 ((a_pReNative)->Core.bmGstSimdRegShadowDirtyHi128 |= RT_BIT_64(a_iSimdReg)) 1871 1828 1872 1829 /** Flag for indicating that IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE() has emitted code in the current TB. */ 1873 # define IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_MAYBE_DEVICE_NOT_AVAILABLERT_BIT_32(0)1830 #define IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_MAYBE_DEVICE_NOT_AVAILABLE RT_BIT_32(0) 1874 1831 /** Flag for indicating that IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE() has emitted code in the current TB. */ 1875 # define IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_MAYBE_WAIT_DEVICE_NOT_AVAILABLERT_BIT_32(1)1832 #define IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_MAYBE_WAIT_DEVICE_NOT_AVAILABLE RT_BIT_32(1) 1876 1833 /** Flag for indicating that IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT() has emitted code in the current TB. */ 1877 # define IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_MAYBE_SSERT_BIT_32(2)1834 #define IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_MAYBE_SSE RT_BIT_32(2) 1878 1835 /** Flag for indicating that IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT() has emitted code in the current TB. */ 1879 # define IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_MAYBE_AVXRT_BIT_32(3)1836 #define IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_MAYBE_AVX RT_BIT_32(3) 1880 1837 # ifdef IEMNATIVE_WITH_SIMD_FP_NATIVE_EMITTERS 1881 1838 /** Flag indicating that the guest MXCSR was synced to the host floating point control register. */ 1882 # define IEMNATIVE_SIMD_HOST_FP_CTRL_REG_SYNCEDRT_BIT_32(4)1839 # define IEMNATIVE_SIMD_HOST_FP_CTRL_REG_SYNCED RT_BIT_32(4) 1883 1840 /** Flag indicating whether the host floating point control register was saved before overwriting it. */ 1884 # define IEMNATIVE_SIMD_HOST_FP_CTRL_REG_SAVED RT_BIT_32(5) 1885 # endif 1841 # define IEMNATIVE_SIMD_HOST_FP_CTRL_REG_SAVED RT_BIT_32(5) 1886 1842 #endif 1887 1843 … … 2020 1976 /** The expected IEMCPU::fExec value for the current call/instruction. */ 2021 1977 uint32_t fExec; 2022 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2023 1978 /** IEMNATIVE_SIMD_RAISE_XCPT_CHECKS_EMITTED_XXX flags for exception flags 2024 1979 * we only emit once per TB (or when the cr0/cr4/xcr0 register changes). … … 2029 1984 */ 2030 1985 uint32_t fSimdRaiseXcptChecksEmitted; 2031 #endif2032 1986 /** The call number of the last CheckIrq, UINT32_MAX if not seen. */ 2033 1987 uint32_t idxLastCheckIrqCallNo; … … 2195 2149 DECL_HIDDEN_THROW(void) iemNativeDbgInfoAddGuestRegShadowing(PIEMRECOMPILERSTATE pReNative, IEMNATIVEGSTREG enmGstReg, 2196 2150 uint8_t idxHstReg = UINT8_MAX, uint8_t idxHstRegPrev = UINT8_MAX); 2197 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2198 2151 DECL_HIDDEN_THROW(void) iemNativeDbgInfoAddGuestSimdRegShadowing(PIEMRECOMPILERSTATE pReNative, 2199 2152 IEMNATIVEGSTSIMDREG enmGstSimdReg, 2200 2153 uint8_t idxHstSimdReg = UINT8_MAX, 2201 2154 uint8_t idxHstSimdRegPrev = UINT8_MAX); 2202 # endif2203 # if defined(IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK) || defined(IEMNATIVE_WITH_SIMD_REG_ALLOCATOR)2204 2155 DECL_HIDDEN_THROW(void) iemNativeDbgInfoAddGuestRegDirty(PIEMRECOMPILERSTATE pReNative, bool fSimdReg, 2205 2156 uint8_t idxGstReg, uint8_t idxHstReg); 2206 2157 DECL_HIDDEN_THROW(void) iemNativeDbgInfoAddGuestRegWriteback(PIEMRECOMPILERSTATE pReNative, bool fSimdReg, 2207 2158 uint64_t fGstReg); 2208 # endif2209 2159 DECL_HIDDEN_THROW(void) iemNativeDbgInfoAddDelayedPcUpdate(PIEMRECOMPILERSTATE pReNative, 2210 2160 uint64_t offPc, uint32_t cInstrSkipped); … … 2269 2219 DECL_HIDDEN_THROW(uint32_t) iemNativeRegMoveOrSpillStackVar(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxVar, 2270 2220 uint32_t fForbiddenRegs = IEMNATIVE_CALL_VOLATILE_GREG_MASK); 2271 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2272 2221 DECL_HIDDEN_THROW(uint32_t) iemNativeSimdRegMoveOrSpillStackVar(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxVar, 2273 2222 uint32_t fForbiddenRegs = IEMNATIVE_CALL_VOLATILE_SIMD_REG_MASK); 2274 # endif2275 2223 #endif 2276 2224 DECLHIDDEN(void) iemNativeRegFree(PIEMRECOMPILERSTATE pReNative, uint8_t idxHstReg) RT_NOEXCEPT; … … 2278 2226 DECLHIDDEN(void) iemNativeRegFreeTmpImm(PIEMRECOMPILERSTATE pReNative, uint8_t idxHstReg) RT_NOEXCEPT; 2279 2227 DECLHIDDEN(void) iemNativeRegFreeVar(PIEMRECOMPILERSTATE pReNative, uint8_t idxHstReg, bool fFlushShadows) RT_NOEXCEPT; 2280 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2281 2228 DECLHIDDEN(void) iemNativeSimdRegFreeVar(PIEMRECOMPILERSTATE pReNative, uint8_t idxHstSimdReg, bool fFlushShadows) RT_NOEXCEPT; 2282 # 2229 #ifdef IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK 2283 2230 DECL_HIDDEN_THROW(uint32_t) iemNativeSimdRegFlushDirtyGuestByHostSimdRegShadow(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxHstReg); 2284 # endif2285 2231 #endif 2286 2232 DECLHIDDEN(void) iemNativeRegFreeAndFlushMask(PIEMRECOMPILERSTATE pReNative, uint32_t fHstRegMask) RT_NOEXCEPT; … … 2314 2260 2315 2261 2316 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2317 2262 DECL_HIDDEN_THROW(uint8_t) iemNativeSimdRegAllocTmp(PIEMRECOMPILERSTATE pReNative, uint32_t *poff, bool fPreferVolatile = true); 2318 2263 DECL_HIDDEN_THROW(uint8_t) iemNativeSimdRegAllocTmpEx(PIEMRECOMPILERSTATE pReNative, uint32_t *poff, uint32_t fRegMask, … … 2330 2275 uint8_t idxHstSimdReg, IEMNATIVEGSTSIMDREG enmGstSimdReg, 2331 2276 IEMNATIVEGSTSIMDREGLDSTSZ enmLoadSz); 2332 #endif2333 2277 2334 2278 DECL_HIDDEN_THROW(uint8_t) iemNativeArgAlloc(PIEMRECOMPILERSTATE pReNative, uint8_t iArgNo, uint8_t cbType); … … 2349 2293 DECL_HIDDEN_THROW(uint8_t) iemNativeVarRegisterAcquireInitedWithPrefSlow(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar, 2350 2294 uint32_t *poff, uint8_t idxRegPref); 2351 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2352 2295 DECL_HIDDEN_THROW(uint8_t) iemNativeVarSimdRegisterAcquire(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar, uint32_t *poff, 2353 2296 bool fInitialized = false, uint8_t idxRegPref = UINT8_MAX); 2354 #endif2355 2297 DECL_HIDDEN_THROW(uint8_t) iemNativeVarRegisterAcquireForGuestReg(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar, 2356 2298 IEMNATIVEGSTREG enmGstReg, uint32_t *poff); 2357 2299 DECL_HIDDEN_THROW(uint32_t) iemNativeVarSaveVolatileRegsPreHlpCall(PIEMRECOMPILERSTATE pReNative, uint32_t off, 2358 uint32_t fHst RegsNotToSave);2300 uint32_t fHstGprNotToSave); 2359 2301 DECL_HIDDEN_THROW(uint32_t) iemNativeVarRestoreVolatileRegsPostHlpCall(PIEMRECOMPILERSTATE pReNative, uint32_t off, 2360 uint32_t fHst RegsNotToSave);2302 uint32_t fHstGprNotToSave); 2361 2303 DECLHIDDEN(void) iemNativeVarFreeOneWorker(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar); 2362 2304 DECLHIDDEN(void) iemNativeVarFreeAllSlow(PIEMRECOMPILERSTATE pReNative, uint32_t bmVars); … … 2372 2314 DECL_HIDDEN_THROW(uint32_t) iemNativeEmitGuestRegValueCheckEx(PIEMRECOMPILERSTATE pReNative, PIEMNATIVEINSTR pCodeBuf, 2373 2315 uint32_t off, uint8_t idxReg, IEMNATIVEGSTREG enmGstReg); 2374 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2375 2316 DECL_HIDDEN_THROW(uint32_t) iemNativeEmitGuestSimdRegValueCheck(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxSimdReg, 2376 2317 IEMNATIVEGSTSIMDREG enmGstSimdReg, 2377 2318 IEMNATIVEGSTSIMDREGLDSTSZ enmLoadSz); 2378 # endif2379 2319 DECL_HIDDEN_THROW(uint32_t) iemNativeEmitExecFlagsCheck(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint32_t fExec); 2380 2320 #endif … … 2418 2358 IEM_DECL_NATIVE_HLP_PROTO(uint64_t, iemNativeHlpMemFetchDataU32_Sx_U64,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg)); 2419 2359 IEM_DECL_NATIVE_HLP_PROTO(uint64_t, iemNativeHlpMemFetchDataU64,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg)); 2420 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2421 2360 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFetchDataU128,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PRTUINT128U pu128Dst)); 2422 2361 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFetchDataU128AlignedSse,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PRTUINT128U pu128Dst)); … … 2424 2363 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFetchDataU256NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PRTUINT256U pu256Dst)); 2425 2364 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFetchDataU256AlignedAvx,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PRTUINT256U pu256Dst)); 2426 #endif2427 2365 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU8,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, uint8_t u8Value)); 2428 2366 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU16,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, uint16_t u16Value)); 2429 2367 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU32,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, uint32_t u32Value)); 2430 2368 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU64,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, uint64_t u64Value)); 2431 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2432 2369 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU128AlignedSse,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PCRTUINT128U pu128Src)); 2433 2370 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU128NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PCRTUINT128U pu128Src)); 2434 2371 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU256NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PCRTUINT256U pu256Src)); 2435 2372 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU256AlignedAvx,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PCRTUINT256U pu256Src)); 2436 #endif2437 2373 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpStackStoreU16,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint16_t u16Value)); 2438 2374 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpStackStoreU32,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint32_t u32Value)); … … 2453 2389 IEM_DECL_NATIVE_HLP_PROTO(uint64_t, iemNativeHlpMemFlatFetchDataU32_Sx_U64,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem)); 2454 2390 IEM_DECL_NATIVE_HLP_PROTO(uint64_t, iemNativeHlpMemFlatFetchDataU64,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem)); 2455 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2456 2391 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatFetchDataU128,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PRTUINT128U pu128Dst)); 2457 2392 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatFetchDataU128AlignedSse,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PRTUINT128U pu128Dst)); … … 2459 2394 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatFetchDataU256NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PRTUINT256U pu256Dst)); 2460 2395 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatFetchDataU256AlignedAvx,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PRTUINT256U pu256Dst)); 2461 #endif2462 2396 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU8,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t u8Value)); 2463 2397 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU16,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint16_t u16Value)); 2464 2398 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU32,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint32_t u32Value)); 2465 2399 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU64,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint64_t u64Value)); 2466 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2467 2400 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU128AlignedSse,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PCRTUINT128U pu128Src)); 2468 2401 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU128NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PCRTUINT128U pu128Src)); 2469 2402 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU256NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PCRTUINT256U pu256Src)); 2470 2403 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU256AlignedAvx,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PCRTUINT256U pu256Src)); 2471 #endif2472 2404 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpStackFlatStoreU16,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint16_t u16Value)); 2473 2405 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpStackFlatStoreU32,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint32_t u32Value)); … … 2668 2600 2669 2601 2670 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2671 2602 DECL_INLINE_THROW(void) iemNativeVarSimdRegisterRelease(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar) 2672 2603 { … … 2674 2605 iemNativeVarRegisterRelease(pReNative, idxVar); 2675 2606 } 2676 #endif2677 2607 2678 2608 … … 2844 2774 2845 2775 2846 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2847 2776 /** Number of hidden arguments for SSE_AIMPL calls. */ 2848 # define IEM_SSE_AIMPL_HIDDEN_ARGS12777 #define IEM_SSE_AIMPL_HIDDEN_ARGS 1 2849 2778 /** Number of hidden arguments for AVX_AIMPL calls. */ 2850 # define IEM_AVX_AIMPL_HIDDEN_ARGS 1 2851 #endif 2779 #define IEM_AVX_AIMPL_HIDDEN_ARGS 1 2852 2780 2853 2781 … … 3194 3122 uint64_t const bmGstRegShadowDirty = 0; 3195 3123 #endif 3196 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR3197 3124 uint64_t const bmGstSimdRegShadowDirty = ( pReNative->Core.bmGstSimdRegShadowDirtyLo128 3198 3125 | pReNative->Core.bmGstSimdRegShadowDirtyHi128) 3199 3126 & ~fGstSimdShwExcept; 3200 #else3201 uint64_t const bmGstSimdRegShadowDirty = 0;3202 #endif3203 3127 if (bmGstRegShadowDirty | bmGstSimdRegShadowDirty | fWritebackPc) 3204 3128 return iemNativeRegFlushPendingWritesSlow(pReNative, off, fGstShwExcept, fGstSimdShwExcept); … … 3283 3207 *********************************************************************************************************************************/ 3284 3208 3285 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR3286 3287 3209 DECL_FORCE_INLINE(uint8_t) 3288 3210 iemNativeSimdRegMarkAllocated(PIEMRECOMPILERSTATE pReNative, uint8_t idxSimdReg, … … 3404 3326 } 3405 3327 3406 #endif /* IEMNATIVE_WITH_SIMD_REG_ALLOCATOR */3407 3328 3408 3329 -
trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h
r106202 r106453 2354 2354 2355 2355 2356 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2357 2356 /** 2358 2357 * Emits a 128-bit vector register load instruction with an BP relative source address. … … 2402 2401 #endif 2403 2402 } 2404 2405 #endif2406 2403 2407 2404 … … 2554 2551 } 2555 2552 2556 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2557 2553 2558 2554 /** … … 2638 2634 } 2639 2635 2640 #endif /* IEMNATIVE_WITH_SIMD_REG_ALLOCATOR */2641 2636 #if defined(RT_ARCH_ARM64) 2642 2637 … … 2714 2709 } 2715 2710 2716 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR2717 2711 /** 2718 2712 * Common bit of iemNativeEmitLoadVecRegByGprU128 and friends. … … 2750 2744 return off; 2751 2745 } 2752 # endif2753 2746 2754 2747 … … 3176 3169 3177 3170 3178 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR3179 3171 /** 3180 3172 * Emits a 128-bit vector register load via a GPR base address with a displacement. … … 3289 3281 return off; 3290 3282 } 3291 #endif3292 3283 3293 3284 … … 3605 3596 3606 3597 3607 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR3608 3598 /** 3609 3599 * Emits a 128-bit vector register store via a GPR base address with a displacement. … … 3718 3708 return off; 3719 3709 } 3720 #endif3721 3710 3722 3711 … … 8946 8935 8947 8936 8948 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR 8937 8949 8938 /********************************************************************************************************************************* 8950 8939 * SIMD helpers. * 8951 8940 *********************************************************************************************************************************/ 8952 8953 8941 8954 8942 /** … … 10543 10531 } 10544 10532 10545 #endif /* IEMNATIVE_WITH_SIMD_REG_ALLOCATOR */10546 10533 10547 10534 /** @} */
Note:
See TracChangeset
for help on using the changeset viewer.