implement floatingpoint compares
[libfirm] / ir / be / sparc / sparc_new_nodes.c
index cc04b93..eb5d9e4 100644 (file)
@@ -52,17 +52,13 @@ static bool has_symconst_attr(const ir_node *node)
 
 static bool has_load_store_attr(const ir_node *node)
 {
-       return is_sparc_Ld(node) || is_sparc_St(node);
-}
-
-static bool has_cmp_attr(const ir_node *node)
-{
-       return is_sparc_Cmp(node) || is_sparc_Tst(node);
+       return is_sparc_Ld(node) || is_sparc_St(node) || is_sparc_Ldf(node)
+           || is_sparc_Stf(node);
 }
 
 static bool has_jmp_cond_attr(const ir_node *node)
 {
-       return is_sparc_BXX(node);
+       return is_sparc_Bicc(node) || is_sparc_fbfcc(node);
 }
 
 static bool has_jmp_switch_attr(const ir_node *node)
@@ -75,6 +71,19 @@ static bool has_save_attr(const ir_node *node)
        return is_sparc_Save(node);
 }
 
+static bool has_fp_attr(const ir_node *node)
+{
+       return is_sparc_fadd(node) || is_sparc_fsub(node)
+           || is_sparc_fmul(node) || is_sparc_fdiv(node)
+           || is_sparc_fftoi(node) || is_sparc_fitof(node)
+           || is_sparc_fneg(node) || is_sparc_fcmp(node);
+}
+
+static bool has_fp_conv_attr(const ir_node *node)
+{
+       return is_sparc_fftof(node);
+}
+
 /**
  * Dumper interface for dumping sparc nodes in vcg.
  * @param F        the output file
@@ -93,19 +102,49 @@ static void sparc_dump_node(FILE *F, ir_node *n, dump_reason_t reason)
 
        case dump_node_info_txt:
                arch_dump_reqs_and_registers(F, n);
-               break;
-
-       case dump_node_nodeattr_txt:
+               if (has_save_attr(n)) {
+                       const sparc_save_attr_t *attr = get_sparc_save_attr_const(n);
+                       fprintf(F, "initial stacksize: %d\n", attr->initial_stacksize);
+               }
                if (has_symconst_attr(n)) {
                        const sparc_symconst_attr_t *attr = get_sparc_symconst_attr_const(n);
-                       fprintf(F, "fp_offset: 0x%X\n", attr->fp_offset);
+                       ir_fprintf(F, "entity: %+F\n", attr->entity);
+                       fprintf(F, "fp_offset: %d\n", attr->fp_offset);
                }
                if (has_load_store_attr(n)) {
                        const sparc_load_store_attr_t *attr = get_sparc_load_store_attr_const(n);
-                       fprintf(F, "offset: 0x%lX\n", attr->offset);
-                       fprintf(F, "is_frame_entity: %s\n", attr->is_frame_entity == true ? "true" : "false");
+                       ir_fprintf(F, "load store mode: %+F\n", attr->load_store_mode);
+                       ir_fprintf(F, "entity: (sign %d) %+F\n", attr->entity_sign,
+                                  attr->entity);
+                       fprintf(F, "offset: %ld\n", attr->offset);
+                       fprintf(F, "is frame entity: %s\n",
+                               attr->is_frame_entity ? "true" : "false");
+               }
+               if (has_jmp_cond_attr(n)) {
+                       const sparc_jmp_cond_attr_t *attr
+                               = get_sparc_jmp_cond_attr_const(n);
+                       fprintf(F, "pnc: %d (%s)\n", attr->pnc, get_pnc_string(attr->pnc));
+                       fprintf(F, "unsigned: %s\n", attr->is_unsigned ? "true" : "false");
+               }
+               if (has_jmp_switch_attr(n)) {
+                       const sparc_jmp_switch_attr_t *attr
+                               = get_sparc_jmp_switch_attr_const(n);
+                       fprintf(F, "n projs: %d\n", attr->n_projs);
+                       fprintf(F, "default proj: %ld\n", attr->default_proj_num);
+               }
+               if (has_fp_attr(n)) {
+                       const sparc_fp_attr_t *attr = get_sparc_fp_attr_const(n);
+                       ir_fprintf(F, "fp_mode: %+F\n", attr->fp_mode);
+               }
+               if (has_fp_conv_attr(n)) {
+                       const sparc_fp_conv_attr_t *attr = get_sparc_fp_conv_attr_const(n);
+                       ir_fprintf(F, "conv from: %+F\n", attr->src_mode);
+                       ir_fprintf(F, "conv to: %+F\n", attr->dest_mode);
                }
                break;
+
+       case dump_node_nodeattr_txt:
+               break;
        }
 }
 
@@ -115,10 +154,11 @@ static void sparc_set_attr_imm(ir_node *res, int immediate_value)
        attr->immediate_value = immediate_value;
 }
 
-void set_sparc_jmp_cond_proj_num(ir_node *node, int proj_num)
+static void init_sparc_jmp_cond_attr(ir_node *node, int pnc, bool is_unsigned)
 {
        sparc_jmp_cond_attr_t *attr = get_sparc_jmp_cond_attr(node);
-       attr->proj_num = proj_num;
+       attr->pnc         = pnc;
+       attr->is_unsigned = is_unsigned;
 }
 
 void set_sparc_jmp_switch_n_projs(ir_node *node, int n_projs)
@@ -135,12 +175,6 @@ void set_sparc_jmp_switch_default_proj_num(ir_node *node, long def_proj_num)
 
 
 
-int get_sparc_jmp_cond_proj_num(const ir_node *node)
-{
-       const sparc_jmp_cond_attr_t *attr = get_sparc_jmp_cond_attr_const(node);
-       return attr->proj_num;
-}
-
 int get_sparc_jmp_switch_n_projs(const ir_node *node)
 {
        const sparc_jmp_switch_attr_t *attr = get_sparc_jmp_switch_attr_const(node);
@@ -213,18 +247,6 @@ const sparc_jmp_switch_attr_t *get_sparc_jmp_switch_attr_const(const ir_node *no
        return (const sparc_jmp_switch_attr_t*) get_irn_generic_attr_const(node);
 }
 
-sparc_cmp_attr_t *get_sparc_cmp_attr(ir_node *node)
-{
-       assert(has_cmp_attr(node));
-       return (sparc_cmp_attr_t*) get_irn_generic_attr_const(node);
-}
-
-const sparc_cmp_attr_t *get_sparc_cmp_attr_const(const ir_node *node)
-{
-       assert(has_cmp_attr(node));
-       return (const sparc_cmp_attr_t*) get_irn_generic_attr_const(node);
-}
-
 sparc_save_attr_t *get_sparc_save_attr(ir_node *node)
 {
        assert(has_save_attr(node));
@@ -237,6 +259,30 @@ const sparc_save_attr_t *get_sparc_save_attr_const(const ir_node *node)
        return (const sparc_save_attr_t*) get_irn_generic_attr_const(node);
 }
 
+sparc_fp_attr_t *get_sparc_fp_attr(ir_node *node)
+{
+       assert(has_fp_attr(node));
+       return (sparc_fp_attr_t*) get_irn_generic_attr(node);
+}
+
+const sparc_fp_attr_t *get_sparc_fp_attr_const(const ir_node *node)
+{
+       assert(has_fp_attr(node));
+       return (const sparc_fp_attr_t*) get_irn_generic_attr_const(node);
+}
+
+sparc_fp_conv_attr_t *get_sparc_fp_conv_attr(ir_node *node)
+{
+       assert(has_fp_conv_attr(node));
+       return (sparc_fp_conv_attr_t*) get_irn_generic_attr(node);
+}
+
+const sparc_fp_conv_attr_t *get_sparc_fp_conv_attr_const(const ir_node *node)
+{
+       assert(has_fp_conv_attr(node));
+       return (const sparc_fp_conv_attr_t*) get_irn_generic_attr_const(node);
+}
+
 /**
  * Returns the argument register requirements of a sparc node.
  */
