]> Cypherpunks repositories - gostls13.git/commitdiff
math: correct Atan2(±y,+∞) = ±0 on s390x
authorBrian Kessler <brian.m.kessler@gmail.com>
Sat, 14 Mar 2020 05:24:38 +0000 (23:24 -0600)
committerRobert Griesemer <gri@golang.org>
Wed, 25 Mar 2020 04:06:34 +0000 (04:06 +0000)
The s390x assembly implementation was previously only handling this
case correctly for x = -Pi.  Update the special case handling for
any y.

Fixes #35446

Change-Id: I355575e9ec8c7ce8bd9db10d74f42a22f39a2f38
Reviewed-on: https://go-review.googlesource.com/c/go/+/223420
Run-TryBot: Brian Kessler <brian.m.kessler@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Munday <mike.munday@ibm.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/math/all_test.go
src/math/atan2_s390x.s

index 1ac9d71a251780a797d3170f441ea171d69c529e..3aae0373c76ec7fcb4e0f75054f431f8eb4c27a1 100644 (file)
@@ -827,6 +827,8 @@ var vfatan2SC = [][2]float64{
        {+Pi, Inf(-1)},
        {+Pi, 0},
        {+Pi, Inf(1)},
+       {1.0, Inf(1)},
+       {-1.0, Inf(1)},
        {+Pi, NaN()},
        {Inf(1), Inf(-1)},
        {Inf(1), -Pi},
@@ -864,6 +866,8 @@ var atan2SC = []float64{
        Pi,              // atan2(+Pi, -Inf)
        Pi / 2,          // atan2(+Pi, +0)
        0,               // atan2(+Pi, +Inf)
+       0,               // atan2(+1, +Inf)
+       Copysign(0, -1), // atan2(-1, +Inf)
        NaN(),           // atan2(+Pi, NaN)
        3 * Pi / 4,      // atan2(+Inf, -Inf)
        Pi / 2,          // atan2(+Inf, -Pi)
index 6b9af252e2db514ed72c30b53d8eeeae63940fe1..587b89e9b5bec0dd861d9dc14a0857e73463db7a 100644 (file)
@@ -134,9 +134,9 @@ yIsPosInf:
        MOVD    $NegInf, R3
        CMPUBEQ R3, R1, negInfPosInf
 
-       //special case Atan2(-Pi, +Inf) = Pi
-       MOVD    $NegPi, R3
-       CMPUBEQ R3, R1, negPiPosInf
+       //special case Atan2(x, +Inf) = Copysign(0, x)
+       CMPBLT  R1, $0, returnNegZero
+       BR returnPosZero
 
 Normal:
        FMOVD   x+0(FP), F0
@@ -288,7 +288,10 @@ negInfPosInf:
        MOVD    $NegPiDiv4, R1
        MOVD    R1, ret+16(FP)
        RET
-negPiPosInf:
+returnNegZero:
        MOVD    $NegZero, R1
        MOVD    R1, ret+16(FP)
        RET
+returnPosZero:
+       MOVD    $0, ret+16(FP)
+       RET