values is cheaper than the extra obstack_alloc()/free() for
discarded ones. */
+/* Defining this causes inclusions of functions renamed with new gmp.h */
+#define _TARVAL_GMP_ 0
#ifdef HAVE_CONFIG_H
# include <config.h>
}
return a->u.chil != b->u.chil;
case irm_Z:
+#if _TARVAL_GMP_
return mpz_cmp (&a->u.Z, &b->u.Z);
+#else
+ return 99; /* ?? */
+#endif
/* strange */
case irm_p:
if (a->u.p.ent || b->u.p.ent)
case irm_c: case irm_h: case irm_i: case irm_l:
h ^= tv->u.chil; break;
case irm_Z:
+#if _TARVAL_GMP_
h ^= mpz_get_ui (&tv->u.Z); break;
+#else
+ h ^= (unsigned int) tv; break; /* tut das? */
+#endif
case irm_p:
if (tv->u.p.ent) {
/* @@@ lower bits not random, watch for collisions; perhaps
tv = (tarval *)obstack_alloc (&tv_obst, sizeof (tarval));
tv->mode = mode_Z;
+#if _TARVAL_GMP_
if (mpz_init_set_str (&tv->u.Z, buf, base)) assert (0);
+#else
+ assert(0 && "no support for Z in tv!");
+#endif
return tarval_identify (tv);
}
case irm_c: case irm_h: case irm_i: case irm_l:
tv->u.chil = val; break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init_set_si (&tv->u.Z, val);
+#else
+ assert(0 && "no support for Z in tv!");
+#endif
break;
/* strange */
case irm_p:
break;
case irm_Z:
+#if _TARVAL_GMP_
switch (get_mode_modecode(m)) {
case irm_C: case irm_H: case irm_I: case irm_L:
default: goto fail;
}
+#else
+ goto fail;
+#endif
break;
case irm_c: case irm_h: case irm_i: case irm_l:
break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init_set_si (&tv->u.Z, src->u.chil);
+#else
+ goto fail;
+#endif
break;
case irm_b:
break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init_set_ui (&tv->u.Z, src->u.CHIL);
+#else
+ goto fail;
+#endif
break;
case irm_b:
}
break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init (&tv->u.Z);
mpz_neg (&tv->u.Z, &a->u.Z);
+#else
+ obstack_free (&tv_obst, tv);
+ tv = a;
+ printf("\nWrong negation\n\n");
+#endif
break;
/* strange */
case irm_b: tv->u.b = !a->u.b; break;
: a->u.chil > b->u.chil ? irpn_Gt
: irpn_Lt);
case irm_Z:
- { int cmp = mpz_cmp (&a->u.Z, &b->u.Z);
+ {
+#if _TARVAL_GMP_
+ int cmp = mpz_cmp (&a->u.Z, &b->u.Z);
return ( cmp == 0 ? irpn_Eq
: cmp > 0 ? irpn_Gt
: irpn_Lt);
+#else
+ return irpn_False;
+#endif
}
/* strange */
case irm_b: return ( a->u.b == b->u.b ? irpn_Eq
}
break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init (&tv->u.Z);
mpz_add (&tv->u.Z, &a->u.Z, &b->u.Z);
+#else
+ obstack_free (&tv_obst, tv);
+ return NULL;
+#endif
break;
/* strange */
case irm_b: tv->u.b = a->u.b | b->u.b; break; /* u.b is in canonical form */
}
break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init (&tv->u.Z);
mpz_sub (&tv->u.Z, &a->u.Z, &b->u.Z);
+#else
+ obstack_free (&tv_obst, tv);
+ return NULL;
+#endif
break;
/* strange */
case irm_b: tv->u.b = a->u.b & ~b->u.b; break; /* u.b is in canonical form */
}
break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init (&tv->u.Z);
mpz_mul (&tv->u.Z, &a->u.Z, &b->u.Z);
+#else
+ obstack_free (&tv_obst, tv);
+ return NULL;
+#endif
break;
/* strange */
case irm_b: tv->u.b = a->u.b & b->u.b; break; /* u.b is in canonical form */
tv->u.chil = a->u.chil / b->u.chil;
break;
case irm_Z:
+#if _TARVAL_GMP_
if (!mpz_cmp_ui (&b->u.Z, 0)) goto fail;
mpz_init (&tv->u.Z);
mpz_div (&tv->u.Z, &a->u.Z, &b->u.Z);
+#else
+ goto fail;
+#endif
break;
/* strange */
case irm_b: tv->u.b = a->u.b ^ b->u.b; break; /* u.b is in canonical form */
tv->u.chil = a->u.chil % b->u.chil;
break;
case irm_Z:
+#if _TARVAL_GMP_
if (!mpz_cmp_ui (&b->u.Z, 0)) goto fail;
mpz_init (&tv->u.Z);
mpz_mod (&tv->u.Z, &a->u.Z, &b->u.Z);
+#else
+ goto fail;
+#endif
break;
/* strange */
case irm_b: tv->u.b = a->u.b ^ b->u.b; break; /* u.b is in canonical form */
case irm_c: case irm_h: case irm_i: case irm_l:
tv->u.chil = a->u.chil & b->u.chil; break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init (&tv->u.Z);
mpz_and (&tv->u.Z, &a->u.Z, &b->u.Z);
+#else
+ assert(0);
+#endif
break;
/* strange */
case irm_b: tv->u.b = a->u.b & b->u.b; break; /* u.b is in canonical form */
case irm_c: case irm_h: case irm_i: case irm_l:
tv->u.chil = a->u.chil | b->u.chil; break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init (&tv->u.Z);
mpz_ior (&tv->u.Z, &a->u.Z, &b->u.Z);
+#else
+ assert(0);
+#endif
break;
/* strange */
case irm_b: tv->u.b = a->u.b | b->u.b; break; /* u.b is in canonical form */
case irm_c: case irm_h: case irm_i: case irm_l:
tv->u.chil = a->u.chil ^ b->u.chil; break;
case irm_Z:
-#if 0 /* gmp-1.3.2 declares but does not define mpz_xor() */
+#if 0
+ /* gmp-1.3.2 declares but does not define mpz_xor() */
mpz_init (&tv->u.Z);
mpz_xor (&tv->u.Z, &a->u.Z, &b->u.Z);
#endif
tv->u.chil = a->u.chil << shift;
break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init (&tv->u.Z);
mpz_mul_2exp (&tv->u.Z, &a->u.Z, shift);
+#else
+ assert(0);
+#endif
break;
default: assert (0);
}
tv->u.chil = a->u.chil >> shift;
break;
case irm_Z:
+#if _TARVAL_GMP_
mpz_init (&tv->u.Z);
mpz_div_2exp (&tv->u.Z, &a->u.Z, shift);
+#else
+ assert(0);
+#endif
break;
default: assert (0);
}
case irm_c: case irm_h: case irm_i: case irm_l:
return tv->u.chil;
case irm_Z:
+#if _TARVAL_GMP_
if (mpz_cmp_si (&tv->u.Z, 0)) return 0;
else if (mpz_cmp_si (&tv->u.Z, 1)) return 1;
else if (mpz_cmp_si (&tv->u.Z,-1)) return -1;
+#endif
return 2;
/* strange */
case irm_b:
}
+#if _TARVAL_GMP_
bool
tarval_s_fits (tarval *tv, long min, long max) {
return (( mpz_cmp_si (&tv->u.Z, min) >= 0)
return (( mpz_sgn (&tv->u.Z) >= 0)
&& mpz_cmp_si (&tv->u.Z, max) <= 0);
}
-
+#endif
/* Convert `tv' into type `long', set `fail' if not representable.
If `fail' gets set for an unsigned `tv', the correct result can be
*fail = 0;
return tv->u.chil;
case irm_Z:
+#if _TARVAL_GMP_
*fail = ( (mpz_cmp_si (&tv->u.Z, tv_val_chil(get_mode_max(mode_l))) > 0)
|| (mpz_cmp_si (&tv->u.Z, tv_val_chil(get_mode_max(mode_l))) < 0));
return mpz_get_si (&tv->u.Z);
+#else
+ *fail = 1;
+ return 0;
+#endif
/* strange */
case irm_b:
*fail = 0;