From 72fa142fc54366f3009d47afd51bd031cc946454 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Mon, 10 Sep 2012 15:35:39 -0400 Subject: [PATCH] 6l/8l: emit correct opcodes to F(SUB|DIV)R?D. 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 | 8 +++---- src/cmd/8l/optab.c | 8 +++---- test/fixedbugs/bug453.dir/bug453.go | 22 ++++++++++++++++++ test/fixedbugs/bug453.dir/bug453.s | 31 +++++++++++++++++++++++++ test/fixedbugs/bug453.dir/bug453_ref.go | 15 ++++++++++++ test/fixedbugs/bug453.go | 7 ++++++ 6 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 test/fixedbugs/bug453.dir/bug453.go create mode 100644 test/fixedbugs/bug453.dir/bug453.s create mode 100644 test/fixedbugs/bug453.dir/bug453_ref.go create mode 100644 test/fixedbugs/bug453.go diff --git a/src/cmd/6l/optab.c b/src/cmd/6l/optab.c index 0716fa4453f..fc9db0f92bc 100644 --- a/src/cmd/6l/optab.c +++ b/src/cmd/6l/optab.c @@ -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 }, diff --git a/src/cmd/8l/optab.c b/src/cmd/8l/optab.c index 7a588fca499..a74b73ad2d3 100644 --- a/src/cmd/8l/optab.c +++ b/src/cmd/8l/optab.c @@ -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 index 00000000000..04126b05dfe --- /dev/null +++ b/test/fixedbugs/bug453.dir/bug453.go @@ -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 index 00000000000..9c0196dbbc9 --- /dev/null +++ b/test/fixedbugs/bug453.dir/bug453.s @@ -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 index 00000000000..f7a96d32d3e --- /dev/null +++ b/test/fixedbugs/bug453.dir/bug453_ref.go @@ -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 index 00000000000..6fed2c2abfd --- /dev/null +++ b/test/fixedbugs/bug453.go @@ -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