diff options
author | Kai Backman <kaib@golang.org> | 2010-04-06 22:17:24 +0300 |
---|---|---|
committer | Kai Backman <kaib@golang.org> | 2010-04-06 22:17:24 +0300 |
commit | 1719e738672bbb59e5a52495f48f1055c5b203a6 (patch) | |
tree | 9cc15f06f02d3ac1bdfc36743e13bc918c2d6c26 /src/cmd/5l/softfloat.c | |
parent | 23a55e9db34c1e439c2e244c072c003638184c1a (diff) | |
download | golang-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.c | 23 |
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; } } |