/* src/vm/jit/alpha/md-asm.h - assembler defines for Alpha ABI

   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
   J. Wenninger, Institut f. Computersprachen - TU Wien

   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.

   Contact: cacao@cacaojvm.org

   Authors: Christian Thalinger

   Changes:

   $Id: md-asm.h 4498 2006-02-12 23:43:09Z twisti $

*/


#ifndef _MD_ASM_H
#define _MD_ASM_H


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

#define v0      $0

#define t0      $1
#define t1      $2
#define t2      $3
#define t3      $4
#define t4      $5
#define t5      $6
#define t6      $7
#define t7      $8

#define	s0      $9
#define	s1      $10
#define	s2      $11
#define	s3      $12
#define	s4      $13
#define	s5      $14
#define	s6      $15

#define a0      $16
#define a1      $17
#define a2      $18
#define a3      $19
#define a4      $20
#define a5      $21

#define t8      $22
#define t9      $23
#define t10     $24
#define t11     $25
#define ra      $26
#define t12     $27

#define pv      t12
#define AT      $at
#define gp      $29
#define sp      $30
#define zero    $31

#define itmp1   t11
#define itmp2   $28
#define itmp3   gp

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

#define fv0     $f0
#define ft0     $f1

#define fs0     $f2
#define fs1     $f3
#define fs2     $f4
#define fs3     $f5
#define fs4     $f6
#define fs5     $f7
#define fs6     $f8
#define fs7     $f9

#define ft1     $f10
#define ft2     $f11
#define ft3     $f12
#define ft4     $f13
#define ft5     $f14
#define ft6     $f15

#define fa0     $f16
#define fa1     $f17
#define fa2     $f18
#define fa3     $f19
#define fa4     $f20
#define fa5     $f21

#define ft7     $f22
#define ft8     $f23
#define ft9     $f24
#define ft10    $f25
#define ft11    $f26
#define ft12    $f27

#define ftmp1   $f28
#define ftmp2   $f29
#define ftmp3   $f30

#define fzero   $f31

#define PAL_imb 0x86


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

#define SAVE_RETURN_REGISTERS(off) \
	stq     v0,(0+(off))*8(sp)    ; \
	stt     fv0,(1+(off))*8(sp)   ;

#define RESTORE_RETURN_REGISTERS(off) \
	ldq     v0,(0+(off))*8(sp)    ; \
	ldt     fv0,(1+(off))*8(sp)   ;

#define SAVE_ARGUMENT_REGISTERS(off) \
	stq     a0,(0+(off))*8(sp)    ; \
	stq     a1,(1+(off))*8(sp)    ; \
	stq     a2,(2+(off))*8(sp)    ; \
	stq     a3,(3+(off))*8(sp)    ; \
	stq     a4,(4+(off))*8(sp)    ; \
	stq     a5,(5+(off))*8(sp)    ; \
	\
	stt     fa0,(6+(off))*8(sp)   ; \
	stt     fa1,(7+(off))*8(sp)   ; \
	stt     fa2,(8+(off))*8(sp)   ; \
	stt     fa3,(9+(off))*8(sp)   ; \
	stt     fa4,(10+(off))*8(sp)  ; \
	stt     fa5,(11+(off))*8(sp)  ;

#define RESTORE_ARGUMENT_REGISTERS(off) \
	ldq     a0,(0+(off))*8(sp)    ; \
	ldq     a1,(1+(off))*8(sp)    ; \
	ldq     a2,(2+(off))*8(sp)    ; \
	ldq     a3,(3+(off))*8(sp)    ; \
	ldq     a4,(4+(off))*8(sp)    ; \
	ldq     a5,(5+(off))*8(sp)    ; \
	\
	ldt     fa0,(6+(off))*8(sp)   ; \
	ldt     fa1,(7+(off))*8(sp)   ; \
	ldt     fa2,(8+(off))*8(sp)   ; \
	ldt     fa3,(9+(off))*8(sp)   ; \
	ldt     fa4,(10+(off))*8(sp)  ; \
	ldt     fa5,(11+(off))*8(sp)  ;
		
#define SAVE_TEMPORARY_REGISTERS(off) \
	stq     t0,(0+(off))*8(sp)    ; \
	stq     t1,(1+(off))*8(sp)    ; \
	stq     t2,(2+(off))*8(sp)    ; \
	stq     t3,(3+(off))*8(sp)    ; \
	stq     t4,(4+(off))*8(sp)    ; \
	stq     t5,(5+(off))*8(sp)    ; \
	stq     t6,(6+(off))*8(sp)    ; \
	stq     t7,(7+(off))*8(sp)    ; \
	stq     t8,(8+(off))*8(sp)    ; \
	stq     t9,(9+(off))*8(sp)    ; \
	stq     t10,(10+(off))*8(sp)  ; \
	\
	stt     ft0,(11+(off))*8(sp)  ; \
	stt     ft1,(12+(off))*8(sp)  ; \
	stt     ft2,(13+(off))*8(sp)  ; \
	stt     ft3,(14+(off))*8(sp)  ; \
	stt     ft4,(15+(off))*8(sp)  ; \
	stt     ft5,(16+(off))*8(sp)  ; \
	stt     ft6,(17+(off))*8(sp)  ; \
	stt     ft7,(18+(off))*8(sp)  ; \
	stt     ft8,(19+(off))*8(sp)  ; \
	stt     ft9,(20+(off))*8(sp)  ; \
	stt     ft10,(21+(off))*8(sp) ; \
	stt     ft11,(22+(off))*8(sp) ; \
	stt     ft12,(23+(off))*8(sp) ;


#define RESTORE_TEMPORARY_REGISTERS(off) \
	ldq     t0,(0+(off))*8(sp)    ; \
	ldq     t1,(1+(off))*8(sp)    ; \
	ldq     t2,(2+(off))*8(sp)    ; \
	ldq     t3,(3+(off))*8(sp)    ; \
	ldq     t4,(4+(off))*8(sp)    ; \
	ldq     t5,(5+(off))*8(sp)    ; \
	ldq     t6,(6+(off))*8(sp)    ; \
	ldq     t7,(7+(off))*8(sp)    ; \
	ldq     t8,(8+(off))*8(sp)    ; \
	ldq     t9,(9+(off))*8(sp)    ; \
	ldq     t10,(10+(off))*8(sp)  ; \
	\
	ldt     ft0,(11+(off))*8(sp)  ; \
	ldt     ft1,(12+(off))*8(sp)  ; \
	ldt     ft2,(13+(off))*8(sp)  ; \
	ldt     ft3,(14+(off))*8(sp)  ; \
	ldt     ft4,(15+(off))*8(sp)  ; \
	ldt     ft5,(16+(off))*8(sp)  ; \
	ldt     ft6,(17+(off))*8(sp)  ; \
	ldt     ft7,(18+(off))*8(sp)  ; \
	ldt     ft8,(19+(off))*8(sp)  ; \
	ldt     ft9,(20+(off))*8(sp)  ; \
	ldt     ft10,(21+(off))*8(sp) ; \
	ldt     ft11,(22+(off))*8(sp) ; \
	ldt     ft12,(23+(off))*8(sp) ;

#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:
 */
