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