]> Cypherpunks repositories - gostls13.git/commitdiff
6l/8l: emit correct opcodes to F(SUB|DIV)R?D.
authorAdam Langley <agl@golang.org>
Mon, 10 Sep 2012 19:35:39 +0000 (15:35 -0400)
committerAdam Langley <agl@golang.org>
Mon, 10 Sep 2012 19:35:39 +0000 (15:35 -0400)
When the destination was not F0, 6l and 8l swapped FSUBD/FSUBRD and
FDIVD/FDIVRD.

R=golang-dev, dave, rsc
CC=golang-dev
https://golang.org/cl/6498092

src/cmd/6l/optab.c
src/cmd/8l/optab.c
test/fixedbugs/bug453.dir/bug453.go [new file with mode: 0644]
test/fixedbugs/bug453.dir/bug453.s [new file with mode: 0644]
test/fixedbugs/bug453.dir/bug453_ref.go [new file with mode: 0644]
test/fixedbugs/bug453.go [new file with mode: 0644]

index 0716fa4453fec5e72eb7944535df502ab53af242..fc9db0f92bccc68327b67b50c526199a8a72766c 100644 (file)
@@ -1199,25 +1199,25 @@ Optab optab[] =
        { AFSUBW,       yfmvx,  Px, 0xde,(04) },
        { AFSUBL,       yfmvx,  Px, 0xda,(04) },
        { AFSUBF,       yfmvx,  Px, 0xd8,(04) },
-       { AFSUBD,       yfadd,  Px, 0xdc,(04),0xd8,(04),0xdc,(05) },
+       { AFSUBD,       yfadd,  Px, 0xdc,(04),0xd8,(04),0xdc,(04) },
 
        { AFSUBRDP,     yfaddp, Px, 0xde,(04) },
        { AFSUBRW,      yfmvx,  Px, 0xde,(05) },
        { AFSUBRL,      yfmvx,  Px, 0xda,(05) },
        { AFSUBRF,      yfmvx,  Px, 0xd8,(05) },
-       { AFSUBRD,      yfadd,  Px, 0xdc,(05),0xd8,(05),0xdc,(04) },
+       { AFSUBRD,      yfadd,  Px, 0xdc,(05),0xd8,(05),0xdc,(05) },
 
        { AFDIVDP,      yfaddp, Px, 0xde,(07) },
        { AFDIVW,       yfmvx,  Px, 0xde,(06) },
        { AFDIVL,       yfmvx,  Px, 0xda,(06) },
        { AFDIVF,       yfmvx,  Px, 0xd8,(06) },
-       { AFDIVD,       yfadd,  Px, 0xdc,(06),0xd8,(06),0xdc,(07) },
+       { AFDIVD,       yfadd,  Px, 0xdc,(06),0xd8,(06),0xdc,(06) },
 
        { AFDIVRDP,     yfaddp, Px, 0xde,(06) },
        { AFDIVRW,      yfmvx,  Px, 0xde,(07) },
        { AFDIVRL,      yfmvx,  Px, 0xda,(07) },
        { AFDIVRF,      yfmvx,  Px, 0xd8,(07) },
-       { AFDIVRD,      yfadd,  Px, 0xdc,(07),0xd8,(07),0xdc,(06) },
+       { AFDIVRD,      yfadd,  Px, 0xdc,(07),0xd8,(07),0xdc,(07) },
 
        { AFXCHD,       yfxch,  Px, 0xd9,(01),0xd9,(01) },
        { AFFREE },
index 7a588fca499089e2811874a1bd208dd986022a1a..a74b73ad2d3dbc93fa89043a82d29155dc7c4b61 100644 (file)
@@ -651,25 +651,25 @@ Optab optab[] =
        { AFSUBW,       yfmvx,  Px, 0xde,(04) },
        { AFSUBL,       yfmvx,  Px, 0xda,(04) },
        { AFSUBF,       yfmvx,  Px, 0xd8,(04) },
-       { AFSUBD,       yfadd,  Px, 0xdc,(04),0xd8,(04),0xdc,(05) },
+       { AFSUBD,       yfadd,  Px, 0xdc,(04),0xd8,(04),0xdc,(04) },
 
        { AFSUBRDP,     yfaddp, Px, 0xde,(04) },
        { AFSUBRW,      yfmvx,  Px, 0xde,(05) },
        { AFSUBRL,      yfmvx,  Px, 0xda,(05) },
        { AFSUBRF,      yfmvx,  Px, 0xd8,(05) },
