| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| #include <limits> |
|
|
| #include <gtest/gtest.h> |
|
|
| #include "math-evaluation-tester.h" |
|
|
| #include <xnnpack/isa-checks.h> |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && XNN_ARCH_ARM64 |
| TEST(TANH__AARCH64_NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_DIV, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__aarch64_neonfp16arith_expm1minus_rr1_p3h1ts_div, 1.0f); |
| } |
|
|
| TEST(TANH__AARCH64_NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_DIV, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__aarch64_neonfp16arith_expm1minus_rr1_p3h1ts_div, -1.0f); |
| } |
|
|
| TEST(TANH__AARCH64_NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_DIV, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__aarch64_neonfp16arith_expm1minus_rr1_p3h1ts_div); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && XNN_ARCH_ARM64 |
| TEST(TANH__AARCH64_NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_DIV, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__aarch64_neonfp16arith_expm1minus_rr1_p3h2ts_div, 1.0f); |
| } |
|
|
| TEST(TANH__AARCH64_NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_DIV, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__aarch64_neonfp16arith_expm1minus_rr1_p3h2ts_div, -1.0f); |
| } |
|
|
| TEST(TANH__AARCH64_NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_DIV, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__aarch64_neonfp16arith_expm1minus_rr1_p3h2ts_div); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1FMA, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1fma, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1FMA, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1fma, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1FMA, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1fma); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1FMAADJ, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1fmaadj, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1FMAADJ, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1fmaadj, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1FMAADJ, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1fmaadj); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1RECPS, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1recps, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1RECPS, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1recps, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1RECPS, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1recps); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1RECPSADJ, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1recpsadj, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1RECPSADJ, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1recpsadj, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_NR1RECPSADJ, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_nr1recpsadj); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_RECPE, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_recpe, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_RECPE, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_recpe, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_RECPE, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_recpe); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_RECPEADJ, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_recpeadj, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_RECPEADJ, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_recpeadj, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H1TS_RECPEADJ, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h1ts_recpeadj); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1FMA, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1fma, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1FMA, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1fma, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1FMA, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1fma); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1FMAADJ, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1fmaadj, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1FMAADJ, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1fmaadj, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1FMAADJ, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1fmaadj); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1RECPS, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1recps, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1RECPS, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1recps, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1RECPS, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1recps); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1RECPSADJ, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1recpsadj, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1RECPSADJ, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1recpsadj, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_NR1RECPSADJ, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_nr1recpsadj); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_RECPE, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_recpe, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_RECPE, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_recpe, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_RECPE, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_recpe); |
| } |
| #endif |
|
|
|
|
| #if XNN_ENABLE_ARM_FP16_VECTOR && (XNN_ARCH_ARM || XNN_ARCH_ARM64) |
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_RECPEADJ, positive_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_recpeadj, 1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_RECPEADJ, negative_saturation) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_recpeadj, -1.0f); |
| } |
|
|
| TEST(TANH__NEONFP16ARITH_EXPM1MINUS_RR1_P3H2TS_RECPEADJ, nan) { |
| TEST_REQUIRES_ARM_NEON_FP16_ARITH; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__neonfp16arith_expm1minus_rr1_p3h2ts_recpeadj); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__F16C_EXPM1MINUS_RR1_P3H2TS_DIV, positive_saturation) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__f16c_expm1minus_rr1_p3h2ts_div, 1.0f); |
| } |
|
|
| TEST(TANH__F16C_EXPM1MINUS_RR1_P3H2TS_DIV, negative_saturation) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__f16c_expm1minus_rr1_p3h2ts_div, -1.0f); |
| } |
|
|
| TEST(TANH__F16C_EXPM1MINUS_RR1_P3H2TS_DIV, nan) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__f16c_expm1minus_rr1_p3h2ts_div); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__F16C_EXPM1MINUS_RR1_P3H2TS_RCP, positive_saturation) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__f16c_expm1minus_rr1_p3h2ts_rcp, 1.0f); |
| } |
|
|
| TEST(TANH__F16C_EXPM1MINUS_RR1_P3H2TS_RCP, negative_saturation) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__f16c_expm1minus_rr1_p3h2ts_rcp, -1.0f); |
| } |
|
|
| TEST(TANH__F16C_EXPM1MINUS_RR1_P3H2TS_RCP, nan) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__f16c_expm1minus_rr1_p3h2ts_rcp); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__F16C_POLYNOMIAL_P17H8T2, positive_saturation) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__f16c_polynomial_p17h8t2, 1.0f); |
| } |
|
|
| TEST(TANH__F16C_POLYNOMIAL_P17H8T2, negative_saturation) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__f16c_polynomial_p17h8t2, -1.0f); |
| } |
|
|
| TEST(TANH__F16C_POLYNOMIAL_P17H8T2, nan) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__f16c_polynomial_p17h8t2); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__F16C_POLYNOMIAL_P19H9T2, positive_saturation) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__f16c_polynomial_p19h9t2, 1.0f); |
| } |
|
|
| TEST(TANH__F16C_POLYNOMIAL_P19H9T2, negative_saturation) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__f16c_polynomial_p19h9t2, -1.0f); |
| } |
|
|
| TEST(TANH__F16C_POLYNOMIAL_P19H9T2, nan) { |
| TEST_REQUIRES_X86_F16C; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__f16c_polynomial_p19h9t2); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__FMA3_EXPM1MINUS_RR1_P3H2TS_DIV, positive_saturation) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__fma3_expm1minus_rr1_p3h2ts_div, 1.0f); |
| } |
|
|
| TEST(TANH__FMA3_EXPM1MINUS_RR1_P3H2TS_DIV, negative_saturation) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__fma3_expm1minus_rr1_p3h2ts_div, -1.0f); |
| } |
|
|
| TEST(TANH__FMA3_EXPM1MINUS_RR1_P3H2TS_DIV, nan) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__fma3_expm1minus_rr1_p3h2ts_div); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__FMA3_EXPM1MINUS_RR1_P3H2TS_RCP, positive_saturation) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__fma3_expm1minus_rr1_p3h2ts_rcp, 1.0f); |
| } |
|
|
| TEST(TANH__FMA3_EXPM1MINUS_RR1_P3H2TS_RCP, negative_saturation) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__fma3_expm1minus_rr1_p3h2ts_rcp, -1.0f); |
| } |
|
|
| TEST(TANH__FMA3_EXPM1MINUS_RR1_P3H2TS_RCP, nan) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__fma3_expm1minus_rr1_p3h2ts_rcp); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__FMA3_POLYNOMIAL_P17H8T2, positive_saturation) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__fma3_polynomial_p17h8t2, 1.0f); |
| } |
|
|
| TEST(TANH__FMA3_POLYNOMIAL_P17H8T2, negative_saturation) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__fma3_polynomial_p17h8t2, -1.0f); |
| } |
|
|
| TEST(TANH__FMA3_POLYNOMIAL_P17H8T2, nan) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__fma3_polynomial_p17h8t2); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__FMA3_POLYNOMIAL_P19H9T2, positive_saturation) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__fma3_polynomial_p19h9t2, 1.0f); |
| } |
|
|
| TEST(TANH__FMA3_POLYNOMIAL_P19H9T2, negative_saturation) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__fma3_polynomial_p19h9t2, -1.0f); |
| } |
|
|
| TEST(TANH__FMA3_POLYNOMIAL_P19H9T2, nan) { |
| TEST_REQUIRES_X86_FMA3; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__fma3_polynomial_p19h9t2); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__AVX2_EXPM1MINUS_RR1_P3H2TS_DIV, positive_saturation) { |
| TEST_REQUIRES_X86_AVX2; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__avx2_expm1minus_rr1_p3h2ts_div, 1.0f); |
| } |
|
|
| TEST(TANH__AVX2_EXPM1MINUS_RR1_P3H2TS_DIV, negative_saturation) { |
| TEST_REQUIRES_X86_AVX2; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__avx2_expm1minus_rr1_p3h2ts_div, -1.0f); |
| } |
|
|
| TEST(TANH__AVX2_EXPM1MINUS_RR1_P3H2TS_DIV, nan) { |
| TEST_REQUIRES_X86_AVX2; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__avx2_expm1minus_rr1_p3h2ts_div); |
| } |
| #endif |
|
|
|
|
| #if XNN_ARCH_X86 || XNN_ARCH_X86_64 |
| TEST(TANH__AVX2_EXPM1MINUS_RR1_P3H2TS_RCP, positive_saturation) { |
| TEST_REQUIRES_X86_AVX2; |
| MathEvaluationTester() |
| .input_range(0x1.208p+2f, std::numeric_limits<float>::infinity()) |
| .TestOutputMatchReference(xnn_math_f16_tanh__avx2_expm1minus_rr1_p3h2ts_rcp, 1.0f); |
| } |
|
|
| TEST(TANH__AVX2_EXPM1MINUS_RR1_P3H2TS_RCP, negative_saturation) { |
| TEST_REQUIRES_X86_AVX2; |
| MathEvaluationTester() |
| .input_range(-std::numeric_limits<float>::infinity(), -0x1.208p+2f) |
| .TestOutputMatchReference(xnn_math_f16_tanh__avx2_expm1minus_rr1_p3h2ts_rcp, -1.0f); |
| } |
|
|
| TEST(TANH__AVX2_EXPM1MINUS_RR1_P3H2TS_RCP, nan) { |
| TEST_REQUIRES_X86_AVX2; |
| MathEvaluationTester() |
| .TestNaN(xnn_math_f16_tanh__avx2_expm1minus_rr1_p3h2ts_rcp); |
| } |
| #endif |
|
|