/*	$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
