vppinfra: fix the array mask function 29/33329/2
authorMohsin Kazmi <sykazmi@cisco.com>
Tue, 3 Aug 2021 17:56:05 +0000 (17:56 +0000)
committerBeno�t Ganne <bganne@cisco.com>
Wed, 4 Aug 2021 09:19:43 +0000 (09:19 +0000)
Type: fix
Fixes: 0ec7dad7a00852663eb88554561347987f87bb53

Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
Change-Id: I7fab80b3c7e86ac712a34c24ea3e526b0b5bb7ad

src/vppinfra/vector/array_mask.h
src/vppinfra/vector/test/array_mask.c

index 8f2e1d7..778ed3e 100644 (file)
@@ -37,11 +37,12 @@ clib_array_mask_u32 (u32 *src, u32 mask, u32 n_elts)
   for (i = 0; i + 8 <= n_elts; i += 8)
     *((u32x8u *) (src + i)) &= mask8;
   n_elts -= i;
+  src += i;
 #if defined(CLIB_HAVE_VEC256_MASK_LOAD_STORE)
   if (n_elts)
     {
       u8 m = pow2_mask (n_elts);
-      u32x8_mask_store (u32x8_mask_load_zero (src + i, m) & mask8, src + i, m);
+      u32x8_mask_store (u32x8_mask_load_zero (src, m) & mask8, src, m);
     }
   return;
 #endif
@@ -51,6 +52,7 @@ clib_array_mask_u32 (u32 *src, u32 mask, u32 n_elts)
   for (i = 0; i + 4 <= n_elts; i += 4)
     *((u32x4u *) (src + i)) &= mask4;
   n_elts -= i;
+  src += i;
   switch (n_elts)
     {
     case 3:
index 703c70a..a1f4da7 100644 (file)
@@ -76,13 +76,15 @@ static array_mask_test_t tests[] = {
                  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
                  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
                  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } },
+  /* mask values 0x1, output array of 1, 0, 1, 0,.. */
+  { .mask = 1, .expected = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 } },
 };
 
 static clib_error_t *
 test_clib_array_mask_u32 (clib_error_t *err)
 {
   u32 i, j;
-  for (i = 0; i < ARRAY_LEN (tests); i++)
+  for (i = 0; i < ARRAY_LEN (tests) - 1; i++)
     {
       u32 src[256];
       for (j = 0; j < ARRAY_LEN (src); j++)
@@ -99,6 +101,20 @@ test_clib_array_mask_u32 (clib_error_t *err)
                                      i, j, src[j], t->expected[j]);
        }
     }
+
+  u32 src[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+  array_mask_test_t *t = tests + i;
+
+  clib_array_mask_u32_wrapper (src, t->mask, ARRAY_LEN (src));
+  for (j = 0; j < ARRAY_LEN (src); j++)
+    {
+      if (src[j] != t->expected[j])
+       return clib_error_return (err,
+                                 "testcase %u failed at "
+                                 "(src[%u] = 0x%x, expected 0x%x)",
+                                 i, j, src[j], t->expected[j]);
+    }
+
   return err;
 }