comparison 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
comparison
equal deleted inserted replaced
16995:4feac7e51f42 16996:6ea6d4c260c8
223 bool reference = referenceMask == 1; 223 bool reference = referenceMask == 1;
224 224
225 BasicType type = GraalRuntime::kindToBasicType(Kind::typeChar(platformKind)); 225 BasicType type = GraalRuntime::kindToBasicType(Kind::typeChar(platformKind));
226 226
227 if (value->is_a(RegisterValue::klass())) { 227 if (value->is_a(RegisterValue::klass())) {
228 jint number = code_Register::number(RegisterValue::reg(value)); 228 oop reg = RegisterValue::reg(value);
229 jint encoding = code_Register::encoding(RegisterValue::reg(value)); 229 jint number = code_Register::number(reg);
230 jint encoding = code_Register::encoding(reg);
231 oop registerCategory = code_Register::registerCategory(reg);
232 jint referenceMapOffset = RegisterCategory::referenceMapOffset(registerCategory);
230 if (number < RegisterImpl::number_of_registers) { 233 if (number < RegisterImpl::number_of_registers) {
231 Location::Type locationType; 234 Location::Type locationType;
232 if (type == T_INT) { 235 if (type == T_INT) {
233 locationType = reference ? Location::narrowoop : Location::int_in_long; 236 locationType = reference ? Location::narrowoop : Location::int_in_long;
234 } else if(type == T_SHORT || type == T_CHAR || type == T_BYTE || type == T_BOOLEAN) { 237 } else if(type == T_SHORT || type == T_CHAR || type == T_BYTE || type == T_BOOLEAN) {
254 locationType = Location::normal; 257 locationType = Location::normal;
255 } else { 258 } else {
256 locationType = Location::dbl; 259 locationType = Location::dbl;
257 } 260 }
258 assert(!reference, "unexpected type in floating point register"); 261 assert(!reference, "unexpected type in floating point register");
262 jint floatRegisterNumber = number - referenceMapOffset;
259 #ifdef TARGET_ARCH_x86 263 #ifdef TARGET_ARCH_x86
260 ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_XMMRegister(number - 16)->as_VMReg())); 264 ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_XMMRegister(floatRegisterNumber)->as_VMReg()));
261 if (type == T_DOUBLE) { 265 if (type == T_DOUBLE) {
262 second = value; 266 second = value;
263 } 267 }
264 return value; 268 return value;
265 #else 269 #else
266 #ifdef TARGET_ARCH_sparc 270 #ifdef TARGET_ARCH_sparc
267 ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(encoding)->as_VMReg())); 271 floatRegisterNumber += MAX2(0, floatRegisterNumber-32); // Beginning with f32, only every second register is going to be addressed
272 ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(floatRegisterNumber)->as_VMReg()));
268 if (type == T_DOUBLE) { 273 if (type == T_DOUBLE) {
269 second = value; 274 second = value;
270 } 275 }
271 return value; 276 return value;
272 #else 277 #else