From e8acc35f0de89f4371015fbdf3e7b8e9880d5f33 Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Sun, 18 Sep 2022 19:02:15 +0200
Subject: [PATCH] add AVX test code

---
 inc/blt.h |  5 +++++
 src/blt.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/inc/blt.h b/inc/blt.h
index 220a580..641c4d3 100644
--- a/inc/blt.h
+++ b/inc/blt.h
@@ -5,6 +5,11 @@
 #include <windows.h>
 
 
+void blt_copy(
+    unsigned char* dst,
+    unsigned char* src,
+    size_t size);
+
 void blt_clean(
     unsigned char* dst,
     int dst_x,
diff --git a/src/blt.c b/src/blt.c
index f69451c..b3b191f 100644
--- a/src/blt.c
+++ b/src/blt.c
@@ -4,6 +4,59 @@
 #include "blt.h"
 
 
+void blt_copy(
+    unsigned char* dst,
+    unsigned char* src,
+    size_t size)
+{
+#ifdef __AVX__
+    if (size >= 1024 * 1536 && !((DWORD)dst % 32) && !((DWORD)src % 32))
+    {
+        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);
+
+            _mm256_stream_si256((((__m256i*)dst) + 0), c0);
+            _mm256_stream_si256((((__m256i*)dst) + 1), c1);
+            _mm256_stream_si256((((__m256i*)dst) + 2), c2);
+            _mm256_stream_si256((((__m256i*)dst) + 3), c3);
+
+            c0 = _mm256_load_si256(((const __m256i*)src) + 4);
+            c1 = _mm256_load_si256(((const __m256i*)src) + 5);
+            c2 = _mm256_load_si256(((const __m256i*)src) + 6);
+            c3 = _mm256_load_si256(((const __m256i*)src) + 7);
+
+            _mm256_stream_si256((((__m256i*)dst) + 4), c0);
+            _mm256_stream_si256((((__m256i*)dst) + 5), c1);
+            _mm256_stream_si256((((__m256i*)dst) + 6), c2);
+            _mm256_stream_si256((((__m256i*)dst) + 7), c3);
+
+            src += 256;
+            dst += 256;
+            size -= 256;
+        }
+
+        if (size > 0)
+        {
+            memcpy(dst, src, size);
+        }
+        return;
+    }
+#endif
+
+    if (size >= 1024 * 100)
+    {
+        __movsb(dst, src, size);
+    }
+    else
+    {
+        memcpy(dst, src, size);
+    }
+}
+
 void blt_clean(
     unsigned char* dst,
     int dst_x,