@@ -246,6 +292,12 @@ const arch_register_req_t **get_sparc_in_req_all(const ir_node *node)
        return attr->in_req;
 }
 
+void set_sparc_in_req_all(ir_node *node, const arch_register_req_t **reqs)
+{
+       sparc_attr_t *attr = get_sparc_attr(node);
+       attr->in_req = reqs;
+}
+
 /**
  * Returns the argument register requirement at position pos of an sparc node.
  */
@@ -287,7 +339,6 @@ static void init_sparc_attributes(ir_node *node, arch_irn_flags_t flags,
        memset(info->out_infos, 0, n_res * sizeof(info->out_infos[0]));
 }
 
-/* CUSTOM ATTRIBUTE INIT FUNCTIONS */
 static void init_sparc_load_store_attributes(ir_node *res, ir_mode *ls_mode,
                                                                                        ir_entity *entity,
                                                                                        int entity_sign, long offset,
@@ -302,13 +353,6 @@ static void init_sparc_load_store_attributes(ir_node *res, ir_mode *ls_mode,
        attr->base.is_load_store = true;
 }
 
-static void init_sparc_cmp_attr(ir_node *res, bool ins_permuted, bool is_unsigned)
-{
-       sparc_cmp_attr_t *attr = get_sparc_cmp_attr(res);
-       attr->ins_permuted = ins_permuted;
-       attr->is_unsigned  = is_unsigned;
-}
-
 static void init_sparc_symconst_attributes(ir_node *res, ir_entity *entity)
 {
        sparc_symconst_attr_t *attr = get_sparc_symconst_attr(res);
@@ -316,12 +360,26 @@ static void init_sparc_symconst_attributes(ir_node *res, ir_entity *entity)
        attr->fp_offset = 0;
 }
 
-static void init_sparc_save_attr(ir_node *res, int initial_stacksize)
+static void init_sparc_save_attributes(ir_node *res, int initial_stacksize)
 {
        sparc_save_attr_t *attr = get_sparc_save_attr(res);
        attr->initial_stacksize = initial_stacksize;
 }
 
+static void init_sparc_fp_attributes(ir_node *res, ir_mode *fp_mode)
+{
+       sparc_fp_attr_t *attr = get_sparc_fp_attr(res);
+       attr->fp_mode = fp_mode;
+}
+
+static void init_sparc_fp_conv_attributes(ir_node *res, ir_mode *src_mode,
+                                          ir_mode *dest_mode)
+{
+       sparc_fp_conv_attr_t *attr = get_sparc_fp_conv_attr(res);
+       attr->src_mode = src_mode;
+       attr->dest_mode = dest_mode;
+}
+
 /**
  * copies sparc attributes of  node
  */
@@ -353,15 +411,13 @@ static int cmp_attr_sparc(ir_node *a, ir_node *b)
                        || attr_a->is_load_store != attr_b->is_load_store;
 }
 
