xref: /illumos-gate/usr/src/lib/libm/common/C/libm.h (revision 66582b606a8194f7f3ba5b3a3a6dca5b0d346361)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
23  */
24 /*
25  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
28 
29 #ifndef	_LIBM_H
30 #define	_LIBM_H
31 
32 #include <sys/isa_defs.h>
33 
34 #ifdef _ASM
35 /* BEGIN CSTYLED */
36 
37 /*
38  * Disable amd64 assembly code profiling for now.
39  */
40 #if defined(__amd64)
41 #undef PROF
42 #endif
43 
44 #include <sys/asm_linkage.h>
45 
46 #define	NAME(x) x
47 #define	TEXT	.section	".text"
48 #define	DATA	.section	".data"
49 #define	RO_DATA	.section	".rodata"
50 #define	IDENT(x)	.ident	x
51 
52 #if defined(__sparc)
53 
54 #define	LIBM_ANSI_PRAGMA_WEAK(sym,stype) \
55 	.weak __/**/sym;		 \
56 	.type __/**/sym,#stype;		 \
57 __/**/sym	= sym
58 
59 #ifndef SET_FILE
60 #define	SET_FILE(x) \
61 	.file	x
62 #endif	/* !defined(SET_FILE) */
63 
64 #ifdef PIC
65 /*
66  * One should *never* pass o7 to PIC_SETUP.
67  */
68 #define	PIC_SETUP(via) \
69 9:	call	8f; \
70 	sethi	%hi(NAME(_GLOBAL_OFFSET_TABLE_)-(9b-.)),%via; \
71 8:	or	%via,%lo(NAME(_GLOBAL_OFFSET_TABLE_)-(9b-.)),%via; \
72 	add	%via,%o7,%via
73 /*
74  * Must save/restore %o7 in leaf routines; may *not* use jmpl!
75  */
76 #define	PIC_LEAF_SETUP(via) \
77 	or	%g0,%o7,%g1; \
78 9:	call	8f; \
79 	sethi	%hi(NAME(_GLOBAL_OFFSET_TABLE_)-(9b-.)),%via; \
80 8:	or	%via,%lo(NAME(_GLOBAL_OFFSET_TABLE_)-(9b-.)),%via; \
81 	add	%via,%o7,%via; \
82 	or	%g0,%g1,%o7
83 #ifdef __sparcv9
84 #define	PIC_SET(via,sym,dst)	ldx	[%via+sym],%dst
85 #else	/* defined(__sparcv9) */
86 #define	PIC_SET(via,sym,dst)	ld	[%via+sym],%dst
87 #endif	/* defined(__sparcv9) */
88 #else	/* defined(PIC) */
89 #define	PIC_SETUP(via)
90 #define	PIC_LEAF_SETUP(via)
91 #ifdef __sparcv9
92 /*
93  * g1 is used as scratch register in V9 mode
94  */
95 #define	PIC_SET(via,sym,dst)	setx	sym,%g1,%dst
96 #else	/* defined(__sparcv9) */
97 #define	PIC_SET(via,sym,dst)	set	sym,%dst
98 #endif	/* defined(__sparcv9) */
99 #endif	/* defined(PIC) */
100 
101 /*
102  * Workaround for 4337025: MCOUNT in asm_linkage.h does not support __sparcv9
103  */
104 #if defined(PROF) && defined(__sparcv9)
105 
106 #undef MCOUNT_SIZE
107 #undef MCOUNT
108 
109 #if !defined(PIC)
110 #define	MCOUNT_SIZE	(9*4)	/* 9 instructions */
111 #define	MCOUNT(x) \
112 	save	%sp, -SA(MINFRAME), %sp; \
113 	sethi	%hh(.L_/**/x/**/1), %o0; \
114 	sethi	%lm(.L_/**/x/**/1), %o1; \
115 	or	%o0, %hm(.L_/**/x/**/1), %o0; \
116 	or	%o1, %lo(.L_/**/x/**/1), %o1; \
117 	sllx	%o0, 32, %o0; \
118 	call	_mcount; \
119 	or	%o0, %o1, %o0; \
120 	restore; \
121 	.common .L_/**/x/**/1, 8, 8
122 #elif defined(PIC32)
123 #define	MCOUNT_SIZE	(10*4)	/* 10 instructions */
124 #define	MCOUNT(x) \
125 	save	%sp,-SA(MINFRAME),%sp; \
126 1:	call	.+8; \
127 	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%o0; \
128 	sethi	%hi(.L_/**/x/**/1),%o1; \
129 	add	%o0,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%o0; \
130 	add	%o1,%lo(.L_/**/x/**/1),%o1; \
131 	add	%o0,%o7,%o0; \
132 	call	_mcount; \
133 	ldx	[%o0+%o1],%o0; \
134 	restore; \
135 	.common .L_/**/x/**/1,8,8
136 #else	/* PIC13 */
137 #define	MCOUNT_SIZE	(8*4)	/* 8 instructions */
138 #define	MCOUNT(x) \
139 	save	%sp,-SA(MINFRAME),%sp; \
140 1:	call	.+8; \
141 	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%o0; \
142 	add	%o0,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%o0; \
143 	add	%o0,%o7,%o0; \
144 	call	_mcount; \
145 	ldx	[%o0+%lo(.L_/**/x/**/1)],%o0; \
146 	restore; \
147 	.common .L_/**/x/**/1,8,8
148 #endif	/* !defined(PIC) */
149 #endif /* defined(PROF) && defined(__sparcv9) */
150 
151 #elif defined(__x86)
152 
153 #define	LIBM_ANSI_PRAGMA_WEAK(sym,stype) \
154 	.weak __/**/sym;		 \
155 	.type __/**/sym,@stype;		 \
156 __/**/sym	= sym
157 
158 #ifdef PIC
159 #if defined(__amd64)
160 #define	PIC_SETUP(x)
161 #define	PIC_WRAPUP
162 #define	PIC_F(x)	x@PLT
163 #define	PIC_G(x)	x@GOTPCREL(%rip)
164 #define	PIC_L(x)	x(%rip)
165 #define	PIC_G_LOAD(insn,sym,dst) \
166 	movq	PIC_G(sym),%dst; \
167 	insn	(%dst),%dst
168 #else
169 #define	PIC_SETUP(label) \
170 	pushl	%ebx; \
171 	call	.label; \
172 .label:	popl	%ebx; \
173 	addl	$_GLOBAL_OFFSET_TABLE_+[.-.label],%ebx
174 #define	PIC_WRAPUP	popl	%ebx
175 #define	PIC_F(x)	x@PLT
176 #define	PIC_G(x)	x@GOT(%ebx)
177 #define	PIC_L(x)	x@GOTOFF(%ebx)
178 #define	PIC_G_LOAD(insn,sym,dst) \
179 	mov	PIC_G(sym),%dst; \
180 	insn	(%dst),%dst
181 #endif
182 #else	/* defined(PIC) */
183 #define	PIC_SETUP(x)
184 #define	PIC_WRAPUP
185 #define	PIC_F(x)	x
186 #define	PIC_G(x)	x
187 #define	PIC_L(x)	x
188 #define	PIC_G_LOAD(insn,sym,dst)	insn	sym,%dst
189 #endif	/* defined(PIC) */
190 
191 #else
192 #error Unknown architecture
193 #endif
194 
195 /* END CSTYLED */
196 #else	/* defined(_ASM) */
197 
198 #include "libm_macros.h"
199 #include "libm_protos.h"
200 #include "libm_inlines.h"
201 #include <math.h>
202 #if defined(__SUNPRO_C)
203 #include <sunmath.h>
204 #endif
205 
206 #endif	/* defined(_ASM) */
207 
208 #endif	/* _LIBM_H */
209