8312579: [JVMCI] JVMCI support for virtual Vector API objects
Reviewed-by: dnsimon, never
This commit is contained in:
parent
44576a7cca
commit
271417a0e1
src
hotspot/share
classfile
jvmci
runtime
jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot
@ -453,7 +453,7 @@ void Modules::define_module(Handle module, jboolean is_open, jstring version,
|
||||
ClassLoader::add_to_exploded_build_list(THREAD, module_symbol);
|
||||
}
|
||||
|
||||
#ifdef COMPILER2
|
||||
#if COMPILER2_OR_JVMCI
|
||||
// Special handling of jdk.incubator.vector
|
||||
if (strcmp(module_name, "jdk.incubator.vector") == 0) {
|
||||
if (FLAG_IS_DEFAULT(EnableVectorSupport)) {
|
||||
@ -473,7 +473,7 @@ void Modules::define_module(Handle module, jboolean is_open, jstring version,
|
||||
log_info(compilation)("EnableVectorAggressiveReboxing=%s", (EnableVectorAggressiveReboxing ? "true" : "false"));
|
||||
log_info(compilation)("UseVectorStubs=%s", (UseVectorStubs ? "true" : "false"));
|
||||
}
|
||||
#endif // COMPILER2
|
||||
#endif // COMPILER2_OR_JVMCI
|
||||
}
|
||||
|
||||
#if INCLUDE_CDS_JAVA_HEAP
|
||||
|
@ -396,7 +396,8 @@ ScopeValue* CodeInstaller::get_scope_value(HotSpotCompiledCodeStream* stream, u1
|
||||
}
|
||||
case REGISTER_PRIMITIVE:
|
||||
case REGISTER_NARROW_OOP:
|
||||
case REGISTER_OOP: {
|
||||
case REGISTER_OOP:
|
||||
case REGISTER_VECTOR: {
|
||||
u2 number = stream->read_u2("register");
|
||||
VMReg hotspotRegister = get_hotspot_reg(number, JVMCI_CHECK_NULL);
|
||||
if (is_general_purpose_reg(hotspotRegister)) {
|
||||
@ -422,6 +423,8 @@ ScopeValue* CodeInstaller::get_scope_value(HotSpotCompiledCodeStream* stream, u1
|
||||
locationType = Location::normal;
|
||||
} else if (type == T_DOUBLE) {
|
||||
locationType = Location::dbl;
|
||||
} else if (type == T_OBJECT && tag == REGISTER_VECTOR) {
|
||||
locationType = Location::vector;
|
||||
} else {
|
||||
JVMCI_ERROR_NULL("unexpected type %s in floating point register%s", basictype_to_str(type), stream->context());
|
||||
}
|
||||
@ -434,14 +437,15 @@ ScopeValue* CodeInstaller::get_scope_value(HotSpotCompiledCodeStream* stream, u1
|
||||
}
|
||||
case STACK_SLOT_PRIMITIVE:
|
||||
case STACK_SLOT_NARROW_OOP:
|
||||
case STACK_SLOT_OOP: {
|
||||
case STACK_SLOT_OOP:
|
||||
case STACK_SLOT_VECTOR: {
|
||||
jint offset = (jshort) stream->read_s2("offset");
|
||||
if (stream->read_bool("addRawFrameSize")) {
|
||||
offset += _total_frame_size;
|
||||
}
|
||||
Location::Type locationType;
|
||||
if (type == T_OBJECT) {
|
||||
locationType = tag == STACK_SLOT_NARROW_OOP ? Location::narrowoop : Location::oop;
|
||||
locationType = tag == STACK_SLOT_VECTOR ? Location::vector : tag == STACK_SLOT_NARROW_OOP ? Location::narrowoop : Location::oop;
|
||||
} else if (type == T_LONG) {
|
||||
locationType = Location::lng;
|
||||
} else if (type == T_DOUBLE) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2023, 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
|
||||
@ -185,9 +185,11 @@ private:
|
||||
REGISTER_PRIMITIVE,
|
||||
REGISTER_OOP,
|
||||
REGISTER_NARROW_OOP,
|
||||
REGISTER_VECTOR,
|
||||
STACK_SLOT_PRIMITIVE,
|
||||
STACK_SLOT_OOP,
|
||||
STACK_SLOT_NARROW_OOP,
|
||||
STACK_SLOT_VECTOR,
|
||||
VIRTUAL_OBJECT_ID,
|
||||
VIRTUAL_OBJECT_ID2,
|
||||
NULL_CONSTANT,
|
||||
|
@ -530,9 +530,11 @@
|
||||
declare_constant(CodeInstaller::REGISTER_PRIMITIVE) \
|
||||
declare_constant(CodeInstaller::REGISTER_OOP) \
|
||||
declare_constant(CodeInstaller::REGISTER_NARROW_OOP) \
|
||||
declare_constant(CodeInstaller::REGISTER_VECTOR) \
|
||||
declare_constant(CodeInstaller::STACK_SLOT_PRIMITIVE) \
|
||||
declare_constant(CodeInstaller::STACK_SLOT_OOP) \
|
||||
declare_constant(CodeInstaller::STACK_SLOT_NARROW_OOP) \
|
||||
declare_constant(CodeInstaller::STACK_SLOT_VECTOR) \
|
||||
declare_constant(CodeInstaller::VIRTUAL_OBJECT_ID) \
|
||||
declare_constant(CodeInstaller::VIRTUAL_OBJECT_ID2) \
|
||||
declare_constant(CodeInstaller::NULL_CONSTANT) \
|
||||
|
@ -4041,7 +4041,7 @@ jint Arguments::apply_ergo() {
|
||||
JVMFlag::printSetFlags(tty);
|
||||
}
|
||||
|
||||
#ifdef COMPILER2
|
||||
#if COMPILER2_OR_JVMCI
|
||||
if (!FLAG_IS_DEFAULT(EnableVectorSupport) && !EnableVectorSupport) {
|
||||
if (!FLAG_IS_DEFAULT(EnableVectorReboxing) && EnableVectorReboxing) {
|
||||
warning("Disabling EnableVectorReboxing since EnableVectorSupport is turned off.");
|
||||
@ -4062,7 +4062,7 @@ jint Arguments::apply_ergo() {
|
||||
}
|
||||
FLAG_SET_DEFAULT(UseVectorStubs, false);
|
||||
}
|
||||
#endif // COMPILER2
|
||||
#endif // COMPILER2_OR_JVMCI
|
||||
|
||||
if (FLAG_IS_CMDLINE(DiagnoseSyncOnValueBasedClasses)) {
|
||||
if (DiagnoseSyncOnValueBasedClasses == ObjectSynchronizer::LOG_WARNING && !log_is_enabled(Info, valuebasedclasses)) {
|
||||
|
@ -1235,7 +1235,7 @@ bool Deoptimization::realloc_objects(JavaThread* thread, frame* fr, RegisterMap*
|
||||
|
||||
InstanceKlass* ik = InstanceKlass::cast(k);
|
||||
if (obj == nullptr && !cache_init_error) {
|
||||
#ifdef COMPILER2
|
||||
#if COMPILER2_OR_JVMCI
|
||||
if (EnableVectorSupport && VectorSupport::is_vector(ik)) {
|
||||
obj = VectorSupport::allocate_vector(ik, fr, reg_map, sv, THREAD);
|
||||
} else {
|
||||
@ -1243,7 +1243,7 @@ bool Deoptimization::realloc_objects(JavaThread* thread, frame* fr, RegisterMap*
|
||||
}
|
||||
#else
|
||||
obj = ik->allocate_instance(THREAD);
|
||||
#endif // COMPILER2
|
||||
#endif // COMPILER2_OR_JVMCI
|
||||
}
|
||||
} else if (k->is_typeArray_klass()) {
|
||||
TypeArrayKlass* ak = TypeArrayKlass::cast(k);
|
||||
@ -1585,7 +1585,7 @@ void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableAr
|
||||
continue;
|
||||
}
|
||||
#endif // INCLUDE_JVMCI
|
||||
#ifdef COMPILER2
|
||||
#if COMPILER2_OR_JVMCI
|
||||
if (EnableVectorSupport && VectorSupport::is_vector(k)) {
|
||||
assert(sv->field_size() == 1, "%s not a vector", k->name()->as_C_string());
|
||||
ScopeValue* payload = sv->field_at(0);
|
||||
@ -1605,7 +1605,7 @@ void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableAr
|
||||
// Else fall-through to do assignment for scalar-replaced boxed vector representation
|
||||
// which could be restored after vector object allocation.
|
||||
}
|
||||
#endif /* !COMPILER2 */
|
||||
#endif /* !COMPILER2_OR_JVMCI */
|
||||
if (k->is_instance_klass()) {
|
||||
InstanceKlass* ik = InstanceKlass::cast(k);
|
||||
reassign_fields_by_klass(ik, fr, reg_map, sv, 0, obj(), skip_internal);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2022, 2023, 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
|
||||
@ -48,6 +48,7 @@ import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.RAW_CONSTANT;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.REGISTER_NARROW_OOP;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.REGISTER_OOP;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.REGISTER_PRIMITIVE;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.REGISTER_VECTOR;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.SITE_CALL;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.SITE_DATA_PATCH;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.SITE_EXCEPTION_HANDLER;
|
||||
@ -61,6 +62,7 @@ import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.SITE_SAFEPOINT;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.STACK_SLOT_NARROW_OOP;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.STACK_SLOT_OOP;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.STACK_SLOT_PRIMITIVE;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.STACK_SLOT_VECTOR;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.VIRTUAL_OBJECT_ID;
|
||||
import static jdk.vm.ci.hotspot.HotSpotCompiledCodeStream.Tag.VIRTUAL_OBJECT_ID2;
|
||||
|
||||
@ -171,9 +173,11 @@ final class HotSpotCompiledCodeStream implements AutoCloseable {
|
||||
REGISTER_PRIMITIVE,
|
||||
REGISTER_OOP,
|
||||
REGISTER_NARROW_OOP,
|
||||
REGISTER_VECTOR,
|
||||
STACK_SLOT_PRIMITIVE,
|
||||
STACK_SLOT_OOP,
|
||||
STACK_SLOT_NARROW_OOP,
|
||||
STACK_SLOT_VECTOR,
|
||||
VIRTUAL_OBJECT_ID,
|
||||
VIRTUAL_OBJECT_ID2,
|
||||
NULL_CONSTANT,
|
||||
@ -1029,6 +1033,10 @@ final class HotSpotCompiledCodeStream implements AutoCloseable {
|
||||
return oopValue.getPlatformKind() != runtime.getHostJVMCIBackend().getTarget().arch.getWordKind();
|
||||
}
|
||||
|
||||
private boolean isVector(Value value) {
|
||||
return value.getPlatformKind().getVectorLength() > 1;
|
||||
}
|
||||
|
||||
private void writeJavaValue(JavaValue value, JavaKind kind) {
|
||||
if (value == Value.ILLEGAL) {
|
||||
writeTag(ILLEGAL);
|
||||
@ -1039,12 +1047,30 @@ final class HotSpotCompiledCodeStream implements AutoCloseable {
|
||||
writeTag(NULL_CONSTANT);
|
||||
} else if (value instanceof RegisterValue) {
|
||||
RegisterValue reg = (RegisterValue) value;
|
||||
Tag tag = kind == JavaKind.Object ? (isNarrowOop(reg) ? REGISTER_NARROW_OOP : REGISTER_OOP) : REGISTER_PRIMITIVE;
|
||||
Tag tag;
|
||||
if (kind == JavaKind.Object) {
|
||||
if (isVector(reg)) {
|
||||
tag = REGISTER_VECTOR;
|
||||
} else {
|
||||
tag = isNarrowOop(reg) ? REGISTER_NARROW_OOP : REGISTER_OOP;
|
||||
}
|
||||
} else {
|
||||
tag = REGISTER_PRIMITIVE;
|
||||
}
|
||||
writeTag(tag);
|
||||
writeRegister(reg.getRegister());
|
||||
} else if (value instanceof StackSlot) {
|
||||
StackSlot slot = (StackSlot) value;
|
||||
Tag tag = kind == JavaKind.Object ? (isNarrowOop(slot) ? STACK_SLOT_NARROW_OOP : STACK_SLOT_OOP) : STACK_SLOT_PRIMITIVE;
|
||||
Tag tag;
|
||||
if (kind == JavaKind.Object) {
|
||||
if (isVector(slot)) {
|
||||
tag = STACK_SLOT_VECTOR;
|
||||
} else {
|
||||
tag = isNarrowOop(slot) ? STACK_SLOT_NARROW_OOP : STACK_SLOT_OOP;
|
||||
}
|
||||
} else {
|
||||
tag = STACK_SLOT_PRIMITIVE;
|
||||
}
|
||||
writeTag(tag);
|
||||
writeS2("offset", slot.getRawOffset());
|
||||
writeBoolean("addRawFrameSize", slot.getRawAddFrameSize());
|
||||
|
Loading…
x
Reference in New Issue
Block a user