1
0
mirror of https://github.com/golang/go synced 2024-11-25 21:07:56 -07:00

cmd/6g: fix internal error with SSE registers.

Revision 63f7abcae015 introduced a bug caused by
code assuming registers started at X5, not X0.

Fixes #4138.

R=rsc
CC=golang-dev, remy
https://golang.org/cl/6558043
This commit is contained in:
Rémy Oudompheng 2012-09-23 18:22:03 +02:00
parent ca5e9bfabc
commit 36df358a30
2 changed files with 44 additions and 5 deletions

View File

@ -1600,16 +1600,16 @@ BtoR(int32 b)
/* /*
* bit reg * bit reg
* 16 X5 (FREGMIN) * 16 X0
* ... * ...
* 26 X15 (FREGEXT) * 31 X15
*/ */
int32 int32
FtoB(int f) FtoB(int f)
{ {
if(f < FREGMIN || f > FREGEXT) if(f < D_X0 || f > D_X15)
return 0; return 0;
return 1L << (f - FREGMIN + 16); return 1L << (f - D_X0 + 16);
} }
int int
@ -1619,7 +1619,7 @@ BtoF(int32 b)
b &= 0xFFFF0000L; b &= 0xFFFF0000L;
if(b == 0) if(b == 0)
return 0; return 0;
return bitno(b) - 16 + FREGMIN; return bitno(b) - 16 + D_X0;
} }
void void

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

@ -0,0 +1,39 @@
// run
// 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.
// Issue 4138: bug in floating-point registers numbering.
// Makes 6g unable to use more than 11 registers.
package main
func formula() float32 {
mA := [1]float32{1.0}
det1 := mA[0]
det2 := mA[0]
det3 := mA[0]
det4 := mA[0]
det5 := mA[0]
det6 := mA[0]
det7 := mA[0]
det8 := mA[0]
det9 := mA[0]
det10 := mA[0]
det11 := mA[0]
det12 := mA[0]
return det1 + det2*det3 +
det4*det5 + det6*det7 +
det8*det9 + det10*det11 +
det12
}
func main() {
x := formula()
if x != 7.0 {
println(x, 7.0)
panic("x != 7.0")
}
}