xref: /plan9/sys/src/9/rb/mips.s (revision f43f8ee646e2cb29aea7fd7bb5fc7318a3f4921f)
1*f43f8ee6SDavid du Colombier/*
2*f43f8ee6SDavid du Colombier * mips 24k machine assist
3*f43f8ee6SDavid du Colombier */
4*f43f8ee6SDavid du Colombier#undef	MASK
5*f43f8ee6SDavid du Colombier#define	MASK(w) ((1<<(w))-1)
6*f43f8ee6SDavid du Colombier
7*f43f8ee6SDavid du Colombier#define	SP	R29
8*f43f8ee6SDavid du Colombier
9*f43f8ee6SDavid du Colombier#define NOP	NOR R0, R0, R0
10*f43f8ee6SDavid du Colombier
11*f43f8ee6SDavid du Colombier#define	CONST(x,r) MOVW $((x)&0xffff0000), r; OR  $((x)&0xffff), r
12*f43f8ee6SDavid du Colombier
13*f43f8ee6SDavid du Colombier/* a mips 24k erratum requires a NOP after; experience dictates EHB before */
14*f43f8ee6SDavid du Colombier#define	ERET	EHB; WORD $0x42000018; NOP
15*f43f8ee6SDavid du Colombier
16*f43f8ee6SDavid du Colombier#define RETURN	RET; NOP
17*f43f8ee6SDavid du Colombier
18*f43f8ee6SDavid du Colombier/*
19*f43f8ee6SDavid du Colombier *  R4000 instructions
20*f43f8ee6SDavid du Colombier */
21*f43f8ee6SDavid du Colombier#define	LL(base, rt)	WORD	$((060<<26)|((base)<<21)|((rt)<<16))
22*f43f8ee6SDavid du Colombier#define	SC(base, rt)	WORD	$((070<<26)|((base)<<21)|((rt)<<16))
23*f43f8ee6SDavid du Colombier
24*f43f8ee6SDavid du Colombier/* new instructions in mips 24k (mips32r2) */
25*f43f8ee6SDavid du Colombier#define DI(rt)	WORD $(0x41606000|((rt)<<16))	/* interrupts off */
26*f43f8ee6SDavid du Colombier#define EI(rt)	WORD $(0x41606020|((rt)<<16))	/* interrupts on */
27*f43f8ee6SDavid du Colombier#define EHB	WORD $0xc0
28*f43f8ee6SDavid du Colombier/* jalr with hazard barrier, link in R22 */
29*f43f8ee6SDavid du Colombier#define JALRHB(r) WORD $(((r)<<21)|(22<<11)|(1<<10)|9); NOP
30*f43f8ee6SDavid du Colombier/* jump register with hazard barrier */
31*f43f8ee6SDavid du Colombier#define JRHB(r)	WORD $(((r)<<21)|(1<<10)|8); NOP
32*f43f8ee6SDavid du Colombier#define MFC0(src,sel,dst) WORD $(0x40000000|((src)<<11)|((dst)<<16)|(sel))
33*f43f8ee6SDavid du Colombier#define MTC0(src,dst,sel) WORD $(0x40800000|((dst)<<11)|((src)<<16)|(sel))
34*f43f8ee6SDavid du Colombier#define MIPS24KNOP NOP				/* for erratum #48 */
35*f43f8ee6SDavid du Colombier#define RDHWR(hwr, r)	WORD $(0x7c00003b|((hwr)<<11)|((r)<<16))
36*f43f8ee6SDavid du Colombier#define SYNC	WORD $0xf			/* all sync barriers */
37*f43f8ee6SDavid du Colombier#define WAIT	WORD $0x42000020		/* wait for interrupt */
38*f43f8ee6SDavid du Colombier
39*f43f8ee6SDavid du Colombier/* all barriers, clears all hazards; clobbers r/Reg and R22 */
40*f43f8ee6SDavid du Colombier#define BARRIERS(r, Reg, label) \
41*f43f8ee6SDavid du Colombier	SYNC; EHB; MOVW $ret(SB), Reg; JALRHB(r)
42*f43f8ee6SDavid du Colombier/* same but return to KSEG1 */
43*f43f8ee6SDavid du Colombier#define UBARRIERS(r, Reg, label) \
44*f43f8ee6SDavid du Colombier	SYNC; EHB; MOVW $ret(SB), Reg; OR $KSEG1, Reg; JALRHB(r)
45*f43f8ee6SDavid du Colombier
46*f43f8ee6SDavid du Colombier/* alternative definitions using labels */
47*f43f8ee6SDavid du Colombier#ifdef notdef
48*f43f8ee6SDavid du Colombier/* all barriers, clears all hazards; clobbers r/Reg */
49*f43f8ee6SDavid du Colombier#define BARRIERS(r, Reg, label) \
50*f43f8ee6SDavid du Colombier	SYNC; EHB; \
51*f43f8ee6SDavid du Colombier	MOVW	$label(SB), Reg; \
52*f43f8ee6SDavid du Colombier	JRHB(r); \
53*f43f8ee6SDavid du ColombierTEXT label(SB), $-4; \
54*f43f8ee6SDavid du Colombier	NOP
55*f43f8ee6SDavid du Colombier#define UBARRIERS(r, Reg, label) \
56*f43f8ee6SDavid du Colombier	SYNC; EHB; \
57*f43f8ee6SDavid du Colombier	MOVW	$label(SB), Reg; \
58*f43f8ee6SDavid du Colombier	OR	$KSEG1, Reg; \
59*f43f8ee6SDavid du Colombier	JRHB(r); \
60*f43f8ee6SDavid du ColombierTEXT label(SB), $-4; \
61*f43f8ee6SDavid du Colombier	NOP
62*f43f8ee6SDavid du Colombier#endif
63*f43f8ee6SDavid du Colombier
64*f43f8ee6SDavid du Colombier#define PUTC(c, r1, r2)	CONST(PHYSCONS, r1); MOVW $(c), r2; MOVW r2, (r1); NOP
65*f43f8ee6SDavid du Colombier
66*f43f8ee6SDavid du Colombier/*
67*f43f8ee6SDavid du Colombier *  cache manipulation
68*f43f8ee6SDavid du Colombier */
69*f43f8ee6SDavid du Colombier
70*f43f8ee6SDavid du Colombier#define	CACHE	BREAK		/* overloaded op-code */
71*f43f8ee6SDavid du Colombier
72*f43f8ee6SDavid du Colombier#define	PI	R((0		/* primary I cache */
73*f43f8ee6SDavid du Colombier#define	PD	R((1		/* primary D cache */
74*f43f8ee6SDavid du Colombier#define	TD	R((2		/* tertiary I/D cache */
75*f43f8ee6SDavid du Colombier#define	SD	R((3		/* secondary combined I/D cache */
76*f43f8ee6SDavid du Colombier
77*f43f8ee6SDavid du Colombier#define	IWBI	(0<<2)))	/* index write-back invalidate */
78*f43f8ee6SDavid du Colombier#define	ILT	(1<<2)))	/* index load tag */
79*f43f8ee6SDavid du Colombier#define	IST	(2<<2)))	/* index store tag */
80*f43f8ee6SDavid du Colombier/* #define CDE	(3<<2)))	/* create dirty exclusive */
81*f43f8ee6SDavid du Colombier#define	HINV	(4<<2)))	/* hit invalidate */
82*f43f8ee6SDavid du Colombier#define	HWBI	(5<<2)))	/* hit write back invalidate */
83*f43f8ee6SDavid du Colombier#define	HWB	(6<<2)))	/* hit write back */
84*f43f8ee6SDavid du Colombier/* #define HSV	(7<<2)))	/* hit set virtual */
85