# HG changeset patch # User Doug Simon # Date 1355739121 -3600 # Node ID a6bd253a770f6bc8328f0797bfa5cc9ca4a52b22 # Parent 911872d97f65d5208b8579ee1b0fc14d4e3ea117 expanded LOG_PRINTF stub to handle up to 3 arguments in addition to the format string diff -r 911872d97f65 -r a6bd253a770f graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- 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, diff -r 911872d97f65 -r a6bd253a770f graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Log.java --- 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) { diff -r 911872d97f65 -r a6bd253a770f src/cpu/x86/vm/graalRuntime_x86.cpp --- 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(); diff -r 911872d97f65 -r a6bd253a770f src/share/vm/graal/graalRuntime.cpp --- 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)) diff -r 911872d97f65 -r a6bd253a770f src/share/vm/graal/graalRuntime.hpp --- 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);