[Dnsmasq-discuss] [PATCH 2/6] Make in128++ branchless in SURF rand()
Leonid Evdokimov
leon at darkk.net.ru
Fri Oct 4 21:14:49 UTC 2024
It's equally fast, but it's measurably smaller.
---
src/util.c | 34 +++++++++++-----------------------
1 file changed, 11 insertions(+), 23 deletions(-)
diff --git src/util.c src/util.c
index fefa8333..c27d77c4 100644
--- src/util.c
+++ src/util.c
@@ -61,6 +61,10 @@ static void surf(void)
u32 t[12]; u32 x; u32 sum = 0;
int r; int i; int loop;
+ // Overflowing 32-bit counter is trivial, overflowing 64-bit counter takes 146 years
+ // at 4 GHz rate. So let counter be 64-bit as 128-bit counter is excessive.
+ in[0]++; in[1] += !in[0];
+
for (i = 0;i < 12;++i) t[i] = in[i] ^ seed[12 + i];
for (i = 0;i < 8;++i) out[i] = seed[24 + i];
x = t[11];
@@ -73,43 +77,27 @@ static void surf(void)
}
for (i = 0;i < 8;++i) out[i] ^= t[i + 4];
}
+
+ outleft = 8;
}
unsigned short rand16(void)
{
- if (!outleft)
- {
- if (!++in[0]) if (!++in[1]) if (!++in[2]) ++in[3];
- surf();
- outleft = 8;
- }
-
- return (unsigned short) out[--outleft];
+ return (unsigned short)rand32();
}
u32 rand32(void)
{
- if (!outleft)
- {
- if (!++in[0]) if (!++in[1]) if (!++in[2]) ++in[3];
- surf();
- outleft = 8;
- }
-
- return out[--outleft];
+ if (!outleft)
+ surf();
+ return out[--outleft];
}
u64 rand64(void)
{
if (outleft < 2)
- {
- if (!++in[0]) if (!++in[1]) if (!++in[2]) ++in[3];
- surf();
- outleft = 8;
- }
-
+ surf();
outleft -= 2;
-
return (u64)out[outleft+1] + (((u64)out[outleft]) << 32);
}
--
2.34.1
More information about the Dnsmasq-discuss
mailing list