1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

use AVX for less than 100kb

This commit is contained in:
FunkyFr3sh 2022-09-20 00:39:02 +02:00
parent b98ced6d1e
commit 234448ebee

View File

@ -12,47 +12,65 @@ void blt_copy(
size_t size) size_t size)
{ {
#ifdef __AVX__ #ifdef __AVX__
if (size >= 1024 * 4096 && g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32)) if (g_blt_use_avx && !((DWORD)dst % 32) && !((DWORD)src % 32))
{ {
_mm_prefetch((const char*)(src), _MM_HINT_NTA); if (size >= 1024 * 4096)
while (size >= 256)
{ {
__m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0); _mm_prefetch((const char*)(src), _MM_HINT_NTA);
__m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1);
__m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2);
__m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3);
__m256i c4 = _mm256_load_si256(((const __m256i*)src) + 4);
__m256i c5 = _mm256_load_si256(((const __m256i*)src) + 5);
__m256i c6 = _mm256_load_si256(((const __m256i*)src) + 6);
__m256i c7 = _mm256_load_si256(((const __m256i*)src) + 7);
_mm_prefetch((const char*)(src + 512), _MM_HINT_NTA); while (size >= 256)
{
__m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0);
__m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1);
__m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2);
__m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3);
__m256i c4 = _mm256_load_si256(((const __m256i*)src) + 4);
__m256i c5 = _mm256_load_si256(((const __m256i*)src) + 5);
__m256i c6 = _mm256_load_si256(((const __m256i*)src) + 6);
__m256i c7 = _mm256_load_si256(((const __m256i*)src) + 7);
_mm256_stream_si256((((__m256i*)dst) + 0), c0); _mm_prefetch((const char*)(src + 512), _MM_HINT_NTA);
_mm256_stream_si256((((__m256i*)dst) + 1), c1);
_mm256_stream_si256((((__m256i*)dst) + 2), c2);
_mm256_stream_si256((((__m256i*)dst) + 3), c3);
_mm256_stream_si256((((__m256i*)dst) + 4), c4);
_mm256_stream_si256((((__m256i*)dst) + 5), c5);
_mm256_stream_si256((((__m256i*)dst) + 6), c6);
_mm256_stream_si256((((__m256i*)dst) + 7), c7);
src += 256; _mm256_stream_si256((((__m256i*)dst) + 0), c0);
dst += 256; _mm256_stream_si256((((__m256i*)dst) + 1), c1);
size -= 256; _mm256_stream_si256((((__m256i*)dst) + 2), c2);
_mm256_stream_si256((((__m256i*)dst) + 3), c3);
_mm256_stream_si256((((__m256i*)dst) + 4), c4);
_mm256_stream_si256((((__m256i*)dst) + 5), c5);
_mm256_stream_si256((((__m256i*)dst) + 6), c6);
_mm256_stream_si256((((__m256i*)dst) + 7), c7);
src += 256;
dst += 256;
size -= 256;
}
_mm_sfence();
_mm256_zeroupper();
}
else if (size < 1024 * 100)
{
while (size >= 128)
{
__m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0);
__m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1);
__m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2);
__m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3);
_mm256_store_si256((((__m256i*)dst) + 0), c0);
_mm256_store_si256((((__m256i*)dst) + 1), c1);
_mm256_store_si256((((__m256i*)dst) + 2), c2);
_mm256_store_si256((((__m256i*)dst) + 3), c3);
src += 128;
dst += 128;
size -= 128;
}
} }
_mm_sfence(); /* memcpy below handles the remainder */
_mm256_zeroupper();
if (size > 0)
{
memcpy(dst, src, size);
}
return;
} }
#endif // __AVX__ #endif
if (size >= 1024 * 100) if (size >= 1024 * 100)
{ {