/** A set containing all existing values. */
static struct set *values = NULL;
-/** The carry flag for SOME operations. -1 means UNDEFINED here */
-static int carry_flag = -1;
-
/** The integer overflow mode. */
static tarval_int_overflow_mode_t int_overflow_mode = TV_OVERFLOW_WRAP;
*/
ir_relation tarval_cmp(ir_tarval *a, ir_tarval *b)
{
- carry_flag = -1;
-
if (a == tarval_bad || b == tarval_bad) {
panic("Comparison with tarval_bad");
}
const float_descriptor_t *desc;
int len;
- carry_flag = -1;
-
assert(src);
assert(dst_mode);
{
char *buffer;
- carry_flag = -1;
-
/* works for vector mode without changes */
switch (get_mode_sort(a->mode)) {
assert(mode_is_num(a->mode)); /* negation only for numerical values */
- carry_flag = -1;
-
/* note: negation is allowed even for unsigned modes. */
switch (get_mode_sort(a->mode)) {
{
char *buffer;
- carry_flag = -1;
-
if (mode_is_reference(a->mode) && a->mode != b->mode) {
b = tarval_convert_to(b, a->mode);
} else if (mode_is_reference(b->mode) && b->mode != a->mode) {
/* modes of a,b are equal, so result has mode of a as this might be the character */
buffer = (char*) alloca(sc_get_buffer_length());
sc_add(a->value, b->value, buffer);
- carry_flag = sc_get_bit_at(buffer, get_mode_size_bits(a->mode));
return get_tarval_overflow(buffer, a->length, a->mode);
case irms_float_number:
{
char *buffer;
- carry_flag = -1;
-
if (dst_mode != NULL) {
if (a->mode != dst_mode)
a = tarval_convert_to(a, dst_mode);
/* modes of a,b are equal, so result has mode of a as this might be the character */
buffer = (char*) alloca(sc_get_buffer_length());
sc_sub(a->value, b->value, buffer);
- carry_flag = sc_get_bit_at(buffer, get_mode_size_bits(a->mode));
return get_tarval_overflow(buffer, a->length, a->mode);
case irms_float_number:
assert(a->mode == b->mode);
- carry_flag = -1;
-
switch (get_mode_sort(a->mode)) {
case irms_int_number:
/* modes of a,b are equal */
ir_mode *mode = a->mode;
assert(mode == b->mode);
- carry_flag = -1;
-
if (mode_is_int(mode)) {
/* x/0 error */
if (b == get_mode_null(mode))
{
assert((a->mode == b->mode) && mode_is_int(a->mode));
- carry_flag = -1;
-
/* x/0 error */
if (b == get_mode_null(b->mode)) return tarval_bad;
/* modes of a,b are equal */
assert((a->mode == b->mode) && mode_is_int(a->mode));
- carry_flag = -1;
-
/* x/0 error */
if (b == get_mode_null(b->mode)) return tarval_bad;
/* modes of a,b are equal */
{
char *buffer;
- carry_flag = -1;
assert(mode_is_num(a->mode));
switch (get_mode_sort(a->mode)) {
assert(a->mode == b->mode);
/* works even for vector modes */
- carry_flag = 0;
-
switch (get_mode_sort(a->mode)) {
case irms_internal_boolean:
return (a == tarval_b_false) ? a : b;
assert(a->mode == b->mode);
/* works even for vector modes */
- carry_flag = 0;
-
switch (get_mode_sort(a->mode)) {
case irms_internal_boolean:
return a == tarval_b_true && b == tarval_b_false ? tarval_b_true : tarval_b_false;
assert(a->mode == b->mode);
/* works even for vector modes */
- carry_flag = 0;
-
switch (get_mode_sort(a->mode)) {
case irms_internal_boolean:
return (a == tarval_b_true) ? a : b;
assert((a->mode == b->mode));
/* works even for vector modes */
- carry_flag = 0;
-
switch (get_mode_sort(a->mode)) {
case irms_internal_boolean:
return (a == b)? tarval_b_false : tarval_b_true;
assert(mode_is_int(a->mode) && mode_is_int(b->mode));
- carry_flag = -1;
-
if (get_mode_modulo_shift(a->mode) != 0) {
temp_val = (char*) alloca(sc_get_buffer_length());
assert(mode_is_int(a->mode) && mode_is_int(b->mode));
- carry_flag = -1;
-
if (get_mode_modulo_shift(a->mode) != 0) {
temp_val = (char*) alloca(sc_get_buffer_length());
assert(mode_is_int(a->mode) && mode_is_int(b->mode));
- carry_flag = -1;
-
if (get_mode_modulo_shift(a->mode) != 0) {
temp_val = (char*) alloca(sc_get_buffer_length());
assert(mode_is_int(a->mode) && mode_is_int(b->mode));
- carry_flag = -1;
-
if (get_mode_modulo_shift(a->mode) != 0) {
temp_val = (char*) alloca(sc_get_buffer_length());
return get_tarval(sc_get_buffer(), sc_get_buffer_length(), a->mode);
}
-/*
- * carry flag of the last operation
- */
-int tarval_carry(void)
-{
- if (carry_flag == -1)
- panic("Carry undefined for the last operation");
- return carry_flag;
-}
-
/*
* Output of tarvals
*/