fixed svn properties
[libfirm] / ir / tv / tv.c
index eaa8886..1aa0dea 100644 (file)
@@ -193,8 +193,8 @@ static tarval *get_tarval_overflow(const void *value, int length, ir_mode *mode)
        case irms_reference:
                /* addresses always wrap around */
                temp = alloca(sc_get_buffer_length());
-               sc_val_from_ulong(-1, temp);
-               sc_and(temp, value, temp);
+               memcpy(temp, value, sc_get_buffer_length());
+               sc_truncate(get_mode_size_bits(mode), temp);
                /* the sc_ module expects that all bits are set ... */
                sign_extend(temp, mode);
                return get_tarval(temp, length, mode);
@@ -206,8 +206,8 @@ static tarval *get_tarval_overflow(const void *value, int length, ir_mode *mode)
                                return get_mode_max(mode);
                        case TV_OVERFLOW_WRAP:
                                temp = alloca(sc_get_buffer_length());
-                               sc_val_from_ulong(-1, temp);
-                               sc_and(temp, value, temp);
+                               memcpy(temp, value, sc_get_buffer_length());
+                               sc_truncate(get_mode_size_bits(mode), temp);
                                /* the sc_ module expects that all bits are set ... */
                                sign_extend(temp, mode);
                                return get_tarval(temp, length, mode);
@@ -223,8 +223,8 @@ static tarval *get_tarval_overflow(const void *value, int length, ir_mode *mode)
                                return get_mode_min(mode);
                        case TV_OVERFLOW_WRAP: {
                                char *temp = alloca(sc_get_buffer_length());
-                               sc_val_from_ulong(-1, temp);
-                               sc_and(temp, value, temp);
+                               memcpy(temp, value, sc_get_buffer_length());
+                               sc_truncate(get_mode_size_bits(mode), temp);
                                return get_tarval(temp, length, mode);
                        }
                        case TV_OVERFLOW_BAD:
@@ -761,6 +761,15 @@ int tarval_is_all_one(tarval *tv) {
                tv == get_mode_all_one(get_tarval_mode(tv));
 }
 
+/*
+ * test if one, 1 means 'yes'
+ */
+int tarval_is_minus_one(tarval *a) {
+       return
+               a != tarval_bad &&
+               a == get_tarval_minus_one(get_tarval_mode(a));
+}
+
 /*
  * comparison
  */
@@ -875,9 +884,10 @@ tarval *tarval_convert_to(tarval *src, ir_mode *dst_mode) {
                                assert(0);
                                break;
                        }
-                       if (! fc_flt2int(res, sc_get_buffer(), dst_mode))
+                       buffer = alloca(sc_get_buffer_length());
+                       if (! fc_flt2int(res, buffer, dst_mode))
                                return tarval_bad;
-                       return get_tarval(sc_get_buffer(), sc_get_buffer_length(), dst_mode);
+                       return get_tarval(buffer, sc_get_buffer_length(), dst_mode);
 
                default:
                        /* the rest can't be converted */