Tue, 01 Feb 2011 11:23:19 -0500
6588413: Use -fvisibility=hidden for gcc compiles
Summary: Add option for gcc 4 and above, define JNIEXPORT and JNIIMPORT to visibility=default, add for jio_snprintf and others since -fvisibility=hidden overrides --version-script definitions.
Reviewed-by: kamg, never
1 //
2 // Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
3 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 //
5 // This code is free software; you can redistribute it and/or modify it
6 // under the terms of the GNU General Public License version 2 only, as
7 // published by the Free Software Foundation.
8 //
9 // This code is distributed in the hope that it will be useful, but WITHOUT
10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 // version 2 for more details (a copy is included in the LICENSE file that
13 // accompanied this code).
14 //
15 // You should have received a copy of the GNU General Public License version
16 // 2 along with this work; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 //
19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 // or visit www.oracle.com if you need additional information or have any
21 // questions.
22 //
23 //
25 // Get the raw thread ID from %g7
27 .inline _raw_thread_id, 0
28 .register %g7,#scratch
29 .volatile
30 mov %g7, %o0
31 .nonvolatile
32 .end
35 // Clear SPARC fprs.FEF DU and DL bits --
36 // allows the kernel to avoid saving FPU state at context-switch time.
37 // Use for state-transition points (into _thread_blocked) or when
38 // parking.
40 .inline _mark_fpu_nosave, 0
41 .volatile
42 wr %g0, 0, %fprs
43 .nonvolatile
44 .end
46 // Support for jint Atomic::xchg(jint exchange_value, volatile jint* dest).
47 //
48 // Arguments:
49 // exchange_value: O0
50 // dest: O1
51 //
52 // Results:
53 // O0: the value previously stored in dest
55 .inline _Atomic_swap32, 2
56 .volatile
57 swap [%o1],%o0
58 .nonvolatile
59 .end
62 // Support for intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t * dest).
63 //
64 // 64-bit
65 //
66 // Arguments:
67 // exchange_value: O0
68 // dest: O1
69 //
70 // Results:
71 // O0: the value previously stored in dest
73 .inline _Atomic_swap64, 2
74 .volatile
75 1:
76 mov %o0, %o3
77 ldx [%o1], %o2
78 casx [%o1], %o2, %o3
79 cmp %o2, %o3
80 bne %xcc, 1b
81 nop
82 mov %o2, %o0
83 .nonvolatile
84 .end
87 // Support for jint Atomic::cmpxchg(jint exchange_value,
88 // volatile jint* dest,
89 // jint compare_value)
90 //
91 // Arguments:
92 // exchange_value: O0
93 // dest: O1
94 // compare_value: O2
95 //
96 // Results:
97 // O0: the value previously stored in dest
99 .inline _Atomic_cas32, 3
100 .volatile
101 cas [%o1], %o2, %o0
102 .nonvolatile
103 .end
106 // Support for intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
107 // volatile intptr_t* dest,
108 // intptr_t compare_value)
109 //
110 // 64-bit
111 //
112 // Arguments:
113 // exchange_value: O0
114 // dest: O1
115 // compare_value: O2
116 //
117 // Results:
118 // O0: the value previously stored in dest
120 .inline _Atomic_cas64, 3
121 .volatile
122 casx [%o1], %o2, %o0
123 .nonvolatile
124 .end
127 // Support for jlong Atomic::cmpxchg(jlong exchange_value,
128 // volatile jlong* dest,
129 // jlong compare_value)
130 //
131 // 32-bit calling conventions
132 //
133 // Arguments:
134 // exchange_value: O1:O0
135 // dest: O2
136 // compare_value: O4:O3
137 //
138 // Results:
139 // O1:O0: the value previously stored in dest
141 .inline _Atomic_casl, 3
142 .volatile
143 sllx %o0, 32, %o0
144 srl %o1, 0, %o1
145 or %o0,%o1,%o0
146 sllx %o3, 32, %o3
147 srl %o4, 0, %o4
148 or %o3,%o4,%o3
149 casx [%o2], %o3, %o0
150 srl %o0, 0, %o1
151 srlx %o0, 32, %o0
152 .nonvolatile
153 .end
155 // Support for jlong Atomic::load and Atomic::store on v8.
156 //
157 // void _Atomic_move_long_v8(volatile jlong* src, volatile jlong* dst)
158 //
159 // Arguments:
160 // src: O0
161 // dest: O1
162 //
163 // Overwrites O2 and O3
165 .inline _Atomic_move_long_v8,2
166 .volatile
167 ldd [%o0], %o2
168 std %o2, [%o1]
169 .nonvolatile
170 .end
172 // Support for jlong Atomic::load and Atomic::store on v9.
173 //
174 // void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst)
175 //
176 // Arguments:
177 // src: O0
178 // dest: O1
179 //
180 // Overwrites O2
182 .inline _Atomic_move_long_v9,2
183 .volatile
184 ldx [%o0], %o2
185 stx %o2, [%o1]
186 .nonvolatile
187 .end
189 // Support for jint Atomic::add(jint add_value, volatile jint* dest).
190 //
191 // Arguments:
192 // add_value: O0 (e.g., +1 or -1)
193 // dest: O1
194 //
195 // Results:
196 // O0: the new value stored in dest
197 //
198 // Overwrites O3
200 .inline _Atomic_add32, 2
201 .volatile
202 2:
203 ld [%o1], %o2
204 add %o0, %o2, %o3
205 cas [%o1], %o2, %o3
206 cmp %o2, %o3
207 bne 2b
208 nop
209 add %o0, %o2, %o0
210 .nonvolatile
211 .end
214 // Support for intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest)
215 //
216 // 64-bit
217 //
218 // Arguments:
219 // add_value: O0 (e.g., +1 or -1)
220 // dest: O1
221 //
222 // Results:
223 // O0: the new value stored in dest
224 //
225 // Overwrites O3
227 .inline _Atomic_add64, 2
228 .volatile
229 3:
230 ldx [%o1], %o2
231 add %o0, %o2, %o3
232 casx [%o1], %o2, %o3
233 cmp %o2, %o3
234 bne %xcc, 3b
235 nop
236 add %o0, %o2, %o0
237 .nonvolatile
238 .end
241 // Support for void OrderAccess::acquire()
242 // The method is intentionally empty.
243 // It exists for the sole purpose of generating
244 // a C/C++ sequence point over which the compiler won't
245 // reorder code.
247 .inline _OrderAccess_acquire,0
248 .volatile
249 .nonvolatile
250 .end
253 // Support for void OrderAccess::fence()
255 .inline _OrderAccess_fence,0
256 .volatile
257 membar #StoreLoad
258 .nonvolatile
259 .end
262 // Support for void Prefetch::read(void *loc, intx interval)
263 //
264 // Prefetch for several reads.
266 .inline _Prefetch_read, 2
267 .volatile
268 prefetch [%o0+%o1], 0
269 .nonvolatile
270 .end
273 // Support for void Prefetch::write(void *loc, intx interval)
274 //
275 // Prefetch for several writes.
277 .inline _Prefetch_write, 2
278 .volatile
279 prefetch [%o0+%o1], 2
280 .nonvolatile
281 .end
284 // Support for void Copy::conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count)
285 //
286 // 32-bit
287 //
288 // Arguments:
289 // from: O0
290 // to: O1
291 // count: O2 treated as signed
292 //
293 // Clobbers:
294 // long_value: O2, O3
295 // count: O4
296 //
297 // if (from > to) {
298 // while (--count >= 0) {
299 // *to++ = *from++;
300 // }
301 // } else {
302 // while (--count >= 0) {
303 // to[count] = from[count];
304 // }
305 // }
306 .inline _Copy_conjoint_jlongs_atomic, 3
307 .volatile
308 cmp %o0, %o1
309 bleu 4f
310 sll %o2, 3, %o4
311 ba 2f
312 1:
313 subcc %o4, 8, %o4
314 std %o2, [%o1]
315 add %o0, 8, %o0
316 add %o1, 8, %o1
317 2:
318 bge,a 1b
319 ldd [%o0], %o2
320 ba 5f
321 nop
322 3:
323 std %o2, [%o1+%o4]
324 4:
325 subcc %o4, 8, %o4
326 bge,a 3b
327 ldd [%o0+%o4], %o2
328 5:
329 .nonvolatile
330 .end