]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/ia64/include/asm.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / ia64 / include / asm.h
1 /* $FreeBSD$ */
2 /* From: NetBSD: asm.h,v 1.18 1997/11/03 04:22:06 ross Exp */
3
4 /*-
5  * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University
6  * All Rights Reserved.
7  * 
8  * Permission to use, copy, modify and distribute this software and its
9  * documentation is hereby granted, provided that both the copyright
10  * notice and this permission notice appear in all copies of the
11  * software, derivative works or modified versions, and any portions
12  * thereof, and that both notices appear in supporting documentation.
13  * 
14  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
15  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
16  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
17  * 
18  * Carnegie Mellon requests users of this software to return to
19  * 
20  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
21  *  School of Computer Science
22  *  Carnegie Mellon University
23  *  Pittsburgh PA 15213-3890
24  * 
25  * any improvements or extensions that they make and grant Carnegie Mellon
26  * the rights to redistribute these changes.
27  */
28
29 /*
30  *      Assembly coding style
31  *
32  *      This file contains macros and register defines to
33  *      aid in writing more readable assembly code.
34  *      Some rules to make assembly code understandable by
35  *      a debugger are also noted.
36  */
37
38 /*
39  * Macro to make a local label name.
40  */
41 #define LLABEL(name,num)        L ## name ## num
42
43 /*
44  * MCOUNT
45  */
46 #if defined(PROF) || (defined(_KERNEL) && defined(GPROF))
47 #define MCOUNT                                  \
48         alloc   out0 = ar.pfs, 8, 0, 4, 0;      \
49         mov     out1 = r1;                      \
50         mov     out2 = b0;;                     \
51         mov     out3 = r0;                      \
52         br.call.sptk b0 = _mcount;;
53 #else
54 #define MCOUNT  /* nothing */
55 #endif
56
57 /*
58  * ENTRY
59  *      Declare a global leaf function.
60  *      A leaf function does not call other functions.
61  */
62 #define ENTRY(_name_, _n_args_)                 \
63         .global _name_;                         \
64         .align  32;                             \
65         .proc   _name_;                         \
66 _name_:;                                        \
67         .regstk _n_args_, 0, 0, 0;              \
68         MCOUNT
69
70 #define ENTRY_NOPROFILE(_name_, _n_args_)       \
71         .global _name_;                         \
72         .align  32;                             \
73         .proc   _name_;                         \
74 _name_:;                                        \
75         .regstk _n_args_, 0, 0, 0
76
77 /*
78  * STATIC_ENTRY
79  *      Declare a local leaf function.
80  */
81 #define STATIC_ENTRY(_name_, _n_args_)          \
82         .align  32;                             \
83         .proc   _name_;                         \
84 _name_:;                                        \
85         .regstk _n_args_, 0, 0, 0               \
86         MCOUNT
87 /*
88  * XENTRY
89  *      Global alias for a leaf function, or alternate entry point
90  */
91 #define XENTRY(_name_)                          \
92         .globl  _name_;                         \
93 _name_:
94
95 /*
96  * STATIC_XENTRY
97  *      Local alias for a leaf function, or alternate entry point
98  */
99 #define STATIC_XENTRY(_name_)                   \
100 _name_:
101
102
103 /*
104  * END
105  *      Function delimiter
106  */
107 #define END(_name_)                                             \
108         .endp   _name_
109
110
111 /*
112  * EXPORT
113  *      Export a symbol
114  */
115 #define EXPORT(_name_)                                          \
116         .global _name_;                                         \
117 _name_:
118
119
120 /*
121  * IMPORT
122  *      Make an external name visible, typecheck the size
123  */
124 #define IMPORT(_name_, _size_)                                  \
125         /* .extern      _name_,_size_ */
126
127
128 /*
129  * ABS
130  *      Define an absolute symbol
131  */
132 #define ABS(_name_, _value_)                                    \
133         .globl  _name_;                                         \
134 _name_  =       _value_
135
136
137 /*
138  * BSS
139  *      Allocate un-initialized space for a global symbol
140  */
141 #define BSS(_name_,_numbytes_)                                  \
142         .comm   _name_,_numbytes_
143
144
145 /*
146  * MSG
147  *      Allocate space for a message (a read-only ascii string)
148  */
149 #define ASCIZ   .asciz
150 #define MSG(msg,reg,label)                      \
151         addl reg,@ltoff(label),gp;;             \
152         ld8 reg=[reg];;                         \
153         .data;                                  \
154 label:  ASCIZ msg;                              \
155         .text;
156
157
158 /*
159  * System call glue.
160  */
161 #define SYSCALLNUM(name)        SYS_ ## name
162
163 #define CALLSYS_NOERROR(name)                                   \
164         .prologue ;                                             \
165         .unwabi         @svr4, 'S' ;                            \
166         .save           rp, r0 ;                                \
167         .body ;                                                 \
168 {       .mmi ;                                                  \
169         alloc           r9 = ar.pfs, 0, 0, 8, 0 ;               \
170         mov             r31 = ar.k5 ;                           \
171         mov             r10 = b0 ;; }                           \
172 {       .mib ;                                                  \
173         mov             r8 = SYSCALLNUM(name) ;                 \
174         mov             b7 = r31 ;                              \
175         br.call.sptk    b0 = b7 ;; }
176
177
178 /*
179  * WEAK_ALIAS: create a weak alias (ELF only).
180  */
181 #define WEAK_ALIAS(alias,sym)                                   \
182         .weak alias;                                            \
183         alias = sym
184
185 /*
186  * ID tag macros
187  */
188 #if !defined(lint) && !defined(STRIP_FBSDID)
189 #define __FBSDID(s)     .ident s
190 #else
191 #define __FBSDID(s)     /* nothing */
192 #endif /* not lint and not STRIP_FBSDID */