1
0
mirror of https://github.com/golang/go synced 2024-11-25 22:57:58 -07:00

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
This commit is contained in:
Adam Langley 2012-09-10 15:35:39 -04:00
parent a7743d7ad2
commit 72fa142fc5
6 changed files with 83 additions and 8 deletions

View File

@ -1199,25 +1199,25 @@ Optab optab[] =
{ AFSUBW, yfmvx, Px, 0xde,(04) }, { AFSUBW, yfmvx, Px, 0xde,(04) },
{ AFSUBL, yfmvx, Px, 0xda,(04) }, { AFSUBL, yfmvx, Px, 0xda,(04) },
{ AFSUBF, yfmvx, Px, 0xd8,(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) }, { AFSUBRDP, yfaddp, Px, 0xde,(04) },
{ AFSUBRW, yfmvx, Px, 0xde,(05) }, { AFSUBRW, yfmvx, Px, 0xde,(05) },
{ AFSUBRL, yfmvx, Px, 0xda,(05) }, { AFSUBRL, yfmvx, Px, 0xda,(05) },
{ AFSUBRF, yfmvx, Px, 0xd8,(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) }, { AFDIVDP, yfaddp, Px, 0xde,(07) },
{ AFDIVW, yfmvx, Px, 0xde,(06) }, { AFDIVW, yfmvx, Px, 0xde,(06) },
{ AFDIVL, yfmvx, Px, 0xda,(06) }, { AFDIVL, yfmvx, Px, 0xda,(06) },
{ AFDIVF, yfmvx, Px, 0xd8,(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) }, { AFDIVRDP, yfaddp, Px, 0xde,(06) },
{ AFDIVRW, yfmvx, Px, 0xde,(07) }, { AFDIVRW, yfmvx, Px, 0xde,(07) },
{ AFDIVRL, yfmvx, Px, 0xda,(07) }, { AFDIVRL, yfmvx, Px, 0xda,(07) },
{ AFDIVRF, yfmvx, Px, 0xd8,(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) }, { AFXCHD, yfxch, Px, 0xd9,(01),0xd9,(01) },
{ AFFREE }, { AFFREE },

View File

@ -651,25 +651,25 @@ Optab optab[] =
{ AFSUBW, yfmvx, Px, 0xde,(04) }, { AFSUBW, yfmvx, Px, 0xde,(04) },
{ AFSUBL, yfmvx, Px, 0xda,(04) }, { AFSUBL, yfmvx, Px, 0xda,(04) },
{ AFSUBF, yfmvx, Px, 0xd8,(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) }, { AFSUBRDP, yfaddp, Px, 0xde,(04) },
{ AFSUBRW, yfmvx, Px, 0xde,(05) }, { AFSUBRW, yfmvx, Px, 0xde,(05) },
{ AFSUBRL, yfmvx, Px, 0xda,(05) }, { AFSUBRL, yfmvx, Px, 0xda,(05) },
{ AFSUBRF, yfmvx, Px, 0xd8,(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) }, { AFDIVDP, yfaddp, Px, 0xde,(07) },
{ AFDIVW, yfmvx, Px, 0xde,(06) }, { AFDIVW, yfmvx, Px, 0xde,(06) },
{ AFDIVL, yfmvx, Px, 0xda,(06) }, { AFDIVL, yfmvx, Px, 0xda,(06) },
{ AFDIVF, yfmvx, Px, 0xd8,(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) }, { AFDIVRDP, yfaddp, Px, 0xde,(06) },
{ AFDIVRW, yfmvx, Px, 0xde,(07) }, { AFDIVRW, yfmvx, Px, 0xde,(07) },
{ AFDIVRL, yfmvx, Px, 0xda,(07) }, { AFDIVRL, yfmvx, Px, 0xda,(07) },
{ AFDIVRF, yfmvx, Px, 0xd8,(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) }, { AFXCHD, yfxch, Px, 0xd9,(01),0xd9,(01) },
{ AFFREE }, { AFFREE },

View File

@ -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))
}
}

View File

@ -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

View File

@ -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
}

7
test/fixedbugs/bug453.go Normal file
View File

@ -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