1/*	$NetBSD: atomic_or.S,v 1.12 2022/04/06 22:47:56 riastradh Exp $	*/
2
3/*-
4 * Copyright (c) 2007 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include "atomic_op_asm.h"
33
34	.text
35
36ENTRY(_atomic_or_32)
37	movl	4(%sp), %a0
38	movl	8(%sp), %d0
39	orl	%d0, (%a0)
40	rts
41END(_atomic_or_32)
42
43ATOMIC_OP_ALIAS(atomic_or_32,_atomic_or_32)
44ATOMIC_OP_ALIAS(atomic_or_uint,_atomic_or_32)
45STRONG_ALIAS(_atomic_or_uint,_atomic_or_32)
46ATOMIC_OP_ALIAS(atomic_or_ulong,_atomic_or_32)
47STRONG_ALIAS(_atomic_or_ulong,_atomic_or_32)
48ATOMIC_OP_ALIAS(atomic_or_ptr,_atomic_or_32)
49STRONG_ALIAS(_atomic_or_ptr,_atomic_or_32)
50
51ENTRY(_atomic_or_32_nv)
52	movl	4(%sp), %a0
531:	movl	(%a0), %d0
54	movl	%d0, %d1
55	orl	8(%sp), %d0
56	casl	%d1, %d0, (%a0)
57	bne	1b
58	movl	%d0, %a0
59	rts
60END(_atomic_or_32_nv)
61
62ATOMIC_OP_ALIAS(atomic_or_32_nv,_atomic_or_32_nv)
63ATOMIC_OP_ALIAS(atomic_or_uint_nv,_atomic_or_32_nv)
64STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv)
65ATOMIC_OP_ALIAS(atomic_or_ulong_nv,_atomic_or_32_nv)
66STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_32_nv)
67ATOMIC_OP_ALIAS(atomic_or_ptr_nv,_atomic_or_32_nv)
68STRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_32_nv)
69CRT_ALIAS(__sync_or_and_fetch_4, _atomic_or_32_nv)
70
71
72ENTRY(__sync_fetch_and_or_4)
73	movl	4(%sp), %a0
741:	movl	(%a0), %d0
75	movl	%d0, %d1
76	orl	8(%sp), %d1
77	casl	%d0, %d1, (%a0)
78	bne	1b
79	movl	%d0, %a0
80	rts
81END(__sync_fetch_and_or_4)
82
83
84ENTRY(_atomic_or_16_nv)
85	movl	4(%sp), %a0
861:	movw	(%a0), %d0
87	movw	%d0, %d1
88	orw	8(%sp), %d0
89	casw	%d1, %d0, (%a0)
90	bne	1b
91	rts
92END(_atomic_or_16_nv)
93CRT_ALIAS(__sync_or_and_fetch_2, _atomic_or_16_nv)
94
95ENTRY(__sync_fetch_and_or_2)
96	movl	4(%sp), %a0
971:	movw	(%a0), %d0
98	movw	%d0, %d1
99	orw	8(%sp), %d1
100	casw	%d0, %d1, (%a0)
101	bne	1b
102	rts
103END(__sync_fetch_and_or_2)
104
105
106ENTRY(_atomic_or_8_nv)
107	movl	4(%sp), %a0
1081:	movb	(%a0), %d0
109	movb	%d0, %d1
110	orb	8(%sp), %d0
111	casb	%d1, %d0, (%a0)
112	bne	1b
113	rts
114END(_atomic_or_8_nv)
115CRT_ALIAS(__sync_or_and_fetch_1, _atomic_or_8_nv)
116
117ENTRY(__sync_fetch_and_or_1)
118	movl	4(%sp), %a0
1191:	movb	(%a0), %d0
120	movb	%d0, %d1
121	orb	8(%sp), %d1
122	casb	%d0, %d1, (%a0)
123	bne	1b
124	rts
125END(__sync_fetch_and_or_1)
126
127CRT_ALIAS(__atomic_fetch_or_1,__sync_fetch_and_or_1)
128CRT_ALIAS(__atomic_fetch_or_2,__sync_fetch_and_or_2)
129CRT_ALIAS(__atomic_fetch_or_4,__sync_fetch_and_or_4)
130