allow backend to specify endianess, rewrite bitfield emitter to handle little and...
[libfirm] / ir / be / ia32 / ia32_finish.c
index 09858aa..2be7d29 100644 (file)
@@ -51,7 +51,7 @@
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
 
 /**
- * Transforms a Sub or xSub into Neg--Add iff OUT_REG == SRC2_REG.
+ * Transforms a Sub or xSub into Neg--Add iff OUT_REG != SRC1_REG && OUT_REG == SRC2_REG.
  * THIS FUNCTIONS MUST BE CALLED AFTER REGISTER ALLOCATION.
  */
 static void ia32_transform_sub_to_neg_add(ir_node *irn, ia32_code_gen_t *cg)
@@ -75,14 +75,16 @@ static void ia32_transform_sub_to_neg_add(ir_node *irn, ia32_code_gen_t *cg)
        in2_reg  = arch_get_irn_register(in2);
        out_reg  = arch_irn_get_register(irn, 0);
 
-       irg     = cg->irg;
-       block   = get_nodes_block(irn);
+       if (out_reg == in1_reg)
+               return;
 
        /* in case of sub and OUT == SRC2 we can transform the sequence into neg src2 -- add */
        if (out_reg != in2_reg)
                return;
 
-       dbg = get_irn_dbg_info(irn);
+       irg   = cg->irg;
+       block = get_nodes_block(irn);
+       dbg   = get_irn_dbg_info(irn);
 
        /* generate the neg src2 */
        if (is_ia32_xSub(irn)) {
@@ -238,18 +240,7 @@ static int get_first_same(const arch_register_req_t* req)
        for (i = 0; i < 32; ++i) {
                if (other & (1U << i)) return i;
        }
-       assert(! "same position not found");
-       return 32;
-}
-
-static inline bool is_unknown_reg(const arch_register_t *reg)
-{
-       if (reg == &ia32_gp_regs[REG_GP_UKNWN]
-                       || reg == &ia32_xmm_regs[REG_XMM_UKNWN]
-                       || reg == &ia32_vfp_regs[REG_VFP_UKNWN])
-               return true;
-
-       return false;
+       panic("same position not found");
 }
 
 /**
@@ -292,9 +283,6 @@ static void assure_should_be_same_requirements(ir_node *node)
                /* requirement already fulfilled? */
                if (in_reg == out_reg)
                        continue;
-               /* unknowns can be changed to any register we want on emitting */
-               if (is_unknown_reg(in_reg))
-                       continue;
                cls = arch_register_get_class(in_reg);
                assert(cls == arch_register_get_class(out_reg));