aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Naylor <john.naylor@postgresql.org>2022-08-29 17:25:59 +0700
committerJohn Naylor <john.naylor@postgresql.org>2022-08-29 17:44:35 +0700
commitc6a43c25a8ba1a825588f7af25a7173f2e66ce8d (patch)
tree38f905124f4ad8aed3fabe82457868a6d55af66a /src
parent82739d4a80f2eeb2f96b56477bb04e463ea24800 (diff)
downloadpostgresql-c6a43c25a8ba1a825588f7af25a7173f2e66ce8d.tar.gz
postgresql-c6a43c25a8ba1a825588f7af25a7173f2e66ce8d.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/include/port/pg_lfind.h2
-rw-r--r--src/include/port/simd.h22
2 files changed, 23 insertions, 1 deletions
diff --git a/src/include/port/pg_lfind.h b/src/include/port/pg_lfind.h
index d575e733d34..0625cac6b59 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 b538ac070f7..0ff1549083a 100644
--- a/src/include/port/simd.h
+++ b/src/include/port/simd.h
@@ -275,6 +275,28 @@ vector8_is_highbit_set(const Vector8 v)
}
/*
+ * 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
*/
static inline Vector8