aboutsummaryrefslogtreecommitdiffstats
path: root/bench
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2016-04-27 13:30:47 +0200
committerMattias Andrée <maandree@kth.se>2016-04-27 13:30:47 +0200
commit8c2ad212d78184d59e4181993c195b35c4cde166 (patch)
treed4cc9d6a6808ce55102666c727eeb51f8870457e /bench
parentFix const-correctness in libtommath translation and add error checking in hebimath translation (diff)
downloadlibzahl-8c2ad212d78184d59e4181993c195b35c4cde166.tar.gz
libzahl-8c2ad212d78184d59e4181993c195b35c4cde166.tar.bz2
libzahl-8c2ad212d78184d59e4181993c195b35c4cde166.tar.xz
Improve library translations
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'bench')
-rw-r--r--bench/benchmark.c10
-rw-r--r--bench/libgmp.h14
-rw-r--r--bench/libhebimath.h32
-rw-r--r--bench/libtfm.h16
4 files changed, 55 insertions, 17 deletions
diff --git a/bench/benchmark.c b/bench/benchmark.c
index 2c3f464..87e15ca 100644
--- a/bench/benchmark.c
+++ b/bench/benchmark.c
@@ -99,10 +99,13 @@ main(int argc, char *argv[])
BENCHMARK(zbset(c, a, 76, -1), 1);
BENCHMARK(zbset(a, a, 76, -1), 1);
BENCHMARK(zbtest(a, 76), 1);
+#ifndef HEBIMATH
BENCHMARK(zgcd(c, a, b), 0);
+#endif
BENCHMARK(zmul(c, a, b), 0);
BENCHMARK(zmul(c, a, a), 0);
BENCHMARK(zsqr(c, a), 0);
+#ifndef HEBIMATH
zsets(d, "1484298084218938358480511181388394862858002249");
BENCHMARK(zmodmul(c, a, b, d), 0);
BENCHMARK(zmodmul(c, a, a, d), 0);
@@ -111,10 +114,11 @@ main(int argc, char *argv[])
BENCHMARK(zmodmul(c, a, a, tiny), 0);
BENCHMARK(zmodsqr(c, a, tiny), 0);
zsets(d, "12");
- BENCHMARK(zpow(c, a, d), 0);
- BENCHMARK(zpowu(c, a, 12), 0);
+ BENCHMARK(zpow(c, a, d), 0); /* Memory corruption when using hebimath */
+ BENCHMARK(zpowu(c, a, 12), 0); /* Memory corruption when using hebimath */
BENCHMARK(zmodpow(c, a, d, b), 0);
BENCHMARK(zmodpowu(c, a, 12, b), 0);
+#endif
BENCHMARK(zsets(c, "5495468234592964023447280368442884381000481887"), 0);
BENCHMARK(zstr_length(a, 10), 0);
BENCHMARK(zstr(a, buf, 0), 0);
@@ -127,9 +131,11 @@ main(int argc, char *argv[])
BENCHMARK(zdiv(c, a, b), 1);
BENCHMARK(zmod(c, a, b), 1);
BENCHMARK(zdivmod(c, d, a, b), 1);
+#ifndef HEBIMATH
BENCHMARK(zdiv(c, a, tiny), 0);
BENCHMARK(zmod(c, a, tiny), 0);
BENCHMARK(zdivmod(c, d, a, tiny), 0);
+#endif
zfree(a);
zfree(b);
diff --git a/bench/libgmp.h b/bench/libgmp.h
index 14ccca4..2c22019 100644
--- a/bench/libgmp.h
+++ b/bench/libgmp.h
@@ -64,8 +64,6 @@ zunsetup(void)
#define zor mpz_ior
#define zxor mpz_xor
#define zbtest mpz_tstbit
-#define zeven mpz_even_p /* Note, must not have side effects. */
-#define zodd mpz_odd_p /* Note, must not have side effects. */
#define zeven_nonzero zeven
#define zodd_nonzero zodd
#define zzero(a) (!mpz_sgn(a))
@@ -97,6 +95,18 @@ zunsetup(void)
#define zmod mpz_tdiv_r
#define zdivmod mpz_tdiv_qr
+static inline int
+zeven(z_t a)
+{
+ return mpz_even_p(a);
+}
+
+static inline int
+zodd(z_t a)
+{
+ return mpz_odd_p(a);
+}
+
static inline void
zsetu(z_t r, unsigned long long int val)
{
diff --git a/bench/libhebimath.h b/bench/libhebimath.h
index b0b3321..43bbcf5 100644
--- a/bench/libhebimath.h
+++ b/bench/libhebimath.h
@@ -7,6 +7,7 @@
#include <stdlib.h>
#define BIGINT_LIBRARY "hebimath"
+#define HEBIMATH
typedef hebi_int z_t[1];
@@ -311,7 +312,15 @@ zmodsqr(z_t r, const z_t a, const z_t m)
static inline void
zpowu(z_t r, const z_t a, unsigned long long int b)
{
- int neg = zsignum(a) < 0;
+ if (!b) {
+ if (zzero(a)) {
+ error = hebi_badvalue;
+ longjmp(jbuf, 1);
+ }
+ zsetu(r, 1);
+ return;
+ }
+
zset(_pow_a, a);
zsetu(r, 1);
for (; b; b >>= 1) {
@@ -319,8 +328,6 @@ zpowu(z_t r, const z_t a, unsigned long long int b)
zmul(r, r, _pow_a);
zsqr(_pow_a, _pow_a);
}
- if (neg)
- zneg(r, r);
}
static inline void
@@ -332,8 +339,19 @@ zpow(z_t r, const z_t a, const z_t b)
static inline void
zmodpowu(z_t r, const z_t a, unsigned long long int b, const z_t m)
{
- int neg = zsignum(a) < 0;
- zset(_pow_a, a);
+ if (!b) {
+ if (zzero(a) || zzero(m)) {
+ error = hebi_badvalue;
+ longjmp(jbuf, 1);
+ }
+ zsetu(r, 1);
+ return;
+ } else if (zzero(m)) {
+ error = hebi_badvalue;
+ longjmp(jbuf, 1);
+ }
+
+ zmod(_pow_a, a, m);
zset(_pow_m, m);
zsetu(r, 1);
for (; b; b >>= 1) {
@@ -341,8 +359,6 @@ zmodpowu(z_t r, const z_t a, unsigned long long int b, const z_t m)
zmodmul(r, r, _pow_a, _pow_m);
zmodsqr(_pow_a, _pow_a, _pow_m);
}
- if (neg)
- zneg(r, r);
}
static inline void
@@ -455,7 +471,7 @@ static inline char *
zstr(const z_t a, char *s, size_t n)
{
if (!n)
- n = zstr_length(a, 10) + 1;
+ n = zstr_length(a, 10) * 2 + 1;
try(hebi_get_str(s, n, a, 10));
return s;
}
diff --git a/bench/libtfm.h b/bench/libtfm.h
index c4cc02b..5b872e1 100644
--- a/bench/libtfm.h
+++ b/bench/libtfm.h
@@ -10,7 +10,8 @@
typedef fp_int z_t[1];
static z_t _0, _1, _a, _b;
-static int _tmp;
+static int _tmp, error;
+static jmp_buf jbuf;
static inline void
fp_set_int(z_t a, uint32_t d)
@@ -23,7 +24,7 @@ fp_set_int(z_t a, uint32_t d)
static inline void
zsetup(jmp_buf env)
{
- (void) env;
+ *jbuf = *env;
fp_init(_0);
fp_init(_1);
fp_init(_a);
@@ -275,7 +276,14 @@ zrand(z_t r, int dev, int dist, z_t n)
static inline void
zpowu(z_t r, z_t a, unsigned long long int b)
{
- int neg = zsignum(a) < 0;
+ if (!b) {
+ if (zzero(a)) {
+ error = FP_VAL;
+ longjmp(jbuf, 1);
+ }
+ zsetu(r, 1);
+ return;
+ }
zset(_a, a);
zsetu(r, 1);
for (; b; b >>= 1) {
@@ -283,6 +291,4 @@ zpowu(z_t r, z_t a, unsigned long long int b)
zmul(r, r, _a);
zsqr(_a, _a);
}
- if (neg)
- zneg(r, r);
}