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