{NaN(), Inf(1)},
{NaN(), NaN()},
}
+var nan = Float64frombits(0xFFF8000000000000) // SSE2 DIVSD 0/0
+var vffdim2SC = [][2]float64{
+ {Inf(-1), Inf(-1)},
+ {Inf(-1), Inf(1)},
+ {Inf(-1), nan},
+ {Copysign(0, -1), Copysign(0, -1)},
+ {Copysign(0, -1), 0},
+ {0, Copysign(0, -1)},
+ {0, 0},
+ {Inf(1), Inf(-1)},
+ {Inf(1), Inf(1)},
+ {Inf(1), nan},
+ {nan, Inf(-1)},
+ {nan, Copysign(0, -1)},
+ {nan, 0},
+ {nan, Inf(1)},
+ {nan, nan},
+}
var fdimSC = []float64{
NaN(),
0,
t.Errorf("Dim(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fdimSC[i])
}
}
+ for i := 0; i < len(vffdim2SC); i++ {
+ if f := Dim(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fdimSC[i], f) {
+ t.Errorf("Dim(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fdimSC[i])
+ }
+ }
}
func TestFloor(t *testing.T) {
t.Errorf("Max(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fmaxSC[i])
}
}
+ for i := 0; i < len(vffdim2SC); i++ {
+ if f := Max(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fmaxSC[i], f) {
+ t.Errorf("Max(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fmaxSC[i])
+ }
+ }
}
func TestMin(t *testing.T) {
t.Errorf("Min(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fminSC[i])
}
}
+ for i := 0; i < len(vffdim2SC); i++ {
+ if f := Min(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fminSC[i], f) {
+ t.Errorf("Min(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fminSC[i])
+ }
+ }
}
func TestMod(t *testing.T) {
JEQ bothInf
dim3: // (NaN, x) or (x, NaN)
MOVQ $~(1<<63), DX
- MOVQ $NaN, AX
+ MOVQ $PosInf, AX
ANDQ DX, BX // x = |x|
CMPQ AX, BX
- JLE isDimNaN
+ JLT isDimNaN
ANDQ DX, CX // y = |y|
CMPQ AX, CX
- JLE isDimNaN
+ JLT isDimNaN
MOVSD x+0(FP), X0
SUBSD y+8(FP), X0
MOVSD X0, ret+16(FP)
RET
bothInf: // Dim(-Inf, -Inf) or Dim(+Inf, +Inf)
- MOVQ $NaN, AX
isDimNaN:
+ MOVQ $NaN, AX
MOVQ AX, ret+16(FP)
RET
JEQ isPosInf
// NaN special cases
MOVQ $~(1<<63), DX // bit mask
- MOVQ $NaN, AX
+ MOVQ $PosInf, AX
MOVQ R8, BX
ANDQ DX, BX // x = |x|
CMPQ AX, BX
- JLE isMaxNaN
+ JLT isMaxNaN
MOVQ R9, CX
ANDQ DX, CX // y = |y|
CMPQ AX, CX
- JLE isMaxNaN
+ JLT isMaxNaN
// ±0 special cases
ORQ CX, BX
JEQ isMaxZero
MOVSD X0, ret+16(FP)
RET
isMaxNaN: // return NaN
+ MOVQ $NaN, AX
isPosInf: // return +Inf
MOVQ AX, ret+16(FP)
RET
MOVQ R9, ret+16(FP) // return other 0
RET
-/*
- MOVQ $0, AX
- CMPQ AX, R8
- JNE +3(PC)
- MOVQ R8, ret+16(FP) // return 0
- RET
- MOVQ R9, ret+16(FP) // return other 0
- RET
-*/
-
// func Min(x, y float64) float64
TEXT ·Min(SB),NOSPLIT,$0
// -Inf special cases
JEQ isNegInf
// NaN special cases
MOVQ $~(1<<63), DX
- MOVQ $NaN, AX
+ MOVQ $PosInf, AX
MOVQ R8, BX
ANDQ DX, BX // x = |x|
CMPQ AX, BX
- JLE isMinNaN
+ JLT isMinNaN
MOVQ R9, CX
ANDQ DX, CX // y = |y|
CMPQ AX, CX
- JLE isMinNaN
+ JLT isMinNaN
// ±0 special cases
ORQ CX, BX
JEQ isMinZero
MOVSD X0, ret+16(FP)
RET
isMinNaN: // return NaN
+ MOVQ $NaN, AX
isNegInf: // return -Inf
MOVQ AX, ret+16(FP)
RET