Mercurial > hg > truffle
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 |