diff --git a/src/cmd/6g/reg.c b/src/cmd/6g/reg.c index 398e6a70d92..a139b1caa35 100644 --- a/src/cmd/6g/reg.c +++ b/src/cmd/6g/reg.c @@ -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 index 00000000000..136abefb7d2 --- /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") + } +}