summary refs log tree commit diff
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2016-04-20 12:53:42 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2016-04-20 12:53:42 -0400
commit84bb28c0422c2d0dea555aeec946e73cf2b818a8 (patch)
treeaeb69859c0d986773f23335c22c07c295975525a
parent1258bb75d2941df4b2d56c38d14a97c57722e2e0 (diff)
downloadroux-84bb28c0422c2d0dea555aeec946e73cf2b818a8.tar.gz
support calls with no return
I thought it would be harder (and maybe it is).
My fear was that a call must be always followed by
a parallel move from machine registers (this is an
assumption in both spill and rega).  This however
remains true, because the ABI code generates a
dummy "copy RAX" by accident!
-rw-r--r--doc/il.txt2
-rw-r--r--parse.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/doc/il.txt b/doc/il.txt
index 14bd0c8..9179eda 100644
--- a/doc/il.txt
+++ b/doc/il.txt
@@ -709,7 +709,7 @@ single-precision floating point number `%f` into `%rs`.
 ~~~~~~
 
     `bnf
-    CALL := %IDENT '=' ( BASETY | :IDENT ) 'call' VAL PARAMS
+    CALL := [ %IDENT '=' ( BASETY | :IDENT ) ] 'call' VAL PARAMS
 
     PARAMS := '(' ( (BASETY | :IDENT) %IDENT ), ')'
 
diff --git a/parse.c b/parse.c
index 4c3a974..ed88114 100644
--- a/parse.c
+++ b/parse.c
@@ -508,7 +508,7 @@ parseline(PState ps)
 		err("label or } expected");
 	switch (t) {
 	default:
-		if (isstore(t)) {
+		if (isstore(t) || t == Tcall) {
 			/* operations without result */
 			r = R;
 			k = Kw;