/**
 * @file regname.h
 * @brief Human-friendly register names.
 * 
 */

#ifndef _REGNAME_H_
#define _REGNAME_H_

/**
 * Register no 0 is always 0 for reading. It is so-called as a wired zero.
 */
#define zero    0

/**
 * Register no 1 is used by the assembler macros as a temporary register.
 * Assembler temporary (at) can be also used as a normal register when
 * the ".set noat" pseudo op-code is specified.
 */
#define at      1

/**
 * General registers used by the C compiler. This is not a dogma, but
 * a convention.
 */

/** a return value */
#define v0      2
/** @see v0 */
#define v1      3

/** function arguments */
#define a0      4
/** @see a0 */
#define a1      5
/** @see a0 */
#define a2      6
/** @see a0 */
#define a3      7
/** @see a0 */

/** temporary register */
#define t0      8
/** @see t0 */
#define t1      9
/** @see t0 */
#define t2      10
/** @see t0 */
#define t3      11
/** @see t0 */
#define t4      12
/** @see t0 */
#define t5      13
/** @see t0 */
#define t6      14
/** @see t0 */
#define t7      15
/** @see t0 */
#define s0      16
/** @see t0 */
#define s1      17
/** @see t0 */
#define s2      18
/** @see t0 */
#define s3      19
/** @see t0 */
#define s4      20
/** @see t0 */
#define s5      21
/** @see t0 */
#define s6      22
/** @see t0 */
#define s7      23
/** @see t0 */
#define t8      24
/** @see t0 */
#define t9      25	
/** pointer to global	*/
#define gp      28
/** pointer to stack	*/
#define sp      29
/** pointer to frame	*/
#define fp      30

/**
 * Register no 31 is used by the jump-linked instructions as a pointer to
 * the next (return) instruction. Note that it is up to calling code to do not
 * lost it.
 */
#define ra      31

/**
 * Registers 26 and 27 (k0 and k1) are reserved for the operating system.
 * Their context may be randomly overwritten and the application should not
 * use them.
 */
#define k0      26
/** @see k0 */
#define k1      27


/**
 * @name MIPS R4000 CP0 registers
 * 
 * @{
 */
/** Index Register */
#define index		0
/** Random Register */
#define random		1
/** EntryLo0 Register */
#define entrylo0	2
/** EntryLo1 Register */
#define entrylo1	3	
/** Context Register */
#define context		4
/** PageMask Register */
#define pagemask	5
/** Wired Register */
#define wired		6
/** Bad Virtual Address Register */
#define badvaddr	8
/** Count Register */
#define count		9
/** EntryHi Register */
#define entryhi		10
/** Compare Register */
#define compare		11
/** Status Register */
#define status		12
/** Cause Register */
#define cause		13
/** Exception Program Counter Register */
#define epc			14
/** Config Register */
#define config		16
/** Load Linked Address Register */
#define lladdr		17
/** XContext Register */
#define xcontext	20
/** Error Exception Program Counter Register */
#define eepc		30
/** @} */

#endif /* _REGNAME_H_ */
