* src/vm/jit/x86_64/asmpart.S (asm_vm_call_method): Rewritten for new
authortwisti <none@none>
Thu, 14 Jun 2007 11:12:11 +0000 (11:12 +0000)
committertwisti <none@none>
Thu, 14 Jun 2007 11:12:11 +0000 (11:12 +0000)
argument passing.

* src/vm/jit/x86_64/md-abi.c (md_param_alloc): Set pd->index.

* src/vm/vm.c: Added __X86_64__ ifdef.
* src/vm/vm.h: Likewise.
* src/native/jni.c: Likewise.
* src/vm/jit/asmpart.h: Likewise.

src/native/jni.c
src/vm/jit/asmpart.h
src/vm/jit/x86_64/asmpart.S
src/vm/jit/x86_64/md-abi.c
src/vm/vm.c
src/vm/vm.h

index f0e33489b5ea6d04f7ae5b4e7592bc1b56f6bce8..5047930118fe0183368119791918161e957d2aef 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jni.c 8074 2007-06-13 22:27:17Z twisti $
+   $Id: jni.c 8080 2007-06-14 11:12:11Z twisti $
 
 */
 
@@ -773,7 +773,7 @@ static void _Jv_jni_CallVoidMethodA(java_objectheader *o, vftbl_t *vftbl,
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o,
                                                                                java_objectarray *params)
 {
index fcff87cbc1cf223b2dfdce55c792649bfd173a30..273a0cebaa63335ea2f5b4d7fbdde4ddde5f51d0 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.h 8074 2007-06-13 22:27:17Z twisti $
+   $Id: asmpart.h 8080 2007-06-14 11:12:11Z twisti $
 
 */
 
@@ -89,7 +89,7 @@ s4   asm_md_init(void);
 void asm_call_jit_compiler(void);
 
 #if defined(ENABLE_JIT)
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 java_objectheader *asm_vm_call_method(methodinfo *m, s4 vmargscount,
                                                                          vm_arg *vmargs);
 s4     asm_vm_call_method_int(methodinfo *m, s4 vmargscount, vm_arg *vmargs);
index 20b343895121153c46542eda72a775fb2824d772..55b3edd122e55c458617d2473bed1303e5b21043 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
+   $Id: asmpart.S 8080 2007-06-14 11:12:11Z twisti $
 
 */
 
@@ -122,96 +122,58 @@ asm_vm_call_method_double:
        mov     s3,4*8(sp)
        mov     s4,5*8(sp)
 
-       mov     a0,itmp1                    /* move method pointer for compiler   */
-       xor     %rbp,%rbp                   /* set argument stack frame to zero   */
+       mov     a0,6*8(sp)                  /* store method PV                    */
 
-       test    a1,a1                       /* maybe we have no args...           */
-       jle     L_copy_done
+       mov     sp,s0                       /* save stack pointer                 */
 
-       mov     a1,itmp3                    /* arg count                          */
-       mov     a2,itmp2                    /* pointer to arg block               */
+       mov     a1,t0                       /* address of data structure          */
+       mov     a2,itmp1                    /* number of stack arguments          */
 
-       mov     itmp2,%r14                  /* save argument block pointer        */
-       mov     itmp3,%r15                  /* save argument count                */
+       mov     0*8(t0),a0
+       mov     1*8(t0),a1
+       mov     2*8(t0),a2
+       mov     3*8(t0),a3
+       mov     4*8(t0),a4
+       mov     5*8(t0),a5
 
-       sub     $sizevmarg,itmp2            /* initialize pointer (smaller code)  */
-       add     $1,itmp3                    /* initialize argument count          */
-       xor     %r12,%r12                   /* initialize integer argument counter*/
-       xor     %r13,%r13                   /* initialize float argument counter  */
+       movq    6*8(t0),fa0
+       movq    7*8(t0),fa1
+       movq    8*8(t0),fa2
+       movq    9*8(t0),fa3
+       movq    10*8(t0),fa4
+       movq    11*8(t0),fa5
+       movq    12*8(t0),fa6
+       movq    13*8(t0),fa7
 
-L_register_copy:
-       add     $sizevmarg,itmp2            /* goto next argument block           */
-       dec     itmp3                       /* argument count - 1                 */
-       jz      L_register_copy_done
-       andb    $0x02,offvmargtype(itmp2)   /* is this a float/double type?       */
-       jnz     L_register_handle_float     /* yes, handle it                     */
+       cmp     $0,itmp1l
+       je      L_asm_vm_call_method_stack_copy_done
 
-       cmp     $INT_ARG_CNT,%r12           /* are we out of integer argument     */
-       je      L_register_copy             /* register? yes, next loop           */
+       mov     itmp1,itmp2
+       and     $0xfffffffffffffffe,itmp2   /* keep stack 16-byte aligned         */
+       shl     $3,itmp2                    /* calculate stack size               */
+       sub     itmp2,sp                    /* create stack frame                 */
+       mov     sp,itmp2                    /* temporary stack pointer            */
 
-       lea     jumptable_integer(%rip),%rbp
-       mov     0(%rbp,%r12,8),%rbx
-       inc     %r12                      /* integer argument counter + 1         */
-       jmp     *%rbx
+L_asm_vm_call_method_stack_copy_loop:
+       mov     14*8(t0),itmp3              /* load argument                      */
+       mov     itmp3,0(itmp2)              /* store argument on stack            */
 
-L_register_handle_float:
-       cmp     $FLT_ARG_CNT,%r13         /* are we out of float argument         */
-       je      L_register_copy           /* register? yes, next loop             */
+       sub     $1,itmp1l                   /* subtract 1 argument                */
+       add     $8,t0                       /* set address of next argument       */
+       add     $8,itmp2                    /* increase SP                        */
 
-       lea     jumptable_float(%rip),%rbp
-       mov     0(%rbp,%r13,8),%rbx
-       inc     %r13                      /* float argument counter + 1           */
-       jmp     *%rbx
-       
-L_register_copy_done:
-       mov     %r15,%rbp                 /* calculate remaining arguments        */
-       sub     %r12,%rbp                 /* - integer arguments in registers     */
-       sub     %r13,%rbp                 /* - float arguments in registers       */
-       jle     L_copy_done               /* are all assigned to registers?       */
-
-       and     $0xfffffffffffffffe,%rbp  /* keep stack 16-byte aligned           */
-       shl     $3,%rbp                   /* calculate stack size                 */
-       sub     %rbp,sp                   /* stack frame for arguments            */
-       mov     sp,%rbx                   /* use %rbx as temp sp                  */
-
-       sub     $sizevmarg,%r14           /* initialize pointer (smaller code)    */
-       add     $1,%r15                   /* initialize argument count            */
-               
-L_stack_copy_loop:
-       add     $sizevmarg,%r14           /* goto next argument block             */
-       dec     %r15                      /* are there any arguments left?        */
-       jz      L_copy_done               /* no test needed after dec             */
-
-       andb    $0x02,offvmargtype(%r14)    /* is this a float/double type?       */
-       jnz     L_stack_handle_float
-       dec     %r12                        /* arguments assigned to registers    */
-       jge     L_stack_copy_loop
-       jmp     L_stack_copy
-
-L_stack_handle_float:
-       dec     %r13                        /* arguments assigned to registers    */
-       jge     L_stack_copy_loop
-
-L_stack_copy:
-       mov     offvmargdata(%r14),itmp3    /* copy s8 argument onto stack        */
-       mov     itmp3,0(%rbx)
-       add     $8,%rbx                     /* increase sp to next argument       */
-       jmp     L_stack_copy_loop
-
-L_copy_done:
-                                           /* itmp1 still contains method pointer*/
-       lea     L_asm_call_jit_compiler(%rip),mptr
-       mov     sp,itmp3                    /* calculate the old stack pointer    */
-       add     bp,itmp3
-       mov     mptr,6*8(itmp3)
-       lea     (6*8-256)(itmp3),mptr       /* We subtract 256 to force the next  */
+       cmp     $0,itmp1l
+       jg      L_asm_vm_call_method_stack_copy_loop
+
+L_asm_vm_call_method_stack_copy_done:
+       lea     (6*8-256)(s0),mptr          /* We subtract 256 to force the next  */
                                            /* move instruction to have a 32-bit  */
                                            /* offset.                            */
 
-       mov     (0*8+256)(mptr),itmp3       /* method call as in Java             */
-       call    *itmp3                      /* call JIT compiler                  */
+       mov     (0*8+256)(mptr),itmp3       /* load PV                            */
+       call    *itmp3
 
-       add     bp,sp                       /* remove argument stack frame if any */
+       mov     s0,sp                       /* restore SP                         */
 
 L_asm_vm_call_method_return:
        mov     0*8(sp),%rbx                /* restore callee saved registers     */
@@ -228,73 +190,10 @@ asm_vm_call_method_exception_handler:
        call    builtin_throw_exception@PLT
        jmp     L_asm_vm_call_method_return
 
-
-jumptable_integer:
-       .quad   handle_a0
-       .quad   handle_a1
-       .quad   handle_a2
-       .quad   handle_a3
-       .quad   handle_a4
-       .quad   handle_a5
-
-handle_a0:
-       mov     offvmargdata(itmp2),a0
-       jmp     L_register_copy
-handle_a1:
-       mov     offvmargdata(itmp2),a1
-       jmp     L_register_copy
-handle_a2:
-       mov     offvmargdata(itmp2),a2
-       jmp     L_register_copy
-handle_a3:
-       mov     offvmargdata(itmp2),a3
-       jmp     L_register_copy
-handle_a4:
-       mov     offvmargdata(itmp2),a4
-       jmp     L_register_copy
-handle_a5:
-       mov     offvmargdata(itmp2),a5
-       jmp     L_register_copy
-
-
-jumptable_float:
-       .quad   handle_fa0
-       .quad   handle_fa1
-       .quad   handle_fa2
-       .quad   handle_fa3
-       .quad   handle_fa4
-       .quad   handle_fa5
-       .quad   handle_fa6
-       .quad   handle_fa7
-
-handle_fa0:
-       movq    offvmargdata(itmp2),fa0
-       jmp     L_register_copy
-handle_fa1:
-       movq    offvmargdata(itmp2),fa1
-       jmp     L_register_copy
-handle_fa2:
-       movq    offvmargdata(itmp2),fa2
-       jmp     L_register_copy
-handle_fa3:
-       movq    offvmargdata(itmp2),fa3
-       jmp     L_register_copy
-handle_fa4:
-       movq    offvmargdata(itmp2),fa4
-       jmp     L_register_copy
-handle_fa5:
-       movq    offvmargdata(itmp2),fa5
-       jmp     L_register_copy
-handle_fa6:
-       movq    offvmargdata(itmp2),fa6
-       jmp     L_register_copy
-handle_fa7:
-       movq    offvmargdata(itmp2),fa7
-       jmp     L_register_copy
-
 asm_vm_call_method_end:
        nop
 
+
 /****************** function asm_call_jit_compiler *****************************
 *                                                                              *
 *   invokes the compiler for untranslated JavaVM methods.                      *
index cc8237c629b55bbdf3ded35bdb0fb632e773b93f..1e343cbd18f7e4f1c5bff3426317e253027197ed 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 7713 2007-04-15 21:49:48Z twisti $
+   $Id: md-abi.c 8080 2007-06-14 11:12:11Z twisti $
 
 */
 
@@ -147,11 +147,13 @@ void md_param_alloc(methoddesc *md)
                case TYPE_LNG:
                        if (iarg < INT_ARG_CNT) {
                                pd->inmemory = false;
+                               pd->index    = iarg;
                                pd->regoff   = abi_registers_integer_argument[iarg];
                                iarg++;
                        }
                        else {
                                pd->inmemory = true;
+                               pd->index    = -1;
                                pd->regoff   = stacksize;
                                stacksize++;
                        }
@@ -161,11 +163,13 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (farg < FLT_ARG_CNT) {
                                pd->inmemory = false;
+                               pd->index    = farg;
                                pd->regoff   = abi_registers_float_argument[farg];
                                farg++;
                        }
                        else {
                                pd->inmemory = true;
+                               pd->index    = -1;
                                pd->regoff   = stacksize;
                                stacksize++;
                        }
index 3ffff7a96508a0576ff67fb429d6ecb4303dda46..3a5973644e25e66c3dada39d1b6613eedc4fcc30 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: vm.c 8079 2007-06-14 11:06:48Z twisti $
+   $Id: vm.c 8080 2007-06-14 11:12:11Z twisti $
 
 */
 
@@ -2477,7 +2477,7 @@ static void vm_array_store_adr(uint64_t *array, paramdesc *pd, void *value)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 static void vm_vmargs_from_valist(methodinfo *m, java_objectheader *o,
                                                                  vm_arg *vmargs, va_list ap)
 {
@@ -2613,7 +2613,7 @@ uint64_t *vm_array_from_valist(methodinfo *m, java_objectheader *o, va_list ap)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 static void vm_vmargs_from_jvalue(methodinfo *m, java_objectheader *o,
                                                                  vm_arg *vmargs, jvalue *args)
 {
@@ -2739,7 +2739,7 @@ static uint64_t *vm_array_from_jvalue(methodinfo *m, java_objectheader *o,
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 bool vm_vmargs_from_objectarray(methodinfo *m, java_objectheader *o,
                                                                vm_arg *vmargs, java_objectarray *params)
 {
@@ -3142,7 +3142,7 @@ java_objectheader *vm_call_method(methodinfo *m, java_objectheader *o, ...)
 java_objectheader *vm_call_method_valist(methodinfo *m, java_objectheader *o,
                                                                                 va_list ap)
 {
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
        s4                 vmargscount;
        vm_arg            *vmargs;
        java_objectheader *ro;
@@ -3209,7 +3209,7 @@ java_objectheader *vm_call_method_valist(methodinfo *m, java_objectheader *o,
 java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
                                                                                 jvalue *args)
 {
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
        s4                 vmargscount;
        vm_arg            *vmargs;
        java_objectheader *ro;
@@ -3273,7 +3273,7 @@ java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 java_objectheader *vm_call_method_vmarg(methodinfo *m, s4 vmargscount,
                                                                                vm_arg *vmargs)
 {
@@ -3333,7 +3333,7 @@ java_objectheader *vm_call_array(methodinfo *m, uint64_t *array)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 s4 vm_call_method_int_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
 {
        s4 i;
@@ -3412,7 +3412,7 @@ s4 vm_call_method_int(methodinfo *m, java_objectheader *o, ...)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 s4 vm_call_method_int_valist(methodinfo *m, java_objectheader *o, va_list ap)
 {
        s4      vmargscount;
@@ -3481,7 +3481,7 @@ int32_t vm_call_method_int_valist(methodinfo *m, java_objectheader *o, va_list a
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 s4 vm_call_method_int_jvalue(methodinfo *m, java_objectheader *o, jvalue *args)
 {
        s4      vmargscount;
@@ -3570,7 +3570,7 @@ s8 vm_call_method_long(methodinfo *m, java_objectheader *o, ...)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 s8 vm_call_method_long_valist(methodinfo *m, java_objectheader *o, va_list ap)
 {
        s4      vmargscount;
@@ -3639,7 +3639,7 @@ int64_t vm_call_method_long_valist(methodinfo *m, java_objectheader *o, va_list
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 s8 vm_call_method_long_jvalue(methodinfo *m, java_objectheader *o, jvalue *args)
 {
        s4      vmargscount;
@@ -3708,7 +3708,7 @@ int64_t vm_call_method_long_jvalue(methodinfo *m, java_objectheader *o, jvalue *
 
 *******************************************************************************/
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 s8 vm_call_method_long_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
 {
        s8 l;
index ee0010beba85787819e9565f97ee8e5ae55c3039..850d2bb44ad32d91c90fc7bfcd8257e90bd92c4c 100644 (file)
@@ -104,7 +104,7 @@ void vm_exit_handler(void);
 void vm_abort(const char *text, ...);
 
 /* Java method calling functions */
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 bool vm_vmargs_from_objectarray(methodinfo *m, java_objectheader *o,
                                                                vm_arg *vmargs, java_objectarray *params);
 #else
@@ -118,7 +118,7 @@ java_objectheader *vm_call_method_valist(methodinfo *m, java_objectheader *o,
 java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
                                                                                 jvalue *args);
 
-#if !defined(__MIPS__)
+#if !defined(__MIPS__) && !defined(__X86_64__)
 java_objectheader *vm_call_method_vmarg(methodinfo *m, s4 vmargscount,
                                                                                vm_arg *vmargs);
 s4 vm_call_method_int_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs);