Bladeren bron

[Minor] Cleanup, use __builtin_clz, mention algorithm source

tags/1.7.8
Vsevolod Stakhov 6 jaren geleden
bovenliggende
commit
a444ae89b5
1 gewijzigde bestanden met toevoegingen van 10 en 2 verwijderingen
  1. 10
    2
      src/libutil/printf.c

+ 10
- 2
src/libutil/printf.c Bestand weergeven

@@ -126,7 +126,7 @@ rspamd_decimal_digits32 (guint32 val)
unsigned long r = 0;
_BitScanReverse (&r, val | 1);
tmp = (r + 1) * 1233 >> 12;
#elif defined(__GNUC__) && (__GNUC__ >= 30)
#elif defined(__GNUC__) && (__GNUC__ >= 3)
tmp = (32 - __builtin_clz (val | 1U)) * 1233 >> 12;

#else /* Software version */
@@ -189,7 +189,7 @@ rspamd_decimal_digits64 (guint64 val)
_BitScanReverse64 (&r, val | 1);
tmp = (r + 1) * 1233 >> 12;
#endif
#elif defined(__GNUC__) && (__GNUC__ >= 30)
#elif defined(__GNUC__) && (__GNUC__ >= 3)
tmp = (64 - __builtin_clzll (val | 1ULL)) * 1233 >> 12;
#else /* Software version */
static const unsigned debruijn_tbl[32] = { 0, 9, 1, 10, 13, 21, 2, 29,
@@ -226,6 +226,14 @@ rspamd_decimal_digits64 (guint64 val)
return tmp - (val < powers_of_10[tmp]) + 1;
}

/*
* Idea from https://github.com/miloyip/itoa-benchmark:
* Uses lookup table (LUT) of digit pairs for division/modulo of 100.
*
* Mentioned in:
* https://www.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c-15708507
*/

static const char int_lookup_table[200] = {
'0','0','0','1','0','2','0','3','0','4',
'0','5','0','6','0','7','0','8','0','9',

Laden…
Annuleren
Opslaan