mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-01 08:52:11 +01:00
[dxvk] Add utility function to clear large regions of memory
This commit is contained in:
parent
d535e2964f
commit
e9574a4155
@ -183,6 +183,37 @@ namespace dxvk::bit {
|
||||
return shift > Bits ? shift - Bits : 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief Clears cache lines of memory
|
||||
*
|
||||
* Uses non-temporal stores. The memory region offset
|
||||
* and size are assumed to be aligned to 64 bytes.
|
||||
* \param [in] mem Memory region to clear
|
||||
* \param [in] size Number of bytes to clear
|
||||
*/
|
||||
inline void bclear(void* mem, size_t size) {
|
||||
#if defined(DXVK_ARCH_X86) && (defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER))
|
||||
auto zero = _mm_setzero_si128();
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma nounroll
|
||||
#elif defined(__GNUC__)
|
||||
#pragma GCC unroll 0
|
||||
#endif
|
||||
for (size_t i = 0; i < size; i += 64u) {
|
||||
auto* ptr = reinterpret_cast<__m128i*>(mem) + i / sizeof(zero);
|
||||
_mm_stream_si128(ptr + 0u, zero);
|
||||
_mm_stream_si128(ptr + 1u, zero);
|
||||
_mm_stream_si128(ptr + 2u, zero);
|
||||
_mm_stream_si128(ptr + 3u, zero);
|
||||
}
|
||||
#else
|
||||
std::memset(mem, 0, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief Compares two aligned structs bit by bit
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user