#ifndef __ASM_SH64_REGISTERS_H
#define __ASM_SH64_REGISTERS_H

/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * include/asm-sh64/registers.h
 *
 * Copyright (C) 2000, 2001  Paolo Alberelli
 *
 */

#ifdef __ASSEMBLY__
/* =====================================================================
** 
** Section 1: acts on assembly sources pre-processed by GPP ( <source.S>).
**	      Assigns symbolic names to control & target registers.
*/

/*
 * Concerning registers name, the assembly sources follows the
 * CDC naming convention.
 * This section converts CDC registers names into RedHat style.
 */

/*
 * Control Registers.
 */
#define SR	cr0
#define SSR	cr1
#define PSSR	cr2
			/* cr3 UNDEFINED */
#define INTEVT	cr4
#define EXPEVT	cr5
#define PEXPEVT	cr6
#define TRA	cr7
#define SPC	cr8
#define PSPC	cr9
#define RESVEC	cr10
#define VBR	cr11
			/* cr12 UNDEFINED */
#define TEA	cr13
			/* cr14-cr15 UNDEFINED */
#define DCR	cr16
#define KCR0	cr17
#define KCR1	cr18
			/* cr19-cr31 UNDEFINED */
			/* cr32-cr61 RESERVED */
#define CTC	cr62
#define USR	cr63

/*
 * ABI dependent registers (general purpose set)
 * Note: this set of registers name could be shared by the
 *       CDC and RedHat toolchain
 */
#define RET	r2
#define ARG1	r2
#define ARG2	r3
#define ARG3	r4
#define ARG4	r5
#define ARG5	r6
#define ARG6	r7
#define FBP	r14
#define SP	r15
#define GVDT	r26
#define GCDT	r27
#define LINK	r18
#define OS	r40
#define ZERO	r63

/*
 * Target registers need name convertion...
 * (defines only those used by assembly code)
 */
#define t0	tr0
#define t1	tr1
#define t2	tr2
#define t3	tr3
#define t4	tr4
#define t5	tr5
#define t6	tr6
#define t7	tr7

/*
** RedHat style compatibility macros:
**
**   _loada: loads the address the address  of the symbol (first
**           argument) into the general purpose register (second
**           argument)
*/
        .macro  _loada   symbol, gp_reg
         movi   \symbol, \gp_reg
        .endm

        .macro  _ptar    symbol, tr_reg
         pt     \symbol, \tr_reg
        .endm

        .macro  _ptaru   symbol, tr_reg
         pt/u   \symbol, \tr_reg
        .endm

        .macro  _pta    disp_b,  tr_reg
         pta    $+\disp_b, \tr_reg
        .endm

/*
 * Status register defines: used only by assembly sources (and
 * 			    syntax independednt)
 */
#define SR_RESET_VAL	0x0000000050008000
#define SR_HARMLESS	0x00000000500080f0	/* Write ignores for most */
#define SR_ENABLE_FPU	0xffffffffffff7fff	/* AND with this */

#if defined (CONFIG_SH64_SR_WATCH)
#define SR_ENABLE_MMU	0x0000000084000000	/* OR with this */
#else
#define SR_ENABLE_MMU	0x0000000080000000	/* OR with this */
#endif

#define SR_UNBLOCK_EXC	0xffffffffefffffff	/* AND with this */
#define SR_BLOCK_EXC	0x0000000010000000	/* OR with this */

#else	/* Not __ASSEMBLY__ syntax */

/* =====================================================================
** 
** Section 2: this is required to manage __asm__ statement expanded
**            by "C" compiler
*/
	/*
	** RedHat style symbolic address resolution inside "asm" blocks
	*/
        asm ("\t.macro  _loada   symbol, gp_reg\n"
             "\tmovi    \\symbol, \\gp_reg\n"
             "\t.endm\n"
             "\n"
             "\t.macro  _ptar    symbol, tr_reg\n"
             "\tpt      \\symbol, \\tr_reg\n"
             "\t.endm\n"
             "\n"
             "\t.macro  _pta    disp_b, tr_reg\n"
             "\tpta     $+\\disp_b, \\tr_reg\n"
             "\t.endm\n"
	     "\n"
             "\t.macro  _fgetscr  f_reg63\n"
	     "\tfgetscr \\f_reg63\n"
             "\t.endm\n"
	     "\n"
             "\t.macro  _fputscr  f_reg63\n"
	     "\tfputscr \\f_reg63\n"
             "\t.endm\n"
	     "\n"
	    );

	/*
	** RedHat style target register name inside "asm" blocks
	*/
#	define __t0	__str(tr0)
#	define __t1	__str(tr1)
#	define __t2	__str(tr2)
#	define __t3	__str(tr3)
#	define __t4	__str(tr4)
#	define __t5	__str(tr5)
#	define __t6	__str(tr6)
#	define __t7	__str(tr7)

	/*
	** RedHat style control register name inside "asm" blocks
	*/
#	define __c0	__str(cr0)		/* SR       */
#	define __c1	__str(cr1)		/* SSR      */
#	define __c2	__str(cr2)		/* PSSR     */
#	define __c4	__str(cr4)		/* INTEVT   */
#	define __c5	__str(cr5)		/* EXPEVT   */
#	define __c6	__str(cr6)		/* PEXPEVT  */
#	define __c8	__str(cr8)		/* SPC      */
#	define __c9	__str(cr9)		/* PSPC     */
#	define __c13	__str(cr13)		/* TEA      */
#	define __c17	__str(cr17)		/* KCR0     */
#	define __c18	__str(cr18)		/* KCR1     */

	/*
	** RedHat style float and double register name inside "asm" blocks
	** defines below are used only in .../arch/sh5/kernel/fpu.c
	*/
#	define __f(x)	__str(fr##x)
#	define __p(x)	__str(fp##x)
#	define __d(x)	__str(dr##x)

	/*
	** Stringify reg. name (common for CDC & RedHat)
	*/
#	define __str(x)  #x

#endif /* __ASSEMBLY__ */
#endif /* __ASM_SH64_REGISTERS_H */
