Mercurial > hg > truffle
comparison src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp @ 2140:85c73c0edb06
7012965: Fix failed on sparc for 7009756: volatile variables could be broken throw reflection API
Summary: Use LDX/STX on v9 and LDD/STD on v8 sparc for volatile long moves.
Reviewed-by: never
author | kvn |
---|---|
date | Tue, 18 Jan 2011 17:10:03 -0800 |
parents | f95d63e2154a |
children | f7de3327c683 |
comparison
equal
deleted
inserted
replaced
2139:75efcee5ac47 | 2140:85c73c0edb06 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
33 // Implementation of class atomic | 33 // Implementation of class atomic |
34 | 34 |
35 inline void Atomic::store (jbyte store_value, jbyte* dest) { *dest = store_value; } | 35 inline void Atomic::store (jbyte store_value, jbyte* dest) { *dest = store_value; } |
36 inline void Atomic::store (jshort store_value, jshort* dest) { *dest = store_value; } | 36 inline void Atomic::store (jshort store_value, jshort* dest) { *dest = store_value; } |
37 inline void Atomic::store (jint store_value, jint* dest) { *dest = store_value; } | 37 inline void Atomic::store (jint store_value, jint* dest) { *dest = store_value; } |
38 inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; } | |
39 inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { *dest = store_value; } | 38 inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { *dest = store_value; } |
40 inline void Atomic::store_ptr(void* store_value, void* dest) { *(void**)dest = store_value; } | 39 inline void Atomic::store_ptr(void* store_value, void* dest) { *(void**)dest = store_value; } |
41 | 40 |
42 inline void Atomic::store (jbyte store_value, volatile jbyte* dest) { *dest = store_value; } | 41 inline void Atomic::store (jbyte store_value, volatile jbyte* dest) { *dest = store_value; } |
43 inline void Atomic::store (jshort store_value, volatile jshort* dest) { *dest = store_value; } | 42 inline void Atomic::store (jshort store_value, volatile jshort* dest) { *dest = store_value; } |
44 inline void Atomic::store (jint store_value, volatile jint* dest) { *dest = store_value; } | 43 inline void Atomic::store (jint store_value, volatile jint* dest) { *dest = store_value; } |
45 inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; } | |
46 inline void Atomic::store_ptr(intptr_t store_value, volatile intptr_t* dest) { *dest = store_value; } | 44 inline void Atomic::store_ptr(intptr_t store_value, volatile intptr_t* dest) { *dest = store_value; } |
47 inline void Atomic::store_ptr(void* store_value, volatile void* dest) { *(void* volatile *)dest = store_value; } | 45 inline void Atomic::store_ptr(void* store_value, volatile void* dest) { *(void* volatile *)dest = store_value; } |
48 | 46 |
49 inline void Atomic::inc (volatile jint* dest) { (void)add (1, dest); } | 47 inline void Atomic::inc (volatile jint* dest) { (void)add (1, dest); } |
50 inline void Atomic::inc_ptr(volatile intptr_t* dest) { (void)add_ptr(1, dest); } | 48 inline void Atomic::inc_ptr(volatile intptr_t* dest) { (void)add_ptr(1, dest); } |
52 | 50 |
53 inline void Atomic::dec (volatile jint* dest) { (void)add (-1, dest); } | 51 inline void Atomic::dec (volatile jint* dest) { (void)add (-1, dest); } |
54 inline void Atomic::dec_ptr(volatile intptr_t* dest) { (void)add_ptr(-1, dest); } | 52 inline void Atomic::dec_ptr(volatile intptr_t* dest) { (void)add_ptr(-1, dest); } |
55 inline void Atomic::dec_ptr(volatile void* dest) { (void)add_ptr(-1, dest); } | 53 inline void Atomic::dec_ptr(volatile void* dest) { (void)add_ptr(-1, dest); } |
56 | 54 |
55 | |
56 #ifdef _LP64 | |
57 | |
58 inline void Atomic::store(jlong store_value, jlong* dest) { *dest = store_value; } | |
59 inline void Atomic::store(jlong store_value, volatile jlong* dest) { *dest = store_value; } | |
57 inline jlong Atomic::load(volatile jlong* src) { return *src; } | 60 inline jlong Atomic::load(volatile jlong* src) { return *src; } |
61 | |
62 #else | |
63 | |
64 extern "C" void _Atomic_move_long_v8(volatile jlong* src, volatile jlong* dst); | |
65 extern "C" void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst); | |
66 | |
67 inline void Atomic_move_long(volatile jlong* src, volatile jlong* dst) { | |
68 #ifdef COMPILER2 | |
69 // Compiler2 does not support v8, it is used only for v9. | |
70 assert (VM_Version::v9_instructions_work(), "only supported on v9"); | |
71 _Atomic_move_long_v9(src, dst); | |
72 #else | |
73 // The branch is cheaper then emulated LDD. | |
74 if (VM_Version::v9_instructions_work()) { | |
75 _Atomic_move_long_v9(src, dst); | |
76 } else { | |
77 _Atomic_move_long_v8(src, dst); | |
78 } | |
79 #endif | |
80 } | |
81 | |
82 inline jlong Atomic::load(volatile jlong* src) { | |
83 volatile jlong dest; | |
84 Atomic_move_long(src, &dest); | |
85 return dest; | |
86 } | |
87 | |
88 inline void Atomic::store(jlong store_value, jlong* dest) { | |
89 Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest); | |
90 } | |
91 | |
92 inline void Atomic::store(jlong store_value, volatile jlong* dest) { | |
93 Atomic_move_long((volatile jlong*)&store_value, dest); | |
94 } | |
95 | |
96 #endif | |
58 | 97 |
59 #ifdef _GNU_SOURCE | 98 #ifdef _GNU_SOURCE |
60 | 99 |
61 inline jint Atomic::add (jint add_value, volatile jint* dest) { | 100 inline jint Atomic::add (jint add_value, volatile jint* dest) { |
62 intptr_t rv; | 101 intptr_t rv; |