xref: /titanic_51/usr/src/lib/libc/sparc/threads/sparc.il (revision 4e9cfc9a015e8ca7d41f7d018c74dc8a692305b3)
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 2007 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#pragma ident	"%Z%%M%	%I%	%E% SMI"
27
28	.inline	_curthread, 0
29	.register %g7, #scratch
30	mov	%g7, %o0
31	.end
32
33	.inline	__curthread, 0
34	.register %g7, #scratch
35	ld	[%g7 + 80], %o0		! ul_self
36	.end
37
38	.inline	stkptr, 0
39	mov	%sp, %o0
40	.end
41
42	.inline	gethrtime, 0
43	ta	0x24
44	.end
45
46	.inline	set_lock_byte, 0
47	ldstub	[%o0], %o0
48	.end
49
50	/*
51	 * When compiling with -xarch=v8, the compiler refuses to
52	 * accept the 'cas' instruction, so we encode it in hex below.
53	 * We can't compile the 32-bit libc with -xarch=v8plus because
54	 * then %g5 would become a scratch register and we would break
55	 * 32-bit applications that use %g5 as an invariant register.
56	 */
57
58	.inline	atomic_cas_32, 0
59	.word	0xd5e21009	! cas [%o0], %o1, %o2
60	mov	%o2, %o0
61	.end
62
63	.inline	atomic_swap_32, 0
64	ld	[%o0], %o2
651:
66	mov	%o1, %o3
67	.word	0xd7e2100a	! cas [%o0], %o2, %o3
68	cmp	%o2, %o3
69	bne,a	1b
70	  mov	%o3, %o2
71	mov	%o3, %o0
72	.end
73
74	.inline	atomic_inc_32, 0
75	ld	[%o0], %o2
761:
77	add	%o2, 1, %o3
78	.word	0xd7e2100a	! cas [%o0], %o2, %o3
79	cmp	%o2, %o3
80	bne,a	1b
81	  mov	%o3, %o2
82	.end
83
84	.inline	atomic_dec_32, 0
85	ld	[%o0], %o2
861:
87	sub	%o2, 1, %o3
88	.word	0xd7e2100a	! cas [%o0], %o2, %o3
89	cmp	%o2, %o3
90	bne,a	1b
91	  mov	%o3, %o2
92	.end
93
94	.inline	atomic_and_32, 0
95	ld	[%o0], %o2
961:
97	and	%o2, %o1, %o3
98	.word	0xd7e2100a	! cas [%o0], %o2, %o3
99	cmp	%o2, %o3
100	bne,a	1b
101	  mov	%o3, %o2
102	.end
103
104	.inline	atomic_or_32, 0
105	ld	[%o0], %o2
1061:
107	or	%o2, %o1, %o3
108	.word	0xd7e2100a	! cas [%o0], %o2, %o3
109	cmp	%o2, %o3
110	bne,a	1b
111	  mov	%o3, %o2
112	.end
113
114	.inline	caller, 0
115	mov	%i7, %o0
116	.end
117
118	.inline	getfp, 0
119	mov	%fp, %o0
120	.end
121