diff src/share/vm/graal/graalCodeInstaller.cpp @ 16996:6ea6d4c260c8

[SPARC/AMD64] Fixing handling of floatingpoint register handling
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Thu, 28 Aug 2014 16:47:43 -0700
parents 4e3b63e7a9f6
children 4e2d34d7715b
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Thu Aug 28 15:43:44 2014 -0700
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Thu Aug 28 16:47:43 2014 -0700
@@ -225,8 +225,11 @@
   BasicType type = GraalRuntime::kindToBasicType(Kind::typeChar(platformKind));
 
   if (value->is_a(RegisterValue::klass())) {
-    jint number = code_Register::number(RegisterValue::reg(value));
-    jint encoding = code_Register::encoding(RegisterValue::reg(value));
+    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) {
       Location::Type locationType;
       if (type == T_INT) {
@@ -256,15 +259,17 @@
         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(number - 16)->as_VMReg()));
+      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_XMMRegister(floatRegisterNumber)->as_VMReg()));
       if (type == T_DOUBLE) {
         second = value;
       }
       return value;
 #else
 #ifdef TARGET_ARCH_sparc
-      ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(encoding)->as_VMReg()));
+      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;
       }