This test initializes an __m128i data type using the old
non-portable way used until now and the more portable way
using compiler intrinsics. The test ensures the resulting
values after initialization match.

Signed-off-by: Andre Muezerie <andre...@linux.microsoft.com>
---
 app/test/test_thash.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/app/test/test_thash.c b/app/test/test_thash.c
index 33b0c6adac..5f7081a3ad 100644
--- a/app/test/test_thash.c
+++ b/app/test/test_thash.c
@@ -1029,6 +1029,35 @@ test_keygen(void)
        return TEST_SUCCESS;
 }
 
+#ifdef RTE_ARCH_X86
+#ifndef RTE_TOOLCHAIN_MSVC
+static int
+test_init_m128i(void)
+{
+       /* When initializing __m128i with two constant values like below
+        * MSVC issues warning C4305:
+        *     'initializing': truncation from 'unsigned __int64' to 'char'
+        */
+       static const __m128i a = {
+                       0x0405060700010203ULL, 0x0C0D0E0F08090A0BULL};
+
+       /* Using compiler intrinsics to initialize __m128i is therefore
+        * preferred, like below
+        */
+       const __m128i b = _mm_set_epi64x(
+                       0x0C0D0E0F08090A0BULL, 0x0405060700010203ULL);
+
+       if (memcmp(&a, &b, sizeof(a)) != 0) {
+               printf("Same value was expected when initializing data "
+                               "type using compiler intrinsic\n");
+               return -1;
+       }
+
+       return TEST_SUCCESS;
+}
+#endif
+#endif
+
 static struct unit_test_suite thash_tests = {
        .suite_name = "thash autotest",
        .setup = NULL,
@@ -1051,6 +1080,11 @@ static struct unit_test_suite thash_tests = {
        TEST_CASE(test_adjust_tuple),
        TEST_CASE(test_adjust_tuple_mult_reta),
        TEST_CASE(test_keygen),
+#ifdef RTE_ARCH_X86
+#ifndef RTE_TOOLCHAIN_MSVC
+       TEST_CASE(test_init_m128i),
+#endif
+#endif
        TEST_CASES_END()
        }
 };
-- 
2.48.1.vfs.0.0

Reply via email to