# HG changeset patch # User Stefan Anzinger # Date 1409703386 25200 # Node ID 4e2d34d7715b591a38405ae4732643ecb4fed6c6 # Parent 586c1bdd73b81dbb33d19c8f4b63e4d764fb4ad3 [SPARC/AMD64] Splitting up oopmap generation for Intel XMM and SPARC Floatingpoint registers diff -r 586c1bdd73b8 -r 4e2d34d7715b src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp --- a/src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp Tue Sep 02 17:08:14 2014 -0700 +++ b/src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp Tue Sep 02 17:16:26 2014 -0700 @@ -25,6 +25,7 @@ #include "graal/graalRuntime.hpp" #include "graal/graalCompilerToVM.hpp" #include "graal/graalJavaAccess.hpp" +#include "vmreg_sparc.inline.hpp" jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method) { if (inst->is_call() || inst->is_jump()) { @@ -146,3 +147,22 @@ break; } } + +// convert Graal register indices (as used in oop maps) to HotSpot registers +VMReg CodeInstaller::get_hotspot_reg(jint graal_reg) { + if (graal_reg < RegisterImpl::number_of_registers) { + return as_Register(graal_reg)->as_VMReg(); + } else { + jint floatRegisterNumber = graal_reg - RegisterImpl::number_of_registers; + floatRegisterNumber += MAX2(0, floatRegisterNumber-32); // Beginning with f32, only every second register is going to be addressed + if (floatRegisterNumber < FloatRegisterImpl::number_of_registers) { + return as_FloatRegister(floatRegisterNumber)->as_VMReg(); + } + ShouldNotReachHere(); + return NULL; + } +} + +bool CodeInstaller::is_general_purpose_reg(VMReg hotspotRegister) { + return !hotspotRegister->is_FloatRegister(); +} diff -r 586c1bdd73b8 -r 4e2d34d7715b src/cpu/x86/vm/graalCodeInstaller_x86.cpp --- a/src/cpu/x86/vm/graalCodeInstaller_x86.cpp Tue Sep 02 17:08:14 2014 -0700 +++ b/src/cpu/x86/vm/graalCodeInstaller_x86.cpp Tue Sep 02 17:16:26 2014 -0700 @@ -32,6 +32,7 @@ #include "asm/register.hpp" #include "classfile/vmSymbols.hpp" #include "code/vmreg.hpp" +#include "vmreg_x86.inline.hpp" jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method) { if (inst->is_call() || inst->is_jump()) { @@ -209,3 +210,21 @@ break; } } + +// convert Graal register indices (as used in oop maps) to HotSpot registers +VMReg CodeInstaller::get_hotspot_reg(jint graal_reg) { + if (graal_reg < RegisterImpl::number_of_registers) { + return as_Register(graal_reg)->as_VMReg(); + } else { + jint floatRegisterNumber = graal_reg - RegisterImpl::number_of_registers; + if (floatRegisterNumber < XMMRegisterImpl::number_of_registers) { + return as_XMMRegister(floatRegisterNumber)->as_VMReg(); + } + ShouldNotReachHere(); + return NULL; + } +} + +bool CodeInstaller::is_general_purpose_reg(VMReg hotspotRegister) { + return !(hotspotRegister->is_FloatRegister() || hotspotRegister->is_XMMRegister()); +} diff -r 586c1bdd73b8 -r 4e2d34d7715b src/share/vm/graal/graalCodeInstaller.cpp --- 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; diff -r 586c1bdd73b8 -r 4e2d34d7715b src/share/vm/graal/graalCodeInstaller.hpp --- a/src/share/vm/graal/graalCodeInstaller.hpp Tue Sep 02 17:08:14 2014 -0700 +++ b/src/share/vm/graal/graalCodeInstaller.hpp Tue Sep 02 17:16:26 2014 -0700 @@ -86,12 +86,15 @@ void pd_relocate_JavaMethod(oop method, jint pc_offset); void pd_relocate_poll(address pc, jint mark); + public: CodeInstaller() {}; GraalEnv::CodeInstallResult install(Handle& compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log); static address runtime_call_target_address(oop runtime_call); + static VMReg get_hotspot_reg(jint graalRegisterNumber); + static bool is_general_purpose_reg(VMReg hotspotRegister); protected: @@ -131,4 +134,6 @@ */ Method* getMethodFromHotSpotMethod(oop hotspot_method); + + #endif // SHARE_VM_GRAAL_GRAAL_CODE_INSTALLER_HPP