aboutsummaryrefslogtreecommitdiff
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
commit29c6c09f71eca92e96c87d909ef0c09535b76a0e (patch)
tree962bcfe71eeddf852b3370b5f4418467e943277c /src/cmd/5l/softfloat.c
parentb26a7a2b884e334e4b1775b22f81230a755ad942 (diff)
downloadgo-29c6c09f71eca92e96c87d909ef0c09535b76a0e.tar.xz
replace original float instruction with jump to make branches
to float instructions work correctly. R=rsc CC=golang-dev https://golang.org/cl/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 f5a146feb0..82874ee1cf 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;
}
}