src/os_cpu/solaris_sparc/vm/solaris_sparc.il

Thu, 21 Oct 2010 11:55:10 -0700

author
never
date
Thu, 21 Oct 2010 11:55:10 -0700
changeset 2262
1e9a9d2e6509
parent 1907
c18cbe5936b8
child 2460
85c73c0edb06
permissions
-rw-r--r--

6970683: improvements to hs_err output
Reviewed-by: kvn, jrose, dholmes, coleenp

duke@435 1 //
trims@1907 2 // Copyright (c) 2002, 2005, 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
duke@435 155
duke@435 156 // Support for jint Atomic::add(jint add_value, volatile jint* dest).
duke@435 157 //
duke@435 158 // Arguments:
duke@435 159 // add_value: O0 (e.g., +1 or -1)
duke@435 160 // dest: O1
duke@435 161 //
duke@435 162 // Results:
duke@435 163 // O0: the new value stored in dest
duke@435 164 //
duke@435 165 // Overwrites O3
duke@435 166
duke@435 167 .inline _Atomic_add32, 2
duke@435 168 .volatile
duke@435 169 2:
duke@435 170 ld [%o1], %o2
duke@435 171 add %o0, %o2, %o3
duke@435 172 cas [%o1], %o2, %o3
duke@435 173 cmp %o2, %o3
duke@435 174 bne 2b
duke@435 175 nop
duke@435 176 add %o0, %o2, %o0
duke@435 177 .nonvolatile
duke@435 178 .end
duke@435 179
duke@435 180
duke@435 181 // Support for intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest)
duke@435 182 //
duke@435 183 // 64-bit
duke@435 184 //
duke@435 185 // Arguments:
duke@435 186 // add_value: O0 (e.g., +1 or -1)
duke@435 187 // dest: O1
duke@435 188 //
duke@435 189 // Results:
duke@435 190 // O0: the new value stored in dest
duke@435 191 //
duke@435 192 // Overwrites O3
duke@435 193
duke@435 194 .inline _Atomic_add64, 2
duke@435 195 .volatile
duke@435 196 3:
duke@435 197 ldx [%o1], %o2
duke@435 198 add %o0, %o2, %o3
duke@435 199 casx [%o1], %o2, %o3
duke@435 200 cmp %o2, %o3
duke@435 201 bne %xcc, 3b
duke@435 202 nop
duke@435 203 add %o0, %o2, %o0
duke@435 204 .nonvolatile
duke@435 205 .end
duke@435 206
duke@435 207
duke@435 208 // Support for void OrderAccess::acquire()
duke@435 209 // The method is intentionally empty.
duke@435 210 // It exists for the sole purpose of generating
duke@435 211 // a C/C++ sequence point over which the compiler won't
duke@435 212 // reorder code.
duke@435 213
duke@435 214 .inline _OrderAccess_acquire,0
duke@435 215 .volatile
duke@435 216 .nonvolatile
duke@435 217 .end
duke@435 218
duke@435 219
duke@435 220 // Support for void OrderAccess::fence()
duke@435 221
duke@435 222 .inline _OrderAccess_fence,0
duke@435 223 .volatile
duke@435 224 membar #StoreLoad
duke@435 225 .nonvolatile
duke@435 226 .end
duke@435 227
duke@435 228
duke@435 229 // Support for void Prefetch::read(void *loc, intx interval)
duke@435 230 //
duke@435 231 // Prefetch for several reads.
duke@435 232
duke@435 233 .inline _Prefetch_read, 2
duke@435 234 .volatile
duke@435 235 prefetch [%o0+%o1], 0
duke@435 236 .nonvolatile
duke@435 237 .end
duke@435 238
duke@435 239
duke@435 240 // Support for void Prefetch::write(void *loc, intx interval)
duke@435 241 //
duke@435 242 // Prefetch for several writes.
duke@435 243
duke@435 244 .inline _Prefetch_write, 2
duke@435 245 .volatile
duke@435 246 prefetch [%o0+%o1], 2
duke@435 247 .nonvolatile
duke@435 248 .end
duke@435 249
duke@435 250
duke@435 251 // Support for void Copy::conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count)
duke@435 252 //
duke@435 253 // 32-bit
duke@435 254 //
duke@435 255 // Arguments:
duke@435 256 // from: O0
duke@435 257 // to: O1
duke@435 258 // count: O2 treated as signed
duke@435 259 //
duke@435 260 // Clobbers:
duke@435 261 // long_value: O2, O3
duke@435 262 // count: O4
duke@435 263 //
duke@435 264 // if (from > to) {
duke@435 265 // while (--count >= 0) {
duke@435 266 // *to++ = *from++;
duke@435 267 // }
duke@435 268 // } else {
duke@435 269 // while (--count >= 0) {
duke@435 270 // to[count] = from[count];
duke@435 271 // }
duke@435 272 // }
duke@435 273 .inline _Copy_conjoint_jlongs_atomic, 3
duke@435 274 .volatile
duke@435 275 cmp %o0, %o1
duke@435 276 bleu 4f
duke@435 277 sll %o2, 3, %o4
duke@435 278 ba 2f
duke@435 279 1:
duke@435 280 subcc %o4, 8, %o4
duke@435 281 std %o2, [%o1]
duke@435 282 add %o0, 8, %o0
duke@435 283 add %o1, 8, %o1
duke@435 284 2:
duke@435 285 bge,a 1b
duke@435 286 ldd [%o0], %o2
duke@435 287 ba 5f
duke@435 288 nop
duke@435 289 3:
duke@435 290 std %o2, [%o1+%o4]
duke@435 291 4:
duke@435 292 subcc %o4, 8, %o4
duke@435 293 bge,a 3b
duke@435 294 ldd [%o0+%o4], %o2
duke@435 295 5:
duke@435 296 .nonvolatile
duke@435 297 .end

mercurial