gap/gap-popcount.patch

40 lines
1.0 KiB
Diff

--- src/blister.c.orig 2022-12-17 19:18:59.000000000 -0700
+++ src/blister.c 2023-08-10 20:07:09.650671153 -0600
@@ -840,6 +840,28 @@ void ConvBlist (
**
*F COUNT_TRUES_BLOCK( <block> ) . . . . . . . . . . . count number of trues
*/
+#ifdef __x86_64__
+static UInt __attribute__((target ("popcnt"))) fast_COUNT_TRUES_BLOCK(UInt block)
+{
+ return __builtin_popcountl(block);
+}
+
+static UInt slow_COUNT_TRUES_BLOCK(UInt block)
+{
+ return __builtin_popcountl(block);
+}
+
+static UInt (*resolve_COUNT_TRUES_BLOCK(void))(UInt block)
+{
+ __builtin_cpu_init();
+ return __builtin_cpu_supports("popcnt")
+ ? &fast_COUNT_TRUES_BLOCK
+ : &slow_COUNT_TRUES_BLOCK;
+}
+
+UInt __attribute__((ifunc ("resolve_COUNT_TRUES_BLOCK")))
+COUNT_TRUES_BLOCK(UInt block);
+#else
UInt COUNT_TRUES_BLOCK(UInt block)
{
#if USE_POPCNT && defined(HAVE___BUILTIN_POPCOUNTL)
@@ -864,6 +886,7 @@ UInt COUNT_TRUES_BLOCK(UInt block)
return block;
#endif
}
+#endif
/****************************************************************************
**