diff options
author | Evan Shaw <chickencha@gmail.com> | 2010-01-06 19:28:19 -0800 |
---|---|---|
committer | Evan Shaw <chickencha@gmail.com> | 2010-01-06 19:28:19 -0800 |
commit | 89f4e62ace7fef808b1ea0fb3b0fc8082a08c69c (patch) | |
tree | 9751c6b3affb410a44e3807ad4aeaaf0fb95d6b8 | |
parent | dd576f40d68134126e049626a1abbc2d35181f42 (diff) | |
download | golang-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.c | 12 |
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); |