/* src/vm/jit/i386/darwin/md-asm.h - assembler defines for i386 Darwin ABI

   Copyright (C) 1996-2005, 2006, 2008
   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO

   This file is part of CACAO.

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2, or (at
   your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
   02110-1301, USA.

*/


#ifndef _MD_ASM_H
#define _MD_ASM_H

/* register defines ***********************************************************/

#define v0       %eax
#define itmp1    v0

#define itmp2    %ecx
#define itmp3    %edx

#define t0       %ebx

#define sp       %esp
#define s0       %ebp
#define s1       %esi
#define s2       %edi

#define bp       s0

#define itmp1b   %al

#define xptr     itmp1
#define xpc      itmp2
#define mptr     itmp2


/* save and restore macros ****************************************************/

#define SAVE_ARGUMENT_REGISTERS(off) \
    /* no argument registers */

#define SAVE_TEMPORARY_REGISTERS(off) \
	mov     t0,(0+(off))*4(sp) ;


#define RESTORE_ARGUMENT_REGISTERS(off) \
    /* no argument registers */

#define RESTORE_TEMPORARY_REGISTERS(off) \
	mov     (0+(off))*4(sp),t0 ;


/* defines for darwin's old gnu assembler *************************************/

#define asm_md_init                           _asm_md_init

#define asm_vm_call_method                    _asm_vm_call_method
#define asm_vm_call_method_int                _asm_vm_call_method_int
#define asm_vm_call_method_long               _asm_vm_call_method_long
#define asm_vm_call_method_float              _asm_vm_call_method_float
#define asm_vm_call_method_double             _asm_vm_call_method_double
#define asm_vm_call_method_end                _asm_vm_call_method_end

#define asm_vm_call_method_exception_handler  _asm_vm_call_method_exception_handler

#define asm_call_jit_compiler                 _asm_call_jit_compiler

#define asm_handle_nat_exception              _asm_handle_nat_exception
#define asm_handle_exception                  _asm_handle_exception

#define asm_abstractmethoderror               _asm_abstractmethoderror

#define asm_patcher_wrapper                   _asm_patcher_wrapper

#define asm_builtin_f2i                       _asm_builtin_f2i
#define asm_builtin_f2l                       _asm_builtin_f2l
#define asm_builtin_d2i                       _asm_builtin_d2i
#define asm_builtin_d2l                       _asm_builtin_d2l


/* external defines ***********************************************************/

#define exceptions_get_and_clear_exception    _exceptions_get_and_clear_exception

#define builtin_throw_exception               _builtin_throw_exception
#define methodtree_find                       _methodtree_find
#define exceptions_handle_exception           _exceptions_handle_exception
#define jit_asm_compile                       _jit_asm_compile

#define exceptions_asm_new_abstractmethoderror \
    _exceptions_asm_new_abstractmethoderror

#define patcher_wrapper                       _patcher_wrapper

#define replace_me                            _replace_me

#define abort                                 _abort

#define builtin_f2i                           _builtin_f2i
#define builtin_f2l                           _builtin_f2l
#define builtin_d2i                           _builtin_d2i
#define builtin_d2l                           _builtin_d2l

#define asm_get_cycle_count                   _asm_get_cycle_count

#endif /* _MD_ASM_H */


/*
 * These are local overrides for various environment variables in Emacs.
 * Please do not remove this and leave it at the end of the file, where
 * Emacs will automagically detect them.
 * ---------------------------------------------------------------------
 * Local variables:
 * mode: c
 * indent-tabs-mode: t
 * c-basic-offset: 4
 * tab-width: 4
 * End:
 */
