From 37c83785b692145b95fe4678f7d599527157217c Mon Sep 17 00:00:00 2001 From: "Lijian.Zhang" Date: Thu, 4 Apr 2019 15:26:26 +0800 Subject: [PATCH] Enable NEON instructions in memcpy_le Neon version of memcpy_le gives better performance compared with memmove on aarch64 Change-Id: I44b487bb0795a6e70dd1e55bdde4a077773ec859 Signed-off-by: Lijian Zhang Reviewed-by: Sirshak Das --- src/vppinfra/string.h | 2 +- src/vppinfra/vector_neon.h | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vppinfra/string.h b/src/vppinfra/string.h index 49848e92f39..d64df8e5602 100644 --- a/src/vppinfra/string.h +++ b/src/vppinfra/string.h @@ -239,7 +239,7 @@ clib_memcpy_le (u8 * dst, u8 * src, u8 len, u8 max_len) d1 = u8x32_blend (d1, s1, u8x32_is_greater (lv, mask)); u8x32_store_unaligned (d1, dst + 32); -#elif defined (CLIB_HAVE_VEC128) && !defined (__aarch64__) +#elif defined (CLIB_HAVE_VEC128) u8x16 s0, s1, s2, s3, d0, d1, d2, d3; u8x16 mask = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; u8x16 lv = u8x16_splat (len); diff --git a/src/vppinfra/vector_neon.h b/src/vppinfra/vector_neon.h index 90451602d2d..37bd1bb0b01 100644 --- a/src/vppinfra/vector_neon.h +++ b/src/vppinfra/vector_neon.h @@ -83,6 +83,14 @@ static_always_inline u32 \ t##s##x##c##_zero_byte_mask (t##s##x##c x) \ { uint8x16_t v = vreinterpretq_u8_u##s (vceqq_##i (vdupq_n_##i(0), x)); \ return u8x16_compare_byte_mask (v); } \ +\ +static_always_inline u##s##x##c \ +t##s##x##c##_is_greater (t##s##x##c a, t##s##x##c b) \ +{ return (u##s##x##c) vcgtq_##i (a, b); } \ +\ +static_always_inline t##s##x##c \ +t##s##x##c##_blend (t##s##x##c dst, t##s##x##c src, u##s##x##c mask) \ +{ return (t##s##x##c) vbslq_##i (mask, src, dst); } foreach_neon_vec128i foreach_neon_vec128u -- 2.16.6