1 /* jit/x86_64/asmpart.S - Java-C interface functions for x86_64
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 Institut f. Computersprachen, TU Wien
5 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
6 S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
9 This file is part of CACAO.
11 This program is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as
13 published by the Free Software Foundation; either version 2, or (at
14 your option) any later version.
16 This program is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 Contact: cacao@complang.tuwien.ac.at
28 Authors: Andreas Krall
32 $Id: asmpart.S 713 2003-12-07 20:40:43Z twisti $
42 /********************* exported functions and variables ***********************/
44 .globl asm_calljavamethod
45 .globl asm_calljavafunction
46 .globl asm_calljavafunction2
47 .globl asm_calljavafunction2long
48 .globl asm_calljavafunction2double
49 .globl asm_call_jit_compiler
50 .globl asm_dumpregistersandcall
51 .globl asm_handle_exception
52 .globl asm_handle_nat_exception
53 .globl asm_builtin_checkcast
54 .globl asm_builtin_checkarraycast
55 .globl asm_builtin_anewarray
56 .globl asm_builtin_newarray_array
57 .globl asm_builtin_aastore
58 .globl asm_builtin_monitorenter
59 .globl asm_builtin_monitorexit
60 .globl asm_builtin_f2i
61 .globl asm_builtin_f2l
62 .globl asm_builtin_d2i
63 .globl asm_builtin_d2l
64 .globl asm_builtin_arrayinstanceof
65 .globl asm_perform_threadswitch
66 .globl asm_initialize_thread_stack
67 .globl asm_switchstackandcall
68 .globl asm_getcallingmethod
69 .globl asm_builtin_trace
70 .globl asm_builtin_exittrace
72 /*************************** imported functions *******************************/
75 .globl builtin_monitorexit
76 .globl builtin_throw_exception
77 .globl builtin_trace_exception
81 /********************* function asm_calljavamethod *****************************
83 * This function calls a Java-method (which possibly needs compilation) *
84 * with up to 4 parameters. *
86 * This functions calls the JIT-compiler which eventually translates the *
87 * method into machine code. *
89 * An possibly throwed exception will be returned to the caller as function *
90 * return value, so the java method cannot return a fucntion value (this *
91 * function usually calls 'main' and '<clinit>' which do not return a *
95 * javaobject_header *asm_calljavamethod (methodinfo *m, *
96 * void *arg1, void *arg2, void *arg3, void *arg4); *
98 *******************************************************************************/
100 #define MethodPointer -8
101 #define FrameSize -12
106 #define ExTableSize -32
107 #define ExTableStart -32
109 #define ExEntrySize -32
112 #define ExHandlerPC -24
113 #define ExCatchType -32
116 .ascii "calljavamethod\0\0"
119 .quad 0 /* catch type all */
120 .quad calljava_xhandler /* handler pc */
121 .quad calljava_xhandler /* end pc */
122 .quad asm_calljavamethod /* start pc */
123 .long 1 /* extable size */
124 .long 0 /* fltsave */
125 .long 0 /* intsave */
128 .long 8 /* frame size */
129 .quad 0 /* method pointer (pointer to name) */
132 sub $8,%rsp /* keep %rsp 16-byte aligned */
135 mov %rdi,%rax /* move function pointer to %rax */
136 /* compilerstub uses this */
138 mov %rsi,%rdi /* pass remaining parameters */
143 lea asm_call_jit_compiler,%r11
144 call *%r11 /* call JIT compiler */
151 add $8,%rsp /* keep %rsp 16-byte aligned */
155 mov %rax,%rdi /* pass exception pointer */
156 call builtin_throw_exception
162 /********************* function asm_calljavafunction ***************************
164 * This function calls a Java-method (which possibly needs compilation) *
165 * with up to 4 address parameters. *
167 * This functions calls the JIT-compiler which eventually translates the *
168 * method into machine code. *
171 * javaobject_header *asm_calljavamethod (methodinfo *m, *
172 * void *arg1, void *arg2, void *arg3, void *arg4); *
174 *******************************************************************************/
177 .ascii "calljavafunction\0\0"
180 .quad 0 /* catch type all */
181 .quad calljava_xhandler2 /* handler pc */
182 .quad calljava_xhandler2 /* end pc */
183 .quad asm_calljavafunction /* start pc */
184 .long 1 /* extable size */
185 .long 0 /* fltsave */
186 .long 0 /* intsave */
189 .long 8 /* frame size */
190 .quad 0 /* method pointer (pointer to name) */
192 asm_calljavafunction:
193 sub $8,%rsp /* keep stack 16-byte aligned */
195 mov %rdi,%rax /* move function pointer to %rax */
196 /* compilerstub uses this */
198 mov %rsi,%rdi /* pass remaining parameters */
203 lea asm_call_jit_compiler,%r11
204 call *%r11 /* call JIT compiler */
210 add $8,%rsp /* free stack space */
214 mov %rax,%rdi /* pass exception pointer */
215 call builtin_throw_exception
221 /********************* function asm_calljavafunction ***************************
223 * This function calls a Java-method (which possibly needs compilation) *
224 * with up to 4 address parameters. *
226 * This functions calls the JIT-compiler which eventually translates the *
227 * method into machine code. *
230 * javaobject_header *asm_calljavamethod (methodinfo *m, *
231 * void *arg1, void *arg2, void *arg3, void *arg4); *
233 *******************************************************************************/
236 .ascii "calljavafunction2\0\0"
239 .quad 0 /* catch type all */
240 .quad calljava_xhandler3 /* handler pc */
241 .quad calljava_xhandler3 /* end pc */
242 .quad asm_calljavafunction2 /* start pc */
243 .long 1 /* extable size */
244 .long 0 /* fltsave */
245 .long 0 /* intsave */
248 .long 8 /* frame size */
249 .quad 0 /* method pointer (pointer to name) */
251 asm_calljavafunction2:
252 asm_calljavafunction2double:
253 asm_calljavafunction2long:
254 sub $8,%rsp /* keep stack 16-byte aligned */
256 mov %rdi,%rax /* save method pointer for compiler */
257 mov %rcx,%r10 /* pointer to arg block */
259 mov offjniitem(%r10),%rdi /* move args into registers */
260 mov offjniitem + sizejniblock * 1(%r10),%rsi
261 mov offjniitem + sizejniblock * 2(%r10),%rdx
262 mov offjniitem + sizejniblock * 3(%r10),%rcx
264 lea asm_call_jit_compiler,%r11
265 call *%r11 /* call JIT compiler */
270 add $8,%rsp /* free stack space */
274 mov %rax,%rdi /* pass exception pointer */
275 call builtin_throw_exception
280 /****************** function asm_call_jit_compiler *****************************
282 * invokes the compiler for untranslated JavaVM methods. *
284 * Register R0 contains a pointer to the method info structure (prepared *
285 * by createcompilerstub). Using the return address in R26 and the *
286 * offset in the LDA instruction or using the value in methodptr R28 the *
287 * patching address for storing the method address can be computed: *
289 * method address was either loaded using *
291 * i386_mov_imm_reg(a, REG_ITMP2) ; invokestatic/special *
292 * i386_call_reg(REG_ITMP2) *
296 * i386_mov_membase_reg(REG_SP, 0, REG_ITMP2) ; invokevirtual/interface *
297 * i386_mov_membase_reg(REG_ITMP2, OFFSET(, vftbl), REG_ITMP3) *
298 * i386_mov_membase_reg(REG_ITMP3, OFFSET(vftbl, table[0]) + \ *
299 * sizeof(methodptr) * m->vftblindex, REG_ITMP1) *
300 * i386_call_reg(REG_ITMP1) *
302 * in the static case the method pointer can be computed using the *
303 * return address and the lda function following the jmp instruction *
305 *******************************************************************************/
308 asm_call_jit_compiler:
309 sub $8,%rsp /* keep stack 16-byte aligned */
311 mov %rbx,(%rsp) /* save register */
313 mov 8(%rsp),%r11 /* get return address */
314 mov -1(%r11),%bl /* get function code */
315 cmp $0xd2,%bl /* called with `call *REG_ITMP2' (%r10)? */
316 jne L_not_static_special
318 sub $11,%r11 /* calculate address of immediate */
319 jmp L_call_jit_compile
321 L_not_static_special:
322 cmp $0xd0,%bl /* called with `call *REG_ITMP1' (%rax) */
323 jne L_not_virtual_interface
325 sub $7,%r11 /* calculate address of offset */
326 mov (%r11),%r11d /* get offset (32-bit) */
327 add %r10,%r11 /* add base address to get method address */
328 jmp L_call_jit_compile
330 L_not_virtual_interface: /* a call from asm_calljavamethod */
334 mov (%rsp),%rbx /* restore register */
336 sub $(24*8),%rsp /* 8 + 48 + 64 + 64 */
338 mov %r11,0*8(%rsp) /* save address for method pointer */
340 mov %rdi,1*8(%rsp) /* save arguments */
350 movq %xmm3,10*8(%rsp)
351 movq %xmm4,11*8(%rsp)
352 movq %xmm5,12*8(%rsp)
353 movq %xmm6,13*8(%rsp)
354 movq %xmm7,14*8(%rsp)
356 movq %xmm8,15*8(%rsp) /* we use them as callee saved registers */
357 movq %xmm9,16*8(%rsp)
358 movq %xmm10,17*8(%rsp)
359 movq %xmm11,18*8(%rsp)
360 movq %xmm12,19*8(%rsp)
361 movq %xmm13,20*8(%rsp)
362 movq %xmm14,21*8(%rsp)
363 movq %xmm15,22*8(%rsp)
365 mov %rax,%rdi /* pass method pointer */
380 movq 10*8(%rsp),%xmm3
381 movq 11*8(%rsp),%xmm4
382 movq 12*8(%rsp),%xmm5
383 movq 13*8(%rsp),%xmm6
384 movq 14*8(%rsp),%xmm7
386 movq 15*8(%rsp),%xmm8
387 movq 16*8(%rsp),%xmm9
388 movq 17*8(%rsp),%xmm10
389 movq 18*8(%rsp),%xmm11
390 movq 19*8(%rsp),%xmm12
391 movq 20*8(%rsp),%xmm13
392 movq 21*8(%rsp),%xmm14
393 movq 22*8(%rsp),%xmm15
397 test %r11,%r11 /* is address == 0 (asm_calljavamethod) */
400 mov %rax,(%r11) /* and now save the new pointer */
403 add $8,%rsp /* keep stack 16-byte aligned */
404 jmp *%rax /* ...and now call the new method */
408 /****************** function asm_dumpregistersandcall **************************
410 * This funtion saves all callee saved registers and calls the function *
411 * which is passed as parameter. *
413 * This function is needed by the garbage collector, which needs to access *
414 * all registers which are stored on the stack. Unused registers are *
415 * cleared to avoid interferances with the GC. *
417 * void asm_dumpregistersandcall (functionptr f); *
419 *******************************************************************************/
421 asm_dumpregistersandcall:
422 sub $(7*8),%rsp /* allocate stack space */
424 mov %rbx,0*8(%rsp) /* save all callee saved registers */
432 xor %rax,%rax /* intialize the remaining registers */
441 call *%rdi /* call function */
455 /********************* function asm_handle_exception ***************************
457 * This function handles an exception. It does not use the usual calling *
458 * conventions. The exception pointer is passed in REG_ITMP1 and the *
459 * pc from the exception raising position is passed in REG_ITMP2. It searches *
460 * the local exception table for a handler. If no one is found, it unwinds *
461 * stacks and continues searching the callers. *
463 * void asm_handle_exception (exceptionptr, exceptionpc); *
465 *******************************************************************************/
467 asm_handle_nat_exception:
468 add $8,%rsp /* clear return address of native stub */
470 asm_handle_exception:
472 mov %rax,0*8(%rsp) /* save exception pointer */
473 mov %r10,1*8(%rsp) /* save exception pc */
475 mov %r10,%rdi /* exception pc */
478 mov %rax,2*8(%rsp) /* save data segment pointer */
480 mov 0*8(%rsp),%rax /* restore exception pointer */
481 mov 1*8(%rsp),%r10 /* restore exception pc */
484 mov %rax,%rdi /* exception pointer */
485 mov MethodPointer(%r11),%rsi /* method pointer */
486 mov %r10,%rdx /* exception pc */
487 mov $1,%rcx /* set no unwind flag */
488 call builtin_trace_exception
490 mov 2*8(%rsp),%r11 /* %r11 = data segment pointer */
491 mov ExTableSize(%r11),%rcx /* %rcx = exception table size */
492 test %rcx,%rcx /* if empty table skip */
495 lea ExTableStart(%r11),%rdi /* %rdi = start of exception table */
496 mov 0*8(%rsp),%rax /* get xptr */
499 mov 1*8(%rsp),%r10 /* get xpc */
501 mov ExStartPC(%rdi),%rdx /* %rdx = exception start pc */
502 cmp %r10,%rdx /* %rdx = (startpc <= xpc) */
503 jg ex_table_cont /* if (false) continue */
504 mov ExEndPC(%rdi),%rdx /* %rdx = exception end pc */
505 cmp %rdx,%r10 /* %rdx = (xpc < endpc) */
506 jge ex_table_cont /* if (false) continue */
507 mov ExCatchType(%rdi),%rdx /* %rdx = exception catch type */
508 test %rdx,%rdx /* NULL catches everything */
511 mov offobjvftbl(%rax),%rsi /* %rsi = vftblptr(xptr) */
512 mov offclassvftbl(%rdx),%rdx /* %rdx = vftblptr(catchtype) class (not obj) */
513 mov offbaseval(%rsi),%esi /* %esi = baseval(xptr) */
514 mov offbaseval(%rdx),%r10d /* %r10d = baseval(catchtype) */
515 mov offdiffval(%rdx),%edx /* %edx = diffval(catchtype) */
516 sub %r10d,%esi /* %esi = baseval(xptr) - baseval(catchtype) */
517 cmp %edx,%esi /* xptr is instanceof catchtype */
521 mov ExHandlerPC(%rdi),%r10 /* xpc = exception handler pc */
523 mov 0*8(%rsp),%rax /* restore exception pointer */
524 add $(4*8),%rsp /* free stack frame */
526 jmp *%r10 /* jump to the handler */
529 lea ExEntrySize(%rdi),%rdi /* next exception table entry */
530 dec %rcx /* decrement entry counter */
531 test %rcx,%rcx /* if (t0 > 0) next entry */
535 mov 0*8(%rsp),%rax /* restore exception pointer */
536 mov 1*8(%rsp),%r10 /* restore exception pc */
537 mov 2*8(%rsp),%r11 /* restore data segment pointer */
540 mov %rax,%rcx /* save exception pointer */
543 movl IsSync(%r11),%eax /* %rax = SyncOffset */
544 test %rax,%rax /* if zero no monitorexit */
555 call builtin_monitorexit
563 mov FrameSize(%r11),%eax /* %eax = frame size */
564 add %rax,%rsp /* unwind stack */
565 mov %rsp,%rax /* %rax = pointer to save area */
567 mov IntSave(%r11),%edx /* %edx = saved int register count */
594 shl $3,%edx /* multiply by 8 bytes */
598 mov FltSave(%r11),%edx /* %edx = saved flt register count */
621 movq -48(%rax),%xmm10
623 movq -40(%rax),%xmm11
625 movq -32(%rax),%xmm12
627 movq -24(%rax),%xmm13
629 movq -16(%rax),%xmm14
634 pop %r10 /* the new xpc is return address */
635 sub $3,%r10 /* subtract 3 bytes for call */
642 call findmethod /* get the new data segment ptr */
649 mov %rcx,%rax /* restore saved exception pointer */
653 mov %rax,0*8(%rsp) /* save exception pointer */
654 mov %r10,1*8(%rsp) /* save exception pc */
655 mov %r11,2*8(%rsp) /* save data segment pointer */
660 /********************* function asm_builtin_monitorenter ***********************
662 * Does null check and calls monitorenter or throws an exception *
664 *******************************************************************************/
666 asm_builtin_monitorenter:
668 je nb_monitorenter /* if (null) throw exception */
669 jmp builtin_monitorenter /* else call builtin_monitorenter */
672 pop %r10 /* delete return address */
673 sub $3,%r10 /* faulting address is return adress - 3 */
674 mov proto_java_lang_NullPointerException,%rax
675 jmp asm_handle_exception
678 /********************* function asm_builtin_monitorexit ************************
680 * Does null check and calls monitorexit or throws an exception *
682 *******************************************************************************/
684 asm_builtin_monitorexit:
686 je nb_monitorexit /* if (null) throw exception */
687 jmp builtin_monitorexit /* else call builtin_monitorenter */
690 pop %r10 /* delete return address */
691 sub $3,%r10 /* faulting address is return adress - 3 */
692 mov proto_java_lang_NullPointerException,%rax
693 jmp asm_handle_exception
696 /********************* function asm_builtin_x2x ********************************
698 * Wrapper functions for float to int corner cases *
700 *******************************************************************************/
716 movq %xmm4,10*8(%rsp)
717 movq %xmm5,11*8(%rsp)
718 movq %xmm6,12*8(%rsp)
719 movq %xmm7,13*8(%rsp)
735 movq 10*8(%rsp),%xmm4
736 movq 11*8(%rsp),%xmm5
737 movq 12*8(%rsp),%xmm6
738 movq 13*8(%rsp),%xmm7
757 movq %xmm4,10*8(%rsp)
758 movq %xmm5,11*8(%rsp)
759 movq %xmm6,12*8(%rsp)
760 movq %xmm7,13*8(%rsp)
776 movq 10*8(%rsp),%xmm4
777 movq 11*8(%rsp),%xmm5
778 movq 12*8(%rsp),%xmm6
779 movq 13*8(%rsp),%xmm7
799 movq %xmm4,10*8(%rsp)
800 movq %xmm5,11*8(%rsp)
801 movq %xmm6,12*8(%rsp)
802 movq %xmm7,13*8(%rsp)
818 movq 10*8(%rsp),%xmm4
819 movq 11*8(%rsp),%xmm5
820 movq 12*8(%rsp),%xmm6
821 movq 13*8(%rsp),%xmm7
841 movq %xmm4,10*8(%rsp)
842 movq %xmm5,11*8(%rsp)
843 movq %xmm6,12*8(%rsp)
844 movq %xmm7,13*8(%rsp)
860 movq 10*8(%rsp),%xmm4
861 movq 11*8(%rsp),%xmm5
862 movq 12*8(%rsp),%xmm6
863 movq 13*8(%rsp),%xmm7
869 /*********************** function new_builtin_checkcast ************************
871 * Does the cast check and eventually throws an exception *
873 *******************************************************************************/
875 asm_builtin_checkcast:
881 /******************* function asm_builtin_checkarraycast ***********************
883 * Does the cast check and eventually throws an exception *
885 *******************************************************************************/
887 asm_builtin_checkarraycast:
888 sub $24,%rsp /* keep stack 16-byte aligned */
889 mov %rdi,(%rsp) /* save object pointer */
890 call builtin_checkarraycast /* builtin_checkarraycast */
891 test %rax,%rax /* if (false) throw exception */
893 mov (%rsp),%rax /* return object pointer */
894 add $24,%rsp /* free stack space */
899 pop %r10 /* delete return address */
900 sub $3,%r10 /* faulting address is return adress - 3 */
901 mov proto_java_lang_ClassCastException,%rax
902 jmp asm_handle_exception
905 /******************* function asm_builtin_aastore ******************************
907 * Does the cast check and eventually throws an exception *
909 *******************************************************************************/
912 sub $24,%rsp /* allocate stack space */
913 test %rdi,%rdi /* if null pointer throw exception */
916 movl offarraysize(%rdi),%eax /* load size */
917 cmpl %eax,%esi /* do bound check */
918 ja nb_aastore_bound /* if out of bounds throw exception */
920 shl $3,%rsi /* index * 8 */
922 add %rsi,%r10 /* add index * 8 to arrayref */
924 mov %r10,(%rsp) /* save store position */
925 mov %rdx,8(%rsp) /* save object */
927 mov %rdx,%rsi /* object is second argument */
928 call builtin_canstore /* builtin_canstore(arrayref,object) */
929 test %rax,%rax /* if (false) throw exception */
932 mov (%rsp),%r10 /* restore store position */
933 mov 8(%rsp),%rdx /* restore object */
934 mov %rdx,offobjarrdata(%r10)/* store objectptr in array */
935 add $24,%rsp /* free stack space */
940 pop %r10 /* delete return address */
941 sub $3,%r10 /* faulting address is return adress - 3 */
943 mov proto_java_lang_NullPointerException,%rax
944 jmp asm_handle_exception
948 pop %r10 /* delete return address */
949 sub $3,%r10 /* faulting address is return adress - 3 */
951 mov proto_java_lang_ArrayIndexOutOfBoundsException,%rax
952 jmp asm_handle_exception
956 pop %r10 /* delete return address */
957 sub $3,%r10 /* faulting address is return adress - 3 */
959 mov proto_java_lang_ArrayStoreException,%rax
960 jmp asm_handle_exception
963 /******************* function asm_initialize_thread_stack **********************
965 * initialized a thread stack *
966 * (to)->restorePoint = asm_initialize_thread_stack((u1*)(func), (to)->stackEnd)*
968 *******************************************************************************/
970 asm_initialize_thread_stack:
981 mov %rdi,6*8(%rsi) /* save (u1*) (func) */
982 mov %rsi,%rax /* return restorepoint in %rax */
986 /******************* function asm_perform_threadswitch *************************
988 * void asm_perform_threadswitch (u1 **from, u1 **to, u1 **stackTop); *
990 * performs a threadswitch *
992 *******************************************************************************/
994 asm_perform_threadswitch:
995 sub $(7*8),%rsp /* allocate stack frame */
1004 mov 7*8(%rsp),%rax /* save current return address */
1007 mov %rsp,(%rdi) /* first argument **from */
1008 mov %rsp,(%rdx) /* third argument **stackTop */
1010 mov (%rsi),%rsp /* load new stack pointer */
1019 mov 6*8(%rsp),%rax /* restore return address */
1020 add $(7*8),%rsp /* free stack frame */
1025 /********************* function asm_switchstackandcall *************************
1027 * int asm_switchstackandcall (void *stack, void *func, void **stacktopsave, *
1030 * Switches to a new stack, calls a function and switches back. *
1031 * a0 (%rdi) new stack pointer *
1032 * a1 (%rsi) function pointer *
1033 * a2 (%rdx) pointer to variable where stack top should be stored *
1034 * a3 (%rcx) pointer to user data, is passed to the function *
1036 *******************************************************************************/
1038 asm_switchstackandcall:
1039 sub $8,%rsp /* keep stack 16-byte aligned */
1040 sub $16,%rdi /* allocate new stack */
1042 mov 8(%rsp),%rax /* save return address on new stack */
1044 mov %rsp,8(%rdi) /* save old stack pointer on new stack */
1045 mov %rsp,(%rdx) /* save old stack pointer to variable */
1047 mov %rdi,%rsp /* switch to new stack */
1049 mov %rcx,%rdi /* pass pointer */
1050 call *%rsi /* and call function */
1052 mov (%rsp),%r10 /* load return address */
1053 mov 8(%rsp),%rsp /* switch to old stack */
1054 add $8,%rsp /* free stack space */
1055 mov %r10,(%rsp) /* write return adress */
1059 /********************* function asm_getcallingmethod ***************************
1061 * classinfo *asm_getcallingmethod (); *
1063 * goes back stack frames to get the calling method *
1072 * Java_java_lang_System_getCallerClass *
1074 *******************************************************************************/
1076 asm_getcallingmethod:
1077 mov %rbp,%rax /* return address of native function */
1078 add $(2*8),%rax /* %rsp, return address */
1079 add $(7*8),%rax /* native stub stackframe */
1080 mov (%rax),%rdi /* return address to java function */
1082 mov MethodPointer(%rax),%rax
1086 /*********************** function asm_builtin_trace ****************************
1088 * Intended to be called from the native stub. Saves all argument registers *
1089 * and calls builtin_trace_args. *
1091 *******************************************************************************/
1094 sub $(15*8),%rsp /* 14 + 1 */
1096 mov %rdi,0*8(%rsp) /* save arguments */
1103 movq %xmm0,6*8(%rsp)
1104 movq %xmm1,7*8(%rsp)
1105 movq %xmm2,8*8(%rsp)
1106 movq %xmm3,9*8(%rsp)
1107 movq %xmm4,10*8(%rsp)
1108 movq %xmm5,11*8(%rsp)
1109 movq %xmm6,12*8(%rsp)
1110 movq %xmm7,13*8(%rsp)
1112 call builtin_trace_args
1121 movq 6*8(%rsp),%xmm0
1122 movq 7*8(%rsp),%xmm1
1123 movq 8*8(%rsp),%xmm2
1124 movq 9*8(%rsp),%xmm3
1125 movq 10*8(%rsp),%xmm4
1126 movq 11*8(%rsp),%xmm5
1127 movq 12*8(%rsp),%xmm6
1128 movq 13*8(%rsp),%xmm7
1134 /********************* function asm_builtin_exittrace **************************
1136 * Intended to be called from the native stub. Saves return value and calls *
1137 * builtin_displaymethodstop. *
1139 *******************************************************************************/
1141 asm_builtin_exittrace:
1144 movq %xmm0,1*8(%rsp)
1146 call builtin_displaymethodstop
1148 movq 1*8(%rsp),%xmm0
1194 * These are local overrides for various environment variables in Emacs.
1195 * Please do not remove this and leave it at the end of the file, where
1196 * Emacs will automagically detect them.
1197 * ---------------------------------------------------------------------
1200 * indent-tabs-mode: t