summaryrefslogtreecommitdiffstats
path: root/common/stack.inc
blob: 9c98404a621f03b6029350554c0864c9441b0113 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef STACK_EMULATION_H_
#define STACK_EMULATION_H_

#include "gpr.inc"


/* Push a value (can be anything that's valid as operand) to the stack */
#define PUSH(value)									\
	mov value, [0, OFFR_STACKPTR];		/* Save the value on the stack */	\
	sub BASER_STACKPTR, 1, BASER_STACKPTR;	/* Decrement stack pointer */

/* Helpers to push the link registers to the stack */
#define __PUSH_LR(nr)		PUSH(SPR_PC##nr);
#define PUSH_LR0		__PUSH_LR(0)
#define PUSH_LR1		__PUSH_LR(1)
#define PUSH_LR2		__PUSH_LR(2)
#define PUSH_LR3		__PUSH_LR(3)

/* Pop the last entry from the stack and save it in the register */
#define POP(register)									\
	add BASER_STACKPTR, 1, BASER_STACKPTR;	/* Increment stack pointer */		\
	mov [0, OFFR_STACKPTR], register;	/* Restore the value from the stack */

/* Helpers to pop values from the stack to the link registers */
#define __POP_LR(nr)		POP(SPR_PC##nr); mov SPR_PC##nr, 0;
#define POP_LR0			__POP_LR(0)
#define POP_LR1			__POP_LR(1)
#define POP_LR2			__POP_LR(2)
#define POP_LR3			__POP_LR(3)


#endif /* STACK_EMULATION_H_ */

// vim: syntax=b43 ts=8
bues.ch cgit interface