< prev index next >
src/hotspot/cpu/x86/macroAssembler_x86.cpp
Print this page
*** 4600,4631 ****
#undef IS_A_TEMP
bind(L_fallthrough);
}
-
void MacroAssembler::clinit_barrier(Register klass, Register thread, Label* L_fast_path, Label* L_slow_path) {
assert(L_fast_path != NULL || L_slow_path != NULL, "at least one is required");
Label L_fallthrough;
if (L_fast_path == NULL) {
L_fast_path = &L_fallthrough;
}
// Fast path check: class is fully initialized
cmpb(Address(klass, InstanceKlass::init_state_offset()), InstanceKlass::fully_initialized);
jcc(Assembler::equal, *L_fast_path);
// Fast path check: current thread is initializer thread
cmpptr(thread, Address(klass, InstanceKlass::init_thread_offset()));
! if (L_slow_path != NULL) {
jcc(Assembler::notEqual, *L_slow_path);
} else {
jcc(Assembler::equal, *L_fast_path);
}
-
- bind(L_fallthrough);
}
void MacroAssembler::cmov32(Condition cc, Register dst, Address src) {
if (VM_Version::supports_cmov()) {
cmovl(cc, dst, src);
--- 4600,4635 ----
#undef IS_A_TEMP
bind(L_fallthrough);
}
void MacroAssembler::clinit_barrier(Register klass, Register thread, Label* L_fast_path, Label* L_slow_path) {
assert(L_fast_path != NULL || L_slow_path != NULL, "at least one is required");
Label L_fallthrough;
if (L_fast_path == NULL) {
L_fast_path = &L_fallthrough;
+ } else if (L_slow_path == NULL) {
+ L_slow_path = &L_fallthrough;
}
// Fast path check: class is fully initialized
cmpb(Address(klass, InstanceKlass::init_state_offset()), InstanceKlass::fully_initialized);
jcc(Assembler::equal, *L_fast_path);
// Fast path check: current thread is initializer thread
cmpptr(thread, Address(klass, InstanceKlass::init_thread_offset()));
! if (L_slow_path == &L_fallthrough) {
! jcc(Assembler::equal, *L_fast_path);
! bind(*L_slow_path);
! } else if (L_fast_path == &L_fallthrough) {
jcc(Assembler::notEqual, *L_slow_path);
+ bind(*L_fast_path);
} else {
jcc(Assembler::equal, *L_fast_path);
+ jmp(*L_slow_path);
}
}
void MacroAssembler::cmov32(Condition cc, Register dst, Address src) {
if (VM_Version::supports_cmov()) {
cmovl(cc, dst, src);
< prev index next >