aboutsummaryrefslogtreecommitdiff
path: root/src/comp/back
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-11-14 13:41:10 -0800
committerGraydon Hoare <[email protected]>2010-11-14 13:41:10 -0800
commita352efadad7271798848c6ef4a22d8de7c8eba3a (patch)
tree13e38ac987a13c1b5cf27d1c949275af68808c36 /src/comp/back
parentRemove outptr from module-internal calls; use standard ABI returns. (diff)
downloadrust-a352efadad7271798848c6ef4a22d8de7c8eba3a.tar.xz
rust-a352efadad7271798848c6ef4a22d8de7c8eba3a.zip
Switch upcall glues to fastcall as well.
Diffstat (limited to 'src/comp/back')
-rw-r--r--src/comp/back/x86.rs21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/comp/back/x86.rs b/src/comp/back/x86.rs
index 961624f3..a2a8d5cc 100644
--- a/src/comp/back/x86.rs
+++ b/src/comp/back/x86.rs
@@ -70,16 +70,18 @@ fn upcall_glue(int n_args) -> vec[str] {
/*
* 0, 4, 8, 12 are callee-saves
* 16 is retpc
- * 20 is taskptr
- * 24 is callee
- * 28 .. (7+i) * 4 are args
+ * 20 .. (5+i) * 4 are args
+ *
+ * ecx is taskptr
+ * edx is callee
+ *
*/
fn copy_arg(uint i) -> str {
- auto src_off = wstr(7 + (i as int));
+ auto src_off = wstr(5 + (i as int));
auto dst_off = wstr(1 + (i as int));
- auto m = vec("movl " + src_off + "(%ebp),%edx",
- "movl %edx," + dst_off + "(%esp)");
+ auto m = vec("movl " + src_off + "(%ebp),%eax",
+ "movl %eax," + dst_off + "(%esp)");
ret _str.connect(m, "\n\t");
}
@@ -88,8 +90,7 @@ fn upcall_glue(int n_args) -> vec[str] {
ret
save_callee_saves()
- + vec("movl %esp, %ebp # ebp = rust_sp",
- "movl 20(%esp), %ecx # ecx = rust_task")
+ + vec("movl %esp, %ebp # ebp = rust_sp")
+ store_esp_to_rust_sp()
+ load_esp_from_runtime_sp()
@@ -100,9 +101,9 @@ fn upcall_glue(int n_args) -> vec[str] {
+ _vec.init_fn[str](carg, n_args as uint)
- + vec("movl 24(%ebp), %edx # edx = callee",
+ + vec("movl %ecx, %edi # save task from ecx to edi",
"call *%edx # call *%edx",
- "movl 20(%ebp), %ecx # edx = rust_task")
+ "movl %edi, %ecx # restore edi-saved task to ecx")
+ load_esp_from_rust_sp()
+ restore_callee_saves()