- sub $8,%rsp /* keep stack 16-byte aligned */
-
- mov %rdi,%rax /* save method pointer for compiler */
- mov %rcx,%r10 /* pointer to arg block */
-
- mov offjniitem(%r10),%rdi /* move args into registers */
- mov offjniitem + sizejniblock * 1(%r10),%rsi
- mov offjniitem + sizejniblock * 2(%r10),%rdx
- mov offjniitem + sizejniblock * 3(%r10),%rcx
-
- lea asm_call_jit_compiler,%r11
- call *%r11 /* call JIT compiler */
+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