]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6g, cmd/8g: fix, test byte-sized magic multiply
authorRuss Cox <rsc@golang.org>
Mon, 11 Aug 2014 19:24:36 +0000 (15:24 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 11 Aug 2014 19:24:36 +0000 (15:24 -0400)
Credit to Rémy for finding and writing test case.

Fixes #8325.

LGTM=r
R=golang-codereviews, r
CC=dave, golang-codereviews, iant, remyoudompheng
https://golang.org/cl/124950043

src/cmd/6g/ggen.c
src/cmd/6g/peep.c
src/cmd/8g/ggen.c
src/cmd/8g/peep.c
test/fixedbugs/issue8325.go [new file with mode: 0644]

index c385798f2e275a7bf3594a7dfcf92f03b565ec4b..9665d831b33784d496f4682bf8f06d3fed5fbf1e 100644 (file)
@@ -943,7 +943,7 @@ cgen_hmul(Node *nl, Node *nr, Node *res)
        if(t->width == 1) {
                // byte multiply behaves differently.
                nodreg(&ax, t, D_AH);
-               nodreg(&dx, t, D_DL);
+               nodreg(&dx, t, D_DX);
                gmove(&ax, &dx);
        }
        nodreg(&dx, t, D_DX);
index 0f27204434fa87997e18b59009800c4afa4f14a9..24617836fed1bbc033a566a83543a7cb78cc15c6 100644 (file)
@@ -838,6 +838,11 @@ copyu(Prog *p, Adr *v, Adr *s)
 static int
 copyas(Adr *a, Adr *v)
 {
+       if(D_AL <= a->type && a->type <= D_R15B)
+               fatal("use of byte register");
+       if(D_AL <= v->type && v->type <= D_R15B)
+               fatal("use of byte register");
+
        if(a->type != v->type)
                return 0;
        if(regtyp(v))
index 2285a04e61cb38c6d8f8beefa9be1e91bf834b18..5e314048063ebdbbabf5fb21b93a980c7fb91cb4 100644 (file)
@@ -991,7 +991,7 @@ cgen_hmul(Node *nl, Node *nr, Node *res)
        if(t->width == 1) {
                // byte multiply behaves differently.
                nodreg(&ax, t, D_AH);
-               nodreg(&dx, t, D_DL);
+               nodreg(&dx, t, D_DX);
                gmove(&ax, &dx);
        }
        nodreg(&dx, t, D_DX);
index d88987f9540dc783646d18089d05f93a4b05ce3e..35129a7c46bf0eba1bbb3d36c806ffa3918d4c08 100644 (file)
@@ -636,6 +636,11 @@ copyu(Prog *p, Adr *v, Adr *s)
 static int
 copyas(Adr *a, Adr *v)
 {
+       if(D_AL <= a->type && a->type <= D_R15B)
+               fatal("use of byte register");
+       if(D_AL <= v->type && v->type <= D_R15B)
+               fatal("use of byte register");
+
        if(a->type != v->type)
                return 0;
        if(regtyp(v))
diff --git a/test/fixedbugs/issue8325.go b/test/fixedbugs/issue8325.go
new file mode 100644 (file)
index 0000000..e22fd31
--- /dev/null
@@ -0,0 +1,31 @@
+// run
+
+// Copyright 2014 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.
+
+// Issue 8325: corrupted byte operations during optimization
+// pass.
+
+package main
+
+const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+
+func main() {
+       var bytes = []byte{10, 20, 30, 40, 50}
+
+       for i, b := range bytes {
+               bytes[i] = alphanum[b%byte(len(alphanum))]
+       }
+
+       for _, b := range bytes {
+               switch {
+               case '0' <= b && b <= '9',
+                       'A' <= b && b <= 'Z':
+               default:
+                       println("found a bad character", string(b))
+                       panic("BUG")
+               }
+
+       }
+}