xref: /freebsd/sys/amd64/include/asm.h (revision be16a3aba0c2d57f43a1e8a0fa0267ddf3fd9660)
1644ba7e8SBruce Evans /*-
2644ba7e8SBruce Evans  * Copyright (c) 1990 The Regents of the University of California.
3644ba7e8SBruce Evans  * All rights reserved.
4644ba7e8SBruce Evans  *
5644ba7e8SBruce Evans  * This code is derived from software contributed to Berkeley by
6644ba7e8SBruce Evans  * William Jolitz.
7644ba7e8SBruce Evans  *
8644ba7e8SBruce Evans  * Redistribution and use in source and binary forms, with or without
9644ba7e8SBruce Evans  * modification, are permitted provided that the following conditions
10644ba7e8SBruce Evans  * are met:
11644ba7e8SBruce Evans  * 1. Redistributions of source code must retain the above copyright
12644ba7e8SBruce Evans  *    notice, this list of conditions and the following disclaimer.
13644ba7e8SBruce Evans  * 2. Redistributions in binary form must reproduce the above copyright
14644ba7e8SBruce Evans  *    notice, this list of conditions and the following disclaimer in the
15644ba7e8SBruce Evans  *    documentation and/or other materials provided with the distribution.
16644ba7e8SBruce Evans  * 3. All advertising materials mentioning features or use of this software
17644ba7e8SBruce Evans  *    must display the following acknowledgement:
18644ba7e8SBruce Evans  *	This product includes software developed by the University of
19644ba7e8SBruce Evans  *	California, Berkeley and its contributors.
20644ba7e8SBruce Evans  * 4. Neither the name of the University nor the names of its contributors
21644ba7e8SBruce Evans  *    may be used to endorse or promote products derived from this software
22644ba7e8SBruce Evans  *    without specific prior written permission.
23644ba7e8SBruce Evans  *
24644ba7e8SBruce Evans  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25644ba7e8SBruce Evans  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26644ba7e8SBruce Evans  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27644ba7e8SBruce Evans  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28644ba7e8SBruce Evans  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29644ba7e8SBruce Evans  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30644ba7e8SBruce Evans  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31644ba7e8SBruce Evans  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32644ba7e8SBruce Evans  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33644ba7e8SBruce Evans  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34644ba7e8SBruce Evans  * SUCH DAMAGE.
35644ba7e8SBruce Evans  *
36644ba7e8SBruce Evans  *	from: @(#)DEFS.h	5.1 (Berkeley) 4/23/90
37c3aac50fSPeter Wemm  * $FreeBSD$
38644ba7e8SBruce Evans  */
39644ba7e8SBruce Evans 
40a8626855SBruce Evans #ifndef _MACHINE_ASM_H_
41a8626855SBruce Evans #define	_MACHINE_ASM_H_
42a8626855SBruce Evans 
43644ba7e8SBruce Evans #include <sys/cdefs.h>
44644ba7e8SBruce Evans 
45644ba7e8SBruce Evans #ifdef PIC
46644ba7e8SBruce Evans #define	PIC_PROLOGUE	\
47644ba7e8SBruce Evans 	pushl	%ebx;	\
48644ba7e8SBruce Evans 	call	1f;	\
49644ba7e8SBruce Evans 1:			\
50644ba7e8SBruce Evans 	popl	%ebx;	\
51644ba7e8SBruce Evans 	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b],%ebx
52644ba7e8SBruce Evans #define	PIC_EPILOGUE	\
53644ba7e8SBruce Evans 	popl	%ebx
54644ba7e8SBruce Evans #define	PIC_PLT(x)	x@PLT
55644ba7e8SBruce Evans #define	PIC_GOT(x)	x@GOT(%ebx)
56644ba7e8SBruce Evans #define	PIC_GOTOFF(x)	x@GOTOFF(%ebx)
57644ba7e8SBruce Evans #else
58644ba7e8SBruce Evans #define	PIC_PROLOGUE
59644ba7e8SBruce Evans #define	PIC_EPILOGUE
60644ba7e8SBruce Evans #define	PIC_PLT(x)	x
61644ba7e8SBruce Evans #define	PIC_GOT(x)	x
62644ba7e8SBruce Evans #define	PIC_GOTOFF(x)	x
63644ba7e8SBruce Evans #endif
64644ba7e8SBruce Evans 
65644ba7e8SBruce Evans /*
66644ba7e8SBruce Evans  * CNAME and HIDENAME manage the relationship between symbol names in C
67644ba7e8SBruce Evans  * and the equivalent assembly language names.  CNAME is given a name as
68644ba7e8SBruce Evans  * it would be used in a C program.  It expands to the equivalent assembly
69644ba7e8SBruce Evans  * language name.  HIDENAME is given an assembly-language name, and expands
70644ba7e8SBruce Evans  * to a possibly-modified form that will be invisible to C programs.
71644ba7e8SBruce Evans  */
72a8626855SBruce Evans #ifdef __ELF__
73644ba7e8SBruce Evans #define CNAME(csym)		csym
74644ba7e8SBruce Evans #define HIDENAME(asmsym)	__CONCAT(.,asmsym)
75a8626855SBruce Evans #else
76644ba7e8SBruce Evans #define CNAME(csym)		__CONCAT(_,csym)
77644ba7e8SBruce Evans #define HIDENAME(asmsym)	asmsym
78644ba7e8SBruce Evans #endif
79644ba7e8SBruce Evans 
80a8626855SBruce Evans /* XXX should use .p2align 4,0x90 for -m486. */
81a8626855SBruce Evans #define _START_ENTRY	.text; .p2align 2,0x90
82a8626855SBruce Evans 
83a8626855SBruce Evans #define _ENTRY(x)	_START_ENTRY; \
84a8626855SBruce Evans 			.globl CNAME(x); .type CNAME(x),@function; CNAME(x):
85a8626855SBruce Evans 
86644ba7e8SBruce Evans #ifdef PROF
87be16a3abSBruce Evans #define	ALTENTRY(x)	_ENTRY(x); \
88a8626855SBruce Evans 			pushl %ebp; movl %esp,%ebp; \
89a8626855SBruce Evans 			call PIC_PLT(HIDENAME(mcount)); \
90be16a3abSBruce Evans 			popl %ebp; \
91be16a3abSBruce Evans 			jmp 9f
92be16a3abSBruce Evans #define	ENTRY(x)	_ENTRY(x); \
93be16a3abSBruce Evans 			pushl %ebp; movl %esp,%ebp; \
94be16a3abSBruce Evans 			call PIC_PLT(HIDENAME(mcount)); \
95be16a3abSBruce Evans 			popl %ebp; \
96be16a3abSBruce Evans 			9:
97a8626855SBruce Evans #else
98ed253219SJason Evans #define	ALTENTRY(x)	_ENTRY(x)
99be16a3abSBruce Evans #define	ENTRY(x)	_ENTRY(x)
100644ba7e8SBruce Evans #endif
10113a44161SBruce Evans 
102a8626855SBruce Evans #define RCSID(x)	.text; .asciz x
103a8626855SBruce Evans 
10406e33296SBruce Evans #ifdef _ARCH_INDIRECT
10513a44161SBruce Evans /*
10606e33296SBruce Evans  * Generate code to select between the generic functions and _ARCH_INDIRECT
10706e33296SBruce Evans  * specific ones.
10806e33296SBruce Evans  * XXX nested __CONCATs don't work with non-ANSI cpp's.
10913a44161SBruce Evans  */
11006e33296SBruce Evans #define	ANAME(x)	CNAME(__CONCAT(__CONCAT(__,_ARCH_INDIRECT),x))
11113a44161SBruce Evans #define	ASELNAME(x)	CNAME(__CONCAT(__arch_select_,x))
11213a44161SBruce Evans #define	AVECNAME(x)	CNAME(__CONCAT(__arch_,x))
11313a44161SBruce Evans #define	GNAME(x)	CNAME(__CONCAT(__generic_,x))
11413a44161SBruce Evans 
11513a44161SBruce Evans /* Don't bother profiling this. */
11613a44161SBruce Evans #ifdef PIC
11713a44161SBruce Evans #define	ARCH_DISPATCH(x) \
11813a44161SBruce Evans 			_START_ENTRY; \
11913a44161SBruce Evans 			.globl CNAME(x); .type CNAME(x),@function; CNAME(x): ; \
12013a44161SBruce Evans 			PIC_PROLOGUE; \
12113a44161SBruce Evans 			movl PIC_GOT(AVECNAME(x)),%eax; \
12213a44161SBruce Evans 			PIC_EPILOGUE; \
12313a44161SBruce Evans 			jmpl *(%eax)
12413a44161SBruce Evans 
12513a44161SBruce Evans #define	ARCH_SELECT(x)	_START_ENTRY; \
12613a44161SBruce Evans 			.type ASELNAME(x),@function; \
12713a44161SBruce Evans 			ASELNAME(x): \
12813a44161SBruce Evans 			PIC_PROLOGUE; \
12913a44161SBruce Evans 			call PIC_PLT(CNAME(__get_hw_float)); \
13013a44161SBruce Evans 			testl %eax,%eax; \
13113a44161SBruce Evans 			movl PIC_GOT(ANAME(x)),%eax; \
13213a44161SBruce Evans 			jne 8f; \
13313a44161SBruce Evans 			movl PIC_GOT(GNAME(x)),%eax; \
13413a44161SBruce Evans 			8: \
13513a44161SBruce Evans 			movl PIC_GOT(AVECNAME(x)),%edx; \
13613a44161SBruce Evans 			movl %eax,(%edx); \
13713a44161SBruce Evans 			PIC_EPILOGUE; \
13813a44161SBruce Evans 			jmpl *%eax
13913a44161SBruce Evans #else /* !PIC */
14013a44161SBruce Evans #define	ARCH_DISPATCH(x) \
14113a44161SBruce Evans 			_START_ENTRY; \
14213a44161SBruce Evans 			.globl CNAME(x); .type CNAME(x),@function; CNAME(x): ; \
14313a44161SBruce Evans 			jmpl *AVECNAME(x)
14413a44161SBruce Evans 
14513a44161SBruce Evans #define	ARCH_SELECT(x)	_START_ENTRY; \
14613a44161SBruce Evans 			.type ASELNAME(x),@function; \
14713a44161SBruce Evans 			ASELNAME(x): \
14813a44161SBruce Evans 			call CNAME(__get_hw_float); \
14913a44161SBruce Evans 			testl %eax,%eax; \
15013a44161SBruce Evans 			movl $ANAME(x),%eax; \
15113a44161SBruce Evans 			jne 8f; \
15213a44161SBruce Evans 			movl $GNAME(x),%eax; \
15313a44161SBruce Evans 			8: \
15413a44161SBruce Evans 			movl %eax,AVECNAME(x); \
15513a44161SBruce Evans 			jmpl *%eax
15613a44161SBruce Evans #endif /* PIC */
15713a44161SBruce Evans 
158a8626855SBruce Evans #define	ARCH_VECTOR(x)	.data; .p2align 2; \
15913a44161SBruce Evans 			.globl AVECNAME(x); \
16013a44161SBruce Evans 			.type AVECNAME(x),@object; \
16113a44161SBruce Evans 			.size AVECNAME(x),4; \
16213a44161SBruce Evans 			AVECNAME(x): .long ASELNAME(x)
16313a44161SBruce Evans 
164a8626855SBruce Evans #undef _ENTRY
165a8626855SBruce Evans #define	_ENTRY(x)	ARCH_VECTOR(x); ARCH_SELECT(x); ARCH_DISPATCH(x); \
16613a44161SBruce Evans 			_START_ENTRY; \
16713a44161SBruce Evans 			.globl ANAME(x); .type ANAME(x),@function; ANAME(x):
16813a44161SBruce Evans 
16906e33296SBruce Evans #endif /* _ARCH_INDIRECT */
17006e33296SBruce Evans 
171a8626855SBruce Evans #endif /* !_MACHINE_ASM_H_ */
172