Index: src/cmd/5g/cgen.c |
=================================================================== |
--- a/src/cmd/5g/cgen.c |
+++ b/src/cmd/5g/cgen.c |
@@ -16,7 +16,7 @@ |
{ |
Node *nl, *nr, *r; |
Node n1, n2, n3, f0, f1; |
- int a, w; |
+ int a, w, rg; |
Prog *p1, *p2, *p3; |
Addr addr; |
@@ -406,7 +406,22 @@ |
break; |
case OCALLMETH: |
- cgen_callmeth(n, 0); |
+ case OCALLFUNC: |
+ // Release res so that it is available for cgen_call. |
+ // Pick it up again after the call. |
+ rg = -1; |
+ if(n->ullman >= UINF) { |
+ if(res->op == OREGISTER || res->op == OINDREG) { |
+ rg = res->val.u.reg; |
+ reg[rg]--; |
+ } |
+ } |
+ if(n->op == OCALLMETH) |
+ cgen_callmeth(n, 0); |
+ else |
+ cgen_call(n, 0); |
+ if(rg >= 0) |
+ reg[rg]++; |
cgen_callret(n, res); |
break; |
@@ -415,11 +430,6 @@ |
cgen_callret(n, res); |
break; |
- case OCALLFUNC: |
- cgen_call(n, 0); |
- cgen_callret(n, res); |
- break; |
- |
case OMOD: |
case ODIV: |
a = optoas(n->op, nl->type); |