Commit 36df358a authored by Rémy Oudompheng's avatar Rémy Oudompheng

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
parent ca5e9bfa
......@@ -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
......
// 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")
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment