aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/5l/softfloat.c
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-12-17 16:08:42 -0800
committerKai Backman <kaib@golang.org>2009-12-17 16:08:42 -0800
commitd85bb81878c06867e1bc7130ffa3db129b32f0f2 (patch)
treed273c4b57a73dc3ace6b68a47038e315b3a1a9a6 /src/cmd/5l/softfloat.c
parent4ddcb0ea738c181070039db8d9fed9f81958424c (diff)
downloadgo-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.c70
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;
+ }
+}