* Removed all Id tags.
[cacao.git] / src / vm / jit / x86_64 / md-abi.c
index 307cc26787024cf6288343f16cfe0898eef842a1..34bc9e4f7bd063d93c20a5a13876b480dba8c564 100644 (file)
@@ -22,8 +22,6 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 7630 2007-04-02 19:56:14Z twisti $
-
 */
 
 
@@ -34,6 +32,7 @@
 
 #include "vm/global.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/jit.h" /* for REG_* (maybe can be removed) */
 
 #include "vmcore/descriptor.h"
@@ -74,6 +73,16 @@ const s4 abi_registers_integer_temporary[] = {
 };
 
 
+/* float registers *************************************************************
+
+   xmm0,   xmm1,   xmm2,   xmm3,   xmm4,   xmm5,   xmm6,   xmm7,
+   (fa0)   (fa1)   (fa2)   (fa3)   (fa4)   (fa5)   (fa6)   (fa7)
+
+   xmm8,   xmm9,   xmm10,  xmm11,  xmm12,  xmm13,  xmm14,  xmm15
+   (ftmp1) (ftmp2) (ftmp3) (ft0)   (ft1)   (ft2)   (ft3)   (ft4)
+
+*******************************************************************************/
+
 s4 nregdescfloat[] = {
     REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG,
     REG_RES, REG_RES, REG_RES, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
@@ -81,6 +90,30 @@ s4 nregdescfloat[] = {
 };
 
 
+const s4 abi_registers_float_argument[] = {
+       0,  /* fa0 */
+       1,  /* fa1 */
+       2,  /* fa2 */
+       3,  /* fa3 */
+       4,  /* fa4 */
+       5,  /* fa5 */
+       6,  /* fa6 */
+       7,  /* fa7 */
+};
+
+const s4 abi_registers_float_saved[] = {
+       -1,
+};
+
+const s4 abi_registers_float_temporary[] = {
+       11, /* ft0 */
+       12, /* ft1 */
+       13, /* ft2 */
+       14, /* ft3 */
+       15, /* ft4 */
+};
+
+
 /* md_param_alloc **************************************************************
 
    XXX
@@ -97,8 +130,8 @@ void md_param_alloc(methoddesc *md)
 
        /* set default values */
 
-       iarg = 0;
-       farg = 0;
+       iarg      = 0;
+       farg      = 0;
        stacksize = 0;
 
        /* get params field of methoddesc */
@@ -112,12 +145,14 @@ void md_param_alloc(methoddesc *md)
                case TYPE_LNG:
                        if (iarg < INT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = iarg;
+                               pd->index    = iarg;
+                               pd->regoff   = abi_registers_integer_argument[iarg];
                                iarg++;
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->index    = stacksize;
+                               pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
                        break;
@@ -126,12 +161,14 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (farg < FLT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = farg;
+                               pd->index    = farg;
+                               pd->regoff   = abi_registers_float_argument[farg];
                                farg++;
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff   = stacksize;
+                               pd->index    = stacksize;
+                               pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
                        break;