| /* $NetBSD: asm.h,v 1.4 2006/08/30 11:14:23 cherry Exp $ */ | |
| /* - | |
| * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University | |
| * All Rights Reserved. | |
| * | |
| * Permission to use, copy, modify and distribute this software and its | |
| * documentation is hereby granted, provided that both the copyright | |
| * notice and this permission notice appear in all copies of the | |
| * software, derivative works or modified versions, and any portions | |
| * thereof, and that both notices appear in supporting documentation. | |
| * | |
| * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" | |
| * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR | |
| * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. | |
| * | |
| * Carnegie Mellon requests users of this software to return to | |
| * | |
| * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU | |
| * School of Computer Science | |
| * Carnegie Mellon University | |
| * Pittsburgh PA 15213-3890 | |
| * | |
| * any improvements or extensions that they make and grant Carnegie Mellon | |
| * the rights to redistribute these changes. | |
| */ | |
| /* | |
| * Assembly coding style | |
| * | |
| * This file contains macros and register defines to | |
| * aid in writing more readable assembly code. | |
| * Some rules to make assembly code understandable by | |
| * a debugger are also noted. | |
| */ | |
| /* | |
| * Macro to make a local label name. | |
| */ | |
| #define LLABEL(name,num) L ## name ## num | |
| /* | |
| * MCOUNT | |
| */ | |
| #if defined(GPROF) | |
| #define MCOUNT \ | |
| alloc out0 = ar.pfs, 8, 0, 4, 0; \ | |
| mov out1 = r1; \ | |
| mov out2 = b0;; \ | |
| mov out3 = r0; \ | |
| br.call.sptk b0 = _mcount;; | |
| #else | |
| #define MCOUNT /* nothing */ | |
| #endif | |
| /* | |
| * ENTRY | |
| * Declare a global leaf function. | |
| * A leaf function does not call other functions. | |
| */ | |
| #define ENTRY(_name_, _n_args_) \ | |
| .global _name_; \ | |
| .align 16; \ | |
| .proc _name_; \ | |
| _name_:; \ | |
| .regstk _n_args_, 0, 0, 0; \ | |
| MCOUNT | |
| #define ENTRY_NOPROFILE(_name_, _n_args_) \ | |
| .global _name_; \ | |
| .align 16; \ | |
| .proc _name_; \ | |
| _name_:; \ | |
| .regstk _n_args_, 0, 0, 0 | |
| /* | |
| * STATIC_ENTRY | |
| * Declare a local leaf function. | |
| */ | |
| #define STATIC_ENTRY(_name_, _n_args_) \ | |
| .align 16; \ | |
| .proc _name_; \ | |
| _name_:; \ | |
| .regstk _n_args_, 0, 0, 0 \ | |
| MCOUNT | |
| /* | |
| * XENTRY | |
| * Global alias for a leaf function, or alternate entry point | |
| */ | |
| #define XENTRY(_name_) \ | |
| .globl _name_; \ | |
| _name_: | |
| /* | |
| * STATIC_XENTRY | |
| * Local alias for a leaf function, or alternate entry point | |
| */ | |
| #define STATIC_XENTRY(_name_) \ | |
| _name_: | |
| /* | |
| * END | |
| * Function delimiter | |
| */ | |
| #define END(_name_) \ | |
| .endp _name_ | |
| /* | |
| * EXPORT | |
| * Export a symbol | |
| */ | |
| #define EXPORT(_name_) \ | |
| .global _name_; \ | |
| _name_: | |
| /* | |
| * IMPORT | |
| * Make an external name visible, typecheck the size | |
| */ | |
| #define IMPORT(_name_, _size_) \ | |
| /* .extern _name_,_size_ */ | |
| /* | |
| * ABS | |
| * Define an absolute symbol | |
| */ | |
| #define ABS(_name_, _value_) \ | |
| .globl _name_; \ | |
| _name_ = _value_ | |
| /* | |
| * BSS | |
| * Allocate un-initialized space for a global symbol | |
| */ | |
| #define BSS(_name_,_numbytes_) \ | |
| .comm _name_,_numbytes_ | |
| /* | |
| * MSG | |
| * Allocate space for a message (a read-only ascii string) | |
| */ | |
| #define ASCIZ .asciz | |
| #define MSG(msg,reg,label) \ | |
| addl reg,@ltoff(label),gp;; \ | |
| ld8 reg=[reg];; \ | |
| .data; \ | |
| label: ASCIZ msg; \ | |
| .text; | |
| /* | |
| * System call glue. | |
| */ | |
| #define SYSCALLNUM(name) ___CONCAT(SYS_,name) | |
| #define CALLSYS_NOERROR(name) \ | |
| { .mmi ; \ | |
| alloc r9 = ar.pfs, 0, 0, 8, 0 ; \ | |
| mov r31 = ar.k5 ; \ | |
| mov r10 = b0 ;; } \ | |
| { .mib ; \ | |
| mov r8 = SYSCALLNUM(name) ; \ | |
| mov b7 = r31 ; \ | |
| br.call.sptk b0 = b7 ;; } | |
| /* | |
| * WEAK_ALIAS: create a weak alias (ELF only). | |
| */ | |
| #define WEAK_ALIAS(alias,sym) \ | |
| .weak alias; \ | |
| alias = sym | |
| /* | |
| * STRONG_ALIAS: create a strong alias. | |
| */ | |
| #define STRONG_ALIAS(alias,sym) \ | |
| .globl alias; \ | |
| alias = sym |