Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Refactor code for setting pg_popcount* function pointers.
authorNathan Bossart <nathan@postgresql.org>
Tue, 2 Apr 2024 15:16:00 +0000 (10:16 -0500)
committerNathan Bossart <nathan@postgresql.org>
Tue, 2 Apr 2024 15:16:00 +0000 (10:16 -0500)
Presently, there are three copies of this code, and a proposed
follow-up patch would add more code to each copy.  This commit
introduces a new inline function for this code and makes use of it
in the pg_popcount*_choose functions, thereby reducing code
duplication.

Author: Paul Amonson
Discussion: https://postgr.es/m/BL1PR11MB5304097DF7EA81D04C33F3D1DCA6A%40BL1PR11MB5304.namprd11.prod.outlook.com

src/port/pg_bitutils.c

index 1197696e97cf9179f8fcde693e51c8cf7abb2861..28312f3dd95e82a81dbcda08845df4f5dcc6b070 100644 (file)
@@ -148,8 +148,8 @@ pg_popcount_available(void)
  * the function pointers so that subsequent calls are routed directly to
  * the chosen implementation.
  */
-static int
-pg_popcount32_choose(uint32 word)
+static inline void
+choose_popcount_functions(void)
 {
    if (pg_popcount_available())
    {
@@ -163,45 +163,26 @@ pg_popcount32_choose(uint32 word)
        pg_popcount64 = pg_popcount64_slow;
        pg_popcount = pg_popcount_slow;
    }
+}
 
+static int
+pg_popcount32_choose(uint32 word)
+{
+   choose_popcount_functions();
    return pg_popcount32(word);
 }
 
 static int
 pg_popcount64_choose(uint64 word)
 {
-   if (pg_popcount_available())
-   {
-       pg_popcount32 = pg_popcount32_fast;
-       pg_popcount64 = pg_popcount64_fast;
-       pg_popcount = pg_popcount_fast;
-   }
-   else
-   {
-       pg_popcount32 = pg_popcount32_slow;
-       pg_popcount64 = pg_popcount64_slow;
-       pg_popcount = pg_popcount_slow;
-   }
-
+   choose_popcount_functions();
    return pg_popcount64(word);
 }
 
 static uint64
 pg_popcount_choose(const char *buf, int bytes)
 {
-   if (pg_popcount_available())
-   {
-       pg_popcount32 = pg_popcount32_fast;
-       pg_popcount64 = pg_popcount64_fast;
-       pg_popcount = pg_popcount_fast;
-   }
-   else
-   {
-       pg_popcount32 = pg_popcount32_slow;
-       pg_popcount64 = pg_popcount64_slow;
-       pg_popcount = pg_popcount_slow;
-   }
-
+   choose_popcount_functions();
    return pg_popcount(buf, bytes);
 }