var modf = [][2]float64{
{4.0000000000000000e+00, 9.7901192488367350108546816e-01},
{7.0000000000000000e+00, 7.3887247457810456552351752e-01},
- {0.0000000000000000e+00, -2.7688005719200159404635997e-01},
+ {Copysign(0, -1), -2.7688005719200159404635997e-01},
{-5.0000000000000000e+00, -1.060361827107492160848778e-02},
{9.0000000000000000e+00, 6.3629370719841737980004837e-01},
{2.0000000000000000e+00, 9.2637723924396464525443662e-01},
var vfmodfSC = []float64{
Inf(-1),
+ Copysign(0, -1),
Inf(1),
NaN(),
}
var modfSC = [][2]float64{
{Inf(-1), NaN()}, // [2]float64{Copysign(0, -1), Inf(-1)},
+ {Copysign(0, -1), Copysign(0, -1)},
{Inf(1), NaN()}, // [2]float64{0, Inf(1)},
{NaN(), NaN()},
}
// func Modf(f float64) (int float64, frac float64)
TEXT ·Modf(SB),NOSPLIT,$0
+ // special case for f == -0.0
+ MOVL f+4(FP), DX // high word
+ MOVL f+0(FP), AX // low word
+ CMPL DX, $(1<<31) // beginning of -0.0
+ JNE notNegativeZero
+ CMPL AX, $0 // could be denormalized
+ JNE notNegativeZero
+ MOVL AX, int+8(FP)
+ MOVL DX, int+12(FP)
+ MOVL AX, frac+16(FP)
+ MOVL DX, frac+20(FP)
+ RET
+notNegativeZero:
FMOVD f+0(FP), F0 // F0=f
FMOVD F0, F1 // F0=f, F1=f
FSTCW -2(SP) // save old Control Word