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")
+	}
+}