return hash;
}
+static int cmp_tv(const void *p1, const void *p2, size_t n) {
+ const tarval *tv1 = p1;
+ const tarval *tv2 = p2;
+ (void) n;
+
+ assert(tv1->kind == k_tarval);
+ assert(tv2->kind == k_tarval);
+ if(tv1->mode < tv2->mode)
+ return -1;
+ if(tv1->mode > tv2->mode)
+ return 1;
+ if(tv1->length < tv2->length)
+ return -1;
+ if(tv1->length > tv2->length)
+ return 1;
+ if(tv1->value < tv2->value)
+ return -1;
+ if(tv1->value > tv2->value)
+ return 1;
+
+ return 0;
+}
+
/** finds tarval with value/mode or creates new tarval */
static tarval *get_tarval(const void *value, int length, ir_mode *mode) {
tarval tv;
}
/*
- * bitwise rotation
+ * bitwise rotation to left
*/
-tarval *tarval_rot(tarval *a, tarval *b) {
+tarval *tarval_rotl(tarval *a, tarval *b) {
char *temp_val = NULL;
assert(a);
} else
temp_val = (char*)b->value;
- sc_rot(a->value, temp_val, get_mode_size_bits(a->mode), mode_is_signed(a->mode), NULL);
+ sc_rotl(a->value, temp_val, get_mode_size_bits(a->mode), mode_is_signed(a->mode), NULL);
return get_tarval(sc_get_buffer(), sc_get_buffer_length(), a->mode);
}
case irms_control_flow:
case irms_memory:
case irms_auxiliary:
- return snprintf(buf, len, "<TV_OVERFLOW_BAD>");
+ if (tv == tarval_bad)
+ return snprintf(buf, len, "<TV_BAD>");
+ if (tv == tarval_undefined)
+ return snprintf(buf, len, "<TV_UNDEF>");
+ return snprintf(buf, len, "<TV_???>");
}
return 0;
/* initialize the sets holding the tarvals with a comparison function and
* an initial size, which is the expected number of constants */
- tarvals = new_set(memcmp, N_CONSTANTS);
+ tarvals = new_set(cmp_tv, N_CONSTANTS);
values = new_set(memcmp, N_CONSTANTS);
/* init strcalc with precision of 68 to support floating point values with 64
* bit mantissa (needs extra bits for rounding and overflow) */