#include <assert.h> /* assertions */
#include <stdlib.h> /* atoi() */
-#include <string.h> /* nice things for strings */
+#ifdef HAVE_STRING_H
+# include <string.h> /* nice things for strings */
+#endif
#ifdef HAVE_STRINGS_H
#include <strings.h> /* strings.h also includes bsd only function strcasecmp */
#endif
#include "entity_t.h" /* needed to store pointers to entities */
#include "irmode_t.h"
#include "irnode.h" /* defines boolean return values (pnc_number)*/
-#include "host.h"
#include "strcalc.h"
#include "fltcalc.h"
ANNOUNCE();
assert(tarval_is_long(tv) && "tarval too big to fit in long");
- return sc_val_to_long(tv->value, get_mode_size_bits(tv->mode), mode_is_signed(tv->mode));
+ return sc_val_to_long(tv->value);
}
tarval *new_tarval_from_double(long double d, ir_mode *mode)
/*
* Access routines for tarval fields ========================================
*/
-ir_mode *get_tarval_mode (tarval *tv) /* get the mode of the tarval */
-{
- ANNOUNCE();
- assert(tv);
- return tv->mode;
+
+/* get the mode of the tarval */
+ir_mode *(get_tarval_mode)(const tarval *tv) {
+ return _get_tarval_mode(tv);
}
/*
* 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;
}
/*
case irms_reference:
if (tv == tarval_P_void) return snprintf(buf, len, "NULL");
if (tv->value != NULL){
- if (len > tv->length) {
- memcpy(buf, tv->value, tv->length);
- buf[tv->length] = '\0';
- }
- else {
- /* truncated */
- memcpy(buf, tv->value, len-1);
- buf[len-1] = '\0';
- }
- return tv->length;
+ if (len > tv->length) {
+ memcpy(buf, tv->value, tv->length);
+ buf[tv->length] = '\0';
+ }
+ else {
+ /* truncated */
+ memcpy(buf, tv->value, len-1);
+ buf[len-1] = '\0';
+ }
+ return tv->length;
}
else
- return snprintf(buf, len, "void");
+ return snprintf(buf, len, "void");
case irms_internal_boolean:
switch (mode_info->mode_output) {
byte = get_tarval_sub_bits(tv, i);
for(j = 1; j < 256; j <<= 1)
if(pos < n)
- res[pos++] = j & byte ? '1' : '0';
+ res[pos++] = j & byte ? '1' : '0';
}
res[n] = '\0';
/*
* 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)
{