/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
case irms_float_number:
if (SWITCH_NOINFINITY && fc_is_inf(value)) {
- return fc_is_negative(value)?get_mode_min(mode):get_mode_max(mode);
+ /* clip infinity to maximum value */
+ return fc_is_negative(value) ? get_mode_min(mode) : get_mode_max(mode);
}
if (SWITCH_NODENORMALS && fc_is_subnormal(value)) {
+ /* clip denormals to zero */
return get_mode_null(mode);
}
break;
fc_val_from_str(str, len, 11, 52, NULL);
break;
case 80:
+ case 96:
fc_val_from_str(str, len, 15, 64, NULL);
break;
+ default:
+ panic("Unsupported mode in new_tarval_from_str()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
fc_val_from_ieee754(d, 11, 52, NULL);
break;
case 80:
+ case 96:
fc_val_from_ieee754(d, 15, 64, NULL);
break;
+ default:
+ panic("Unsupported mode in new_tarval_from_double()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
}
fc_get_max(11, 52, NULL);
break;
case 80:
+ case 96:
fc_get_max(15, 64, NULL);
break;
+ default:
+ panic("Unsupported mode in get_tarval_max()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
fc_get_min(11, 52, NULL);
break;
case 80:
+ case 96:
fc_get_min(15, 64, NULL);
break;
+ default:
+ panic("Unsupported mode in get_tarval_min()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
fc_get_qnan(11, 52, NULL);
break;
case 80:
+ case 96:
fc_get_qnan(15, 64, NULL);
break;
+ default:
+ panic("Unsupported mode in get_tarval_nan()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
} else {
fc_get_plusinf(11, 52, NULL);
break;
case 80:
+ case 96:
fc_get_plusinf(15, 64, NULL);
break;
+ default:
+ panic("Unsupported mode in get_tarval_plus_inf()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
} else {
fc_get_minusinf(11, 52, NULL);
break;
case 80:
+ case 96:
fc_get_minusinf(15, 64, NULL);
break;
+ default:
+ panic("Unsupported mode in get_tarval_minus_inf()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
} else {
return sc_comp(a->value, get_mode_null(a->mode)->value) == -1 ? 1 : 0;
case irms_float_number:
- return fc_comp(a->value, get_mode_null(a->mode)->value) == -1 ? 1 : 0;
+ return fc_is_negative(a->value);
default:
assert(0 && "not implemented");
int tarval_is_null(tarval *a) {
return
a != tarval_bad &&
- a == get_tarval_null(get_tarval_mode(a));
+ a == get_mode_null(get_tarval_mode(a));
}
/*
int tarval_is_one(tarval *a) {
return
a != tarval_bad &&
- a == get_tarval_one(get_tarval_mode(a));
+ a == get_mode_one(get_tarval_mode(a));
}
int tarval_is_all_one(tarval *tv) {
int tarval_is_minus_one(tarval *a) {
return
a != tarval_bad &&
- a == get_tarval_minus_one(get_tarval_mode(a));
+ a == get_mode_minus_one(get_tarval_mode(a));
}
/*
fc_cast(src->value, 11, 52, NULL);
break;
case 80:
+ case 96:
fc_cast(src->value, 15, 64, NULL);
break;
default:
- break;
+ panic("Unsupported mode in tarval_convert_to()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), dst_mode);
fc_val_from_str(buffer, 0, 11, 52, NULL);
break;
case 80:
+ case 96:
fc_val_from_str(buffer, 0, 15, 64, NULL);
break;
+ default:
+ panic("Unsupported mode in tarval_convert_to()");
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), dst_mode);
return fc_is_exact();
}
+/* check if its the a floating point NaN */
+int tarval_is_NaN(tarval *tv) {
+ if (! mode_is_float(tv->mode))
+ return 0;
+ return fc_is_nan(tv->value);
+}
+
+/* check if its the a floating point +inf */
+int tarval_is_plus_inf(tarval *tv) {
+ if (! mode_is_float(tv->mode))
+ return 0;
+ return fc_is_inf(tv->value) && !fc_is_negative(tv->value);
+}
+
+/* check if its the a floating point -inf */
+int tarval_is_minus_inf(tarval *tv) {
+ if (! mode_is_float(tv->mode))
+ return 0;
+ return fc_is_inf(tv->value) && fc_is_negative(tv->value);
+}
+
+/* check if the tarval represents a finite value */
+int tarval_is_finite(tarval *tv) {
+ if (mode_is_float(tv->mode))
+ return !fc_is_nan(tv->value) && !fc_is_inf(tv->value);
+ return 1;
+}
+
/*
* Sets the overflow mode for integer operations.
*/