diff src/share/vm/graal/graalVMEntries.cpp @ 3563:8780fa370aab

Support runtime calls to targets that don't fit in a 32-bit immediate: allow to query the maximum offset of a CiRuntimeCall target to determine the required immediate size and patch call sites with a mov/call instruction pair for indirect calls
author Peter Hofer <peter.hofer@jku.at>
date Wed, 31 Aug 2011 14:55:40 +0200
parents f70a4cc629e7
children dbf8d6a4201f 76a7f1732bb0
line wrap: on
line diff
--- a/src/share/vm/graal/graalVMEntries.cpp	Tue Aug 30 11:08:56 2011 +0200
+++ b/src/share/vm/graal/graalVMEntries.cpp	Wed Aug 31 14:55:40 2011 +0200
@@ -749,6 +749,31 @@
   return JNIHandles::make_local(THREAD, GraalCompiler::get_RiType(klass, KlassHandle(), THREAD));
 }
 
+// public long getMaxCallTargetOffset(CiRuntimeCall rtcall);
+JNIEXPORT jlong JNICALL Java_com_oracle_graal_runtime_VMEntries_getMaxCallTargetOffset(JNIEnv *env, jobject, jobject rtcall) {
+  TRACE_graal_3("VMEntries::VMEntries_getMaxCallTargetOffset");
+  VM_ENTRY_MARK;
+  oop call = JNIHandles::resolve(rtcall);
+  address target_addr = 0x0;
+  if (call == CiRuntimeCall::ArithmeticSin()) {
+    target_addr = CAST_FROM_FN_PTR(address, SharedRuntime::dsin);
+  } else if (call == CiRuntimeCall::ArithmeticCos()) {
+    target_addr = CAST_FROM_FN_PTR(address, SharedRuntime::dcos);
+  } else if (call == CiRuntimeCall::ArithmeticTan()) {
+    target_addr = CAST_FROM_FN_PTR(address, SharedRuntime::dtan);
+  } else if (call == CiRuntimeCall::JavaTimeMillis()) {
+    target_addr = CAST_FROM_FN_PTR(address, os::javaTimeMillis);
+  } else if (call == CiRuntimeCall::JavaTimeNanos()) {
+    target_addr = CAST_FROM_FN_PTR(address, os::javaTimeNanos);
+  }
+  if (target_addr != 0x0) {
+    int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int));
+    int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int));
+    return MAX2(ABS(off_low), ABS(off_high));
+  }
+  return -1;
+}
+
 // public RiType getType(Class<?> javaClass);
 JNIEXPORT jobject JNICALL Java_com_oracle_graal_runtime_VMEntries_getType(JNIEnv *env, jobject, jobject javaClass) {
   TRACE_graal_3("VMEntries::VMEntries_getType");
@@ -941,6 +966,7 @@
 #define HS_METHOD       "Lcom/oracle/max/graal/runtime/HotSpotMethod;"
 #define CI_CONSTANT     "Lcom/sun/cri/ci/CiConstant;"
 #define CI_KIND         "Lcom/sun/cri/ci/CiKind;"
+#define CI_RUNTIME_CALL "Lcom/sun/cri/ci/CiRuntimeCall;"
 #define STRING          "Ljava/lang/String;"
 #define OBJECT          "Ljava/lang/Object;"
 #define CLASS           "Ljava/lang/Class;"
@@ -975,6 +1001,7 @@
   {CC"RiType_fields",                   CC"("RESOLVED_TYPE")["FIELD,                FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiType_1fields)},
   {CC"RiType_isInitialized",            CC"("RESOLVED_TYPE")Z",                     FN_PTR(Java_com_oracle_graal_runtime_VMEntries_RiType_1isInitialized)},
   {CC"getPrimitiveArrayType",           CC"("CI_KIND")"TYPE,                        FN_PTR(Java_com_oracle_graal_runtime_VMEntries_getPrimitiveArrayType)},
+  {CC"getMaxCallTargetOffset",          CC"("CI_RUNTIME_CALL")J",                   FN_PTR(Java_com_oracle_graal_runtime_VMEntries_getMaxCallTargetOffset)},
   {CC"getType",                         CC"("CLASS")"TYPE,                          FN_PTR(Java_com_oracle_graal_runtime_VMEntries_getType)},
   {CC"getConfiguration",                CC"()"CONFIG,                               FN_PTR(Java_com_oracle_graal_runtime_VMEntries_getConfiguration)},
   {CC"installMethod",                   CC"("TARGET_METHOD")V",                     FN_PTR(Java_com_oracle_graal_runtime_VMEntries_installMethod)},