OSDN Git Service

* config/mips/mips.c (mips_function_value): Handle complex return
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 26 Aug 2001 04:51:54 +0000 (04:51 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 26 Aug 2001 04:51:54 +0000 (04:51 +0000)
        values.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45178 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/mips/mips.c

index f85e3d2..278ca88 100644 (file)
@@ -1,3 +1,8 @@
+2001-08-26  Aldy Hernandez  <aldyh@redhat.com>
+
+        * config/mips/mips.c (mips_function_value): Handle complex return
+        values.
+
 2001-08-25  Hans-Peter Nilsson  <hp@bitrange.com>
 
        * reload1.c (reload): Make all entries in reg_equiv_memory_loc
index 268c7f4..952b260 100644 (file)
@@ -7782,8 +7782,7 @@ mips_function_value (valtype, func)
      just as PROMOTE_MODE does.  */
   mode = promote_mode (valtype, mode, &unsignedp, 1);
 
-  /* ??? How should we return complex float?  */
-  if (mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
+  if (mclass == MODE_FLOAT)
     {
       if (TARGET_SINGLE_FLOAT
          && (mclass == MODE_FLOAT
@@ -7793,6 +7792,33 @@ mips_function_value (valtype, func)
        reg = FP_RETURN;
     }
 
+  else if (mclass == MODE_COMPLEX_FLOAT)
+    {
+      if (TARGET_FLOAT64)
+       reg = FP_RETURN;
+      else if (mode == SCmode)
+       {
+         /* When FP registers are 32 bits, we can't directly reference
+            the odd numbered ones, so let's make a pair of evens.  */
+
+         enum machine_mode cmode = TYPE_MODE (TREE_TYPE (valtype));
+
+         return gen_rtx_PARALLEL
+           (VOIDmode,
+            gen_rtvec (2,
+                       gen_rtx_EXPR_LIST (VOIDmode,
+                                          gen_rtx_REG (cmode,
+                                                       FP_RETURN),
+                                          GEN_INT (0)),
+                       gen_rtx_EXPR_LIST (VOIDmode,
+                                          gen_rtx_REG (cmode,
+                                                       FP_RETURN + 2),
+                                          GEN_INT (4))));
+       }
+      else
+       reg = FP_RETURN;
+    }
+
   else if (TREE_CODE (valtype) == RECORD_TYPE
           && mips_abi != ABI_32
           && mips_abi != ABI_O64