xref: /f-stack/freebsd/mips/include/asm.h (revision 22ce4aff)
1a9643ea8Slogwang /*	$NetBSD: asm.h,v 1.29 2000/12/14 21:29:51 jeffs Exp $	*/
2a9643ea8Slogwang 
3a9643ea8Slogwang /*
4*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-3-Clause
5*22ce4affSfengbojiang  *
6a9643ea8Slogwang  * Copyright (c) 1992, 1993
7a9643ea8Slogwang  *	The Regents of the University of California.  All rights reserved.
8a9643ea8Slogwang  *
9a9643ea8Slogwang  * This code is derived from software contributed to Berkeley by
10a9643ea8Slogwang  * Ralph Campbell.
11a9643ea8Slogwang  *
12a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
13a9643ea8Slogwang  * modification, are permitted provided that the following conditions
14a9643ea8Slogwang  * are met:
15a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
16a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer.
17a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
18a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer in the
19a9643ea8Slogwang  *    documentation and/or other materials provided with the distribution.
20*22ce4affSfengbojiang  * 3. Neither the name of the University nor the names of its contributors
21a9643ea8Slogwang  *    may be used to endorse or promote products derived from this software
22a9643ea8Slogwang  *    without specific prior written permission.
23a9643ea8Slogwang  *
24a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26a9643ea8Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27a9643ea8Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28a9643ea8Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29a9643ea8Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30a9643ea8Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31a9643ea8Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32a9643ea8Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33a9643ea8Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34a9643ea8Slogwang  * SUCH DAMAGE.
35a9643ea8Slogwang  *
36a9643ea8Slogwang  *	@(#)machAsmDefs.h	8.1 (Berkeley) 6/10/93
37a9643ea8Slogwang  *	JNPR: asm.h,v 1.10 2007/08/09 11:23:32 katta
38a9643ea8Slogwang  * $FreeBSD$
39a9643ea8Slogwang  */
40a9643ea8Slogwang 
41a9643ea8Slogwang /*
42a9643ea8Slogwang  * machAsmDefs.h --
43a9643ea8Slogwang  *
44a9643ea8Slogwang  *	Macros used when writing assembler programs.
45a9643ea8Slogwang  *
46a9643ea8Slogwang  *	Copyright (C) 1989 Digital Equipment Corporation.
47a9643ea8Slogwang  *	Permission to use, copy, modify, and distribute this software and
48a9643ea8Slogwang  *	its documentation for any purpose and without fee is hereby granted,
49a9643ea8Slogwang  *	provided that the above copyright notice appears in all copies.
50a9643ea8Slogwang  *	Digital Equipment Corporation makes no representations about the
51a9643ea8Slogwang  *	suitability of this software for any purpose.  It is provided "as is"
52a9643ea8Slogwang  *	without express or implied warranty.
53a9643ea8Slogwang  *
54a9643ea8Slogwang  * from: Header: /sprite/src/kernel/mach/ds3100.md/RCS/machAsmDefs.h,
55a9643ea8Slogwang  *	v 1.2 89/08/15 18:28:24 rab Exp  SPRITE (DECWRL)
56a9643ea8Slogwang  */
57a9643ea8Slogwang 
58a9643ea8Slogwang #ifndef _MACHINE_ASM_H_
59a9643ea8Slogwang #define	_MACHINE_ASM_H_
60a9643ea8Slogwang 
61*22ce4affSfengbojiang #include <machine/abi.h>
62a9643ea8Slogwang #include <machine/regdef.h>
63a9643ea8Slogwang #include <machine/endian.h>
64a9643ea8Slogwang #include <machine/cdefs.h>
65a9643ea8Slogwang 
66a9643ea8Slogwang #undef __FBSDID
67a9643ea8Slogwang #if !defined(lint) && !defined(STRIP_FBSDID)
68a9643ea8Slogwang #define	__FBSDID(s)	.ident s
69a9643ea8Slogwang #else
70a9643ea8Slogwang #define	__FBSDID(s)	/* nothing */
71a9643ea8Slogwang #endif
72a9643ea8Slogwang 
73a9643ea8Slogwang /*
74a9643ea8Slogwang  * Define -pg profile entry code.
75a9643ea8Slogwang  * Must always be noreorder, must never use a macro instruction
76a9643ea8Slogwang  * Final addiu to t9 must always equal the size of this _KERN_MCOUNT
77a9643ea8Slogwang  */
78a9643ea8Slogwang #define	_KERN_MCOUNT			\
79a9643ea8Slogwang 	.set	push;			\
80a9643ea8Slogwang 	.set	noreorder;		\
81a9643ea8Slogwang 	.set	noat;			\
82a9643ea8Slogwang 	subu	sp,sp,16;		\
83a9643ea8Slogwang 	sw	t9,12(sp);		\
84a9643ea8Slogwang 	move	AT,ra;			\
85a9643ea8Slogwang 	lui	t9,%hi(_mcount);	\
86a9643ea8Slogwang 	addiu	t9,t9,%lo(_mcount);	\
87a9643ea8Slogwang 	jalr	t9;			\
88a9643ea8Slogwang 	nop;				\
89a9643ea8Slogwang 	lw	t9,4(sp);		\
90a9643ea8Slogwang 	addiu	sp,sp,8;		\
91a9643ea8Slogwang 	addiu	t9,t9,40;		\
92a9643ea8Slogwang 	.set	pop;
93a9643ea8Slogwang 
94a9643ea8Slogwang #ifdef GPROF
95a9643ea8Slogwang #define	MCOUNT _KERN_MCOUNT
96a9643ea8Slogwang #else
97a9643ea8Slogwang #define	MCOUNT
98a9643ea8Slogwang #endif
99a9643ea8Slogwang 
100a9643ea8Slogwang #define	_C_LABEL(x)	x
101a9643ea8Slogwang 
102a9643ea8Slogwang #ifdef USE_AENT
103a9643ea8Slogwang #define	AENT(x)		\
104a9643ea8Slogwang 	.aent	x, 0
105a9643ea8Slogwang #else
106a9643ea8Slogwang #define	AENT(x)
107a9643ea8Slogwang #endif
108a9643ea8Slogwang 
109a9643ea8Slogwang /*
110a9643ea8Slogwang  * WARN_REFERENCES: create a warning if the specified symbol is referenced
111a9643ea8Slogwang  */
112a9643ea8Slogwang #define	WARN_REFERENCES(_sym,_msg)				\
113a9643ea8Slogwang 	.section .gnu.warning. ## _sym ; .ascii _msg ; .text
114a9643ea8Slogwang 
115a9643ea8Slogwang #ifdef __ELF__
116a9643ea8Slogwang # define _C_LABEL(x)    x
117a9643ea8Slogwang #else
118a9643ea8Slogwang #  define _C_LABEL(x)   _ ## x
119a9643ea8Slogwang #endif
120a9643ea8Slogwang 
121a9643ea8Slogwang /*
122a9643ea8Slogwang  * WEAK_ALIAS: create a weak alias.
123a9643ea8Slogwang  */
124a9643ea8Slogwang #define	WEAK_ALIAS(alias,sym)						\
125a9643ea8Slogwang 	.weak alias;							\
126a9643ea8Slogwang 	alias = sym
127a9643ea8Slogwang 
128a9643ea8Slogwang /*
129a9643ea8Slogwang  * STRONG_ALIAS: create a strong alias.
130a9643ea8Slogwang  */
131a9643ea8Slogwang #define STRONG_ALIAS(alias,sym)						\
132a9643ea8Slogwang 	.globl alias;							\
133a9643ea8Slogwang 	alias = sym
134a9643ea8Slogwang 
135a9643ea8Slogwang #define	GLOBAL(sym)						\
136a9643ea8Slogwang 	.globl sym; sym:
137a9643ea8Slogwang 
138a9643ea8Slogwang #define	ENTRY(sym)						\
139a9643ea8Slogwang 	.text; .globl sym; .ent sym; sym:
140a9643ea8Slogwang 
141a9643ea8Slogwang #define	ASM_ENTRY(sym)						\
142a9643ea8Slogwang 	.text; .globl sym; .type sym,@function; sym:
143a9643ea8Slogwang 
144a9643ea8Slogwang /*
145a9643ea8Slogwang  * LEAF
146a9643ea8Slogwang  *	A leaf routine does
147a9643ea8Slogwang  *	- call no other function,
148a9643ea8Slogwang  *	- never use any register that callee-saved (S0-S8), and
149a9643ea8Slogwang  *	- not use any local stack storage.
150a9643ea8Slogwang  */
151a9643ea8Slogwang #define	LEAF(x)			\
152a9643ea8Slogwang 	.globl	_C_LABEL(x);	\
153a9643ea8Slogwang 	.ent	_C_LABEL(x), 0;	\
154a9643ea8Slogwang _C_LABEL(x): ;			\
155a9643ea8Slogwang 	.frame sp, 0, ra;	\
156a9643ea8Slogwang 	MCOUNT
157a9643ea8Slogwang 
158a9643ea8Slogwang /*
159a9643ea8Slogwang  * LEAF_NOPROFILE
160a9643ea8Slogwang  *	No profilable leaf routine.
161a9643ea8Slogwang  */
162a9643ea8Slogwang #define	LEAF_NOPROFILE(x)	\
163a9643ea8Slogwang 	.globl	_C_LABEL(x);	\
164a9643ea8Slogwang 	.ent	_C_LABEL(x), 0;	\
165a9643ea8Slogwang _C_LABEL(x): ;			\
166a9643ea8Slogwang 	.frame	sp, 0, ra
167a9643ea8Slogwang 
168a9643ea8Slogwang /*
169a9643ea8Slogwang  * XLEAF
170a9643ea8Slogwang  *	declare alternate entry to leaf routine
171a9643ea8Slogwang  */
172a9643ea8Slogwang #define	XLEAF(x)		\
173a9643ea8Slogwang 	.globl	_C_LABEL(x);	\
174a9643ea8Slogwang 	AENT (_C_LABEL(x));	\
175a9643ea8Slogwang _C_LABEL(x):
176a9643ea8Slogwang 
177a9643ea8Slogwang /*
178a9643ea8Slogwang  * NESTED
179a9643ea8Slogwang  *	A function calls other functions and needs
180a9643ea8Slogwang  *	therefore stack space to save/restore registers.
181a9643ea8Slogwang  */
182a9643ea8Slogwang #define	NESTED(x, fsize, retpc)		\
183a9643ea8Slogwang 	.globl	_C_LABEL(x);		\
184a9643ea8Slogwang 	.ent	_C_LABEL(x), 0;		\
185a9643ea8Slogwang _C_LABEL(x): ;				\
186a9643ea8Slogwang 	.frame	sp, fsize, retpc;	\
187a9643ea8Slogwang 	MCOUNT
188a9643ea8Slogwang 
189a9643ea8Slogwang /*
190a9643ea8Slogwang  * NESTED_NOPROFILE(x)
191a9643ea8Slogwang  *	No profilable nested routine.
192a9643ea8Slogwang  */
193a9643ea8Slogwang #define	NESTED_NOPROFILE(x, fsize, retpc)	\
194a9643ea8Slogwang 	.globl	_C_LABEL(x);			\
195a9643ea8Slogwang 	.ent	_C_LABEL(x), 0;			\
196a9643ea8Slogwang _C_LABEL(x): ;					\
197a9643ea8Slogwang 	.frame	sp, fsize, retpc
198a9643ea8Slogwang 
199a9643ea8Slogwang /*
200a9643ea8Slogwang  * XNESTED
201a9643ea8Slogwang  *	declare alternate entry point to nested routine.
202a9643ea8Slogwang  */
203a9643ea8Slogwang #define	XNESTED(x)		\
204a9643ea8Slogwang 	.globl	_C_LABEL(x);	\
205a9643ea8Slogwang 	AENT (_C_LABEL(x));	\
206a9643ea8Slogwang _C_LABEL(x):
207a9643ea8Slogwang 
208a9643ea8Slogwang /*
209a9643ea8Slogwang  * END
210a9643ea8Slogwang  *	Mark end of a procedure.
211a9643ea8Slogwang  */
212a9643ea8Slogwang #define	END(x)			\
213a9643ea8Slogwang 	.end _C_LABEL(x)
214a9643ea8Slogwang 
215a9643ea8Slogwang /*
216a9643ea8Slogwang  * IMPORT -- import external symbol
217a9643ea8Slogwang  */
218a9643ea8Slogwang #define	IMPORT(sym, size)	\
219a9643ea8Slogwang 	.extern _C_LABEL(sym),size
220a9643ea8Slogwang 
221a9643ea8Slogwang /*
222a9643ea8Slogwang  * EXPORT -- export definition of symbol
223a9643ea8Slogwang  */
224a9643ea8Slogwang #define	EXPORT(x)		\
225a9643ea8Slogwang 	.globl	_C_LABEL(x);	\
226a9643ea8Slogwang _C_LABEL(x):
227a9643ea8Slogwang 
228a9643ea8Slogwang /*
229a9643ea8Slogwang  * VECTOR
230a9643ea8Slogwang  *	exception vector entrypoint
231a9643ea8Slogwang  *	XXX: regmask should be used to generate .mask
232a9643ea8Slogwang  */
233a9643ea8Slogwang #define	VECTOR(x, regmask)	\
234a9643ea8Slogwang 	.ent	_C_LABEL(x),0;	\
235a9643ea8Slogwang 	EXPORT(x);		\
236a9643ea8Slogwang 
237a9643ea8Slogwang #define	VECTOR_END(x)		\
238a9643ea8Slogwang 	EXPORT(x ## End);	\
239a9643ea8Slogwang 	END(x)
240a9643ea8Slogwang 
241a9643ea8Slogwang /*
242a9643ea8Slogwang  * Macros to panic and printf from assembly language.
243a9643ea8Slogwang  */
244a9643ea8Slogwang #define	PANIC(msg)			\
245a9643ea8Slogwang 	PTR_LA	a0, 9f;			\
246a9643ea8Slogwang 	jal	_C_LABEL(panic);	\
247a9643ea8Slogwang 	nop;				\
248a9643ea8Slogwang 	MSG(msg)
249a9643ea8Slogwang 
250a9643ea8Slogwang #define	PANIC_KSEG0(msg, reg)	PANIC(msg)
251a9643ea8Slogwang 
252a9643ea8Slogwang #define	PRINTF(msg)			\
253a9643ea8Slogwang 	PTR_LA	a0, 9f;			\
254a9643ea8Slogwang 	jal	_C_LABEL(printf);	\
255a9643ea8Slogwang 	nop;				\
256a9643ea8Slogwang 	MSG(msg)
257a9643ea8Slogwang 
258a9643ea8Slogwang #define	MSG(msg)			\
259a9643ea8Slogwang 	.rdata;				\
260a9643ea8Slogwang 9:	.asciiz	msg;			\
261a9643ea8Slogwang 	.text
262a9643ea8Slogwang 
263a9643ea8Slogwang #define	ASMSTR(str)			\
264a9643ea8Slogwang 	.asciiz str;			\
265a9643ea8Slogwang 	.align	3
266a9643ea8Slogwang 
267a9643ea8Slogwang #if defined(__mips_o32) || defined(__mips_o64)
268a9643ea8Slogwang #define	ALSK	7		/* stack alignment */
269a9643ea8Slogwang #define	ALMASK	-7		/* stack alignment */
270a9643ea8Slogwang #define	SZFPREG	4
271a9643ea8Slogwang #define	FP_L	lwc1
272a9643ea8Slogwang #define	FP_S	swc1
273a9643ea8Slogwang #else
274a9643ea8Slogwang #define	ALSK	15		/* stack alignment */
275a9643ea8Slogwang #define	ALMASK	-15		/* stack alignment */
276a9643ea8Slogwang #define	SZFPREG	8
277a9643ea8Slogwang #define	FP_L	ldc1
278a9643ea8Slogwang #define	FP_S	sdc1
279a9643ea8Slogwang #endif
280a9643ea8Slogwang 
281a9643ea8Slogwang /*
282a9643ea8Slogwang  *   Endian-independent assembly-code aliases for unaligned memory accesses.
283a9643ea8Slogwang  */
284a9643ea8Slogwang #if _BYTE_ORDER == _LITTLE_ENDIAN
285a9643ea8Slogwang # define LWHI lwr
286a9643ea8Slogwang # define LWLO lwl
287a9643ea8Slogwang # define SWHI swr
288a9643ea8Slogwang # define SWLO swl
289a9643ea8Slogwang # if SZREG == 4
290a9643ea8Slogwang #  define REG_LHI   lwr
291a9643ea8Slogwang #  define REG_LLO   lwl
292a9643ea8Slogwang #  define REG_SHI   swr
293a9643ea8Slogwang #  define REG_SLO   swl
294a9643ea8Slogwang # else
295a9643ea8Slogwang #  define REG_LHI   ldr
296a9643ea8Slogwang #  define REG_LLO   ldl
297a9643ea8Slogwang #  define REG_SHI   sdr
298a9643ea8Slogwang #  define REG_SLO   sdl
299a9643ea8Slogwang # endif
300a9643ea8Slogwang #endif
301a9643ea8Slogwang 
302a9643ea8Slogwang #if _BYTE_ORDER == _BIG_ENDIAN
303a9643ea8Slogwang # define LWHI lwl
304a9643ea8Slogwang # define LWLO lwr
305a9643ea8Slogwang # define SWHI swl
306a9643ea8Slogwang # define SWLO swr
307a9643ea8Slogwang # if SZREG == 4
308a9643ea8Slogwang #  define REG_LHI   lwl
309a9643ea8Slogwang #  define REG_LLO   lwr
310a9643ea8Slogwang #  define REG_SHI   swl
311a9643ea8Slogwang #  define REG_SLO   swr
312a9643ea8Slogwang # else
313a9643ea8Slogwang #  define REG_LHI   ldl
314a9643ea8Slogwang #  define REG_LLO   ldr
315a9643ea8Slogwang #  define REG_SHI   sdl
316a9643ea8Slogwang #  define REG_SLO   sdr
317a9643ea8Slogwang # endif
318a9643ea8Slogwang #endif
319a9643ea8Slogwang 
320a9643ea8Slogwang /*
321a9643ea8Slogwang  * While it would be nice to be compatible with the SGI
322a9643ea8Slogwang  * REG_L and REG_S macros, because they do not take parameters, it
323a9643ea8Slogwang  * is impossible to use them with the _MIPS_SIM_ABIX32 model.
324a9643ea8Slogwang  *
325a9643ea8Slogwang  * These macros hide the use of mips3 instructions from the
326a9643ea8Slogwang  * assembler to prevent the assembler from generating 64-bit style
327a9643ea8Slogwang  * ABI calls.
328a9643ea8Slogwang  */
329a9643ea8Slogwang #if _MIPS_SZPTR == 32
330a9643ea8Slogwang #define	PTR_ADD		add
331a9643ea8Slogwang #define	PTR_ADDI	addi
332a9643ea8Slogwang #define	PTR_ADDU	addu
333a9643ea8Slogwang #define	PTR_ADDIU	addiu
334a9643ea8Slogwang #define	PTR_SUB		add
335a9643ea8Slogwang #define	PTR_SUBI	subi
336a9643ea8Slogwang #define	PTR_SUBU	subu
337a9643ea8Slogwang #define	PTR_SUBIU	subu
338a9643ea8Slogwang #define	PTR_L		lw
339a9643ea8Slogwang #define	PTR_LA		la
340a9643ea8Slogwang #define	PTR_LI		li
341a9643ea8Slogwang #define	PTR_S		sw
342a9643ea8Slogwang #define	PTR_SLL		sll
343a9643ea8Slogwang #define	PTR_SLLV	sllv
344a9643ea8Slogwang #define	PTR_SRL		srl
345a9643ea8Slogwang #define	PTR_SRLV	srlv
346a9643ea8Slogwang #define	PTR_SRA		sra
347a9643ea8Slogwang #define	PTR_SRAV	srav
348a9643ea8Slogwang #define	PTR_LL		ll
349a9643ea8Slogwang #define	PTR_SC		sc
350a9643ea8Slogwang #define	PTR_WORD	.word
351a9643ea8Slogwang #define	PTR_SCALESHIFT	2
352a9643ea8Slogwang #else /* _MIPS_SZPTR == 64 */
353a9643ea8Slogwang #define	PTR_ADD		dadd
354a9643ea8Slogwang #define	PTR_ADDI	daddi
355a9643ea8Slogwang #define	PTR_ADDU	daddu
356a9643ea8Slogwang #define	PTR_ADDIU	daddiu
357a9643ea8Slogwang #define	PTR_SUB		dadd
358a9643ea8Slogwang #define	PTR_SUBI	dsubi
359a9643ea8Slogwang #define	PTR_SUBU	dsubu
360a9643ea8Slogwang #define	PTR_SUBIU	dsubu
361a9643ea8Slogwang #define	PTR_L		ld
362a9643ea8Slogwang #define	PTR_LA		dla
363a9643ea8Slogwang #define	PTR_LI		dli
364a9643ea8Slogwang #define	PTR_S		sd
365a9643ea8Slogwang #define	PTR_SLL		dsll
366a9643ea8Slogwang #define	PTR_SLLV	dsllv
367a9643ea8Slogwang #define	PTR_SRL		dsrl
368a9643ea8Slogwang #define	PTR_SRLV	dsrlv
369a9643ea8Slogwang #define	PTR_SRA		dsra
370a9643ea8Slogwang #define	PTR_SRAV	dsrav
371a9643ea8Slogwang #define	PTR_LL		lld
372a9643ea8Slogwang #define	PTR_SC		scd
373a9643ea8Slogwang #define	PTR_WORD	.dword
374a9643ea8Slogwang #define	PTR_SCALESHIFT	3
375a9643ea8Slogwang #endif /* _MIPS_SZPTR == 64 */
376a9643ea8Slogwang 
377a9643ea8Slogwang #if _MIPS_SZINT == 32
378a9643ea8Slogwang #define	INT_ADD		add
379a9643ea8Slogwang #define	INT_ADDI	addi
380a9643ea8Slogwang #define	INT_ADDU	addu
381a9643ea8Slogwang #define	INT_ADDIU	addiu
382a9643ea8Slogwang #define	INT_SUB		add
383a9643ea8Slogwang #define	INT_SUBI	subi
384a9643ea8Slogwang #define	INT_SUBU	subu
385a9643ea8Slogwang #define	INT_SUBIU	subu
386a9643ea8Slogwang #define	INT_L		lw
387a9643ea8Slogwang #define	INT_LA		la
388a9643ea8Slogwang #define	INT_S		sw
389a9643ea8Slogwang #define	INT_SLL		sll
390a9643ea8Slogwang #define	INT_SLLV	sllv
391a9643ea8Slogwang #define	INT_SRL		srl
392a9643ea8Slogwang #define	INT_SRLV	srlv
393a9643ea8Slogwang #define	INT_SRA		sra
394a9643ea8Slogwang #define	INT_SRAV	srav
395a9643ea8Slogwang #define	INT_LL		ll
396a9643ea8Slogwang #define	INT_SC		sc
397a9643ea8Slogwang #define	INT_WORD	.word
398a9643ea8Slogwang #define	INT_SCALESHIFT	2
399a9643ea8Slogwang #else
400a9643ea8Slogwang #define	INT_ADD		dadd
401a9643ea8Slogwang #define	INT_ADDI	daddi
402a9643ea8Slogwang #define	INT_ADDU	daddu
403a9643ea8Slogwang #define	INT_ADDIU	daddiu
404a9643ea8Slogwang #define	INT_SUB		dadd
405a9643ea8Slogwang #define	INT_SUBI	dsubi
406a9643ea8Slogwang #define	INT_SUBU	dsubu
407a9643ea8Slogwang #define	INT_SUBIU	dsubu
408a9643ea8Slogwang #define	INT_L		ld
409a9643ea8Slogwang #define	INT_LA		dla
410a9643ea8Slogwang #define	INT_S		sd
411a9643ea8Slogwang #define	INT_SLL		dsll
412a9643ea8Slogwang #define	INT_SLLV	dsllv
413a9643ea8Slogwang #define	INT_SRL		dsrl
414a9643ea8Slogwang #define	INT_SRLV	dsrlv
415a9643ea8Slogwang #define	INT_SRA		dsra
416a9643ea8Slogwang #define	INT_SRAV	dsrav
417a9643ea8Slogwang #define	INT_LL		lld
418a9643ea8Slogwang #define	INT_SC		scd
419a9643ea8Slogwang #define	INT_WORD	.dword
420a9643ea8Slogwang #define	INT_SCALESHIFT	3
421a9643ea8Slogwang #endif
422a9643ea8Slogwang 
423a9643ea8Slogwang #if _MIPS_SZLONG == 32
424a9643ea8Slogwang #define	LONG_ADD	add
425a9643ea8Slogwang #define	LONG_ADDI	addi
426a9643ea8Slogwang #define	LONG_ADDU	addu
427a9643ea8Slogwang #define	LONG_ADDIU	addiu
428a9643ea8Slogwang #define	LONG_SUB	add
429a9643ea8Slogwang #define	LONG_SUBI	subi
430a9643ea8Slogwang #define	LONG_SUBU	subu
431a9643ea8Slogwang #define	LONG_SUBIU	subu
432a9643ea8Slogwang #define	LONG_L		lw
433a9643ea8Slogwang #define	LONG_LA		la
434a9643ea8Slogwang #define	LONG_S		sw
435a9643ea8Slogwang #define	LONG_SLL	sll
436a9643ea8Slogwang #define	LONG_SLLV	sllv
437a9643ea8Slogwang #define	LONG_SRL	srl
438a9643ea8Slogwang #define	LONG_SRLV	srlv
439a9643ea8Slogwang #define	LONG_SRA	sra
440a9643ea8Slogwang #define	LONG_SRAV	srav
441a9643ea8Slogwang #define	LONG_LL		ll
442a9643ea8Slogwang #define	LONG_SC		sc
443a9643ea8Slogwang #define	LONG_WORD	.word
444a9643ea8Slogwang #define	LONG_SCALESHIFT	2
445a9643ea8Slogwang #else
446a9643ea8Slogwang #define	LONG_ADD	dadd
447a9643ea8Slogwang #define	LONG_ADDI	daddi
448a9643ea8Slogwang #define	LONG_ADDU	daddu
449a9643ea8Slogwang #define	LONG_ADDIU	daddiu
450a9643ea8Slogwang #define	LONG_SUB	dadd
451a9643ea8Slogwang #define	LONG_SUBI	dsubi
452a9643ea8Slogwang #define	LONG_SUBU	dsubu
453a9643ea8Slogwang #define	LONG_SUBIU	dsubu
454a9643ea8Slogwang #define	LONG_L		ld
455a9643ea8Slogwang #define	LONG_LA		dla
456a9643ea8Slogwang #define	LONG_S		sd
457a9643ea8Slogwang #define	LONG_SLL	dsll
458a9643ea8Slogwang #define	LONG_SLLV	dsllv
459a9643ea8Slogwang #define	LONG_SRL	dsrl
460a9643ea8Slogwang #define	LONG_SRLV	dsrlv
461a9643ea8Slogwang #define	LONG_SRA	dsra
462a9643ea8Slogwang #define	LONG_SRAV	dsrav
463a9643ea8Slogwang #define	LONG_LL		lld
464a9643ea8Slogwang #define	LONG_SC		scd
465a9643ea8Slogwang #define	LONG_WORD	.dword
466a9643ea8Slogwang #define	LONG_SCALESHIFT	3
467a9643ea8Slogwang #endif
468a9643ea8Slogwang 
469a9643ea8Slogwang #if SZREG == 4
470a9643ea8Slogwang #define	REG_L		lw
471a9643ea8Slogwang #define	REG_S		sw
472a9643ea8Slogwang #define	REG_LI		li
473a9643ea8Slogwang #define	REG_ADDU	addu
474a9643ea8Slogwang #define	REG_SLL		sll
475a9643ea8Slogwang #define	REG_SLLV	sllv
476a9643ea8Slogwang #define	REG_SRL		srl
477a9643ea8Slogwang #define	REG_SRLV	srlv
478a9643ea8Slogwang #define	REG_SRA		sra
479a9643ea8Slogwang #define	REG_SRAV	srav
480a9643ea8Slogwang #define	REG_LL		ll
481a9643ea8Slogwang #define	REG_SC		sc
482a9643ea8Slogwang #define	REG_SCALESHIFT	2
483a9643ea8Slogwang #else
484a9643ea8Slogwang #define	REG_L		ld
485a9643ea8Slogwang #define	REG_S		sd
486a9643ea8Slogwang #define	REG_LI		dli
487a9643ea8Slogwang #define	REG_ADDU	daddu
488a9643ea8Slogwang #define	REG_SLL		dsll
489a9643ea8Slogwang #define	REG_SLLV	dsllv
490a9643ea8Slogwang #define	REG_SRL		dsrl
491a9643ea8Slogwang #define	REG_SRLV	dsrlv
492a9643ea8Slogwang #define	REG_SRA		dsra
493a9643ea8Slogwang #define	REG_SRAV	dsrav
494a9643ea8Slogwang #define	REG_LL		lld
495a9643ea8Slogwang #define	REG_SC		scd
496a9643ea8Slogwang #define	REG_SCALESHIFT	3
497a9643ea8Slogwang #endif
498a9643ea8Slogwang 
499a9643ea8Slogwang #if _MIPS_ISA == _MIPS_ISA_MIPS1 || _MIPS_ISA == _MIPS_ISA_MIPS2 || \
500a9643ea8Slogwang     _MIPS_ISA == _MIPS_ISA_MIPS32
501a9643ea8Slogwang #define	MFC0		mfc0
502a9643ea8Slogwang #define	MTC0		mtc0
503a9643ea8Slogwang #endif
504a9643ea8Slogwang #if _MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4 || \
505a9643ea8Slogwang     _MIPS_ISA == _MIPS_ISA_MIPS64
506a9643ea8Slogwang #define	MFC0		dmfc0
507a9643ea8Slogwang #define	MTC0		dmtc0
508a9643ea8Slogwang #endif
509a9643ea8Slogwang 
510a9643ea8Slogwang #if defined(__mips_o32) || defined(__mips_o64)
511a9643ea8Slogwang 
512a9643ea8Slogwang #ifdef __ABICALLS__
513a9643ea8Slogwang #define	CPRESTORE(r)	.cprestore r
514a9643ea8Slogwang #define	CPLOAD(r)	.cpload r
515a9643ea8Slogwang #else
516a9643ea8Slogwang #define	CPRESTORE(r)	/* not needed */
517a9643ea8Slogwang #define	CPLOAD(r)	/* not needed */
518a9643ea8Slogwang #endif
519a9643ea8Slogwang 
520a9643ea8Slogwang #define	SETUP_GP	\
521a9643ea8Slogwang 			.set push;				\
522a9643ea8Slogwang 			.set noreorder;				\
523a9643ea8Slogwang 			.cpload	t9;				\
524a9643ea8Slogwang 			.set pop
525a9643ea8Slogwang #define	SETUP_GPX(r)	\
526a9643ea8Slogwang 			.set push;				\
527a9643ea8Slogwang 			.set noreorder;				\
528a9643ea8Slogwang 			move	r,ra;	/* save old ra */	\
529a9643ea8Slogwang 			bal	7f;				\
530a9643ea8Slogwang 			nop;					\
531a9643ea8Slogwang 		7:	.cpload	ra;				\
532a9643ea8Slogwang 			move	ra,r;				\
533a9643ea8Slogwang 			.set pop
534a9643ea8Slogwang #define	SETUP_GPX_L(r,lbl)	\
535a9643ea8Slogwang 			.set push;				\
536a9643ea8Slogwang 			.set noreorder;				\
537a9643ea8Slogwang 			move	r,ra;	/* save old ra */	\
538a9643ea8Slogwang 			bal	lbl;				\
539a9643ea8Slogwang 			nop;					\
540a9643ea8Slogwang 		lbl:	.cpload	ra;				\
541a9643ea8Slogwang 			move	ra,r;				\
542a9643ea8Slogwang 			.set pop
543a9643ea8Slogwang #define	SAVE_GP(x)	.cprestore x
544a9643ea8Slogwang 
545a9643ea8Slogwang #define	SETUP_GP64(a,b)		/* n32/n64 specific */
546a9643ea8Slogwang #define	SETUP_GP64_R(a,b)	/* n32/n64 specific */
547a9643ea8Slogwang #define	SETUP_GPX64(a,b)	/* n32/n64 specific */
548a9643ea8Slogwang #define	SETUP_GPX64_L(a,b,c)	/* n32/n64 specific */
549a9643ea8Slogwang #define	RESTORE_GP64		/* n32/n64 specific */
550a9643ea8Slogwang #define	USE_ALT_CP(a)		/* n32/n64 specific */
551a9643ea8Slogwang #endif /* __mips_o32 || __mips_o64 */
552a9643ea8Slogwang 
553a9643ea8Slogwang #if defined(__mips_o32) || defined(__mips_o64)
554a9643ea8Slogwang #define	REG_PROLOGUE	.set push
555a9643ea8Slogwang #define	REG_EPILOGUE	.set pop
556a9643ea8Slogwang #endif
557a9643ea8Slogwang #if defined(__mips_n32) || defined(__mips_n64)
558a9643ea8Slogwang #define	REG_PROLOGUE	.set push ; .set mips3
559a9643ea8Slogwang #define	REG_EPILOGUE	.set pop
560a9643ea8Slogwang #endif
561a9643ea8Slogwang 
562a9643ea8Slogwang #if defined(__mips_n32) || defined(__mips_n64)
563a9643ea8Slogwang #define	SETUP_GP		/* o32 specific */
564a9643ea8Slogwang #define	SETUP_GPX(r)		/* o32 specific */
565a9643ea8Slogwang #define	SETUP_GPX_L(r,lbl)	/* o32 specific */
566a9643ea8Slogwang #define	SAVE_GP(x)		/* o32 specific */
567a9643ea8Slogwang #define	SETUP_GP64(a,b)		.cpsetup $25, a, b
568a9643ea8Slogwang #define	SETUP_GPX64(a,b)	\
569a9643ea8Slogwang 				.set push;			\
570a9643ea8Slogwang 				move	b,ra;			\
571a9643ea8Slogwang 				.set noreorder;			\
572a9643ea8Slogwang 				bal	7f;			\
573a9643ea8Slogwang 				nop;				\
574a9643ea8Slogwang 			7:	.set pop;			\
575a9643ea8Slogwang 				.cpsetup ra, a, 7b;		\
576a9643ea8Slogwang 				move	ra,b
577a9643ea8Slogwang #define	SETUP_GPX64_L(a,b,c)	\
578a9643ea8Slogwang 				.set push;			\
579a9643ea8Slogwang 				move	b,ra;			\
580a9643ea8Slogwang 				.set noreorder;			\
581a9643ea8Slogwang 				bal	c;			\
582a9643ea8Slogwang 				nop;				\
583a9643ea8Slogwang 			c:	.set pop;			\
584a9643ea8Slogwang 				.cpsetup ra, a, c;		\
585a9643ea8Slogwang 				move	ra,b
586a9643ea8Slogwang #define	RESTORE_GP64		.cpreturn
587a9643ea8Slogwang #define	USE_ALT_CP(a)		.cplocal a
588a9643ea8Slogwang #endif	/* __mips_n32 || __mips_n64 */
589a9643ea8Slogwang 
590a9643ea8Slogwang #define	GET_CPU_PCPU(reg)		\
591a9643ea8Slogwang 	PTR_L	reg, _C_LABEL(pcpup);
592a9643ea8Slogwang 
593a9643ea8Slogwang /*
594a9643ea8Slogwang  * Description of the setjmp buffer
595a9643ea8Slogwang  *
596a9643ea8Slogwang  * word  0	magic number	(dependant on creator)
597a9643ea8Slogwang  *       1	RA
598a9643ea8Slogwang  *       2	S0
599a9643ea8Slogwang  *       3	S1
600a9643ea8Slogwang  *       4	S2
601a9643ea8Slogwang  *       5	S3
602a9643ea8Slogwang  *       6	S4
603a9643ea8Slogwang  *       7	S5
604a9643ea8Slogwang  *       8	S6
605a9643ea8Slogwang  *       9	S7
606a9643ea8Slogwang  *       10	SP
607a9643ea8Slogwang  *       11	S8
608a9643ea8Slogwang  *       12	GP		(dependent on ABI)
609a9643ea8Slogwang  *       13	signal mask	(dependant on magic)
610a9643ea8Slogwang  *       14	(con't)
611a9643ea8Slogwang  *       15	(con't)
612a9643ea8Slogwang  *       16	(con't)
613a9643ea8Slogwang  *
614a9643ea8Slogwang  * The magic number number identifies the jmp_buf and
615a9643ea8Slogwang  * how the buffer was created as well as providing
616a9643ea8Slogwang  * a sanity check
617a9643ea8Slogwang  *
618a9643ea8Slogwang  */
619a9643ea8Slogwang 
620a9643ea8Slogwang #define _JB_MAGIC__SETJMP	0xBADFACED
621a9643ea8Slogwang #define _JB_MAGIC_SETJMP	0xFACEDBAD
622a9643ea8Slogwang 
623a9643ea8Slogwang /* Valid for all jmp_buf's */
624a9643ea8Slogwang 
625a9643ea8Slogwang #define _JB_MAGIC		0
626a9643ea8Slogwang #define _JB_REG_RA		1
627a9643ea8Slogwang #define _JB_REG_S0		2
628a9643ea8Slogwang #define _JB_REG_S1		3
629a9643ea8Slogwang #define _JB_REG_S2		4
630a9643ea8Slogwang #define _JB_REG_S3		5
631a9643ea8Slogwang #define _JB_REG_S4		6
632a9643ea8Slogwang #define _JB_REG_S5		7
633a9643ea8Slogwang #define _JB_REG_S6		8
634a9643ea8Slogwang #define _JB_REG_S7		9
635a9643ea8Slogwang #define _JB_REG_SP		10
636a9643ea8Slogwang #define _JB_REG_S8		11
637a9643ea8Slogwang #if defined(__mips_n32) || defined(__mips_n64)
638a9643ea8Slogwang #define	_JB_REG_GP		12
639a9643ea8Slogwang #endif
640a9643ea8Slogwang 
641a9643ea8Slogwang /* Only valid with the _JB_MAGIC_SETJMP magic */
642a9643ea8Slogwang 
643a9643ea8Slogwang #define _JB_SIGMASK		13
644a9643ea8Slogwang #define	__JB_SIGMASK_REMAINDER	14	/* sigmask_t is 128-bits */
645a9643ea8Slogwang 
646a9643ea8Slogwang #define _JB_FPREG_F20		15
647a9643ea8Slogwang #define _JB_FPREG_F21		16
648a9643ea8Slogwang #define _JB_FPREG_F22		17
649a9643ea8Slogwang #define _JB_FPREG_F23		18
650a9643ea8Slogwang #define _JB_FPREG_F24		19
651a9643ea8Slogwang #define _JB_FPREG_F25		20
652a9643ea8Slogwang #define _JB_FPREG_F26		21
653a9643ea8Slogwang #define _JB_FPREG_F27		22
654a9643ea8Slogwang #define _JB_FPREG_F28		23
655a9643ea8Slogwang #define _JB_FPREG_F29		24
656a9643ea8Slogwang #define _JB_FPREG_F30		25
657a9643ea8Slogwang #define _JB_FPREG_F31		26
658a9643ea8Slogwang #define _JB_FPREG_FCSR		27
659a9643ea8Slogwang 
660a9643ea8Slogwang /*
661a9643ea8Slogwang  * Various macros for dealing with TLB hazards
662a9643ea8Slogwang  * (a) why so many?
663a9643ea8Slogwang  * (b) when to use?
664a9643ea8Slogwang  * (c) why not used everywhere?
665a9643ea8Slogwang  */
666a9643ea8Slogwang /*
667a9643ea8Slogwang  * Assume that w alaways need nops to escape CP0 hazard
668a9643ea8Slogwang  * TODO: Make hazard delays configurable. Stuck with 5 cycles on the moment
669a9643ea8Slogwang  * For more info on CP0 hazards see Chapter 7 (p.99) of "MIPS32 Architecture
670a9643ea8Slogwang  *    For Programmers Volume III: The MIPS32 Privileged Resource Architecture"
671a9643ea8Slogwang  */
672a9643ea8Slogwang #if defined(CPU_NLM)
673a9643ea8Slogwang #define	HAZARD_DELAY	sll $0,3
674a9643ea8Slogwang #define	ITLBNOPFIX	sll $0,3
675a9643ea8Slogwang #elif defined(CPU_RMI)
676a9643ea8Slogwang #define	HAZARD_DELAY
677a9643ea8Slogwang #define	ITLBNOPFIX
678a9643ea8Slogwang #elif defined(CPU_MIPS74K)
679a9643ea8Slogwang #define	HAZARD_DELAY	sll $0,$0,3
680a9643ea8Slogwang #define	ITLBNOPFIX	sll $0,$0,3
681a9643ea8Slogwang #else
682a9643ea8Slogwang #define	ITLBNOPFIX	nop;nop;nop;nop;nop;nop;nop;nop;nop;sll $0,$0,3;
683a9643ea8Slogwang #define	HAZARD_DELAY	nop;nop;nop;nop;sll $0,$0,3;
684a9643ea8Slogwang #endif
685a9643ea8Slogwang 
686a9643ea8Slogwang #endif /* !_MACHINE_ASM_H_ */
687