1 /* src/vm/jit/alpha/asmpart.S - Java-C interface functions for alpha
3 Copyright (C) 1996-2005, 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
25 $Id: asmpart.S 8186 2007-07-05 23:48:16Z michi $
32 #include "vm/jit/alpha/md-abi.h"
33 #include "vm/jit/alpha/md-asm.h"
34 #include "vm/jit/alpha/offsets.h"
36 #include "vm/jit/abi-asm.h"
37 #include "vm/jit/methodheader.h"
45 /* export functions ***********************************************************/
47 .globl asm_vm_call_method
48 .globl asm_vm_call_method_int
49 .globl asm_vm_call_method_long
50 .globl asm_vm_call_method_float
51 .globl asm_vm_call_method_double
52 .globl asm_vm_call_method_exception_handler
53 .globl asm_vm_call_method_end
55 .globl asm_call_jit_compiler
57 .globl asm_handle_exception
58 .globl asm_handle_nat_exception
60 .globl asm_abstractmethoderror
62 #if defined(ENABLE_REPLACEMENT)
63 .globl asm_replacement_out
64 .globl asm_replacement_in
67 .globl asm_compare_and_swap
68 .globl asm_memory_barrier
70 .globl asm_criticalsections
71 .globl asm_getclassvalues_atomic
77 /* asm_vm_call_method **********************************************************
79 * This function calls a Java-method (which possibly needs compilation) *
80 * with up to 4 address parameters. *
82 * This functions calls the JIT-compiler which eventually translates the *
83 * method into machine code. *
86 * javaobject_header *asm_calljavafunction (methodinfo *m, *
87 * void *arg1, void *arg2, void *arg3, void *arg4); *
89 *******************************************************************************/
91 .ent asm_vm_call_method
95 .quad 0 /* catch type all */
96 .quad 0 /* handler pc */
98 .quad 0 /* start pc */
99 .long 1 /* extable size */
100 .long 0 /* ALIGNMENT PADDING */
101 .quad 0 /* line number table start */
102 .quad 0 /* line number table size */
103 .long 0 /* ALIGNMENT PADDING */
104 .long 0 /* fltsave */
105 .long 1 /* intsave */
108 .long 0 /* frame size */
109 .quad 0 /* codeinfo pointer */
112 asm_vm_call_method_int:
113 asm_vm_call_method_long:
114 asm_vm_call_method_float:
115 asm_vm_call_method_double:
117 lda sp,-5*8(sp) /* allocate stack space */
118 stq ra,0*8(sp) /* save return address */
119 stq gp,1*8(sp) /* save global pointer */
122 stq a0,4*8(sp) /* save method pointer for compiler */
124 mov a2,t0 /* pointer to arg block */
125 mov a1,s6 /* arg count */
127 ble s6,calljava_argsloaded
129 ldq a0,offvmargdata(t0)
130 ldt $f16,offvmargdata(t0)
131 ble s6,calljava_argsloaded
134 ldq a1,offvmargdata+sizevmarg*1(t0)
135 ldt $f17,offvmargdata+sizevmarg*1(t0)
136 ble s6,calljava_argsloaded
139 ldq a2,offvmargdata+sizevmarg*2(t0)
140 ldt $f18,offvmargdata+sizevmarg*2(t0)
141 ble s6,calljava_argsloaded
144 ldq a3,offvmargdata+sizevmarg*3(t0)
145 ldt $f19,offvmargdata+sizevmarg*3(t0)
146 ble s6,calljava_argsloaded
149 ldq a4,offvmargdata+sizevmarg*4(t0)
150 ldt $f20,offvmargdata+sizevmarg*4(t0)
151 ble s6,calljava_argsloaded
154 ldq a5,offvmargdata+sizevmarg*5(t0)
155 ldt $f21,offvmargdata+sizevmarg*5(t0)
158 ble s6,calljava_nocopy
164 ldq t3,offvmargdata+sizevmarg*6(t0)
169 bne t1,calljava_copyloop
172 ldq itmp1,4*8(t4) /* pass method pointer via itmp1 */
174 lda mptr,asm_call_jit_compiler/* fake virtual function call (2 instr) */
175 stq mptr,2*8(t4) /* store function address */
176 lda mptr,1*8(t4) /* set method pointer */
178 ldq pv,1*8(mptr) /* method call as in Java */
179 jmp ra,(pv) /* call JIT compiler */
181 lda pv,(asm_vm_call_method - calljava_jit2)(ra)
185 ldq ra,0*8(sp) /* restore return address */
186 ldq gp,1*8(sp) /* restore global pointer */
188 lda sp,5*8(sp) /* free stack space */
193 asm_vm_call_method_exception_handler:
195 ldq gp,1*8(sp) /* restore global pointer */
197 jsr ra,builtin_throw_exception
198 ldq ra,0*8(sp) /* restore return address */
200 lda sp,5*8(sp) /* free stack space */
201 asm_vm_call_method_end:
204 .end asm_vm_call_method
207 /* asm_call_jit_compiler *******************************************************
209 Invokes the compiler for untranslated Java methods.
211 *******************************************************************************/
213 .ent asm_call_jit_compiler
215 asm_call_jit_compiler:
217 lda sp,-(ARG_CNT+2)*8(sp) /* +2: keep stack 16-byte aligned */
219 stq ra,0*8(sp) /* save return address */
221 SAVE_ARGUMENT_REGISTERS(1) /* save 6 int/6 float argument registers */
223 mov itmp1,a0 /* pass methodinfo pointer */
224 mov mptr,a1 /* pass method pointer */
225 lda a2,(ARG_CNT+2)*8(sp) /* pass java sp */
227 jsr ra,jit_asm_compile /* call jit compiler */
230 ldq ra,0*8(sp) /* load return address */
232 RESTORE_ARGUMENT_REGISTERS(1) /* restore 6 int/6 float argument registers */
234 lda sp,(ARG_CNT+2)*8(sp) /* remove stack frame */
236 beq pv,L_asm_call_jit_compiler_exception
238 jmp zero,(pv) /* and call method, the method returns */
239 /* directly to the caller (ra). */
241 L_asm_call_jit_compiler_exception:
243 stq ra,0*8(sp) /* save return address (xpc) */
244 jsr ra,exceptions_get_and_clear_exception
245 ldq ra,0*8(sp) /* restore return address (xpc) */
248 mov v0,xptr /* get exception */
249 subq ra,4,xpc /* exception address is ra - 4 */
250 br L_asm_handle_nat_exception
252 .end asm_call_jit_compiler
255 /* asm_handle_exception ********************************************************
257 This function handles an exception. It does not use the usual calling
258 conventions. The exception pointer is passed in REG_ITMP1 and the
259 pc from the exception raising position is passed in REG_ITMP2. It searches
260 the local exception table for a handler. If no one is found, it unwinds
261 stacks and continues searching the callers.
263 ATTENTION: itmp3 == gp!
265 *******************************************************************************/
267 .ent asm_handle_nat_exception
269 asm_handle_nat_exception:
270 L_asm_handle_nat_exception: /* required for PIC code */
271 L_asm_handle_exception_stack_loop:
272 lda sp,-6*8(sp) /* keep stack 16-byte aligned */
273 stq xptr,0*8(sp) /* save xptr */
274 stq xpc,1*8(sp) /* save xpc */
275 stq ra,3*8(sp) /* save RA */
276 stq zero,4*8(sp) /* save maybe-leaf flag (cleared) */
278 mov ra,a0 /* pass RA */
280 br ra,L_asm_handle_exception_load_gp
281 L_asm_handle_exception_load_gp:
282 ldgp gp,0(ra) /* load gp */
284 jsr ra,md_codegen_get_pv_from_pc/* get PV from RA */
285 stq v0,2*8(sp) /* save PV */
287 ldq a0,0*8(sp) /* pass xptr */
288 ldq a1,1*8(sp) /* pass xpc */
289 mov v0,a2 /* pass PV */
290 addq sp,6*8,a3 /* pass Java SP */
292 br L_asm_handle_exception_continue
294 .aent asm_handle_exception
296 asm_handle_exception:
297 L_asm_handle_exception: /* required for PIC code */
298 lda sp,-(ARG_CNT+TMP_CNT)*8(sp) /* create maybe-leaf stackframe */
300 SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
301 SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
303 lda sp,-6*8(sp) /* keep stack 16-byte aligned */
304 stq xptr,0*8(sp) /* save xptr */
305 stq pv,2*8(sp) /* save PV */
306 stq ra,3*8(sp) /* save RA */
307 lda t0,1(zero) /* set maybe-leaf flag */
308 stq t0,4*8(sp) /* save maybe-leaf flag */
310 br ra,L_asm_handle_exception_load_gp_2
311 L_asm_handle_exception_load_gp_2:
312 ldgp gp,0(ra) /* load gp */
314 mov xptr,a0 /* pass xptr */
315 mov xpc,a1 /* pass xpc */
316 mov pv,a2 /* pass PV */
317 lda a3,(ARG_CNT+TMP_CNT+6)*8(sp)/* pass Java SP */
319 L_asm_handle_exception_continue:
320 jsr ra,exceptions_handle_exception
322 beq v0,L_asm_handle_exception_not_catched
324 mov v0,xpc /* move handlerpc into xpc */
325 ldq xptr,0*8(sp) /* restore xptr */
326 ldq pv,2*8(sp) /* restore PV */
327 ldq ra,3*8(sp) /* restore RA */
328 ldq t0,4*8(sp) /* get maybe-leaf flag */
329 lda sp,6*8(sp) /* free stack frame */
331 beq t0,L_asm_handle_exception_no_leaf
333 RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
334 RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
336 lda sp,(ARG_CNT+TMP_CNT)*8(sp) /* remove maybe-leaf stackframe */
338 L_asm_handle_exception_no_leaf:
339 jmp zero,(xpc) /* jump to the handler */
341 L_asm_handle_exception_not_catched:
342 ldq xptr,0*8(sp) /* restore xptr */
343 ldq pv,2*8(sp) /* restore PV */
344 ldq ra,3*8(sp) /* restore RA */
345 ldq t0,4*8(sp) /* get maybe-leaf flag */
348 beq t0,L_asm_handle_exception_no_leaf_stack
350 lda sp,(ARG_CNT+TMP_CNT)*8(sp) /* remove maybe-leaf stackframe */
351 mov zero,t0 /* clear the maybe-leaf flag */
353 L_asm_handle_exception_no_leaf_stack:
354 ldl t1,FrameSize(pv) /* get frame size */
355 addq t1,sp,t1 /* pointer to save area */
357 ldl t2,IsLeaf(pv) /* is leaf procedure */
358 bne t2,L_asm_handle_exception_no_ra_restore
360 ldq ra,-1*8(t1) /* restore ra */
361 subq t1,8,t1 /* t1-- */
363 L_asm_handle_exception_no_ra_restore:
364 mov ra,xpc /* the new xpc is ra */
365 ldl t2,IntSave(pv) /* t2 = saved int register count */
366 br t3,ex_int1 /* t3 = current pc */
368 lda t3,(ex_int2 - ex_int1)(t3)
369 negl t2,t2 /* negate register count */
370 s4addq t2,t3,t3 /* t2 = IntSave - register count * 4 */
371 jmp zero,(t3) /* jump to save position */
382 s8addq t2,t1,t1 /* t1 = t1 - 8 * register count */
384 ldl t2,FltSave(pv) /* t2 = saved flt register count */
385 br t3,ex_flt1 /* t3 = current pc */
387 lda t3,(ex_flt2 - ex_flt1)(t3)
388 negl t2,t2 /* negate register count */
389 s4addq t2,t3,t3 /* t2 = FltSave - 4 * register count */
390 jmp zero,(t3) /* jump to save position */
402 ldl t1,FrameSize(pv) /* get frame size */
403 addq sp,t1,sp /* unwind stack */
404 br L_asm_handle_exception_stack_loop
406 .end asm_handle_nat_exception
409 /* asm_abstractmethoderror *****************************************************
411 Creates and throws an AbstractMethodError.
413 *******************************************************************************/
415 .ent asm_abstractmethoderror
417 asm_abstractmethoderror:
418 subq sp,2*8,sp /* create stackframe */
419 stq ra,0*8(sp) /* save return address */
420 addq sp,2*8,a0 /* pass java sp */
421 mov ra,a1 /* pass exception address */
422 jsr ra,exceptions_asm_new_abstractmethoderror
423 ldq ra,0*8(sp) /* restore return address */
424 addq sp,2*8,sp /* remove stackframe */
426 mov v0,xptr /* get exception pointer */
427 subq ra,4,xpc /* exception address is ra - 4 */
428 br L_asm_handle_nat_exception
430 .end asm_abstractmethoderror
433 #if defined(ENABLE_REPLACEMENT)
435 /* asm_replacement_out *********************************************************
437 This code is jumped to from the replacement-out stubs that are executed
438 when a thread reaches an activated replacement point.
440 The purpose of asm_replacement_out is to read out the parts of the
441 execution state that cannot be accessed from C code, store this state,
442 and then call the C function replace_me.
445 16 start of stack inside method to replace
446 0 rplpoint * info on the replacement point that was reached
448 NOTE: itmp3 has been clobbered by the replacement-out stub!
450 *******************************************************************************/
452 /* some room to accomodate changes of the stack frame size during replacement */
453 /* XXX we should find a cleaner solution here */
454 #define REPLACEMENT_ROOM 512
456 #define REPLACEMENT_STACK_OFFSET ((sizeexecutionstate + REPLACEMENT_ROOM + 0xf) & ~0xf)
458 .ent asm_replacement_out
461 /* create stack frame */
462 lda sp,-(REPLACEMENT_STACK_OFFSET)(sp)
464 /* save registers in execution state */
465 stq $0 ,( 0*8+offes_intregs)(sp)
466 stq $1 ,( 1*8+offes_intregs)(sp)
467 stq $2 ,( 2*8+offes_intregs)(sp)
468 stq $3 ,( 3*8+offes_intregs)(sp)
469 stq $4 ,( 4*8+offes_intregs)(sp)
470 stq $5 ,( 5*8+offes_intregs)(sp)
471 stq $6 ,( 6*8+offes_intregs)(sp)
472 stq $7 ,( 7*8+offes_intregs)(sp)
473 stq $8 ,( 8*8+offes_intregs)(sp)
474 stq $9 ,( 9*8+offes_intregs)(sp)
475 stq $10,(10*8+offes_intregs)(sp)
476 stq $11,(11*8+offes_intregs)(sp)
477 stq $12,(12*8+offes_intregs)(sp)
478 stq $13,(13*8+offes_intregs)(sp)
479 stq $14,(14*8+offes_intregs)(sp)
480 stq $15,(15*8+offes_intregs)(sp)
481 stq $16,(16*8+offes_intregs)(sp)
482 stq $17,(17*8+offes_intregs)(sp)
483 stq $18,(18*8+offes_intregs)(sp)
484 stq $19,(19*8+offes_intregs)(sp)
485 stq $20,(20*8+offes_intregs)(sp)
486 stq $21,(21*8+offes_intregs)(sp)
487 stq $22,(22*8+offes_intregs)(sp)
488 stq $23,(23*8+offes_intregs)(sp)
489 stq $24,(24*8+offes_intregs)(sp)
490 stq $25,(25*8+offes_intregs)(sp)
491 stq $26,(26*8+offes_intregs)(sp)
492 stq $27,(27*8+offes_intregs)(sp)
493 stq $28,(28*8+offes_intregs)(sp)
494 stq $29,(29*8+offes_intregs)(sp)
495 stq $30,(30*8+offes_intregs)(sp)
496 stq $31,(31*8+offes_intregs)(sp)
498 stt $f0 ,( 0*8+offes_fltregs)(sp)
499 stt $f1 ,( 1*8+offes_fltregs)(sp)
500 stt $f2 ,( 2*8+offes_fltregs)(sp)
501 stt $f3 ,( 3*8+offes_fltregs)(sp)
502 stt $f4 ,( 4*8+offes_fltregs)(sp)
503 stt $f5 ,( 5*8+offes_fltregs)(sp)
504 stt $f6 ,( 6*8+offes_fltregs)(sp)
505 stt $f7 ,( 7*8+offes_fltregs)(sp)
506 stt $f8 ,( 8*8+offes_fltregs)(sp)
507 stt $f9 ,( 9*8+offes_fltregs)(sp)
508 stt $f10,(10*8+offes_fltregs)(sp)
509 stt $f11,(11*8+offes_fltregs)(sp)
510 stt $f12,(12*8+offes_fltregs)(sp)
511 stt $f13,(13*8+offes_fltregs)(sp)
512 stt $f14,(14*8+offes_fltregs)(sp)
513 stt $f15,(15*8+offes_fltregs)(sp)
514 stt $f16,(16*8+offes_fltregs)(sp)
515 stt $f17,(17*8+offes_fltregs)(sp)
516 stt $f18,(18*8+offes_fltregs)(sp)
517 stt $f19,(19*8+offes_fltregs)(sp)
518 stt $f20,(20*8+offes_fltregs)(sp)
519 stt $f21,(21*8+offes_fltregs)(sp)
520 stt $f22,(22*8+offes_fltregs)(sp)
521 stt $f23,(23*8+offes_fltregs)(sp)
522 stt $f24,(24*8+offes_fltregs)(sp)
523 stt $f25,(25*8+offes_fltregs)(sp)
524 stt $f26,(26*8+offes_fltregs)(sp)
525 stt $f27,(27*8+offes_fltregs)(sp)
526 stt $f28,(28*8+offes_fltregs)(sp)
527 stt $f29,(29*8+offes_fltregs)(sp)
528 stt $f30,(30*8+offes_fltregs)(sp)
529 stt $f31,(31*8+offes_fltregs)(sp)
531 /* calculate sp of method */
532 lda itmp1,(REPLACEMENT_STACK_OFFSET + 2*8)(sp)
533 stq itmp1,(offes_sp)(sp)
535 br ra,L_asm_replacement_out_load_gp
536 L_asm_replacement_out_load_gp:
537 ldgp gp,0(ra) /* load gp */
540 stq pv,(offes_pv)(sp)
542 /* call replace_me */
543 ldq a0,-(2*8)(itmp1) /* arg0: rplpoint * */
544 mov sp,a1 /* arg1: execution state */
545 jmp zero,replace_me /* call C function replace_me */
546 jmp zero,abort /* NEVER REACHED */
548 .end asm_replacement_out
550 /* asm_replacement_in **********************************************************
552 This code writes the given execution state and jumps to the replacement
555 This function never returns!
557 NOTE: itmp3 is not restored!
560 void asm_replacement_in(executionstate *es, replace_safestack_t *st);
562 *******************************************************************************/
564 .ent asm_replacement_in
567 /* a0 == executionstate *es */
570 mov a1,s1 /* replace_safestack_t *st */
571 mov a0,s2 /* executionstate *es == safe stack */
573 /* switch to the safe stack */
576 /* call replace_build_execution_state(st) */
578 jsr ra,replace_build_execution_state
581 ldq sp,(offes_sp)(s2)
583 /* build stack frame */
584 lda sp,(-sizeexecutionstate)(sp)
586 /* call replace_free_safestack(st,& of allocated executionstate_t) */
587 mov sp,a1 /* tmpes */
589 jsr ra,replace_free_safestack
592 ldq pv,(offes_pv)(sp)
594 /* copy registers from execution state */
595 ldq $0 ,( 0*8+offes_intregs)(sp)
596 ldq $1 ,( 1*8+offes_intregs)(sp)
597 ldq $2 ,( 2*8+offes_intregs)(sp)
598 ldq $3 ,( 3*8+offes_intregs)(sp)
599 ldq $4 ,( 4*8+offes_intregs)(sp)
600 ldq $5 ,( 5*8+offes_intregs)(sp)
601 ldq $6 ,( 6*8+offes_intregs)(sp)
602 ldq $7 ,( 7*8+offes_intregs)(sp)
603 ldq $8 ,( 8*8+offes_intregs)(sp)
604 ldq $9 ,( 9*8+offes_intregs)(sp)
605 ldq $10,(10*8+offes_intregs)(sp)
606 ldq $11,(11*8+offes_intregs)(sp)
607 ldq $12,(12*8+offes_intregs)(sp)
608 ldq $13,(13*8+offes_intregs)(sp)
609 ldq $14,(14*8+offes_intregs)(sp)
610 ldq $15,(15*8+offes_intregs)(sp)
611 ldq a0, (16*8+offes_intregs)(sp)
612 ldq $17,(17*8+offes_intregs)(sp)
613 ldq $18,(18*8+offes_intregs)(sp)
614 ldq $19,(19*8+offes_intregs)(sp)
615 ldq $20,(20*8+offes_intregs)(sp)
616 ldq $21,(21*8+offes_intregs)(sp)
617 ldq $22,(22*8+offes_intregs)(sp)
618 ldq $23,(23*8+offes_intregs)(sp)
619 ldq $24,(24*8+offes_intregs)(sp)
620 ldq $25,(25*8+offes_intregs)(sp)
621 ldq $26,(26*8+offes_intregs)(sp)
623 ldq $28,(28*8+offes_intregs)(sp)
624 ldq $29,(29*8+offes_intregs)(sp)
628 ldt $f0 ,( 0*8+offes_fltregs)(sp)
629 ldt $f1 ,( 1*8+offes_fltregs)(sp)
630 ldt $f2 ,( 2*8+offes_fltregs)(sp)
631 ldt $f3 ,( 3*8+offes_fltregs)(sp)
632 ldt $f4 ,( 4*8+offes_fltregs)(sp)
633 ldt $f5 ,( 5*8+offes_fltregs)(sp)
634 ldt $f6 ,( 6*8+offes_fltregs)(sp)
635 ldt $f7 ,( 7*8+offes_fltregs)(sp)
636 ldt $f8 ,( 8*8+offes_fltregs)(sp)
637 ldt $f9 ,( 9*8+offes_fltregs)(sp)
638 ldt $f10,(10*8+offes_fltregs)(sp)
639 ldt $f11,(11*8+offes_fltregs)(sp)
640 ldt $f12,(12*8+offes_fltregs)(sp)
641 ldt $f13,(13*8+offes_fltregs)(sp)
642 ldt $f14,(14*8+offes_fltregs)(sp)
643 ldt $f15,(15*8+offes_fltregs)(sp)
644 ldt $f16,(16*8+offes_fltregs)(sp)
645 ldt $f17,(17*8+offes_fltregs)(sp)
646 ldt $f18,(18*8+offes_fltregs)(sp)
647 ldt $f19,(19*8+offes_fltregs)(sp)
648 ldt $f20,(20*8+offes_fltregs)(sp)
649 ldt $f21,(21*8+offes_fltregs)(sp)
650 ldt $f22,(22*8+offes_fltregs)(sp)
651 ldt $f23,(23*8+offes_fltregs)(sp)
652 ldt $f24,(24*8+offes_fltregs)(sp)
653 ldt $f25,(25*8+offes_fltregs)(sp)
654 ldt $f26,(26*8+offes_fltregs)(sp)
655 ldt $f27,(27*8+offes_fltregs)(sp)
656 ldt $f28,(28*8+offes_fltregs)(sp)
657 ldt $f29,(29*8+offes_fltregs)(sp)
658 ldt $f30,(30*8+offes_fltregs)(sp)
659 ldt $f31,(31*8+offes_fltregs)(sp)
663 ldq itmp3,offes_pc(sp)
665 /* remove stack frame */
667 lda sp,(sizeexecutionstate)(sp)
669 /* jump to new code */
673 .end asm_replacement_in
675 #endif /* defined(ENABLE_REPLACEMENT) */
678 /* asm_compare_and_swap ********************************************************
680 Does an atomic compare and swap. Required for the lock
683 Atomically do the following: Check if the location still contains
684 `oldval`. If so, replace it by `newval` and return `oldval`.
689 long compare_and_swap(volatile long *p, long oldval, long newval);
691 *******************************************************************************/
693 .ent asm_compare_and_swap
695 asm_compare_and_swap:
706 .end asm_compare_and_swap
709 /* asm_memory_barrier **********************************************************
711 A memory barrier for the Java Memory Model.
713 *******************************************************************************/
715 .ent asm_memory_barrier
721 .end asm_memory_barrier
724 .ent asm_getclassvalues_atomic
726 asm_getclassvalues_atomic:
729 ldl t0,offbaseval(a0)
730 ldl t1,offdiffval(a0)
731 ldl t2,offbaseval(a1)
733 stl t0,offcast_super_baseval(a2)
734 stl t1,offcast_super_diffval(a2)
735 stl t2,offcast_sub_baseval(a2)
738 .end asm_getclassvalues_atomic
743 asm_criticalsections:
744 #if defined(ENABLE_THREADS)
752 /* asm_md_init *****************************************************************
754 Initialize machine dependent stuff.
756 Determines if the byte support instruction set (21164a and higher)
759 *******************************************************************************/
764 .long 0x47e03c20 /* amask 1,v0 */
765 jmp zero,(ra) /* return */
770 /* asm_cacheflush **************************************************************
774 *******************************************************************************/
779 call_pal PAL_imb /* synchronize instruction cache */
785 /* disable exec-stacks ********************************************************/
787 #if defined(__linux__) && defined(__ELF__)
788 .section .note.GNU-stack,"",%progbits
793 * These are local overrides for various environment variables in Emacs.
794 * Please do not remove this and leave it at the end of the file, where
795 * Emacs will automagically detect them.
796 * ---------------------------------------------------------------------
799 * indent-tabs-mode: t
803 * vim:noexpandtab:sw=4:ts=4: