changeset 17024:4e2d34d7715b

[SPARC/AMD64] Splitting up oopmap generation for Intel XMM and SPARC Floatingpoint registers
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Tue, 02 Sep 2014 17:16:26 -0700
parents 586c1bdd73b8
children b23172dcb8f7
files src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp src/cpu/x86/vm/graalCodeInstaller_x86.cpp src/share/vm/graal/graalCodeInstaller.cpp src/share/vm/graal/graalCodeInstaller.hpp
diffstat 4 files changed, 49 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp	Tue Sep 02 17:08:14 2014 -0700
+++ b/src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp	Tue Sep 02 17:16:26 2014 -0700
@@ -25,6 +25,7 @@
 #include "graal/graalRuntime.hpp"
 #include "graal/graalCompilerToVM.hpp"
 #include "graal/graalJavaAccess.hpp"
+#include "vmreg_sparc.inline.hpp"
 
 jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method) {
   if (inst->is_call() || inst->is_jump()) {
@@ -146,3 +147,22 @@
       break;
   }
 }
+
+// convert Graal register indices (as used in oop maps) to HotSpot registers
+VMReg CodeInstaller::get_hotspot_reg(jint graal_reg) {
+  if (graal_reg < RegisterImpl::number_of_registers) {
+    return as_Register(graal_reg)->as_VMReg();
+  } else {
+    jint floatRegisterNumber = graal_reg - RegisterImpl::number_of_registers;
+    floatRegisterNumber += MAX2(0, floatRegisterNumber-32); // Beginning with f32, only every second register is going to be addressed
+    if (floatRegisterNumber < FloatRegisterImpl::number_of_registers) {
+      return as_FloatRegister(floatRegisterNumber)->as_VMReg();
+    }
+    ShouldNotReachHere();
+    return NULL;
+  }
+}
+
+bool CodeInstaller::is_general_purpose_reg(VMReg hotspotRegister) {
+  return !hotspotRegister->is_FloatRegister();
+}
--- a/src/cpu/x86/vm/graalCodeInstaller_x86.cpp	Tue Sep 02 17:08:14 2014 -0700
+++ b/src/cpu/x86/vm/graalCodeInstaller_x86.cpp	Tue Sep 02 17:16:26 2014 -0700
@@ -32,6 +32,7 @@
 #include "asm/register.hpp"
 #include "classfile/vmSymbols.hpp"
 #include "code/vmreg.hpp"
+#include "vmreg_x86.inline.hpp"
 
 jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method) {
   if (inst->is_call() || inst->is_jump()) {
@@ -209,3 +210,21 @@
       break;
   }
 }
+
+// convert Graal register indices (as used in oop maps) to HotSpot registers
+VMReg CodeInstaller::get_hotspot_reg(jint graal_reg) {
+  if (graal_reg < RegisterImpl::number_of_registers) {
+    return as_Register(graal_reg)->as_VMReg();
+  } else {
+    jint floatRegisterNumber = graal_reg - RegisterImpl::number_of_registers;
+    if (floatRegisterNumber < XMMRegisterImpl::number_of_registers) {
+      return as_XMMRegister(floatRegisterNumber)->as_VMReg();
+    }
+    ShouldNotReachHere();
+    return NULL;
+  }
+}
+
+bool CodeInstaller::is_general_purpose_reg(VMReg hotspotRegister) {
+  return !(hotspotRegister->is_FloatRegister() || hotspotRegister->is_XMMRegister());
+}
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Tue Sep 02 17:08:14 2014 -0700
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Tue Sep 02 17:16:26 2014 -0700
@@ -57,27 +57,6 @@
   return asMethod(HotSpotResolvedJavaMethod::metaspaceMethod(hotspot_method));
 }
 
-// convert Graal register indices (as used in oop maps) to HotSpot registers
-VMReg get_hotspot_reg(jint graal_reg) {
-  if (graal_reg < RegisterImpl::number_of_registers) {
-    return as_Register(graal_reg)->as_VMReg();
-  } else {
-    int remainder = graal_reg - RegisterImpl::number_of_registers;
-#ifdef TARGET_ARCH_x86
-    if (remainder < XMMRegisterImpl::number_of_registers) {
-      return as_XMMRegister(remainder)->as_VMReg();
-    }
-#endif
-#ifdef TARGET_ARCH_sparc
-    if (remainder < FloatRegisterImpl::number_of_registers) {
-      return as_FloatRegister(remainder)->as_VMReg();
-    }
-#endif
-    ShouldNotReachHere();
-    return NULL;
-  }
-}
-
 const int MapWordBits = 64;
 
 static bool is_bit_set(oop bitset, int i) {
@@ -155,7 +134,7 @@
     for (jint i = 0; i < slots->length(); i++) {
       oop graal_reg = registers->obj_at(i);
       jint graal_reg_number = code_Register::number(graal_reg);
-      VMReg hotspot_reg = get_hotspot_reg(graal_reg_number);
+      VMReg hotspot_reg = CodeInstaller::get_hotspot_reg(graal_reg_number);
       // HotSpot stack slots are 4 bytes
       jint graal_slot = ((jint*) slots->base(T_INT))[i];
       jint hotspot_slot = graal_slot * VMRegImpl::slots_per_word;
@@ -227,10 +206,8 @@
   if (value->is_a(RegisterValue::klass())) {
     oop reg = RegisterValue::reg(value);
     jint number = code_Register::number(reg);
-    jint encoding = code_Register::encoding(reg);
-    oop registerCategory = code_Register::registerCategory(reg);
-    jint referenceMapOffset = RegisterCategory::referenceMapOffset(registerCategory);
-    if (number < RegisterImpl::number_of_registers) {
+    VMReg hotspotRegister = get_hotspot_reg(number);
+    if (is_general_purpose_reg(hotspotRegister)) {
       Location::Type locationType;
       if (type == T_INT) {
         locationType = reference ? Location::narrowoop : Location::int_in_long;
@@ -244,7 +221,7 @@
         assert(type == T_OBJECT && reference, "unexpected type in cpu register");
         locationType = Location::oop;
       }
-      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_Register(number)->as_VMReg()));
+      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister));
       if (type == T_LONG && !reference) {
         second = value;
       }
@@ -259,25 +236,11 @@
         locationType = Location::dbl;
       }
       assert(!reference, "unexpected type in floating point register");
-      jint floatRegisterNumber = number - referenceMapOffset;
-#ifdef TARGET_ARCH_x86
-      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_XMMRegister(floatRegisterNumber)->as_VMReg()));
+      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister));
       if (type == T_DOUBLE) {
         second = value;
       }
       return value;
-#else
-#ifdef TARGET_ARCH_sparc
-      floatRegisterNumber += MAX2(0, floatRegisterNumber-32); // Beginning with f32, only every second register is going to be addressed
-      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(floatRegisterNumber)->as_VMReg()));
-      if (type == T_DOUBLE) {
-        second = value;
-      }
-      return value;
-#else
-      ShouldNotReachHere("Platform currently does not support floating point values.");
-#endif
-#endif
     }
   } else if (value->is_a(StackSlot::klass())) {
       Location::Type locationType;
--- a/src/share/vm/graal/graalCodeInstaller.hpp	Tue Sep 02 17:08:14 2014 -0700
+++ b/src/share/vm/graal/graalCodeInstaller.hpp	Tue Sep 02 17:16:26 2014 -0700
@@ -86,12 +86,15 @@
   void pd_relocate_JavaMethod(oop method, jint pc_offset);
   void pd_relocate_poll(address pc, jint mark);
 
+
 public:
 
   CodeInstaller() {};
   GraalEnv::CodeInstallResult install(Handle& compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log);
 
   static address runtime_call_target_address(oop runtime_call);
+  static VMReg get_hotspot_reg(jint graalRegisterNumber);
+  static bool is_general_purpose_reg(VMReg hotspotRegister);
 
 protected:
 
@@ -131,4 +134,6 @@
  */
 Method* getMethodFromHotSpotMethod(oop hotspot_method);
 
+
+
 #endif // SHARE_VM_GRAAL_GRAAL_CODE_INSTALLER_HPP