Mallon: Fixed smaller_mode()
authorMoritz Kroll <Moritz.Kroll@gmx.de>
Tue, 30 Sep 2008 18:54:08 +0000 (18:54 +0000)
committerMoritz Kroll <Moritz.Kroll@gmx.de>
Tue, 30 Sep 2008 18:54:08 +0000 (18:54 +0000)
[r22380]

ir/ir/irmode.c

index 55108bb..71da96f 100644 (file)
@@ -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;
 /* 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;
 
 
        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);
 
        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;
 
                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. */
 }
 
 /* Return the signed integer equivalent mode for an reference mode. */