t-linux64 (LIB2FUNCS_EXTRA): Add darwin-ldouble.c.
[gcc.git] / gcc / config / rs6000 / rs6000.c
index 1db36b17f2e2a370df24074aab215f49aa9d64f6..9cacc88f70011a5cf21329b5fe168d65422cc07c 100644 (file)
@@ -4417,7 +4417,7 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
                                    /* If this is partially on the stack, then
                                       we only include the portion actually
                                       in registers here.  */
-                                   ? gen_rtx_REG (SImode,
+                                   ? gen_rtx_REG (Pmode,
                                               GP_ARG_MIN_REG + align_words)
                                    : gen_rtx_REG (mode,
                                               GP_ARG_MIN_REG + align_words))),
@@ -15726,6 +15726,7 @@ rs6000_complex_function_value (enum machine_mode mode)
   unsigned int regno;
   rtx r1, r2;
   enum machine_mode inner = GET_MODE_INNER (mode);
+  unsigned int inner_bytes = GET_MODE_SIZE (inner);
 
   if (FLOAT_MODE_P (mode))
     regno = FP_ARG_RETURN;
@@ -15734,15 +15735,17 @@ rs6000_complex_function_value (enum machine_mode mode)
       regno = GP_ARG_RETURN;
 
       /* 32-bit is OK since it'll go in r3/r4.  */
-      if (TARGET_32BIT
-         && GET_MODE_BITSIZE (inner) >= 32)
+      if (TARGET_32BIT && inner_bytes >= 4)
        return gen_rtx_REG (mode, regno);
     }
 
+  if (inner_bytes >= 8)
+    return gen_rtx_REG (mode, regno);
+
   r1 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno),
                          const0_rtx);
   r2 = gen_rtx_EXPR_LIST (inner, gen_rtx_REG (inner, regno + 1),
-                         GEN_INT (GET_MODE_UNIT_SIZE (inner)));
+                         GEN_INT (inner_bytes));
   return gen_rtx_PARALLEL (mode, gen_rtvec (2, r1, r2));
 }