src/os_cpu/solaris_sparc/vm/solaris_sparc.il

Wed, 27 Apr 2016 01:25:04 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:25:04 +0800
changeset 0
f90c822e73f8
child 6876
710a3c8b516e
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/
changeset: 6782:28b50d07f6f8
tag: jdk8u25-b17

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

mercurial