asm.h revision 66633
166458Sdfr/* $FreeBSD: head/sys/ia64/include/asm.h 66633 2000-10-04 17:53:03Z dfr $ */ 266458Sdfr/* From: NetBSD: asm.h,v 1.18 1997/11/03 04:22:06 ross Exp */ 366458Sdfr 466458Sdfr/* 566458Sdfr * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University 666458Sdfr * All Rights Reserved. 766458Sdfr * 866458Sdfr * Permission to use, copy, modify and distribute this software and its 966458Sdfr * documentation is hereby granted, provided that both the copyright 1066458Sdfr * notice and this permission notice appear in all copies of the 1166458Sdfr * software, derivative works or modified versions, and any portions 1266458Sdfr * thereof, and that both notices appear in supporting documentation. 1366458Sdfr * 1466458Sdfr * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 1566458Sdfr * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 1666458Sdfr * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 1766458Sdfr * 1866458Sdfr * Carnegie Mellon requests users of this software to return to 1966458Sdfr * 2066458Sdfr * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 2166458Sdfr * School of Computer Science 2266458Sdfr * Carnegie Mellon University 2366458Sdfr * Pittsburgh PA 15213-3890 2466458Sdfr * 2566458Sdfr * any improvements or extensions that they make and grant Carnegie Mellon 2666458Sdfr * the rights to redistribute these changes. 2766458Sdfr */ 2866458Sdfr 2966458Sdfr/* 3066458Sdfr * Assembly coding style 3166458Sdfr * 3266458Sdfr * This file contains macros and register defines to 3366458Sdfr * aid in writing more readable assembly code. 3466458Sdfr * Some rules to make assembly code understandable by 3566458Sdfr * a debugger are also noted. 3666458Sdfr * 3766458Sdfr * The document 3866458Sdfr * 3966458Sdfr * "ALPHA Calling Standard", DEC 27-Apr-90 4066458Sdfr * 4166458Sdfr * defines (a superset of) the rules and conventions 4266458Sdfr * we use. While we make no promise of adhering to 4366458Sdfr * such standard and its evolution (esp where we 4466458Sdfr * can get faster code paths) it is certainly intended 4566458Sdfr * that we be interoperable with such standard. 4666458Sdfr * 4766458Sdfr * In this sense, this file is a proper part of the 4866458Sdfr * definition of the (software) Alpha architecture. 4966458Sdfr */ 5066458Sdfr 5166458Sdfr/* 5266458Sdfr * Macro to make a local label name. 5366458Sdfr */ 5466458Sdfr#define LLABEL(name,num) L ## name ## num 5566458Sdfr 5666458Sdfr/* 5766458Sdfr * MCOUNT 5866458Sdfr */ 5966458Sdfr 6066458Sdfr#if !defined(GPROF) && !defined(PROF) 6166458Sdfr#define MCOUNT /* nothing */ 6266458Sdfr#else 6366458Sdfr#define MCOUNT \ 6466458Sdfr .set noat; \ 6566458Sdfr jsr at_reg,_mcount; \ 6666458Sdfr .set at 6766458Sdfr#endif 6866458Sdfr 6966458Sdfr/* 7066633Sdfr * ENTRY 7166458Sdfr * Declare a global leaf function. 7266458Sdfr * A leaf function does not call other functions. 7366458Sdfr */ 7466633Sdfr#define ENTRY(_name_, _n_args_) \ 7566458Sdfr .global _name_; \ 7666633Sdfr .align 16; \ 7766458Sdfr .proc _name_; \ 7866458Sdfr_name_:; \ 7966458Sdfr .regstk _n_args_, 0, 0, 0 \ 8066458Sdfr MCOUNT 8166458Sdfr 8266633Sdfr#define ENTRY_NOPROFILE(_name_, _n_args_) \ 8366458Sdfr .global _name_; \ 8466633Sdfr .align 16; \ 8566458Sdfr .proc _name_; \ 8666458Sdfr_name_:; \ 8766458Sdfr .regstk _n_args_, 0, 0, 0 8866458Sdfr 8966458Sdfr/* 9066633Sdfr * STATIC_ENTRY 9166458Sdfr * Declare a local leaf function. 9266458Sdfr */ 9366633Sdfr#define STATIC_ENTRY(_name_, _n_args_) \ 9466633Sdfr .align 16; \ 9566458Sdfr .proc _name_; \ 9666458Sdfr_name_:; \ 9766458Sdfr .regstk _n_args_, 0, 0, 0 \ 9866458Sdfr MCOUNT 9966458Sdfr/* 10066633Sdfr * XENTRY 10166458Sdfr * Global alias for a leaf function, or alternate entry point 10266458Sdfr */ 10366633Sdfr#define XENTRY(_name_) \ 10466458Sdfr .globl _name_; \ 10566458Sdfr_name_: 10666458Sdfr 10766458Sdfr/* 10866633Sdfr * STATIC_XENTRY 10966458Sdfr * Local alias for a leaf function, or alternate entry point 11066458Sdfr */ 11166633Sdfr#define STATIC_XENTRY(_name_) \ 11266458Sdfr_name_: 11366458Sdfr 11466458Sdfr 11566458Sdfr/* 11666458Sdfr * END 11766458Sdfr * Function delimiter 11866458Sdfr */ 11966458Sdfr#define END(_name_) \ 12066458Sdfr .endp _name_ 12166458Sdfr 12266458Sdfr 12366458Sdfr/* 12466458Sdfr * EXPORT 12566458Sdfr * Export a symbol 12666458Sdfr */ 12766458Sdfr#define EXPORT(_name_) \ 12866458Sdfr .global _name_; \ 12966458Sdfr_name_: 13066458Sdfr 13166458Sdfr 13266458Sdfr/* 13366458Sdfr * IMPORT 13466458Sdfr * Make an external name visible, typecheck the size 13566458Sdfr */ 13666458Sdfr#define IMPORT(_name_, _size_) \ 13766458Sdfr /* .extern _name_,_size_ */ 13866458Sdfr 13966458Sdfr 14066458Sdfr/* 14166458Sdfr * ABS 14266458Sdfr * Define an absolute symbol 14366458Sdfr */ 14466458Sdfr#define ABS(_name_, _value_) \ 14566458Sdfr .globl _name_; \ 14666458Sdfr_name_ = _value_ 14766458Sdfr 14866458Sdfr 14966458Sdfr/* 15066458Sdfr * BSS 15166458Sdfr * Allocate un-initialized space for a global symbol 15266458Sdfr */ 15366458Sdfr#define BSS(_name_,_numbytes_) \ 15466458Sdfr .comm _name_,_numbytes_ 15566458Sdfr 15666458Sdfr 15766458Sdfr/* 15866458Sdfr * MSG 15966458Sdfr * Allocate space for a message (a read-only ascii string) 16066458Sdfr */ 16166458Sdfr#define ASCIZ .asciz 16266633Sdfr#define MSG(msg,reg,label) \ 16366633Sdfr addl reg,@ltoff(label),gp;; \ 16466633Sdfr ld8 reg=[reg];; \ 16566633Sdfr .data; \ 16666633Sdfrlabel: ASCIZ msg; \ 16766458Sdfr .text; 16866458Sdfr 16966458Sdfr/* 17066458Sdfr * System call glue. 17166458Sdfr */ 17266458Sdfr#define SYSCALLNUM(name) \ 17366458Sdfr SYS_ ## name 17466458Sdfr 17566458Sdfr#define CALLSYS_NOERROR(name) \ 17666458Sdfr mov r15=SYSCALLNUM(name); \ 17766458Sdfr break 0x100000 ;; 17866458Sdfr 17966458Sdfr/* 18066458Sdfr * WEAK_ALIAS: create a weak alias (ELF only). 18166458Sdfr */ 18266458Sdfr#ifdef __ELF__ 18366458Sdfr#define WEAK_ALIAS(alias,sym) \ 18466458Sdfr .weak alias; \ 18566458Sdfr alias = sym 18666458Sdfr#endif 18766458Sdfr 18866458Sdfr/* 18966458Sdfr * Kernel RCS ID tag and copyright macros 19066458Sdfr */ 19166458Sdfr 19266458Sdfr#ifdef _KERNEL 19366458Sdfr 19466458Sdfr#ifdef __ELF__ 19566458Sdfr#define __KERNEL_SECTIONSTRING(_sec, _str) \ 19666458Sdfr .section _sec ; .asciz _str ; .text 19766458Sdfr#else /* __ELF__ */ 19866458Sdfr#define __KERNEL_SECTIONSTRING(_sec, _str) \ 19966458Sdfr .data ; .asciz _str ; .align 3 ; .text 20066458Sdfr#endif /* __ELF__ */ 20166458Sdfr 20266458Sdfr#define __KERNEL_RCSID(_n, _s) __KERNEL_SECTIONSTRING(.ident, _s) 20366458Sdfr#define __KERNEL_COPYRIGHT(_n, _s) __KERNEL_SECTIONSTRING(.copyright, _s) 20466458Sdfr 20566458Sdfr#ifdef NO_KERNEL_RCSIDS 20666458Sdfr#undef __KERNEL_RCSID 20766458Sdfr#define __KERNEL_RCSID(_n, _s) /* nothing */ 20866458Sdfr#endif 20966458Sdfr 21066458Sdfr#endif /* _KERNEL */ 211