* src/vm/exceptions.c (exceptions_handle_exception) [__S390__]: Synchronization objec...
authorpm <none@none>
Sat, 11 Aug 2007 22:38:38 +0000 (22:38 +0000)
committerpm <none@none>
Sat, 11 Aug 2007 22:38:38 +0000 (22:38 +0000)
 * src/vm/vm.c (vm_array_store_flt) [__S390__]: Float value is in bytes 4-7 of uint64_t.
 * src/vm/jit/s390/arch.h,
src/vm/jit/s390/asmpart.S,
src/vm/jit/s390/codegen.c,
src/vm/jit/s390/emit.c,
src/vm/jit/s390/md.c,
src/vm/jit/s390/md-abi.c,
src/vm/jit/s390/md-asm.h: Changed a lot for 8 byte stackslots.

src/vm/exceptions.c
src/vm/jit/s390/arch.h
src/vm/jit/s390/asmpart.S
src/vm/jit/s390/codegen.c
src/vm/jit/s390/emit.c
src/vm/jit/s390/md-abi.c
src/vm/jit/s390/md-asm.h
src/vm/jit/s390/md.c
src/vm/vm.c

index 6bcd4fd19b0df81f13776870131de1df37980fcc..e8e44651eea2472bbaf60a89933e72e83fb01045 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: exceptions.c 8295 2007-08-11 17:57:24Z michi $
+   $Id: exceptions.c 8296 2007-08-11 22:38:38Z pm $
 
 */
 
