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