in case SS is used: copy call floating point result from ST0 into SSE register
[libfirm] / ir / be / ia32 / ia32_new_nodes.c
index 746781d..377c435 100644 (file)
@@ -379,8 +379,8 @@ static int ia32_dump_node(ir_node *n, FILE *F, dump_reason_t reason) {
  */
 static ident *get_ident_for_tv(tarval *tv) {
        char buf[1024];
-
-       assert(tarval_snprintf(buf, sizeof(buf), tv));
+       int len = tarval_snprintf(buf, sizeof(buf), tv);
+       assert(len);
        return new_id_from_str(buf);
 }
 
@@ -469,9 +469,16 @@ char *get_ia32_am_offs(const ir_node *node) {
                return NULL;
        }
 
+       if (! attr->plain_offs)
+               attr->plain_offs = (struct obstack *)_new_arr_d(get_irg_obstack(get_irn_irg(node)), 1, sizeof(*(attr->plain_offs)));
+       else
+               obstack_free(attr->plain_offs, NULL);
+
+       obstack_init(attr->plain_offs);
+
        size = obstack_object_size(attr->am_offs);
        if (size > 0) {
-               res    = xmalloc(size + 2);
+               res = obstack_alloc(attr->plain_offs, size + 2);
                res[0] = attr->data.offs_sign ? '-' : '+';
                memcpy(&res[1], obstack_base(attr->am_offs), size);
                res[size + 1] = '\0';
@@ -502,7 +509,7 @@ static void extend_ia32_am_offs(ir_node *node, char *offset, char op) {
 
        if (! attr->am_offs) {
                /* obstack is not initialized */
-               attr->am_offs = xcalloc(1, sizeof(*(attr->am_offs)));
+               attr->am_offs = (struct obstack *)_new_arr_d(get_irg_obstack(get_irn_irg(node)), 1, sizeof(*(attr->am_offs)));
                obstack_init(attr->am_offs);
 
                attr->data.offs_sign = (op == '-') ? 1 : 0;
@@ -1070,6 +1077,7 @@ void copy_ia32_Immop_attr(ir_node *dst, ir_node *src) {
  */
 void set_ia32_Const_attr(ir_node *ia32_cnst, ir_node *cnst) {
        ia32_attr_t *attr = get_ia32_attr(ia32_cnst);
+       ir_mode *mode;
 
        assert(is_ia32_Cnst(ia32_cnst) && "Need ia32_Const to set Const attr");
 
@@ -1077,6 +1085,10 @@ void set_ia32_Const_attr(ir_node *ia32_cnst, ir_node *cnst) {
                case iro_Const:
                        attr->data.tp     = ia32_Const;
                        attr->cnst_val.tv = get_Const_tarval(cnst);
+                       mode = get_tarval_mode(attr->cnst_val.tv);
+                       if (mode_is_reference(mode) &&
+                           get_mode_null(mode) == attr->cnst_val.tv)
+                               attr->cnst_val.tv = get_mode_null(mode_Is);
                        attr->cnst        = get_ident_for_tv(attr->cnst_val.tv);
                        break;
                case iro_SymConst: