src/os_cpu/solaris_sparc/vm/solaris_sparc.il

Fri, 07 Dec 2012 01:09:03 -0800

author
roland
date
Fri, 07 Dec 2012 01:09:03 -0800
changeset 4325
d2f8c38e543d
parent 2460
85c73c0edb06
child 5283
46c544b8fbfc
permissions
-rw-r--r--

Merge

duke@435 1 //
kvn@2460 2 // Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
duke@435 3 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 //
duke@435 5 // This code is free software; you can redistribute it and/or modify it
duke@435 6 // under the terms of the GNU General Public License version 2 only, as
duke@435 7 // published by the Free Software Foundation.
duke@435 8 //
duke@435 9 // This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 // version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 // accompanied this code).
duke@435 14 //
duke@435 15 // You should have received a copy of the GNU General Public License version
duke@435 16 // 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 //
trims@1907 19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 // or visit www.oracle.com if you need additional information or have any
trims@1907 21 // questions.
duke@435 22 //
duke@435 23 //
duke@435 24
duke@435 25 // Get the raw thread ID from %g7
duke@435 26
duke@435 27 .inline _raw_thread_id, 0
duke@435 28 .register %g7,#scratch
duke@435 29 .volatile
duke@435 30 mov %g7, %o0
duke@435 31 .nonvolatile
duke@435 32 .end
duke@435 33
duke@435 34
duke@435 35 // Clear SPARC fprs.FEF DU and DL bits --
duke@435 36 // allows the kernel to avoid saving FPU state at context-switch time.
duke@435 37 // Use for state-transition points (into _thread_blocked) or when
duke@435 38 // parking.
duke@435 39
duke@435 40 .inline _mark_fpu_nosave, 0
duke@435 41 .volatile
duke@435 42 wr %g0, 0, %fprs
duke@435 43 .nonvolatile
duke@435 44 .end
duke@435 45
duke@435 46 // Support for jint Atomic::xchg(jint exchange_value, volatile jint* dest).
duke@435 47 //
duke@435 48 // Arguments:
duke@435 49 // exchange_value: O0
duke@435 50 // dest: O1
duke@435 51 //
duke@435 52 // Results:
duke@435 53 // O0: the value previously stored in dest
duke@435 54
duke@435 55 .inline _Atomic_swap32, 2
duke@435 56 .volatile
duke@435 57 swap [%o1],%o0
duke@435 58 .nonvolatile
duke@435 59 .end
duke@435 60
duke@435 61
duke@435 62 // Support for intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t * dest).
duke@435 63 //
duke@435 64 // 64-bit
duke@435 65 //
duke@435 66 // Arguments:
duke@435 67 // exchange_value: O0
duke@435 68 // dest: O1
duke@435 69 //
duke@435 70 // Results:
duke@435 71 // O0: the value previously stored in dest
duke@435 72
duke@435 73 .inline _Atomic_swap64, 2
duke@435 74 .volatile
duke@435 75 1:
duke@435 76 mov %o0, %o3
duke@435 77 ldx [%o1], %o2
duke@435 78 casx [%o1], %o2, %o3
duke@435 79 cmp %o2, %o3
duke@435 80 bne %xcc, 1b
duke@435 81 nop
duke@435 82 mov %o2, %o0
duke@435 83 .nonvolatile
duke@435 84 .end
duke@435 85
duke@435 86
duke@435 87 // Support for jint Atomic::cmpxchg(jint exchange_value,
duke@435 88 // volatile jint* dest,
duke@435 89 // jint compare_value)
duke@435 90 //
duke@435 91 // Arguments:
duke@435 92 // exchange_value: O0
duke@435 93 // dest: O1
duke@435 94 // compare_value: O2
duke@435 95 //
duke@435 96 // Results:
duke@435 97 // O0: the value previously stored in dest
duke@435 98
duke@435 99 .inline _Atomic_cas32, 3
duke@435 100 .volatile
duke@435 101 cas [%o1], %o2, %o0
duke@435 102 .nonvolatile
duke@435 103 .end
duke@435 104
duke@435 105
duke@435 106 // Support for intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
duke@435 107 // volatile intptr_t* dest,
duke@435 108 // intptr_t compare_value)
duke@435 109 //
duke@435 110 // 64-bit
duke@435 111 //
duke@435 112 // Arguments:
duke@435 113 // exchange_value: O0
duke@435 114 // dest: O1
duke@435 115 // compare_value: O2
duke@435 116 //
duke@435 117 // Results:
duke@435 118 // O0: the value previously stored in dest
duke@435 119
duke@435 120 .inline _Atomic_cas64, 3
duke@435 121 .volatile
duke@435 122 casx [%o1], %o2, %o0
duke@435 123 .nonvolatile
duke@435 124 .end
duke@435 125
duke@435 126
duke@435 127 // Support for jlong Atomic::cmpxchg(jlong exchange_value,
duke@435 128 // volatile jlong* dest,
duke@435 129 // jlong compare_value)
duke@435 130 //
duke@435 131 // 32-bit calling conventions
duke@435 132 //
duke@435 133 // Arguments:
duke@435 134 // exchange_value: O1:O0
duke@435 135 // dest: O2
duke@435 136 // compare_value: O4:O3
duke@435 137 //
duke@435 138 // Results:
duke@435 139 // O1:O0: the value previously stored in dest
duke@435 140
duke@435 141 .inline _Atomic_casl, 3
duke@435 142 .volatile
duke@435 143 sllx %o0, 32, %o0
duke@435 144 srl %o1, 0, %o1
duke@435 145 or %o0,%o1,%o0
duke@435 146 sllx %o3, 32, %o3
duke@435 147 srl %o4, 0, %o4
duke@435 148 or %o3,%o4,%o3
duke@435 149 casx [%o2], %o3, %o0
duke@435 150 srl %o0, 0, %o1
duke@435 151 srlx %o0, 32, %o0
duke@435 152 .nonvolatile
duke@435 153 .end
duke@435 154
kvn@2460 155 // Support for jlong Atomic::load and Atomic::store on v8.
kvn@2460 156 //
kvn@2460 157 // void _Atomic_move_long_v8(volatile jlong* src, volatile jlong* dst)
kvn@2460 158 //
kvn@2460 159 // Arguments:
kvn@2460 160 // src: O0
kvn@2460 161 // dest: O1
kvn@2460 162 //
kvn@2460 163 // Overwrites O2 and O3
kvn@2460 164
kvn@2460 165 .inline _Atomic_move_long_v8,2
kvn@2460 166 .volatile
kvn@2460 167 ldd [%o0], %o2
kvn@2460 168 std %o2, [%o1]
kvn@2460 169 .nonvolatile
kvn@2460 170 .end
kvn@2460 171
kvn@2460 172 // Support for jlong Atomic::load and Atomic::store on v9.
kvn@2460 173 //
kvn@2460 174 // void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst)
kvn@2460 175 //
kvn@2460 176 // Arguments:
kvn@2460 177 // src: O0
kvn@2460 178 // dest: O1
kvn@2460 179 //
kvn@2460 180 // Overwrites O2
kvn@2460 181
kvn@2460 182 .inline _Atomic_move_long_v9,2
kvn@2460 183 .volatile
kvn@2460 184 ldx [%o0], %o2
kvn@2460 185 stx %o2, [%o1]
kvn@2460 186 .nonvolatile
kvn@2460 187 .end
duke@435 188
duke@435 189 // Support for jint Atomic::add(jint add_value, volatile jint* dest).
duke@435 190 //
duke@435 191 // Arguments:
duke@435 192 // add_value: O0 (e.g., +1 or -1)
duke@435 193 // dest: O1
duke@435 194 //
duke@435 195 // Results:
duke@435 196 // O0: the new value stored in dest
duke@435 197 //
duke@435 198 // Overwrites O3
duke@435 199
duke@435 200 .inline _Atomic_add32, 2
duke@435 201 .volatile
duke@435 202 2:
duke@435 203 ld [%o1], %o2
duke@435 204 add %o0, %o2, %o3
duke@435 205 cas [%o1], %o2, %o3
duke@435 206 cmp %o2, %o3
duke@435 207 bne 2b
duke@435 208 nop
duke@435 209 add %o0, %o2, %o0
duke@435 210 .nonvolatile
duke@435 211 .end
duke@435 212
duke@435 213
duke@435 214 // Support for intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest)
duke@435 215 //
duke@435 216 // 64-bit
duke@435 217 //
duke@435 218 // Arguments:
duke@435 219 // add_value: O0 (e.g., +1 or -1)
duke@435 220 // dest: O1
duke@435 221 //
duke@435 222 // Results:
duke@435 223 // O0: the new value stored in dest
duke@435 224 //
duke@435 225 // Overwrites O3
duke@435 226
duke@435 227 .inline _Atomic_add64, 2
duke@435 228 .volatile
duke@435 229 3:
duke@435 230 ldx [%o1], %o2
duke@435 231 add %o0, %o2, %o3
duke@435 232 casx [%o1], %o2, %o3
duke@435 233 cmp %o2, %o3
duke@435 234 bne %xcc, 3b
duke@435 235 nop
duke@435 236 add %o0, %o2, %o0
duke@435 237 .nonvolatile
duke@435 238 .end
duke@435 239
duke@435 240
duke@435 241 // Support for void OrderAccess::acquire()
duke@435 242 // The method is intentionally empty.
duke@435 243 // It exists for the sole purpose of generating
duke@435 244 // a C/C++ sequence point over which the compiler won't
duke@435 245 // reorder code.
duke@435 246
duke@435 247 .inline _OrderAccess_acquire,0
duke@435 248 .volatile
duke@435 249 .nonvolatile
duke@435 250 .end
duke@435 251
duke@435 252
duke@435 253 // Support for void OrderAccess::fence()
duke@435 254
duke@435 255 .inline _OrderAccess_fence,0
duke@435 256 .volatile
duke@435 257 membar #StoreLoad
duke@435 258 .nonvolatile
duke@435 259 .end
duke@435 260
duke@435 261
duke@435 262 // Support for void Prefetch::read(void *loc, intx interval)
duke@435 263 //
duke@435 264 // Prefetch for several reads.
duke@435 265
duke@435 266 .inline _Prefetch_read, 2
duke@435 267 .volatile
duke@435 268 prefetch [%o0+%o1], 0
duke@435 269 .nonvolatile
duke@435 270 .end
duke@435 271
duke@435 272
duke@435 273 // Support for void Prefetch::write(void *loc, intx interval)
duke@435 274 //
duke@435 275 // Prefetch for several writes.
duke@435 276
duke@435 277 .inline _Prefetch_write, 2
duke@435 278 .volatile
duke@435 279 prefetch [%o0+%o1], 2
duke@435 280 .nonvolatile
duke@435 281 .end
duke@435 282
duke@435 283
duke@435 284 // Support for void Copy::conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count)
duke@435 285 //
duke@435 286 // 32-bit
duke@435 287 //
duke@435 288 // Arguments:
duke@435 289 // from: O0
duke@435 290 // to: O1
duke@435 291 // count: O2 treated as signed
duke@435 292 //
duke@435 293 // Clobbers:
duke@435 294 // long_value: O2, O3
duke@435 295 // count: O4
duke@435 296 //
duke@435 297 // if (from > to) {
duke@435 298 // while (--count >= 0) {
duke@435 299 // *to++ = *from++;
duke@435 300 // }
duke@435 301 // } else {
duke@435 302 // while (--count >= 0) {
duke@435 303 // to[count] = from[count];
duke@435 304 // }
duke@435 305 // }
duke@435 306 .inline _Copy_conjoint_jlongs_atomic, 3
duke@435 307 .volatile
duke@435 308 cmp %o0, %o1
duke@435 309 bleu 4f
duke@435 310 sll %o2, 3, %o4
duke@435 311 ba 2f
duke@435 312 1:
duke@435 313 subcc %o4, 8, %o4
duke@435 314 std %o2, [%o1]
duke@435 315 add %o0, 8, %o0
duke@435 316 add %o1, 8, %o1
duke@435 317 2:
duke@435 318 bge,a 1b
duke@435 319 ldd [%o0], %o2
duke@435 320 ba 5f
duke@435 321 nop
duke@435 322 3:
duke@435 323 std %o2, [%o1+%o4]
duke@435 324 4:
duke@435 325 subcc %o4, 8, %o4
duke@435 326 bge,a 3b
duke@435 327 ldd [%o0+%o4], %o2
duke@435 328 5:
duke@435 329 .nonvolatile
duke@435 330 .end

mercurial