VIA C3-2 supports all P6 instructions.
[libfirm] / ir / be / bechordal.c
index cf2eb94..6d32c1c 100644 (file)
@@ -24,9 +24,7 @@
  * @date        08.12.2004
  * @version     $Id$
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include <ctype.h>
 
@@ -120,7 +118,7 @@ static void check_heads(be_chordal_env_t *env)
  * @param is_def Is the border a use or a def.
  * @return The created border.
  */
-static INLINE border_t *border_add(be_chordal_env_t *env, struct list_head *head,
+static inline border_t *border_add(be_chordal_env_t *env, struct list_head *head,
                        ir_node *irn, unsigned step, unsigned pressure,
                        unsigned is_def, unsigned is_real)
 {
@@ -177,9 +175,9 @@ static INLINE border_t *border_add(be_chordal_env_t *env, struct list_head *head
  * @param irn The node.
  * @return 1, if the node is of that register class, 0 if not.
  */
-static INLINE int has_reg_class(const be_chordal_env_t *env, const ir_node *irn)
+static inline int has_reg_class(const be_chordal_env_t *env, const ir_node *irn)
 {
-       return arch_irn_consider_in_reg_alloc(env->birg->main_env->arch_env, env->cls, irn);
+       return arch_irn_consider_in_reg_alloc(env->cls, irn);
 }
 
 static int get_next_free_reg(const be_chordal_alloc_env_t *alloc_env, bitset_t *colors)
@@ -221,7 +219,6 @@ static be_insn_t *chordal_scan_insn(be_chordal_env_t *env, ir_node *irn)
        be_insn_env_t ie;
 
        ie.ignore_colors = env->ignore_colors;
-       ie.aenv          = env->birg->main_env->arch_env;
        ie.obst          = env->obst;
        ie.cls           = env->cls;
        return be_scan_insn(&ie, irn);
@@ -244,7 +241,8 @@ static ir_node *prepare_constr_insn(be_chordal_env_t *env, ir_node *irn)
                const arch_register_t *reg;
                const arch_register_req_t *req;
 
-               if (arch_get_irn_reg_class(irn, i) != env->cls)
+               req = arch_get_register_req(irn, i);
+               if (req->cls != env->cls)
                        continue;
 
                reg = arch_get_irn_register(op);
@@ -254,7 +252,6 @@ static ir_node *prepare_constr_insn(be_chordal_env_t *env, ir_node *irn)
                if(arch_register_type_is(reg, joker))
                        continue;
 
-               req = arch_get_register_req(irn, i);
                if (!arch_register_req_is(req, limited))
                        continue;
 
@@ -372,13 +369,9 @@ void be_pre_spill_prepare_constr(be_chordal_env_t *cenv) {
 static void pair_up_operands(const be_chordal_alloc_env_t *alloc_env, be_insn_t *insn)
 {
        const be_chordal_env_t *env = alloc_env->chordal_env;
-
-       int n_uses   = be_insn_n_uses(insn);
-       int n_defs   = be_insn_n_defs(insn);
-       bitset_t *bs = bitset_alloca(env->cls->n_regs);
-       int *pairing = alloca(MAX(n_defs, n_uses) * sizeof(pairing[0]));
-
-       int i, j;
+       bitset_t               *bs  = bitset_alloca(env->cls->n_regs);
+       int                     i;
+       int                     j;
 
        /*
                For each out operand, try to find an in operand which can be assigned the
@@ -541,10 +534,10 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
 
        n_regs      = env->cls->n_regs;
        bs          = bitset_alloca(n_regs);
-       alloc_nodes = alloca(n_regs * sizeof(alloc_nodes[0]));
+       alloc_nodes = ALLOCAN(ir_node*, n_regs);
        //bp          = hungarian_new(n_regs, n_regs, 2, HUNGARIAN_MATCH_PERFECT);
        bp          = bipartite_new(n_regs, n_regs);
-       assignment  = alloca(n_regs * sizeof(assignment[0]));
+       assignment  = ALLOCAN(int, n_regs);
        partners    = pmap_create();
 
        /*
@@ -877,7 +870,6 @@ static void assign(ir_node *block, void *env_ptr)
        bitset_t *live              = alloc_env->live;
        bitset_t *colors            = alloc_env->colors;
        bitset_t *in_colors         = alloc_env->in_colors;
-       const arch_env_t *arch_env  = env->birg->main_env->arch_env;
        struct list_head *head      = get_block_border_head(env, block);
        be_lv_t *lv                 = env->birg->lv;
 
@@ -929,7 +921,7 @@ static void assign(ir_node *block, void *env_ptr)
        list_for_each_entry_reverse(border_t, b, head, list) {
                ir_node *irn = b->irn;
                int nr       = get_irn_idx(irn);
-               int ignore   = arch_irn_is(arch_env, irn, ignore);
+               int ignore   = arch_irn_is_ignore(irn);
 
                /*
                 * Assign a color, if it is a local def. Global defs already have a