Commit 7fe2f549 authored by Wèi Cōngruì's avatar Wèi Cōngruì Committed by Robert Griesemer

math: handle denormals in AMD64 Exp

Fixes #23164

Change-Id: I6e8c6443f3ef91df71e117cce1cfa1faba647dd7
Reviewed-on: https://go-review.googlesource.com/87337Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 4907c62f
...@@ -1014,6 +1014,8 @@ var vfexpSC = []float64{ ...@@ -1014,6 +1014,8 @@ var vfexpSC = []float64{
1, 1,
// near zero // near zero
3.725290298461915e-09, 3.725290298461915e-09,
// denormal
-740,
} }
var expSC = []float64{ var expSC = []float64{
0, 0,
...@@ -1026,6 +1028,7 @@ var expSC = []float64{ ...@@ -1026,6 +1028,7 @@ var expSC = []float64{
Inf(1), Inf(1),
2.718281828459045, 2.718281828459045,
1.0000000037252903, 1.0000000037252903,
4.2e-322,
} }
var vfexp2SC = []float64{ var vfexp2SC = []float64{
......
...@@ -96,14 +96,13 @@ TEXT ·Exp(SB),NOSPLIT,$0 ...@@ -96,14 +96,13 @@ TEXT ·Exp(SB),NOSPLIT,$0
MULSD X1, X0 MULSD X1, X0
ADDSD exprodata<>+8(SB), X0 ADDSD exprodata<>+8(SB), X0
// return fr * 2**exponent // return fr * 2**exponent
lastStep: ldexp:
MOVL $0x3FF, AX // bias ADDL $0x3FF, BX // add bias
ADDL AX, BX JLE denormal
JLE underflow
CMPL BX, $0x7FF CMPL BX, $0x7FF
JGE overflow JGE overflow
MOVL $52, CX lastStep:
SHLQ CX, BX SHLQ $52, BX
MOVQ BX, X1 MOVQ BX, X1
MULSD X1, X0 MULSD X1, X0
MOVSD X0, ret+8(FP) MOVSD X0, ret+8(FP)
...@@ -115,14 +114,22 @@ notFinite: ...@@ -115,14 +114,22 @@ notFinite:
JNE notNegInf JNE notNegInf
// -Inf, return 0 // -Inf, return 0
underflow: // return 0 underflow: // return 0
MOVQ $0, AX MOVQ $0, ret+8(FP)
MOVQ AX, ret+8(FP)
RET RET
overflow: // return +Inf overflow: // return +Inf
MOVQ $PosInf, BX MOVQ $PosInf, BX
notNegInf: // NaN or +Inf, return x notNegInf: // NaN or +Inf, return x
MOVQ BX, ret+8(FP) MOVQ BX, ret+8(FP)
RET RET
denormal:
CMPL BX, $-52
JL underflow
ADDL $0x3FE, BX // add bias - 1
SHLQ $52, BX
MOVQ BX, X1
MULSD X1, X0
MOVQ $1, BX
JMP lastStep
avxfma: avxfma:
MOVSD $LN2U, X2 MOVSD $LN2U, X2
...@@ -149,4 +156,4 @@ avxfma: ...@@ -149,4 +156,4 @@ avxfma:
MULSD X1, X0 MULSD X1, X0
VADDSD exprodata<>+16(SB), X0, X1 VADDSD exprodata<>+16(SB), X0, X1
VFMADD213SD exprodata<>+8(SB), X1, X0 VFMADD213SD exprodata<>+8(SB), X1, X0
JMP lastStep JMP ldexp
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