From a953e83c8eec7d9469f5248a6c26a0b21846245a Mon Sep 17 00:00:00 2001 From: Yang Hau Date: Wed, 31 Jul 2024 16:20:08 +0800 Subject: [PATCH] feat: Add vqneg[b|h|s|d]_[s8|s16|s32|s64] --- neon2rvv.h | 32 +++++++++++++++++++++---- tests/impl.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++---- tests/impl.h | 8 +++---- 3 files changed, 92 insertions(+), 12 deletions(-) diff --git a/neon2rvv.h b/neon2rvv.h index 03daf696..a397e126 100644 --- a/neon2rvv.h +++ b/neon2rvv.h @@ -7197,13 +7197,37 @@ FORCE_INLINE int64x2_t vqnegq_s64(int64x2_t a) { return __riscv_vmerge_vxm_i64m1(a_neg, INT64_MAX, min_mask, 2); } -// FORCE_INLINE int8_t vqnegb_s8(int8_t a); +FORCE_INLINE int8_t vqnegb_s8(int8_t a) { + if (a == INT8_MIN) { + return INT8_MAX; + } else { + return -a; + } +} -// FORCE_INLINE int16_t vqnegh_s16(int16_t a); +FORCE_INLINE int16_t vqnegh_s16(int16_t a) { + if (a == INT16_MIN) { + return INT16_MAX; + } else { + return -a; + } +} -// FORCE_INLINE int32_t vqnegs_s32(int32_t a); +FORCE_INLINE int32_t vqnegs_s32(int32_t a) { + if (a == INT32_MIN) { + return INT32_MAX; + } else { + return -a; + } +} -// FORCE_INLINE int64_t vqnegd_s64(int64_t a); +FORCE_INLINE int64_t vqnegd_s64(int64_t a) { + if (a == INT64_MIN) { + return INT64_MAX; + } else { + return -a; + } +} FORCE_INLINE int8x8_t vmvn_s8(int8x8_t a) { return __riscv_vnot_v_i8m1(a, 8); } diff --git a/tests/impl.cpp b/tests/impl.cpp index 707aada2..30a8e937 100644 --- a/tests/impl.cpp +++ b/tests/impl.cpp @@ -25927,13 +25927,69 @@ result_t test_vqnegq_s64(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { #endif // ENABLE_TEST_ALL } -result_t test_vqnegb_s8(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { return TEST_UNIMPL; } +result_t test_vqnegb_s8(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { +#ifdef ENABLE_TEST_ALL + int8_t *_a = (int8_t *)impl.test_cases_int_pointer1; + int8_t _c, c; + if (_a[0] == INT8_MIN) { + _c = INT8_MAX; + } else { + _c = -_a[0]; + } + c = vqnegb_s8(_a[0]); + return c == _c ? TEST_SUCCESS : TEST_FAIL; +#else + return TEST_UNIMPL; +#endif // ENABLE_TEST_ALL +} -result_t test_vqnegh_s16(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { return TEST_UNIMPL; } +result_t test_vqnegh_s16(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { +#ifdef ENABLE_TEST_ALL + int16_t *_a = (int16_t *)impl.test_cases_int_pointer1; + int16_t _c, c; + if (_a[0] == INT16_MIN) { + _c = INT16_MAX; + } else { + _c = -_a[0]; + } + c = vqnegh_s16(_a[0]); + return c == _c ? TEST_SUCCESS : TEST_FAIL; +#else + return TEST_UNIMPL; +#endif // ENABLE_TEST_ALL +} -result_t test_vqnegs_s32(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { return TEST_UNIMPL; } +result_t test_vqnegs_s32(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { +#ifdef ENABLE_TEST_ALL + int32_t *_a = (int32_t *)impl.test_cases_int_pointer1; + int32_t _c, c; + if (_a[0] == INT32_MIN) { + _c = INT32_MAX; + } else { + _c = -_a[0]; + } + c = vqnegs_s32(_a[0]); + return c == _c ? TEST_SUCCESS : TEST_FAIL; +#else + return TEST_UNIMPL; +#endif // ENABLE_TEST_ALL +} -result_t test_vqnegd_s64(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { return TEST_UNIMPL; } +result_t test_vqnegd_s64(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { +#ifdef ENABLE_TEST_ALL + int64_t *_a = (int64_t *)impl.test_cases_int_pointer1; + int64_t _c, c; + if (_a[0] == INT64_MIN) { + _c = INT64_MAX; + } else { + _c = -_a[0]; + } + c = vqnegd_s64(_a[0]); + return c == _c ? TEST_SUCCESS : TEST_FAIL; +#else + return TEST_UNIMPL; +#endif // ENABLE_TEST_ALL +} result_t test_vmvn_s8(const NEON2RVV_TEST_IMPL &impl, uint32_t iter) { #ifdef ENABLE_TEST_ALL diff --git a/tests/impl.h b/tests/impl.h index 5d3922b7..edb32403 100644 --- a/tests/impl.h +++ b/tests/impl.h @@ -1340,10 +1340,10 @@ _(vqnegq_s32) \ _(vqneg_s64) \ _(vqnegq_s64) \ - /*_(vqnegb_s8) */ \ - /*_(vqnegh_s16) */ \ - /*_(vqnegs_s32) */ \ - /*_(vqnegd_s64) */ \ + _(vqnegb_s8) \ + _(vqnegh_s16) \ + _(vqnegs_s32) \ + _(vqnegd_s64) \ _(vmvn_s8) \ _(vmvn_s16) \ _(vmvn_s32) \