progs/perftest.c: Use from Glibc syscall numbers.
[catacomb] / math / f-prime.c
index d9c5c17..b21ca2a 100644 (file)
@@ -63,20 +63,21 @@ static int fzerop(field *ff, mp *x) { return (MP_ZEROP(x)); }
 
 static mp *fneg(field *ff, mp *d, mp *x) {
   fctx_prime *f = (fctx_prime *)ff;
-  return (mp_sub(d, f->mm.m, x));
+  if (MP_ZEROP(x)) { if (d != x) mp_drop(d); return (MP_COPY(x)); }
+  else return (mp_sub(d, f->mm.m, x));
 }
 
 static mp *fadd(field *ff, mp *d, mp *x, mp *y) {
   fctx_prime *f = (fctx_prime *)ff; d = mp_add(d, x, y);
   if (MP_NEGP(d)) d = mp_add(d, d, f->mm.m);
-  else if (MP_CMP(d, >, f->mm.m)) d = mp_sub(d, d, f->mm.m);
+  else if (MP_CMP(d, >=, f->mm.m)) d = mp_sub(d, d, f->mm.m);
   return (d);
 }
 
 static mp *fsub(field *ff, mp *d, mp *x, mp *y) {
   fctx_prime *f = (fctx_prime *)ff; d = mp_sub(d, x, y);
   if (MP_NEGP(d)) d = mp_add(d, d, f->mm.m);
-  else if (MP_CMP(d, >, f->mm.m)) d = mp_sub(d, d, f->mm.m);
+  else if (MP_CMP(d, >=, f->mm.m)) d = mp_sub(d, d, f->mm.m);
   return (d);
 }