8147461: Use byte offsets for vtable start and vtable length offsets
Reviewed-by: cjplummer, coleenp, dnsimon
This commit is contained in:
parent
1fdb299974
commit
1163c0a2cb
@ -898,13 +898,13 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
|||||||
"caller must use same register for non-constant itable index as for method");
|
"caller must use same register for non-constant itable index as for method");
|
||||||
|
|
||||||
// Compute start of first itableOffsetEntry (which is at the end of the vtable)
|
// Compute start of first itableOffsetEntry (which is at the end of the vtable)
|
||||||
int vtable_base = InstanceKlass::vtable_start_offset() * wordSize;
|
int vtable_base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
int itentry_off = itableMethodEntry::method_offset_in_bytes();
|
int itentry_off = itableMethodEntry::method_offset_in_bytes();
|
||||||
int scan_step = itableOffsetEntry::size() * wordSize;
|
int scan_step = itableOffsetEntry::size() * wordSize;
|
||||||
int vte_size = vtableEntry::size() * wordSize;
|
int vte_size = vtableEntry::size_in_bytes();
|
||||||
assert(vte_size == wordSize, "else adjust times_vte_scale");
|
assert(vte_size == wordSize, "else adjust times_vte_scale");
|
||||||
|
|
||||||
ldrw(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset() * wordSize));
|
ldrw(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset()));
|
||||||
|
|
||||||
// %%% Could store the aligned, prescaled offset in the klassoop.
|
// %%% Could store the aligned, prescaled offset in the klassoop.
|
||||||
// lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base));
|
// lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base));
|
||||||
@ -958,7 +958,7 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
|||||||
void MacroAssembler::lookup_virtual_method(Register recv_klass,
|
void MacroAssembler::lookup_virtual_method(Register recv_klass,
|
||||||
RegisterOrConstant vtable_index,
|
RegisterOrConstant vtable_index,
|
||||||
Register method_result) {
|
Register method_result) {
|
||||||
const int base = InstanceKlass::vtable_start_offset() * wordSize;
|
const int base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
assert(vtableEntry::size() * wordSize == 8,
|
assert(vtableEntry::size() * wordSize == 8,
|
||||||
"adjust the scaling in the code below");
|
"adjust the scaling in the code below");
|
||||||
int vtable_offset_in_bytes = base + vtableEntry::method_offset_in_bytes();
|
int vtable_offset_in_bytes = base + vtableEntry::method_offset_in_bytes();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat 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.
|
||||||
*
|
*
|
||||||
@ -73,7 +73,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
|||||||
if (DebugVtables) {
|
if (DebugVtables) {
|
||||||
Label L;
|
Label L;
|
||||||
// check offset vs vtable length
|
// check offset vs vtable length
|
||||||
__ ldrw(rscratch1, Address(r19, InstanceKlass::vtable_length_offset() * wordSize));
|
__ ldrw(rscratch1, Address(r19, InstanceKlass::vtable_length_offset()));
|
||||||
__ cmpw(rscratch1, vtable_index * vtableEntry::size());
|
__ cmpw(rscratch1, vtable_index * vtableEntry::size());
|
||||||
__ br(Assembler::GT, L);
|
__ br(Assembler::GT, L);
|
||||||
__ enter();
|
__ enter();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2012, 2015 SAP AG. All rights reserved.
|
* Copyright 2012, 2015 SAP AG. 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.
|
||||||
*
|
*
|
||||||
@ -1583,13 +1583,13 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
|||||||
"caller must use same register for non-constant itable index as for method");
|
"caller must use same register for non-constant itable index as for method");
|
||||||
|
|
||||||
// Compute start of first itableOffsetEntry (which is at the end of the vtable).
|
// Compute start of first itableOffsetEntry (which is at the end of the vtable).
|
||||||
int vtable_base = InstanceKlass::vtable_start_offset() * wordSize;
|
int vtable_base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
int itentry_off = itableMethodEntry::method_offset_in_bytes();
|
int itentry_off = itableMethodEntry::method_offset_in_bytes();
|
||||||
int logMEsize = exact_log2(itableMethodEntry::size() * wordSize);
|
int logMEsize = exact_log2(itableMethodEntry::size() * wordSize);
|
||||||
int scan_step = itableOffsetEntry::size() * wordSize;
|
int scan_step = itableOffsetEntry::size() * wordSize;
|
||||||
int log_vte_size= exact_log2(vtableEntry::size() * wordSize);
|
int log_vte_size= exact_log2(vtableEntry::size_in_bytes());
|
||||||
|
|
||||||
lwz(scan_temp, InstanceKlass::vtable_length_offset() * wordSize, recv_klass);
|
lwz(scan_temp, in_bytes(InstanceKlass::vtable_length_offset()), recv_klass);
|
||||||
// %%% We should store the aligned, prescaled offset in the klassoop.
|
// %%% We should store the aligned, prescaled offset in the klassoop.
|
||||||
// Then the next several instructions would fold away.
|
// Then the next several instructions would fold away.
|
||||||
|
|
||||||
@ -1657,7 +1657,7 @@ void MacroAssembler::lookup_virtual_method(Register recv_klass,
|
|||||||
|
|
||||||
assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg());
|
assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg());
|
||||||
|
|
||||||
const int base = InstanceKlass::vtable_start_offset() * wordSize;
|
const int base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
assert(vtableEntry::size() * wordSize == wordSize, "adjust the scaling in the code below");
|
assert(vtableEntry::size() * wordSize == wordSize, "adjust the scaling in the code below");
|
||||||
|
|
||||||
if (vtable_index.is_register()) {
|
if (vtable_index.is_register()) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
// Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
// Copyright 2012, 2015 SAP AG. All rights reserved.
|
// Copyright 2012, 2015 SAP AG. 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.
|
||||||
//
|
//
|
||||||
@ -3562,8 +3562,8 @@ encode %{
|
|||||||
|
|
||||||
__ load_klass(R11_scratch1, R3);
|
__ load_klass(R11_scratch1, R3);
|
||||||
|
|
||||||
int entry_offset = InstanceKlass::vtable_start_offset() + _vtable_index * vtableEntry::size();
|
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + _vtable_index * vtableEntry::size_in_bytes();
|
||||||
int v_off = entry_offset * wordSize + vtableEntry::method_offset_in_bytes();
|
int v_off = entry_offset + vtableEntry::method_offset_in_bytes();
|
||||||
__ li(R19_method, v_off);
|
__ li(R19_method, v_off);
|
||||||
__ ldx(R19_method/*method oop*/, R19_method/*method offset*/, R11_scratch1/*class*/);
|
__ ldx(R19_method/*method oop*/, R19_method/*method offset*/, R11_scratch1/*class*/);
|
||||||
// NOTE: for vtable dispatches, the vtable entry will never be
|
// NOTE: for vtable dispatches, the vtable entry will never be
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2013, 2015 SAP AG. All rights reserved.
|
* Copyright 2013, 2015 SAP AG. 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.
|
||||||
*
|
*
|
||||||
@ -3282,9 +3282,9 @@ void TemplateTable::generate_vtable_call(Register Rrecv_klass, Register Rindex,
|
|||||||
const Register Rtarget_method = Rindex;
|
const Register Rtarget_method = Rindex;
|
||||||
|
|
||||||
// Get target method & entry point.
|
// Get target method & entry point.
|
||||||
const int base = InstanceKlass::vtable_start_offset() * wordSize;
|
const int base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
// Calc vtable addr scale the vtable index by 8.
|
// Calc vtable addr scale the vtable index by 8.
|
||||||
__ sldi(Rindex, Rindex, exact_log2(vtableEntry::size() * wordSize));
|
__ sldi(Rindex, Rindex, exact_log2(vtableEntry::size_in_bytes()));
|
||||||
// Load target.
|
// Load target.
|
||||||
__ addi(Rrecv_klass, Rrecv_klass, base + vtableEntry::method_offset_in_bytes());
|
__ addi(Rrecv_klass, Rrecv_klass, base + vtableEntry::method_offset_in_bytes());
|
||||||
__ ldx(Rtarget_method, Rindex, Rrecv_klass);
|
__ ldx(Rtarget_method, Rindex, Rrecv_klass);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2012, 2015 SAP AG. All rights reserved.
|
* Copyright 2012, 2015 SAP AG. 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.
|
||||||
*
|
*
|
||||||
@ -80,14 +80,14 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
|||||||
__ load_klass(rcvr_klass, R3);
|
__ load_klass(rcvr_klass, R3);
|
||||||
|
|
||||||
// Set method (in case of interpreted method), and destination address.
|
// Set method (in case of interpreted method), and destination address.
|
||||||
int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
|
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes();
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
if (DebugVtables) {
|
if (DebugVtables) {
|
||||||
Label L;
|
Label L;
|
||||||
// Check offset vs vtable length.
|
// Check offset vs vtable length.
|
||||||
const Register vtable_len = R12_scratch2;
|
const Register vtable_len = R12_scratch2;
|
||||||
__ lwz(vtable_len, InstanceKlass::vtable_length_offset()*wordSize, rcvr_klass);
|
__ lwz(vtable_len, in_bytes(InstanceKlass::vtable_length_offset()), rcvr_klass);
|
||||||
__ cmpwi(CCR0, vtable_len, vtable_index*vtableEntry::size());
|
__ cmpwi(CCR0, vtable_len, vtable_index*vtableEntry::size());
|
||||||
__ bge(CCR0, L);
|
__ bge(CCR0, L);
|
||||||
__ li(R12_scratch2, vtable_index);
|
__ li(R12_scratch2, vtable_index);
|
||||||
@ -96,7 +96,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int v_off = entry_offset*wordSize + vtableEntry::method_offset_in_bytes();
|
int v_off = entry_offset + vtableEntry::method_offset_in_bytes();
|
||||||
|
|
||||||
__ ld(R19_method, v_off, rcvr_klass);
|
__ ld(R19_method, v_off, rcvr_klass);
|
||||||
|
|
||||||
@ -163,13 +163,13 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
|||||||
__ load_klass(rcvr_klass, R3_ARG1);
|
__ load_klass(rcvr_klass, R3_ARG1);
|
||||||
|
|
||||||
BLOCK_COMMENT("Load start of itable entries into itable_entry.");
|
BLOCK_COMMENT("Load start of itable entries into itable_entry.");
|
||||||
__ lwz(vtable_len, InstanceKlass::vtable_length_offset() * wordSize, rcvr_klass);
|
__ lwz(vtable_len, in_bytes(InstanceKlass::vtable_length_offset()), rcvr_klass);
|
||||||
__ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size() * wordSize));
|
__ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size_in_bytes()));
|
||||||
__ add(itable_entry_addr, vtable_len, rcvr_klass);
|
__ add(itable_entry_addr, vtable_len, rcvr_klass);
|
||||||
|
|
||||||
// Loop over all itable entries until desired interfaceOop(Rinterface) found.
|
// Loop over all itable entries until desired interfaceOop(Rinterface) found.
|
||||||
BLOCK_COMMENT("Increment itable_entry_addr in loop.");
|
BLOCK_COMMENT("Increment itable_entry_addr in loop.");
|
||||||
const int vtable_base_offset = InstanceKlass::vtable_start_offset() * wordSize;
|
const int vtable_base_offset = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
__ addi(itable_entry_addr, itable_entry_addr, vtable_base_offset + itableOffsetEntry::interface_offset_in_bytes());
|
__ addi(itable_entry_addr, itable_entry_addr, vtable_base_offset + itableOffsetEntry::interface_offset_in_bytes());
|
||||||
|
|
||||||
const int itable_offset_search_inc = itableOffsetEntry::size() * wordSize;
|
const int itable_offset_search_inc = itableOffsetEntry::size() * wordSize;
|
||||||
|
@ -2188,16 +2188,16 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Compute start of first itableOffsetEntry (which is at the end of the vtable)
|
// Compute start of first itableOffsetEntry (which is at the end of the vtable)
|
||||||
int vtable_base = InstanceKlass::vtable_start_offset() * wordSize;
|
int vtable_base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
int scan_step = itableOffsetEntry::size() * wordSize;
|
int scan_step = itableOffsetEntry::size() * wordSize;
|
||||||
int vte_size = vtableEntry::size() * wordSize;
|
int vte_size = vtableEntry::size_in_bytes();
|
||||||
|
|
||||||
lduw(recv_klass, InstanceKlass::vtable_length_offset() * wordSize, scan_temp);
|
lduw(recv_klass, in_bytes(InstanceKlass::vtable_length_offset()), scan_temp);
|
||||||
// %%% We should store the aligned, prescaled offset in the klassoop.
|
// %%% We should store the aligned, prescaled offset in the klassoop.
|
||||||
// Then the next several instructions would fold away.
|
// Then the next several instructions would fold away.
|
||||||
|
|
||||||
int itb_offset = vtable_base;
|
int itb_offset = vtable_base;
|
||||||
int itb_scale = exact_log2(vtableEntry::size() * wordSize);
|
int itb_scale = exact_log2(vtableEntry::size_in_bytes());
|
||||||
sll(scan_temp, itb_scale, scan_temp);
|
sll(scan_temp, itb_scale, scan_temp);
|
||||||
add(scan_temp, itb_offset, scan_temp);
|
add(scan_temp, itb_offset, scan_temp);
|
||||||
add(recv_klass, scan_temp, scan_temp);
|
add(recv_klass, scan_temp, scan_temp);
|
||||||
@ -2268,16 +2268,16 @@ void MacroAssembler::lookup_virtual_method(Register recv_klass,
|
|||||||
Register method_result) {
|
Register method_result) {
|
||||||
assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg());
|
assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg());
|
||||||
Register sethi_temp = method_result;
|
Register sethi_temp = method_result;
|
||||||
const int base = (InstanceKlass::vtable_start_offset() * wordSize +
|
const int base = in_bytes(InstanceKlass::vtable_start_offset()) +
|
||||||
// method pointer offset within the vtable entry:
|
// method pointer offset within the vtable entry:
|
||||||
vtableEntry::method_offset_in_bytes());
|
vtableEntry::method_offset_in_bytes();
|
||||||
RegisterOrConstant vtable_offset = vtable_index;
|
RegisterOrConstant vtable_offset = vtable_index;
|
||||||
// Each of the following three lines potentially generates an instruction.
|
// Each of the following three lines potentially generates an instruction.
|
||||||
// But the total number of address formation instructions will always be
|
// But the total number of address formation instructions will always be
|
||||||
// at most two, and will often be zero. In any case, it will be optimal.
|
// at most two, and will often be zero. In any case, it will be optimal.
|
||||||
// If vtable_index is a register, we will have (sll_ptr N,x; inc_ptr B,x; ld_ptr k,x).
|
// If vtable_index is a register, we will have (sll_ptr N,x; inc_ptr B,x; ld_ptr k,x).
|
||||||
// If vtable_index is a constant, we will have at most (set B+X<<N,t; ld_ptr k,t).
|
// If vtable_index is a constant, we will have at most (set B+X<<N,t; ld_ptr k,t).
|
||||||
vtable_offset = regcon_sll_ptr(vtable_index, exact_log2(vtableEntry::size() * wordSize), vtable_offset);
|
vtable_offset = regcon_sll_ptr(vtable_index, exact_log2(vtableEntry::size_in_bytes()), vtable_offset);
|
||||||
vtable_offset = regcon_inc_ptr(vtable_offset, base, vtable_offset, sethi_temp);
|
vtable_offset = regcon_inc_ptr(vtable_offset, base, vtable_offset, sethi_temp);
|
||||||
Address vtable_entry_addr(recv_klass, ensure_simm13_or_reg(vtable_offset, sethi_temp));
|
Address vtable_entry_addr(recv_klass, ensure_simm13_or_reg(vtable_offset, sethi_temp));
|
||||||
ld_ptr(vtable_entry_addr, method_result);
|
ld_ptr(vtable_entry_addr, method_result);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
// Copyright (c) 1998, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -601,8 +601,8 @@ int MachCallDynamicJavaNode::ret_addr_offset() {
|
|||||||
NativeCall::instruction_size); // sethi; setlo; call; delay slot
|
NativeCall::instruction_size); // sethi; setlo; call; delay slot
|
||||||
} else {
|
} else {
|
||||||
assert(!UseInlineCaches, "expect vtable calls only if not using ICs");
|
assert(!UseInlineCaches, "expect vtable calls only if not using ICs");
|
||||||
int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
|
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes();
|
||||||
int v_off = entry_offset*wordSize + vtableEntry::method_offset_in_bytes();
|
int v_off = entry_offset + vtableEntry::method_offset_in_bytes();
|
||||||
int klass_load_size;
|
int klass_load_size;
|
||||||
if (UseCompressedClassPointers) {
|
if (UseCompressedClassPointers) {
|
||||||
assert(Universe::heap() != NULL, "java heap should be initialized");
|
assert(Universe::heap() != NULL, "java heap should be initialized");
|
||||||
@ -2658,8 +2658,8 @@ encode %{
|
|||||||
} else {
|
} else {
|
||||||
klass_load_size = 1*BytesPerInstWord;
|
klass_load_size = 1*BytesPerInstWord;
|
||||||
}
|
}
|
||||||
int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
|
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes();
|
||||||
int v_off = entry_offset*wordSize + vtableEntry::method_offset_in_bytes();
|
int v_off = entry_offset + vtableEntry::method_offset_in_bytes();
|
||||||
if (Assembler::is_simm13(v_off)) {
|
if (Assembler::is_simm13(v_off)) {
|
||||||
__ ld_ptr(G3, v_off, G5_method);
|
__ ld_ptr(G3, v_off, G5_method);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3153,11 +3153,11 @@ void TemplateTable::invokeinterface(int byte_no) {
|
|||||||
//
|
//
|
||||||
|
|
||||||
// compute start of first itableOffsetEntry (which is at end of vtable)
|
// compute start of first itableOffsetEntry (which is at end of vtable)
|
||||||
const int base = InstanceKlass::vtable_start_offset() * wordSize;
|
const int base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
Label search;
|
Label search;
|
||||||
Register Rtemp = O1_flags;
|
Register Rtemp = O1_flags;
|
||||||
|
|
||||||
__ ld(O2_Klass, InstanceKlass::vtable_length_offset() * wordSize, Rtemp);
|
__ ld(O2_Klass, in_bytes(InstanceKlass::vtable_length_offset()), Rtemp);
|
||||||
__ sll(Rtemp, LogBytesPerWord, Rtemp); // Rscratch *= 4;
|
__ sll(Rtemp, LogBytesPerWord, Rtemp); // Rscratch *= 4;
|
||||||
if (Assembler::is_simm13(base)) {
|
if (Assembler::is_simm13(base)) {
|
||||||
__ add(Rtemp, base, Rtemp);
|
__ add(Rtemp, base, Rtemp);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -78,7 +78,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
|||||||
if (DebugVtables) {
|
if (DebugVtables) {
|
||||||
Label L;
|
Label L;
|
||||||
// check offset vs vtable length
|
// check offset vs vtable length
|
||||||
__ ld(G3_scratch, InstanceKlass::vtable_length_offset()*wordSize, G5);
|
__ ld(G3_scratch, in_bytes(InstanceKlass::vtable_length_offset()), G5);
|
||||||
__ cmp_and_br_short(G5, vtable_index*vtableEntry::size(), Assembler::greaterUnsigned, Assembler::pt, L);
|
__ cmp_and_br_short(G5, vtable_index*vtableEntry::size(), Assembler::greaterUnsigned, Assembler::pt, L);
|
||||||
__ set(vtable_index, O2);
|
__ set(vtable_index, O2);
|
||||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), O0, O2);
|
__ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), O0, O2);
|
||||||
|
@ -5807,14 +5807,14 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
|||||||
"caller must use same register for non-constant itable index as for method");
|
"caller must use same register for non-constant itable index as for method");
|
||||||
|
|
||||||
// Compute start of first itableOffsetEntry (which is at the end of the vtable)
|
// Compute start of first itableOffsetEntry (which is at the end of the vtable)
|
||||||
int vtable_base = InstanceKlass::vtable_start_offset() * wordSize;
|
int vtable_base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
int itentry_off = itableMethodEntry::method_offset_in_bytes();
|
int itentry_off = itableMethodEntry::method_offset_in_bytes();
|
||||||
int scan_step = itableOffsetEntry::size() * wordSize;
|
int scan_step = itableOffsetEntry::size() * wordSize;
|
||||||
int vte_size = vtableEntry::size() * wordSize;
|
int vte_size = vtableEntry::size_in_bytes();
|
||||||
Address::ScaleFactor times_vte_scale = Address::times_ptr;
|
Address::ScaleFactor times_vte_scale = Address::times_ptr;
|
||||||
assert(vte_size == wordSize, "else adjust times_vte_scale");
|
assert(vte_size == wordSize, "else adjust times_vte_scale");
|
||||||
|
|
||||||
movl(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset() * wordSize));
|
movl(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset()));
|
||||||
|
|
||||||
// %%% Could store the aligned, prescaled offset in the klassoop.
|
// %%% Could store the aligned, prescaled offset in the klassoop.
|
||||||
lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base));
|
lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base));
|
||||||
@ -5865,7 +5865,7 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
|||||||
void MacroAssembler::lookup_virtual_method(Register recv_klass,
|
void MacroAssembler::lookup_virtual_method(Register recv_klass,
|
||||||
RegisterOrConstant vtable_index,
|
RegisterOrConstant vtable_index,
|
||||||
Register method_result) {
|
Register method_result) {
|
||||||
const int base = InstanceKlass::vtable_start_offset() * wordSize;
|
const int base = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
assert(vtableEntry::size() * wordSize == wordSize, "else adjust the scaling in the code below");
|
assert(vtableEntry::size() * wordSize == wordSize, "else adjust the scaling in the code below");
|
||||||
Address vtable_entry_addr(recv_klass,
|
Address vtable_entry_addr(recv_klass,
|
||||||
vtable_index, Address::times_ptr,
|
vtable_index, Address::times_ptr,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -85,7 +85,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
|||||||
if (DebugVtables) {
|
if (DebugVtables) {
|
||||||
Label L;
|
Label L;
|
||||||
// check offset vs vtable length
|
// check offset vs vtable length
|
||||||
__ cmpl(Address(rax, InstanceKlass::vtable_length_offset()*wordSize), vtable_index*vtableEntry::size());
|
__ cmpl(Address(rax, InstanceKlass::vtable_length_offset()), vtable_index*vtableEntry::size());
|
||||||
__ jcc(Assembler::greater, L);
|
__ jcc(Assembler::greater, L);
|
||||||
__ movl(rbx, vtable_index);
|
__ movl(rbx, vtable_index);
|
||||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), rcx, rbx);
|
__ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), rcx, rbx);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -77,7 +77,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
|||||||
if (DebugVtables) {
|
if (DebugVtables) {
|
||||||
Label L;
|
Label L;
|
||||||
// check offset vs vtable length
|
// check offset vs vtable length
|
||||||
__ cmpl(Address(rax, InstanceKlass::vtable_length_offset() * wordSize),
|
__ cmpl(Address(rax, InstanceKlass::vtable_length_offset()),
|
||||||
vtable_index * vtableEntry::size());
|
vtable_index * vtableEntry::size());
|
||||||
__ jcc(Assembler::greater, L);
|
__ jcc(Assembler::greater, L);
|
||||||
__ movl(rbx, vtable_index);
|
__ movl(rbx, vtable_index);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -597,7 +597,7 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
|
|||||||
}
|
}
|
||||||
HotSpotVMConfig config = config();
|
HotSpotVMConfig config = config();
|
||||||
final int vtableIndex = getVtableIndex((HotSpotResolvedObjectTypeImpl) resolved);
|
final int vtableIndex = getVtableIndex((HotSpotResolvedObjectTypeImpl) resolved);
|
||||||
return config.instanceKlassVtableStartOffset() + vtableIndex * config.vtableEntrySize + config.vtableEntryMethodOffset;
|
return config.instanceKlassVtableStartOffset + vtableIndex * config.vtableEntrySize + config.vtableEntryMethodOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -1036,13 +1036,6 @@ public class HotSpotVMConfig {
|
|||||||
@HotSpotVMConstant(name = "InstanceKlass::linked") @Stable public int instanceKlassStateLinked;
|
@HotSpotVMConstant(name = "InstanceKlass::linked") @Stable public int instanceKlassStateLinked;
|
||||||
@HotSpotVMConstant(name = "InstanceKlass::fully_initialized") @Stable public int instanceKlassStateFullyInitialized;
|
@HotSpotVMConstant(name = "InstanceKlass::fully_initialized") @Stable public int instanceKlassStateFullyInitialized;
|
||||||
|
|
||||||
/**
|
|
||||||
* See {@code InstanceKlass::vtable_start_offset()}.
|
|
||||||
*/
|
|
||||||
public final int instanceKlassVtableStartOffset() {
|
|
||||||
return instanceKlassVtableStartOffset * heapWordSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
@HotSpotVMType(name = "arrayOopDesc", get = HotSpotVMType.Type.SIZE) @Stable public int arrayOopDescSize;
|
@HotSpotVMType(name = "arrayOopDesc", get = HotSpotVMType.Type.SIZE) @Stable public int arrayOopDescSize;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -2972,8 +2972,8 @@ void LIRGenerator::do_Invoke(Invoke* x) {
|
|||||||
SharedRuntime::get_resolve_virtual_call_stub(),
|
SharedRuntime::get_resolve_virtual_call_stub(),
|
||||||
arg_list, info);
|
arg_list, info);
|
||||||
} else {
|
} else {
|
||||||
int entry_offset = InstanceKlass::vtable_start_offset() + x->vtable_index() * vtableEntry::size();
|
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + x->vtable_index() * vtableEntry::size_in_bytes();
|
||||||
int vtable_offset = entry_offset * wordSize + vtableEntry::method_offset_in_bytes();
|
int vtable_offset = entry_offset + vtableEntry::method_offset_in_bytes();
|
||||||
__ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info);
|
__ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -151,8 +151,8 @@ jbyte* CompilerToVM::Data::cardtable_start_address;
|
|||||||
int CompilerToVM::Data::cardtable_shift;
|
int CompilerToVM::Data::cardtable_shift;
|
||||||
|
|
||||||
void CompilerToVM::Data::initialize() {
|
void CompilerToVM::Data::initialize() {
|
||||||
InstanceKlass_vtable_start_offset = InstanceKlass::vtable_start_offset();
|
InstanceKlass_vtable_start_offset = in_bytes(InstanceKlass::vtable_start_offset());
|
||||||
InstanceKlass_vtable_length_offset = InstanceKlass::vtable_length_offset() * HeapWordSize;
|
InstanceKlass_vtable_length_offset = in_bytes(InstanceKlass::vtable_length_offset());
|
||||||
|
|
||||||
Method_extra_stack_entries = Method::extra_stack_entries();
|
Method_extra_stack_entries = Method::extra_stack_entries();
|
||||||
|
|
||||||
|
@ -949,10 +949,10 @@ public:
|
|||||||
virtual void collect_statistics(KlassSizeStats *sz) const;
|
virtual void collect_statistics(KlassSizeStats *sz) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int vtable_start_offset() { return header_size(); }
|
static ByteSize vtable_start_offset() { return in_ByteSize(header_size() * wordSize); }
|
||||||
static int vtable_length_offset() { return offset_of(InstanceKlass, _vtable_len) / HeapWordSize; }
|
static ByteSize vtable_length_offset() { return byte_offset_of(InstanceKlass, _vtable_len); }
|
||||||
|
|
||||||
intptr_t* start_of_vtable() const { return ((intptr_t*)this) + vtable_start_offset(); }
|
intptr_t* start_of_vtable() const { return (intptr_t*) ((address)this + in_bytes(vtable_start_offset())); }
|
||||||
intptr_t* start_of_itable() const { return start_of_vtable() + vtable_length(); }
|
intptr_t* start_of_itable() const { return start_of_vtable() + vtable_length(); }
|
||||||
int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)this; }
|
int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)this; }
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -173,6 +173,9 @@ class vtableEntry VALUE_OBJ_CLASS_SPEC {
|
|||||||
static int size() {
|
static int size() {
|
||||||
return sizeof(vtableEntry) / sizeof(HeapWord);
|
return sizeof(vtableEntry) / sizeof(HeapWord);
|
||||||
}
|
}
|
||||||
|
static int size_in_bytes() {
|
||||||
|
return sizeof(vtableEntry);
|
||||||
|
}
|
||||||
static int method_offset_in_bytes() { return offset_of(vtableEntry, _method); }
|
static int method_offset_in_bytes() { return offset_of(vtableEntry, _method); }
|
||||||
Method* method() const { return _method; }
|
Method* method() const { return _method; }
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2016, Oracle and/or its affiliates. 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
|
||||||
@ -3828,8 +3828,8 @@ Node* LibraryCallKit::generate_virtual_guard(Node* obj_klass,
|
|||||||
assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index,
|
assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index,
|
||||||
"bad index %d", vtable_index);
|
"bad index %d", vtable_index);
|
||||||
// Get the Method* out of the appropriate vtable entry.
|
// Get the Method* out of the appropriate vtable entry.
|
||||||
int entry_offset = (InstanceKlass::vtable_start_offset() +
|
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) +
|
||||||
vtable_index*vtableEntry::size()) * wordSize +
|
vtable_index*vtableEntry::size_in_bytes() +
|
||||||
vtableEntry::method_offset_in_bytes();
|
vtableEntry::method_offset_in_bytes();
|
||||||
Node* entry_addr = basic_plus_adr(obj_klass, entry_offset);
|
Node* entry_addr = basic_plus_adr(obj_klass, entry_offset);
|
||||||
Node* target_call = make_load(NULL, entry_addr, TypePtr::NOTNULL, T_ADDRESS, MemNode::unordered);
|
Node* target_call = make_load(NULL, entry_addr, TypePtr::NOTNULL, T_ADDRESS, MemNode::unordered);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2008, 2009, 2010 Red Hat, Inc.
|
* Copyright 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.
|
||||||
*
|
*
|
||||||
@ -1143,8 +1143,8 @@ Value *SharkTopLevelBlock::get_virtual_callee(SharkValue* receiver,
|
|||||||
builder()->CreateArrayAddress(
|
builder()->CreateArrayAddress(
|
||||||
klass,
|
klass,
|
||||||
SharkType::Method_type(),
|
SharkType::Method_type(),
|
||||||
vtableEntry::size() * wordSize,
|
vtableEntry::size_in_bytes(),
|
||||||
in_ByteSize(InstanceKlass::vtable_start_offset() * wordSize),
|
InstanceKlass::vtable_start_offset(),
|
||||||
LLVMValue::intptr_constant(vtable_index)),
|
LLVMValue::intptr_constant(vtable_index)),
|
||||||
"callee");
|
"callee");
|
||||||
}
|
}
|
||||||
@ -1166,12 +1166,12 @@ Value* SharkTopLevelBlock::get_interface_callee(SharkValue *receiver,
|
|||||||
Value *vtable_start = builder()->CreateAdd(
|
Value *vtable_start = builder()->CreateAdd(
|
||||||
builder()->CreatePtrToInt(object_klass, SharkType::intptr_type()),
|
builder()->CreatePtrToInt(object_klass, SharkType::intptr_type()),
|
||||||
LLVMValue::intptr_constant(
|
LLVMValue::intptr_constant(
|
||||||
InstanceKlass::vtable_start_offset() * HeapWordSize),
|
in_bytes(InstanceKlass::vtable_start_offset())),
|
||||||
"vtable_start");
|
"vtable_start");
|
||||||
|
|
||||||
Value *vtable_length = builder()->CreateValueOfStructEntry(
|
Value *vtable_length = builder()->CreateValueOfStructEntry(
|
||||||
object_klass,
|
object_klass,
|
||||||
in_ByteSize(InstanceKlass::vtable_length_offset() * HeapWordSize),
|
InstanceKlass::vtable_length_offset(),
|
||||||
SharkType::jint_type(),
|
SharkType::jint_type(),
|
||||||
"vtable_length");
|
"vtable_length");
|
||||||
vtable_length =
|
vtable_length =
|
||||||
@ -1182,7 +1182,7 @@ Value* SharkTopLevelBlock::get_interface_callee(SharkValue *receiver,
|
|||||||
vtable_start,
|
vtable_start,
|
||||||
builder()->CreateShl(
|
builder()->CreateShl(
|
||||||
vtable_length,
|
vtable_length,
|
||||||
LLVMValue::intptr_constant(exact_log2(vtableEntry::size() * wordSize))),
|
LLVMValue::intptr_constant(exact_log2(vtableEntry::size_in_bytes()))),
|
||||||
needs_aligning ? "" : "itable_start");
|
needs_aligning ? "" : "itable_start");
|
||||||
if (needs_aligning) {
|
if (needs_aligning) {
|
||||||
itable_start = builder()->CreateAnd(
|
itable_start = builder()->CreateAnd(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user