From: Brian Kessler Date: Sat, 14 Mar 2020 05:24:38 +0000 (-0600) Subject: math: correct Atan2(±y,+∞) = ±0 on s390x X-Git-Tag: go1.15beta1~761 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6b6414cab49fcc035e1f20bafdb723077e7d36bb;p=gostls13.git math: correct Atan2(±y,+∞) = ±0 on s390x 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 TryBot-Result: Gobot Gobot Reviewed-by: Michael Munday Reviewed-by: Robert Griesemer --- diff --git a/src/math/all_test.go b/src/math/all_test.go index 1ac9d71a25..3aae0373c7 100644 --- a/src/math/all_test.go +++ b/src/math/all_test.go @@ -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) diff --git a/src/math/atan2_s390x.s b/src/math/atan2_s390x.s index 6b9af252e2..587b89e9b5 100644 --- a/src/math/atan2_s390x.s +++ b/src/math/atan2_s390x.s @@ -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