1 /* src/vm/jit/x86_64/asmpart.S - Java-C interface functions for x86_64
3 Copyright (C) 1996-2005, 2006 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 Contact: cacao@cacaojvm.org
27 Authors: Andreas Krall
31 Changes: Edwin Steiner
33 $Id: asmpart.S 5053 2006-06-28 19:11:20Z twisti $
40 #include "vm/jit/x86_64/arch.h"
41 #include "vm/jit/x86_64/md-abi.h"
42 #include "vm/jit/x86_64/md-asm.h"
43 #include "vm/jit/x86_64/offsets.h"
45 #include "vm/jit/abi-asm.h"
46 #include "vm/jit/methodheader.h"
52 /* export functions ***********************************************************/
54 .globl asm_vm_call_method
55 .globl asm_vm_call_method_int
56 .globl asm_vm_call_method_long
57 .globl asm_vm_call_method_float
58 .globl asm_vm_call_method_double
59 .globl asm_vm_call_method_exception_handler
61 .globl asm_call_jit_compiler
62 .globl asm_handle_exception
63 .globl asm_handle_nat_exception
65 .globl asm_abstractmethoderror
67 .globl asm_wrapper_patcher
69 .globl asm_replacement_out
70 .globl asm_replacement_in
72 .globl asm_builtin_f2i
73 .globl asm_builtin_f2l
74 .globl asm_builtin_d2i
75 .globl asm_builtin_d2l
77 .globl asm_criticalsections
78 .globl asm_getclassvalues_atomic
81 /********************* function asm_calljavafunction ***************************
83 * This function calls a Java-method (which possibly needs compilation) *
84 * with up to 4 address parameters. *
86 * This functions calls the JIT-compiler which eventually translates the *
87 * method into machine code. *
90 * javaobject_header *asm_calljavamethod (methodinfo *m, *
91 * void *arg1, void *arg2, void *arg3, void *arg4); *
93 *******************************************************************************/
97 .quad 0 /* catch type all */
98 .quad 0 /* handler pc */
100 .quad 0 /* start pc */
101 .long 1 /* extable size */
102 .long 0 /* ALIGNMENT PADDING */
103 .quad 0 /* line number table start */
104 .quad 0 /* line number table size */
105 .long 0 /* ALIGNMENT PADDING */
106 .long 0 /* fltsave */
107 .long 0 /* intsave */
110 .long 0 /* frame size */
111 .quad 0 /* codeinfo pointer */
114 asm_vm_call_method_int:
115 asm_vm_call_method_long:
116 asm_vm_call_method_float:
117 asm_vm_call_method_double:
118 sub $(7*8),sp /* keep stack 16-byte aligned */
119 mov %rbx,0*8(sp) /* %rbx is not a callee saved in cacao*/
126 mov a0,itmp1 /* move method pointer for compiler */
127 xor %rbp,%rbp /* set argument stack frame to zero */
129 test a1,a1 /* maybe we have no args... */
132 mov a1,itmp3 /* arg count */
133 mov a2,itmp2 /* pointer to arg block */
135 mov itmp2,%r14 /* save argument block pointer */
136 mov itmp3,%r15 /* save argument count */
138 sub $sizevmarg,itmp2 /* initialize pointer (smaller code) */
139 add $1,itmp3 /* initialize argument count */
140 xor %r12,%r12 /* initialize integer argument counter*/
141 xor %r13,%r13 /* initialize float argument counter */
144 add $sizevmarg,itmp2 /* goto next argument block */
145 dec itmp3 /* argument count - 1 */
146 jz L_register_copy_done
147 andb $0x02,offvmargtype(itmp2) /* is this a float/double type? */
148 jnz L_register_handle_float /* yes, handle it */
150 cmp $INT_ARG_CNT,%r12 /* are we out of integer argument */
151 je L_register_copy /* register? yes, next loop */
153 lea jumptable_integer(%rip),%rbp
154 mov 0(%rbp,%r12,8),%rbx
155 inc %r12 /* integer argument counter + 1 */
158 L_register_handle_float:
159 cmp $FLT_ARG_CNT,%r13 /* are we out of float argument */
160 je L_register_copy /* register? yes, next loop */
162 lea jumptable_float(%rip),%rbp
163 mov 0(%rbp,%r13,8),%rbx
164 inc %r13 /* float argument counter + 1 */
167 L_register_copy_done:
168 mov %r15,%rbp /* calculate remaining arguments */
169 sub %r12,%rbp /* - integer arguments in registers */
170 sub %r13,%rbp /* - float arguments in registers */
171 jle L_copy_done /* are all assigned to registers? */
173 and $0xfffffffffffffffe,%rbp /* keep stack 16-byte aligned */
174 shl $3,%rbp /* calculate stack size */
175 sub %rbp,sp /* stack frame for arguments */
176 mov sp,%rbx /* use %rbx as temp sp */
178 sub $sizevmarg,%r14 /* initialize pointer (smaller code) */
179 add $1,%r15 /* initialize argument count */
182 add $sizevmarg,%r14 /* goto next argument block */
183 dec %r15 /* are there any arguments left? */
184 jz L_copy_done /* no test needed after dec */
186 andb $0x02,offvmargtype(%r14) /* is this a float/double type? */
187 jnz L_stack_handle_float
188 dec %r12 /* arguments assigned to registers */
189 jge L_stack_copy_loop
192 L_stack_handle_float:
193 dec %r13 /* arguments assigned to registers */
194 jge L_stack_copy_loop
197 mov offvmargdata(%r14),itmp3 /* copy s8 argument onto stack */
199 add $8,%rbx /* increase sp to next argument */
200 jmp L_stack_copy_loop
203 /* itmp1 still contains method pointer*/
204 lea L_asm_call_jit_compiler(%rip),mptr
205 mov sp,itmp3 /* calculate the old stack pointer */
208 lea (6*8-256)(itmp3),mptr /* We subtract 256 to force the next */
209 /* move instruction to have a 32-bit */
212 mov (0*8+256)(mptr),itmp3 /* method call as in Java */
213 call *itmp3 /* call JIT compiler */
215 add bp,sp /* remove argument stack frame if any */
217 L_asm_vm_call_method_return:
218 mov 0*8(sp),%rbx /* restore callee saved registers */
224 add $(7*8),sp /* free stack space */
227 asm_vm_call_method_exception_handler:
228 mov xptr,a0 /* pass exception pointer */
229 call builtin_throw_exception@PLT
230 jmp L_asm_vm_call_method_return
242 mov offvmargdata(itmp2),a0
245 mov offvmargdata(itmp2),a1
248 mov offvmargdata(itmp2),a2
251 mov offvmargdata(itmp2),a3
254 mov offvmargdata(itmp2),a4
257 mov offvmargdata(itmp2),a5
272 movq offvmargdata(itmp2),fa0
275 movq offvmargdata(itmp2),fa1
278 movq offvmargdata(itmp2),fa2
281 movq offvmargdata(itmp2),fa3
284 movq offvmargdata(itmp2),fa4
287 movq offvmargdata(itmp2),fa5
290 movq offvmargdata(itmp2),fa6
293 movq offvmargdata(itmp2),fa7
297 /****************** function asm_call_jit_compiler *****************************
299 * invokes the compiler for untranslated JavaVM methods. *
301 * Register R0 contains a pointer to the method info structure (prepared *
302 * by createcompilerstub). Using the return address in R26 and the *
303 * offset in the LDA instruction or using the value in methodptr R28 the *
304 * patching address for storing the method address can be computed: *
306 * method address was either loaded using *
308 * i386_mov_imm_reg(a, REG_ITMP2) ; invokestatic/special *
309 * i386_call_reg(REG_ITMP2) *
313 * i386_mov_membase_reg(REG_SP, 0, REG_ITMP2) ; invokevirtual/interface *
314 * i386_mov_membase_reg(REG_ITMP2, OFFSET(, vftbl), REG_ITMP3) *
315 * i386_mov_membase_reg(REG_ITMP3, OFFSET(vftbl, table[0]) + \ *
316 * sizeof(methodptr) * m->vftblindex, REG_ITMP1) *
317 * i386_call_reg(REG_ITMP1) *
319 * in the static case the method pointer can be computed using the *
320 * return address and the lda function following the jmp instruction *
322 *******************************************************************************/
324 asm_call_jit_compiler:
325 L_asm_call_jit_compiler: /* required for PIC code */
326 sub $(ARG_CNT+1)*8,sp /* +1: keep stack 16-byte aligned */
328 SAVE_ARGUMENT_REGISTERS(0)
330 mov itmp1,a0 /* pass methodinfo pointer */
331 mov mptr,a1 /* pass method pointer */
332 mov sp,a2 /* pass java sp */
333 add $(1+ARG_CNT+1)*8,a2
334 mov (ARG_CNT+1)*8(sp),a3 /* pass ra to java function */
335 call jit_asm_compile@PLT
337 RESTORE_ARGUMENT_REGISTERS(0)
339 add $(ARG_CNT+1)*8,sp /* remove stack frame */
341 test v0,v0 /* check for exception */
342 je L_asm_call_jit_compiler_exception
344 jmp *v0 /* ...and now call the new method */
346 L_asm_call_jit_compiler_exception:
347 #if defined(ENABLE_THREADS)
348 call builtin_asm_get_exceptionptrptr@PLT
349 mov v0,itmp2 /* v0 == xptr */
351 lea _no_threads_exceptionptr(%rip),itmp2
353 mov (itmp2),xptr /* get the exception pointer */
354 movl $0,(itmp2) /* clear exception pointer */
356 pop xpc /* delete return address */
357 sub $5,xpc /* faulting address is ra - 5 */
358 jmp L_asm_handle_exception
361 /* asm_handle_exception ********************************************************
363 * This function handles an exception. It does not use the usual calling *
364 * conventions. The exception pointer is passed in REG_ITMP1 and the *
365 * pc from the exception raising position is passed in REG_ITMP2. It searches *
366 * the local exception table for a handler. If no one is found, it unwinds *
367 * stacks and continues searching the callers. *
369 *******************************************************************************/
371 asm_handle_nat_exception:
372 add $8,sp /* clear return address of native stub*/
374 asm_handle_exception:
375 L_asm_handle_exception: /* required for PIC code */
376 sub $((ARG_CNT+TMP_CNT)*8),sp /* create maybe-leaf stackframe */
378 SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
379 SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
381 mov $((ARG_CNT+TMP_CNT)*8),a3 /* prepare a3 for handle_exception */
382 mov $1,t0 /* set maybe-leaf flag */
384 L_asm_handle_exception_stack_loop:
386 mov xptr,0*8(sp) /* save exception pointer */
387 mov xpc,1*8(sp) /* save exception pc */
388 add sp,a3 /* calculate Java sp into a3... */
390 mov a3,3*8(sp) /* ...and save it */
391 mov t0,4*8(sp) /* save maybe-leaf flag */
393 mov xpc,a0 /* exception pc */
394 call codegen_findmethod@PLT
395 mov v0,2*8(sp) /* save data segment pointer */
397 mov 0*8(sp),a0 /* pass exception pointer */
398 mov 1*8(sp),a1 /* pass exception pc */
399 mov v0,a2 /* pass data segment pointer */
400 mov 3*8(sp),a3 /* pass Java stack pointer */
401 call exceptions_handle_exception@PLT
404 jz L_asm_handle_exception_not_catched
406 mov v0,xpc /* move handlerpc into xpc */
407 mov 0*8(sp),xptr /* restore exception pointer */
408 mov 4*8(sp),t0 /* get maybe-leaf flag */
409 add $(6*8),sp /* free stack frame */
411 test t0,t0 /* test for maybe-leaf flag */
412 jz L_asm_handle_exception_no_leaf
414 RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
415 RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
417 add $((ARG_CNT+TMP_CNT)*8),sp /* remove maybe-leaf stackframe */
419 L_asm_handle_exception_no_leaf:
420 jmp *xpc /* jump to the handler */
422 L_asm_handle_exception_not_catched:
423 mov 0*8(sp),xptr /* restore exception pointer */
424 mov 2*8(sp),itmp3 /* restore data segment pointer */
425 mov 4*8(sp),t0 /* get maybe-leaf flag */
429 jz L_asm_handle_exception_no_leaf_stack
431 add $((ARG_CNT+TMP_CNT)*8),sp /* remove maybe-leaf stackframe */
432 xor t0,t0 /* clear the isleaf flags */
434 L_asm_handle_exception_no_leaf_stack:
435 mov FrameSize(itmp3),itmp2l /* get frame size */
436 add sp,itmp2 /* pointer to save area */
438 mov IntSave(itmp3),a0l /* a0l = saved int register count */
461 shl $3,a0l /* multiply by 8 bytes */
466 mov FltSave(itmp3),a0l /* a0l = saved flt register count */
479 movq -5*8(itmp2),%xmm11
481 movq -4*8(itmp2),%xmm12
483 movq -3*8(itmp2),%xmm13
485 movq -2*8(itmp2),%xmm14
487 movq -1*8(itmp2),%xmm15
491 mov FrameSize(itmp3),itmp2l /* get frame size */
492 add itmp2,sp /* unwind stack */
494 /* exception pointer is still set */
495 pop xpc /* the new xpc is return address */
496 sub $3,xpc /* subtract 3 bytes for call */
498 xor a3,a3 /* prepare a3 for handle_exception */
500 jmp L_asm_handle_exception_stack_loop
503 /* asm_abstractmethoderror *****************************************************
505 Creates and throws an AbstractMethodError.
507 *******************************************************************************/
509 asm_abstractmethoderror:
510 call exceptions_new_abstractmethoderror@PLT
511 /* exception pointer is return value */
512 pop xpc /* get exception address */
513 sub $5,xpc /* exception address is ra - 5 */
514 jmp L_asm_handle_exception
517 /* asm_wrapper_patcher *********************************************************
523 32 pointer to virtual java_objectheader
524 24 machine code (which is patched back later)
525 16 unresolved class/method/field reference
526 8 data segment displacement from load instructions
527 0 pointer to patcher function
530 *******************************************************************************/
533 push bp /* save base pointer */
534 mov sp,bp /* move actual sp to bp */
535 sub $((3+ARG_CNT+TMP_CNT)*8+sizestackframeinfo),sp
536 and $0xfffffffffffffff0,sp /* align sp to 16-byte (this is for */
537 /* leaf functions) */
539 SAVE_ARGUMENT_REGISTERS(3)
540 SAVE_TEMPORARY_REGISTERS(3+ARG_CNT)
542 mov itmp1,0*8(sp) /* save itmp1 and itmp2 */
543 mov itmp2,1*8(sp) /* can be used by some instructions */
545 mov sp,a0 /* create stackframe info */
546 add $((3+ARG_CNT+TMP_CNT)*8),a0
547 xor a1,a1 /* if pv is NULL, use findmethod */
548 mov bp,a2 /* pass java sp */
550 mov ((5+1)*8)(bp),a3 /* pass ra to java function */
551 mov a3,a4 /* xpc is equal to ra */
552 call stacktrace_create_extern_stackframeinfo@PLT
554 mov bp,a0 /* pass stack pointer */
555 add $((1+1)*8),a0 /* skip function pointer */
556 mov 1*8(bp),itmp3 /* get function pointer */
557 call *itmp3 /* call the patcher function */
558 mov v0,2*8(sp) /* save return value */
560 mov sp,a0 /* remove stackframe info */
561 add $((3+ARG_CNT+TMP_CNT)*8),a0
562 call stacktrace_remove_stackframeinfo@PLT
564 RESTORE_ARGUMENT_REGISTERS(3)
565 RESTORE_TEMPORARY_REGISTERS(3+ARG_CNT)
567 mov 0*8(sp),itmp1 /* restore itmp1 and itmp2 */
568 mov 1*8(sp),itmp2 /* can be used by some instructions */
569 mov 2*8(sp),itmp3 /* restore return value */
571 mov bp,sp /* restore original sp */
572 pop bp /* restore bp */
573 add $(5*8),sp /* remove patcher stackframe, keep ra */
575 test itmp3,itmp3 /* exception thrown? */
576 jz L_asm_wrapper_patcher_exception
577 ret /* call new patched code */
579 L_asm_wrapper_patcher_exception:
580 #if defined(ENABLE_THREADS)
581 call builtin_asm_get_exceptionptrptr@PLT
582 mov v0,itmp2 /* v0 == xptr */
584 mov _no_threads_exceptionptr,itmp2
586 mov (itmp2),xptr /* get the exception pointer */
587 movl $0,(itmp2) /* clear exception pointer */
589 pop xpc /* get and remove return address */
590 jmp L_asm_handle_exception
593 /* asm_replacement_out *********************************************************
595 This code is jumped to from the replacement-out stubs that are executed
596 when a thread reaches an activated replacement point.
598 The purpose of asm_replacement_out is to read out the parts of the
599 execution state that cannot be accessed from C code, store this state,
600 and then call the C function replace_me.
603 8 start of stack inside method to replace
604 0 rplpoint * info on the replacement point that was reached
606 *******************************************************************************/
608 /* some room to accomodate changes of the stack frame size during replacement */
609 /* XXX we should find a cleaner solution here */
610 #define REPLACEMENT_ROOM 512
613 /* create stack frame */
614 sub $(sizeexecutionstate + REPLACEMENT_ROOM),sp
616 /* save registers in execution state */
617 mov %rax,(RAX*8+offes_intregs)(sp)
618 mov %rbx,(RBX*8+offes_intregs)(sp)
619 mov %rcx,(RCX*8+offes_intregs)(sp)
620 mov %rdx,(RDX*8+offes_intregs)(sp)
621 mov %rsi,(RSI*8+offes_intregs)(sp)
622 mov %rdi,(RDI*8+offes_intregs)(sp)
623 mov %rbp,(RBP*8+offes_intregs)(sp)
624 movq $0 ,(RSP*8+offes_intregs)(sp) /* not used */
625 mov %r8 ,(R8 *8+offes_intregs)(sp)
626 mov %r9 ,(R9 *8+offes_intregs)(sp)
627 mov %r10,(R10*8+offes_intregs)(sp)
628 mov %r11,(R11*8+offes_intregs)(sp)
629 mov %r12,(R12*8+offes_intregs)(sp)
630 mov %r13,(R13*8+offes_intregs)(sp)
631 mov %r14,(R14*8+offes_intregs)(sp)
632 mov %r15,(R15*8+offes_intregs)(sp)
634 movq %xmm0 ,(XMM0 *8+offes_fltregs)(sp)
635 movq %xmm1 ,(XMM1 *8+offes_fltregs)(sp)
636 movq %xmm2 ,(XMM2 *8+offes_fltregs)(sp)
637 movq %xmm3 ,(XMM3 *8+offes_fltregs)(sp)
638 movq %xmm4 ,(XMM4 *8+offes_fltregs)(sp)
639 movq %xmm5 ,(XMM5 *8+offes_fltregs)(sp)
640 movq %xmm6 ,(XMM6 *8+offes_fltregs)(sp)
641 movq %xmm7 ,(XMM7 *8+offes_fltregs)(sp)
642 movq %xmm8 ,(XMM8 *8+offes_fltregs)(sp)
643 movq %xmm9 ,(XMM9 *8+offes_fltregs)(sp)
644 movq %xmm10,(XMM10*8+offes_fltregs)(sp)
645 movq %xmm11,(XMM11*8+offes_fltregs)(sp)
646 movq %xmm12,(XMM12*8+offes_fltregs)(sp)
647 movq %xmm13,(XMM13*8+offes_fltregs)(sp)
648 movq %xmm14,(XMM14*8+offes_fltregs)(sp)
649 movq %xmm15,(XMM15*8+offes_fltregs)(sp)
651 /* calculate sp of method */
653 add $(sizeexecutionstate + REPLACEMENT_ROOM + 8),itmp1
654 mov itmp1,(offes_sp)(sp)
656 /* pv must be looked up via AVL tree */
657 movq $0,(offes_pv)(sp)
659 /* call replace_me */
660 mov -8(itmp1),a0 /* rplpoint * */
661 mov sp,a1 /* arg1: execution state */
662 call replace_me@PLT /* call C function replace_me */
663 call abort@PLT /* NEVER REACHED */
665 /* asm_replacement_in **********************************************************
667 This code writes the given execution state and jumps to the replacement
670 This function never returns!
673 void asm_replacement_in(executionstate *es);
675 *******************************************************************************/
678 mov a0,%rbp /* executionstate *es */
681 mov (offes_sp)(%rbp),%rsp
683 /* store address of new code */
684 push (offes_pc)(%rbp)
686 /* copy registers from execution state */
687 movq (XMM0 *8+offes_fltregs)(%rbp),%xmm0
688 movq (XMM1 *8+offes_fltregs)(%rbp),%xmm1
689 movq (XMM2 *8+offes_fltregs)(%rbp),%xmm2
690 movq (XMM3 *8+offes_fltregs)(%rbp),%xmm3
691 movq (XMM4 *8+offes_fltregs)(%rbp),%xmm4
692 movq (XMM5 *8+offes_fltregs)(%rbp),%xmm5
693 movq (XMM6 *8+offes_fltregs)(%rbp),%xmm6
694 movq (XMM7 *8+offes_fltregs)(%rbp),%xmm7
695 movq (XMM8 *8+offes_fltregs)(%rbp),%xmm8
696 movq (XMM9 *8+offes_fltregs)(%rbp),%xmm9
697 movq (XMM10*8+offes_fltregs)(%rbp),%xmm10
698 movq (XMM11*8+offes_fltregs)(%rbp),%xmm11
699 movq (XMM12*8+offes_fltregs)(%rbp),%xmm12
700 movq (XMM13*8+offes_fltregs)(%rbp),%xmm13
701 movq (XMM14*8+offes_fltregs)(%rbp),%xmm14
702 movq (XMM15*8+offes_fltregs)(%rbp),%xmm15
704 mov (RAX*8+offes_intregs)(%rbp),%rax
705 mov (RBX*8+offes_intregs)(%rbp),%rbx
706 mov (RCX*8+offes_intregs)(%rbp),%rcx
707 mov (RDX*8+offes_intregs)(%rbp),%rdx
708 mov (RSI*8+offes_intregs)(%rbp),%rsi
709 mov (RDI*8+offes_intregs)(%rbp),%rdi
710 mov (R8 *8+offes_intregs)(%rbp),%r8
711 mov (R9 *8+offes_intregs)(%rbp),%r9
712 mov (R10*8+offes_intregs)(%rbp),%r10
713 mov (R11*8+offes_intregs)(%rbp),%r11
714 mov (R12*8+offes_intregs)(%rbp),%r12
715 mov (R13*8+offes_intregs)(%rbp),%r13
716 mov (R14*8+offes_intregs)(%rbp),%r14
717 mov (R15*8+offes_intregs)(%rbp),%r15
719 mov (RBP*8+offes_intregs)(%rbp),%rbp
721 /* jump to new code */
725 /* asm_builtin_x2x *************************************************************
727 * Wrapper functions for float to int corner cases *
729 *******************************************************************************/
734 SAVE_ARGUMENT_REGISTERS(0)
739 RESTORE_ARGUMENT_REGISTERS(0)
748 SAVE_ARGUMENT_REGISTERS(0)
753 RESTORE_ARGUMENT_REGISTERS(0)
762 SAVE_ARGUMENT_REGISTERS(0)
767 RESTORE_ARGUMENT_REGISTERS(0)
776 SAVE_ARGUMENT_REGISTERS(0)
781 RESTORE_ARGUMENT_REGISTERS(0)
787 asm_getclassvalues_atomic:
790 movl offbaseval(a0),itmp1l
791 movl offdiffval(a0),itmp2l
792 movl offbaseval(a1),itmp3l
794 movl itmp1l,offcast_super_baseval(a2)
795 movl itmp2l,offcast_super_diffval(a2)
796 movl itmp3l,offcast_sub_baseval(a2)
801 asm_criticalsections:
802 #if defined(ENABLE_THREADS)
810 /* Disable exec-stacks, required for Gentoo ***********************************/
812 #if defined(__GCC__) && defined(__ELF__)
813 .section .note.GNU-stack,"",@progbits
818 * These are local overrides for various environment variables in Emacs.
819 * Please do not remove this and leave it at the end of the file, where
820 * Emacs will automagically detect them.
821 * ---------------------------------------------------------------------
824 * indent-tabs-mode: t
828 * vim:noexpandtab:sw=4:ts=4: