...

Text file src/pkg/math/expm1_386.s

     1	// Copyright 2010 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	#include "textflag.h"
     6	
     7	// func Expm1(x float64) float64
     8	TEXT ·Expm1(SB),NOSPLIT,$0
     9		FLDLN2               // F0=log(2) = 1/log2(e) ~ 0.693147
    10		FMOVD   x+0(FP), F0  // F0=x, F1=1/log2(e)
    11		FABS                 // F0=|x|, F1=1/log2(e)
    12		FUCOMPP F0, F1       // compare F0 to F1
    13		FSTSW   AX
    14		SAHF
    15		JCC     use_exp      // jump if F0 >= F1
    16		FLDL2E                // F0=log2(e)
    17		FMULD   x+0(FP), F0   // F0=x*log2(e) (-1<F0<1)
    18		F2XM1                 // F0=e**x-1 = 2**(x*log2(e))-1
    19		FMOVDP  F0, ret+8(FP)
    20		RET
    21	use_exp:
    22	// test bits for not-finite
    23		MOVL    x_hi+4(FP), AX
    24		ANDL    $0x7ff00000, AX
    25		CMPL    AX, $0x7ff00000
    26		JEQ     not_finite
    27		FLDL2E                // F0=log2(e)
    28		FMULD   x+0(FP), F0   // F0=x*log2(e)
    29		FMOVD   F0, F1        // F0=x*log2(e), F1=x*log2(e)
    30		FRNDINT               // F0=int(x*log2(e)), F1=x*log2(e)
    31		FSUBD   F0, F1        // F0=int(x*log2(e)), F1=x*log2(e)-int(x*log2(e))
    32		FXCHD   F0, F1        // F0=x*log2(e)-int(x*log2(e)), F1=int(x*log2(e))
    33		F2XM1                 // F0=2**(x*log2(e)-int(x*log2(e)))-1, F1=int(x*log2(e))
    34		FLD1                  // F0=1, F1=2**(x*log2(e)-int(x*log2(e)))-1, F2=int(x*log2(e))
    35		FADDDP  F0, F1        // F0=2**(x*log2(e)-int(x*log2(e))), F1=int(x*log2(e))
    36		FSCALE                // F0=e**x, F1=int(x*log2(e))
    37		FMOVDP  F0, F1        // F0=e**x
    38		FLD1                  // F0=1, F1=e**x
    39		FSUBDP  F0, F1        // F0=e**x-1
    40		FMOVDP  F0, ret+8(FP)
    41		RET
    42	not_finite:
    43	// test bits for -Inf
    44		MOVL    x_hi+4(FP), BX
    45		MOVL    x_lo+0(FP), CX
    46		CMPL    BX, $0xfff00000
    47		JNE     not_neginf
    48		CMPL    CX, $0
    49		JNE     not_neginf
    50		FLD1                 // F0=1
    51		FCHS                 // F0=-1
    52		FMOVDP  F0, ret+8(FP)
    53		RET
    54	not_neginf:
    55		MOVL    CX, ret_lo+8(FP)
    56		MOVL    BX, ret_hi+12(FP)
    57		RET

View as plain text