/*
* Access routines for tarval fields ========================================
*/
-ir_mode *get_tarval_mode (tarval *tv) /* get the mode of the tarval */
-{
- ANNOUNCE();
- assert(tv);
- return tv->mode;
-}
-/*
-void *get_tarval_link (tarval *tv)
-{
- ANNOUNCE ();
- assert (tv);
- return (tv->link);
+/* get the mode of the tarval */
+ir_mode *(get_tarval_mode)(const tarval *tv) {
+ return _get_tarval_mode(tv);
}
-*/
/*
* Special value query functions ============================================
* therefore the irmode functions should be prefered to the functions below.
*/
-tarval *get_tarval_bad(void)
-{
- ANNOUNCE();
- return tarval_bad;
+tarval *(get_tarval_bad)(void) {
+ return _get_tarval_bad();
}
-tarval *get_tarval_undefined(void)
-{
- ANNOUNCE();
- return tarval_undefined;
+
+tarval *(get_tarval_undefined)(void) {
+ return _get_tarval_undefined();
}
-tarval *get_tarval_b_false(void)
-{
- ANNOUNCE();
- return tarval_b_false;
+
+tarval *(get_tarval_b_false)(void) {
+ return _get_tarval_b_false();
}
-tarval *get_tarval_b_true(void)
-{
- ANNOUNCE();
- return tarval_b_true;
+
+tarval *(get_tarval_b_true)(void) {
+ return _get_tarval_b_true();
}
-tarval *get_tarval_P_void(void)
-{
- ANNOUNCE();
- return tarval_P_void;
+
+tarval *(get_tarval_P_void)(void) {
+ return _get_tarval_P_void();
}
tarval *get_tarval_max(ir_mode *mode)
return tarval_bad;
}
+tarval *get_tarval_minus_one(ir_mode *mode)
+{
+ ANNOUNCE();
+ assert(mode);
+
+ if (get_mode_n_vector_elems(mode) > 1) {
+ /* vector arithmetic not implemented yet */
+ return tarval_bad;
+ }
+
+ switch(get_mode_sort(mode))
+ {
+ case irms_control_flow:
+ case irms_memory:
+ case irms_auxiliary:
+ case irms_internal_boolean:
+ case irms_reference:
+ assert(0);
+ break;
+
+ case irms_float_number:
+ return mode_is_signed(mode) ? new_tarval_from_double(-1.0, mode) : tarval_bad;
+
+ case irms_int_number:
+ case irms_character:
+ return mode_is_signed(mode) ? new_tarval_from_long(-1l, mode) : tarval_bad;
+ }
+ return tarval_bad;
+}
+
tarval *get_tarval_nan(ir_mode *mode)
{
ANNOUNCE();
}
}
-tarval *get_tarval_inf(ir_mode *mode)
+tarval *get_tarval_plus_inf(ir_mode *mode)
{
ANNOUNCE();
assert(mode);
}
}
+tarval *get_tarval_minus_inf(ir_mode *mode)
+{
+ ANNOUNCE();
+ assert(mode);
+
+ if (get_mode_n_vector_elems(mode) > 1) {
+ /* vector arithmetic not implemented yet */
+ return tarval_bad;
+ }
+
+ if (get_mode_sort(mode) == irms_float_number) {
+ switch(get_mode_size_bits(mode))
+ {
+ case 32:
+ fc_get_minusinf(8, 23, NULL);
+ break;
+ case 64:
+ fc_get_minusinf(11, 52, NULL);
+ break;
+ case 80:
+ fc_get_minusinf(15, 64, NULL);
+ break;
+ }
+ return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
+ }
+ else {
+ assert(0 && "tarval is not floating point");
+ return tarval_bad;
+ }
+}
+
/*
* Arithmethic operations on tarvals ========================================
*/
/*
* comparison
*/
-pnc_number tarval_cmp(tarval *a, tarval *b)
+pn_Cmp tarval_cmp(tarval *a, tarval *b)
{
ANNOUNCE();
assert(a);
assert(b);
- if (a == tarval_bad || b == tarval_bad) assert(0 && "Comparison with tarval_bad");
- if (a == tarval_undefined || b == tarval_undefined) return False;
- if (a == b) return Eq;
- if (a->mode != b->mode) return False;
+ if (a == tarval_bad || b == tarval_bad) {
+ assert(0 && "Comparison with tarval_bad");
+ return pn_Cmp_False;
+ }
+
+ if (a == tarval_undefined || b == tarval_undefined)
+ return pn_Cmp_False;
+
+ if (a->mode != b->mode)
+ return pn_Cmp_False;
if (get_mode_n_vector_elems(a->mode) > 1) {
/* vector arithmetic not implemented yet */
case irms_memory:
case irms_auxiliary:
case irms_reference:
- return False;
+ if (a == b)
+ return pn_Cmp_Eq;
+ return pn_Cmp_False;
case irms_float_number:
+ /*
+ * BEWARE: we cannot compare a == b here, because
+ * a NaN is always Unordered to any other value, even to itself!
+ */
switch (fc_comp(a->value, b->value)) {
- case -1: return Lt;
- case 0: assert(0 && "different tarvals compare equal"); return Eq;
- case 1: return Gt;
- case 2: return Uo;
- default: return False;
+ case -1: return pn_Cmp_Lt;
+ case 0: return pn_Cmp_Eq;
+ case 1: return pn_Cmp_Gt;
+ case 2: return pn_Cmp_Uo;
+ default: return pn_Cmp_False;
}
case irms_int_number:
case irms_character:
- return (sc_comp(a->value, b->value)==1)?(Gt):(Lt);
+ if (a == b)
+ return pn_Cmp_Eq;
+ return sc_comp(a->value, b->value) == 1 ? pn_Cmp_Gt : pn_Cmp_Lt;
case irms_internal_boolean:
- return (a == tarval_b_true)?(Gt):(Lt);
+ if (a == b)
+ return pn_Cmp_Eq;
+ return a == tarval_b_true ? pn_Cmp_Gt : pn_Cmp_Lt;
}
- return False;
+ return pn_Cmp_False;
}
/*
/*
* Returns the output options of one mode.
*
- * This functions returns the modinfo of a given mode.
+ * This functions returns the mode info of a given mode.
*/
const tarval_mode_info *get_tarval_mode_output_option(ir_mode *mode)
{