1 /* $NetBSD: asm.h,v 1.24 2000/06/23 12:18:48 kleink Exp $ */ 2 3 /* 4 * Copyright (c) 1992, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Ralph Campbell. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)machAsmDefs.h 8.1 (Berkeley) 6/10/93 39 */ 40 41 /* 42 * machAsmDefs.h -- 43 * 44 * Macros used when writing assembler programs. 45 * 46 * Copyright (C) 1989 Digital Equipment Corporation. 47 * Permission to use, copy, modify, and distribute this software and 48 * its documentation for any purpose and without fee is hereby granted, 49 * provided that the above copyright notice appears in all copies. 50 * Digital Equipment Corporation makes no representations about the 51 * suitability of this software for any purpose. It is provided "as is" 52 * without express or implied warranty. 53 * 54 * from: Header: /sprite/src/kernel/mach/ds3100.md/RCS/machAsmDefs.h, 55 * v 1.2 89/08/15 18:28:24 rab Exp SPRITE (DECWRL) 56 */ 57 58 #ifndef _MIPS_ASM_H 59 #define _MIPS_ASM_H 60 61 #include <mips/regdef.h> 62 63 /* 64 * Define -pg profile entry code. 65 * Must always be noreorder, must never use a macro instruction 66 * Final addiu to t9 must always equal the size of this _KERN_MCOUNT 67 */ 68 #define _KERN_MCOUNT \ 69 .set push; \ 70 .set noreorder; \ 71 .set noat; \ 72 sw t9,-4(sp); \ 73 move AT,ra; \ 74 lui t9,%hi(_mcount); \ 75 addiu t9,t9,%lo(_mcount); \ 76 jalr t9; \ 77 subu sp,sp,16; \ 78 lw t9,4(sp); \ 79 addiu sp,sp,8; \ 80 addiu t9,t9,36; \ 81 .set pop; 82 83 #ifdef GPROF 84 #define MCOUNT _KERN_MCOUNT 85 #else 86 #define MCOUNT 87 #endif 88 89 #ifdef __NO_LEADING_UNDERSCORES__ 90 # define _C_LABEL(x) x 91 #else 92 # ifdef __STDC__ 93 # define _C_LABEL(x) _ ## x 94 # else 95 # define _C_LABEL(x) _/**/x 96 # endif 97 #endif 98 99 #ifdef USE_AENT 100 #define AENT(x) \ 101 .aent x, 0 102 #else 103 #define AENT(x) 104 #endif 105 106 #ifdef __ELF__ 107 #define WEAK_ALIAS(alias,sym) \ 108 .weak alias; \ 109 alias = sym 110 #endif 111 112 /* 113 * WARN_REFERENCES: create a warning if the specified symbol is referenced 114 * (ELF only, and thus, no leading underscores). 115 */ 116 #ifdef __ELF__ 117 #ifdef __STDC__ 118 #define WARN_REFERENCES(_sym,_msg) \ 119 .section .gnu.warning. ## _sym ; .ascii _msg ; .text 120 #else 121 #define WARN_REFERENCES(_sym,_msg) \ 122 .section .gnu.warning./**/_sym ; .ascii _msg ; .text 123 #endif /* __STDC__ */ 124 #endif /* __ELF__ */ 125 126 /* 127 * LEAF 128 * A leaf routine does 129 * - call no other function, 130 * - never use any register that callee-saved (S0-S8), and 131 * - not use any local stack storage. 132 */ 133 #define LEAF(x) \ 134 .globl _C_LABEL(x); \ 135 .ent _C_LABEL(x), 0; \ 136 _C_LABEL(x): ; \ 137 .frame sp, 0, ra; \ 138 MCOUNT 139 140 /* 141 * LEAF_NOPROFILE 142 * No profilable leaf routine. 143 */ 144 #define LEAF_NOPROFILE(x) \ 145 .globl _C_LABEL(x); \ 146 .ent _C_LABEL(x), 0; \ 147 _C_LABEL(x): ; \ 148 .frame sp, 0, ra 149 150 /* 151 * XLEAF 152 * declare alternate entry to leaf routine 153 */ 154 #define XLEAF(x) \ 155 .globl _C_LABEL(x); \ 156 AENT (_C_LABEL(x)); \ 157 _C_LABEL(x): 158 159 /* 160 * NESTED 161 * A function calls other functions and needs 162 * therefore stack space to save/restore registers. 163 */ 164 #define NESTED(x, fsize, retpc) \ 165 .globl _C_LABEL(x); \ 166 .ent _C_LABEL(x), 0; \ 167 _C_LABEL(x): ; \ 168 .frame sp, fsize, retpc; \ 169 MCOUNT 170 171 /* 172 * NESTED_NOPROFILE(x) 173 * No profilable nested routine. 174 */ 175 #define NESTED_NOPROFILE(x, fsize, retpc) \ 176 .globl _C_LABEL(x); \ 177 .ent _C_LABEL(x), 0; \ 178 _C_LABEL(x): ; \ 179 .frame sp, fsize, retpc 180 181 /* 182 * XNESTED 183 * declare alternate entry point to nested routine. 184 */ 185 #define XNESTED(x) \ 186 .globl _C_LABEL(x); \ 187 AENT (_C_LABEL(x)); \ 188 _C_LABEL(x): 189 190 /* 191 * END 192 * Mark end of a procedure. 193 */ 194 #define END(x) \ 195 .end _C_LABEL(x) 196 197 /* 198 * IMPORT -- import external symbol 199 */ 200 #define IMPORT(sym, size) \ 201 .extern _C_LABEL(sym),size 202 203 /* 204 * EXPORT -- export definition of symbol 205 */ 206 #define EXPORT(x) \ 207 .globl _C_LABEL(x); \ 208 _C_LABEL(x): 209 210 /* 211 * VECTOR 212 * exception vector entrypoint 213 * XXX: regmask should be used to generate .mask 214 */ 215 #define VECTOR(x, regmask) \ 216 .ent _C_LABEL(x),0; \ 217 EXPORT(x); \ 218 219 #ifdef __STDC__ 220 #define VECTOR_END(x) \ 221 EXPORT(x ## End); \ 222 END(x) 223 #else 224 #define VECTOR_END(x) \ 225 EXPORT(x/**/End); \ 226 END(x) 227 #endif 228 229 /* 230 * Macros to panic and printf from assembly language. 231 */ 232 #define PANIC(msg) \ 233 la a0, 9f; \ 234 jal _C_LABEL(panic); \ 235 MSG(msg) 236 237 #define PRINTF(msg) \ 238 la a0, 9f; \ 239 jal _C_LABEL(printf); \ 240 MSG(msg) 241 242 #define MSG(msg) \ 243 .rdata; \ 244 9: .asciiz msg; \ 245 .text 246 247 #define ASMSTR(str) \ 248 .asciiz str; \ 249 .align 3 250 251 /* 252 * XXX retain dialects XXX 253 */ 254 #define ALEAF(x) XLEAF(x) 255 #define NLEAF(x) LEAF_NOPROFILE(x) 256 #define NON_LEAF(x, fsize, retpc) NESTED(x, fsize, retpc) 257 #define NNON_LEAF(x, fsize, retpc) NESTED_NOPROFILE(x, fsize, retpc) 258 259 /* 260 * standard callframe { 261 * register_t cf_args[4]; arg0 - arg3 262 * register_t cf_sp; frame pointer 263 * register_t cf_ra; return address 264 * }; 265 */ 266 #define CALLFRAME_SIZ (4 * (4 + 2)) 267 #define CALLFRAME_SP (4 * 4) 268 #define CALLFRAME_RA (4 * 5) 269 270 /* 271 * While it would be nice to be compatible with the SGI 272 * REG_L and REG_S macros, because they do not take parameters, it 273 * is impossible to use them with the _MIPS_SIM_ABIX32 model. 274 * 275 * These macros hide the use of mips3 instructions from the 276 * assembler to prevent the assembler from generating 64-bit style 277 * ABI calls. 278 */ 279 280 #if !defined(_MIPS_BSD_API) || _MIPS_BSD_API == _MIPS_BSD_API_LP32 281 #define REG_L lw 282 #define REG_S sw 283 #define REG_LI li 284 #define REG_PROLOGUE .set push 285 #define REG_EPILOGUE .set pop 286 #define SZREG 4 287 #else 288 #define REG_L ld 289 #define REG_S sd 290 #define REG_LI dli 291 #define REG_PROLOGUE .set push ; .set mips3 292 #define REG_EPILOGUE .set pop 293 #define SZREG 8 294 #endif /* _MIPS_BSD_API */ 295 296 #endif /* _MIPS_ASM_H */ 297