correct handling for register usage for return types
authorchristian <none@none>
Sun, 26 Jun 2005 21:48:50 +0000 (21:48 +0000)
committerchristian <none@none>
Sun, 26 Jun 2005 21:48:50 +0000 (21:48 +0000)
src/vm/jit/powerpc/darwin/md-abi.c
src/vm/jit/powerpc/linux/md-abi.c

index b7e47c898383ffdbf437546e627c3ebf718593b6..e982492e29c9837d576e76fba419b3f60e403611 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christian Ullrich
 
-   $Id: md-abi.c 2811 2005-06-23 14:19:18Z christian $
+   $Id: md-abi.c 2835 2005-06-26 21:48:50Z christian $
 
 */
 
@@ -130,11 +130,16 @@ void md_param_alloc(methoddesc *md)
        }
 
 
-       /* Since R3/R4 (==A0/A1) are used for passing return values, this         */
+       /* Since R3/R4, F1 (==A0/A1, A0) are used for passing return values, this */
        /* argument register usage has to be regarded, too                        */
-       if (IS_INT_LNG_TYPE(md->returntype.type))
+       if (IS_INT_LNG_TYPE(md->returntype.type)) {
                if (iarg < (IS_2_WORD_TYPE(md->returntype.type) ? 2 : 1))
                        iarg = IS_2_WORD_TYPE(md->returntype.type) ? 2 : 1;
+       } else {
+               if (IS_FLT_DBL_TYPE(md->returntype.type))
+                       if (farg < 1)
+                               farg = 1;
+       }
 
        /* fill register and stack usage */
        md->argintreguse = iarg;
index 77834baf4b24be69a665e121feae4ed8982c3764..06f54510171df0bc1e2d4bbc6fe0bd16b14273a6 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christian Ullrich
 
-   $Id: md-abi.c 2813 2005-06-23 14:30:44Z christian $
+   $Id: md-abi.c 2835 2005-06-26 21:48:50Z christian $
 
 */
 
@@ -137,6 +137,17 @@ void md_param_alloc(methoddesc *md)
                }
        }
 
+       /* Since R3/R4, F1 (==A0/A1, A0) are used for passing return values, this */
+       /* argument register usage has to be regarded, too                        */
+       if (IS_INT_LNG_TYPE(md->returntype.type)) {
+               if (iarg < (IS_2_WORD_TYPE(md->returntype.type) ? 2 : 1))
+                       iarg = IS_2_WORD_TYPE(md->returntype.type) ? 2 : 1;
+       } else {
+               if (IS_FLT_DBL_TYPE(md->returntype.type))
+                       if (farg < 1)
+                               farg = 1;
+       }
+
        /* fill register and stack usage */
 
        md->argintreguse = iarg;