/* same as integer modes */
case irms_int_number:
sc_val_from_long(l, NULL);
+ sign_extend(sc_get_buffer(), mode);
return get_tarval(sc_get_buffer(), sc_get_buffer_length(), mode);
case irms_float_number:
return mode_is_signed(mode) ? new_tarval_from_double(-1.0, mode) : tarval_bad;
case irms_int_number:
- return mode_is_signed(mode) ? new_tarval_from_long(-1l, mode) : tarval_bad;
+ return new_tarval_from_long(-1l, mode);
}
return tarval_bad;
}
unsigned char get_tarval_sub_bits(tarval *tv, unsigned byte_ofs) {
switch (get_mode_arithmetic(tv->mode)) {
case irma_twos_complement:
- return sc_sub_bits(tv->value, tv->length, byte_ofs);
+ return sc_sub_bits(tv->value, get_mode_size_bits(tv->mode), byte_ofs);
case irma_ieee754:
return fc_sub_bits(tv->value, get_mode_size_bits(tv->mode), byte_ofs);
default:
else if (tv == get_mode_one(tv->mode))
return TV_CLASSIFY_ONE;
else if ((get_mode_sort(tv->mode) == irms_int_number)
- && (tv == new_tarval_from_long(-1, tv->mode)))
+ && (tv == get_mode_minus_one(tv->mode)))
return TV_CLASSIFY_ALL_ONE;
return TV_CLASSIFY_OTHER;
return fc_set_immediate_precision(bits);
}
+/* Returns non-zero if the result of the last IEEE-754 operation was exact. */
+unsigned tarval_ieee754_get_exact(void) {
+ return fc_is_exact();
+}
+
/*
* Sets the overflow mode for integer operations.
*/