]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] cmd/9c: fix endian issue in integer to floating point conversion
authorShenghou Ma <minux@golang.org>
Wed, 13 Aug 2014 00:58:05 +0000 (20:58 -0400)
committerShenghou Ma <minux@golang.org>
Wed, 13 Aug 2014 00:58:05 +0000 (20:58 -0400)
LGTM=rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/129850043

src/cmd/9c/txt.c

index 345976cf203d53cbefc61e75e68094137c051a52..84aeb4d8a94d823a8ba279369bf21b2ee0374f95 100644 (file)
@@ -962,13 +962,22 @@ gmove(Node *f, Node *t)
                        regsalloc(&fxrat, t);   /* should be type float */
                        gins(AMOVW, nodconst(0x43300000L), &fxc0);
                        gins(AMOVW, f, &fxc2);
-                       gins(AMOVW, &fxc0, &fxrat);
                        gins(AXOR, nodconst(0x80000000L), &fxc2);
-                       fxc1 = fxrat;
-                       fxc1.type = nodrat->type;
-                       fxc1.etype = nodrat->etype;
-                       fxc1.xoffset += SZ_LONG;
-                       gins(AMOVW, &fxc2, &fxc1);
+                       if(ctxt->arch->endian == BigEndian) {
+                               gins(AMOVW, &fxc0, &fxrat);
+                               fxc1 = fxrat;
+                               fxc1.type = nodrat->type;
+                               fxc1.etype = nodrat->etype;
+                               fxc1.xoffset += SZ_LONG;
+                               gins(AMOVW, &fxc2, &fxc1);
+                       } else {
+                               gins(AMOVW, &fxc2, &fxrat);
+                               fxc1 = fxrat;
+                               fxc1.type = nodrat->type;
+                               fxc1.etype = nodrat->etype;
+                               fxc1.xoffset += SZ_LONG;
+                               gins(AMOVW, &fxc0, &fxc1);
+                       }
                        regfree(&fxc2);
                        regfree(&fxc0);
                        regalloc(&nod, t, t);   /* should be type float */