From 58c3bfc2b05cdeb53912bb659b4981e01502305a Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Tue, 25 Sep 2018 19:49:12 +0200 Subject: Even faster, yet again. --- Makefile | 1 + src/main.c | 4 +++- src/new32v3.c | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/new32v3.c diff --git a/Makefile b/Makefile index d85c7c7..3d16add 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ SRC := src/bigtab.c \ src/new.c \ src/new32.c \ src/new32v2.c \ + src/new32v3.c \ src/null.c \ src/ref.c diff --git a/src/main.c b/src/main.c index 4961879..04e0bad 100644 --- a/src/main.c +++ b/src/main.c @@ -20,6 +20,7 @@ int ref2(int i, int x, int y); int new(int i, int x, int y); int new32(int i, int x, int y); int new32v2(int i, int x, int y); +int new32v3(int i, int x, int y); void bigtab_init(void); int bigtab(int i, int x, int y); @@ -38,7 +39,8 @@ static struct solfunc solfuncs[ ] = { {"bigtab", bigtab}, {"new", new}, {"new32", new32}, - {"new32v2", new32v2} + {"new32v2", new32v2}, + {"new32v3", new32v3} }; #define PASSES 5 diff --git a/src/new32v3.c b/src/new32v3.c new file mode 100644 index 0000000..d64459d --- /dev/null +++ b/src/new32v3.c @@ -0,0 +1,20 @@ +#include + +static const unsigned int divtab[730] = { + [1] = 0xffff + 1l, + [3] = 0x5555 + 1l, + [9] = 0x1c71 + 1l, + [27] = 0x097b + 1l, + [81] = 0x0329 + 1l, + [243] = 0x010d + 1l, + [729] = 0x0059 + 1l +}; + +#define FASTDIV(n, d) (((n) * divtab[d]) >> 16) + +int new32v3(int i, int x, int y) +{ + int A; + A = i + x * y; + return A - 3 * y * (FASTDIV(A, 3 * y) - FASTDIV(i, 3 * y)); +} -- cgit