1 /* src/vm/jit/m68k/asmpart.S - Java-C interface functions for m68k
3 Copyright (C) 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
32 #include "vm/jit/methodheader.h"
37 .globl asm_vm_call_method
38 .globl asm_vm_call_method_int
39 .globl asm_vm_call_method_long
40 .globl asm_vm_call_method_float
41 .globl asm_vm_call_method_double
42 .globl asm_vm_call_method_end
43 .globl asm_vm_call_method_exception_handler
45 .globl asm_abstractmethoderror
47 .globl asm_handle_exception
48 .globl asm_handle_nat_exception
51 * This functions implement the C prototyped funtion
52 * java_objectheader *asm_vm_call_method(methodinfo *m, s4 vmargscount,vm_arg *vmargs);
53 * the _int, _long, _float, _double are used for different return types
55 * The function may still be uncompiled, so the jit compiler gets invoked.
60 /* this is the method header see src/vm/jit/methodheader.h */
67 .long 0 /* frame size */
68 .long 0 /* codeinfo pointer */
72 This method gets called with 3 arguments:
73 1st arg: addres of method to call (fake invokevirtual here)
74 2nd arg: uint64_t array of argument registers followed by stack
75 3rd arg: number of 8 byte stack slots to be copied.
77 coldifire does not use any argument registers, so just the stack has to be copied
80 asm_vm_call_method_int:
81 asm_vm_call_method_long:
82 asm_vm_call_method_float:
83 asm_vm_call_method_double:
85 #if defined(ENABLE_SOFTFLOAT)
86 addal #(-12*4),%sp /* create stackframe to save registers, and 1 slot for method invocation */
87 moveml %d2/%d3/%d4/%d5/%d6/%d7/%a2/%a3/%a4/%a5/%fp,%sp@ /* save registers */
89 /* fetch arguments from vmargs data structure */
90 movel %sp@(12*4+1*4),%a3 /* method */
91 movel %sp@(12*4+2*4),%a2 /* arg array */
92 movel %sp@(12*4+3*4),%d2 /* arg count */
94 movel %a3, %sp@(11*4) /* copy method address to stackslot */
95 leal %sp@(11*4), %a3 /* and store that address in %a3 */
97 addal #(-12*4-6*8), %sp
98 moveml %d2/%d3/%d4/%d5/%d6/%d7/%a2/%a3/%a4/%a5/%fp,%sp@ /* save registers */
99 fmovemd %fp2/%fp3/%fp4/%fp5/%fp6/%fp7,%sp@(11*4) /* save registers */
101 /* fetch arguments from vmargs data structure */
102 movel %sp@(12*4+6*8+1*4),%a3 /* method */
103 movel %sp@(12*4+6*8+2*4),%a2 /* arg array */
104 movel %sp@(12*4+6*8+3*4),%d2 /* arg count */
106 movel %a3, %sp@(11*4+6*8) /* copy method address to stackslot */
107 leal %sp@(11*4+6*8), %a3 /* and store that address in %a3 */
110 moveal %sp, %a5 /* memorize stack */
112 tstl %d2 /* do we have arguments ? */
113 beq L_asm_vm_call_method_copy_done
114 movel %d2, %d3 /* create stackframe */
115 asll #3, %d3 /* number args * 8 */
117 moveal %sp, %a4 /* %a4 is temp stack pointer */
119 L_asm_vm_call_method_copy_loop:
121 movel %d3, %a4@(0) /* copy 4 bytes */
123 movel %d3, %a4@(4) /* a whole stack slot has been copied */
128 tstl %d2 /* do we have more arguments ? */
129 beq L_asm_vm_call_method_copy_done
130 br L_asm_vm_call_method_copy_loop
133 L_asm_vm_call_method_copy_done:
134 /* now we fake method invocation as it would happen from invokevirtual */
135 /* this is needed as we patch the caller site, so we need a writeable slot */
136 /* %a3 points to the address containing the method, %a3 == REG_METHODPTR */
141 L_asm_vm_call_method_return:
142 movel %a5, %sp /* pop arguments off stack */
144 #if defined(ENABLE_SOFTFLOAT)
145 moveml %sp@, %d2/%d3/%d4/%d5/%d6/%d7/%a2/%a3/%a4/%a5/%fp /* restore registers */
146 addal #(12*4),%sp /* restore stack */
148 fmovemd %sp@(12*4), %fp2/%fp3/%fp4/%fp5/%fp6/%fp7 /* restore registers */
149 moveml %sp@, %d2/%d3/%d4/%d5/%d6/%d7/%a2/%a3/%a4/%a5/%fp /* restore registers */
150 addal #(12*4+6*8),%sp /* restore stack */
152 moveal %d0, %a0 /* XXX return value in %a0, too, gcc sometimes expects addresses in %a0, wired */
153 asm_vm_call_method_end: /* symbol needed to insert method into avl tree */
154 rts /* return to c code */
156 /* asm_vm_call_method_exception_handler ********************************************************************
158 * calls void *builtin_throw_exception(java_objectheader *xptr) when no other handler is appropiate
159 * this functions gets called indirectly from asm_handle_exception, which back then moved xptr to %a2
160 * clear software design is in the eye of the beholder.
161 ************************************************************************************************************/
162 asm_vm_call_method_exception_handler:
163 movel %a2, %sp@- /* push xptr argument */
164 jsr builtin_throw_exception
165 lea %sp@(4), %sp /* pop arg off stack */
166 jmp L_asm_vm_call_method_return
169 asm_abstractmethoderror:
171 /* asm_handle_exception ********************************************************
173 * This function handles an exception. It does not use the usual calling *
174 * conventions. The exception pointer is passed in REG_ATMP1 and the *
175 * pc from the exception raising position is passed in REG_ATMP2. It searches *
176 * the local exception table for a handler. If no one is found, it unwinds *
177 * stacks and continues searching the callers. *
179 * void asm_handle_exception (void);
180 * exception object pointer...%a2 exception raising address...%a3 *
182 *******************************************************************************/
183 asm_handle_nat_exception:
185 asm_handle_exception:
186 L_asm_handle_exception_stack_loop:
187 /* save temporary registers */
192 #if !defined(ENABLE_SOFTFLOAT)
194 fmovemd %fp0, %sp@(0)
195 fmovemd %fp1, %sp@(8)
198 /* we need the dseg, figure it out */
199 movel %a3, %sp@- /* push ra argument */
200 jsr md_asm_codegen_get_pv_from_pc /* pv in %d0 now */
201 movel %d0, %d2 /* move to safe register */
202 lea %sp@(4), %sp /* pop args off stack */
204 /* now call the following c function */
205 /* u1 *exceptions_handle_exception(java_objectheader *xptr, u1 *xpc, u1 *pv, u1 *sp) */
206 #if !defined(ENABLE_SOFTFLOAT)
214 jsr exceptions_handle_exception /* %d0 is address of handler or 0 when not catched */
215 lea %sp@(4*4), %sp /* pop args off stack */
217 beq L_asm_handle_exception_not_catched
219 /* %d0 contains address of exception handler */
222 /* restore temporary registers */
227 #if !defined(ENABLE_SOFTFLOAT)
228 fmovemd %fp0, %sp@(0)
229 fmovemd %fp1, %sp@(8)
235 L_asm_handle_exception_not_catched:
236 /* we did not find an exception handler in this stackframe */
237 /* remove this frame and search in the one above */
238 /* %a2 containts exception object ptr, %d2 the actual pv */
240 /* remove temporary registers stored */
241 #if !defined(ENABLE_SOFTFLOAT)
242 addal #4*4 + 8*2, %sp
248 movel %a3@(FrameSize), %d2
251 addal %d2, %a0 /* %a0 now points to top of stackframe, where saved regs are */
253 /* the saved registers have to be restored */
254 /* XXX ugly hack: intsave and adrsave share one field */
255 movel %a3@(IntSave), %d0
256 andil #0x0000ffff, %d0 /* this is IntSave */
258 beq L_asm_handle_ex_int_done
262 beq L_asm_handle_ex_int_done
266 beq L_asm_handle_ex_int_done
269 L_asm_handle_ex_int_done:
271 movel %a3@(IntSave), %d0
272 andil #0xffff0000, %d0 /* this is AdrSave */
278 beq L_asm_handle_ex_adr_done
282 beq L_asm_handle_ex_adr_done
286 beq L_asm_handle_ex_adr_done
290 L_asm_handle_ex_adr_done:
292 #if !defined(ENABLE_SOFTFLOAT)
293 movel %a3@(FltSave), %d0
295 beq L_asm_handle_ex_flt_done
296 fmovemd %a0@(-8), %fp7
299 beq L_asm_handle_ex_flt_done
300 fdmoved %a0@(-16), %fp6
303 beq L_asm_handle_ex_flt_done
304 fdmoved %a0@(-24), %fp5
306 L_asm_handle_ex_flt_done:
310 addal %d2, %sp /* remove old stackframe */
311 moveal %sp@+, %a3 /* make return address, new exception rasing address */
312 subal #2, %a3 /* it was a jsr %aX, which is 4 bytes long */
313 jmp L_asm_handle_exception_stack_loop
321 * These are local overrides for various environment variables in Emacs.
322 * Please do not remove this and leave it at the end of the file, where
323 * Emacs will automagically detect them.
324 * ---------------------------------------------------------------------
327 * indent-tabs-mode: t
331 * vim:noexpandtab:sw=4:ts=4: