Alvaro Herrera <alvhe...@alvh.no-ip.org> writes:
> On 2024-Apr-02, Nathan Bossart wrote:
>> Another idea I had is to turn pg_popcount() into a macro that just uses the
>> pg_number_of_ones array when called for few bytes:
>> 
>>      static inline uint64
>>      pg_popcount_inline(const char *buf, int bytes)
>>      {
>>              uint64          popcnt = 0;
>> 
>>              while (bytes--)
>>                      popcnt += pg_number_of_ones[(unsigned char) *buf++];
>> 
>>              return popcnt;
>>      }
>> 
>>      #define pg_popcount(buf, bytes) \
>>              ((bytes < 64) ? \
>>               pg_popcount_inline(buf, bytes) : \
>>               pg_popcount_optimized(buf, bytes))
>> 
>> But again, I'm not sure this is really worth it for the current use-cases.

> Eh, that seems simple enough, and then you can forget about that case.

I don't like the double evaluation of the macro argument.  Seems like
you could get the same results more safely with

        static inline uint64
        pg_popcount(const char *buf, int bytes)
        {
                if (bytes < 64)
                {
                        uint64          popcnt = 0;

                        while (bytes--)
                                popcnt += pg_number_of_ones[(unsigned char) 
*buf++];

                        return popcnt;
                }
                return pg_popcount_optimized(buf, bytes);
        }

                        regards, tom lane


Reply via email to