changeset 7235:a6bd253a770f

expanded LOG_PRINTF stub to handle up to 3 arguments in addition to the format string
author Doug Simon <doug.simon@oracle.com>
date Mon, 17 Dec 2012 11:12:01 +0100
parents 911872d97f65
children 579ee1eb0f30
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Log.java src/cpu/x86/vm/graalRuntime_x86.cpp src/share/vm/graal/graalRuntime.cpp src/share/vm/graal/graalRuntime.hpp
diffstat 5 files changed, 48 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Mon Dec 17 08:32:49 2012 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Mon Dec 17 11:12:01 2012 +0100
@@ -238,7 +238,9 @@
                         /*           temps */ null,
                         /*             ret */ ret(Kind.Void),
                         /* arg0:    format */ arg(0, Kind.Object),
-                        /* arg1:     value */ arg(1, Kind.Long));
+                        /* arg1:     value */ arg(1, Kind.Long),
+                        /* arg2:     value */ arg(2, Kind.Long),
+                        /* arg3:     value */ arg(3, Kind.Long));
 
         addRuntimeCall(LOG_OBJECT, config.logObjectStub,
                         /*           temps */ null,
--- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Log.java	Mon Dec 17 08:32:49 2012 +0100
+++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Log.java	Mon Dec 17 11:12:01 2012 +0100
@@ -39,7 +39,7 @@
 
     public static final Descriptor LOG_PRIMITIVE = new Descriptor("logPrimitive", false, Kind.Void, Kind.Int, Kind.Long, Kind.Boolean);
     public static final Descriptor LOG_OBJECT = new Descriptor("logObject", false, Kind.Void, Kind.Object, Kind.Int);
-    public static final Descriptor LOG_PRINTF = new Descriptor("logPrintf", false, Kind.Void, Kind.Object, Kind.Long);
+    public static final Descriptor LOG_PRINTF = new Descriptor("logPrintf", false, Kind.Void, Kind.Object, Kind.Long, Kind.Long, Kind.Long);
 
     // Note: Must be kept in sync with constants in c1_Runtime1.hpp
     private static final int LOG_OBJECT_NEWLINE = 0x01;
@@ -53,7 +53,7 @@
     private static native void log(@ConstantNodeParameter Descriptor logPrimitive, int typeChar, long value, boolean newline);
 
     @NodeIntrinsic(RuntimeCallNode.class)
-    private static native void printf(@ConstantNodeParameter Descriptor logPrintf, String format, long value);
+    private static native void printf(@ConstantNodeParameter Descriptor logPrintf, String format, long v1, long v2, long v3);
 
     public static void print(boolean value) {
         log(LOG_PRIMITIVE, Kind.Boolean.getTypeChar(), value ? 1L : 0L, false);
@@ -84,9 +84,16 @@
      *
      * @param format a C style printf format value that can contain at most one conversion specifier (i.e., a sequence
      *            of characters starting with '%').
+     * @param value the value associated with the conversion specifier
      */
     public static void printf(String format, long value) {
-        printf(LOG_PRINTF, format, value);
+        printf(LOG_PRINTF, format, value, 0L, 0L);
+    }
+    public static void printf(String format, long v1, long v2) {
+        printf(LOG_PRINTF, format, v1, v2, 0L);
+    }
+    public static void printf(String format, long v1, long v2, long v3) {
+        printf(LOG_PRINTF, format, v1, v2, v3);
     }
 
     public static void print(float value) {
--- a/src/cpu/x86/vm/graalRuntime_x86.cpp	Mon Dec 17 08:32:49 2012 +0100
+++ b/src/cpu/x86/vm/graalRuntime_x86.cpp	Mon Dec 17 11:12:01 2012 +0100
@@ -186,6 +186,36 @@
   return call_RT(oop_result1, metadata_result, entry, 3);
 }
 
+int GraalStubAssembler::call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1, Register arg2, Register arg3, Register arg4) {
+#ifdef _LP64
+  // if there is any conflict use the stack
+  if (arg1 == c_rarg2 || arg1 == c_rarg3 || arg1 == c_rarg4 ||
+      arg2 == c_rarg1 || arg2 == c_rarg3 || arg2 == c_rarg4 ||
+      arg3 == c_rarg1 || arg3 == c_rarg2 || arg3 == c_rarg4 ||
+      arg4 == c_rarg1 || arg4 == c_rarg2 || arg4 == c_rarg3) {
+    push(arg4);
+    push(arg3);
+    push(arg2);
+    push(arg1);
+    pop(c_rarg1);
+    pop(c_rarg2);
+    pop(c_rarg3);
+    pop(c_rarg4);
+  } else {
+    mov(c_rarg1, arg1);
+    mov(c_rarg2, arg2);
+    mov(c_rarg3, arg3);
+    mov(c_rarg4, arg4);
+  }
+#else
+  push(arg4);
+  push(arg3);
+  push(arg2);
+  push(arg1);
+#endif // _LP64
+  return call_RT(oop_result1, metadata_result, entry, 4);
+}
+
 // Implementation of GraalStubFrame
 
 class GraalStubFrame: public StackObj {
@@ -1022,7 +1052,7 @@
       __ enter();
       oop_maps = new OopMapSet();
       OopMap* oop_map = save_live_registers(sasm, 0);
-      int call_offset = __ call_RT(noreg, noreg, (address)graal_log_printf, j_rarg0, j_rarg1, j_rarg2);
+      int call_offset = __ call_RT(noreg, noreg, (address)graal_log_printf, j_rarg0, j_rarg1, j_rarg2, j_rarg3);
       oop_maps->add_gc_map(call_offset, oop_map);
       restore_live_registers(sasm);
       __ leave();
--- a/src/share/vm/graal/graalRuntime.cpp	Mon Dec 17 08:32:49 2012 +0100
+++ b/src/share/vm/graal/graalRuntime.cpp	Mon Dec 17 11:12:01 2012 +0100
@@ -551,11 +551,11 @@
   report_vm_error(__FILE__, __LINE__, error_msg, detail_msg);
 JRT_END
 
-JRT_ENTRY(void, GraalRuntime::graal_log_printf(JavaThread* thread, oop format, jlong val))
+JRT_ENTRY(void, GraalRuntime::graal_log_printf(JavaThread* thread, oop format, jlong v1, jlong v2, jlong v3))
   ResourceMark rm;
   assert(format != NULL && java_lang_String::is_instance(format), "must be");
   char *buf = java_lang_String::as_utf8_string(format);
-  tty->print(buf, val);
+  tty->print(buf, v1, v2, v3);
 JRT_END
 
 JRT_ENTRY(void, GraalRuntime::graal_log_primitive(JavaThread* thread, jchar typeChar, jlong value, jboolean newline))
--- a/src/share/vm/graal/graalRuntime.hpp	Mon Dec 17 08:32:49 2012 +0100
+++ b/src/share/vm/graal/graalRuntime.hpp	Mon Dec 17 11:12:01 2012 +0100
@@ -70,6 +70,7 @@
   int call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1);
   int call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1, Register arg2);
   int call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1, Register arg2, Register arg3);
+  int call_RT(Register oop_result1, Register metadata_result, address entry, Register arg1, Register arg2, Register arg3, Register arg4);
 };
 
 // set frame size and return address offset to these values in blobs
@@ -144,7 +145,7 @@
   static void graal_monitorenter(JavaThread* thread, oopDesc* obj, BasicLock* lock);
   static void graal_monitorexit (JavaThread* thread, oopDesc* obj, BasicLock* lock);
   static void graal_vm_error(JavaThread* thread, oop where, oop format, jlong value);
-  static void graal_log_printf(JavaThread* thread, oop format, jlong value);
+  static void graal_log_printf(JavaThread* thread, oop format, jlong v1, jlong v2, jlong v3);
   static void graal_log_primitive(JavaThread* thread, jchar typeChar, jlong value, jboolean newline);
   
   static jint graal_identity_hash_code(JavaThread* thread, oopDesc* objd);