Update code to use only avx/sse intrinsics as mmx is not supported on
MSVC.

Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com>
---
 lib/net/net_crc_avx512.c | 28 ++++++++++------------------
 lib/net/net_crc_sse.c    | 28 ++++++++++------------------
 2 files changed, 20 insertions(+), 36 deletions(-)

diff --git a/lib/net/net_crc_avx512.c b/lib/net/net_crc_avx512.c
index 0f0dee4..6d0c644 100644
--- a/lib/net/net_crc_avx512.c
+++ b/lib/net/net_crc_avx512.c
@@ -8,7 +8,11 @@
 
 #include "net_crc.h"
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#include <intrin.h>
+#else
 #include <x86intrin.h>
+#endif
 
 /* VPCLMULQDQ CRC computation context structure */
 struct crc_vpclmulqdq_ctx {
@@ -331,13 +335,10 @@ static const alignas(16) uint32_t mask2[4] = {
                        c9, c10, c11);
        crc32_eth.fold_3x128b = _mm512_setr_epi64(c12, c13, c14, c15,
                        c16, c17, 0, 0);
-       crc32_eth.fold_1x128b = _mm_setr_epi64(_mm_cvtsi64_m64(c16),
-                       _mm_cvtsi64_m64(c17));
+       crc32_eth.fold_1x128b = _mm_set_epi64x(c17, c16);
 
-       crc32_eth.rk5_rk6 = _mm_setr_epi64(_mm_cvtsi64_m64(c18),
-                       _mm_cvtsi64_m64(c19));
-       crc32_eth.rk7_rk8 = _mm_setr_epi64(_mm_cvtsi64_m64(c20),
-                       _mm_cvtsi64_m64(c21));
+       crc32_eth.rk5_rk6 = _mm_set_epi64x(c19, c18);
+       crc32_eth.rk7_rk8 = _mm_set_epi64x(c21, c20);
 }
 
 static void
@@ -378,13 +379,10 @@ static const alignas(16) uint32_t mask2[4] = {
                        c9, c10, c11);
        crc16_ccitt.fold_3x128b = _mm512_setr_epi64(c12, c13, c14, c15,
                        c16, c17, 0, 0);
-       crc16_ccitt.fold_1x128b = _mm_setr_epi64(_mm_cvtsi64_m64(c16),
-                       _mm_cvtsi64_m64(c17));
+       crc16_ccitt.fold_1x128b = _mm_set_epi64x(c17, c16);
 
-       crc16_ccitt.rk5_rk6 = _mm_setr_epi64(_mm_cvtsi64_m64(c18),
-                       _mm_cvtsi64_m64(c19));
-       crc16_ccitt.rk7_rk8 = _mm_setr_epi64(_mm_cvtsi64_m64(c20),
-                       _mm_cvtsi64_m64(c21));
+       crc16_ccitt.rk5_rk6 = _mm_set_epi64x(c19, c18);
+       crc16_ccitt.rk7_rk8 = _mm_set_epi64x(c21, c20);
 }
 
 void
@@ -392,12 +390,6 @@ static const alignas(16) uint32_t mask2[4] = {
 {
        crc32_load_init_constants();
        crc16_load_init_constants();
-
-       /*
-        * Reset the register as following calculation may
-        * use other data types such as float, double, etc.
-        */
-       _mm_empty();
 }
 
 uint32_t
diff --git a/lib/net/net_crc_sse.c b/lib/net/net_crc_sse.c
index d673ae3..9ab80a0 100644
--- a/lib/net/net_crc_sse.c
+++ b/lib/net/net_crc_sse.c
@@ -10,7 +10,11 @@
 
 #include "net_crc.h"
 
+#ifdef RTE_TOOLCHAIN_MSVC
+#include <intrin.h>
+#else
 #include <x86intrin.h>
+#endif
 
 /** PCLMULQDQ CRC computation context structure */
 struct crc_pclmulqdq_ctx {
@@ -272,12 +276,9 @@ static const alignas(16) uint8_t crc_xmm_shift_tab[48] = {
        p =  0x10811LLU;
 
        /** Save the params in context structure */
-       crc16_ccitt_pclmulqdq.rk1_rk2 =
-               _mm_setr_epi64(_mm_cvtsi64_m64(k1), _mm_cvtsi64_m64(k2));
-       crc16_ccitt_pclmulqdq.rk5_rk6 =
-               _mm_setr_epi64(_mm_cvtsi64_m64(k5), _mm_cvtsi64_m64(k6));
-       crc16_ccitt_pclmulqdq.rk7_rk8 =
-               _mm_setr_epi64(_mm_cvtsi64_m64(q), _mm_cvtsi64_m64(p));
+       crc16_ccitt_pclmulqdq.rk1_rk2 = _mm_set_epi64x(k2, k1);
+       crc16_ccitt_pclmulqdq.rk5_rk6 = _mm_set_epi64x(k6, k5);
+       crc16_ccitt_pclmulqdq.rk7_rk8 = _mm_set_epi64x(p, q);
 
        /** Initialize CRC32 data */
        k1 = 0xccaa009eLLU;
@@ -288,18 +289,9 @@ static const alignas(16) uint8_t crc_xmm_shift_tab[48] = {
        p =  0x1db710641LLU;
 
        /** Save the params in context structure */
-       crc32_eth_pclmulqdq.rk1_rk2 =
-               _mm_setr_epi64(_mm_cvtsi64_m64(k1), _mm_cvtsi64_m64(k2));
-       crc32_eth_pclmulqdq.rk5_rk6 =
-               _mm_setr_epi64(_mm_cvtsi64_m64(k5), _mm_cvtsi64_m64(k6));
-       crc32_eth_pclmulqdq.rk7_rk8 =
-               _mm_setr_epi64(_mm_cvtsi64_m64(q), _mm_cvtsi64_m64(p));
-
-       /**
-        * Reset the register as following calculation may
-        * use other data types such as float, double, etc.
-        */
-       _mm_empty();
+       crc32_eth_pclmulqdq.rk1_rk2 = _mm_set_epi64x(k2, k1);
+       crc32_eth_pclmulqdq.rk5_rk6 = _mm_set_epi64x(k6, k5);
+       crc32_eth_pclmulqdq.rk7_rk8 = _mm_set_epi64x(p, q);
 }
 
 uint32_t
-- 
1.8.3.1

Reply via email to