diff options
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | src/main.c | 4 | ||||
| -rw-r--r-- | src/new32v3.c | 20 | 
3 files changed, 24 insertions, 1 deletions
@@ -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 @@ -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 <stdint.h> + +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)); +}  | 
