OSDN Git Service

2007-12-12 Andreas Krebbel <krebbel1@de.ibm.com>
[pf3gnuchains/gcc-fork.git] / gcc / config / s390 / s390.c
index c93fe99..0b6d63b 100644 (file)
@@ -1448,9 +1448,9 @@ override_options (void)
   if (TARGET_64BIT && !TARGET_ZARCH)
     error ("64-bit ABI not supported in ESA/390 mode");
 
-  if (TARGET_HARD_DFP && (!TARGET_CPU_DFP || !TARGET_ZARCH))
+  if (TARGET_HARD_DFP && !TARGET_DFP)
     {
-      if (target_flags_explicit & MASK_SOFT_DFP)
+      if (target_flags_explicit & MASK_HARD_DFP)
        {
          if (!TARGET_CPU_DFP)
            error ("Hardware decimal floating point instructions"
@@ -1460,15 +1460,15 @@ override_options (void)
                   " not available in ESA/390 mode");
        }
       else
-       target_flags |= MASK_SOFT_DFP;
+       target_flags &= ~MASK_HARD_DFP;
     }
 
   if ((target_flags_explicit & MASK_SOFT_FLOAT) && TARGET_SOFT_FLOAT)
     {
-      if ((target_flags_explicit & MASK_SOFT_DFP) && TARGET_HARD_DFP)
+      if ((target_flags_explicit & MASK_HARD_DFP) && TARGET_HARD_DFP)
        error ("-mhard-dfp can't be used in conjunction with -msoft-float");
 
-      target_flags |= MASK_SOFT_DFP;
+      target_flags &= ~MASK_HARD_DFP;
     }
 
   /* Set processor cost function.  */
@@ -2056,8 +2056,7 @@ s390_O_constraint_str (const char c, HOST_WIDE_INT value)
        || s390_single_part (GEN_INT (value), DImode, SImode, 0) == 1;
 
     case 'n':
-      return value == -1
-       || s390_single_part (GEN_INT (value), DImode, SImode, -1) == 1;
+      return s390_single_part (GEN_INT (value - 1), DImode, SImode, -1) == 1;
 
     default:
       gcc_unreachable ();
@@ -3927,8 +3926,8 @@ s390_expand_addcc (enum rtx_code cmp_code, rtx cmp_op0, rtx cmp_op1,
          if (!register_operand (src, GET_MODE (dst)))
            src = force_reg (GET_MODE (dst), src);
 
-         src = gen_rtx_PLUS (GET_MODE (dst), src, const0_rtx);
-         op_res = gen_rtx_PLUS (GET_MODE (dst), src, op_res);
+         op_res = gen_rtx_PLUS (GET_MODE (dst), op_res, src);
+         op_res = gen_rtx_PLUS (GET_MODE (dst), op_res, const0_rtx);
        }
 
       p = rtvec_alloc (2);
@@ -5600,7 +5599,7 @@ s390_dump_pool (struct constant_pool *pool, bool remote_label)
     for (c = pool->constants[i]; c; c = c->next)
       {
        /* Convert UNSPEC_LTREL_OFFSET unspecs to pool-relative references.  */
-       rtx value = c->value;
+       rtx value = copy_rtx (c->value);
        if (GET_CODE (value) == CONST
            && GET_CODE (XEXP (value, 0)) == UNSPEC
            && XINT (XEXP (value, 0), 1) == UNSPEC_LTREL_OFFSET
@@ -7162,6 +7161,18 @@ s390_load_got (void)
   return insns;
 }
 
+/* This ties together stack memory (MEM with an alias set of frame_alias_set)
+   and the change to the stack pointer.  */
+
+static void
+s390_emit_stack_tie (void)
+{
+  rtx mem = gen_frame_mem (BLKmode,
+                          gen_rtx_REG (Pmode, STACK_POINTER_REGNUM));
+
+  emit_insn (gen_stack_tie (mem));
+}
+
 /* Expand the prologue into a bunch of separate insns.  */
 
 void
@@ -7390,6 +7401,11 @@ s390_emit_prologue (void)
 
   if (cfun_save_high_fprs_p && next_fpr)
     {
+      /* If the stack might be accessed through a different register
+        we have to make sure that the stack pointer decrement is not
+        moved below the use of the stack slots.  */
+      s390_emit_stack_tie ();
+
       insn = emit_insn (gen_add2_insn (temp_reg, 
                                       GEN_INT (cfun_frame_layout.f8_offset)));
 
@@ -7961,7 +7977,7 @@ s390_build_builtin_va_list (void)
        holds the offset of the first anonymous stack argument
        (relative to the virtual arg pointer).  */
 
-void
+static void
 s390_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
 {
   HOST_WIDE_INT n_gpr, n_fpr;
@@ -9314,6 +9330,8 @@ s390_reorg (void)
 
 #undef TARGET_BUILD_BUILTIN_VA_LIST
 #define TARGET_BUILD_BUILTIN_VA_LIST s390_build_builtin_va_list
+#undef TARGET_EXPAND_BUILTIN_VA_START
+#define TARGET_EXPAND_BUILTIN_VA_START s390_va_start
 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
 #define TARGET_GIMPLIFY_VA_ARG_EXPR s390_gimplify_va_arg