- .quad 0 /* catch type all */
- .quad calljava_xhandler2 /* handler pc */
- .quad calljava_xhandler2 /* end pc */
- .quad asm_calljavafunction2 /* start pc */
- .long 1 /* extable size */
- .long 0
- .quad 0 /* line number table start */
- .quad 0 /* line number table size */
- .long 0
- .long 0 /* fltsave */
- .long 0 /* intsave */
- .long 0 /* isleaf */
- .long 0 /* IsSync */
- .long 24 /* frame size */
- .quad 0 /* method pointer (pointer to name) */
-
-asm_calljavafunction2:
-asm_calljavafunction2int:
-asm_calljavafunction2long:
-asm_calljavafunction2float:
-asm_calljavafunction2double:
- sub $(7*8),%rsp /* keep stack 16-byte aligned */
- mov %rbx,0*8(%rsp) /* %rbx is not a callee saved in cacao */
- mov %rbp,1*8(%rsp)
- mov %r12,2*8(%rsp)
- mov %r13,3*8(%rsp)
- mov %r14,4*8(%rsp)
- mov %r15,5*8(%rsp)
-
- mov %rdi,%rax /* move method pointer for compiler */
- xor %rbp,%rbp /* set argument stack frame to zero */
-
- test %rsi,%rsi /* maybe we have no args... */
- jle L_copy_done
-
- mov %rsi,itmp3 /* arg count */
- mov %rcx,itmp2 /* pointer to arg block */
-
- mov itmp2,%r14 /* save argument block pointer */
- mov itmp3,%r15 /* save argument count */
-
- sub $sizejniblock,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 */
-
-L_register_copy:
- add $sizejniblock,itmp2 /* goto next argument block */
- dec itmp3 /* argument count - 1 */
- jz L_register_copy_done
- andb $0x02,offjniitemtype(itmp2) /* is this a float/double type? */
- jnz L_register_handle_float /* yes, handle it */
-
- cmp $INT_ARG_CNT,%r12 /* are we out of integer argument */
- je L_register_copy /* register? yes, next loop */
-
- lea jumptable_integer,%rbp
- mov 0(%rbp,%r12,8),%rbx
- inc %r12 /* integer argument counter + 1 */
- jmp *%rbx
-
-L_register_handle_float:
- cmp $FLT_ARG_CNT,%r13 /* are we out of float argument */
- je L_register_copy /* register? yes, next loop */
-
- lea jumptable_float,%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,%rsp /* stack frame for arguments */
- mov %rsp,%rbx /* use %rbx as temp sp */
-
- sub $sizejniblock,%r14 /* initialize pointer (smaller code) */
- add $1,%r15 /* initialize argument count */
-
-L_stack_copy_loop:
- add $sizejniblock,%r14 /* goto next argument block */
- dec %r15 /* are there any arguments left? */
- jz L_copy_done /* no test needed after dec */
-
- andb $0x02,offjniitemtype(%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 offjniitem(%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:
- lea asm_call_jit_compiler,%r11/* %rax still contains method pointer */
- call *%r11 /* call JIT compiler */
-
- add %rbp,%rsp /* remove argument stack frame if any */
-
- mov 5*8(%rsp),%r15 /* restore callee saved registers */
- mov 4*8(%rsp),%r14
- mov 3*8(%rsp),%r13
- mov 2*8(%rsp),%r12
- mov 1*8(%rsp),%rbp
- mov 0*8(%rsp),%rbx
- add $(7*8),%rsp /* free stack space */
- ret
-
-calljava_xhandler2:
- mov %rax,%rdi /* pass exception pointer */
- call builtin_throw_exception
-
- mov 5*8(%rsp),%r15 /* restore callee saved registers */
- mov 4*8(%rsp),%r14
- mov 3*8(%rsp),%r13
- mov 2*8(%rsp),%r12
- mov 1*8(%rsp),%rbp
- mov 0*8(%rsp),%rbx
- add $(7*8),%rsp /* free stack space */
- xor %rax,%rax /* return NULL */
+ .long 0 /* fltsave */
+ .long 0 /* intsave */
+ .long 0 /* isleaf */
+ .long 0 /* frame size */
+ .quad 0 /* codeinfo pointer */
+
+asm_vm_call_method:
+asm_vm_call_method_int:
+asm_vm_call_method_long:
+asm_vm_call_method_float:
+asm_vm_call_method_double:
+ sub $(7*8),sp /* keep stack 16-byte aligned */
+ mov %rbx,0*8(sp) /* %rbx is not a callee saved in cacao*/
+ mov s0,1*8(sp)
+ mov s1,2*8(sp)
+ mov s2,3*8(sp)
+ mov s3,4*8(sp)
+ mov s4,5*8(sp)
+
+ mov a0,6*8(sp) /* store method PV */
+
+ mov sp,s0 /* save stack pointer */
+
+ mov a1,t0 /* address of data structure */
+ mov a2,itmp1 /* number of stack arguments */
+
+ 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
+
+ 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
+
+ cmp $0,itmp1l
+ je L_asm_vm_call_method_stack_copy_done
+
+ mov itmp1,itmp2
+ add $1,itmp2 /* keep stack 16-byte aligned */
+ and $0xfffffffffffffffe,itmp2
+ shl $3,itmp2 /* calculate stack size */
+ sub itmp2,sp /* create stack frame */
+ mov sp,itmp2 /* temporary stack pointer */
+
+L_asm_vm_call_method_stack_copy_loop:
+ mov 14*8(t0),itmp3 /* load argument */
+ mov itmp3,0(itmp2) /* store argument on stack */
+
+ sub $1,itmp1l /* subtract 1 argument */
+ add $8,t0 /* set address of next argument */
+ add $8,itmp2 /* increase SP */
+
+ 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 /* load PV */
+ call *itmp3
+
+L_asm_vm_call_method_return:
+ mov s0,sp /* restore SP */
+
+ mov 0*8(sp),%rbx /* restore callee saved registers */
+ mov 1*8(sp),s0
+ mov 2*8(sp),s1
+ mov 3*8(sp),s2
+ mov 4*8(sp),s3
+ mov 5*8(sp),s4
+ add $(7*8),sp /* free stack space */