@@ -1898,7 +1898,7 @@ u1 *exceptions_handle_exception(java_object_t *xptr, u1 *xpc, u1 *pv, u1 *sp)
        if (issync) {
                /* get synchronization object */
 
-# if (defined(__MIPS__) && (SIZEOF_VOID_P == 4)) || defined(__I386__) || defined(__POWERPC__)
+# if (defined(__MIPS__) && (SIZEOF_VOID_P == 4)) || defined(__I386__) || defined(__S390__) || defined(__POWERPC__)
                /* XXX change this if we ever want to use 4-byte stackslots */
                o = *((java_object_t **) (sp + issync - 8));
 # else
index e61688a365261ff224acb5414b1ed5e417abda58..805d8a2939d7bbf4a5b34ac90479aaa6f911d566 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: arch.h 8247 2007-07-31 12:06:44Z michi $
+   $Id: arch.h 8296 2007-08-11 22:38:38Z pm $
 
 */
 
 
 /* misc ***********************************************************************/
 
-#define HAS_4BYTE_STACKSLOT
+/* #define HAS_4BYTE_STACKSLOT */
 #define SUPPORT_COMBINE_INTEGER_REGISTERS
 
 #endif /* _ARCH_H */
index 830a7fd0b6f59af66716744d80c611a690247c93..c515d536567c886b80e68034d5547309066979ac 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 8274 2007-08-08 15:58:17Z twisti $
+   $Id: asmpart.S 8296 2007-08-11 22:38:38Z pm $
 
 */
 
@@ -114,6 +114,84 @@ asm_vm_call_method_long:
 asm_vm_call_method_float:
 asm_vm_call_method_double:
 
+       ahi sp, -6*4                /* allocate stack frame */
+
+       /* a0: PV */
+       /* a1: data structure */
+       /* a2: number of stack arguments */
+
+       st    s0, 0*4(sp)           /* store used calle saved registers */
+       st    s1, 1*4(sp)
+       st    a0, 2*4(sp)
+       st    mptr, 3*4(sp)
+       st    pv, 4*4(sp)
+       st    ra, 5*4(sp)
+
+       lr    s0, a1                /* data structure */
+       lr    %r0, a2               /* number of stack arguments */
+
+       l     a0, 0*8+4(s0)         /* big endian */
+       l     a1, 1*8+4(s0)
+       l     a2, 2*8+4(s0)
+       l     a3, 3*8+4(s0)
+       l     a4, 4*8+4(s0)         
+
+       ld    fa0, 5*8(s0)
+       ld    fa1, 6*8(s0)
+
+       lr    s1, sp                /* backup stack pointer */
+
+       ltr   %r0, %r0              /* are there any stack arguments ? */
+       je    L_asm_vm_call_method_stack_copy_done
+       lr    %r1, %r0              /* copy number of stack arguments */
+       sll   %r1, 3                /* calculate stackframe size */ 
+       sr    sp, %r1               /* allocate stack frame */
+       lr    %r1, sp               /* temporary stack pointer */
+
+L_asm_vm_call_method_stack_copy_loop:
+
+       mvc   0(8, %r1), 7*8(s0)    /* copy argument */
+       ahi   %r1, 8                /* increase sp */
+       ahi   s0, 8                 /* set address of next argument */
+       ahi   %r0, -1               /* substract 1 argument */
+       jh    L_asm_vm_call_method_stack_copy_loop
+
+L_asm_vm_call_method_stack_copy_done:
+
+       la    mptr, 2*4(s1)         /* load method pointer */
+       l     pv, 0(mptr)           /* load procedure vector from method pointer */
+       basr  ra, pv                /* call method */
+       lr    sp, s1                /* restore stack pointer */
+
+L_asm_vm_call_method_return:
+
+       l     s0, 0*4(sp)           /* restore used callee saved registers */
+       l     s1, 1*4(sp)
+       l     mptr, 3*4(sp)
+       l     pv, 4*4(sp)
+       l     ra, 5*4(sp)
+
+       ahi   sp, 6*4               /* remove stackframe */
+       br    ra                    /* return */
+
+
+asm_vm_call_method_exception_handler:
+       lr    a0, xptr
+
+       bras  %r14, L_avcmeh_bras
+       .long builtin_throw_exception
+L_avcmeh_bras:
+       l     %r14, 0(%r14)
+       ahi   sp, -96
+       basr  %r14, %r14
+       ahi   sp, 96
+       j     L_asm_vm_call_method_return
+
+asm_vm_call_method_end:
+       brc   0,0       
+
+#if 0
+
 /*
 
 a0:   methodinfo *m
@@ -299,7 +377,7 @@ L_stack_handle_int:
        jne   L_stack_handle_long
 
        mvc   0(4, s2), offvmargdata+4(itmp1)/* copy integer value */
-       ahi   s2, 4
+       ahi   s2, 8
        j     L_stack_copy_loop
 
 L_stack_handle_long:
@@ -317,7 +395,7 @@ L_stack_handle_float:
        jne   L_stack_handle_double
 
        mvc   0(4, s2), offvmargdata(itmp1)  /* copy float value */
-       ahi   s2, 4
+       ahi   s2, 8
        j     L_stack_copy_loop
 
 L_stack_handle_double:
@@ -428,8 +506,8 @@ L_handle_d1:
        ld    fa1, offvmargdata(itmp1)
        j     L_register_copy
 
-asm_vm_call_method_end:
-       brc   0,0       
+
+#endif
 
 /****************** function asm_call_jit_compiler *****************************
 *                                                                              *
@@ -621,7 +699,7 @@ L_asm_handle_exception_no_leaf_stack:
 
        l       itmp2,0xfff+FrameSize(itmp3)/* get frame size                     */
        la      itmp2,0(itmp2,sp)           /* pointer to save area (p1) */
-       ahi     itmp2,-4                    /* skip RA (p2) */
+       ahi     itmp2,-8                    /* skip RA (p2) */
        ahi     itmp2,-0xfff                /* for negative displacements */
 
        l       a0,0xfff+IntSave(itmp3)     /* a0 = saved int register count  */
@@ -639,19 +717,19 @@ L_asm_handle_exception_no_leaf_stack:
        je      int4
        
 int5:
-       l       s0,0xfff-5*4(itmp2)
+       l       s0,0xfff-5*8(itmp2)
 int4:   
-       l       s1,0xfff-4*4(itmp2)
+       l       s1,0xfff-4*8(itmp2)
 int3:   
-       l       s2,0xfff-3*4(itmp2)
+       l       s2,0xfff-3*8(itmp2)
 int2:   
-       l       s3,0xfff-2*4(itmp2)
+       l       s3,0xfff-2*8(itmp2)
 int1:   
-       l       s4,0xfff-1*4(itmp2)
+       l       s4,0xfff-1*8(itmp2)
 
 noint:
 
-       sll     a0,2                        /* a0 = saved int register count * 4 */
+       sll     a0,3                        /* a0 = saved int register count * 8 */
        sr      itmp2, a0                   /* skip Int Sav (p3) */
 
        l       a0,0xfff+FltSave(itmp3)
@@ -668,10 +746,10 @@ flt1:
                 
 noflt:
 
-       l       itmp3,0xfff+FrameSize(itmp3)/* get frame size (at least 4 - RA)   */
-       ahi     itmp3,-4                    /* substract 4 */
+       l       itmp3,0xfff+FrameSize(itmp3)/* get frame size (at least 8 - RA)   */
+       ahi     itmp3,-8                    /* substract 8 */
        l       xpc,0(itmp3,sp)             /* load the new xpc -  return address */
-       la      sp, 4(itmp3,sp)             /* unwind stack                       */
+       la      sp, 8(itmp3,sp)             /* unwind stack                       */
 
                                            /* exception pointer is still set     */
 #if 0
index c12b0170c3c9641ed1a59ea786215312c05e3dc9..5bb924621cd515e8678d3562220a144e8b997378 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8295 2007-08-11 17:57:24Z michi $
+   $Id: codegen.c 8296 2007-08-11 22:38:38Z pm $
 
 */
 
 #include "vm/stringlocal.h"
 #include "vm/vm.h"
 
-#define OOPS() assert(0);
-#define SUPPORT_HERCULES 1
+/* DO__LOG generates a call to do__log. No registers are destroyed,
+ * so you may use it anywhere. regs is an array containing all general
+ * purpose registers.
+ */
+
+static void do__log(u4 *regs) {
+       /* insert stuff here */
+}
+
+#define DO__LOG \
+       N_AHI(REG_SP, -200); \
+       N_STM(R0, R15, 96, REG_SP); \
+       M_ALD_DSEG(R14, dseg_add_address(cd, &do__log)); \
+       N_LA(R2, 96, RN, REG_SP); \
+       N_BASR(R14, R14); \
+       N_LM(R0, R15, 96, REG_SP); \
+       N_AHI(REG_SP, 200);
 
-void panic() { }
+#define SUPPORT_HERCULES 1
 
 /* codegen *********************************************************************
 
@@ -83,6 +98,30 @@ void panic() { }
 
 *******************************************************************************/
 
+/*
+
+Layout of stackframe:
+
+Meaning                                Offset
+===============================================================================
+return_address                         (stackframesize - 1) * 8 
+saved_int_reg[INT_SAV_CNT - 1]         (stackframseize - 2) * 8
+...
+saved_int_reg[rd->savintreguse]  
+saved_flt_reg[FLT_SAV_CNT - 1]
+...
+saved_flt_reg[rd->savfltreguse]        (stackframesize - 1 - savedregs_num) * 8
+
+return_value_tmp                       (rd->memuse + 1) * 8
+monitorenter_argument                  (rd->memuse) * 8 
+???
+local[rd->memuse - 1]                  (rd->memuse - 1) * 8
+....
+local[2]                               2 * 8
+local[1]                               1 * 8
+local[0]                               0 * 8
+
+*/
 
 bool codegen_emit(jitdata *jd)
 {
@@ -134,7 +173,7 @@ bool codegen_emit(jitdata *jd)
        /* space to save used callee saved registers */
 
        savedregs_num += (INT_SAV_CNT - rd->savintreguse);
-       savedregs_num += (FLT_SAV_CNT - rd->savfltreguse) * 2;
+       savedregs_num += (FLT_SAV_CNT - rd->savfltreguse);
 
        cd->stackframesize = rd->memuse + savedregs_num + 1  /* space to save RA */;
 
@@ -149,12 +188,9 @@ bool codegen_emit(jitdata *jd)
           since both values reside in R2. */
 
        if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
-               /* reserve 2 slots for long/double return values for monitorexit */
-
-               if (IS_2_WORD_TYPE(m->parseddesc->returntype.type))
-                       cd->stackframesize += 3;
-               else
-                       cd->stackframesize += 2;
+               /* 1 slot space to save argument of monitor_enter */
+               /* 1 slot to temporary store return value before monitor_exit */
+               cd->stackframesize += 2;
        }
 #endif
 
@@ -164,12 +200,12 @@ bool codegen_emit(jitdata *jd)
 
        if (!jd->isleafmethod || opt_verbosecall )
                /* TODO really 16 bytes ? */
-               cd->stackframesize = (cd->stackframesize + 3) & ~3;
+               cd->stackframesize = (cd->stackframesize + 2) & ~2;
 
        /* create method header */
 
        (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
-       (void) dseg_add_unique_s4(cd, cd->stackframesize * 4); /* FrameSize       */
+       (void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize       */
 
 #if defined(ENABLE_THREADS)
        /* IsSync contains the offset relative to the stack pointer for the
@@ -179,10 +215,9 @@ bool codegen_emit(jitdata *jd)
        */
 
        if (checksync && (m->flags & ACC_SYNCHRONIZED))
-               (void) dseg_add_unique_s4(cd, (rd->memuse + 1) * 4); /* IsSync        */
+               (void) dseg_add_unique_s4(cd, (rd->memuse + 1) * 8); /* IsSync        */
        else
 #endif
-
                (void) dseg_add_unique_s4(cd, 0);                    /* IsSync          */
 
        (void) dseg_add_unique_s4(cd, jd->isleafmethod);               /* IsLeaf  */
@@ -223,18 +258,18 @@ bool codegen_emit(jitdata *jd)
        /* create stack frame (if necessary) */
 
        if (cd->stackframesize)
-               M_ASUB_IMM(cd->stackframesize * 4, REG_SP);
+               M_ASUB_IMM(cd->stackframesize * 8, REG_SP);
 
        /* save used callee saved registers and return address */
 
        p = cd->stackframesize;
-       p--; M_AST(REG_RA, REG_SP, p * 4);
+       p--; M_AST(REG_RA, REG_SP, p * 8);
 
        for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
-               p--; M_IST(rd->savintregs[i], REG_SP, p * 4);
+               p--; M_IST(rd->savintregs[i], REG_SP, p * 8);
        }
        for (i = FLT_SAV_CNT - 1; i >= rd->savfltreguse; i--) {
-               p -= 2; M_DST(rd->savfltregs[i], REG_SP, p * 4);
+               p--; M_DST(rd->savfltregs[i], REG_SP, p * 8);
        }
 
        /* take arguments out of register or stack frame */
@@ -246,8 +281,9 @@ bool codegen_emit(jitdata *jd)
                varindex = jd->local_map[l * 5 + t];
 
                l++;
-               if (IS_2_WORD_TYPE(t))    /* increment local counter for 2 word types */
-                       l++;
+
+               if (IS_2_WORD_TYPE(t))
+                       l++;
 
                if (varindex == UNUSED)
                        continue;
@@ -255,6 +291,7 @@ bool codegen_emit(jitdata *jd)
                var = VAR(varindex);
 
                s1 = md->params[p].regoff;
+
                if (IS_INT_LNG_TYPE(t)) {                    /* integer args          */
                        if (IS_2_WORD_TYPE(t)) {
                                s2 = PACK_REGS(
@@ -266,31 +303,28 @@ bool codegen_emit(jitdata *jd)
                        }
                        if (!md->params[p].inmemory) {           /* register arguments    */
                                if (!IS_INMEMORY(var->flags)) {      /* reg arg -> register   */
-                                       if (IS_2_WORD_TYPE(t))
+                                       if (IS_2_WORD_TYPE(t)) {
                                                M_LNGMOVE(s2, var->vv.regoff);
-                                       else
+                                       } else {
                                                M_INTMOVE(s2, var->vv.regoff);
-
+                                       }
                                } else {                             /* reg arg -> spilled    */
-                                       if (IS_2_WORD_TYPE(t))
+                                       if (IS_2_WORD_TYPE(t)) {
                                                M_LST(s2, REG_SP, var->vv.regoff);
-                                       else
+                                       } else {
                                                M_IST(s2, REG_SP, var->vv.regoff);
+                                       }
                                }
 
                        } else {                                 /* stack arguments       */
                                if (!IS_INMEMORY(var->flags)) {      /* stack arg -> register */
-                                       if (IS_2_WORD_TYPE(t))
-                                               M_LLD(var->vv.regoff, REG_SP, cd->stackframesize * 4 + s1);
-                                       else
-                                               M_ILD(var->vv.regoff, REG_SP, cd->stackframesize * 4 + s1);
-
-                               } else {                             /* stack arg -> spilled  */
                                        if (IS_2_WORD_TYPE(t)) {
-                                               N_MVC(var->vv.regoff, 8, REG_SP, cd->stackframesize * 4 + s1, REG_SP);
+                                               M_LLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
                                        } else {
-                                               N_MVC(var->vv.regoff, 4, REG_SP, cd->stackframesize * 4 + s1, REG_SP);
+                                               M_ILD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
                                        }
+                               } else {                             /* stack arg -> spilled  */
+                                       N_MVC(var->vv.regoff, 8, REG_SP, cd->stackframesize * 8 + s1, REG_SP);
                                }
                        }
 
@@ -310,19 +344,14 @@ bool codegen_emit(jitdata *jd)
                        } else {                                 /* stack arguments       */
                                if (!IS_INMEMORY(var->flags)) {      /* stack-arg -> register */
                                        if (IS_2_WORD_TYPE(t))
-                                               M_DLD(var->vv.regoff, REG_SP, cd->stackframesize * 4 + s1);
+                                               M_DLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
 
                                        else
-                                               M_FLD(var->vv.regoff, REG_SP, cd->stackframesize * 4 + s1);
+                                               M_FLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
 
                                } else {                             /* stack-arg -> spilled  */
-                                       if (IS_2_WORD_TYPE(t)) {
-                                               N_MVC(var->vv.regoff, 8, REG_SP, cd->stackframesize * 4 + s1, REG_SP);
-                                               var->vv.regoff = cd->stackframesize * 4 + s1;
-
-                                       } else {
-                                               N_MVC(var->vv.regoff, 4, REG_SP, cd->stackframesize * 4 + s1, REG_SP);
-                                       }
+                                       N_MVC(var->vv.regoff, 8, REG_SP, cd->stackframesize * 8 + s1, REG_SP);
+                                       var->vv.regoff = cd->stackframesize * 8 + s1;
                                }
                        }
                }
@@ -344,9 +373,9 @@ bool codegen_emit(jitdata *jd)
                                M_IST(abi_registers_integer_argument[p], REG_SP, p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_FST(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
+                               M_DST(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
 
-                       s1 += ((INT_ARG_CNT + FLT_ARG_CNT) * 2);
+                       s1 += ((INT_ARG_CNT + FLT_ARG_CNT));
                }
 #endif
 
@@ -365,7 +394,7 @@ bool codegen_emit(jitdata *jd)
                disp = dseg_add_functionptr(cd, LOCK_monitor_enter);
                M_ALD_DSEG(REG_ITMP3, disp);
 
-               M_AST(REG_A0, REG_SP, s1 * 4);
+               M_AST(REG_A0, REG_SP, s1 * 8);
 
                M_ASUB_IMM(96, REG_SP); 
                M_CALL(REG_ITMP3);
@@ -377,7 +406,7 @@ bool codegen_emit(jitdata *jd)
                                M_ILD(abi_registers_integer_argument[p], REG_SP, p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_FLD(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
+                               M_DLD(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
 
                        M_AADD_IMM((INT_ARG_CNT + FLT_ARG_CNT) * 8, REG_SP);
                }
@@ -2559,26 +2588,25 @@ nowperformreturn:
 
 #if defined(ENABLE_THREADS)
                        if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
-
                                /* we need to save the proper return value */
 
                                switch (iptr->opc) {
                                case ICMD_LRETURN:
-                                       M_IST(REG_RESULT2, REG_SP, rd->memuse * 4 + 8);
+                                       M_IST(REG_RESULT2, REG_SP, ((rd->memuse + 1) * 8) + 4);
                                        /* fall through */
                                case ICMD_IRETURN:
                                case ICMD_ARETURN:
-                                       M_IST(REG_RESULT , REG_SP, rd->memuse * 4 + 4);
+                                       M_IST(REG_RESULT , REG_SP, (rd->memuse + 1) * 8);
                                        break;
                                case ICMD_FRETURN:
-                                       M_FST(REG_FRESULT, REG_SP, rd->memuse * 4 + 4);
+                                       M_FST(REG_FRESULT, REG_SP, (rd->memuse + 1) * 8);
                                        break;
                                case ICMD_DRETURN:
-                                       M_DST(REG_FRESULT, REG_SP, rd->memuse * 4 + 4);
+                                       M_DST(REG_FRESULT, REG_SP, (rd->memuse + 1) * 8);
                                        break;
                                }
 
-                               M_ALD(REG_A0, REG_SP, rd->memuse * 4);
+                               M_ALD(REG_A0, REG_SP, rd->memuse * 8);
 
                                disp = dseg_add_functionptr(cd, LOCK_monitor_exit);
                                M_ALD_DSEG(REG_ITMP3, disp);
@@ -2591,17 +2619,17 @@ nowperformreturn:
 
                                switch (iptr->opc) {
                                case ICMD_LRETURN:
-                                       M_ILD(REG_RESULT2, REG_SP, rd->memuse * 4 + 8);
+                                       M_ILD(REG_RESULT2, REG_SP, ((rd->memuse + 1) * 8) + 4);
                                        /* fall through */
                                case ICMD_IRETURN:
                                case ICMD_ARETURN:
-                                       M_ILD(REG_RESULT , REG_SP, rd->memuse * 4 + 4);
+                                       M_ILD(REG_RESULT , REG_SP, (rd->memuse + 1) * 8);
                                        break;
                                case ICMD_FRETURN:
-                                       M_FLD(REG_FRESULT, REG_SP, rd->memuse * 4 + 4);
+                                       M_FLD(REG_FRESULT, REG_SP, (rd->memuse + 1) * 8);
                                        break;
                                case ICMD_DRETURN:
-                                       M_DLD(REG_FRESULT, REG_SP, rd->memuse * 4 + 4);
+                                       M_DLD(REG_FRESULT, REG_SP, (rd->memuse + 1) * 8);
                                        break;
                                }
                        }
@@ -2609,25 +2637,26 @@ nowperformreturn:
 
                        /* restore return address                                         */
 
-                       p--; M_ALD(REG_RA, REG_SP, p * 4);
+                       p--; M_ALD(REG_RA, REG_SP, p * 8);
 
                        /* restore saved registers                                        */
 
                        for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
-                               p--; M_ILD(rd->savintregs[i], REG_SP, p * 4);
+                               p--; M_ILD(rd->savintregs[i], REG_SP, p * 8);
                        }
                        for (i = FLT_SAV_CNT - 1; i >= rd->savfltreguse; i--) {
-                               p -= 2; M_DLD(rd->savfltregs[i], REG_SP, p * 4);
+                               p--; M_DLD(rd->savfltregs[i], REG_SP, p * 8);
                        }
 
                        /* deallocate stack                                               */
 
                        if (cd->stackframesize)
-                               M_AADD_IMM(cd->stackframesize * 4, REG_SP);
+                               M_AADD_IMM(cd->stackframesize * 8, REG_SP);
 
                        /* generate method profiling code */
 
                        PROFILE_CYCLE_STOP;
+
                        M_RET;
                        ALIGNCODENOP;
                        }
@@ -3485,20 +3514,17 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        cd->stackframesize = 
                1 + /* r14 - return address */ +
-               sizeof(stackframeinfo) / SIZEOF_VOID_P +
-               sizeof(localref_table) / SIZEOF_VOID_P +
+               ((sizeof(stackframeinfo) + 7) / 8) +
+               ((sizeof(localref_table) + 7) / 8)  +
                1 + /* itmp3 */
-               (INT_ARG_CNT + FLT_ARG_CNT) * 2 +
+               (INT_ARG_CNT + FLT_ARG_CNT) +
                nmd->memuse + /* parameter passing */
-               96 / SIZEOF_VOID_P /* required by ABI */;
-
-       cd->stackframesize |= 0x1;                  /* keep stack 8-byte aligned */
-
+               (96 / 8)  /* required by ABI */;
 
        /* create method header */
 
        (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
-       (void) dseg_add_unique_s4(cd, cd->stackframesize * 4); /* FrameSize       */
+       (void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize       */
        (void) dseg_add_unique_s4(cd, 0);                      /* IsSync          */
        (void) dseg_add_unique_s4(cd, 0);                      /* IsLeaf          */
        (void) dseg_add_unique_s4(cd, 0);                      /* IntSave         */
@@ -3508,7 +3534,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* generate stub code */
 
-       N_AHI(REG_SP, -(cd->stackframesize * SIZEOF_VOID_P));
+       N_AHI(REG_SP, -(cd->stackframesize * 8));
        N_AHI(REG_PV, N_PV_OFFSET);
 
        /* generate native method profiling code */
@@ -3525,7 +3551,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* save return address */
 
-       N_ST(R14, (cd->stackframesize - 1) * SIZEOF_VOID_P, RN, REG_SP);
+       N_ST(R14, (cd->stackframesize - 1) * 8, RN, REG_SP);
 
 #if !defined(NDEBUG)
        if (JITDATA_HAS_FLAG_VERBOSECALL(jd))
@@ -3543,7 +3569,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        M_ILD_DSEG(REG_ITMP1, disp);
 
-       j = 96 + (nmd->memuse * 4);
+       j = 96 + (nmd->memuse * 8);
 
        /* todo some arg registers are not volatile in C-abi terms */
 
@@ -3578,10 +3604,10 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* create dynamic stack info */
 
-       N_LAE(REG_A0, (cd->stackframesize - 1) * 4, RN, REG_SP); /* datasp */
+       N_LAE(REG_A0, (cd->stackframesize - 1) * , RN, REG_SP); /* datasp */
        N_LA(REG_A1, -N_PV_OFFSET, RN, REG_PV); /* pv */
-       N_LAE(REG_A2, cd->stackframesize * 4, RN, REG_SP); /* old SP */
-       N_L(REG_A3, (cd->stackframesize - 1) * 4, RN, REG_SP); /* return address */
+       N_LAE(REG_A2, cd->stackframesize * 8, RN, REG_SP); /* old SP */
+       N_L(REG_A3, (cd->stackframesize - 1) * 8, RN, REG_SP); /* return address */
 
        disp = dseg_add_functionptr(cd, codegen_start_native_call);
        M_ILD_DSEG(REG_ITMP1, disp);
@@ -3590,7 +3616,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* restore integer and float argument registers */
 
-       j = 96 + (nmd->memuse * 4);
+       j = 96 + (nmd->memuse * 8);
 
        for (i = 0; i < md->paramcount; i++) {
                if (! md->params[i].inmemory) {
@@ -3664,7 +3690,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                }
 
                        } else {
-                               s1 = cd->stackframesize * 4 + md->params[i].regoff;
+                               s1 = cd->stackframesize * 8 + md->params[i].regoff;
                                s2 = nmd->params[j].regoff;
                                
                                if (IS_2_WORD_TYPE(t)) {
@@ -3679,7 +3705,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                        /* registers keep unchanged.                                      */
 
                        if (md->params[i].inmemory) {
-                               s1 = cd->stackframesize * 4 + md->params[i].regoff;
+                               s1 = cd->stackframesize * 8 + md->params[i].regoff;
                                s2 = nmd->params[j].regoff;
 
                                if (IS_2_WORD_TYPE(t)) {
@@ -3734,7 +3760,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* remove native stackframe info */
 
-       N_LAE(REG_A0, (cd->stackframesize - 1) * 4, RN, REG_SP); /* datasp */
+       N_LAE(REG_A0, (cd->stackframesize - 1) * 8, RN, REG_SP); /* datasp */
        disp = dseg_add_functionptr(cd, codegen_finish_native_call);
        M_ALD_DSEG(REG_ITMP1, disp);
        M_CALL(REG_ITMP1);
@@ -3760,11 +3786,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* load return address */
        
-       N_L(REG_ITMP2, (cd->stackframesize - 1) * 4, RN, REG_SP);
+       N_L(REG_ITMP2, (cd->stackframesize - 1) * 8, RN, REG_SP);
 
        /* remove stackframe */
 
-       N_AHI(REG_SP, cd->stackframesize * 4);
+       N_AHI(REG_SP, cd->stackframesize * 8);
 
        /* test for exception */
 
index f954009757157f0674ce7ee36bc95d1045c1f023..8fa71c0d58eb0f28469fcd34afc1113920271a38 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: emit.c 8278 2007-08-08 17:10:18Z michi $
+   $Id: emit.c 8296 2007-08-11 22:38:38Z pm $
 
 */
 
@@ -302,7 +302,7 @@ void emit_verbosecall_enter(jitdata *jd)
        /* offset to where first float arg is saved on stack */
        foff = off + (INT_ARG_CNT * 8); 
        /* offset to where first argument is passed on stack */
-       aoff = (2 * 8) + stackframesize + (cd->stackframesize * 4);
+       aoff = (2 * 8) + stackframesize + (cd->stackframesize * 8);
        /* offset to destination on stack */
        doff = 0; 
 
@@ -321,13 +321,15 @@ void emit_verbosecall_enter(jitdata *jd)
                                N_STD(abi_registers_float_argument[fargctr], doff, RN, REG_SP);
                                fargctr += 1;
                        } else { /* passed on stack */
+                               /*
                                if (IS_2_WORD_TYPE(t)) {
                                        N_MVC(doff, 8, REG_SP, aoff, REG_SP);
-                                       aoff += 8;
                                } else {
                                        N_MVC(doff + 4, 4, REG_SP, aoff, REG_SP);
-                                       aoff += 4;
                                }
+                               */
+                               N_MVC(doff, 8, REG_SP, aoff, REG_SP);
+                               aoff += 8;
                        }
                } else {
                        if (IS_2_WORD_TYPE(t)) {
@@ -344,7 +346,7 @@ void emit_verbosecall_enter(jitdata *jd)
                                        iargctr += 1;
                                } else { /* passed on stack */
                                        N_MVC(doff + 4, 4, REG_SP, aoff, REG_SP);
-                                       aoff += 4;
+                                       aoff += 8;
                                }
                        }
                }
index f0f6d13063730ade058aa3552cd9d142e930eeb6..dfdaa3743ede1a0682401339080db058f3fc8c8e 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: md-abi.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: md-abi.c 8296 2007-08-11 22:38:38Z pm $
 
 */
 
@@ -111,13 +111,19 @@ const s4 abi_registers_float_temporary[] = {
        15  /* f15/ft11 */
 };
 
-/* md_param_alloc **************************************************************
+/* md_param_alloc_intern *******************************************************
 
-   XXX
+   Allocates parameters to registers or stackslots for both native and java
+   methods.
+
+   --- in:
+   slot: size in bytes of a stack slot
+   slots1w: number of stack slots used by a 1 word type parameter
+   slots2w: number of stack slots used by a 2 word type parameter
 
 *******************************************************************************/
 
-void md_param_alloc(methoddesc *md)
+static void md_param_alloc_intern(methoddesc *md, s4 slot, s4 slots1w, s4 slots2w)
 {
        paramdesc *pd;
        s4         i;
@@ -142,12 +148,14 @@ void md_param_alloc(methoddesc *md)
                        if (iarg < INT_ARG_CNT) {
                                pd->inmemory  = false;
                                pd->regoff    = abi_registers_integer_argument[iarg]; 
+                               pd->index     = iarg;
                                iarg++;
                        }
                        else {
                                pd->inmemory  = true;
-                               pd->regoff    = stacksize * 4;
-                               stacksize++;
+                               pd->regoff    = stacksize * slot;
+                               pd->index     = stacksize;
+                               stacksize += slots1w;
                        }
                        break;
 
@@ -158,14 +166,16 @@ void md_param_alloc(methoddesc *md)
                                pd->regoff    = 
                                        PACK_REGS(abi_registers_integer_argument[iarg + 1], 
                                                          abi_registers_integer_argument[iarg]); 
+                               pd->index     = PACK_REGS(iarg + 1, iarg);
                                iarg += 2;
                        }
                        else {
                                /* _ALIGN(stacksize); */
                                pd->inmemory  = true;
-                               pd->regoff    = stacksize * 4;
+                               pd->regoff    = stacksize * slot;
+                               pd->index     = stacksize;
                                iarg          = INT_ARG_CNT;
-                               stacksize    += 2;
+                               stacksize    += slots2w;
                        }
                        break;
 
@@ -173,12 +183,14 @@ void md_param_alloc(methoddesc *md)
                        if (farg < FLT_ARG_CNT) {
                                pd->inmemory  = false;
                                pd->regoff    = abi_registers_float_argument[farg]; 
+                               pd->index     = farg;
                                farg++;
                        }
                        else {
                                pd->inmemory  = true;
-                               pd->regoff    = stacksize * 4;
-                               stacksize++;
+                               pd->regoff    = stacksize * slot;
+                               pd->index     = stacksize;
+                               stacksize += slots1w;
                        }
                        break;
 
@@ -186,13 +198,15 @@ void md_param_alloc(methoddesc *md)
                        if (farg < FLT_ARG_CNT) {
                                pd->inmemory  = false;
                                pd->regoff    = abi_registers_float_argument[farg]; 
+                               pd->index     = farg;
                                farg++;
                        }
                        else {
                                /* _ALIGN(stacksize); */
                                pd->inmemory  = true;
-                               pd->regoff    = stacksize * 4;
-                               stacksize    += 2;
+                               pd->regoff    = stacksize * slot;
+                               pd->index     = stacksize;
+                               stacksize    += slots2w;
                        }
                        break;
 
@@ -222,12 +236,14 @@ void md_param_alloc(methoddesc *md)
        md->memuse = stacksize;
 }
 
-void md_param_alloc_native(methoddesc *md)
+void md_param_alloc(methoddesc *md)
 {
-       /* On PowerPC we use the same ABI for JIT method calls as for
-        *        native method calls. */
+       md_param_alloc_intern(md, 8, 1, 1);
+}
 
-       md_param_alloc(md);
+void md_param_alloc_native(methoddesc *md)
+{
+       md_param_alloc_intern(md, 4, 1, 2);
 }
 
 
index 9cfd3ee5ee88001a6583f9c063b22038f0676eb7..db6c69e0fdccf02dedc7ea989272295606c0f6cc 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: md-asm.h 7839 2007-04-29 22:46:56Z pm $
+   $Id: md-asm.h 8296 2007-08-11 22:38:38Z pm $
 
 */
 
@@ -50,6 +50,7 @@
 #define itmp3    %r14
 #define v0       %r2
 #define pv       %r13
+#define ra       %r14
 
 #define mptr     itmp2
 #define xptr     itmp1
index 0f770648d5fd327412ae5a6568c7dacec8d964d5..c0ec44ccb376bf470a08f0e4b7110b55db763396 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md.c 8283 2007-08-09 15:10:05Z twisti $
+   $Id: md.c 8296 2007-08-11 22:38:38Z pm $
 
 */
 
@@ -86,7 +86,7 @@ void md_dump_context(u1 *pc, mcontext_t *mc) {
        int i;
        u1 *pv;
        methodinfo *m;
-       
+
        union {
                u8 l;
                fpreg_t fr;
@@ -100,7 +100,7 @@ void md_dump_context(u1 *pc, mcontext_t *mc) {
        if (pv == NULL) {
                log_println("No java method found at location.");
        } else {
-               m = ((codeinfo *)(pv + CodeinfoPointer))->m;
+               m = (*(codeinfo **)(pv + CodeinfoPointer))->m;
                log_println(
                        "Java method: class %s, method %s, descriptor %s.",
                        utf_bytes(m->class->name), utf_bytes(m->name), utf_bytes(m->descriptor)
@@ -311,7 +311,7 @@ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
                        (_mc->gregs[r1 + 1] == 0x80000000) && 
                        (_mc->gregs[r2] == 0xFFFFFFFF)
                ) {
-                       /* handle special case */
+                       /* handle special case 0x80000000 / 0xFFFFFFFF that fails on hardware */
                        /* next instruction */
                        pc = (u1 *)_mc->psw.addr;
                        /* reminder */
@@ -455,7 +455,7 @@ u1 *md_stacktrace_get_returnaddress(u1 *sp, u4 framesize)
 
        /* on S390 the return address is located on the top of the stackframe */
 
-       ra = *((u1 **) (sp + framesize - SIZEOF_VOID_P));
+       ra = *((u1 **) (sp + framesize - 8));
 
        return ra;
 }
index c6131b7cb005dc19ddc7ceb5dbbd7dba28e74dca..58f871f6dc67f40a4e5baf8861b405deb7c68990 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: vm.c 8295 2007-08-11 17:57:24Z michi $
+   $Id: vm.c 8296 2007-08-11 22:38:38Z pm $
 
 */
 
@@ -2468,7 +2468,7 @@ static void vm_array_store_flt(uint64_t *array, paramdesc *pd, uint64_t value)
 #else
                index        = INT_ARG_CNT + pd->index;
 #endif
-#if WORDS_BIGENDIAN == 1 && !defined(__POWERPC__) && !defined(__POWERPC64__)
+#if WORDS_BIGENDIAN == 1 && !defined(__POWERPC__) && !defined(__POWERPC64__) && !defined(__S390__)
                array[index] = value >> 32;
 #else
                array[index] = value;