Mercurial > hg > graal-compiler
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