Mercurial > hg > truffle
diff src/share/vm/graal/graalCodeInstaller.cpp @ 17024:4e2d34d7715b
[SPARC/AMD64] Splitting up oopmap generation for Intel XMM and SPARC Floatingpoint registers
author | Stefan Anzinger <stefan.anzinger@oracle.com> |
---|---|
date | Tue, 02 Sep 2014 17:16:26 -0700 |
parents | 6ea6d4c260c8 |
children | 26f5733fb645 |
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp Tue Sep 02 17:08:14 2014 -0700 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Tue Sep 02 17:16:26 2014 -0700 @@ -57,27 +57,6 @@ return asMethod(HotSpotResolvedJavaMethod::metaspaceMethod(hotspot_method)); } -// convert Graal register indices (as used in oop maps) to HotSpot registers -VMReg get_hotspot_reg(jint graal_reg) { - if (graal_reg < RegisterImpl::number_of_registers) { - return as_Register(graal_reg)->as_VMReg(); - } else { - int remainder = graal_reg - RegisterImpl::number_of_registers; -#ifdef TARGET_ARCH_x86 - if (remainder < XMMRegisterImpl::number_of_registers) { - 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; - } -} - const int MapWordBits = 64; static bool is_bit_set(oop bitset, int i) { @@ -155,7 +134,7 @@ for (jint i = 0; i < slots->length(); i++) { oop graal_reg = registers->obj_at(i); jint graal_reg_number = code_Register::number(graal_reg); - VMReg hotspot_reg = get_hotspot_reg(graal_reg_number); + VMReg hotspot_reg = CodeInstaller::get_hotspot_reg(graal_reg_number); // HotSpot stack slots are 4 bytes jint graal_slot = ((jint*) slots->base(T_INT))[i]; jint hotspot_slot = graal_slot * VMRegImpl::slots_per_word; @@ -227,10 +206,8 @@ if (value->is_a(RegisterValue::klass())) { 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) { + VMReg hotspotRegister = get_hotspot_reg(number); + if (is_general_purpose_reg(hotspotRegister)) { Location::Type locationType; if (type == T_INT) { locationType = reference ? Location::narrowoop : Location::int_in_long; @@ -244,7 +221,7 @@ assert(type == T_OBJECT && reference, "unexpected type in cpu register"); locationType = Location::oop; } - ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_Register(number)->as_VMReg())); + ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister)); if (type == T_LONG && !reference) { second = value; } @@ -259,25 +236,11 @@ 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(floatRegisterNumber)->as_VMReg())); + ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister)); if (type == T_DOUBLE) { second = value; } return value; -#else -#ifdef TARGET_ARCH_sparc - 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; - } - return value; -#else - ShouldNotReachHere("Platform currently does not support floating point values."); -#endif -#endif } } else if (value->is_a(StackSlot::klass())) { Location::Type locationType;