2 * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
3 * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
4 * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
7 * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
8 * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
10 * Permission is hereby granted to use or copy this program
11 * for any purpose, provided the above notices are retained on all copies.
12 * Permission to modify the code and to distribute modified code is granted,
13 * provided the above notices are retained, and a notice that the code was
14 * modified is included with the above copyright notice.
18 /* FIXME. Very incomplete. No support for sparc64. */
19 /* Non-ancient SPARCs provide compare-and-swap (casa). */
20 /* We should make that available. */
22 #include "../all_atomic_load_store.h"
24 /* Real SPARC code uses TSO: */
25 #include "../ordered_except_wr.h"
27 /* Test_and_set location is just a byte. */
28 #include "../test_and_set_t_is_char.h"
31 AO_test_and_set_full(volatile AO_TS_t *addr) {
34 __asm__ __volatile__("ldstub %1,%0"
35 : "=r"(oldval), "=m"(*addr)
36 : "m"(*addr) : "memory");
40 #define AO_HAVE_test_and_set_full
42 #ifndef AO_NO_SPARC_V9
43 /* Returns nonzero if the comparison succeeded. */
45 AO_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) {
47 __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t"
48 # if defined(__arch64__)
51 "cas [%2],%0,%1\n\t" /* 32-bit version */
53 "membar #StoreLoad | #StoreStore\n\t"
56 "mov 1,%0\n\t"/* one insn after branch always executed */
59 : "=r" (ret), "+r" (new_val)
60 : "r" (addr), "0" (old)
65 #define AO_HAVE_compare_and_swap_full
66 #endif /* AO_NO_SPARC_V9 */
68 /* FIXME: This needs to be extended for SPARC v8 and v9. */
69 /* SPARC V8 also has swap. V9 has CAS. */
70 /* There are barriers like membar #LoadStore. */
71 /* CASA (32-bit) and CASXA(64-bit) instructions were */