1229972Sadrian/* $FreeBSD$ */ 2229972Sadrian/* From: NetBSD: asm.h,v 1.18 1997/11/03 04:22:06 ross Exp */ 3229972Sadrian 4229972Sadrian/*- 5229972Sadrian * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University 6229972Sadrian * All Rights Reserved. 7229972Sadrian * 8229972Sadrian * Permission to use, copy, modify and distribute this software and its 9229972Sadrian * documentation is hereby granted, provided that both the copyright 10229972Sadrian * notice and this permission notice appear in all copies of the 11229972Sadrian * software, derivative works or modified versions, and any portions 12229972Sadrian * thereof, and that both notices appear in supporting documentation. 13229972Sadrian * 14229972Sadrian * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 15229972Sadrian * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 16229972Sadrian * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 17229972Sadrian * 18229972Sadrian * Carnegie Mellon requests users of this software to return to 19229972Sadrian * 20229972Sadrian * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 21229972Sadrian * School of Computer Science 22229972Sadrian * Carnegie Mellon University 23229972Sadrian * Pittsburgh PA 15213-3890 24229972Sadrian * 25229972Sadrian * any improvements or extensions that they make and grant Carnegie Mellon 26229972Sadrian * the rights to redistribute these changes. 27229972Sadrian */ 28229972Sadrian 29229972Sadrian/* 30229972Sadrian * Assembly coding style 31229972Sadrian * 32229972Sadrian * This file contains macros and register defines to 33229972Sadrian * aid in writing more readable assembly code. 34229972Sadrian * Some rules to make assembly code understandable by 35229972Sadrian * a debugger are also noted. 36229972Sadrian */ 37229972Sadrian 38229972Sadrian/* 39229972Sadrian * Macro to make a local label name. 40229972Sadrian */ 41229972Sadrian#define LLABEL(name,num) L ## name ## num 42229972Sadrian 43229972Sadrian/* 44229972Sadrian * MCOUNT 45229972Sadrian */ 46229972Sadrian#if defined(PROF) || (defined(_KERNEL) && defined(GPROF)) 47229972Sadrian#define MCOUNT \ 48229972Sadrian alloc out0 = ar.pfs, 8, 0, 4, 0; \ 49229972Sadrian mov out1 = r1; \ 50229972Sadrian mov out2 = b0;; \ 51229972Sadrian mov out3 = r0; \ 52229972Sadrian br.call.sptk b0 = _mcount;; 53229972Sadrian#else 54229972Sadrian#define MCOUNT /* nothing */ 55229972Sadrian#endif 56229972Sadrian 57229972Sadrian/* 58229972Sadrian * ENTRY 59229972Sadrian * Declare a global leaf function. 60229972Sadrian * A leaf function does not call other functions. 61229972Sadrian */ 62229972Sadrian#define ENTRY(_name_, _n_args_) \ 63229972Sadrian .global _name_; \ 64229972Sadrian .align 32; \ 65229972Sadrian .proc _name_; \ 66229972Sadrian_name_:; \ 67229972Sadrian .regstk _n_args_, 0, 0, 0; \ 68229972Sadrian MCOUNT 69229972Sadrian 70229972Sadrian#define ENTRY_NOPROFILE(_name_, _n_args_) \ 71229972Sadrian .global _name_; \ 72229972Sadrian .align 32; \ 73229972Sadrian .proc _name_; \ 74229972Sadrian_name_:; \ 75229972Sadrian .regstk _n_args_, 0, 0, 0 76229972Sadrian 77229972Sadrian/* 78229972Sadrian * STATIC_ENTRY 79229972Sadrian * Declare a local leaf function. 80229972Sadrian */ 81229972Sadrian#define STATIC_ENTRY(_name_, _n_args_) \ 82229972Sadrian .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; \ 154label: 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 */ 193