shithub: mc

Download patch

ref: 1a2c2337f0d396de9433341d799b99882635bcac
parent: bf18e66ef2986eb84e884297404c38da668ab7a2
author: Ori Bernstein <[email protected]>
date: Thu Feb 20 19:03:11 EST 2014

Fix subsequent function calls.

    Icall was failing to clobber all return register sizes, meaning that
    multiple calls without stack stores, and different return sizes,
    would step on each other's return values.

--- a/6/insns.def
+++ b/6/insns.def
@@ -77,8 +77,8 @@
 Insn(Ixorp,      "\tmuls%t %x,%f\n",            Use(.l={1,2}),                  Def(.l={2}))
 
 /* branch instructions */
-Insn(Icall,     "\tcall %v\n",                  Use(.l={1}), Def(.r={Rrax}))
-Insn(Icallind,  "\tcall *%v\n",                 Use(.l={1}), Def(.r={Rrax}))
+Insn(Icall,     "\tcall %v\n",                  Use(.l={1}), Def(.r={Rrax,Reax,Rax,Ral,Rah}))
+Insn(Icallind,  "\tcall *%v\n",                 Use(.l={1}), Def(.r={Rrax,Reax,Rax,Ral,Rah}))
 Insn(Ijmp,      "\tjmp %v\n",                   Use(.l={1}), Def())
 Insn(Ijz,       "\tjz %v\n",                    Use(.l={1}), Def())
 Insn(Ijnz,      "\tjnz %v\n",                   Use(.l={1}), Def())
--- /dev/null
+++ b/test/doublecall.myr
@@ -1,0 +1,13 @@
+use std
+
+const main = {
+	std.put("%i,%w\n", a(), b())
+}
+
+const a = {
+	-> 42
+}
+
+const b = {
+	-> 33 castto(int16)
+}
--- a/test/tests
+++ b/test/tests
@@ -52,6 +52,7 @@
 B slice		E	10
 B slicelen	E	5
 B call		E	42
+B doublecall	P	42,33
 B voidcall	E	12
 B callbig	E	42
 B nestfn	E	42