diff options
| author | Kai Backman <kaib@golang.org> | 2009-12-17 16:08:42 -0800 |
|---|---|---|
| committer | Kai Backman <kaib@golang.org> | 2009-12-17 16:08:42 -0800 |
| commit | d85bb81878c06867e1bc7130ffa3db129b32f0f2 (patch) | |
| tree | d273c4b57a73dc3ace6b68a47038e315b3a1a9a6 /src/cmd/5l/softfloat.c | |
| parent | 4ddcb0ea738c181070039db8d9fed9f81958424c (diff) | |
| download | go-d85bb81878c06867e1bc7130ffa3db129b32f0f2.tar.xz | |
first stub for softfloats, intercepts float instructions and skips
them in the stream.
R=rsc
https://golang.org/cl/174052
Diffstat (limited to 'src/cmd/5l/softfloat.c')
| -rw-r--r-- | src/cmd/5l/softfloat.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/cmd/5l/softfloat.c b/src/cmd/5l/softfloat.c new file mode 100644 index 0000000000..f5a146feb0 --- /dev/null +++ b/src/cmd/5l/softfloat.c @@ -0,0 +1,70 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#define EXTERN +#include "l.h" + +void +softfloat() +{ + Prog *p, *prev, *psfloat; + Sym *symsfloat; + int wasfloat; + + symsfloat = lookup("_sfloat", 0); + psfloat = P; + if(symsfloat->type == STEXT) + for(p = firstp; p != P; p = p->link) { + if(p->as == ATEXT) { + if(p->from.sym == symsfloat) { + psfloat = p; + break; + } + } + } + + wasfloat = 0; + p = firstp; + prev = P; + for(p = firstp; p != P; p = p->link) { + switch(p->as) { + case AMOVWD: + case AMOVWF: + case AMOVDW: + case AMOVFW: + case AMOVFD: + case AMOVDF: + case AMOVF: + case AMOVD: + case ACMPF: + case ACMPD: + case AADDF: + case AADDD: + case ASUBF: + case ASUBD: + case AMULF: + case AMULD: + case ADIVF: + case ADIVD: + if (psfloat == P) + diag("floats used with _sfloat not defined"); + if (!wasfloat) { + if (prev == P) + diag("float instruction without predecessor TEXT"); + // BL _sfloat(SB) + prev = appendp(prev); + prev->as = ABL; + prev->to.type = D_BRANCH; + prev->to.sym = symsfloat; + prev->cond = psfloat; + + wasfloat = 1; + } + break; + default: + wasfloat = 0; + } + prev = p; + } +} |
