summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Shaw <chickencha@gmail.com>2010-01-06 19:28:19 -0800
committerEvan Shaw <chickencha@gmail.com>2010-01-06 19:28:19 -0800
commit89f4e62ace7fef808b1ea0fb3b0fc8082a08c69c (patch)
tree9751c6b3affb410a44e3807ad4aeaaf0fb95d6b8
parentdd576f40d68134126e049626a1abbc2d35181f42 (diff)
downloadgolang-89f4e62ace7fef808b1ea0fb3b0fc8082a08c69c.tar.gz
8g: float->uint64 conversion optimization
Using FUCOMIP instead of the FUCOMP-FSTSW-SAHF sequence gives better performance and saves code space. R=rsc CC=golang-dev http://codereview.appspot.com/183139 Committer: Russ Cox <rsc@golang.org>
-rw-r--r--src/cmd/8g/gsubr.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/src/cmd/8g/gsubr.c b/src/cmd/8g/gsubr.c
index 4625509e9..2b9482499 100644
--- a/src/cmd/8g/gsubr.c
+++ b/src/cmd/8g/gsubr.c
@@ -1350,15 +1350,11 @@ gmove(Node *f, Node *t)
// if 0 > v { answer = 0 }
gmove(&zerof, &f0);
- gins(AFUCOMP, &f0, &f1);
- gins(AFSTSW, N, &ax);
- gins(ASAHF, N, N);
+ gins(AFUCOMIP, &f0, &f1);
p1 = gbranch(optoas(OGT, types[tt]), T);
// if 1<<64 <= v { answer = 0 too }
gmove(&two64f, &f0);
- gins(AFUCOMP, &f0, &f1);
- gins(AFSTSW, N, &ax);
- gins(ASAHF, N, N);
+ gins(AFUCOMIP, &f0, &f1);
p2 = gbranch(optoas(OGT, types[tt]), T);
patch(p1, pc);
gins(AFMOVVP, &f0, t); // don't care about t, but will pop the stack
@@ -1382,9 +1378,7 @@ gmove(Node *f, Node *t)
// actual work
gmove(&two63f, &f0);
- gins(AFUCOMP, &f0, &f1);
- gins(AFSTSW, N, &ax);
- gins(ASAHF, N, N);
+ gins(AFUCOMIP, &f0, &f1);
p2 = gbranch(optoas(OLE, types[tt]), T);
gins(AFMOVVP, &f0, t);
p3 = gbranch(AJMP, T);