changeset 22535:ca418f35d728

Use wordKind instead of Kind.Object in backend.
author Roland Schatz <roland.schatz@oracle.com>
date Tue, 08 Sep 2015 17:43:41 +0200
parents bab91f9ae795
children dc1aeef79e7e
files jvmci/jdk.internal.jvmci.amd64/src/jdk/internal/jvmci/amd64/AMD64.java jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Architecture.java jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/TargetDescription.java jvmci/jdk.internal.jvmci.hotspot.amd64/src/jdk/internal/jvmci/hotspot/amd64/AMD64HotSpotRegisterConfig.java jvmci/jdk.internal.jvmci.hotspot.sparc/src/jdk/internal/jvmci/hotspot/sparc/SPARCHotSpotRegisterConfig.java jvmci/jdk.internal.jvmci.meta/src/jdk/internal/jvmci/meta/LIRKind.java jvmci/jdk.internal.jvmci.sparc/src/jdk/internal/jvmci/sparc/SPARC.java src/share/vm/jvmci/jvmciCodeInstaller.cpp src/share/vm/jvmci/jvmciCodeInstaller.hpp src/share/vm/jvmci/jvmciJavaAccess.hpp
diffstat 10 files changed, 35 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- 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)) {
--- 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
--- 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) {
--- 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);
     }
 
--- 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:
--- 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);
     }
 
--- 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) {
--- 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() {
--- 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<ScopeValue*>* objects, ScopeValue* &second);
   MonitorValue* get_monitor_value(oop value, GrowableArray<ScopeValue*>* 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();
--- 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;")                                                                               \