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