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
diff --git a/src/cmd/6g/reg.c b/src/cmd/6g/reg.c
index 398e6a7..a139b1c 100644
--- a/src/cmd/6g/reg.c
+++ b/src/cmd/6g/reg.c
@@ -1600,16 +1600,16 @@
/*
* 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 @@
b &= 0xFFFF0000L;
if(b == 0)
return 0;
- return bitno(b) - 16 + FREGMIN;
+ return bitno(b) - 16 + D_X0;
}
void
diff --git a/test/fixedbugs/bug453.go b/test/fixedbugs/bug453.go
new file mode 100644
index 0000000..136abef
--- /dev/null
+++ b/test/fixedbugs/bug453.go
@@ -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")
+ }
+}