aboutsummaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
authoramurillo <none@none>2013-11-01 08:26:54 -0700
committeramurillo <none@none>2013-11-01 08:26:54 -0700
commit275be0d8f1c7556f4fa608e0e039baa6a00e1db3 (patch)
tree3050a23093402c125d5e6ffcdc7227a72a33e292 /src/cpu
parentd3e86f60571bc6e9dc0b09b96003d56970d68fb1 (diff)
parent21c86c80ce5e2b00f63338dadf8a78a5ce625c4d (diff)
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/sparc/vm/cppInterpreter_sparc.cpp2
-rw-r--r--src/cpu/sparc/vm/macroAssembler_sparc.cpp92
-rw-r--r--src/cpu/sparc/vm/sparc.ad14
-rw-r--r--src/cpu/sparc/vm/templateInterpreter_sparc.cpp41
-rw-r--r--src/cpu/sparc/vm/templateTable_sparc.cpp8
-rw-r--r--src/cpu/x86/vm/c1_LIRGenerator_x86.cpp11
-rw-r--r--src/cpu/x86/vm/cppInterpreter_x86.cpp2
-rw-r--r--src/cpu/x86/vm/macroAssembler_x86.cpp45
-rw-r--r--src/cpu/x86/vm/templateInterpreter_x86_32.cpp40
-rw-r--r--src/cpu/x86/vm/templateInterpreter_x86_64.cpp30
-rw-r--r--src/cpu/x86/vm/templateTable_x86_32.cpp4
-rw-r--r--src/cpu/x86/vm/templateTable_x86_64.cpp4
-rw-r--r--src/cpu/zero/vm/cppInterpreter_zero.cpp2
-rw-r--r--src/cpu/zero/vm/globals_zero.hpp2
14 files changed, 143 insertions, 154 deletions
diff --git a/src/cpu/sparc/vm/cppInterpreter_sparc.cpp b/src/cpu/sparc/vm/cppInterpreter_sparc.cpp
index 5750e5f58..371b6aa7f 100644
--- a/src/cpu/sparc/vm/cppInterpreter_sparc.cpp
+++ b/src/cpu/sparc/vm/cppInterpreter_sparc.cpp
@@ -365,7 +365,7 @@ address CppInterpreterGenerator::generate_stack_to_native_abi_converter(BasicTyp
return entry;
}
-address CppInterpreter::return_entry(TosState state, int length) {
+address CppInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
// make it look good in the debugger
return CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation) + frame::pc_return_offset;
}
diff --git a/src/cpu/sparc/vm/macroAssembler_sparc.cpp b/src/cpu/sparc/vm/macroAssembler_sparc.cpp
index b229eb341..af142976b 100644
--- a/src/cpu/sparc/vm/macroAssembler_sparc.cpp
+++ b/src/cpu/sparc/vm/macroAssembler_sparc.cpp
@@ -4099,15 +4099,19 @@ void MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) {
void MacroAssembler::encode_klass_not_null(Register r) {
assert (UseCompressedClassPointers, "must be compressed");
- assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
- assert(r != G6_heapbase, "bad register choice");
- set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
- sub(r, G6_heapbase, r);
- if (Universe::narrow_klass_shift() != 0) {
- assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
- srlx(r, LogKlassAlignmentInBytes, r);
+ if (Universe::narrow_klass_base() != NULL) {
+ assert(r != G6_heapbase, "bad register choice");
+ set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
+ sub(r, G6_heapbase, r);
+ if (Universe::narrow_klass_shift() != 0) {
+ assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
+ srlx(r, LogKlassAlignmentInBytes, r);
+ }
+ reinit_heapbase();
+ } else {
+ assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift() || Universe::narrow_klass_shift() == 0, "decode alg wrong");
+ srlx(r, Universe::narrow_klass_shift(), r);
}
- reinit_heapbase();
}
void MacroAssembler::encode_klass_not_null(Register src, Register dst) {
@@ -4115,11 +4119,16 @@ void MacroAssembler::encode_klass_not_null(Register src, Register dst) {
encode_klass_not_null(src);
} else {
assert (UseCompressedClassPointers, "must be compressed");
- assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
- set((intptr_t)Universe::narrow_klass_base(), dst);
- sub(src, dst, dst);
- if (Universe::narrow_klass_shift() != 0) {
- srlx(dst, LogKlassAlignmentInBytes, dst);
+ if (Universe::narrow_klass_base() != NULL) {
+ set((intptr_t)Universe::narrow_klass_base(), dst);
+ sub(src, dst, dst);
+ if (Universe::narrow_klass_shift() != 0) {
+ srlx(dst, LogKlassAlignmentInBytes, dst);
+ }
+ } else {
+ // shift src into dst
+ assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift() || Universe::narrow_klass_shift() == 0, "decode alg wrong");
+ srlx(src, Universe::narrow_klass_shift(), dst);
}
}
}
@@ -4129,14 +4138,16 @@ void MacroAssembler::encode_klass_not_null(Register src, Register dst) {
// the instructions they generate change, then this method needs to be updated.
int MacroAssembler::instr_size_for_decode_klass_not_null() {
assert (UseCompressedClassPointers, "only for compressed klass ptrs");
- // set + add + set
- int num_instrs = insts_for_internal_set((intptr_t)Universe::narrow_klass_base()) + 1 +
- insts_for_internal_set((intptr_t)Universe::narrow_ptrs_base());
- if (Universe::narrow_klass_shift() == 0) {
- return num_instrs * BytesPerInstWord;
- } else { // sllx
- return (num_instrs + 1) * BytesPerInstWord;
+ int num_instrs = 1; // shift src,dst or add
+ if (Universe::narrow_klass_base() != NULL) {
+ // set + add + set
+ num_instrs += insts_for_internal_set((intptr_t)Universe::narrow_klass_base()) +
+ insts_for_internal_set((intptr_t)Universe::narrow_ptrs_base());
+ if (Universe::narrow_klass_shift() != 0) {
+ num_instrs += 1; // sllx
+ }
}
+ return num_instrs * BytesPerInstWord;
}
// !!! If the instructions that get generated here change then function
@@ -4145,13 +4156,17 @@ void MacroAssembler::decode_klass_not_null(Register r) {
// Do not add assert code to this unless you change vtableStubs_sparc.cpp
// pd_code_size_limit.
assert (UseCompressedClassPointers, "must be compressed");
- assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
- assert(r != G6_heapbase, "bad register choice");
- set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
- if (Universe::narrow_klass_shift() != 0)
- sllx(r, LogKlassAlignmentInBytes, r);
- add(r, G6_heapbase, r);
- reinit_heapbase();
+ if (Universe::narrow_klass_base() != NULL) {
+ assert(r != G6_heapbase, "bad register choice");
+ set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
+ if (Universe::narrow_klass_shift() != 0)
+ sllx(r, LogKlassAlignmentInBytes, r);
+ add(r, G6_heapbase, r);
+ reinit_heapbase();
+ } else {
+ assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift() || Universe::narrow_klass_shift() == 0, "decode alg wrong");
+ sllx(r, Universe::narrow_klass_shift(), r);
+ }
}
void MacroAssembler::decode_klass_not_null(Register src, Register dst) {
@@ -4161,16 +4176,21 @@ void MacroAssembler::decode_klass_not_null(Register src, Register dst) {
// Do not add assert code to this unless you change vtableStubs_sparc.cpp
// pd_code_size_limit.
assert (UseCompressedClassPointers, "must be compressed");
- assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
- if (Universe::narrow_klass_shift() != 0) {
- assert((src != G6_heapbase) && (dst != G6_heapbase), "bad register choice");
- set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
- sllx(src, LogKlassAlignmentInBytes, dst);
- add(dst, G6_heapbase, dst);
- reinit_heapbase();
+ if (Universe::narrow_klass_base() != NULL) {
+ if (Universe::narrow_klass_shift() != 0) {
+ assert((src != G6_heapbase) && (dst != G6_heapbase), "bad register choice");
+ set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
+ sllx(src, LogKlassAlignmentInBytes, dst);
+ add(dst, G6_heapbase, dst);
+ reinit_heapbase();
+ } else {
+ set((intptr_t)Universe::narrow_klass_base(), dst);
+ add(src, dst, dst);
+ }
} else {
- set((intptr_t)Universe::narrow_klass_base(), dst);
- add(src, dst, dst);
+ // shift/mov src into dst.
+ assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift() || Universe::narrow_klass_shift() == 0, "decode alg wrong");
+ sllx(src, Universe::narrow_klass_shift(), dst);
}
}
}
diff --git a/src/cpu/sparc/vm/sparc.ad b/src/cpu/sparc/vm/sparc.ad
index eea306b41..eadb0a8b6 100644
--- a/src/cpu/sparc/vm/sparc.ad
+++ b/src/cpu/sparc/vm/sparc.ad
@@ -1660,12 +1660,16 @@ void MachUEPNode::format( PhaseRegAlloc *ra_, outputStream *st ) const {
if (UseCompressedClassPointers) {
assert(Universe::heap() != NULL, "java heap should be initialized");
st->print_cr("\tLDUW [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check - compressed klass");
- st->print_cr("\tSET Universe::narrow_klass_base,R_G6_heap_base");
- if (Universe::narrow_klass_shift() != 0) {
- st->print_cr("\tSLL R_G5,3,R_G5");
+ if (Universe::narrow_klass_base() != 0) {
+ st->print_cr("\tSET Universe::narrow_klass_base,R_G6_heap_base");
+ if (Universe::narrow_klass_shift() != 0) {
+ st->print_cr("\tSLL R_G5,Universe::narrow_klass_shift,R_G5");
+ }
+ st->print_cr("\tADD R_G5,R_G6_heap_base,R_G5");
+ st->print_cr("\tSET Universe::narrow_ptrs_base,R_G6_heap_base");
+ } else {
+ st->print_cr("\tSLL R_G5,Universe::narrow_klass_shift,R_G5");
}
- st->print_cr("\tADD R_G5,R_G6_heap_base,R_G5");
- st->print_cr("\tSET Universe::narrow_ptrs_base,R_G6_heap_base");
} else {
st->print_cr("\tLDX [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check");
}
diff --git a/src/cpu/sparc/vm/templateInterpreter_sparc.cpp b/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
index b6f8a5a5d..40847f8c2 100644
--- a/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
+++ b/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
@@ -153,13 +153,9 @@ address TemplateInterpreterGenerator::generate_StackOverflowError_handler() {
}
-address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
- TosState incoming_state = state;
-
- Label cont;
- address compiled_entry = __ pc();
-
+address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) {
address entry = __ pc();
+
#if !defined(_LP64) && defined(COMPILER2)
// All return values are where we want them, except for Longs. C2 returns
// longs in G1 in the 32-bit build whereas the interpreter wants them in O0/O1.
@@ -170,14 +166,12 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
// do this here. Unfortunately if we did a rethrow we'd see an machepilog node
// first which would move g1 -> O0/O1 and destroy the exception we were throwing.
- if (incoming_state == ltos) {
+ if (state == ltos) {
__ srl (G1, 0, O1);
__ srlx(G1, 32, O0);
}
#endif // !_LP64 && COMPILER2
- __ bind(cont);
-
// The callee returns with the stack possibly adjusted by adapter transition
// We remove that possible adjustment here.
// All interpreter local registers are untouched. Any result is passed back
@@ -186,29 +180,18 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__ mov(Llast_SP, SP); // Remove any adapter added stack space.
- Label L_got_cache, L_giant_index;
const Register cache = G3_scratch;
- const Register size = G1_scratch;
- if (EnableInvokeDynamic) {
- __ ldub(Address(Lbcp, 0), G1_scratch); // Load current bytecode.
- __ cmp_and_br_short(G1_scratch, Bytecodes::_invokedynamic, Assembler::equal, Assembler::pn, L_giant_index);
- }
- __ get_cache_and_index_at_bcp(cache, G1_scratch, 1);
- __ bind(L_got_cache);
- __ ld_ptr(cache, ConstantPoolCache::base_offset() +
- ConstantPoolCacheEntry::flags_offset(), size);
- __ and3(size, 0xFF, size); // argument size in words
- __ sll(size, Interpreter::logStackElementSize, size); // each argument size in bytes
- __ add(Lesp, size, Lesp); // pop arguments
+ const Register index = G1_scratch;
+ __ get_cache_and_index_at_bcp(cache, index, 1, index_size);
+
+ const Register flags = cache;
+ __ ld_ptr(cache, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset(), flags);
+ const Register parameter_size = flags;
+ __ and3(flags, ConstantPoolCacheEntry::parameter_size_mask, parameter_size); // argument size in words
+ __ sll(parameter_size, Interpreter::logStackElementSize, parameter_size); // each argument size in bytes
+ __ add(Lesp, parameter_size, Lesp); // pop arguments
__ dispatch_next(state, step);
- // out of the main line of code...
- if (EnableInvokeDynamic) {
- __ bind(L_giant_index);
- __ get_cache_and_index_at_bcp(cache, G1_scratch, 1, sizeof(u4));
- __ ba_short(L_got_cache);
- }
-
return entry;
}
diff --git a/src/cpu/sparc/vm/templateTable_sparc.cpp b/src/cpu/sparc/vm/templateTable_sparc.cpp
index c3e8b298d..92098113c 100644
--- a/src/cpu/sparc/vm/templateTable_sparc.cpp
+++ b/src/cpu/sparc/vm/templateTable_sparc.cpp
@@ -2932,9 +2932,7 @@ void TemplateTable::prepare_invoke(int byte_no,
ConstantPoolCacheEntry::verify_tos_state_shift();
// load return address
{
- const address table_addr = (is_invokeinterface || is_invokedynamic) ?
- (address)Interpreter::return_5_addrs_by_index_table() :
- (address)Interpreter::return_3_addrs_by_index_table();
+ const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
AddressLiteral table(table_addr);
__ set(table, temp);
__ sll(ra, LogBytesPerWord, ra);
@@ -2984,7 +2982,7 @@ void TemplateTable::invokevirtual(int byte_no) {
__ verify_oop(O0_recv);
// get return address
- AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
+ AddressLiteral table(Interpreter::invoke_return_entry_table());
__ set(table, Rtemp);
__ srl(Rret, ConstantPoolCacheEntry::tos_state_shift, Rret); // get return type
// Make sure we don't need to mask Rret after the above shift
@@ -3026,7 +3024,7 @@ void TemplateTable::invokevfinal_helper(Register Rscratch, Register Rret) {
__ profile_final_call(O4);
// get return address
- AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
+ AddressLiteral table(Interpreter::invoke_return_entry_table());
__ set(table, Rtemp);
__ srl(Rret, ConstantPoolCacheEntry::tos_state_shift, Rret); // get return type
// Make sure we don't need to mask Rret after the above shift
diff --git a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
index 308befddc..4a30d597b 100644
--- a/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
+++ b/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
@@ -1468,19 +1468,18 @@ void LIRGenerator::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {
addr = new LIR_Address(src.result(), offset, type);
}
- if (data != dst) {
- __ move(data, dst);
- data = dst;
- }
+ // Because we want a 2-arg form of xchg and xadd
+ __ move(data, dst);
+
if (x->is_add()) {
- __ xadd(LIR_OprFact::address(addr), data, dst, LIR_OprFact::illegalOpr);
+ __ xadd(LIR_OprFact::address(addr), dst, dst, LIR_OprFact::illegalOpr);
} else {
if (is_obj) {
// Do the pre-write barrier, if any.
pre_barrier(LIR_OprFact::address(addr), LIR_OprFact::illegalOpr /* pre_val */,
true /* do_load */, false /* patch */, NULL);
}
- __ xchg(LIR_OprFact::address(addr), data, dst, LIR_OprFact::illegalOpr);
+ __ xchg(LIR_OprFact::address(addr), dst, dst, LIR_OprFact::illegalOpr);
if (is_obj) {
// Seems to be a precise address
post_barrier(LIR_OprFact::address(addr), data);
diff --git a/src/cpu/x86/vm/cppInterpreter_x86.cpp b/src/cpu/x86/vm/cppInterpreter_x86.cpp
index 1eef095b9..e669f5b66 100644
--- a/src/cpu/x86/vm/cppInterpreter_x86.cpp
+++ b/src/cpu/x86/vm/cppInterpreter_x86.cpp
@@ -367,7 +367,7 @@ address CppInterpreterGenerator::generate_stack_to_native_abi_converter(BasicTyp
return entry;
}
-address CppInterpreter::return_entry(TosState state, int length) {
+address CppInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
// make it look good in the debugger
return CAST_FROM_FN_PTR(address, RecursiveInterpreterActivation);
}
diff --git a/src/cpu/x86/vm/macroAssembler_x86.cpp b/src/cpu/x86/vm/macroAssembler_x86.cpp
index c39c50082..cc4fe6869 100644
--- a/src/cpu/x86/vm/macroAssembler_x86.cpp
+++ b/src/cpu/x86/vm/macroAssembler_x86.cpp
@@ -5049,25 +5049,32 @@ void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
}
void MacroAssembler::encode_klass_not_null(Register r) {
- assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
- // Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
- assert(r != r12_heapbase, "Encoding a klass in r12");
- mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
- subq(r, r12_heapbase);
+ if (Universe::narrow_klass_base() != NULL) {
+ // Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
+ assert(r != r12_heapbase, "Encoding a klass in r12");
+ mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
+ subq(r, r12_heapbase);
+ }
if (Universe::narrow_klass_shift() != 0) {
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
shrq(r, LogKlassAlignmentInBytes);
}
- reinit_heapbase();
+ if (Universe::narrow_klass_base() != NULL) {
+ reinit_heapbase();
+ }
}
void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
if (dst == src) {
encode_klass_not_null(src);
} else {
- mov64(dst, (int64_t)Universe::narrow_klass_base());
- negq(dst);
- addq(dst, src);
+ if (Universe::narrow_klass_base() != NULL) {
+ mov64(dst, (int64_t)Universe::narrow_klass_base());
+ negq(dst);
+ addq(dst, src);
+ } else {
+ movptr(dst, src);
+ }
if (Universe::narrow_klass_shift() != 0) {
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
shrq(dst, LogKlassAlignmentInBytes);
@@ -5081,15 +5088,19 @@ void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
// generate change, then this method needs to be updated.
int MacroAssembler::instr_size_for_decode_klass_not_null() {
assert (UseCompressedClassPointers, "only for compressed klass ptrs");
- // mov64 + addq + shlq? + mov64 (for reinit_heapbase()).
- return (Universe::narrow_klass_shift() == 0 ? 20 : 24);
+ if (Universe::narrow_klass_base() != NULL) {
+ // mov64 + addq + shlq? + mov64 (for reinit_heapbase()).
+ return (Universe::narrow_klass_shift() == 0 ? 20 : 24);
+ } else {
+ // longest load decode klass function, mov64, leaq
+ return 16;
+ }
}
// !!! If the instructions that get generated here change then function
// instr_size_for_decode_klass_not_null() needs to get updated.
void MacroAssembler::decode_klass_not_null(Register r) {
// Note: it will change flags
- assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
assert (UseCompressedClassPointers, "should only be used for compressed headers");
assert(r != r12_heapbase, "Decoding a klass in r12");
// Cannot assert, unverified entry point counts instructions (see .ad file)
@@ -5100,14 +5111,15 @@ void MacroAssembler::decode_klass_not_null(Register r) {
shlq(r, LogKlassAlignmentInBytes);
}
// Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
- mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
- addq(r, r12_heapbase);
- reinit_heapbase();
+ if (Universe::narrow_klass_base() != NULL) {
+ mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
+ addq(r, r12_heapbase);
+ reinit_heapbase();
+ }
}
void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
// Note: it will change flags
- assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
assert (UseCompressedClassPointers, "should only be used for compressed headers");
if (dst == src) {
decode_klass_not_null(dst);
@@ -5115,7 +5127,6 @@ void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
// Cannot assert, unverified entry point counts instructions (see .ad file)
// vtableStubs also counts instructions in pd_code_size_limit.
// Also do not verify_oop as this is called by verify_oop.
-
mov64(dst, (int64_t)Universe::narrow_klass_base());
if (Universe::narrow_klass_shift() != 0) {
assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
diff --git a/src/cpu/x86/vm/templateInterpreter_x86_32.cpp b/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
index 880b7732a..c7fc04726 100644
--- a/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
+++ b/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
@@ -150,13 +150,12 @@ address TemplateInterpreterGenerator::generate_continuation_for(TosState state)
}
-address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
- TosState incoming_state = state;
+address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) {
address entry = __ pc();
#ifdef COMPILER2
// The FPU stack is clean if UseSSE >= 2 but must be cleaned in other cases
- if ((incoming_state == ftos && UseSSE < 1) || (incoming_state == dtos && UseSSE < 2)) {
+ if ((state == ftos && UseSSE < 1) || (state == dtos && UseSSE < 2)) {
for (int i = 1; i < 8; i++) {
__ ffree(i);
}
@@ -164,7 +163,7 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__ empty_FPU_stack();
}
#endif
- if ((incoming_state == ftos && UseSSE < 1) || (incoming_state == dtos && UseSSE < 2)) {
+ if ((state == ftos && UseSSE < 1) || (state == dtos && UseSSE < 2)) {
__ MacroAssembler::verify_FPU(1, "generate_return_entry_for compiled");
} else {
__ MacroAssembler::verify_FPU(0, "generate_return_entry_for compiled");
@@ -172,12 +171,12 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
// In SSE mode, interpreter returns FP results in xmm0 but they need
// to end up back on the FPU so it can operate on them.
- if (incoming_state == ftos && UseSSE >= 1) {
+ if (state == ftos && UseSSE >= 1) {
__ subptr(rsp, wordSize);
__ movflt(Address(rsp, 0), xmm0);
__ fld_s(Address(rsp, 0));
__ addptr(rsp, wordSize);
- } else if (incoming_state == dtos && UseSSE >= 2) {
+ } else if (state == dtos && UseSSE >= 2) {
__ subptr(rsp, 2*wordSize);
__ movdbl(Address(rsp, 0), xmm0);
__ fld_d(Address(rsp, 0));
@@ -194,32 +193,21 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__ restore_bcp();
__ restore_locals();
- if (incoming_state == atos) {
+ if (state == atos) {
Register mdp = rbx;
Register tmp = rcx;
__ profile_return_type(mdp, rax, tmp);
}
- Label L_got_cache, L_giant_index;
- if (EnableInvokeDynamic) {
- __ cmpb(Address(rsi, 0), Bytecodes::_invokedynamic);
- __ jcc(Assembler::equal, L_giant_index);
- }
- __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u2));
- __ bind(L_got_cache);
- __ movl(rbx, Address(rbx, rcx,
- Address::times_ptr, ConstantPoolCache::base_offset() +
- ConstantPoolCacheEntry::flags_offset()));
- __ andptr(rbx, 0xFF);
- __ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale()));
- __ dispatch_next(state, step);
+ const Register cache = rbx;
+ const Register index = rcx;
+ __ get_cache_and_index_at_bcp(cache, index, 1, index_size);
- // out of the main line of code...
- if (EnableInvokeDynamic) {
- __ bind(L_giant_index);
- __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u4));
- __ jmp(L_got_cache);
- }
+ const Register flags = cache;
+ __ movl(flags, Address(cache, index, Address::times_ptr, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()));
+ __ andl(flags, ConstantPoolCacheEntry::parameter_size_mask);
+ __ lea(rsp, Address(rsp, flags, Interpreter::stackElementScale()));
+ __ dispatch_next(state, step);
return entry;
}
diff --git a/src/cpu/x86/vm/templateInterpreter_x86_64.cpp b/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
index 39c49cc43..ef1aa8409 100644
--- a/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
+++ b/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
@@ -166,7 +166,7 @@ address TemplateInterpreterGenerator::generate_continuation_for(TosState state)
}
-address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step) {
+address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) {
address entry = __ pc();
// Restore stack bottom in case i2c adjusted stack
@@ -183,27 +183,15 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__ profile_return_type(mdp, rax, tmp);
}
- Label L_got_cache, L_giant_index;
- if (EnableInvokeDynamic) {
- __ cmpb(Address(r13, 0), Bytecodes::_invokedynamic);
- __ jcc(Assembler::equal, L_giant_index);
- }
- __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u2));
- __ bind(L_got_cache);
- __ movl(rbx, Address(rbx, rcx,
- Address::times_ptr,
- in_bytes(ConstantPoolCache::base_offset()) +
- 3 * wordSize));
- __ andl(rbx, 0xFF);
- __ lea(rsp, Address(rsp, rbx, Address::times_8));
- __ dispatch_next(state, step);
+ const Register cache = rbx;
+ const Register index = rcx;
+ __ get_cache_and_index_at_bcp(cache, index, 1, index_size);
- // out of the main line of code...
- if (EnableInvokeDynamic) {
- __ bind(L_giant_index);
- __ get_cache_and_index_at_bcp(rbx, rcx, 1, sizeof(u4));
- __ jmp(L_got_cache);
- }
+ const Register flags = cache;
+ __ movl(flags, Address(cache, index, Address::times_ptr, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()));
+ __ andl(flags, ConstantPoolCacheEntry::parameter_size_mask);
+ __ lea(rsp, Address(rsp, flags, Interpreter::stackElementScale()));
+ __ dispatch_next(state, step);
return entry;
}
diff --git a/src/cpu/x86/vm/templateTable_x86_32.cpp b/src/cpu/x86/vm/templateTable_x86_32.cpp
index 6e6033b02..3d07cb0ee 100644
--- a/src/cpu/x86/vm/templateTable_x86_32.cpp
+++ b/src/cpu/x86/vm/templateTable_x86_32.cpp
@@ -2925,9 +2925,7 @@ void TemplateTable::prepare_invoke(int byte_no,
ConstantPoolCacheEntry::verify_tos_state_shift();
// load return address
{
- const address table_addr = (is_invokeinterface || is_invokedynamic) ?
- (address)Interpreter::return_5_addrs_by_index_table() :
- (address)Interpreter::return_3_addrs_by_index_table();
+ const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
ExternalAddress table(table_addr);
__ movptr(flags, ArrayAddress(table, Address(noreg, flags, Address::times_ptr)));
}
diff --git a/src/cpu/x86/vm/templateTable_x86_64.cpp b/src/cpu/x86/vm/templateTable_x86_64.cpp
index 8c49726e5..1da6efa85 100644
--- a/src/cpu/x86/vm/templateTable_x86_64.cpp
+++ b/src/cpu/x86/vm/templateTable_x86_64.cpp
@@ -2980,9 +2980,7 @@ void TemplateTable::prepare_invoke(int byte_no,
ConstantPoolCacheEntry::verify_tos_state_shift();
// load return address
{
- const address table_addr = (is_invokeinterface || is_invokedynamic) ?
- (address)Interpreter::return_5_addrs_by_index_table() :
- (address)Interpreter::return_3_addrs_by_index_table();
+ const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
ExternalAddress table(table_addr);
__ lea(rscratch1, table);
__ movptr(flags, Address(rscratch1, flags, Address::times_ptr));
diff --git a/src/cpu/zero/vm/cppInterpreter_zero.cpp b/src/cpu/zero/vm/cppInterpreter_zero.cpp
index 42e88a737..27c9af71f 100644
--- a/src/cpu/zero/vm/cppInterpreter_zero.cpp
+++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp
@@ -1006,7 +1006,7 @@ void BytecodeInterpreter::layout_interpreterState(interpreterState istate,
istate->set_stack_limit(stack_base - method->max_stack() - 1);
}
-address CppInterpreter::return_entry(TosState state, int length) {
+address CppInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
ShouldNotCallThis();
return NULL;
}
diff --git a/src/cpu/zero/vm/globals_zero.hpp b/src/cpu/zero/vm/globals_zero.hpp
index 71b566fce..9a304c7f3 100644
--- a/src/cpu/zero/vm/globals_zero.hpp
+++ b/src/cpu/zero/vm/globals_zero.hpp
@@ -57,6 +57,8 @@ define_pd_global(bool, UseMembar, true);
// GC Ergo Flags
define_pd_global(uintx, CMSYoungGenPerWorker, 16*M); // default max size of CMS young gen, per GC worker thread
+define_pd_global(uintx, TypeProfileLevel, 0);
+
#define ARCH_FLAGS(develop, product, diagnostic, experimental, notproduct)
#endif // CPU_ZERO_VM_GLOBALS_ZERO_HPP