aboutsummaryrefslogtreecommitdiffstats
path: root/bench/libtfm.h
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2016-04-22 06:46:50 +0200
committerMattias Andrée <maandree@kth.se>2016-04-22 06:46:50 +0200
commit69787408e645ca3c28c13bf2de3e86f632f5549e (patch)
tree039e5f588f6bd83fb43c14ece63839191f6d9bd7 /bench/libtfm.h
parentUnlist fixed entry from the todo-list (diff)
downloadlibzahl-69787408e645ca3c28c13bf2de3e86f632f5549e.tar.gz
libzahl-69787408e645ca3c28c13bf2de3e86f632f5549e.tar.bz2
libzahl-69787408e645ca3c28c13bf2de3e86f632f5549e.tar.xz
Add support for benchmark against TomsFastMath
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'bench/libtfm.h')
-rw-r--r--bench/libtfm.h293
1 files changed, 293 insertions, 0 deletions
diff --git a/bench/libtfm.h b/bench/libtfm.h
new file mode 100644
index 0000000..fd651a8
--- /dev/null
+++ b/bench/libtfm.h
@@ -0,0 +1,293 @@
+#include <tfm.h>
+
+#include <stddef.h>
+#include <setjmp.h>
+#include <stdint.h>
+#include <stdio.h>
+
+typedef fp_int z_t[1];
+
+static z_t _0, _1, _a, _b;
+static int _tmp;
+
+static void
+fp_set_int(z_t a, uint32_t d)
+{
+ a->dp[0] = d;
+ a->used = !!d;
+ a->sign = 0;
+}
+
+static void
+zsetup(jmp_buf env)
+{
+ (void) env;
+ fp_init(_0);
+ fp_init(_1);
+ fp_init(_a);
+ fp_init(_b);
+ fp_set_int(_0, 0);
+ fp_set_int(_1, 1);
+}
+
+static void
+zunsetup(void)
+{
+ /* Do nothing */
+}
+
+#define FAST_RANDOM 0
+#define SECURE_RANDOM 0
+#define DEFAULT_RANDOM 0
+#define FASTEST_RANDOM 0
+#define LIBC_RAND_RANDOM 0
+#define LIBC_RANDOM_RANDOM 0
+#define LIBC_RAND48_RANDOM 0
+#define QUASIUNIFORM 0
+#define UNIFORM 1
+#define MODUNIFORM 2
+
+#define zperror(x) ((void)0)
+#define zinit(a) fp_init(a)
+#define zfree(a) ((void)a)
+
+#define zset(r, a) fp_copy(a, r)
+#define zadd_unsigned(r, a, b) (zabs(_a, a), zabs(_b, b), fp_add(_a, _b, r))
+#define zsub_unsigned(r, a, b) (zabs(_a, a), zabs(_b, b), fp_sub(_a, _b, r))
+#define zadd(r, a, b) fp_add(a, b, r)
+#define zsub(r, a, b) fp_sub(a, b, r)
+#define zeven(a) fp_iseven(a)
+#define zodd(a) fp_isodd(a)
+#define zeven_nonzero(a) fp_iseven(a)
+#define zodd_nonzero(a) fp_isodd(a)
+#define zzero(a) fp_iszero(a)
+#define zsignum(a) fp_cmp(a, _0)
+#define zbits(a) fp_count_bits(a)
+#define zlsb(a) fp_cnt_lsb(a)
+#define zlsh(r, a, b) fp_mul_2d(a, b, r)
+#define zrsh(r, a, b) fp_div_2d(a, b, r, 0)
+#define ztrunc(r, a, b) fp_mod_2d(a, b, r)
+#define zcmpmag(a, b) fp_cmp_mag(a, b)
+#define zcmp(a, b) fp_cmp(a, b)
+#define zcmpi(a, b) (zseti(_b, b), fp_cmp(a, _b))
+#define zcmpu(a, b) (zsetu(_b, b), fp_cmp(a, _b))
+#define zgcd(r, a, b) fp_gcd(a, b, r)
+#define zmul(r, a, b) fp_mul(a, b, r)
+#define zsqr(r, a) fp_sqr(a, r)
+#define zmodmul(r, a, b, m) fp_mulmod(a, b, m, r)
+#define zmodsqr(r, a, m) fp_sqrmod(a, m, r)
+#define zpow(r, a, b) zpowu(r, a, b->used ? b->dp[0] : 0)
+#define zmodpow(r, a, b, m) fp_exptmod(a, b, m, r)
+#define zmodpowu(r, a, b, m) (fp_set_int(_b, b), fp_exptmod(a, _b, m, r))
+#define zsets(a, s) fp_read_radix(a, s, 10)
+#define zstr_length(a, b) (fp_radix_size(a, b, &_tmp), _tmp)
+#define zstr(a, s) fp_toradix(a, s, 10)
+#define zptest(w, a, t) fp_isprime_ex(a, t) /* Note, the witness is not returned. */
+#define zload(a, s) fp_read_signed_bin(a, (unsigned char *)s, _tmp)
+#define zdiv(r, a, b) fp_div(a, b, r, 0)
+#define zmod(r, a, b) fp_mod(a, b, r)
+#define zdivmod(q, r, a, b) fp_div(a, b, q, r)
+
+static inline void
+zneg(z_t r, z_t a)
+{
+ fp_neg(a, r);
+}
+
+static inline void
+zabs(z_t r, z_t a)
+{
+ fp_abs(a, r);
+}
+
+static void
+zswap(z_t a, z_t b)
+{
+ z_t t;
+ fp_copy(a, t);
+ fp_copy(b, a);
+ fp_copy(t, b);
+}
+
+static void
+zand(z_t r, z_t a, z_t b)
+{
+ int i;
+ for (i = 0; i < a->used && i < b->used; i++)
+ r->dp[i] = a->dp[i] & b->dp[i];
+ r->used = i;
+ while (r->used && !r->dp[r->used])
+ r->used--;
+ r->sign = a->sign & b->sign;
+}
+
+static void
+zor(z_t r, z_t a, z_t b)
+{
+ int i;
+ for (i = 0; i < a->used && i < b->used; i++)
+ r->dp[i] = a->dp[i] | b->dp[i];
+ for (; i < a->used; i++)
+ r->dp[i] = a->dp[i];
+ for (; i < b->used; i++)
+ r->dp[i] = b->dp[i];
+ r->used = i;
+ r->sign = a->sign | b->sign;
+}
+
+static void
+zxor(z_t r, z_t a, z_t b)
+{
+ int i;
+ for (i = 0; i < a->used && i < b->used; i++)
+ r->dp[i] = a->dp[i] ^ b->dp[i];
+ for (; i < a->used; i++)
+ r->dp[i] = a->dp[i];
+ for (; i < b->used; i++)
+ r->dp[i] = b->dp[i];
+ r->used = i;
+ while (r->used && !r->dp[r->used])
+ r->used--;
+ r->sign = a->sign ^ b->sign;
+}
+
+static int
+zsave(z_t a, char *buf)
+{
+ _tmp = buf ? fp_signed_bin_size(a) : (fp_to_signed_bin(a, (unsigned char *)buf), 0);
+ return _tmp;
+}
+
+static void
+zsetu(z_t r, unsigned long long int val)
+{
+ uint32_t high = (uint32_t)(val >> 32);
+ uint32_t low = (uint32_t)val;
+
+ if (high) {
+ fp_set_int(r, high);
+ fp_set_int(_a, low);
+ fp_lshd(r, 32);
+ zadd(r, r, _a);
+ } else {
+ fp_set_int(r, low);
+ }
+
+}
+
+static void
+zseti(z_t r, long long int val)
+{
+ if (val >= 0) {
+ zsetu(r, (unsigned long long int)val);
+ } else {
+ zsetu(r, (unsigned long long int)-val);
+ zneg(r, r);
+ }
+}
+
+static void
+zsplit(z_t high, z_t low, z_t a, size_t brk)
+{
+ if (low == a) {
+ zrsh(high, a, brk);
+ ztrunc(low, a, brk);
+ } else {
+ ztrunc(low, a, brk);
+ zrsh(high, a, brk);
+ }
+}
+
+static void
+znot(z_t r, z_t a)
+{
+ fp_2expt(_a, (int)zbits(a));
+ fp_sub_d(_a, 1, _a);
+ zand(r, a, _a);
+ zneg(r, r);
+}
+
+static int
+zbtest(z_t a, size_t bit)
+{
+ fp_2expt(_b, (int)bit);
+ zand(_b, a, _b);
+ return !zzero(_b);
+}
+
+static void
+zbset(z_t r, z_t a, size_t bit, int mode)
+{
+ if (mode > 0) {
+ fp_2expt(_b, (int)bit);
+ zor(r, a, _b);
+ } else if (mode < 0 || zbtest(a, bit)) {
+ fp_2expt(_b, (int)bit);
+ zxor(r, a, _b);
+ }
+}
+
+static void
+zrand(z_t r, int dev, int dist, z_t n)
+{
+ static int gave_up = 0;
+ int bits;
+ (void) dev;
+
+ if (zzero(n)) {
+ fp_zero(r);
+ return;
+ }
+ if (zsignum(n) < 0) {
+ return;
+ }
+
+ bits = zbits(n);
+
+ switch (dist) {
+ case QUASIUNIFORM:
+ fp_rand(r, bits);
+ zadd(r, r, _1);
+ zmul(r, r, n);
+ zrsh(r, r, bits);
+ break;
+
+ case UNIFORM:
+ if (!gave_up) {
+ gave_up = 1;
+ printf("I'm sorry, this is too difficult, I give up.\n");
+ }
+ break;
+
+ case MODUNIFORM:
+ fp_rand(r, bits);
+ if (zcmp(r, n) > 0)
+ zsub(r, r, n);
+ break;
+
+ default:
+ abort();
+ }
+}
+
+static void
+zpowu(z_t r, z_t a, unsigned long long int b)
+{
+ z_t product, factor;
+ int neg = zsignum(a) < 0;
+
+ zinit(product);
+ zinit(factor);
+ zsetu(product, 1);
+ zset(factor, a);
+
+ for (; b; b >>= 1) {
+ if (b & 1)
+ zmul(product, product, factor);
+ zsqr(factor, factor);
+ }
+
+ zset(r, product);
+ if (neg)
+ zneg(r, r);
+}