]> Cypherpunks repositories - gostls13.git/commitdiff
8g: float->uint64 conversion optimization
authorEvan Shaw <chickencha@gmail.com>
Thu, 7 Jan 2010 03:28:19 +0000 (19:28 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 7 Jan 2010 03:28:19 +0000 (19:28 -0800)
Using FUCOMIP instead of the FUCOMP-FSTSW-SAHF sequence gives better performance and saves code space.

R=rsc
CC=golang-dev
https://golang.org/cl/183139

src/cmd/8g/gsubr.c

index 4625509e9d74929316761f781ce908d0b811257c..2b94824996ab1ad9f0cffd4a89d7b986df75009f 100644 (file)
@@ -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);