changeset 7742:9f8bf17b2d33

Remove hardcoding of x86 registers in the Graal code installer.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Thu, 07 Feb 2013 18:01:08 +0100
parents e72cdc425cf4
children 7732a91e5f6d
files src/share/vm/graal/graalCodeInstaller.cpp
diffstat 1 files changed, 31 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Thu Feb 07 17:37:32 2013 +0100
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Thu Feb 07 18:01:08 2013 +0100
@@ -31,27 +31,38 @@
 #include "graal/graalCompilerToVM.hpp"
 #include "graal/graalVmIds.hpp"
 #include "graal/graalRuntime.hpp"
+#include "asm/register.hpp"
 #include "classfile/vmSymbols.hpp"
-#include "vmreg_x86.inline.hpp"
-
+#include "code/vmreg.hpp"
 
-// TODO this should be handled in a more robust way - not hard coded...
-Register CPU_REGS[] = { rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15 };
-bool OOP_ALLOWED[] = {true, true, true, true, false, false, true, true, true, true, false, true, true, true, true, true};
-const static int NUM_CPU_REGS = sizeof(CPU_REGS) / sizeof(Register);
-XMMRegister XMM_REGS[] = { xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15 };
-const static int NUM_XMM_REGS = sizeof(XMM_REGS) / sizeof(XMMRegister);
-const static int NUM_REGS = NUM_CPU_REGS + NUM_XMM_REGS;
-const static jlong NO_REF_MAP = 0x8000000000000000L;
+#ifdef TARGET_ARCH_x86
+# include "vmreg_x86.inline.hpp"
+#endif
+#ifdef TARGET_ARCH_sparc
+# include "vmreg_sparc.inline.hpp"
+#endif
+#ifdef TARGET_ARCH_zero
+# include "vmreg_zero.inline.hpp"
+#endif
+#ifdef TARGET_ARCH_arm
+# include "vmreg_arm.inline.hpp"
+#endif
+#ifdef TARGET_ARCH_ppc
+# include "vmreg_ppc.inline.hpp"
+#endif
 
 // convert Graal register indices (as used in oop maps) to HotSpot registers
 VMReg get_hotspot_reg(jint graal_reg) {
-
-  assert(graal_reg >= 0 && graal_reg < NUM_REGS, "invalid register number");
-  if (graal_reg < NUM_CPU_REGS) {
-    return CPU_REGS[graal_reg]->as_VMReg();
+  if (graal_reg < RegisterImpl::number_of_registers) {
+    return as_Register(graal_reg)->as_VMReg();
   } else {
-    return XMM_REGS[graal_reg - NUM_CPU_REGS]->as_VMReg();
+    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
+    ShouldNotReachHere();
   }
 }
 
@@ -77,11 +88,10 @@
   oop frame_map = (oop) DebugInfo::frameRefMap(debug_info);
 
   if (register_map != NULL) {
-    for (jint i = 0; i < NUM_CPU_REGS; i++) {
+    for (jint i = 0; i < RegisterImpl::number_of_registers; i++) {
       bool is_oop = is_bit_set(register_map, i);
       VMReg reg = get_hotspot_reg(i);
       if (is_oop) {
-        assert(OOP_ALLOWED[i], "this register may never be an oop, register map misaligned?");
         map->set_oop(reg);
       } else {
         map->set_value(reg);
@@ -157,11 +167,15 @@
       } else {
         locationType = Location::dbl;
       }
+#ifdef TARGET_ARCH_x86
       ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_XMMRegister(number - 16)->as_VMReg()));
       if (type == T_DOUBLE) {
         second = value;
       }
       return value;
+#else
+      ShouldNotReachHere("Platform currently does not support floating point values.");
+#endif
     }
   } else if (value->is_a(StackSlot::klass())) {
     if (type == T_DOUBLE) {