-
-/* CUSTOM ATTRIBUTE CMP FUNCTIONS */
 static int cmp_attr_sparc_load_store(ir_node *a, ir_node *b)
 {
        const sparc_load_store_attr_t *attr_a = get_sparc_load_store_attr_const(a);
        const sparc_load_store_attr_t *attr_b = get_sparc_load_store_attr_const(b);
 
        if (cmp_attr_sparc(a, b))
-                       return 1;
+               return 1;
 
        return attr_a->entity != attr_b->entity
                        || attr_a->entity_sign != attr_b->entity_sign
@@ -376,7 +432,7 @@ static int cmp_attr_sparc_symconst(ir_node *a, ir_node *b)
        const sparc_symconst_attr_t *attr_b = get_sparc_symconst_attr_const(b);
 
        if (cmp_attr_sparc(a, b))
-                       return 1;
+               return 1;
 
        return attr_a->entity != attr_b->entity
                        || attr_a->fp_offset != attr_b->fp_offset;
@@ -388,9 +444,10 @@ static int cmp_attr_sparc_jmp_cond(ir_node *a, ir_node *b)
        const sparc_jmp_cond_attr_t *attr_b = get_sparc_jmp_cond_attr_const(b);
 
        if (cmp_attr_sparc(a, b))
-                       return 1;
+               return 1;
 
-       return attr_a->proj_num != attr_b->proj_num;
+       return attr_a->pnc != attr_b->pnc
+           || attr_a->is_unsigned != attr_b->is_unsigned;
 }
 
 static int cmp_attr_sparc_jmp_switch(ir_node *a, ir_node *b)
@@ -399,33 +456,44 @@ static int cmp_attr_sparc_jmp_switch(ir_node *a, ir_node *b)
        const sparc_jmp_switch_attr_t *attr_b = get_sparc_jmp_switch_attr_const(b);
 
        if (cmp_attr_sparc(a, b))
-                       return 1;
+               return 1;
 
        return attr_a->default_proj_num != attr_b->default_proj_num
                        || attr_a->n_projs != attr_b->n_projs;
 }
 
-static int cmp_attr_sparc_cmp(ir_node *a, ir_node *b)
+static int cmp_attr_sparc_save(ir_node *a, ir_node *b)
 {
-       const sparc_cmp_attr_t *attr_a = get_sparc_cmp_attr_const(a);
-       const sparc_cmp_attr_t *attr_b = get_sparc_cmp_attr_const(b);
+       const sparc_save_attr_t *attr_a = get_sparc_save_attr_const(a);
+       const sparc_save_attr_t *attr_b = get_sparc_save_attr_const(b);
 
        if (cmp_attr_sparc(a, b))
-                       return 1;
+               return 1;
 
-       return attr_a->ins_permuted != attr_b->ins_permuted
-                       || attr_a->is_unsigned != attr_b->is_unsigned;
+       return attr_a->initial_stacksize != attr_b->initial_stacksize;
 }
 
-static int cmp_attr_sparc_save(ir_node *a, ir_node *b)
+static int cmp_attr_sparc_fp(ir_node *a, ir_node *b)
 {
-       const sparc_save_attr_t *attr_a = get_sparc_save_attr_const(a);
-       const sparc_save_attr_t *attr_b = get_sparc_save_attr_const(b);
+       const sparc_fp_attr_t *attr_a = get_sparc_fp_attr_const(a);
+       const sparc_fp_attr_t *attr_b = get_sparc_fp_attr_const(b);
 
        if (cmp_attr_sparc(a, b))
-                       return 1;
+               return 1;
 
-       return attr_a->initial_stacksize != attr_b->initial_stacksize;
+       return attr_a->fp_mode != attr_b->fp_mode;
+}
+
+static int cmp_attr_sparc_fp_conv(ir_node *a, ir_node *b)
+{
+       const sparc_fp_conv_attr_t *attr_a = get_sparc_fp_conv_attr_const(a);
+       const sparc_fp_conv_attr_t *attr_b = get_sparc_fp_conv_attr_const(b);
+
+       if (cmp_attr_sparc(a, b))
+               return 1;
+
+       return attr_a->src_mode != attr_b->src_mode
+           || attr_a->dest_mode != attr_b->dest_mode;;
 }
 
 /* Include the generated constructor functions */