- fixed typos and some comments
[libfirm] / ir / ir / irmode.c
index 8b57031..55108bb 100644 (file)
@@ -843,7 +843,11 @@ void init_mode(void) {
 ir_mode *find_unsigned_mode(const ir_mode *mode) {
        ir_mode n = *mode;
 
-       assert(mode->sort == irms_int_number);
+       /* allowed for reference mode */
+       if (mode->sort == irms_reference)
+               n.sort = irms_int_number;
+
+       assert(n.sort == irms_int_number);
        n.sign = 0;
        return find_mode(&n);
 }
@@ -903,6 +907,25 @@ int mode_wrap_around(const ir_mode *mode) {
        return mode_is_int(mode);
 }
 
+/*
+ * Returns non-zero if the cast from mode src to mode dst is a
+ * reinterpret cast (ie. only the bit pattern is reinterpreted,
+ * no conversion is done)
+ */
+int is_reinterpret_cast(const ir_mode *src, const ir_mode *dst) {
+       ir_mode_arithmetic ma;
+
+       if (src == dst)
+               return 1;
+       if (get_mode_size_bits(src) != get_mode_size_bits(dst))
+               return 0;
+       ma = get_mode_arithmetic(src);
+       if (ma != get_mode_arithmetic(dst))
+               return 0;
+
+       return ma == irma_twos_complement || ma == irma_ones_complement;
+}
+
 void finish_mode(void) {
        obstack_free(&modes, 0);
        DEL_ARR_F(mode_list);