21 */
22 /*
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #ifndef _ASM_ATOMIC_H
28 #define _ASM_ATOMIC_H
29
30 #include <sys/ccompile.h>
31 #include <sys/types.h>
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 #if !defined(__lint) && defined(__GNUC__)
38
39 #if defined(__amd64)
40
41 extern __GNU_INLINE void
42 atomic_or_long(ulong_t *target, ulong_t bits)
43 {
44 __asm__ __volatile__(
45 "lock; orq %1, (%0)"
46 : /* no output */
47 : "r" (target), "r" (bits));
48 }
49
50 extern __GNU_INLINE void
51 atomic_and_long(ulong_t *target, ulong_t bits)
52 {
53 __asm__ __volatile__(
54 "lock; andq %1, (%0)"
55 : /* no output */
56 : "r" (target), "r" (bits));
57 }
58
59 #ifdef notdef
60 extern __GNU_INLINE uint64_t
61 cas64(uint64_t *target, uint64_t cmp,
62 uint64_t newval)
63 {
64 uint64_t retval;
65
66 __asm__ __volatile__(
67 "movq %2, %%rax; lock; cmpxchgq %3, (%1)"
68 : "=a" (retval)
69 : "r" (target), "r" (cmp), "r" (newval));
70 return (retval);
71 }
72 #endif
73
74 #elif defined(__i386)
75
76 extern __GNU_INLINE void
77 atomic_or_long(ulong_t *target, ulong_t bits)
78 {
79 __asm__ __volatile__(
80 "lock; orl %1, (%0)"
81 : /* no output */
82 : "r" (target), "r" (bits));
83 }
84
85 extern __GNU_INLINE void
86 atomic_and_long(ulong_t *target, ulong_t bits)
87 {
88 __asm__ __volatile__(
89 "lock; andl %1, (%0)"
90 : /* no output */
91 : "r" (target), "r" (bits));
92 }
93
94 #else
95 #error "port me"
96 #endif
97
98 #endif /* !__lint && __GNUC__ */
99
100 #ifdef __cplusplus
101 }
102 #endif
103
104 #endif /* _ASM_ATOMIC_H */
|
21 */
22 /*
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #ifndef _ASM_ATOMIC_H
28 #define _ASM_ATOMIC_H
29
30 #include <sys/ccompile.h>
31 #include <sys/types.h>
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 #if !defined(__lint) && defined(__GNUC__)
38
39 #if defined(__amd64)
40
41 #elif defined(__i386)
42
43 #else
44 #error "port me"
45 #endif
46
47 #endif /* !__lint && __GNUC__ */
48
49 #ifdef __cplusplus
50 }
51 #endif
52
53 #endif /* _ASM_ATOMIC_H */
|