mirror of
https://github.com/golang/go
synced 2024-11-21 22:24:40 -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:
parent
ca5e9bfabc
commit
36df358a30
@ -1600,16 +1600,16 @@ BtoR(int32 b)
|
||||
|
||||
/*
|
||||
* bit reg
|
||||
* 16 X5 (FREGMIN)
|
||||
* 16 X0
|
||||
* ...
|
||||
* 26 X15 (FREGEXT)
|
||||
* 31 X15
|
||||
*/
|
||||
int32
|
||||
FtoB(int f)
|
||||
{
|
||||
if(f < FREGMIN || f > FREGEXT)
|
||||
if(f < D_X0 || f > D_X15)
|
||||
return 0;
|
||||
return 1L << (f - FREGMIN + 16);
|
||||
return 1L << (f - D_X0 + 16);
|
||||
}
|
||||
|
||||
int
|
||||
@ -1619,7 +1619,7 @@ BtoF(int32 b)
|
||||
b &= 0xFFFF0000L;
|
||||
if(b == 0)
|
||||
return 0;
|
||||
return bitno(b) - 16 + FREGMIN;
|
||||
return bitno(b) - 16 + D_X0;
|
||||
}
|
||||
|
||||
void
|
||||
|
39
test/fixedbugs/bug453.go
Normal file
39
test/fixedbugs/bug453.go
Normal 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")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user