in case SS is used: copy call floating point result from ST0 into SSE register
[libfirm] / ir / be / ia32 / ia32_new_nodes.c
index c07081c..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);
 }
 
@@ -482,7 +482,6 @@ char *get_ia32_am_offs(const ir_node *node) {
                res[0] = attr->data.offs_sign ? '-' : '+';
                memcpy(&res[1], obstack_base(attr->am_offs), size);
                res[size + 1] = '\0';
-               res = obstack_finish(attr->plain_offs);
        }
 
        return res;
@@ -1078,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");
 
@@ -1085,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: