diff src/share/vm/graal/graalCodeInstaller.cpp @ 16645:8c70d65ec04a

[SPARC] Fix issues when deoptimizing with floats in local scope. # SIGSEGV (0xb) at pc=0xffffffff35d71608, pid=2280, tid=2 # V [libjvm.so+0x1871608] StackValue*StackValue::create_stack_value(const frame*,const RegisterMap*,ScopeValue*)+0x360
author Stefan Anzinger <stefan.anzinger@gmail.com>
date Fri, 25 Jul 2014 20:54:28 -0700
parents 9a07bf8467a6
children e7b7a5be4d21
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Fri Jul 25 20:48:28 2014 -0700
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Fri Jul 25 20:54:28 2014 -0700
@@ -68,6 +68,11 @@
       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;
   }
@@ -129,6 +134,13 @@
       }
     }
 #endif
+#ifdef TARGET_ARCH_sparc
+    for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
+      VMReg reg = as_FloatRegister(i)->as_VMReg();
+      int idx = RegisterImpl::number_of_registers + i;
+      set_vmreg_oops(map, reg, register_map, idx);
+    }
+#endif
   }
 
   for (jint i = 0; i < bitset_size(frame_map) / 3; i++) {
@@ -210,6 +222,7 @@
 
   if (value->is_a(RegisterValue::klass())) {
     jint number = code_Register::number(RegisterValue::reg(value));
+    jint encoding = code_Register::encoding(RegisterValue::reg(value));
     if (number < RegisterImpl::number_of_registers) {
       if (type == T_INT || type == T_FLOAT || type == T_SHORT || type == T_CHAR || type == T_BOOLEAN || type == T_BYTE || type == T_ADDRESS) {
         locationType = Location::int_in_long;
@@ -239,9 +252,9 @@
       return value;
 #else
 #ifdef TARGET_ARCH_sparc
-      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(number)->as_VMReg()));
+      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(encoding)->as_VMReg()));
       if (type == T_DOUBLE) {
-        second = value;
+        second = new ConstantIntValue(0);
       }
       return value;
 #else