56 // exchange_value: O0
57 // dest: O1
58 //
59 // Results:
60 // O0: the value previously stored in dest
61
62 .inline _Atomic_swap64, 2
63 .volatile
64 1:
65 mov %o0, %o3
66 ldx [%o1], %o2
67 casx [%o1], %o2, %o3
68 cmp %o2, %o3
69 bne %xcc, 1b
70 nop
71 mov %o2, %o0
72 .nonvolatile
73 .end
74
75
76 // Support for jint Atomic::cmpxchg(jint exchange_value,
77 // volatile jint* dest,
78 // jint compare_value)
79 //
80 // Arguments:
81 // exchange_value: O0
82 // dest: O1
83 // compare_value: O2
84 //
85 // Results:
86 // O0: the value previously stored in dest
87
88 .inline _Atomic_cas32, 3
89 .volatile
90 cas [%o1], %o2, %o0
91 .nonvolatile
92 .end
93
94
95 // Support for intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
96 // volatile intptr_t* dest,
97 // intptr_t compare_value)
98 //
99 // 64-bit
100 //
101 // Arguments:
102 // exchange_value: O0
103 // dest: O1
104 // compare_value: O2
105 //
106 // Results:
107 // O0: the value previously stored in dest
108
109 .inline _Atomic_cas64, 3
110 .volatile
111 casx [%o1], %o2, %o0
112 .nonvolatile
113 .end
114
115
116 // Support for jlong Atomic::cmpxchg(jlong exchange_value,
117 // volatile jlong* dest,
118 // jlong compare_value)
119 //
120 // 32-bit calling conventions
121 //
122 // Arguments:
123 // exchange_value: O1:O0
124 // dest: O2
125 // compare_value: O4:O3
126 //
127 // Results:
128 // O1:O0: the value previously stored in dest
129
130 .inline _Atomic_casl, 3
131 .volatile
132 sllx %o0, 32, %o0
133 srl %o1, 0, %o1
134 or %o0,%o1,%o0
135 sllx %o3, 32, %o3
136 srl %o4, 0, %o4
137 or %o3,%o4,%o3
138 casx [%o2], %o3, %o0
139 srl %o0, 0, %o1
140 srlx %o0, 32, %o0
141 .nonvolatile
142 .end
143
144 // Support for jlong Atomic::load and Atomic::store on v9.
145 //
146 // void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst)
147 //
148 // Arguments:
149 // src: O0
150 // dest: O1
151 //
152 // Overwrites O2
153
154 .inline _Atomic_move_long_v9,2
155 .volatile
156 ldx [%o0], %o2
157 stx %o2, [%o1]
158 .nonvolatile
159 .end
160
161 // Support for jint Atomic::add(jint add_value, volatile jint* dest).
162 //
163 // Arguments:
|
56 // exchange_value: O0
57 // dest: O1
58 //
59 // Results:
60 // O0: the value previously stored in dest
61
62 .inline _Atomic_swap64, 2
63 .volatile
64 1:
65 mov %o0, %o3
66 ldx [%o1], %o2
67 casx [%o1], %o2, %o3
68 cmp %o2, %o3
69 bne %xcc, 1b
70 nop
71 mov %o2, %o0
72 .nonvolatile
73 .end
74
75
76 // Support for jlong Atomic::load and Atomic::store on v9.
77 //
78 // void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst)
79 //
80 // Arguments:
81 // src: O0
82 // dest: O1
83 //
84 // Overwrites O2
85
86 .inline _Atomic_move_long_v9,2
87 .volatile
88 ldx [%o0], %o2
89 stx %o2, [%o1]
90 .nonvolatile
91 .end
92
93 // Support for jint Atomic::add(jint add_value, volatile jint* dest).
94 //
95 // Arguments:
|