xref: /netbsd-src/sys/arch/sparc64/include/asm.h (revision 0b3a3609319b481bc352b7bc6a5df8acbdb893b4)
1*0b3a3609Snakayama /*       $NetBSD: asm.h,v 1.22 2015/10/17 19:29:48 nakayama Exp $        */
201e2e698Seeh 
3154a2d2aSmrg #include <sparc/asm.h>
4ca64aca7Schristos 
5ca64aca7Schristos /*
6ca64aca7Schristos  * Here are some defines to try to maintain consistency but still
7ca64aca7Schristos  * support 32-and 64-bit compilers.
8ca64aca7Schristos  */
9ca64aca7Schristos #ifdef _LP64
10ca64aca7Schristos /* reg that points to base of data/text segment */
11ca64aca7Schristos #define	BASEREG	%g4
12ca64aca7Schristos /* first constants for storage allocation */
13ca64aca7Schristos #define LNGSZ		8
14ca64aca7Schristos #define LNGSHFT		3
15ca64aca7Schristos #define PTRSZ		8
16ca64aca7Schristos #define PTRSHFT		3
17ca64aca7Schristos #define POINTER		.xword
18ca64aca7Schristos #define ULONG		.xword
19ca64aca7Schristos /* Now instructions to load/store pointers & long ints */
20ca64aca7Schristos #define LDLNG		ldx
21ca64aca7Schristos #define LDULNG		ldx
22ca64aca7Schristos #define STLNG		stx
23ca64aca7Schristos #define STULNG		stx
24ca64aca7Schristos #define LDPTR		ldx
25ca64aca7Schristos #define LDPTRA		ldxa
26ca64aca7Schristos #define STPTR		stx
27ca64aca7Schristos #define STPTRA		stxa
28aa19dc53Snakayama #define	CASPTR		casx
29aa19dc53Snakayama #define	CASPTRA		casxa
30ca64aca7Schristos /* Now something to calculate the stack bias */
31ca64aca7Schristos #define STKB		BIAS
32ca64aca7Schristos #define	CCCR		%xcc
33ca64aca7Schristos #else
34ca64aca7Schristos #define	BASEREG		%g0
35ca64aca7Schristos #define LNGSZ		4
36ca64aca7Schristos #define LNGSHFT		2
37ca64aca7Schristos #define PTRSZ		4
38ca64aca7Schristos #define PTRSHFT		2
39ca64aca7Schristos #define POINTER		.word
40ca64aca7Schristos #define ULONG		.word
41ca64aca7Schristos /* Instructions to load/store pointers & long ints */
42ca64aca7Schristos #define LDLNG		ldsw
43ca64aca7Schristos #define LDULNG		lduw
44ca64aca7Schristos #define STLNG		stw
45ca64aca7Schristos #define STULNG		stw
46ca64aca7Schristos #define LDPTR		lduw
47ca64aca7Schristos #define LDPTRA		lduwa
48ca64aca7Schristos #define STPTR		stw
49ca64aca7Schristos #define STPTRA		stwa
50aa19dc53Snakayama #define	CASPTR		cas
51aa19dc53Snakayama #define	CASPTRA		casa
52ca64aca7Schristos #define STKB		0
53ca64aca7Schristos #define	CCCR		%icc
54ca64aca7Schristos #endif
55ca64aca7Schristos 
56ca64aca7Schristos #if defined(_KERNEL) || defined(_RUMPKERNEL)
57ca64aca7Schristos /* Give this real authority: reset the machine */
58ca64aca7Schristos #define NOTREACHED	sir
59ca64aca7Schristos #else
60ca64aca7Schristos #define NOTREACHED
61ca64aca7Schristos #endif
62ca64aca7Schristos 
63ca64aca7Schristos /* if < 32, copy by bytes, memcpy, kcopy, ... */
64ca64aca7Schristos #define	BCOPY_SMALL	32
65ca64aca7Schristos 
66ca64aca7Schristos /* use as needed to align things on longword boundaries */
67ca64aca7Schristos #define	_ALIGN	.align 8
68ca64aca7Schristos #define ICACHE_ALIGN	.align	32
69*0b3a3609Snakayama 
70*0b3a3609Snakayama /*
71*0b3a3609Snakayama  * Combine 2 regs -- used to convert 64-bit ILP32
72*0b3a3609Snakayama  * values to LP64.
73*0b3a3609Snakayama  */
74*0b3a3609Snakayama #define	COMBINE(r1, r2, d)	\
75*0b3a3609Snakayama 	clruw	r2;		\
76*0b3a3609Snakayama 	sllx	r1, 32, d;	\
77*0b3a3609Snakayama 	or	d, r2, d
78*0b3a3609Snakayama 
79*0b3a3609Snakayama /*
80*0b3a3609Snakayama  * Split 64-bit value in 1 reg into high and low halves.
81*0b3a3609Snakayama  * Used for ILP32 return values.
82*0b3a3609Snakayama  */
83*0b3a3609Snakayama #define	SPLIT(s, r0, r1)	\
84*0b3a3609Snakayama 	srl	s, 0, r1;	\
85*0b3a3609Snakayama 	srlx	s, 32, r0
86*0b3a3609Snakayama 
87*0b3a3609Snakayama #define	SPLIT_RETL(s, r0, r1)	\
88*0b3a3609Snakayama 	srl	s, 0, r1;	\
89*0b3a3609Snakayama 	retl;			\
90*0b3a3609Snakayama 	 srlx	s, 32, r0
91