summaryrefslogtreecommitdiff
path: root/src/cmd/5l/softfloat.c
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2010-04-06 22:17:24 +0300
committerKai Backman <kaib@golang.org>2010-04-06 22:17:24 +0300
commit1719e738672bbb59e5a52495f48f1055c5b203a6 (patch)
tree9cc15f06f02d3ac1bdfc36743e13bc918c2d6c26 /src/cmd/5l/softfloat.c
parent23a55e9db34c1e439c2e244c072c003638184c1a (diff)
downloadgolang-1719e738672bbb59e5a52495f48f1055c5b203a6.tar.gz
replace original float instruction with jump to make branches
to float instructions work correctly. R=rsc CC=golang-dev http://codereview.appspot.com/870044
Diffstat (limited to 'src/cmd/5l/softfloat.c')
-rw-r--r--src/cmd/5l/softfloat.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/cmd/5l/softfloat.c b/src/cmd/5l/softfloat.c
index f5a146feb..82874ee1c 100644
--- a/src/cmd/5l/softfloat.c
+++ b/src/cmd/5l/softfloat.c
@@ -8,7 +8,7 @@
void
softfloat()
{
- Prog *p, *prev, *psfloat;
+ Prog *p, *next, *psfloat;
Sym *symsfloat;
int wasfloat;
@@ -26,7 +26,6 @@ softfloat()
wasfloat = 0;
p = firstp;
- prev = P;
for(p = firstp; p != P; p = p->link) {
switch(p->as) {
case AMOVWD:
@@ -50,21 +49,23 @@ softfloat()
if (psfloat == P)
diag("floats used with _sfloat not defined");
if (!wasfloat) {
- if (prev == P)
- diag("float instruction without predecessor TEXT");
+ next = prg();
+ *next = *p;
+
// BL _sfloat(SB)
- prev = appendp(prev);
- prev->as = ABL;
- prev->to.type = D_BRANCH;
- prev->to.sym = symsfloat;
- prev->cond = psfloat;
-
+ *p = zprg;
+ p->link = next;
+ p->as = ABL;
+ p->to.type = D_BRANCH;
+ p->to.sym = symsfloat;
+ p->cond = psfloat;
+
+ p = next;
wasfloat = 1;
}
break;
default:
wasfloat = 0;
}
- prev = p;
}
}