-       { AFSUBRD,      yfadd,  Px, 0xdc,(05),0xd8,(05),0xdc,(04) },
+       { AFSUBRD,      yfadd,  Px, 0xdc,(05),0xd8,(05),0xdc,(05) },
 
        { AFDIVDP,      yfaddp, Px, 0xde,(07) },
        { AFDIVW,       yfmvx,  Px, 0xde,(06) },
        { AFDIVL,       yfmvx,  Px, 0xda,(06) },
        { AFDIVF,       yfmvx,  Px, 0xd8,(06) },
-       { AFDIVD,       yfadd,  Px, 0xdc,(06),0xd8,(06),0xdc,(07) },
+       { AFDIVD,       yfadd,  Px, 0xdc,(06),0xd8,(06),0xdc,(06) },
 
        { AFDIVRDP,     yfaddp, Px, 0xde,(06) },
        { AFDIVRW,      yfmvx,  Px, 0xde,(07) },
        { AFDIVRL,      yfmvx,  Px, 0xda,(07) },
        { AFDIVRF,      yfmvx,  Px, 0xd8,(07) },
-       { AFDIVRD,      yfadd,  Px, 0xdc,(07),0xd8,(07),0xdc,(06) },
+       { AFDIVRD,      yfadd,  Px, 0xdc,(07),0xd8,(07),0xdc,(07) },
 
        { AFXCHD,       yfxch,  Px, 0xd9,(01),0xd9,(01) },
        { AFFREE },
diff --git a/test/fixedbugs/bug453.dir/bug453.go b/test/fixedbugs/bug453.dir/bug453.go
new file mode 100644 (file)
index 0000000..04126b0
--- /dev/null
@@ -0,0 +1,22 @@
+// Copyright 2012 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.
+
+package main
+
+import (
+       "strconv"
+)
+
+// These functions are implemented in bug453.s
+func bug453a() float64
+func bug453b() float64
+
+func main() {
+       if v := bug453a(); v != -1 {
+               panic("a: bad result, want -1, got " + strconv.FormatFloat(v, 'f', -1, 64))
+       }
+       if v := bug453b(); v != 1 {
+               panic("b: bad result, want 1, got " + strconv.FormatFloat(v, 'f', -1, 64))
+       }
+}
diff --git a/test/fixedbugs/bug453.dir/bug453.s b/test/fixedbugs/bug453.dir/bug453.s
new file mode 100644 (file)
index 0000000..9c0196d
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2012 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.
+
+// +build amd64 386
+
+// func bug453a() float64
+TEXT ·bug453a(SB),7,$0
+        FLD1
+        FLD1
+        FADDD F1,F0
+
+        // This should subtract F0 (2) from F1 (1) and put -1 in F1.
+        FSUBRD F0,F1
+
+        FMOVDP  F0,r+0(FP)
+        FMOVDP  F0,r+0(FP)
+        RET
+
+// func bug453b() float64
+TEXT ·bug453b(SB),7,$0
+        FLD1
+        FLD1
+        FADDD F1,F0
+
+        // This should subtract F1 (1) from F0 (2) and put 1 in F1.
+        FSUBD F0,F1
+
+        FMOVDP  F0,r+0(FP)
+        FMOVDP  F0,r+0(FP)
+        RET
diff --git a/test/fixedbugs/bug453.dir/bug453_ref.go b/test/fixedbugs/bug453.dir/bug453_ref.go
new file mode 100644 (file)
index 0000000..f7a96d3
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2012 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.
+
+// +build !amd64,!386
+
+package main
+
+// These functions are standins for the functions in the .s file on other platforms.
+func bug453a() float64 {
+       return -1
+}
+func bug453b() float64 {
+       return 1
+}
diff --git a/test/fixedbugs/bug453.go b/test/fixedbugs/bug453.go
new file mode 100644 (file)
index 0000000..6fed2c2
--- /dev/null
@@ -0,0 +1,7 @@
+// compiledir
+
+// Copyright 2012 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.
+
+ignored