From c6a43c25a8ba1a825588f7af25a7173f2e66ce8d Mon Sep 17 00:00:00 2001 From: John Naylor Date: Mon, 29 Aug 2022 17:25:59 +0700 Subject: [PATCH] Fix broken cast on MSVC Per buildfarm animal drongo, casting a vector type to the same type causes a compile error. We still need the cast on ARM64, so invent a wrapper function that does the casting only where necessary. Discussion: https://www.postgresql.org/message-id/CAFBsxsEouaTwbmpqV%2BEW2%3DwFbhw2vHRe26NQTRcd0%3DNaOFDy7A%40mail.gmail.com --- src/include/port/pg_lfind.h | 2 +- src/include/port/simd.h | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/include/port/pg_lfind.h b/src/include/port/pg_lfind.h index d575e733d3..0625cac6b5 100644 --- a/src/include/port/pg_lfind.h +++ b/src/include/port/pg_lfind.h @@ -151,7 +151,7 @@ pg_lfind32(uint32 key, uint32 *base, uint32 nelem) result = vector32_or(tmp1, tmp2); /* see if there was a match */ - if (vector8_is_highbit_set((Vector8) result)) + if (vector32_is_highbit_set(result)) { Assert(assert_result == true); return true; diff --git a/src/include/port/simd.h b/src/include/port/simd.h index b538ac070f..0ff1549083 100644 --- a/src/include/port/simd.h +++ b/src/include/port/simd.h @@ -274,6 +274,28 @@ vector8_is_highbit_set(const Vector8 v) #endif } +/* + * Exactly like vector32_is_highbit_set except for the input type, so it + * looks at each byte separately. + * + * XXX x86 uses the same underlying type for 8-bit, 16-bit, and 32-bit + * integer elements, but Arm does not, hence the need for a separate + * function. We could instead adopt the behavior of Arm's vmaxvq_u32(), i.e. + * check each 32-bit element, but that would require an additional mask + * operation on x86. + */ +#ifndef USE_NO_SIMD +static inline bool +vector32_is_highbit_set(const Vector32 v) +{ +#if defined(USE_NEON) + return vector8_is_highbit_set((Vector8) v); +#else + return vector8_is_highbit_set(v); +#endif +} +#endif /* ! USE_NO_SIMD */ + /* * Return the bitwise OR of the inputs */