let backends specify the complete long double type
[libfirm] / ir / opt / opt_ldst.c
index f03f2fc..5279d6b 100644 (file)
@@ -90,7 +90,7 @@ struct memop_t {
        memop_t  *next;      /**< links to the next memory op in the block in forward order. */
        memop_t  *prev;      /**< links to the previous memory op in the block in forward order. */
        unsigned flags;      /**< memop flags */
-       ir_node  *projs[MAX_PROJ]; /**< Projs of this memory op */
+       ir_node  *projs[MAX_PROJ+1]; /**< Projs of this memory op */
 };
 
 /**
@@ -1065,7 +1065,7 @@ static void update_Load_memop(memop_t *m)
                /* no exception, clear the m fields as it might be checked later again */
                if (m->projs[pn_Load_X_except]) {
                        ir_graph *irg = get_irn_irg(ptr);
-                       exchange(m->projs[pn_Load_X_except], new_r_Bad(irg));
+                       exchange(m->projs[pn_Load_X_except], new_r_Bad(irg, mode_X));
                        m->projs[pn_Load_X_except] = NULL;
                        m->flags &= ~FLAG_EXCEPTION;
                        env.changed = 1;
@@ -1205,7 +1205,7 @@ static void update_Call_memop(memop_t *m)
  *
  * @param m  the memop
  */
-static void update_DivOp_memop(memop_t *m)
+static void update_Div_memop(memop_t *m)
 {
        ir_node *div = m->node;
        int     i;
@@ -1218,15 +1218,38 @@ static void update_DivOp_memop(memop_t *m)
                        continue;
 
                switch (get_Proj_proj(proj)) {
-               case pn_Generic_X_except:
+               case pn_Div_X_except:
                        m->flags |= FLAG_EXCEPTION;
                        break;
-               case pn_Generic_M:
+               case pn_Div_M:
                        m->mem = proj;
                        break;
                }
        }
-}  /* update_DivOp_memop */
+}
+
+static void update_Mod_memop(memop_t *m)
+{
+       ir_node *div = m->node;
+       int     i;
+
+       for (i = get_irn_n_outs(div) - 1; i >= 0; --i) {
+               ir_node *proj = get_irn_out(div, i);
+
+               /* beware of keep edges */
+               if (is_End(proj))
+                       continue;
+
+               switch (get_Proj_proj(proj)) {
+               case pn_Mod_X_except:
+                       m->flags |= FLAG_EXCEPTION;
+                       break;
+               case pn_Mod_M:
+                       m->mem = proj;
+                       break;
+               }
+       }
+}
 
 /**
  * Update a memop for a Phi.
@@ -1291,8 +1314,10 @@ static void collect_memops(ir_node *irn, void *ctx)
                        /* we can those to find the memory edge */
                        break;
                case iro_Div:
+                       update_Div_memop(op);
+                       break;
                case iro_Mod:
-                       update_DivOp_memop(op);
+                       update_Mod_memop(op);
                        break;
 
                case iro_Builtin:
@@ -1746,7 +1771,7 @@ static void replace_load(memop_t *op)
        proj = op->projs[pn_Load_X_except];
        if (proj != NULL) {
                ir_graph *irg = get_irn_irg(load);
-               exchange(proj, new_r_Bad(irg));
+               exchange(proj, new_r_Bad(irg, mode_X));
        }
        proj = op->projs[pn_Load_X_regular];
        if (proj != NULL) {
@@ -1773,7 +1798,7 @@ static void remove_store(memop_t *op)
        proj = op->projs[pn_Store_X_except];
        if (proj != NULL) {
                ir_graph *irg = get_irn_irg(store);
-               exchange(proj, new_r_Bad(irg));
+               exchange(proj, new_r_Bad(irg, mode_X));
        }
        proj = op->projs[pn_Store_X_regular];
        if (proj != NULL) {