xref: /openbsd-src/sys/arch/sh/include/asm.h (revision 0ee2ce6736ef33439268a7e79bce705365b9c499)
1*0ee2ce67Sguenther /*	$OpenBSD: asm.h,v 1.10 2022/12/08 02:11:27 guenther Exp $	*/
295c7671fSmiod /*	$NetBSD: asm.h,v 1.25 2006/01/20 22:02:40 christos Exp $	*/
395c7671fSmiod 
495c7671fSmiod /*-
595c7671fSmiod  * Copyright (c) 1990 The Regents of the University of California.
695c7671fSmiod  * All rights reserved.
795c7671fSmiod  *
895c7671fSmiod  * This code is derived from software contributed to Berkeley by
995c7671fSmiod  * William Jolitz.
1095c7671fSmiod  *
1195c7671fSmiod  * Redistribution and use in source and binary forms, with or without
1295c7671fSmiod  * modification, are permitted provided that the following conditions
1395c7671fSmiod  * are met:
1495c7671fSmiod  * 1. Redistributions of source code must retain the above copyright
1595c7671fSmiod  *    notice, this list of conditions and the following disclaimer.
1695c7671fSmiod  * 2. Redistributions in binary form must reproduce the above copyright
1795c7671fSmiod  *    notice, this list of conditions and the following disclaimer in the
1895c7671fSmiod  *    documentation and/or other materials provided with the distribution.
1995c7671fSmiod  * 3. Neither the name of the University nor the names of its contributors
2095c7671fSmiod  *    may be used to endorse or promote products derived from this software
2195c7671fSmiod  *    without specific prior written permission.
2295c7671fSmiod  *
2395c7671fSmiod  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2495c7671fSmiod  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2595c7671fSmiod  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2695c7671fSmiod  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2795c7671fSmiod  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2895c7671fSmiod  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2995c7671fSmiod  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3095c7671fSmiod  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3195c7671fSmiod  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3295c7671fSmiod  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3395c7671fSmiod  * SUCH DAMAGE.
3495c7671fSmiod  *
3595c7671fSmiod  *	@(#)asm.h	5.5 (Berkeley) 5/7/91
3695c7671fSmiod  */
3795c7671fSmiod 
3895c7671fSmiod #ifndef _SH_ASM_H_
3995c7671fSmiod #define	_SH_ASM_H_
4095c7671fSmiod 
4195c7671fSmiod #define _C_LABEL(x)	x
4295c7671fSmiod #define	_ASM_LABEL(x)	x
4395c7671fSmiod 
4495c7671fSmiod #ifdef __STDC__
4595c7671fSmiod # define __CONCAT(x,y)	x ## y
4695c7671fSmiod # define __STRING(x)	#x
4795c7671fSmiod #else
4895c7671fSmiod # define __CONCAT(x,y)	x/**/y
4995c7671fSmiod # define __STRING(x)	"x"
5095c7671fSmiod #endif
5195c7671fSmiod 
5295c7671fSmiod /* let kernels and others override entrypoint alignment */
5395c7671fSmiod #ifndef _ALIGN_TEXT
5495c7671fSmiod # define _ALIGN_TEXT .align 2
5595c7671fSmiod #endif
5695c7671fSmiod 
5795c7671fSmiod #define	_ENTRY(x)							\
5895c7671fSmiod 	.text								;\
5995c7671fSmiod 	_ALIGN_TEXT							;\
6095c7671fSmiod 	.globl x							;\
6195c7671fSmiod 	.type x,@function						;\
6295c7671fSmiod 	x:
6395c7671fSmiod 
64f5d1667bSmpi #if defined(PROF) || defined(GPROF)
6595c7671fSmiod #define	_PROF_PROLOGUE				  \
6695c7671fSmiod 	mov.l	1f,r1				; \
6795c7671fSmiod 	mova	2f,r0				; \
6895c7671fSmiod 	jmp	@r1				; \
6995c7671fSmiod 	 nop					; \
7095c7671fSmiod 	.align	2				; \
7195c7671fSmiod 1:	.long	__mcount			; \
7295c7671fSmiod 2:
7395c7671fSmiod #else  /* !GPROF */
7495c7671fSmiod #define	_PROF_PROLOGUE
7595c7671fSmiod #endif /* !GPROF */
7695c7671fSmiod 
77*0ee2ce67Sguenther #define	ENTRY(y)	_ENTRY(y) _PROF_PROLOGUE
78*0ee2ce67Sguenther #define	NENTRY(y)	_ENTRY(y)
79*0ee2ce67Sguenther #define	ASENTRY(y)	_ENTRY(y) _PROF_PROLOGUE
8095c7671fSmiod 
8181a5d5c8Sguenther #define END(y)		.size	y, . - y
8281a5d5c8Sguenther 
8395c7671fSmiod #define SET_ENTRY_SIZE(y) \
84*0ee2ce67Sguenther 	.size	y, . - y
8595c7671fSmiod 
8695c7671fSmiod #define SET_ASENTRY_SIZE(y) \
87*0ee2ce67Sguenther 	.size	y, . - y
8895c7671fSmiod 
8995c7671fSmiod #define	ALTENTRY(name)				 \
90*0ee2ce67Sguenther 	.globl name				;\
91*0ee2ce67Sguenther 	.type name,@function			;\
92*0ee2ce67Sguenther 	name:
9395c7671fSmiod 
9495c7671fSmiod /*
9595c7671fSmiod  * Hide the gory details of PIC calls vs. normal calls.  Use as in the
9695c7671fSmiod  * following example:
9795c7671fSmiod  *
9895c7671fSmiod  *	sts.l	pr, @-sp
9995c7671fSmiod  *	PIC_PROLOGUE(.L_got, r0)	! saves old r12 on stack
10095c7671fSmiod  *	...
10195c7671fSmiod  *	mov.l	.L_function_1, r0
10295c7671fSmiod  * 1:	CALL	r0			! each call site needs a label
10395c7671fSmiod  *	 nop
10495c7671fSmiod  *      ...
10595c7671fSmiod  *	mov.l	.L_function_2, r0
10695c7671fSmiod  * 2:	CALL	r0
10795c7671fSmiod  *	 nop
10895c7671fSmiod  *	...
10995c7671fSmiod  *	PIC_EPILOGUE			! restores r12 from stack
11095c7671fSmiod  *	lds.l	@sp+, pr		!  so call in right order
11195c7671fSmiod  *	rts
11295c7671fSmiod  *	 nop
11395c7671fSmiod  *
11495c7671fSmiod  *	.align 2
11595c7671fSmiod  * .L_got:
11695c7671fSmiod  *	PIC_GOT_DATUM
11795c7671fSmiod  * .L_function_1:			! if you call the same function twice
11895c7671fSmiod  *	CALL_DATUM(function, 1b)	!  provide call datum for each call
11995c7671fSmiod  * .L_function_2:
12095c7671fSmiod  * 	CALL_DATUM(function, 2b)
12195c7671fSmiod  */
12295c7671fSmiod 
12332b97dedSpascal #ifdef __PIC__
12495c7671fSmiod 
12595c7671fSmiod #define	PIC_PLT(x)	x@PLT
12695c7671fSmiod #define	PIC_GOT(x)	x@GOT
12795c7671fSmiod #define	PIC_GOTOFF(x)	x@GOTOFF
12895c7671fSmiod 
12995c7671fSmiod #define	PIC_PROLOGUE(got)			\
13095c7671fSmiod         	mov.l	r12, @-sp;		\
13195c7671fSmiod 		PIC_PROLOGUE_NOSAVE(got)
13295c7671fSmiod 
13395c7671fSmiod /*
13495c7671fSmiod  * Functions that do non local jumps don't need to preserve r12,
13595c7671fSmiod  * so we can shave off two instructions to save/restore it.
13695c7671fSmiod  */
13795c7671fSmiod #define	PIC_PROLOGUE_NOSAVE(got)		\
13895c7671fSmiod         	mov.l	got, r12;		\
13995c7671fSmiod         	mova	got, r0;		\
14095c7671fSmiod         	add	r0, r12
14195c7671fSmiod 
14295c7671fSmiod #define	PIC_EPILOGUE				\
14395c7671fSmiod 		mov.l	@sp+, r12
14495c7671fSmiod 
14595c7671fSmiod #define PIC_EPILOGUE_SLOT 			\
14695c7671fSmiod 		PIC_EPILOGUE
14795c7671fSmiod 
14895c7671fSmiod #define PIC_GOT_DATUM \
14995c7671fSmiod 		.long	_GLOBAL_OFFSET_TABLE_
15095c7671fSmiod 
15195c7671fSmiod #define CALL	bsrf
15295c7671fSmiod #define JUMP	braf
15395c7671fSmiod 
15495c7671fSmiod #define CALL_DATUM(function, lpcs) \
15595c7671fSmiod 		.long	PIC_PLT(function) - ((lpcs) + 4 - (.))
15695c7671fSmiod 
15795c7671fSmiod /*
15895c7671fSmiod  * This will result in text relocations in the shared library,
15995c7671fSmiod  * unless the function is local or has hidden or protected visibility.
16095c7671fSmiod  * Does not require PIC prologue.
16195c7671fSmiod  */
16295c7671fSmiod #define CALL_DATUM_LOCAL(function, lpcs) \
16395c7671fSmiod 		.long	function - ((lpcs) + 4)
16495c7671fSmiod 
16595c7671fSmiod #else  /* !PIC */
16695c7671fSmiod 
16795c7671fSmiod #define	PIC_PROLOGUE(label)
16895c7671fSmiod #define	PIC_PROLOGUE_NOSAVE(label)
16995c7671fSmiod #define	PIC_EPILOGUE
17095c7671fSmiod #define	PIC_EPILOGUE_SLOT	nop
17195c7671fSmiod #define PIC_GOT_DATUM
17295c7671fSmiod 
17395c7671fSmiod #define CALL	jsr @
17495c7671fSmiod #define JUMP	jmp @
17595c7671fSmiod 
17695c7671fSmiod #define CALL_DATUM(function, lpcs) \
17795c7671fSmiod 		.long	function
17895c7671fSmiod 
17995c7671fSmiod #define CALL_DATUM_LOCAL(function, lpcs) \
18095c7671fSmiod 		.long	function
18195c7671fSmiod 
18295c7671fSmiod #endif /* !PIC */
18395c7671fSmiod 
1845a25e2caSmartynas #define	STRONG_ALIAS(alias,sym)						\
185*0ee2ce67Sguenther 	.global alias;							\
186*0ee2ce67Sguenther 	alias = sym
18795c7671fSmiod #define	WEAK_ALIAS(alias,sym)						\
188*0ee2ce67Sguenther 	.weak alias;							\
189*0ee2ce67Sguenther 	alias = sym
19095c7671fSmiod 
19195c7671fSmiod #endif /* !_SH_ASM_H_ */
192