# HG changeset patch # User Roland Schatz # Date 1441727021 -7200 # Node ID ca418f35d728634b8fdb494df9817849128bfcc3 # Parent bab91f9ae79579f97ed2b7148fe0c9e917ceb090 Use wordKind instead of Kind.Object in backend. diff -r bab91f9ae795 -r ca418f35d728 jvmci/jdk.internal.jvmci.amd64/src/jdk/internal/jvmci/amd64/AMD64.java --- a/jvmci/jdk.internal.jvmci.amd64/src/jdk/internal/jvmci/amd64/AMD64.java Tue Sep 08 17:10:38 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.amd64/src/jdk/internal/jvmci/amd64/AMD64.java Tue Sep 08 17:43:41 2015 +0200 @@ -165,7 +165,11 @@ @Override public PlatformKind getPlatformKind(Kind javaKind) { - return javaKind; + if (javaKind.isObject()) { + return getWordKind(); + } else { + return javaKind; + } } @Override @@ -183,7 +187,6 @@ case Short: case Int: case Long: - case Object: return true; } } else if (category.equals(XMM)) { diff -r bab91f9ae795 -r ca418f35d728 jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Architecture.java --- a/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Architecture.java Tue Sep 08 17:10:38 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Architecture.java Tue Sep 08 17:43:41 2015 +0200 @@ -116,7 +116,7 @@ * bytes. */ public int getWordSize() { - return getSizeInBytes(wordKind); + return wordKind.getSizeInBytes(); } public PlatformKind getWordKind() { @@ -176,38 +176,6 @@ } /** - * Gets the size in bytes of the specified kind for this target. - * - * @param kind the kind for which to get the size - * - * @return the size in bytes of {@code kind} - */ - public int getSizeInBytes(PlatformKind kind) { - switch ((Kind) kind) { - case Boolean: - return 1; - case Byte: - return 1; - case Char: - return 2; - case Short: - return 2; - case Int: - return 4; - case Long: - return 8; - case Float: - return 4; - case Double: - return 8; - case Object: - return getWordSize(); - default: - return 0; - } - } - - /** * Determine whether a kind can be stored in a register of a given category. * * @param category the category of the register diff -r bab91f9ae795 -r ca418f35d728 jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/TargetDescription.java --- a/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/TargetDescription.java Tue Sep 08 17:10:38 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/TargetDescription.java Tue Sep 08 17:43:41 2015 +0200 @@ -116,7 +116,7 @@ } public int getSizeInBytes(PlatformKind kind) { - return arch.getSizeInBytes(kind); + return kind.getSizeInBytes(); } public LIRKind getLIRKind(Kind javaKind) { diff -r bab91f9ae795 -r ca418f35d728 jvmci/jdk.internal.jvmci.hotspot.amd64/src/jdk/internal/jvmci/hotspot/amd64/AMD64HotSpotRegisterConfig.java --- a/jvmci/jdk.internal.jvmci.hotspot.amd64/src/jdk/internal/jvmci/hotspot/amd64/AMD64HotSpotRegisterConfig.java Tue Sep 08 17:10:38 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot.amd64/src/jdk/internal/jvmci/hotspot/amd64/AMD64HotSpotRegisterConfig.java Tue Sep 08 17:43:41 2015 +0200 @@ -184,27 +184,6 @@ } } - private static LIRKind argumentKind(Kind kind) { - switch (kind) { - case Byte: - case Boolean: - case Short: - case Char: - case Int: - return LIRKind.value(Kind.Int); - case Long: - return LIRKind.value(Kind.Long); - case Float: - return LIRKind.value(Kind.Float); - case Double: - return LIRKind.value(Kind.Double); - case Object: - return LIRKind.reference(Kind.Object); - default: - throw JVMCIError.shouldNotReachHere("invalid argument kind " + kind); - } - } - private CallingConvention callingConvention(Register[] generalParameterRegisters, JavaType returnType, JavaType[] parameterTypes, Type type, TargetDescription target, boolean stackOnly) { AllocatableValue[] locations = new AllocatableValue[parameterTypes.length]; @@ -213,7 +192,7 @@ int currentStackOffset = type == Type.NativeCall && needsNativeStackHomeSpace ? generalParameterRegisters.length * target.wordSize : 0; for (int i = 0; i < parameterTypes.length; i++) { - final Kind kind = parameterTypes[i].getKind(); + final Kind kind = parameterTypes[i].getKind().getStackKind(); switch (kind) { case Byte: @@ -225,14 +204,14 @@ case Object: if (!stackOnly && currentGeneral < generalParameterRegisters.length) { Register register = generalParameterRegisters[currentGeneral++]; - locations[i] = register.asValue(argumentKind(kind)); + locations[i] = register.asValue(target.getLIRKind(kind)); } break; case Float: case Double: if (!stackOnly && currentXMM < xmmParameterRegisters.length) { Register register = xmmParameterRegisters[currentXMM++]; - locations[i] = register.asValue(argumentKind(kind)); + locations[i] = register.asValue(target.getLIRKind(kind)); } break; default: @@ -240,14 +219,14 @@ } if (locations[i] == null) { - LIRKind lirKind = target.getLIRKind(kind.getStackKind()); + LIRKind lirKind = target.getLIRKind(kind); locations[i] = StackSlot.get(lirKind, currentStackOffset, !type.out); currentStackOffset += Math.max(target.getSizeInBytes(lirKind.getPlatformKind()), target.wordSize); } } Kind returnKind = returnType == null ? Kind.Void : returnType.getKind(); - AllocatableValue returnLocation = returnKind == Kind.Void ? Value.ILLEGAL : getReturnRegister(returnKind).asValue(argumentKind(returnKind)); + AllocatableValue returnLocation = returnKind == Kind.Void ? Value.ILLEGAL : getReturnRegister(returnKind).asValue(target.getLIRKind(returnKind.getStackKind())); return new CallingConvention(currentStackOffset, returnLocation, locations); } diff -r bab91f9ae795 -r ca418f35d728 jvmci/jdk.internal.jvmci.hotspot.sparc/src/jdk/internal/jvmci/hotspot/sparc/SPARCHotSpotRegisterConfig.java --- a/jvmci/jdk.internal.jvmci.hotspot.sparc/src/jdk/internal/jvmci/hotspot/sparc/SPARCHotSpotRegisterConfig.java Tue Sep 08 17:10:38 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot.sparc/src/jdk/internal/jvmci/hotspot/sparc/SPARCHotSpotRegisterConfig.java Tue Sep 08 17:43:41 2015 +0200 @@ -197,7 +197,7 @@ int currentStackOffset = 0; for (int i = 0; i < parameterTypes.length; i++) { - final Kind kind = parameterTypes[i].getKind(); + final Kind kind = parameterTypes[i].getKind().getStackKind(); switch (kind) { case Byte: diff -r bab91f9ae795 -r ca418f35d728 jvmci/jdk.internal.jvmci.meta/src/jdk/internal/jvmci/meta/LIRKind.java --- a/jvmci/jdk.internal.jvmci.meta/src/jdk/internal/jvmci/meta/LIRKind.java Tue Sep 08 17:10:38 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.meta/src/jdk/internal/jvmci/meta/LIRKind.java Tue Sep 08 17:43:41 2015 +0200 @@ -70,6 +70,7 @@ private static final int UNKNOWN_REFERENCE = -1; private LIRKind(PlatformKind platformKind, int referenceMask, AllocatableValue derivedReferenceBase) { + assert platformKind != Kind.Object : "Kind.Object shouldn't be used in the backend"; this.platformKind = platformKind; this.referenceMask = referenceMask; this.derivedReferenceBase = derivedReferenceBase; @@ -83,7 +84,6 @@ * reference. Otherwise, {@link #combine(Value...)} should be used instead. */ public static LIRKind value(PlatformKind platformKind) { - assert platformKind != Kind.Object : "Object should always be used as reference type"; return new LIRKind(platformKind, 0, null); } diff -r bab91f9ae795 -r ca418f35d728 jvmci/jdk.internal.jvmci.sparc/src/jdk/internal/jvmci/sparc/SPARC.java --- a/jvmci/jdk.internal.jvmci.sparc/src/jdk/internal/jvmci/sparc/SPARC.java Tue Sep 08 17:10:38 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.sparc/src/jdk/internal/jvmci/sparc/SPARC.java Tue Sep 08 17:43:41 2015 +0200 @@ -271,7 +271,6 @@ case Short: case Int: case Long: - case Object: return true; } } else if (category.equals(FPUs) && kind.equals(Kind.Float)) { @@ -297,7 +296,11 @@ @Override public PlatformKind getPlatformKind(Kind javaKind) { - return javaKind; + if (javaKind.isObject()) { + return Kind.Long; + } else { + return javaKind; + } } public static int spillSlotSize(TargetDescription td, PlatformKind kind) { diff -r bab91f9ae795 -r ca418f35d728 src/share/vm/jvmci/jvmciCodeInstaller.cpp --- a/src/share/vm/jvmci/jvmciCodeInstaller.cpp Tue Sep 08 17:10:38 2015 +0200 +++ b/src/share/vm/jvmci/jvmciCodeInstaller.cpp Tue Sep 08 17:43:41 2015 +0200 @@ -177,15 +177,15 @@ record_metadata_reference(HotSpotMetaspaceConstantImpl::metaspaceObject(constant), HotSpotMetaspaceConstantImpl::primitive(constant), HotSpotMetaspaceConstantImpl::compressed(constant), oop_recorder); } -static Location::Type get_oop_type(oop value) { +Location::Type CodeInstaller::get_oop_type(oop value) { oop lirKind = Value::lirKind(value); oop platformKind = LIRKind::platformKind(lirKind); assert(LIRKind::referenceMask(lirKind) == 1, "unexpected referenceMask"); - if (JVMCIRuntime::kindToBasicType(Kind::typeChar(platformKind)) == T_INT) { + if (platformKind == word_kind()) { + return Location::oop; + } else { return Location::narrowoop; - } else { - return Location::oop; } } @@ -404,7 +404,8 @@ _constants = buffer.consts(); { - initialize_fields(JNIHandles::resolve(compiled_code_obj)); + jobject target_obj = JNIHandles::make_local(target()); + initialize_fields(JNIHandles::resolve(target_obj), JNIHandles::resolve(compiled_code_obj)); if (!initialize_buffer(buffer)) { return JVMCIEnv::code_too_large; } @@ -449,7 +450,7 @@ return result; } -void CodeInstaller::initialize_fields(oop compiled_code) { +void CodeInstaller::initialize_fields(oop target, oop compiled_code) { if (compiled_code->is_a(HotSpotCompiledNmethod::klass())) { Handle hotspotJavaMethod = HotSpotCompiledNmethod::method(compiled_code); methodHandle method = getMethodFromHotSpotMethod(hotspotJavaMethod()); @@ -482,6 +483,9 @@ _next_call_type = INVOKE_INVALID; _has_wide_vector = false; + + oop arch = TargetDescription::arch(target); + _word_kind_handle = JNIHandles::make_local(Architecture::wordKind(arch)); } int CodeInstaller::estimate_stub_entries() { diff -r bab91f9ae795 -r ca418f35d728 src/share/vm/jvmci/jvmciCodeInstaller.hpp --- a/src/share/vm/jvmci/jvmciCodeInstaller.hpp Tue Sep 08 17:10:38 2015 +0200 +++ b/src/share/vm/jvmci/jvmciCodeInstaller.hpp Tue Sep 08 17:43:41 2015 +0200 @@ -71,6 +71,7 @@ #endif bool _has_wide_vector; + jobject _word_kind_handle; MarkId _next_call_type; address _invoke_mark_pc; @@ -107,6 +108,8 @@ objArrayOop comments() { return (objArrayOop) JNIHandles::resolve(_comments_handle); } #endif + oop word_kind() { return (oop) JNIHandles::resolve(_word_kind_handle); } + public: CodeInstaller() : _arena(mtCompiler) {} @@ -117,11 +120,12 @@ static bool is_general_purpose_reg(VMReg hotspotRegister); private: + Location::Type get_oop_type(oop value); ScopeValue* get_scope_value(oop value, BasicType type, GrowableArray* objects, ScopeValue* &second); MonitorValue* get_monitor_value(oop value, GrowableArray* objects); // extract the fields of the CompilationResult - void initialize_fields(oop target_method); + void initialize_fields(oop target, oop target_method); void initialize_dependencies(oop target_method); int estimate_stub_entries(); diff -r bab91f9ae795 -r ca418f35d728 src/share/vm/jvmci/jvmciJavaAccess.hpp --- a/src/share/vm/jvmci/jvmciJavaAccess.hpp Tue Sep 08 17:10:38 2015 +0200 +++ b/src/share/vm/jvmci/jvmciJavaAccess.hpp Tue Sep 08 17:43:41 2015 +0200 @@ -49,7 +49,7 @@ #define COMPILER_CLASSES_DO(start_class, end_class, char_field, int_field, boolean_field, long_field, float_field, oop_field, typeArrayOop_field, objArrayOop_field, static_oop_field, static_objArrayOop_field, static_int_field, static_boolean_field) \ start_class(Architecture) \ - oop_field(Architecture, name, "Ljava/lang/String;") \ + oop_field(Architecture, wordKind, "Ljdk/internal/jvmci/meta/PlatformKind;") \ end_class \ start_class(TargetDescription) \ oop_field(TargetDescription, arch, "Ljdk/internal/jvmci/code/Architecture;") \