xref: /netbsd-src/sys/arch/hppa/include/asm.h (revision ccd9df534e375a4366c5b55f23782053c7a98d82)
1 /*	$NetBSD: asm.h,v 1.18 2022/06/01 06:18:04 skrll Exp $	*/
2 
3 /*	$OpenBSD: asm.h,v 1.12 2001/03/29 02:15:57 mickey Exp $	*/
4 
5 /*
6  * Copyright (c) 1990,1991,1994 The University of Utah and
7  * the Computer Systems Laboratory (CSL).  All rights reserved.
8  *
9  * Permission to use, copy, modify and distribute this software is hereby
10  * granted provided that (1) source code retains these copyright, permission,
11  * and disclaimer notices, and (2) redistributions including binaries
12  * reproduce the notices in supporting documentation, and (3) all advertising
13  * materials mentioning features or use of this software display the following
14  * acknowledgement: ``This product includes software developed by the
15  * Computer Systems Laboratory at the University of Utah.''
16  *
17  * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
18  * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
19  * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
20  *
21  * CSL requests users of this software to return to csl-dist@cs.utah.edu any
22  * improvements that they make and grant CSL redistribution rights.
23  *
24  *	Utah $Hdr: asm.h 1.8 94/12/14$
25  */
26 
27 #ifndef _HPPA_ASM_H_
28 #define _HPPA_ASM_H_
29 
30 #include <machine/frame.h>
31 /*
32  *	hppa assembler definitions
33  */
34 
35 #ifdef __STDC__
36 #define	__CONCAT(a,b)	a ## b
37 #else
38 #define	__CONCAT(a,b)	a/**/b
39 #endif
40 
41 #define _C_LABEL(x)	x
42 
43 #define _ASM_LS_CHAR	!
44 
45 #define	_ENTRY(x) \
46 	 ! .text ! .align 4				!\
47 	.export x, entry ! .label x ! .proc
48 
49 #define	LEAF_ENTRY_NOPROFILE(x)				!\
50 	_ENTRY(x)					!\
51 	.callinfo frame=0, no_calls, save_rp		!\
52 	.entry
53 
54 #define	ENTRY_NOPROFILE(x,n)				!\
55 	_ENTRY(x)					!\
56 	.callinfo frame=n, calls, save_rp, save_sp	!\
57 	.entry
58 
59 #ifdef GPROF
60 
61 #define	_PROF_PROLOGUE				!\
62 1:						!\
63 	stw	%rp, HPPA_FRAME_CRP(%sp)	!\
64 	stw	%arg0, HPPA_FRAME_ARG(0)(%sp)	!\
65 	stw	%arg1, HPPA_FRAME_ARG(1)(%sp)	!\
66 	stw	%arg2, HPPA_FRAME_ARG(2)(%sp)	!\
67 	stw	%arg3, HPPA_FRAME_ARG(3)(%sp)	!\
68 	ldo	HPPA_FRAME_SIZE(%sp), %sp	!\
69 	copy	%rp, %arg0			!\
70 	bl	2f, %arg1			!\
71 	 depi	0, 31, 2, %arg1			!\
72 2:						!\
73 	bl	_mcount, %rp			!\
74 	 ldo	1b - 2b(%arg1), %arg1		!\
75 	ldo	-HPPA_FRAME_SIZE(%sp), %sp	!\
76 	ldw	HPPA_FRAME_ARG(3)(%sp), %arg3	!\
77 	ldw	HPPA_FRAME_ARG(2)(%sp), %arg2	!\
78 	ldw	HPPA_FRAME_ARG(1)(%sp), %arg1	!\
79 	ldw	HPPA_FRAME_ARG(0)(%sp), %arg0	!\
80 	ldw	HPPA_FRAME_CRP(%sp), %rp	!\
81 
82 #define LEAF_ENTRY(x) 				!\
83 	ENTRY_NOPROFILE(x,HPPA_FRAME_SIZE)	!\
84 	_PROF_PROLOGUE
85 
86 #else /* GPROF */
87 
88 #define _PROF_PROLOGUE
89 
90 #define LEAF_ENTRY(x) 				!\
91 	LEAF_ENTRY_NOPROFILE(x)
92 
93 #endif /* GPROF */
94 
95 #define ENTRY(x,n) 				!\
96 	ENTRY_NOPROFILE(x,n)			!\
97 	_PROF_PROLOGUE
98 
99 #define ALTENTRY(x) ! .export x, entry ! .label x
100 #define EXIT(x) ! .exit ! .procend ! .size x, .-x
101 
102 #define RCSID(x)	.pushsection ".ident","MS",@progbits,1;		\
103 			.asciz x;					\
104 			.popsection
105 
106 #define WEAK_ALIAS(alias,sym)				\
107 	.weak alias !					\
108 	alias = sym
109 
110 /*
111  * STRONG_ALIAS: create a strong alias.
112  */
113 #define STRONG_ALIAS(alias,sym)				\
114 	.globl alias !					\
115 	alias = sym
116 
117 #define CALL(func,tmp)					!\
118 	ldil	L%func, tmp				!\
119 	ldo	R%func(tmp), tmp			!\
120 	.call						!\
121 	blr	%r0, %rp				!\
122 	bv,n	%r0(tmp)				!\
123 	nop
124 
125 #ifdef __PIC__
126 #define PIC_CALL(func)					!\
127 	addil	LT%func, %r19				!\
128 	ldw	RT%func(%r1), %r1			!\
129 	.call						!\
130 	blr	%r0, %rp				!\
131 	bv,n	%r0(%r1)				!\
132 	nop
133 #else
134 #define PIC_CALL(func)					!\
135 	CALL(func,%r1)
136 #endif
137 
138 #ifdef __STDC__
139 #define	WARN_REFERENCES(sym,msg)					\
140 	.pushsection .gnu.warning. ## sym;				\
141 	.ascii msg;							\
142 	.popsection
143 #else
144 #define	WARN_REFERENCES(sym,msg)					\
145 	.pushsection .gnu.warning./**/sym;				\
146 	.ascii msg;							\
147 	.popsection
148 #endif /* __STDC__ */
149 
150 #define	BSS(n,s)	.comm n, s
151 #define	SZREG	4
152 
153 #endif /* _HPPA_ASM_H_ */
154