| | |
| | |
| | |
| |
|
| | #include "textflag.h" |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #define LN2 0.6931471805599453094172321214581766 |
| | #define LOG2E 1.4426950408889634073599246810018920 |
| | #define LN2U 0.69314718055966295651160180568695068359375 |
| | #define LN2L 0.28235290563031577122588448175013436025525412068e-12 |
| | #define PosInf 0x7FF0000000000000 |
| | #define NegInf 0xFFF0000000000000 |
| | #define Overflow 7.09782712893384e+02 |
| |
|
| | DATA exprodata<>+0(SB)/8, $0.5 |
| | DATA exprodata<>+8(SB)/8, $1.0 |
| | DATA exprodata<>+16(SB)/8, $2.0 |
| | DATA exprodata<>+24(SB)/8, $1.6666666666666666667e-1 |
| | DATA exprodata<>+32(SB)/8, $4.1666666666666666667e-2 |
| | DATA exprodata<>+40(SB)/8, $8.3333333333333333333e-3 |
| | DATA exprodata<>+48(SB)/8, $1.3888888888888888889e-3 |
| | DATA exprodata<>+56(SB)/8, $1.9841269841269841270e-4 |
| | DATA exprodata<>+64(SB)/8, $2.4801587301587301587e-5 |
| | GLOBL exprodata<>+0(SB), RODATA, $72 |
| |
|
| | |
| | TEXT 路archExp(SB),NOSPLIT,$0 |
| | |
| | MOVQ x+0(FP), BX |
| | MOVQ $~(1<<63), AX |
| | MOVQ BX, DX |
| | ANDQ AX, DX |
| | MOVQ $PosInf, AX |
| | CMPQ AX, DX |
| | JLE notFinite |
| | |
| | MOVQ BX, X0 |
| | MOVSD $Overflow, X1 |
| | COMISD X1, X0 |
| | JA overflow |
| | MOVSD $LOG2E, X1 |
| | MULSD X0, X1 |
| | CVTSD2SL X1, BX |
| | CVTSL2SD BX, X1 |
| | CMPB 路useFMA(SB), $1 |
| | JE avxfma |
| | MOVSD $LN2U, X2 |
| | MULSD X1, X2 |
| | SUBSD X2, X0 |
| | MOVSD $LN2L, X2 |
| | MULSD X1, X2 |
| | SUBSD X2, X0 |
| | |
| | MULSD $0.0625, X0 |
| | |
| | MOVSD exprodata<>+64(SB), X1 |
| | MULSD X0, X1 |
| | ADDSD exprodata<>+56(SB), X1 |
| | MULSD X0, X1 |
| | ADDSD exprodata<>+48(SB), X1 |
| | MULSD X0, X1 |
| | ADDSD exprodata<>+40(SB), X1 |
| | MULSD X0, X1 |
| | ADDSD exprodata<>+32(SB), X1 |
| | MULSD X0, X1 |
| | ADDSD exprodata<>+24(SB), X1 |
| | MULSD X0, X1 |
| | ADDSD exprodata<>+0(SB), X1 |
| | MULSD X0, X1 |
| | ADDSD exprodata<>+8(SB), X1 |
| | MULSD X1, X0 |
| | MOVSD exprodata<>+16(SB), X1 |
| | ADDSD X0, X1 |
| | MULSD X1, X0 |
| | MOVSD exprodata<>+16(SB), X1 |
| | ADDSD X0, X1 |
| | MULSD X1, X0 |
| | MOVSD exprodata<>+16(SB), X1 |
| | ADDSD X0, X1 |
| | MULSD X1, X0 |
| | MOVSD exprodata<>+16(SB), X1 |
| | ADDSD X0, X1 |
| | MULSD X1, X0 |
| | ADDSD exprodata<>+8(SB), X0 |
| | |
| | ldexp: |
| | ADDL $0x3FF, BX |
| | JLE denormal |
| | CMPL BX, $0x7FF |
| | JGE overflow |
| | lastStep: |
| | SHLQ $52, BX |
| | MOVQ BX, X1 |
| | MULSD X1, X0 |
| | MOVSD X0, ret+8(FP) |
| | RET |
| | notFinite: |
| | |
| | MOVQ $NegInf, AX |
| | CMPQ AX, BX |
| | JNE notNegInf |
| | |
| | underflow: |
| | MOVQ $0, ret+8(FP) |
| | RET |
| | overflow: |
| | MOVQ $PosInf, BX |
| | notNegInf: |
| | MOVQ BX, ret+8(FP) |
| | RET |
| | denormal: |
| | CMPL BX, $-52 |
| | JL underflow |
| | ADDL $0x3FE, BX |
| | SHLQ $52, BX |
| | MOVQ BX, X1 |
| | MULSD X1, X0 |
| | MOVQ $1, BX |
| | JMP lastStep |
| |
|
| | avxfma: |
| | MOVSD $LN2U, X2 |
| | VFNMADD231SD X2, X1, X0 |
| | MOVSD $LN2L, X2 |
| | VFNMADD231SD X2, X1, X0 |
| | |
| | MULSD $0.0625, X0 |
| | |
| | MOVSD exprodata<>+64(SB), X1 |
| | VFMADD213SD exprodata<>+56(SB), X0, X1 |
| | VFMADD213SD exprodata<>+48(SB), X0, X1 |
| | VFMADD213SD exprodata<>+40(SB), X0, X1 |
| | VFMADD213SD exprodata<>+32(SB), X0, X1 |
| | VFMADD213SD exprodata<>+24(SB), X0, X1 |
| | VFMADD213SD exprodata<>+0(SB), X0, X1 |
| | VFMADD213SD exprodata<>+8(SB), X0, X1 |
| | MULSD X1, X0 |
| | VADDSD exprodata<>+16(SB), X0, X1 |
| | MULSD X1, X0 |
| | VADDSD exprodata<>+16(SB), X0, X1 |
| | MULSD X1, X0 |
| | VADDSD exprodata<>+16(SB), X0, X1 |
| | MULSD X1, X0 |
| | VADDSD exprodata<>+16(SB), X0, X1 |
| | VFMADD213SD exprodata<>+8(SB), X1, X0 |
| | JMP ldexp |
| |
|