]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6g: fix internal error with SSE registers.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Sun, 23 Sep 2012 16:22:03 +0000 (18:22 +0200)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Sun, 23 Sep 2012 16:22:03 +0000 (18:22 +0200)
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

src/cmd/6g/reg.c
test/fixedbugs/bug453.go [new file with mode: 0644]

index 398e6a70d921adc1c371cb3a3b497dbab771687a..a139b1caa35593c206db955b50f6de406e049e5b 100644 (file)
@@ -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
diff --git a/test/fixedbugs/bug453.go b/test/fixedbugs/bug453.go
new file mode 100644 (file)
index 0000000..136abef
--- /dev/null
@@ -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")
+       }
+}