Commit c0022b65 authored by Moritz Kroll's avatar Moritz Kroll
Browse files

Mallon: Fixed smaller_mode()

[r22380]
parent ca2041e2
......@@ -523,73 +523,31 @@ int (mode_is_int_vector)(const ir_mode *mode) {
/* Returns true if sm can be converted to lm without loss. */
int smaller_mode(const ir_mode *sm, const ir_mode *lm) {
int sm_bits, lm_bits;
ir_mode_arithmetic arith;
assert(sm);
assert(lm);
if (sm == lm) return 1;
if (sm == mode_b)
return mode_is_int(lm);
sm_bits = get_mode_size_bits(sm);
lm_bits = get_mode_size_bits(lm);
switch (get_mode_sort(sm)) {
case irms_int_number:
switch (get_mode_sort(lm)) {
case irms_int_number:
if (get_mode_arithmetic(sm) != get_mode_arithmetic(lm))
return 0;
/* only two complement implemented */
assert(get_mode_arithmetic(sm) == irma_twos_complement);
/* integers are convertable if
* - both have the same sign and lm is the larger one
* - lm is the signed one and is at least two bits larger
* (one for the sign, one for the highest bit of sm)
* - sm & lm are two_complement and lm has greater or equal number of bits
*/
if (mode_is_signed(sm)) {
if (!mode_is_signed(lm))
return 0;
return sm_bits <= lm_bits;
} else {
if (mode_is_signed(lm)) {
return sm_bits < lm_bits;
}
return sm_bits <= lm_bits;
}
break;
case irms_float_number:
/* int to float works if the float is large enough */
return 0;
default:
break;
}
break;
case irms_float_number:
if (get_mode_arithmetic(sm) == get_mode_arithmetic(lm)) {
if ( (get_mode_sort(lm) == irms_float_number)
&& (get_mode_size_bits(lm) >= get_mode_size_bits(sm)) )
return 1;
}
break;
case irms_reference:
/* do exist machines out there with different pointer lenghts ?*/
arith = get_mode_arithmetic(sm);
if (arith != get_mode_arithmetic(lm))
return 0;
case irms_internal_boolean:
return mode_is_int(lm);
switch (arith) {
case irma_twos_complement:
case irma_ieee754:
return get_mode_size_bits(sm) <= get_mode_size_bits(lm);
default:
break;
default:
return 0;
}
/* else */
return 0;
}
/* Return the signed integer equivalent mode for an reference mode. */
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment