mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-17 00:50:48 +00:00
Merge
This commit is contained in:
commit
53c79c908e
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2358,6 +2358,8 @@ void LIR_Assembler::emit_alloc_array(LIR_OpAllocArray* op) {
|
||||
op->tmp3()->as_register() == G4 &&
|
||||
op->tmp4()->as_register() == O1 &&
|
||||
op->klass()->as_register() == G5, "must be");
|
||||
|
||||
LP64_ONLY( __ signx(op->len()->as_register()); )
|
||||
if (UseSlowPath ||
|
||||
(!UseFastNewObjectArray && (op->type() == T_OBJECT || op->type() == T_ARRAY)) ||
|
||||
(!UseFastNewTypeArray && (op->type() != T_OBJECT && op->type() != T_ARRAY))) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1295,16 +1295,13 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg) {
|
||||
// Get the method data pointer from the methodOop and set the
|
||||
// specified register to its value.
|
||||
|
||||
void InterpreterMacroAssembler::set_method_data_pointer_offset(Register Roff) {
|
||||
void InterpreterMacroAssembler::set_method_data_pointer() {
|
||||
assert(ProfileInterpreter, "must be profiling interpreter");
|
||||
Label get_continue;
|
||||
|
||||
ld_ptr(Lmethod, in_bytes(methodOopDesc::method_data_offset()), ImethodDataPtr);
|
||||
test_method_data_pointer(get_continue);
|
||||
add(ImethodDataPtr, in_bytes(methodDataOopDesc::data_offset()), ImethodDataPtr);
|
||||
if (Roff != noreg)
|
||||
// Roff contains a method data index ("mdi"). It defaults to zero.
|
||||
add(ImethodDataPtr, Roff, ImethodDataPtr);
|
||||
bind(get_continue);
|
||||
}
|
||||
|
||||
@ -1315,10 +1312,11 @@ void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() {
|
||||
Label zero_continue;
|
||||
|
||||
// Test MDO to avoid the call if it is NULL.
|
||||
ld_ptr(Lmethod, methodOopDesc::method_data_offset(), ImethodDataPtr);
|
||||
ld_ptr(Lmethod, in_bytes(methodOopDesc::method_data_offset()), ImethodDataPtr);
|
||||
test_method_data_pointer(zero_continue);
|
||||
call_VM_leaf(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::bcp_to_di), Lmethod, Lbcp);
|
||||
set_method_data_pointer_offset(O0);
|
||||
add(ImethodDataPtr, in_bytes(methodDataOopDesc::data_offset()), ImethodDataPtr);
|
||||
add(ImethodDataPtr, O0, ImethodDataPtr);
|
||||
bind(zero_continue);
|
||||
}
|
||||
|
||||
@ -1369,7 +1367,6 @@ void InterpreterMacroAssembler::verify_method_data_pointer() {
|
||||
}
|
||||
|
||||
void InterpreterMacroAssembler::test_invocation_counter_for_mdp(Register invocation_count,
|
||||
Register cur_bcp,
|
||||
Register Rtmp,
|
||||
Label &profile_continue) {
|
||||
assert(ProfileInterpreter, "must be profiling interpreter");
|
||||
@ -1400,8 +1397,8 @@ void InterpreterMacroAssembler::test_invocation_counter_for_mdp(Register invocat
|
||||
delayed()->nop();
|
||||
|
||||
// Build it now.
|
||||
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method), cur_bcp);
|
||||
set_method_data_pointer_offset(O0);
|
||||
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
||||
set_method_data_pointer_for_bcp();
|
||||
ba(false, profile_continue);
|
||||
delayed()->nop();
|
||||
bind(done);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -269,12 +269,11 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
|
||||
#ifndef CC_INTERP
|
||||
// Interpreter profiling operations
|
||||
void set_method_data_pointer() { set_method_data_pointer_offset(noreg); }
|
||||
void set_method_data_pointer();
|
||||
void set_method_data_pointer_for_bcp();
|
||||
void set_method_data_pointer_offset(Register mdi_reg);
|
||||
void test_method_data_pointer(Label& zero_continue);
|
||||
void verify_method_data_pointer();
|
||||
void test_invocation_counter_for_mdp(Register invocation_count, Register cur_bcp, Register Rtmp, Label &profile_continue);
|
||||
void test_invocation_counter_for_mdp(Register invocation_count, Register Rtmp, Label &profile_continue);
|
||||
|
||||
void set_mdp_data_at(int constant, Register value);
|
||||
void increment_mdp_data_at(Address counter, Register bumped_count,
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -395,7 +395,7 @@ int MethodHandles::adapter_conversion_ops_supported_mask() {
|
||||
//
|
||||
// Generate an "entry" field for a method handle.
|
||||
// This determines how the method handle will respond to calls.
|
||||
void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHandles::EntryKind ek, TRAPS) {
|
||||
void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHandles::EntryKind ek) {
|
||||
// Here is the register state during an interpreted call,
|
||||
// as set up by generate_method_handle_interpreter_entry():
|
||||
// - G5: garbage temp (was MethodHandle.invoke methodOop, unused)
|
||||
@ -447,8 +447,9 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
// exception. Since we use a C2I adapter to set up the
|
||||
// interpreter state, arguments are expected in compiler
|
||||
// argument registers.
|
||||
methodHandle mh(raise_exception_method());
|
||||
address c2i_entry = methodOopDesc::make_adapters(mh, CATCH);
|
||||
assert(raise_exception_method(), "must be set");
|
||||
address c2i_entry = raise_exception_method()->get_c2i_entry();
|
||||
assert(c2i_entry, "method must be linked");
|
||||
|
||||
__ mov(O5_savedSP, SP); // Cut the stack back to where the caller started.
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1364,15 +1364,8 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
|
||||
// We have decided to profile this method in the interpreter
|
||||
__ bind(profile_method);
|
||||
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method), Lbcp, true);
|
||||
|
||||
#ifdef ASSERT
|
||||
__ tst(O0);
|
||||
__ breakpoint_trap(Assembler::notEqual);
|
||||
#endif
|
||||
|
||||
__ set_method_data_pointer();
|
||||
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
||||
__ set_method_data_pointer_for_bcp();
|
||||
__ ba(false, profile_method_continue);
|
||||
__ delayed()->nop();
|
||||
}
|
||||
|
||||
@ -1689,7 +1689,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
||||
const Register G4_invoke_ctr = G4;
|
||||
__ increment_backedge_counter(G4_invoke_ctr, G1_scratch);
|
||||
if (ProfileInterpreter) {
|
||||
__ test_invocation_counter_for_mdp(G4_invoke_ctr, Lbcp, G3_scratch, Lforward);
|
||||
__ test_invocation_counter_for_mdp(G4_invoke_ctr, G3_scratch, Lforward);
|
||||
if (UseOnStackReplacement) {
|
||||
__ test_backedge_count_for_osr(O2_bumped_count, O0_cur_bcp, G3_scratch);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1641,12 +1641,14 @@ void LIR_Assembler::emit_alloc_obj(LIR_OpAllocObj* op) {
|
||||
}
|
||||
|
||||
void LIR_Assembler::emit_alloc_array(LIR_OpAllocArray* op) {
|
||||
Register len = op->len()->as_register();
|
||||
LP64_ONLY( __ movslq(len, len); )
|
||||
|
||||
if (UseSlowPath ||
|
||||
(!UseFastNewObjectArray && (op->type() == T_OBJECT || op->type() == T_ARRAY)) ||
|
||||
(!UseFastNewTypeArray && (op->type() != T_OBJECT && op->type() != T_ARRAY))) {
|
||||
__ jmp(*op->stub()->entry());
|
||||
} else {
|
||||
Register len = op->len()->as_register();
|
||||
Register tmp1 = op->tmp1()->as_register();
|
||||
Register tmp2 = op->tmp2()->as_register();
|
||||
Register tmp3 = op->tmp3()->as_register();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -819,7 +819,7 @@ void InterpreterMacroAssembler::test_method_data_pointer(Register mdp, Label& ze
|
||||
// Set the method data pointer for the current bcp.
|
||||
void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() {
|
||||
assert(ProfileInterpreter, "must be profiling interpreter");
|
||||
Label zero_continue;
|
||||
Label set_mdp;
|
||||
push(rax);
|
||||
push(rbx);
|
||||
|
||||
@ -827,21 +827,17 @@ void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() {
|
||||
// Test MDO to avoid the call if it is NULL.
|
||||
movptr(rax, Address(rbx, in_bytes(methodOopDesc::method_data_offset())));
|
||||
testptr(rax, rax);
|
||||
jcc(Assembler::zero, zero_continue);
|
||||
|
||||
jcc(Assembler::zero, set_mdp);
|
||||
// rbx,: method
|
||||
// rsi: bcp
|
||||
call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::bcp_to_di), rbx, rsi);
|
||||
// rax,: mdi
|
||||
|
||||
// mdo is guaranteed to be non-zero here, we checked for it before the call.
|
||||
movptr(rbx, Address(rbx, in_bytes(methodOopDesc::method_data_offset())));
|
||||
testptr(rbx, rbx);
|
||||
jcc(Assembler::zero, zero_continue);
|
||||
addptr(rbx, in_bytes(methodDataOopDesc::data_offset()));
|
||||
addptr(rbx, rax);
|
||||
movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rbx);
|
||||
|
||||
bind(zero_continue);
|
||||
addptr(rax, rbx);
|
||||
bind(set_mdp);
|
||||
movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rax);
|
||||
pop(rbx);
|
||||
pop(rax);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -855,7 +855,7 @@ void InterpreterMacroAssembler::test_method_data_pointer(Register mdp,
|
||||
// Set the method data pointer for the current bcp.
|
||||
void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() {
|
||||
assert(ProfileInterpreter, "must be profiling interpreter");
|
||||
Label zero_continue;
|
||||
Label set_mdp;
|
||||
push(rax);
|
||||
push(rbx);
|
||||
|
||||
@ -863,21 +863,17 @@ void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() {
|
||||
// Test MDO to avoid the call if it is NULL.
|
||||
movptr(rax, Address(rbx, in_bytes(methodOopDesc::method_data_offset())));
|
||||
testptr(rax, rax);
|
||||
jcc(Assembler::zero, zero_continue);
|
||||
|
||||
jcc(Assembler::zero, set_mdp);
|
||||
// rbx: method
|
||||
// r13: bcp
|
||||
call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::bcp_to_di), rbx, r13);
|
||||
// rax: mdi
|
||||
|
||||
// mdo is guaranteed to be non-zero here, we checked for it before the call.
|
||||
movptr(rbx, Address(rbx, in_bytes(methodOopDesc::method_data_offset())));
|
||||
testptr(rbx, rbx);
|
||||
jcc(Assembler::zero, zero_continue);
|
||||
addptr(rbx, in_bytes(methodDataOopDesc::data_offset()));
|
||||
addptr(rbx, rax);
|
||||
movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rbx);
|
||||
|
||||
bind(zero_continue);
|
||||
addptr(rax, rbx);
|
||||
bind(set_mdp);
|
||||
movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rax);
|
||||
pop(rbx);
|
||||
pop(rax);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -390,7 +390,7 @@ int MethodHandles::adapter_conversion_ops_supported_mask() {
|
||||
//
|
||||
// Generate an "entry" field for a method handle.
|
||||
// This determines how the method handle will respond to calls.
|
||||
void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHandles::EntryKind ek, TRAPS) {
|
||||
void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHandles::EntryKind ek) {
|
||||
// Here is the register state during an interpreted call,
|
||||
// as set up by generate_method_handle_interpreter_entry():
|
||||
// - rbx: garbage temp (was MethodHandle.invoke methodOop, unused)
|
||||
@ -451,8 +451,9 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
|
||||
// exception. Since we use a C2I adapter to set up the
|
||||
// interpreter state, arguments are expected in compiler
|
||||
// argument registers.
|
||||
methodHandle mh(raise_exception_method());
|
||||
address c2i_entry = methodOopDesc::make_adapters(mh, CHECK);
|
||||
assert(raise_exception_method(), "must be set");
|
||||
address c2i_entry = raise_exception_method()->get_c2i_entry();
|
||||
assert(c2i_entry, "method must be linked");
|
||||
|
||||
const Register rdi_pc = rax;
|
||||
__ pop(rdi_pc); // caller PC
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1367,15 +1367,8 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
|
||||
if (ProfileInterpreter) {
|
||||
// We have decided to profile this method in the interpreter
|
||||
__ bind(profile_method);
|
||||
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method), rsi, true);
|
||||
|
||||
__ movptr(rbx, Address(rbp, method_offset)); // restore methodOop
|
||||
__ movptr(rax, Address(rbx, in_bytes(methodOopDesc::method_data_offset())));
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rax);
|
||||
__ test_method_data_pointer(rax, profile_method_continue);
|
||||
__ addptr(rax, in_bytes(methodDataOopDesc::data_offset()));
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rax);
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
||||
__ set_method_data_pointer_for_bcp();
|
||||
__ jmp(profile_method_continue);
|
||||
}
|
||||
// Handle overflow of counter and compile method
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1383,20 +1383,8 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
|
||||
if (ProfileInterpreter) {
|
||||
// We have decided to profile this method in the interpreter
|
||||
__ bind(profile_method);
|
||||
|
||||
__ call_VM(noreg,
|
||||
CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method),
|
||||
r13, true);
|
||||
|
||||
__ movptr(rbx, Address(rbp, method_offset)); // restore methodOop
|
||||
__ movptr(rax, Address(rbx,
|
||||
in_bytes(methodOopDesc::method_data_offset())));
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
|
||||
rax);
|
||||
__ test_method_data_pointer(rax, profile_method_continue);
|
||||
__ addptr(rax, in_bytes(methodDataOopDesc::data_offset()));
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
|
||||
rax);
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
||||
__ set_method_data_pointer_for_bcp();
|
||||
__ jmp(profile_method_continue);
|
||||
}
|
||||
// Handle overflow of counter and compile method
|
||||
|
||||
@ -1665,16 +1665,9 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
||||
if (ProfileInterpreter) {
|
||||
// Out-of-line code to allocate method data oop.
|
||||
__ bind(profile_method);
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method), rsi);
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
||||
__ load_unsigned_byte(rbx, Address(rsi, 0)); // restore target bytecode
|
||||
__ movptr(rcx, Address(rbp, method_offset));
|
||||
__ movptr(rcx, Address(rcx, in_bytes(methodOopDesc::method_data_offset())));
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rcx);
|
||||
__ test_method_data_pointer(rcx, dispatch);
|
||||
// offset non-null mdp by MDO::data_offset() + IR::profile_method()
|
||||
__ addptr(rcx, in_bytes(methodDataOopDesc::data_offset()));
|
||||
__ addptr(rcx, rax);
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rcx);
|
||||
__ set_method_data_pointer_for_bcp();
|
||||
__ jmp(dispatch);
|
||||
}
|
||||
|
||||
|
||||
@ -1695,21 +1695,9 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
||||
if (ProfileInterpreter) {
|
||||
// Out-of-line code to allocate method data oop.
|
||||
__ bind(profile_method);
|
||||
__ call_VM(noreg,
|
||||
CAST_FROM_FN_PTR(address,
|
||||
InterpreterRuntime::profile_method), r13);
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
||||
__ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode
|
||||
__ movptr(rcx, Address(rbp, method_offset));
|
||||
__ movptr(rcx, Address(rcx,
|
||||
in_bytes(methodOopDesc::method_data_offset())));
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
|
||||
rcx);
|
||||
__ test_method_data_pointer(rcx, dispatch);
|
||||
// offset non-null mdp by MDO::data_offset() + IR::profile_method()
|
||||
__ addptr(rcx, in_bytes(methodDataOopDesc::data_offset()));
|
||||
__ addptr(rcx, rax);
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize),
|
||||
rcx);
|
||||
__ set_method_data_pointer_for_bcp();
|
||||
__ jmp(dispatch);
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -54,6 +54,8 @@ inline void Atomic::dec (volatile jint* dest) { (void)add (-1, dest);
|
||||
inline void Atomic::dec_ptr(volatile intptr_t* dest) { (void)add_ptr(-1, dest); }
|
||||
inline void Atomic::dec_ptr(volatile void* dest) { (void)add_ptr(-1, dest); }
|
||||
|
||||
inline jlong Atomic::load(volatile jlong* src) { return *src; }
|
||||
|
||||
inline jint Atomic::add (jint add_value, volatile jint* dest) {
|
||||
intptr_t rv;
|
||||
__asm__ volatile(
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -100,11 +100,6 @@ inline jint Atomic::cmpxchg (jint exchange_value, volatile jint*
|
||||
return exchange_value;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
// defined in linux_x86.s
|
||||
jlong _Atomic_cmpxchg_long(jlong, volatile jlong*, jlong, bool);
|
||||
}
|
||||
|
||||
#ifdef AMD64
|
||||
inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
|
||||
inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
|
||||
@ -164,9 +159,9 @@ inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void*
|
||||
return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
|
||||
}
|
||||
|
||||
#else
|
||||
//inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
|
||||
//inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
|
||||
inline jlong Atomic::load(volatile jlong* src) { return *src; }
|
||||
|
||||
#else // !AMD64
|
||||
|
||||
inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
|
||||
return (intptr_t)Atomic::add((jint)add_value, (volatile jint*)dest);
|
||||
@ -189,6 +184,12 @@ inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* des
|
||||
return (intptr_t)xchg((jint)exchange_value, (volatile jint*)dest);
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
// defined in linux_x86.s
|
||||
jlong _Atomic_cmpxchg_long(jlong, volatile jlong*, jlong, bool);
|
||||
void _Atomic_move_long(volatile jlong* src, volatile jlong* dst);
|
||||
}
|
||||
|
||||
inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
|
||||
return _Atomic_cmpxchg_long(exchange_value, dest, compare_value, os::is_MP());
|
||||
}
|
||||
@ -200,6 +201,21 @@ inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t*
|
||||
inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) {
|
||||
return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value);
|
||||
}
|
||||
|
||||
inline jlong Atomic::load(volatile jlong* src) {
|
||||
volatile jlong dest;
|
||||
_Atomic_move_long(src, &dest);
|
||||
return dest;
|
||||
}
|
||||
|
||||
inline void Atomic::store(jlong store_value, jlong* dest) {
|
||||
_Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
|
||||
}
|
||||
|
||||
inline void Atomic::store(jlong store_value, volatile jlong* dest) {
|
||||
_Atomic_move_long((volatile jlong*)&store_value, dest);
|
||||
}
|
||||
|
||||
#endif // AMD64
|
||||
|
||||
#endif // OS_CPU_LINUX_X86_VM_ATOMIC_LINUX_X86_INLINE_HPP
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -38,6 +38,7 @@
|
||||
.globl _mmx_Copy_arrayof_conjoint_jshorts
|
||||
|
||||
.globl _Atomic_cmpxchg_long
|
||||
.globl _Atomic_move_long
|
||||
|
||||
.text
|
||||
|
||||
@ -653,3 +654,15 @@ _Atomic_cmpxchg_long:
|
||||
popl %ebx
|
||||
ret
|
||||
|
||||
|
||||
# Support for jlong Atomic::load and Atomic::store.
|
||||
# void _Atomic_move_long(volatile jlong* src, volatile jlong* dst)
|
||||
.p2align 4,,15
|
||||
.type _Atomic_move_long,@function
|
||||
_Atomic_move_long:
|
||||
movl 4(%esp), %eax # src
|
||||
fildll (%eax)
|
||||
movl 8(%esp), %eax # dest
|
||||
fistpll (%eax)
|
||||
ret
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
#ifndef OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP
|
||||
#define OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP
|
||||
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/orderAccess.hpp"
|
||||
#include "vm_version_x86.hpp"
|
||||
|
||||
@ -64,11 +65,11 @@ inline void OrderAccess::fence() {
|
||||
inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; }
|
||||
inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; }
|
||||
inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; }
|
||||
inline jlong OrderAccess::load_acquire(volatile jlong* p) { return *p; }
|
||||
inline jlong OrderAccess::load_acquire(volatile jlong* p) { return Atomic::load(p); }
|
||||
inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; }
|
||||
inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; }
|
||||
inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; }
|
||||
inline julong OrderAccess::load_acquire(volatile julong* p) { return *p; }
|
||||
inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); }
|
||||
inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; }
|
||||
inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; }
|
||||
|
||||
@ -79,11 +80,11 @@ inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *
|
||||
inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jlong* p, jlong v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jlong* p, jlong v) { Atomic::store(v, p); }
|
||||
inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile julong* p, julong v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); }
|
||||
inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; }
|
||||
|
||||
@ -178,7 +179,7 @@ inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v)
|
||||
: "0" (v), "r" (p)
|
||||
: "memory");
|
||||
#else
|
||||
*p = v; fence();
|
||||
release_store(p, v); fence();
|
||||
#endif // AMD64
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -151,14 +151,22 @@ inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void*
|
||||
return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value);
|
||||
}
|
||||
|
||||
extern "C" void _Atomic_load_long(volatile jlong* src, volatile jlong* dst);
|
||||
extern "C" void _Atomic_move_long(volatile jlong* src, volatile jlong* dst);
|
||||
|
||||
inline jlong Atomic::load(volatile jlong* src) {
|
||||
volatile jlong dest;
|
||||
_Atomic_load_long(src, &dest);
|
||||
_Atomic_move_long(src, &dest);
|
||||
return dest;
|
||||
}
|
||||
|
||||
inline void Atomic::store(jlong store_value, jlong* dest) {
|
||||
_Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
|
||||
}
|
||||
|
||||
inline void Atomic::store(jlong store_value, volatile jlong* dest) {
|
||||
_Atomic_move_long((volatile jlong*)&store_value, dest);
|
||||
}
|
||||
|
||||
#endif // AMD64
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
#ifndef OS_CPU_SOLARIS_X86_VM_ORDERACCESS_SOLARIS_X86_INLINE_HPP
|
||||
#define OS_CPU_SOLARIS_X86_VM_ORDERACCESS_SOLARIS_X86_INLINE_HPP
|
||||
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/orderAccess.hpp"
|
||||
#include "vm_version_x86.hpp"
|
||||
|
||||
@ -80,11 +81,11 @@ extern "C" {
|
||||
inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; }
|
||||
inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; }
|
||||
inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; }
|
||||
inline jlong OrderAccess::load_acquire(volatile jlong* p) { return *p; }
|
||||
inline jlong OrderAccess::load_acquire(volatile jlong* p) { return Atomic::load(p); }
|
||||
inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; }
|
||||
inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; }
|
||||
inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; }
|
||||
inline julong OrderAccess::load_acquire(volatile julong* p) { return *p; }
|
||||
inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); }
|
||||
inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; }
|
||||
inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; }
|
||||
|
||||
@ -95,11 +96,11 @@ inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *
|
||||
inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jlong* p, jlong v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jlong* p, jlong v) { Atomic::store(v, p); }
|
||||
inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile julong* p, julong v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); }
|
||||
inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; }
|
||||
|
||||
@ -123,11 +124,11 @@ inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v;
|
||||
inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { release_store(p, v); fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store(p, v); fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); }
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
//
|
||||
// Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
// This code is free software; you can redistribute it and/or modify it
|
||||
@ -104,8 +104,9 @@
|
||||
popl %ebx
|
||||
.end
|
||||
|
||||
// Support for void Atomic::load(volatile jlong* src, volatile jlong* dest).
|
||||
.inline _Atomic_load_long,2
|
||||
// Support for jlong Atomic::load and Atomic::store.
|
||||
// void _Atomic_move_long(volatile jlong* src, volatile jlong* dst)
|
||||
.inline _Atomic_move_long,2
|
||||
movl 0(%esp), %eax // src
|
||||
fildll (%eax)
|
||||
movl 4(%esp), %eax // dest
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -137,10 +137,10 @@ inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void*
|
||||
return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
|
||||
}
|
||||
|
||||
inline jlong Atomic::load(volatile jlong* src) { return *src; }
|
||||
|
||||
#else // !AMD64
|
||||
|
||||
//inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
|
||||
//inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
|
||||
inline jint Atomic::add (jint add_value, volatile jint* dest) {
|
||||
int mp = os::is_MP();
|
||||
__asm {
|
||||
@ -254,6 +254,33 @@ inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t*
|
||||
inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) {
|
||||
return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value);
|
||||
}
|
||||
|
||||
inline jlong Atomic::load(volatile jlong* src) {
|
||||
volatile jlong dest;
|
||||
volatile jlong* pdest = &dest;
|
||||
__asm {
|
||||
mov eax, src
|
||||
fild qword ptr [eax]
|
||||
mov eax, pdest
|
||||
fistp qword ptr [eax]
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
inline void Atomic::store(jlong store_value, volatile jlong* dest) {
|
||||
volatile jlong* src = &store_value;
|
||||
__asm {
|
||||
mov eax, src
|
||||
fild qword ptr [eax]
|
||||
mov eax, dest
|
||||
fistp qword ptr [eax]
|
||||
}
|
||||
}
|
||||
|
||||
inline void Atomic::store(jlong store_value, jlong* dest) {
|
||||
Atomic::store(store_value, (volatile jlong*)dest);
|
||||
}
|
||||
|
||||
#endif // AMD64
|
||||
|
||||
#pragma warning(default: 4035) // Enables warnings reporting missing return statement
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
#ifndef OS_CPU_WINDOWS_X86_VM_ORDERACCESS_WINDOWS_X86_INLINE_HPP
|
||||
#define OS_CPU_WINDOWS_X86_VM_ORDERACCESS_WINDOWS_X86_INLINE_HPP
|
||||
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/orderAccess.hpp"
|
||||
#include "vm_version_x86.hpp"
|
||||
|
||||
@ -65,11 +66,11 @@ inline void OrderAccess::fence() {
|
||||
inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; }
|
||||
inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; }
|
||||
inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; }
|
||||
inline jlong OrderAccess::load_acquire(volatile jlong* p) { return *p; }
|
||||
inline jlong OrderAccess::load_acquire(volatile jlong* p) { return Atomic::load(p); }
|
||||
inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; }
|
||||
inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; }
|
||||
inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; }
|
||||
inline julong OrderAccess::load_acquire(volatile julong* p) { return *p; }
|
||||
inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); }
|
||||
inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; }
|
||||
inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; }
|
||||
|
||||
@ -80,11 +81,11 @@ inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *
|
||||
inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jlong* p, jlong v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jlong* p, jlong v) { Atomic::store(v, p); }
|
||||
inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile julong* p, julong v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); }
|
||||
inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; }
|
||||
inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; }
|
||||
|
||||
@ -188,7 +189,7 @@ inline void OrderAccess::release_store_fence(volatile jint* p, jint v) {
|
||||
#endif // AMD64
|
||||
}
|
||||
|
||||
inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { *p = v; fence(); }
|
||||
inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { release_store(p, v); fence(); }
|
||||
|
||||
inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { release_store_fence((volatile jbyte*)p, (jbyte)v); }
|
||||
inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { release_store_fence((volatile jshort*)p, (jshort)v); }
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -38,11 +38,12 @@
|
||||
// Return an adapter for this MethodHandle.
|
||||
ciMethod* ciMethodHandle::get_adapter(bool is_invokedynamic) const {
|
||||
VM_ENTRY_MARK;
|
||||
|
||||
Handle h(get_oop());
|
||||
methodHandle callee(_callee->get_methodOop());
|
||||
MethodHandleCompiler mhc(h, callee, is_invokedynamic, THREAD);
|
||||
methodHandle m = mhc.compile(CHECK_NULL);
|
||||
// We catch all exceptions here that could happen in the method
|
||||
// handle compiler and stop the VM.
|
||||
MethodHandleCompiler mhc(h, callee, is_invokedynamic, CATCH);
|
||||
methodHandle m = mhc.compile(CATCH);
|
||||
return CURRENT_ENV->get_object(m())->as_method();
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -884,7 +884,7 @@ IRT_LEAF(jint, InterpreterRuntime::bcp_to_di(methodOopDesc* method, address cur_
|
||||
return mdo->bci_to_di(bci);
|
||||
IRT_END
|
||||
|
||||
IRT_ENTRY(jint, InterpreterRuntime::profile_method(JavaThread* thread, address cur_bcp))
|
||||
IRT_ENTRY(void, InterpreterRuntime::profile_method(JavaThread* thread))
|
||||
// use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
|
||||
// flag, in case this method triggers classloading which will call into Java.
|
||||
UnlockFlagSaver fs(thread);
|
||||
@ -893,16 +893,12 @@ IRT_ENTRY(jint, InterpreterRuntime::profile_method(JavaThread* thread, address c
|
||||
frame fr = thread->last_frame();
|
||||
assert(fr.is_interpreted_frame(), "must come from interpreter");
|
||||
methodHandle method(thread, fr.interpreter_frame_method());
|
||||
int bci = method->bci_from(cur_bcp);
|
||||
methodOopDesc::build_interpreter_method_data(method, THREAD);
|
||||
if (HAS_PENDING_EXCEPTION) {
|
||||
assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
|
||||
CLEAR_PENDING_EXCEPTION;
|
||||
// and fall through...
|
||||
}
|
||||
methodDataOop mdo = method->method_data();
|
||||
if (mdo == NULL) return 0;
|
||||
return mdo->bci_to_di(bci);
|
||||
IRT_END
|
||||
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -164,7 +164,7 @@ class InterpreterRuntime: AllStatic {
|
||||
|
||||
// Interpreter profiling support
|
||||
static jint bcp_to_di(methodOopDesc* method, address cur_bcp);
|
||||
static jint profile_method(JavaThread* thread, address cur_bcp);
|
||||
static void profile_method(JavaThread* thread);
|
||||
static void update_mdp_for_ret(JavaThread* thread, int bci);
|
||||
#ifdef ASSERT
|
||||
static void verify_mdp(methodOopDesc* method, address bcp, address mdp);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -36,8 +36,8 @@ class arrayKlass: public Klass {
|
||||
friend class VMStructs;
|
||||
private:
|
||||
int _dimension; // This is n'th-dimensional array.
|
||||
klassOop _higher_dimension; // Refers the (n+1)'th-dimensional array (if present).
|
||||
klassOop _lower_dimension; // Refers the (n-1)'th-dimensional array (if present).
|
||||
volatile klassOop _higher_dimension; // Refers the (n+1)'th-dimensional array (if present).
|
||||
volatile klassOop _lower_dimension; // Refers the (n-1)'th-dimensional array (if present).
|
||||
int _vtable_len; // size of vtable for this klass
|
||||
juint _alloc_size; // allocation profiling support
|
||||
oop _component_mirror; // component type, as a java/lang/Class
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -235,8 +235,9 @@ klassOop objArrayKlass::array_klass_impl(objArrayKlassHandle this_oop, bool or_n
|
||||
objArrayKlassKlass::cast(Universe::objArrayKlassKlassObj())->
|
||||
allocate_objArray_klass(dimension + 1, this_oop, CHECK_NULL);
|
||||
ak = objArrayKlassHandle(THREAD, new_klass);
|
||||
this_oop->set_higher_dimension(ak());
|
||||
ak->set_lower_dimension(this_oop());
|
||||
OrderAccess::storestore();
|
||||
this_oop->set_higher_dimension(ak());
|
||||
assert(ak->oop_is_objArray(), "incorrect initialization of objArrayKlass");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -179,6 +179,7 @@ klassOop typeArrayKlass::array_klass_impl(typeArrayKlassHandle h_this, bool or_n
|
||||
dimension + 1, h_this, CHECK_NULL);
|
||||
h_ak = objArrayKlassHandle(THREAD, oak);
|
||||
h_ak->set_lower_dimension(h_this());
|
||||
OrderAccess::storestore();
|
||||
h_this->set_higher_dimension(h_ak());
|
||||
assert(h_ak->oop_is_objArray(), "incorrect initialization of objArrayKlass");
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2187,8 +2187,11 @@ const TypePtr *TypeRawPtr::add_offset( intptr_t offset ) const {
|
||||
case TypePtr::NotNull:
|
||||
return this;
|
||||
case TypePtr::Null:
|
||||
case TypePtr::Constant:
|
||||
return make( _bits+offset );
|
||||
case TypePtr::Constant: {
|
||||
address bits = _bits+offset;
|
||||
if ( bits == 0 ) return TypePtr::NULL_PTR;
|
||||
return make( bits );
|
||||
}
|
||||
default: ShouldNotReachHere();
|
||||
}
|
||||
return NULL; // Lint noise
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -137,7 +137,6 @@ BasicType MethodHandleChain::compute_bound_arg_type(oop target, methodOop m, int
|
||||
|
||||
|
||||
void MethodHandleChain::lose(const char* msg, TRAPS) {
|
||||
assert(false, "lose");
|
||||
_lose_message = msg;
|
||||
if (!THREAD->is_Java_thread() || ((JavaThread*)THREAD)->thread_state() != _thread_in_vm) {
|
||||
// throw a preallocated exception
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -111,7 +111,7 @@ bool MethodHandles::spot_check_entry_names() {
|
||||
//------------------------------------------------------------------------------
|
||||
// MethodHandles::generate_adapters
|
||||
//
|
||||
void MethodHandles::generate_adapters(TRAPS) {
|
||||
void MethodHandles::generate_adapters() {
|
||||
if (!EnableMethodHandles || SystemDictionary::MethodHandle_klass() == NULL) return;
|
||||
|
||||
assert(_adapter_code == NULL, "generate only once");
|
||||
@ -123,20 +123,20 @@ void MethodHandles::generate_adapters(TRAPS) {
|
||||
vm_exit_out_of_memory(_adapter_code_size, "CodeCache: no room for MethodHandles adapters");
|
||||
CodeBuffer code(_adapter_code);
|
||||
MethodHandlesAdapterGenerator g(&code);
|
||||
g.generate(CHECK);
|
||||
g.generate();
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// MethodHandlesAdapterGenerator::generate
|
||||
//
|
||||
void MethodHandlesAdapterGenerator::generate(TRAPS) {
|
||||
void MethodHandlesAdapterGenerator::generate() {
|
||||
// Generate generic method handle adapters.
|
||||
for (MethodHandles::EntryKind ek = MethodHandles::_EK_FIRST;
|
||||
ek < MethodHandles::_EK_LIMIT;
|
||||
ek = MethodHandles::EntryKind(1 + (int)ek)) {
|
||||
StubCodeMark mark(this, "MethodHandle", MethodHandles::entry_name(ek));
|
||||
MethodHandles::generate_method_handle_stub(_masm, ek, CHECK);
|
||||
MethodHandles::generate_method_handle_stub(_masm, ek);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2621,10 +2621,20 @@ JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class))
|
||||
warning("JSR 292 method handle code is mismatched to this JVM. Disabling support.");
|
||||
enable_MH = false;
|
||||
}
|
||||
} else {
|
||||
enable_MH = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (enable_MH) {
|
||||
// We need to link the MethodHandleImpl klass before we generate
|
||||
// the method handle adapters as the _raise_exception adapter uses
|
||||
// one of its methods (and its c2i-adapter).
|
||||
KlassHandle k = SystemDictionaryHandles::MethodHandleImpl_klass();
|
||||
instanceKlass* ik = instanceKlass::cast(k());
|
||||
ik->link_class(CHECK);
|
||||
|
||||
MethodHandles::generate_adapters();
|
||||
MethodHandles::set_enabled(true);
|
||||
}
|
||||
|
||||
@ -2645,10 +2655,5 @@ JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class))
|
||||
MethodHandles::set_enabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Generate method handles adapters if enabled.
|
||||
if (MethodHandles::enabled()) {
|
||||
MethodHandles::generate_adapters(CHECK);
|
||||
}
|
||||
}
|
||||
JVM_END
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -294,11 +294,11 @@ class MethodHandles: AllStatic {
|
||||
enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 };
|
||||
|
||||
// Generate MethodHandles adapters.
|
||||
static void generate_adapters(TRAPS);
|
||||
static void generate_adapters();
|
||||
|
||||
// Called from InterpreterGenerator and MethodHandlesAdapterGenerator.
|
||||
static address generate_method_handle_interpreter_entry(MacroAssembler* _masm);
|
||||
static void generate_method_handle_stub(MacroAssembler* _masm, EntryKind ek, TRAPS);
|
||||
static void generate_method_handle_stub(MacroAssembler* _masm, EntryKind ek);
|
||||
|
||||
// argument list parsing
|
||||
static int argument_slot(oop method_type, int arg);
|
||||
@ -530,7 +530,7 @@ class MethodHandlesAdapterGenerator : public StubCodeGenerator {
|
||||
public:
|
||||
MethodHandlesAdapterGenerator(CodeBuffer* code) : StubCodeGenerator(code) {}
|
||||
|
||||
void generate(TRAPS);
|
||||
void generate();
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_PRIMS_METHODHANDLES_HPP
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -154,12 +154,11 @@ jint Unsafe_invocation_key_to_method_slot(jint key) {
|
||||
|
||||
#define GET_FIELD_VOLATILE(obj, offset, type_name, v) \
|
||||
oop p = JNIHandles::resolve(obj); \
|
||||
volatile type_name v = *(volatile type_name*)index_oop_from_field_offset_long(p, offset)
|
||||
volatile type_name v = OrderAccess::load_acquire((volatile type_name*)index_oop_from_field_offset_long(p, offset));
|
||||
|
||||
#define SET_FIELD_VOLATILE(obj, offset, type_name, x) \
|
||||
oop p = JNIHandles::resolve(obj); \
|
||||
*(volatile type_name*)index_oop_from_field_offset_long(p, offset) = x; \
|
||||
OrderAccess::fence();
|
||||
OrderAccess::release_store_fence((volatile type_name*)index_oop_from_field_offset_long(p, offset), x);
|
||||
|
||||
// Macros for oops that check UseCompressedOops
|
||||
|
||||
@ -181,7 +180,8 @@ jint Unsafe_invocation_key_to_method_slot(jint key) {
|
||||
v = oopDesc::decode_heap_oop(n); \
|
||||
} else { \
|
||||
v = *(volatile oop*)index_oop_from_field_offset_long(p, offset); \
|
||||
}
|
||||
} \
|
||||
OrderAccess::acquire();
|
||||
|
||||
|
||||
// Get/SetObject must be special-cased, since it works with handles.
|
||||
@ -248,14 +248,22 @@ UNSAFE_ENTRY(void, Unsafe_SetObjectVolatile(JNIEnv *env, jobject unsafe, jobject
|
||||
UnsafeWrapper("Unsafe_SetObjectVolatile");
|
||||
oop x = JNIHandles::resolve(x_h);
|
||||
oop p = JNIHandles::resolve(obj);
|
||||
void* addr = index_oop_from_field_offset_long(p, offset);
|
||||
OrderAccess::release();
|
||||
if (UseCompressedOops) {
|
||||
oop_store((narrowOop*)index_oop_from_field_offset_long(p, offset), x);
|
||||
oop_store((narrowOop*)addr, x);
|
||||
} else {
|
||||
oop_store((oop*)index_oop_from_field_offset_long(p, offset), x);
|
||||
oop_store((oop*)addr, x);
|
||||
}
|
||||
OrderAccess::fence();
|
||||
UNSAFE_END
|
||||
|
||||
#if defined(SPARC) || defined(X86)
|
||||
// Sparc and X86 have atomic jlong (8 bytes) instructions
|
||||
|
||||
#else
|
||||
// Keep old code for platforms which may not have atomic jlong (8 bytes) instructions
|
||||
|
||||
// Volatile long versions must use locks if !VM_Version::supports_cx8().
|
||||
// support_cx8 is a surrogate for 'supports atomic long memory ops'.
|
||||
|
||||
@ -291,6 +299,7 @@ UNSAFE_ENTRY(void, Unsafe_SetLongVolatile(JNIEnv *env, jobject unsafe, jobject o
|
||||
}
|
||||
UNSAFE_END
|
||||
|
||||
#endif // not SPARC and not X86
|
||||
|
||||
#define DEFINE_GETSETOOP(jboolean, Boolean) \
|
||||
\
|
||||
@ -320,6 +329,16 @@ UNSAFE_END \
|
||||
\
|
||||
// END DEFINE_GETSETOOP.
|
||||
|
||||
DEFINE_GETSETOOP(jboolean, Boolean)
|
||||
DEFINE_GETSETOOP(jbyte, Byte)
|
||||
DEFINE_GETSETOOP(jshort, Short);
|
||||
DEFINE_GETSETOOP(jchar, Char);
|
||||
DEFINE_GETSETOOP(jint, Int);
|
||||
DEFINE_GETSETOOP(jlong, Long);
|
||||
DEFINE_GETSETOOP(jfloat, Float);
|
||||
DEFINE_GETSETOOP(jdouble, Double);
|
||||
|
||||
#undef DEFINE_GETSETOOP
|
||||
|
||||
#define DEFINE_GETSETOOP_VOLATILE(jboolean, Boolean) \
|
||||
\
|
||||
@ -336,47 +355,49 @@ UNSAFE_END \
|
||||
\
|
||||
// END DEFINE_GETSETOOP_VOLATILE.
|
||||
|
||||
DEFINE_GETSETOOP(jboolean, Boolean)
|
||||
DEFINE_GETSETOOP(jbyte, Byte)
|
||||
DEFINE_GETSETOOP(jshort, Short);
|
||||
DEFINE_GETSETOOP(jchar, Char);
|
||||
DEFINE_GETSETOOP(jint, Int);
|
||||
DEFINE_GETSETOOP(jlong, Long);
|
||||
DEFINE_GETSETOOP(jfloat, Float);
|
||||
DEFINE_GETSETOOP(jdouble, Double);
|
||||
|
||||
DEFINE_GETSETOOP_VOLATILE(jboolean, Boolean)
|
||||
DEFINE_GETSETOOP_VOLATILE(jbyte, Byte)
|
||||
DEFINE_GETSETOOP_VOLATILE(jshort, Short);
|
||||
DEFINE_GETSETOOP_VOLATILE(jchar, Char);
|
||||
DEFINE_GETSETOOP_VOLATILE(jint, Int);
|
||||
// no long -- handled specially
|
||||
DEFINE_GETSETOOP_VOLATILE(jfloat, Float);
|
||||
DEFINE_GETSETOOP_VOLATILE(jdouble, Double);
|
||||
|
||||
#undef DEFINE_GETSETOOP
|
||||
#if defined(SPARC) || defined(X86)
|
||||
// Sparc and X86 have atomic jlong (8 bytes) instructions
|
||||
DEFINE_GETSETOOP_VOLATILE(jlong, Long);
|
||||
#endif
|
||||
|
||||
#undef DEFINE_GETSETOOP_VOLATILE
|
||||
|
||||
// The non-intrinsified versions of setOrdered just use setVolatile
|
||||
|
||||
UNSAFE_ENTRY(void, Unsafe_SetOrderedInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint x)) \
|
||||
UnsafeWrapper("Unsafe_SetOrderedInt"); \
|
||||
SET_FIELD_VOLATILE(obj, offset, jint, x); \
|
||||
UNSAFE_ENTRY(void, Unsafe_SetOrderedInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint x))
|
||||
UnsafeWrapper("Unsafe_SetOrderedInt");
|
||||
SET_FIELD_VOLATILE(obj, offset, jint, x);
|
||||
UNSAFE_END
|
||||
|
||||
UNSAFE_ENTRY(void, Unsafe_SetOrderedObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
|
||||
UnsafeWrapper("Unsafe_SetOrderedObject");
|
||||
oop x = JNIHandles::resolve(x_h);
|
||||
oop p = JNIHandles::resolve(obj);
|
||||
void* addr = index_oop_from_field_offset_long(p, offset);
|
||||
OrderAccess::release();
|
||||
if (UseCompressedOops) {
|
||||
oop_store((narrowOop*)index_oop_from_field_offset_long(p, offset), x);
|
||||
oop_store((narrowOop*)addr, x);
|
||||
} else {
|
||||
oop_store((oop*)index_oop_from_field_offset_long(p, offset), x);
|
||||
oop_store((oop*)addr, x);
|
||||
}
|
||||
OrderAccess::fence();
|
||||
UNSAFE_END
|
||||
|
||||
UNSAFE_ENTRY(void, Unsafe_SetOrderedLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong x))
|
||||
UnsafeWrapper("Unsafe_SetOrderedLong");
|
||||
#if defined(SPARC) || defined(X86)
|
||||
// Sparc and X86 have atomic jlong (8 bytes) instructions
|
||||
SET_FIELD_VOLATILE(obj, offset, jlong, x);
|
||||
#else
|
||||
// Keep old code for platforms which may not have atomic long (8 bytes) instructions
|
||||
{
|
||||
if (VM_Version::supports_cx8()) {
|
||||
SET_FIELD_VOLATILE(obj, offset, jlong, x);
|
||||
@ -388,6 +409,7 @@ UNSAFE_ENTRY(void, Unsafe_SetOrderedLong(JNIEnv *env, jobject unsafe, jobject ob
|
||||
*addr = x;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
UNSAFE_END
|
||||
|
||||
////// Data in the C heap.
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -219,8 +219,8 @@ static inline uint64_t cast_uint64_t(size_t x)
|
||||
volatile_nonstatic_field(oopDesc, _metadata._compressed_klass, narrowOop) \
|
||||
static_field(oopDesc, _bs, BarrierSet*) \
|
||||
nonstatic_field(arrayKlass, _dimension, int) \
|
||||
nonstatic_field(arrayKlass, _higher_dimension, klassOop) \
|
||||
nonstatic_field(arrayKlass, _lower_dimension, klassOop) \
|
||||
volatile_nonstatic_field(arrayKlass, _higher_dimension, klassOop) \
|
||||
volatile_nonstatic_field(arrayKlass, _lower_dimension, klassOop) \
|
||||
nonstatic_field(arrayKlass, _vtable_len, int) \
|
||||
nonstatic_field(arrayKlass, _alloc_size, juint) \
|
||||
nonstatic_field(arrayKlass, _component_mirror, oop) \
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user