Fixed and simplified rot matcher
[libfirm] / ir / tv / tv.c
index 50beed3..fde85a6 100644 (file)
@@ -158,6 +158,29 @@ static int hash_val(const void *value, unsigned int length) {
        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;
@@ -1435,9 +1458,9 @@ tarval *tarval_shrs(tarval *a, tarval *b) {
 }
 
 /*
- * 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);
@@ -1457,7 +1480,7 @@ tarval *tarval_rot(tarval *a, tarval *b) {
        } 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);
 }
 
@@ -1541,7 +1564,11 @@ int tarval_snprintf(char *buf, size_t len, tarval *tv) {
        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;
@@ -1758,7 +1785,7 @@ void init_tarval_1(long null_value) {
 
        /* 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) */