提交 47ba278e 编写于 作者: T twisti

Merge

/* /*
* Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2007, 2008, 2009 Red Hat, Inc. * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -40,7 +40,7 @@ define_pd_global(intx, PreInflateSpin, 10); ...@@ -40,7 +40,7 @@ define_pd_global(intx, PreInflateSpin, 10);
define_pd_global(intx, StackYellowPages, 2); define_pd_global(intx, StackYellowPages, 2);
define_pd_global(intx, StackRedPages, 1); define_pd_global(intx, StackRedPages, 1);
define_pd_global(intx, StackShadowPages, 3 LP64_ONLY(+3) DEBUG_ONLY(+3)); define_pd_global(intx, StackShadowPages, 5 LP64_ONLY(+1) DEBUG_ONLY(+3));
define_pd_global(bool, RewriteBytecodes, true); define_pd_global(bool, RewriteBytecodes, true);
define_pd_global(bool, RewriteFrequentPairs, true); define_pd_global(bool, RewriteFrequentPairs, true);
/* /*
* Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2007, 2008 Red Hat, Inc. * Copyright 2007, 2008, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -39,7 +39,13 @@ ...@@ -39,7 +39,13 @@
"stfd %0, 0(%2)\n" "stfd %0, 0(%2)\n"
: "=f"(tmp) : "=f"(tmp)
: "b"(src), "b"(dst)); : "b"(src), "b"(dst));
#elif defined(S390) && !defined(_LP64)
double tmp;
asm volatile ("ld %0, 0(%1)\n"
"std %0, 0(%2)\n"
: "=r"(tmp)
: "a"(src), "a"(dst));
#else #else
*(jlong *) dst = *(jlong *) src; *(jlong *) dst = *(jlong *) src;
#endif // PPC && !_LP64 #endif
} }
/* /*
* Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -136,8 +136,10 @@ JVMState* DirectCallGenerator::generate(JVMState* jvms) { ...@@ -136,8 +136,10 @@ JVMState* DirectCallGenerator::generate(JVMState* jvms) {
} }
// Mark the call node as virtual, sort of: // Mark the call node as virtual, sort of:
call->set_optimized_virtual(true); call->set_optimized_virtual(true);
if (method()->is_method_handle_invoke()) if (method()->is_method_handle_invoke()) {
call->set_method_handle_invoke(true); call->set_method_handle_invoke(true);
kit.C->set_has_method_handle_invokes(true);
}
} }
kit.set_arguments_for_java_call(call); kit.set_arguments_for_java_call(call);
kit.set_edges_for_java_call(call, false, _separate_io_proj); kit.set_edges_for_java_call(call, false, _separate_io_proj);
...@@ -194,6 +196,7 @@ JVMState* DynamicCallGenerator::generate(JVMState* jvms) { ...@@ -194,6 +196,7 @@ JVMState* DynamicCallGenerator::generate(JVMState* jvms) {
call->set_optimized_virtual(true); call->set_optimized_virtual(true);
// Take extra care (in the presence of argument motion) not to trash the SP: // Take extra care (in the presence of argument motion) not to trash the SP:
call->set_method_handle_invoke(true); call->set_method_handle_invoke(true);
kit.C->set_has_method_handle_invokes(true);
// Pass the target MethodHandle as first argument and shift the // Pass the target MethodHandle as first argument and shift the
// other arguments. // other arguments.
......
/* /*
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -465,6 +465,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr ...@@ -465,6 +465,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
_code_buffer("Compile::Fill_buffer"), _code_buffer("Compile::Fill_buffer"),
_orig_pc_slot(0), _orig_pc_slot(0),
_orig_pc_slot_offset_in_bytes(0), _orig_pc_slot_offset_in_bytes(0),
_has_method_handle_invokes(false),
_node_bundling_limit(0), _node_bundling_limit(0),
_node_bundling_base(NULL), _node_bundling_base(NULL),
_java_calls(0), _java_calls(0),
...@@ -759,6 +760,7 @@ Compile::Compile( ciEnv* ci_env, ...@@ -759,6 +760,7 @@ Compile::Compile( ciEnv* ci_env,
_do_escape_analysis(false), _do_escape_analysis(false),
_failure_reason(NULL), _failure_reason(NULL),
_code_buffer("Compile::Fill_buffer"), _code_buffer("Compile::Fill_buffer"),
_has_method_handle_invokes(false),
_node_bundling_limit(0), _node_bundling_limit(0),
_node_bundling_base(NULL), _node_bundling_base(NULL),
_java_calls(0), _java_calls(0),
......
/* /*
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -166,6 +166,9 @@ class Compile : public Phase { ...@@ -166,6 +166,9 @@ class Compile : public Phase {
bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing
#endif #endif
// JSR 292
bool _has_method_handle_invokes; // True if this method has MethodHandle invokes.
// Compilation environment. // Compilation environment.
Arena _comp_arena; // Arena with lifetime equivalent to Compile Arena _comp_arena; // Arena with lifetime equivalent to Compile
ciEnv* _env; // CI interface ciEnv* _env; // CI interface
...@@ -336,6 +339,10 @@ class Compile : public Phase { ...@@ -336,6 +339,10 @@ class Compile : public Phase {
void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; } void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; }
#endif #endif
// JSR 292
bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
void begin_method() { void begin_method() {
#ifndef PRODUCT #ifndef PRODUCT
if (_printer) _printer->begin_method(this); if (_printer) _printer->begin_method(this);
......
...@@ -805,8 +805,12 @@ void Compile::Process_OopMap_Node(MachNode *mach, int current_offset) { ...@@ -805,8 +805,12 @@ void Compile::Process_OopMap_Node(MachNode *mach, int current_offset) {
mcall = mach->as_MachCall(); mcall = mach->as_MachCall();
// Is the call a MethodHandle call? // Is the call a MethodHandle call?
if (mcall->is_MachCallJava()) if (mcall->is_MachCallJava()) {
is_method_handle_invoke = mcall->as_MachCallJava()->_method_handle_invoke; if (mcall->as_MachCallJava()->_method_handle_invoke) {
assert(has_method_handle_invokes(), "must have been set during call generation");
is_method_handle_invoke = true;
}
}
// Check if a call returns an object. // Check if a call returns an object.
if (mcall->return_value_is_used() && if (mcall->return_value_is_used() &&
...@@ -1092,9 +1096,21 @@ void Compile::Fill_buffer() { ...@@ -1092,9 +1096,21 @@ void Compile::Fill_buffer() {
deopt_handler_req += MAX_stubs_size; // add marginal slop for handler deopt_handler_req += MAX_stubs_size; // add marginal slop for handler
stub_req += MAX_stubs_size; // ensure per-stub margin stub_req += MAX_stubs_size; // ensure per-stub margin
code_req += MAX_inst_size; // ensure per-instruction margin code_req += MAX_inst_size; // ensure per-instruction margin
if (StressCodeBuffers) if (StressCodeBuffers)
code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion
int total_req = code_req + pad_req + stub_req + exception_handler_req + deopt_handler_req + const_req;
int total_req =
code_req +
pad_req +
stub_req +
exception_handler_req +
deopt_handler_req + // deopt handler
const_req;
if (has_method_handle_invokes())
total_req += deopt_handler_req; // deopt MH handler
CodeBuffer* cb = code_buffer(); CodeBuffer* cb = code_buffer();
cb->initialize(total_req, locs_req); cb->initialize(total_req, locs_req);
...@@ -1436,10 +1452,13 @@ void Compile::Fill_buffer() { ...@@ -1436,10 +1452,13 @@ void Compile::Fill_buffer() {
_code_offsets.set_value(CodeOffsets::Exceptions, emit_exception_handler(*cb)); _code_offsets.set_value(CodeOffsets::Exceptions, emit_exception_handler(*cb));
// Emit the deopt handler code. // Emit the deopt handler code.
_code_offsets.set_value(CodeOffsets::Deopt, emit_deopt_handler(*cb)); _code_offsets.set_value(CodeOffsets::Deopt, emit_deopt_handler(*cb));
// Emit the MethodHandle deopt handler code. We can use the same
// code as for the normal deopt handler, we just need a different // Emit the MethodHandle deopt handler code (if required).
// entry point address. if (has_method_handle_invokes()) {
_code_offsets.set_value(CodeOffsets::DeoptMH, emit_deopt_handler(*cb)); // We can use the same code as for the normal deopt handler, we
// just need a different entry point address.
_code_offsets.set_value(CodeOffsets::DeoptMH, emit_deopt_handler(*cb));
}
} }
// One last check for failed CodeBuffer::expand: // One last check for failed CodeBuffer::expand:
......
...@@ -824,7 +824,6 @@ bool Parse::can_rerun_bytecode() { ...@@ -824,7 +824,6 @@ bool Parse::can_rerun_bytecode() {
case Bytecodes::_ddiv: case Bytecodes::_ddiv:
case Bytecodes::_checkcast: case Bytecodes::_checkcast:
case Bytecodes::_instanceof: case Bytecodes::_instanceof:
case Bytecodes::_athrow:
case Bytecodes::_anewarray: case Bytecodes::_anewarray:
case Bytecodes::_newarray: case Bytecodes::_newarray:
case Bytecodes::_multianewarray: case Bytecodes::_multianewarray:
...@@ -834,6 +833,8 @@ bool Parse::can_rerun_bytecode() { ...@@ -834,6 +833,8 @@ bool Parse::can_rerun_bytecode() {
return true; return true;
break; break;
// Don't rerun athrow since it's part of the exception path.
case Bytecodes::_athrow:
case Bytecodes::_invokestatic: case Bytecodes::_invokestatic:
case Bytecodes::_invokedynamic: case Bytecodes::_invokedynamic:
case Bytecodes::_invokespecial: case Bytecodes::_invokespecial:
......
...@@ -1947,7 +1947,7 @@ class AdapterHandlerTable : public BasicHashtable { ...@@ -1947,7 +1947,7 @@ class AdapterHandlerTable : public BasicHashtable {
private: private:
#ifdef ASSERT #ifndef PRODUCT
static int _lookups; // number of calls to lookup static int _lookups; // number of calls to lookup
static int _buckets; // number of buckets checked static int _buckets; // number of buckets checked
static int _equals; // number of buckets checked with matching hash static int _equals; // number of buckets checked with matching hash
...@@ -1983,16 +1983,16 @@ class AdapterHandlerTable : public BasicHashtable { ...@@ -1983,16 +1983,16 @@ class AdapterHandlerTable : public BasicHashtable {
// Find a entry with the same fingerprint if it exists // Find a entry with the same fingerprint if it exists
AdapterHandlerEntry* lookup(int total_args_passed, BasicType* sig_bt) { AdapterHandlerEntry* lookup(int total_args_passed, BasicType* sig_bt) {
debug_only(_lookups++); NOT_PRODUCT(_lookups++);
AdapterFingerPrint fp(total_args_passed, sig_bt); AdapterFingerPrint fp(total_args_passed, sig_bt);
unsigned int hash = fp.compute_hash(); unsigned int hash = fp.compute_hash();
int index = hash_to_index(hash); int index = hash_to_index(hash);
for (AdapterHandlerEntry* e = bucket(index); e != NULL; e = e->next()) { for (AdapterHandlerEntry* e = bucket(index); e != NULL; e = e->next()) {
debug_only(_buckets++); NOT_PRODUCT(_buckets++);
if (e->hash() == hash) { if (e->hash() == hash) {
debug_only(_equals++); NOT_PRODUCT(_equals++);
if (fp.equals(e->fingerprint())) { if (fp.equals(e->fingerprint())) {
#ifdef ASSERT #ifndef PRODUCT
if (fp.is_compact()) _compact++; if (fp.is_compact()) _compact++;
_hits++; _hits++;
#endif #endif
...@@ -2003,6 +2003,7 @@ class AdapterHandlerTable : public BasicHashtable { ...@@ -2003,6 +2003,7 @@ class AdapterHandlerTable : public BasicHashtable {
return NULL; return NULL;
} }
#ifndef PRODUCT
void print_statistics() { void print_statistics() {
ResourceMark rm; ResourceMark rm;
int longest = 0; int longest = 0;
...@@ -2021,15 +2022,14 @@ class AdapterHandlerTable : public BasicHashtable { ...@@ -2021,15 +2022,14 @@ class AdapterHandlerTable : public BasicHashtable {
} }
tty->print_cr("AdapterHandlerTable: empty %d longest %d total %d average %f", tty->print_cr("AdapterHandlerTable: empty %d longest %d total %d average %f",
empty, longest, total, total / (double)nonempty); empty, longest, total, total / (double)nonempty);
#ifdef ASSERT
tty->print_cr("AdapterHandlerTable: lookups %d buckets %d equals %d hits %d compact %d", tty->print_cr("AdapterHandlerTable: lookups %d buckets %d equals %d hits %d compact %d",
_lookups, _buckets, _equals, _hits, _compact); _lookups, _buckets, _equals, _hits, _compact);
#endif
} }
#endif
}; };
#ifdef ASSERT #ifndef PRODUCT
int AdapterHandlerTable::_lookups; int AdapterHandlerTable::_lookups;
int AdapterHandlerTable::_buckets; int AdapterHandlerTable::_buckets;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册