Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Address More Review comments #8

Merged
merged 5 commits into from
Nov 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 1 addition & 16 deletions src/hotspot/cpu/aarch64/foreign_globals_aarch64.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,22 +28,7 @@
#include "asm/macroAssembler.hpp"
#include "utilities/growableArray.hpp"

#define __ _masm->

struct VectorRegister {
static const size_t VECTOR_MAX_WIDTH_BITS = 128;
static const size_t VECTOR_MAX_WIDTH_BYTES = VECTOR_MAX_WIDTH_BITS / 8;
static const size_t VECTOR_MAX_WIDTH_U64S = VECTOR_MAX_WIDTH_BITS / 64;
static const size_t VECTOR_MAX_WIDTH_FLOATS = VECTOR_MAX_WIDTH_BITS / 32;
static const size_t VECTOR_MAX_WIDTH_DOUBLES = VECTOR_MAX_WIDTH_BITS / 64;

union {
uint8_t bits[VECTOR_MAX_WIDTH_BYTES];
uint64_t u64[VECTOR_MAX_WIDTH_U64S];
float f[VECTOR_MAX_WIDTH_FLOATS];
double d[VECTOR_MAX_WIDTH_DOUBLES];
};
};
constexpr size_t float_reg_size = 16; // bytes

struct ABIDescriptor {
GrowableArray<Register> _integer_argument_registers;
Expand Down
6 changes: 4 additions & 2 deletions src/hotspot/cpu/aarch64/universalNativeInvoker_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
#include "memory/resourceArea.hpp"
#include "prims/universalNativeInvoker.hpp"

#define __ _masm->

void ProgrammableInvoker::Generator::generate() {
__ enter();

Expand Down Expand Up @@ -73,7 +75,7 @@ void ProgrammableInvoker::Generator::generate() {
__ bind(Ldone);

for (int i = 0; i < _abi->_vector_argument_registers.length(); i++) {
ssize_t offs = _layout->arguments_vector + i * sizeof(VectorRegister);
ssize_t offs = _layout->arguments_vector + i * float_reg_size;
__ ldrq(_abi->_vector_argument_registers.at(i), Address(Rctx, offs));
}

Expand All @@ -99,7 +101,7 @@ void ProgrammableInvoker::Generator::generate() {
}

for (int i = 0; i < _abi->_vector_return_registers.length(); i++) {
ssize_t offs = _layout->returns_vector + i * sizeof(VectorRegister);
ssize_t offs = _layout->returns_vector + i * float_reg_size;
__ strq(_abi->_vector_return_registers.at(i), Address(Rctx, offs));
}

Expand Down
6 changes: 4 additions & 2 deletions src/hotspot/cpu/aarch64/universalUpcallHandler_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
#include "memory/resourceArea.hpp"
#include "prims/universalUpcallHandler.hpp"

#define __ _masm->

// 1. Create buffer according to layout
// 2. Load registers & stack args into buffer
// 3. Call upcall helper with upcall handler instance & buffer pointer (C++ ABI)
Expand Down Expand Up @@ -63,7 +65,7 @@ address ProgrammableUpcallHandler::generate_upcall_stub(jobject rec, jobject jab

for (int i = 0; i < abi._vector_argument_registers.length(); i++) {
FloatRegister reg = abi._vector_argument_registers.at(i);
ssize_t offset = layout.arguments_vector + i * sizeof(VectorRegister);
ssize_t offset = layout.arguments_vector + i * float_reg_size;
__ strq(reg, Address(sp, offset));
}

Expand All @@ -84,7 +86,7 @@ address ProgrammableUpcallHandler::generate_upcall_stub(jobject rec, jobject jab

for (int i = 0; i < abi._vector_return_registers.length(); i++) {
FloatRegister reg = abi._vector_return_registers.at(i);
ssize_t offs = layout.returns_vector + i * sizeof(VectorRegister);
ssize_t offs = layout.returns_vector + i * float_reg_size;
__ ldrq(reg, Address(sp, offs));
}

Expand Down
1 change: 0 additions & 1 deletion src/hotspot/cpu/aarch64/vmreg_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ void VMRegImpl::set_regName() {

#define INTEGER_TYPE 0
#define VECTOR_TYPE 1
#define X87_TYPE 2
#define STACK_TYPE 3

VMReg VMRegImpl::vmStorageToVMReg(int type, int index) {
Expand Down
17 changes: 1 addition & 16 deletions src/hotspot/cpu/x86/foreign_globals_x86.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,7 @@
#include "asm/macroAssembler.hpp"
#include "utilities/growableArray.hpp"

#define __ _masm->

struct VectorRegister {
static const size_t VECTOR_MAX_WIDTH_BITS = 512; // AVX-512 (64-byte) vector types
static const size_t VECTOR_MAX_WIDTH_BYTES = VECTOR_MAX_WIDTH_BITS / 8;
static const size_t VECTOR_MAX_WIDTH_U64S = VECTOR_MAX_WIDTH_BITS / 64;
static const size_t VECTOR_MAX_WIDTH_FLOATS = VECTOR_MAX_WIDTH_BITS / 32;
static const size_t VECTOR_MAX_WIDTH_DOUBLES = VECTOR_MAX_WIDTH_BITS / 64;

union {
uint8_t bits[VECTOR_MAX_WIDTH_BYTES];
uint64_t u64[VECTOR_MAX_WIDTH_U64S];
float f[VECTOR_MAX_WIDTH_FLOATS];
double d[VECTOR_MAX_WIDTH_DOUBLES];
};
};
constexpr size_t xmm_reg_size = 16; // size of XMM reg

struct ABIDescriptor {
GrowableArray<Register> _integer_argument_registers;
Expand Down
10 changes: 5 additions & 5 deletions src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3462,10 +3462,10 @@ bool target_uses_register(VMReg reg) {
#endif
};

address SharedRuntime::make_native_invoker(address call_target,
int shadow_space_bytes,
const GrowableArray<VMReg>& input_registers,
const GrowableArray<VMReg>& output_registers) {
BufferBlob* SharedRuntime::make_native_invoker(address call_target,
int shadow_space_bytes,
const GrowableArray<VMReg>& input_registers,
const GrowableArray<VMReg>& output_registers) {
BufferBlob* _invoke_native_blob = BufferBlob::create("nep_invoker_blob", native_invoker_code_size);
if (_invoke_native_blob == NULL)
return NULL; // allocation failure
Expand All @@ -3475,7 +3475,7 @@ address SharedRuntime::make_native_invoker(address call_target,
g.generate();
code.log_section_sizes("nep_invoker_blob");

return _invoke_native_blob->code_begin();
return _invoke_native_blob;
}

void NativeInvokerGenerator::generate() {
Expand Down
22 changes: 6 additions & 16 deletions src/hotspot/cpu/x86/universalNativeInvoker_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
#include "memory/resourceArea.hpp"
#include "prims/universalNativeInvoker.hpp"

#define __ _masm->

void ProgrammableInvoker::Generator::generate() {
__ enter();

Expand Down Expand Up @@ -73,14 +75,8 @@ void ProgrammableInvoker::Generator::generate() {
// [8] -> 512 bit -> zmm

XMMRegister reg = _abi->_vector_argument_registers.at(i);
size_t offs = _layout->arguments_vector + i * sizeof(VectorRegister);
if (UseAVX >= 3) {
__ evmovdqul(reg, Address(ctxt_reg, (int)offs), Assembler::AVX_512bit);
} else if (UseAVX >= 1) {
__ vmovdqu(reg, Address(ctxt_reg, (int)offs));
} else {
__ movdqu(reg, Address(ctxt_reg, (int)offs));
}
size_t offs = _layout->arguments_vector + i * xmm_reg_size;
__ movdqu(reg, Address(ctxt_reg, (int)offs));
}

for (int i = 0; i < _abi->_integer_argument_registers.length(); i++) {
Expand Down Expand Up @@ -115,14 +111,8 @@ void ProgrammableInvoker::Generator::generate() {
// [8] -> 512 bit -> zmm (AVX-512, aka AVX3)

XMMRegister reg = _abi->_vector_return_registers.at(i);
size_t offs = _layout->returns_vector + i * sizeof(VectorRegister);
if (UseAVX >= 3) {
__ evmovdqul(Address(ctxt_reg, (int)offs), reg, Assembler::AVX_512bit);
} else if (UseAVX >= 1) {
__ vmovdqu(Address(ctxt_reg, (int)offs), reg);
} else {
__ movdqu(Address(ctxt_reg, (int)offs), reg);
}
size_t offs = _layout->returns_vector + i * xmm_reg_size;
__ movdqu(Address(ctxt_reg, (int)offs), reg);
}

for (size_t i = 0; i < _abi->_X87_return_registers_noof; i++) {
Expand Down
24 changes: 7 additions & 17 deletions src/hotspot/cpu/x86/universalUpcallHandler_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
#include "memory/resourceArea.hpp"
#include "prims/universalUpcallHandler.hpp"

#define __ _masm->

// 1. Create buffer according to layout
// 2. Load registers & stack args into buffer
// 3. Call upcall helper with upcall handler instance & buffer pointer (C++ ABI)
Expand All @@ -41,7 +43,7 @@ address ProgrammableUpcallHandler::generate_upcall_stub(jobject rec, jobject jab
MacroAssembler* _masm = new MacroAssembler(&buffer);
int stack_alignment_C = 16; // bytes
int register_size = sizeof(uintptr_t);
int buffer_alignment = sizeof(VectorRegister);
int buffer_alignment = xmm_reg_size;

// stub code
__ enter();
Expand Down Expand Up @@ -76,14 +78,8 @@ address ProgrammableUpcallHandler::generate_upcall_stub(jobject rec, jobject jab

for (int i = 0; i < abi._vector_argument_registers.length(); i++) {
XMMRegister reg = abi._vector_argument_registers.at(i);
size_t offs = buffer_offset + layout.arguments_vector + i * sizeof(VectorRegister);
if (UseAVX >= 3) {
__ evmovdqul(Address(rsp, (int)offs), reg, Assembler::AVX_512bit);
} else if (UseAVX >= 1) {
__ vmovdqu(Address(rsp, (int)offs), reg);
} else {
__ movdqu(Address(rsp, (int)offs), reg);
}
size_t offs = buffer_offset + layout.arguments_vector + i * xmm_reg_size;
__ movdqu(Address(rsp, (int)offs), reg);
}

// Capture prev stack pointer (stack arguments base)
Expand Down Expand Up @@ -121,14 +117,8 @@ address ProgrammableUpcallHandler::generate_upcall_stub(jobject rec, jobject jab

for (int i = 0; i < abi._vector_return_registers.length(); i++) {
XMMRegister reg = abi._vector_return_registers.at(i);
size_t offs = buffer_offset + layout.returns_vector + i * sizeof(VectorRegister);
if (UseAVX >= 3) {
__ evmovdqul(reg, Address(rsp, (int)offs), Assembler::AVX_512bit);
} else if (UseAVX >= 1) {
__ vmovdqu(reg, Address(rsp, (int)offs));
} else {
__ movdqu(reg, Address(rsp, (int)offs));
}
size_t offs = buffer_offset + layout.returns_vector + i * xmm_reg_size;
__ movdqu(reg, Address(rsp, (int)offs));
}

for (size_t i = abi._X87_return_registers_noof; i > 0 ; i--) {
Expand Down
5 changes: 2 additions & 3 deletions src/hotspot/share/ci/ciEnv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -970,8 +970,7 @@ void ciEnv::register_method(ciMethod* target,
bool has_unsafe_access,
bool has_wide_vectors,
RTMState rtm_state,
address* native_stubs,
int num_stubs) {
const GrowableArrayView<BufferBlob*>& native_invokers) {
VM_ENTRY_MARK;
nmethod* nm = NULL;
{
Expand Down Expand Up @@ -1061,7 +1060,7 @@ void ciEnv::register_method(ciMethod* target,
frame_words, oop_map_set,
handler_table, inc_table,
compiler, task()->comp_level(),
native_stubs, num_stubs);
native_invokers);

// Free codeBlobs
code_buffer->free_blob();
Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/share/ci/ciEnv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -381,8 +381,7 @@ class ciEnv : StackObj {
bool has_unsafe_access,
bool has_wide_vectors,
RTMState rtm_state = NoRTM,
address* native_stubs = NULL,
int num_stubs = 0);
const GrowableArrayView<BufferBlob*>& native_invokers = GrowableArrayView<BufferBlob*>::EMPTY);


// Access to certain well known ciObjects.
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/code/codeCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,7 @@ void CodeCache::free(CodeBlob* cb) {
if (ptr->has_dependencies()) {
_number_of_nmethods_with_dependencies--;
}
ptr->free_native_stubs();
ptr->free_native_invokers();
}
if (cb->is_adapter_blob()) {
heap->set_adapter_count(heap->adapter_count() - 1);
Expand Down
Loading