about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-03-09 14:16:11 -0500
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-03-09 14:16:11 -0500
commitaeca13894438af8876f88e26a4947b4e7627111d (patch)
treedc68b15ee7262ee0f384ec187e1ac223c73f0feb
parent50da3ea5bcf31d3c4784f2e5158fd1e7d74aa2d6 (diff)
downloadrust-aeca13894438af8876f88e26a4947b4e7627111d.tar.gz
rust-aeca13894438af8876f88e26a4947b4e7627111d.zip
swap taskptr and callee in preparation for making taskptr optional.
-rw-r--r--src/comp/back/x86.rs18
-rw-r--r--src/comp/middle/trans.rs6
2 files changed, 13 insertions, 11 deletions
diff --git a/src/comp/back/x86.rs b/src/comp/back/x86.rs
index 10227df7ca5..04f5d5af904 100644
--- a/src/comp/back/x86.rs
+++ b/src/comp/back/x86.rs
@@ -175,8 +175,11 @@ fn upcall_glue(int n_args) -> vec[str] {
      */
 
     fn copy_arg(uint i) -> str {
-        auto src_off = wstr(5 + (i as int));
-        auto dst_off = wstr(1 + (i as int));
+        if (i == 0u) {
+            ret "movl  %edx, (%esp)";
+        }
+        auto src_off = wstr(4 + (i as int));
+        auto dst_off = wstr(0 + (i as int));
         auto m = vec("movl  " + src_off + "(%ebp),%eax",
                      "movl  %eax," + dst_off + "(%esp)");
         ret _str.connect(m, "\n\t");
@@ -193,14 +196,13 @@ fn upcall_glue(int n_args) -> vec[str] {
         + load_esp_from_runtime_sp()
 
         + vec("subl  $" + wstr(n_args + 1) + ", %esp   # esp -= args",
-              "andl  $~0xf, %esp    # align esp down",
-              "movl  %ecx, (%esp)   # arg[0] = rust_task ")
+              "andl  $~0xf, %esp    # align esp down")
 
-        + _vec.init_fn[str](carg, n_args as uint)
+        + _vec.init_fn[str](carg, (n_args + 1) as uint)
 
-        +  vec("movl  %ecx, %edi     # save task from ecx to edi",
-               "call  *%edx          # call *%edx",
-               "movl  %edi, %ecx     # restore edi-saved task to ecx")
+        +  vec("movl  %edx, %edi     # save task from ecx to edi",
+               "call  *%ecx          # call *%edx",
+               "movl  %edi, %edx     # restore edi-saved task to ecx")
 
         + load_esp_from_rust_sp()
         + restore_callee_saves()
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 44dc57fdb71..5a50fbee037 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -831,8 +831,8 @@ fn decl_upcall_glue(ModuleRef llmod, type_names tn, uint _n) -> ValueRef {
     let int n = _n as int;
     let str s = abi.upcall_glue_name(n);
     let vec[TypeRef] args =
-        vec(T_taskptr(tn), // taskptr
-            T_int())     // callee
+        vec(T_int(),     // callee
+            T_taskptr(tn)) // taskptr
         + _vec.init_elt[TypeRef](T_int(), n as uint);
 
     ret decl_fastcall_fn(llmod, s, T_fn(args, T_int()));
@@ -856,7 +856,7 @@ fn trans_upcall(@block_ctxt cx, str name, vec[ValueRef] args) -> result {
     llupcall = llvm.LLVMConstPointerCast(llupcall, T_int());
 
     let ValueRef llglue = cx.fcx.ccx.glues.upcall_glues.(n);
-    let vec[ValueRef] call_args = vec(cx.fcx.lltaskptr, llupcall);
+    let vec[ValueRef] call_args = vec(llupcall, cx.fcx.lltaskptr);
 
     for (ValueRef a in args) {
         call_args += cx.build.ZExtOrBitCast(a, T_int());