diff src/cpu/x86/vm/graalRuntime_x86.cpp @ 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 8a3efb8c831d
children 707e9cca11de
line wrap: on
line diff
--- 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();