*/
static void set_mode_values(ir_mode* mode) {
switch (get_mode_sort(mode)) {
+ case irms_reference:
case irms_int_number:
case irms_float_number:
mode->min = get_tarval_min(mode);
mode->null = get_tarval_null(mode);
mode->one = get_tarval_one(mode);
mode->minus_one = get_tarval_minus_one(mode);
+ if(get_mode_sort(mode) != irms_float_number) {
+ mode->all_one = get_tarval_all_one(mode);
+ } else {
+ mode->all_one = tarval_bad;
+ }
break;
case irms_internal_boolean:
mode->null = tarval_b_false;
mode->one = tarval_b_true;
mode->minus_one = tarval_bad;
- break;
-
- case irms_reference:
- mode->min = tarval_bad;
- mode->max = tarval_bad;
- mode->null = get_tarval_null(mode);
- mode->one = tarval_bad;
- mode->minus_one = tarval_bad;
+ mode->all_one = tarval_b_true;
break;
case irms_auxiliary:
get_mode_null(ir_mode *mode) {
assert(mode);
assert(get_mode_modecode(mode) < (modecode) num_modes);
- assert(mode_is_data(mode));
+ assert(mode_is_datab(mode));
return mode->null;
}
return mode->minus_one;
}
+tarval *
+get_mode_all_one(ir_mode *mode) {
+ assert(mode);
+ assert(get_mode_modecode(mode) < (modecode) num_modes);
+ assert(mode_is_data(mode) || mode == mode_b);
+ return mode->all_one;
+}
+
tarval *
get_mode_infinite(ir_mode *mode) {
assert(mode);
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 ( get_mode_arithmetic(sm) == get_mode_arithmetic(lm)
- && get_mode_arithmetic(sm) == irma_twos_complement) {
- return lm_bits >= sm_bits;
- } else if (mode_is_signed(sm)) {
- if ( mode_is_signed(lm) && (lm_bits >= sm_bits) )
- return 1;
- } else if (mode_is_signed(lm)) {
- if (lm_bits > sm_bits + 1)
- return 1;
- } else if (lm_bits >= sm_bits) {
- return 1;
+ 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;
/* initialization, build the default modes */
void
-init_mode (void) {
+init_mode(void) {
ir_mode newmode;
obstack_init(&modes);