1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2020 Google LLC
2*4bdc9457SAndroid Build Coastguard Worker //
3*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
4*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
5*4bdc9457SAndroid Build Coastguard Worker
6*4bdc9457SAndroid Build Coastguard Worker #include <algorithm>
7*4bdc9457SAndroid Build Coastguard Worker #include <cmath>
8*4bdc9457SAndroid Build Coastguard Worker #include <cstddef>
9*4bdc9457SAndroid Build Coastguard Worker #include <cstdint>
10*4bdc9457SAndroid Build Coastguard Worker #include <cstdlib>
11*4bdc9457SAndroid Build Coastguard Worker #include <iomanip>
12*4bdc9457SAndroid Build Coastguard Worker #include <ios>
13*4bdc9457SAndroid Build Coastguard Worker #include <vector>
14*4bdc9457SAndroid Build Coastguard Worker
15*4bdc9457SAndroid Build Coastguard Worker #include <gtest/gtest.h>
16*4bdc9457SAndroid Build Coastguard Worker
17*4bdc9457SAndroid Build Coastguard Worker #include <fp16.h>
18*4bdc9457SAndroid Build Coastguard Worker
19*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/aligned-allocator.h>
20*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/common.h>
21*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/isa-checks.h>
22*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/math.h>
23*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/math-stubs.h>
24*4bdc9457SAndroid Build Coastguard Worker
25*4bdc9457SAndroid Build Coastguard Worker
26*4bdc9457SAndroid Build Coastguard Worker constexpr int kBlockSize = 1024;
27*4bdc9457SAndroid Build Coastguard Worker
28*4bdc9457SAndroid Build Coastguard Worker
29*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(EXPM1MINUS__NEON_RR2_LUT16_P3,negative_zero)30*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEON_RR2_LUT16_P3, negative_zero) {
31*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON;
32*4bdc9457SAndroid Build Coastguard Worker
33*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
34*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
35*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
36*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neon_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
37*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
38*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
39*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
40*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
41*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
42*4bdc9457SAndroid Build Coastguard Worker }
43*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEON_RR2_LUT16_P3,negative_saturation)44*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEON_RR2_LUT16_P3, negative_saturation) {
45*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON;
46*4bdc9457SAndroid Build Coastguard Worker
47*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
48*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
49*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
50*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
51*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
52*4bdc9457SAndroid Build Coastguard Worker }
53*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neon_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
54*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
55*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
56*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
57*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
58*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
59*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
60*4bdc9457SAndroid Build Coastguard Worker }
61*4bdc9457SAndroid Build Coastguard Worker }
62*4bdc9457SAndroid Build Coastguard Worker }
63*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEON_RR2_LUT16_P3,positive_nan)64*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEON_RR2_LUT16_P3, positive_nan) {
65*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON;
66*4bdc9457SAndroid Build Coastguard Worker
67*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
68*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
69*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
70*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
71*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
72*4bdc9457SAndroid Build Coastguard Worker }
73*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neon_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
74*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
75*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
76*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
77*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
78*4bdc9457SAndroid Build Coastguard Worker }
79*4bdc9457SAndroid Build Coastguard Worker }
80*4bdc9457SAndroid Build Coastguard Worker }
81*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEON_RR2_LUT16_P3,negative_nan)82*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEON_RR2_LUT16_P3, negative_nan) {
83*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON;
84*4bdc9457SAndroid Build Coastguard Worker
85*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
86*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
87*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
88*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
89*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
90*4bdc9457SAndroid Build Coastguard Worker }
91*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neon_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
92*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
93*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
94*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
95*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
96*4bdc9457SAndroid Build Coastguard Worker }
97*4bdc9457SAndroid Build Coastguard Worker }
98*4bdc9457SAndroid Build Coastguard Worker }
99*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_ARM || XNN_ARCH_ARM64
100*4bdc9457SAndroid Build Coastguard Worker
101*4bdc9457SAndroid Build Coastguard Worker
102*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(EXPM1MINUS__NEON_RR2_P6,negative_zero)103*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEON_RR2_P6, negative_zero) {
104*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON;
105*4bdc9457SAndroid Build Coastguard Worker
106*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
107*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
108*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
109*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neon_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
110*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
111*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
112*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
113*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
114*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
115*4bdc9457SAndroid Build Coastguard Worker }
116*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEON_RR2_P6,negative_saturation)117*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEON_RR2_P6, negative_saturation) {
118*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON;
119*4bdc9457SAndroid Build Coastguard Worker
120*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
121*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
122*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
123*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
124*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
125*4bdc9457SAndroid Build Coastguard Worker }
126*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neon_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
127*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
128*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
129*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
130*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
131*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
132*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
133*4bdc9457SAndroid Build Coastguard Worker }
134*4bdc9457SAndroid Build Coastguard Worker }
135*4bdc9457SAndroid Build Coastguard Worker }
136*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEON_RR2_P6,positive_nan)137*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEON_RR2_P6, positive_nan) {
138*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON;
139*4bdc9457SAndroid Build Coastguard Worker
140*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
141*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
142*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
143*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
144*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
145*4bdc9457SAndroid Build Coastguard Worker }
146*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neon_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
147*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
148*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
149*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
150*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
151*4bdc9457SAndroid Build Coastguard Worker }
152*4bdc9457SAndroid Build Coastguard Worker }
153*4bdc9457SAndroid Build Coastguard Worker }
154*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEON_RR2_P6,negative_nan)155*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEON_RR2_P6, negative_nan) {
156*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON;
157*4bdc9457SAndroid Build Coastguard Worker
158*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
159*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
160*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
161*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
162*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
163*4bdc9457SAndroid Build Coastguard Worker }
164*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neon_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
165*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
166*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
167*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
168*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
169*4bdc9457SAndroid Build Coastguard Worker }
170*4bdc9457SAndroid Build Coastguard Worker }
171*4bdc9457SAndroid Build Coastguard Worker }
172*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_ARM || XNN_ARCH_ARM64
173*4bdc9457SAndroid Build Coastguard Worker
174*4bdc9457SAndroid Build Coastguard Worker
175*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(EXPM1MINUS__NEONFMA_RR1_LUT16_P3,negative_zero)176*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEONFMA_RR1_LUT16_P3, negative_zero) {
177*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON_FMA;
178*4bdc9457SAndroid Build Coastguard Worker
179*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
180*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
181*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
182*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neonfma_rr1_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
183*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
184*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
185*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
186*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
187*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
188*4bdc9457SAndroid Build Coastguard Worker }
189*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEONFMA_RR1_LUT16_P3,negative_saturation)190*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEONFMA_RR1_LUT16_P3, negative_saturation) {
191*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON_FMA;
192*4bdc9457SAndroid Build Coastguard Worker
193*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
194*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
195*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
196*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
197*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
198*4bdc9457SAndroid Build Coastguard Worker }
199*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neonfma_rr1_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
200*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
201*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
202*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
203*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
204*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
205*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
206*4bdc9457SAndroid Build Coastguard Worker }
207*4bdc9457SAndroid Build Coastguard Worker }
208*4bdc9457SAndroid Build Coastguard Worker }
209*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEONFMA_RR1_LUT16_P3,positive_nan)210*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEONFMA_RR1_LUT16_P3, positive_nan) {
211*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON_FMA;
212*4bdc9457SAndroid Build Coastguard Worker
213*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
214*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
215*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
216*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
217*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
218*4bdc9457SAndroid Build Coastguard Worker }
219*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neonfma_rr1_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
220*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
221*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
222*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
223*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
224*4bdc9457SAndroid Build Coastguard Worker }
225*4bdc9457SAndroid Build Coastguard Worker }
226*4bdc9457SAndroid Build Coastguard Worker }
227*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEONFMA_RR1_LUT16_P3,negative_nan)228*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEONFMA_RR1_LUT16_P3, negative_nan) {
229*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON_FMA;
230*4bdc9457SAndroid Build Coastguard Worker
231*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
232*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
233*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
234*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
235*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
236*4bdc9457SAndroid Build Coastguard Worker }
237*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neonfma_rr1_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
238*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
239*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
240*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
241*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
242*4bdc9457SAndroid Build Coastguard Worker }
243*4bdc9457SAndroid Build Coastguard Worker }
244*4bdc9457SAndroid Build Coastguard Worker }
245*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_ARM || XNN_ARCH_ARM64
246*4bdc9457SAndroid Build Coastguard Worker
247*4bdc9457SAndroid Build Coastguard Worker
248*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(EXPM1MINUS__NEONFMA_RR1_P6,negative_zero)249*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEONFMA_RR1_P6, negative_zero) {
250*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON_FMA;
251*4bdc9457SAndroid Build Coastguard Worker
252*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
253*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
254*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
255*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neonfma_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
256*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
257*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
258*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
259*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
260*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
261*4bdc9457SAndroid Build Coastguard Worker }
262*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEONFMA_RR1_P6,negative_saturation)263*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEONFMA_RR1_P6, negative_saturation) {
264*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON_FMA;
265*4bdc9457SAndroid Build Coastguard Worker
266*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
267*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
268*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
269*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
270*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
271*4bdc9457SAndroid Build Coastguard Worker }
272*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neonfma_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
273*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
274*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
275*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
276*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
277*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
278*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
279*4bdc9457SAndroid Build Coastguard Worker }
280*4bdc9457SAndroid Build Coastguard Worker }
281*4bdc9457SAndroid Build Coastguard Worker }
282*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEONFMA_RR1_P6,positive_nan)283*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEONFMA_RR1_P6, positive_nan) {
284*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON_FMA;
285*4bdc9457SAndroid Build Coastguard Worker
286*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
287*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
288*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
289*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
290*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
291*4bdc9457SAndroid Build Coastguard Worker }
292*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neonfma_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
293*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
294*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
295*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
296*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
297*4bdc9457SAndroid Build Coastguard Worker }
298*4bdc9457SAndroid Build Coastguard Worker }
299*4bdc9457SAndroid Build Coastguard Worker }
300*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__NEONFMA_RR1_P6,negative_nan)301*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__NEONFMA_RR1_P6, negative_nan) {
302*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_ARM_NEON_FMA;
303*4bdc9457SAndroid Build Coastguard Worker
304*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
305*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
306*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
307*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
308*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
309*4bdc9457SAndroid Build Coastguard Worker }
310*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__neonfma_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
311*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
312*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
313*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
314*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
315*4bdc9457SAndroid Build Coastguard Worker }
316*4bdc9457SAndroid Build Coastguard Worker }
317*4bdc9457SAndroid Build Coastguard Worker }
318*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_ARM || XNN_ARCH_ARM64
319*4bdc9457SAndroid Build Coastguard Worker
320*4bdc9457SAndroid Build Coastguard Worker
321*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX512F_RR1_LUT16_P3_PERM,negative_zero)322*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX512F_RR1_LUT16_P3_PERM, negative_zero) {
323*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX512F;
324*4bdc9457SAndroid Build Coastguard Worker
325*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
326*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
327*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
328*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx512f_rr1_lut16_p3_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
329*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
330*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
331*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
332*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
333*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
334*4bdc9457SAndroid Build Coastguard Worker }
335*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX512F_RR1_LUT16_P3_PERM,negative_saturation)336*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX512F_RR1_LUT16_P3_PERM, negative_saturation) {
337*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX512F;
338*4bdc9457SAndroid Build Coastguard Worker
339*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
340*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
341*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
342*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
343*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
344*4bdc9457SAndroid Build Coastguard Worker }
345*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx512f_rr1_lut16_p3_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
346*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
347*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
348*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
349*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
350*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
351*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
352*4bdc9457SAndroid Build Coastguard Worker }
353*4bdc9457SAndroid Build Coastguard Worker }
354*4bdc9457SAndroid Build Coastguard Worker }
355*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX512F_RR1_LUT16_P3_PERM,positive_nan)356*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX512F_RR1_LUT16_P3_PERM, positive_nan) {
357*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX512F;
358*4bdc9457SAndroid Build Coastguard Worker
359*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
360*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
361*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
362*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
363*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
364*4bdc9457SAndroid Build Coastguard Worker }
365*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx512f_rr1_lut16_p3_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
366*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
367*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
368*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
369*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
370*4bdc9457SAndroid Build Coastguard Worker }
371*4bdc9457SAndroid Build Coastguard Worker }
372*4bdc9457SAndroid Build Coastguard Worker }
373*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX512F_RR1_LUT16_P3_PERM,negative_nan)374*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX512F_RR1_LUT16_P3_PERM, negative_nan) {
375*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX512F;
376*4bdc9457SAndroid Build Coastguard Worker
377*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
378*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
379*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
380*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
381*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
382*4bdc9457SAndroid Build Coastguard Worker }
383*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx512f_rr1_lut16_p3_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
384*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
385*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
386*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
387*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
388*4bdc9457SAndroid Build Coastguard Worker }
389*4bdc9457SAndroid Build Coastguard Worker }
390*4bdc9457SAndroid Build Coastguard Worker }
391*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
392*4bdc9457SAndroid Build Coastguard Worker
393*4bdc9457SAndroid Build Coastguard Worker
394*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX512F_RR1_P6,negative_zero)395*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX512F_RR1_P6, negative_zero) {
396*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX512F;
397*4bdc9457SAndroid Build Coastguard Worker
398*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
399*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
400*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
401*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx512f_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
402*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
403*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
404*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
405*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
406*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
407*4bdc9457SAndroid Build Coastguard Worker }
408*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX512F_RR1_P6,negative_saturation)409*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX512F_RR1_P6, negative_saturation) {
410*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX512F;
411*4bdc9457SAndroid Build Coastguard Worker
412*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
413*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
414*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
415*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
416*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
417*4bdc9457SAndroid Build Coastguard Worker }
418*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx512f_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
419*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
420*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
421*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
422*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
423*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
424*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
425*4bdc9457SAndroid Build Coastguard Worker }
426*4bdc9457SAndroid Build Coastguard Worker }
427*4bdc9457SAndroid Build Coastguard Worker }
428*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX512F_RR1_P6,positive_nan)429*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX512F_RR1_P6, positive_nan) {
430*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX512F;
431*4bdc9457SAndroid Build Coastguard Worker
432*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
433*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
434*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
435*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
436*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
437*4bdc9457SAndroid Build Coastguard Worker }
438*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx512f_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
439*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
440*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
441*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
442*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
443*4bdc9457SAndroid Build Coastguard Worker }
444*4bdc9457SAndroid Build Coastguard Worker }
445*4bdc9457SAndroid Build Coastguard Worker }
446*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX512F_RR1_P6,negative_nan)447*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX512F_RR1_P6, negative_nan) {
448*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX512F;
449*4bdc9457SAndroid Build Coastguard Worker
450*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
451*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
452*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
453*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
454*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
455*4bdc9457SAndroid Build Coastguard Worker }
456*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx512f_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
457*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
458*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
459*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
460*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
461*4bdc9457SAndroid Build Coastguard Worker }
462*4bdc9457SAndroid Build Coastguard Worker }
463*4bdc9457SAndroid Build Coastguard Worker }
464*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
465*4bdc9457SAndroid Build Coastguard Worker
466*4bdc9457SAndroid Build Coastguard Worker
467*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX2_RR1_LUT4_P4_PERM,negative_zero)468*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT4_P4_PERM, negative_zero) {
469*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
470*4bdc9457SAndroid Build Coastguard Worker
471*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
472*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
473*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
474*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut4_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
475*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
476*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
477*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
478*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
479*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
480*4bdc9457SAndroid Build Coastguard Worker }
481*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT4_P4_PERM,negative_saturation)482*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT4_P4_PERM, negative_saturation) {
483*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
484*4bdc9457SAndroid Build Coastguard Worker
485*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
486*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
487*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
488*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
489*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
490*4bdc9457SAndroid Build Coastguard Worker }
491*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut4_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
492*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
493*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
494*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
495*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
496*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
497*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
498*4bdc9457SAndroid Build Coastguard Worker }
499*4bdc9457SAndroid Build Coastguard Worker }
500*4bdc9457SAndroid Build Coastguard Worker }
501*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT4_P4_PERM,positive_nan)502*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT4_P4_PERM, positive_nan) {
503*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
504*4bdc9457SAndroid Build Coastguard Worker
505*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
506*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
507*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
508*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
509*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
510*4bdc9457SAndroid Build Coastguard Worker }
511*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut4_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
512*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
513*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
514*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
515*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
516*4bdc9457SAndroid Build Coastguard Worker }
517*4bdc9457SAndroid Build Coastguard Worker }
518*4bdc9457SAndroid Build Coastguard Worker }
519*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT4_P4_PERM,negative_nan)520*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT4_P4_PERM, negative_nan) {
521*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
522*4bdc9457SAndroid Build Coastguard Worker
523*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
524*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
525*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
526*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
527*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
528*4bdc9457SAndroid Build Coastguard Worker }
529*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut4_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
530*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
531*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
532*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
533*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
534*4bdc9457SAndroid Build Coastguard Worker }
535*4bdc9457SAndroid Build Coastguard Worker }
536*4bdc9457SAndroid Build Coastguard Worker }
537*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
538*4bdc9457SAndroid Build Coastguard Worker
539*4bdc9457SAndroid Build Coastguard Worker
540*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX2_RR1_LUT8_P4_PERM,negative_zero)541*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT8_P4_PERM, negative_zero) {
542*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
543*4bdc9457SAndroid Build Coastguard Worker
544*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
545*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
546*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
547*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut8_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
548*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
549*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
550*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
551*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
552*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
553*4bdc9457SAndroid Build Coastguard Worker }
554*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT8_P4_PERM,negative_saturation)555*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT8_P4_PERM, negative_saturation) {
556*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
557*4bdc9457SAndroid Build Coastguard Worker
558*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
559*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
560*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
561*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
562*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
563*4bdc9457SAndroid Build Coastguard Worker }
564*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut8_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
565*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
566*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
567*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
568*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
569*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
570*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
571*4bdc9457SAndroid Build Coastguard Worker }
572*4bdc9457SAndroid Build Coastguard Worker }
573*4bdc9457SAndroid Build Coastguard Worker }
574*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT8_P4_PERM,positive_nan)575*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT8_P4_PERM, positive_nan) {
576*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
577*4bdc9457SAndroid Build Coastguard Worker
578*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
579*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
580*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
581*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
582*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
583*4bdc9457SAndroid Build Coastguard Worker }
584*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut8_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
585*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
586*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
587*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
588*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
589*4bdc9457SAndroid Build Coastguard Worker }
590*4bdc9457SAndroid Build Coastguard Worker }
591*4bdc9457SAndroid Build Coastguard Worker }
592*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT8_P4_PERM,negative_nan)593*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT8_P4_PERM, negative_nan) {
594*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
595*4bdc9457SAndroid Build Coastguard Worker
596*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
597*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
598*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
599*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
600*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
601*4bdc9457SAndroid Build Coastguard Worker }
602*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut8_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
603*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
604*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
605*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
606*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
607*4bdc9457SAndroid Build Coastguard Worker }
608*4bdc9457SAndroid Build Coastguard Worker }
609*4bdc9457SAndroid Build Coastguard Worker }
610*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
611*4bdc9457SAndroid Build Coastguard Worker
612*4bdc9457SAndroid Build Coastguard Worker
613*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX2_RR1_LUT16_P3_GATHER,negative_zero)614*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT16_P3_GATHER, negative_zero) {
615*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
616*4bdc9457SAndroid Build Coastguard Worker
617*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
618*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
619*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
620*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut16_p3_gather(kBlockSize * sizeof(float), inputs.data(), outputs.data());
621*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
622*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
623*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
624*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
625*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
626*4bdc9457SAndroid Build Coastguard Worker }
627*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT16_P3_GATHER,negative_saturation)628*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT16_P3_GATHER, negative_saturation) {
629*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
630*4bdc9457SAndroid Build Coastguard Worker
631*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
632*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
633*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
634*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
635*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
636*4bdc9457SAndroid Build Coastguard Worker }
637*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut16_p3_gather(kBlockSize * sizeof(float), inputs.data(), outputs.data());
638*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
639*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
640*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
641*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
642*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
643*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
644*4bdc9457SAndroid Build Coastguard Worker }
645*4bdc9457SAndroid Build Coastguard Worker }
646*4bdc9457SAndroid Build Coastguard Worker }
647*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT16_P3_GATHER,positive_nan)648*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT16_P3_GATHER, positive_nan) {
649*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
650*4bdc9457SAndroid Build Coastguard Worker
651*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
652*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
653*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
654*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
655*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
656*4bdc9457SAndroid Build Coastguard Worker }
657*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut16_p3_gather(kBlockSize * sizeof(float), inputs.data(), outputs.data());
658*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
659*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
660*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
661*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
662*4bdc9457SAndroid Build Coastguard Worker }
663*4bdc9457SAndroid Build Coastguard Worker }
664*4bdc9457SAndroid Build Coastguard Worker }
665*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_LUT16_P3_GATHER,negative_nan)666*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_LUT16_P3_GATHER, negative_nan) {
667*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
668*4bdc9457SAndroid Build Coastguard Worker
669*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
670*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
671*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
672*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
673*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
674*4bdc9457SAndroid Build Coastguard Worker }
675*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_lut16_p3_gather(kBlockSize * sizeof(float), inputs.data(), outputs.data());
676*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
677*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
678*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
679*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
680*4bdc9457SAndroid Build Coastguard Worker }
681*4bdc9457SAndroid Build Coastguard Worker }
682*4bdc9457SAndroid Build Coastguard Worker }
683*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
684*4bdc9457SAndroid Build Coastguard Worker
685*4bdc9457SAndroid Build Coastguard Worker
686*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX2_RR1_P6,negative_zero)687*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_P6, negative_zero) {
688*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
689*4bdc9457SAndroid Build Coastguard Worker
690*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
691*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
692*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
693*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
694*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
695*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
696*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
697*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
698*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
699*4bdc9457SAndroid Build Coastguard Worker }
700*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_P6,negative_saturation)701*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_P6, negative_saturation) {
702*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
703*4bdc9457SAndroid Build Coastguard Worker
704*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
705*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
706*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
707*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
708*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
709*4bdc9457SAndroid Build Coastguard Worker }
710*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
711*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
712*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
713*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
714*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
715*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
716*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
717*4bdc9457SAndroid Build Coastguard Worker }
718*4bdc9457SAndroid Build Coastguard Worker }
719*4bdc9457SAndroid Build Coastguard Worker }
720*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_P6,positive_nan)721*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_P6, positive_nan) {
722*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
723*4bdc9457SAndroid Build Coastguard Worker
724*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
725*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
726*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
727*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
728*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
729*4bdc9457SAndroid Build Coastguard Worker }
730*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
731*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
732*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
733*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
734*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
735*4bdc9457SAndroid Build Coastguard Worker }
736*4bdc9457SAndroid Build Coastguard Worker }
737*4bdc9457SAndroid Build Coastguard Worker }
738*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX2_RR1_P6,negative_nan)739*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX2_RR1_P6, negative_nan) {
740*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX2;
741*4bdc9457SAndroid Build Coastguard Worker
742*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
743*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
744*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
745*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
746*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
747*4bdc9457SAndroid Build Coastguard Worker }
748*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx2_rr1_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
749*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
750*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
751*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
752*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
753*4bdc9457SAndroid Build Coastguard Worker }
754*4bdc9457SAndroid Build Coastguard Worker }
755*4bdc9457SAndroid Build Coastguard Worker }
756*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
757*4bdc9457SAndroid Build Coastguard Worker
758*4bdc9457SAndroid Build Coastguard Worker
759*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX_RR2_LUT4_P4_PERM,negative_zero)760*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_LUT4_P4_PERM, negative_zero) {
761*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
762*4bdc9457SAndroid Build Coastguard Worker
763*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
764*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
765*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
766*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_lut4_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
767*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
768*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
769*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
770*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
771*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
772*4bdc9457SAndroid Build Coastguard Worker }
773*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_LUT4_P4_PERM,negative_saturation)774*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_LUT4_P4_PERM, negative_saturation) {
775*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
776*4bdc9457SAndroid Build Coastguard Worker
777*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
778*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
779*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
780*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
781*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
782*4bdc9457SAndroid Build Coastguard Worker }
783*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_lut4_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
784*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
785*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
786*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
787*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
788*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
789*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
790*4bdc9457SAndroid Build Coastguard Worker }
791*4bdc9457SAndroid Build Coastguard Worker }
792*4bdc9457SAndroid Build Coastguard Worker }
793*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_LUT4_P4_PERM,positive_nan)794*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_LUT4_P4_PERM, positive_nan) {
795*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
796*4bdc9457SAndroid Build Coastguard Worker
797*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
798*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
799*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
800*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
801*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
802*4bdc9457SAndroid Build Coastguard Worker }
803*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_lut4_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
804*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
805*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
806*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
807*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
808*4bdc9457SAndroid Build Coastguard Worker }
809*4bdc9457SAndroid Build Coastguard Worker }
810*4bdc9457SAndroid Build Coastguard Worker }
811*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_LUT4_P4_PERM,negative_nan)812*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_LUT4_P4_PERM, negative_nan) {
813*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
814*4bdc9457SAndroid Build Coastguard Worker
815*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
816*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
817*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
818*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
819*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
820*4bdc9457SAndroid Build Coastguard Worker }
821*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_lut4_p4_perm(kBlockSize * sizeof(float), inputs.data(), outputs.data());
822*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
823*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
824*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
825*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
826*4bdc9457SAndroid Build Coastguard Worker }
827*4bdc9457SAndroid Build Coastguard Worker }
828*4bdc9457SAndroid Build Coastguard Worker }
829*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
830*4bdc9457SAndroid Build Coastguard Worker
831*4bdc9457SAndroid Build Coastguard Worker
832*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX_RR2_LUT16_P3,negative_zero)833*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_LUT16_P3, negative_zero) {
834*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
835*4bdc9457SAndroid Build Coastguard Worker
836*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
837*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
838*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
839*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
840*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
841*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
842*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
843*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
844*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
845*4bdc9457SAndroid Build Coastguard Worker }
846*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_LUT16_P3,negative_saturation)847*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_LUT16_P3, negative_saturation) {
848*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
849*4bdc9457SAndroid Build Coastguard Worker
850*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
851*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
852*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
853*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
854*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
855*4bdc9457SAndroid Build Coastguard Worker }
856*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
857*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
858*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
859*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
860*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
861*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
862*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
863*4bdc9457SAndroid Build Coastguard Worker }
864*4bdc9457SAndroid Build Coastguard Worker }
865*4bdc9457SAndroid Build Coastguard Worker }
866*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_LUT16_P3,positive_nan)867*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_LUT16_P3, positive_nan) {
868*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
869*4bdc9457SAndroid Build Coastguard Worker
870*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
871*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
872*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
873*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
874*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
875*4bdc9457SAndroid Build Coastguard Worker }
876*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
877*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
878*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
879*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
880*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
881*4bdc9457SAndroid Build Coastguard Worker }
882*4bdc9457SAndroid Build Coastguard Worker }
883*4bdc9457SAndroid Build Coastguard Worker }
884*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_LUT16_P3,negative_nan)885*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_LUT16_P3, negative_nan) {
886*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
887*4bdc9457SAndroid Build Coastguard Worker
888*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
889*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
890*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
891*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
892*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
893*4bdc9457SAndroid Build Coastguard Worker }
894*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
895*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
896*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
897*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
898*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
899*4bdc9457SAndroid Build Coastguard Worker }
900*4bdc9457SAndroid Build Coastguard Worker }
901*4bdc9457SAndroid Build Coastguard Worker }
902*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
903*4bdc9457SAndroid Build Coastguard Worker
904*4bdc9457SAndroid Build Coastguard Worker
905*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__AVX_RR2_P6,negative_zero)906*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_P6, negative_zero) {
907*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
908*4bdc9457SAndroid Build Coastguard Worker
909*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
910*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
911*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
912*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
913*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
914*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
915*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
916*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
917*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
918*4bdc9457SAndroid Build Coastguard Worker }
919*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_P6,negative_saturation)920*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_P6, negative_saturation) {
921*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
922*4bdc9457SAndroid Build Coastguard Worker
923*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
924*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
925*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
926*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
927*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
928*4bdc9457SAndroid Build Coastguard Worker }
929*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
930*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
931*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
932*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
933*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
934*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
935*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
936*4bdc9457SAndroid Build Coastguard Worker }
937*4bdc9457SAndroid Build Coastguard Worker }
938*4bdc9457SAndroid Build Coastguard Worker }
939*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_P6,positive_nan)940*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_P6, positive_nan) {
941*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
942*4bdc9457SAndroid Build Coastguard Worker
943*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
944*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
945*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
946*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
947*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
948*4bdc9457SAndroid Build Coastguard Worker }
949*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
950*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
951*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
952*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
953*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
954*4bdc9457SAndroid Build Coastguard Worker }
955*4bdc9457SAndroid Build Coastguard Worker }
956*4bdc9457SAndroid Build Coastguard Worker }
957*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__AVX_RR2_P6,negative_nan)958*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__AVX_RR2_P6, negative_nan) {
959*4bdc9457SAndroid Build Coastguard Worker TEST_REQUIRES_X86_AVX;
960*4bdc9457SAndroid Build Coastguard Worker
961*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
962*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
963*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
964*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
965*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
966*4bdc9457SAndroid Build Coastguard Worker }
967*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__avx_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
968*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
969*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
970*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
971*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
972*4bdc9457SAndroid Build Coastguard Worker }
973*4bdc9457SAndroid Build Coastguard Worker }
974*4bdc9457SAndroid Build Coastguard Worker }
975*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
976*4bdc9457SAndroid Build Coastguard Worker
977*4bdc9457SAndroid Build Coastguard Worker
978*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__SSE2_RR2_LUT16_P3,negative_zero)979*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SSE2_RR2_LUT16_P3, negative_zero) {
980*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
981*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
982*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
983*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__sse2_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
984*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
985*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
986*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
987*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
988*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
989*4bdc9457SAndroid Build Coastguard Worker }
990*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SSE2_RR2_LUT16_P3,negative_saturation)991*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SSE2_RR2_LUT16_P3, negative_saturation) {
992*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
993*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
994*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
995*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
996*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
997*4bdc9457SAndroid Build Coastguard Worker }
998*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__sse2_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
999*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1000*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1001*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1002*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1003*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1004*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1005*4bdc9457SAndroid Build Coastguard Worker }
1006*4bdc9457SAndroid Build Coastguard Worker }
1007*4bdc9457SAndroid Build Coastguard Worker }
1008*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SSE2_RR2_LUT16_P3,positive_nan)1009*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SSE2_RR2_LUT16_P3, positive_nan) {
1010*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1011*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1012*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1013*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1014*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1015*4bdc9457SAndroid Build Coastguard Worker }
1016*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__sse2_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1017*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1018*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1019*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1020*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1021*4bdc9457SAndroid Build Coastguard Worker }
1022*4bdc9457SAndroid Build Coastguard Worker }
1023*4bdc9457SAndroid Build Coastguard Worker }
1024*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SSE2_RR2_LUT16_P3,negative_nan)1025*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SSE2_RR2_LUT16_P3, negative_nan) {
1026*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1027*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1028*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1029*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1030*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1031*4bdc9457SAndroid Build Coastguard Worker }
1032*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__sse2_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1033*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1034*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1035*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1036*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1037*4bdc9457SAndroid Build Coastguard Worker }
1038*4bdc9457SAndroid Build Coastguard Worker }
1039*4bdc9457SAndroid Build Coastguard Worker }
1040*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
1041*4bdc9457SAndroid Build Coastguard Worker
1042*4bdc9457SAndroid Build Coastguard Worker
1043*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(EXPM1MINUS__SSE2_RR2_P6,negative_zero)1044*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SSE2_RR2_P6, negative_zero) {
1045*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1046*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1047*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1048*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__sse2_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1049*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1050*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1051*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1052*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1053*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1054*4bdc9457SAndroid Build Coastguard Worker }
1055*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SSE2_RR2_P6,negative_saturation)1056*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SSE2_RR2_P6, negative_saturation) {
1057*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1058*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1059*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1060*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1061*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1062*4bdc9457SAndroid Build Coastguard Worker }
1063*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__sse2_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1064*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1065*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1066*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1067*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1068*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1069*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1070*4bdc9457SAndroid Build Coastguard Worker }
1071*4bdc9457SAndroid Build Coastguard Worker }
1072*4bdc9457SAndroid Build Coastguard Worker }
1073*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SSE2_RR2_P6,positive_nan)1074*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SSE2_RR2_P6, positive_nan) {
1075*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1076*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1077*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1078*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1079*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1080*4bdc9457SAndroid Build Coastguard Worker }
1081*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__sse2_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1082*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1083*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1084*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1085*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1086*4bdc9457SAndroid Build Coastguard Worker }
1087*4bdc9457SAndroid Build Coastguard Worker }
1088*4bdc9457SAndroid Build Coastguard Worker }
1089*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SSE2_RR2_P6,negative_nan)1090*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SSE2_RR2_P6, negative_nan) {
1091*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1092*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1093*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1094*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1095*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1096*4bdc9457SAndroid Build Coastguard Worker }
1097*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__sse2_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1098*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1099*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1100*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1101*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1102*4bdc9457SAndroid Build Coastguard Worker }
1103*4bdc9457SAndroid Build Coastguard Worker }
1104*4bdc9457SAndroid Build Coastguard Worker }
1105*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
1106*4bdc9457SAndroid Build Coastguard Worker
1107*4bdc9457SAndroid Build Coastguard Worker
1108*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_ANDNOT,negative_zero)1109*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_ANDNOT, negative_zero) {
1110*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1111*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1112*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1113*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_lut16_p3_andnot(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1114*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1115*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1116*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1117*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1118*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1119*4bdc9457SAndroid Build Coastguard Worker }
1120*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_ANDNOT,negative_saturation)1121*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_ANDNOT, negative_saturation) {
1122*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1123*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1124*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1125*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1126*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1127*4bdc9457SAndroid Build Coastguard Worker }
1128*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_lut16_p3_andnot(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1129*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1130*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1131*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1132*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1133*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1134*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1135*4bdc9457SAndroid Build Coastguard Worker }
1136*4bdc9457SAndroid Build Coastguard Worker }
1137*4bdc9457SAndroid Build Coastguard Worker }
1138*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_ANDNOT,positive_nan)1139*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_ANDNOT, positive_nan) {
1140*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1141*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1142*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1143*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1144*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1145*4bdc9457SAndroid Build Coastguard Worker }
1146*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_lut16_p3_andnot(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1147*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1148*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1149*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1150*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1151*4bdc9457SAndroid Build Coastguard Worker }
1152*4bdc9457SAndroid Build Coastguard Worker }
1153*4bdc9457SAndroid Build Coastguard Worker }
1154*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_ANDNOT,negative_nan)1155*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_ANDNOT, negative_nan) {
1156*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1157*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1158*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1159*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1160*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1161*4bdc9457SAndroid Build Coastguard Worker }
1162*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_lut16_p3_andnot(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1163*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1164*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1165*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1166*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1167*4bdc9457SAndroid Build Coastguard Worker }
1168*4bdc9457SAndroid Build Coastguard Worker }
1169*4bdc9457SAndroid Build Coastguard Worker }
1170*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1171*4bdc9457SAndroid Build Coastguard Worker
1172*4bdc9457SAndroid Build Coastguard Worker
1173*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_MAX,negative_zero)1174*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_MAX, negative_zero) {
1175*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1176*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1177*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1178*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_lut16_p3_max(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1179*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1180*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1181*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1182*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1183*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1184*4bdc9457SAndroid Build Coastguard Worker }
1185*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_MAX,negative_saturation)1186*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_MAX, negative_saturation) {
1187*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1188*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1189*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1190*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1191*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1192*4bdc9457SAndroid Build Coastguard Worker }
1193*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_lut16_p3_max(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1194*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1195*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1196*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1197*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1198*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1199*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1200*4bdc9457SAndroid Build Coastguard Worker }
1201*4bdc9457SAndroid Build Coastguard Worker }
1202*4bdc9457SAndroid Build Coastguard Worker }
1203*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_MAX,positive_nan)1204*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_MAX, positive_nan) {
1205*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1206*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1207*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1208*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1209*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1210*4bdc9457SAndroid Build Coastguard Worker }
1211*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_lut16_p3_max(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1212*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1213*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1214*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1215*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1216*4bdc9457SAndroid Build Coastguard Worker }
1217*4bdc9457SAndroid Build Coastguard Worker }
1218*4bdc9457SAndroid Build Coastguard Worker }
1219*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_MAX,negative_nan)1220*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_LUT16_P3_MAX, negative_nan) {
1221*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1222*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1223*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1224*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1225*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1226*4bdc9457SAndroid Build Coastguard Worker }
1227*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_lut16_p3_max(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1228*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1229*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1230*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1231*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1232*4bdc9457SAndroid Build Coastguard Worker }
1233*4bdc9457SAndroid Build Coastguard Worker }
1234*4bdc9457SAndroid Build Coastguard Worker }
1235*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1236*4bdc9457SAndroid Build Coastguard Worker
1237*4bdc9457SAndroid Build Coastguard Worker
1238*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(EXPM1MINUS__WASMSIMD_RR2_P6_ANDNOT,negative_zero)1239*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_P6_ANDNOT, negative_zero) {
1240*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1241*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1242*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1243*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_p6_andnot(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1244*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1245*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1246*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1247*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1248*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1249*4bdc9457SAndroid Build Coastguard Worker }
1250*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_P6_ANDNOT,negative_saturation)1251*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_P6_ANDNOT, negative_saturation) {
1252*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1253*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1254*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1255*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1256*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1257*4bdc9457SAndroid Build Coastguard Worker }
1258*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_p6_andnot(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1259*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1260*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1261*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1262*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1263*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1264*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1265*4bdc9457SAndroid Build Coastguard Worker }
1266*4bdc9457SAndroid Build Coastguard Worker }
1267*4bdc9457SAndroid Build Coastguard Worker }
1268*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_P6_ANDNOT,positive_nan)1269*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_P6_ANDNOT, positive_nan) {
1270*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1271*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1272*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1273*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1274*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1275*4bdc9457SAndroid Build Coastguard Worker }
1276*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_p6_andnot(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1277*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1278*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1279*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1280*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1281*4bdc9457SAndroid Build Coastguard Worker }
1282*4bdc9457SAndroid Build Coastguard Worker }
1283*4bdc9457SAndroid Build Coastguard Worker }
1284*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_P6_ANDNOT,negative_nan)1285*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_P6_ANDNOT, negative_nan) {
1286*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1287*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1288*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1289*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1290*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1291*4bdc9457SAndroid Build Coastguard Worker }
1292*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_p6_andnot(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1293*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1294*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1295*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1296*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1297*4bdc9457SAndroid Build Coastguard Worker }
1298*4bdc9457SAndroid Build Coastguard Worker }
1299*4bdc9457SAndroid Build Coastguard Worker }
1300*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1301*4bdc9457SAndroid Build Coastguard Worker
1302*4bdc9457SAndroid Build Coastguard Worker
1303*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(EXPM1MINUS__WASMSIMD_RR2_P6_MAX,negative_zero)1304*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_P6_MAX, negative_zero) {
1305*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1306*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1307*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1308*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_p6_max(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1309*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1310*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1311*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1312*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1313*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1314*4bdc9457SAndroid Build Coastguard Worker }
1315*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_P6_MAX,negative_saturation)1316*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_P6_MAX, negative_saturation) {
1317*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1318*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1319*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1320*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1321*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1322*4bdc9457SAndroid Build Coastguard Worker }
1323*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_p6_max(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1324*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1325*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1326*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1327*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1328*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1329*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1330*4bdc9457SAndroid Build Coastguard Worker }
1331*4bdc9457SAndroid Build Coastguard Worker }
1332*4bdc9457SAndroid Build Coastguard Worker }
1333*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_P6_MAX,positive_nan)1334*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_P6_MAX, positive_nan) {
1335*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1336*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1337*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1338*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1339*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1340*4bdc9457SAndroid Build Coastguard Worker }
1341*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_p6_max(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1342*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1343*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1344*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1345*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1346*4bdc9457SAndroid Build Coastguard Worker }
1347*4bdc9457SAndroid Build Coastguard Worker }
1348*4bdc9457SAndroid Build Coastguard Worker }
1349*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__WASMSIMD_RR2_P6_MAX,negative_nan)1350*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__WASMSIMD_RR2_P6_MAX, negative_nan) {
1351*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1352*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1353*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1354*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1355*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1356*4bdc9457SAndroid Build Coastguard Worker }
1357*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__wasmsimd_rr2_p6_max(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1358*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1359*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1360*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1361*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1362*4bdc9457SAndroid Build Coastguard Worker }
1363*4bdc9457SAndroid Build Coastguard Worker }
1364*4bdc9457SAndroid Build Coastguard Worker }
1365*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1366*4bdc9457SAndroid Build Coastguard Worker
1367*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT4_P4,negative_zero)1368*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT4_P4, negative_zero) {
1369*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1370*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1371*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1372*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut4_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1373*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1374*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1375*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1376*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1377*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1378*4bdc9457SAndroid Build Coastguard Worker }
1379*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT4_P4,negative_saturation)1380*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT4_P4, negative_saturation) {
1381*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1382*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1383*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1384*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1385*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1386*4bdc9457SAndroid Build Coastguard Worker }
1387*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut4_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1388*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1389*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1390*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1391*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1392*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1393*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1394*4bdc9457SAndroid Build Coastguard Worker }
1395*4bdc9457SAndroid Build Coastguard Worker }
1396*4bdc9457SAndroid Build Coastguard Worker }
1397*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT4_P4,positive_nan)1398*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT4_P4, positive_nan) {
1399*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1400*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1401*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1402*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1403*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1404*4bdc9457SAndroid Build Coastguard Worker }
1405*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut4_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1406*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1407*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1408*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1409*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1410*4bdc9457SAndroid Build Coastguard Worker }
1411*4bdc9457SAndroid Build Coastguard Worker }
1412*4bdc9457SAndroid Build Coastguard Worker }
1413*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT4_P4,negative_nan)1414*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT4_P4, negative_nan) {
1415*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1416*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1417*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1418*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1419*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1420*4bdc9457SAndroid Build Coastguard Worker }
1421*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut4_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1422*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1423*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1424*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1425*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1426*4bdc9457SAndroid Build Coastguard Worker }
1427*4bdc9457SAndroid Build Coastguard Worker }
1428*4bdc9457SAndroid Build Coastguard Worker }
1429*4bdc9457SAndroid Build Coastguard Worker
1430*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P3,negative_zero)1431*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P3, negative_zero) {
1432*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1433*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1434*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1435*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut8_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1436*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1437*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1438*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1439*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1440*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1441*4bdc9457SAndroid Build Coastguard Worker }
1442*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P3,negative_saturation)1443*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P3, negative_saturation) {
1444*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1445*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1446*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1447*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1448*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1449*4bdc9457SAndroid Build Coastguard Worker }
1450*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut8_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1451*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1452*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1453*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1454*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1455*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1456*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1457*4bdc9457SAndroid Build Coastguard Worker }
1458*4bdc9457SAndroid Build Coastguard Worker }
1459*4bdc9457SAndroid Build Coastguard Worker }
1460*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P3,positive_nan)1461*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P3, positive_nan) {
1462*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1463*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1464*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1465*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1466*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1467*4bdc9457SAndroid Build Coastguard Worker }
1468*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut8_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1469*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1470*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1471*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1472*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1473*4bdc9457SAndroid Build Coastguard Worker }
1474*4bdc9457SAndroid Build Coastguard Worker }
1475*4bdc9457SAndroid Build Coastguard Worker }
1476*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P3,negative_nan)1477*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P3, negative_nan) {
1478*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1479*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1480*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1481*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1482*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1483*4bdc9457SAndroid Build Coastguard Worker }
1484*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut8_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1485*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1486*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1487*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1488*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1489*4bdc9457SAndroid Build Coastguard Worker }
1490*4bdc9457SAndroid Build Coastguard Worker }
1491*4bdc9457SAndroid Build Coastguard Worker }
1492*4bdc9457SAndroid Build Coastguard Worker
1493*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P4,negative_zero)1494*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P4, negative_zero) {
1495*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1496*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1497*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1498*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut8_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1499*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1500*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1501*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1502*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1503*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1504*4bdc9457SAndroid Build Coastguard Worker }
1505*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P4,negative_saturation)1506*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P4, negative_saturation) {
1507*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1508*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1509*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1510*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1511*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1512*4bdc9457SAndroid Build Coastguard Worker }
1513*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut8_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1514*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1515*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1516*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1517*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1518*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1519*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1520*4bdc9457SAndroid Build Coastguard Worker }
1521*4bdc9457SAndroid Build Coastguard Worker }
1522*4bdc9457SAndroid Build Coastguard Worker }
1523*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P4,positive_nan)1524*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P4, positive_nan) {
1525*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1526*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1527*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1528*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1529*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1530*4bdc9457SAndroid Build Coastguard Worker }
1531*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut8_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1532*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1533*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1534*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1535*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1536*4bdc9457SAndroid Build Coastguard Worker }
1537*4bdc9457SAndroid Build Coastguard Worker }
1538*4bdc9457SAndroid Build Coastguard Worker }
1539*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P4,negative_nan)1540*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT8_P4, negative_nan) {
1541*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1542*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1543*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1544*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1545*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1546*4bdc9457SAndroid Build Coastguard Worker }
1547*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut8_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1548*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1549*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1550*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1551*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1552*4bdc9457SAndroid Build Coastguard Worker }
1553*4bdc9457SAndroid Build Coastguard Worker }
1554*4bdc9457SAndroid Build Coastguard Worker }
1555*4bdc9457SAndroid Build Coastguard Worker
1556*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P3,negative_zero)1557*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P3, negative_zero) {
1558*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1559*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1560*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1561*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1562*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1563*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1564*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1565*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1566*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1567*4bdc9457SAndroid Build Coastguard Worker }
1568*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P3,negative_saturation)1569*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P3, negative_saturation) {
1570*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1571*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1572*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1573*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1574*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1575*4bdc9457SAndroid Build Coastguard Worker }
1576*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1577*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1578*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1579*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1580*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1581*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1582*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1583*4bdc9457SAndroid Build Coastguard Worker }
1584*4bdc9457SAndroid Build Coastguard Worker }
1585*4bdc9457SAndroid Build Coastguard Worker }
1586*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P3,positive_nan)1587*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P3, positive_nan) {
1588*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1589*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1590*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1591*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1592*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1593*4bdc9457SAndroid Build Coastguard Worker }
1594*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1595*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1596*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1597*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1598*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1599*4bdc9457SAndroid Build Coastguard Worker }
1600*4bdc9457SAndroid Build Coastguard Worker }
1601*4bdc9457SAndroid Build Coastguard Worker }
1602*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P3,negative_nan)1603*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P3, negative_nan) {
1604*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1605*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1606*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1607*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1608*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1609*4bdc9457SAndroid Build Coastguard Worker }
1610*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut16_p3(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1611*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1612*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1613*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1614*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1615*4bdc9457SAndroid Build Coastguard Worker }
1616*4bdc9457SAndroid Build Coastguard Worker }
1617*4bdc9457SAndroid Build Coastguard Worker }
1618*4bdc9457SAndroid Build Coastguard Worker
1619*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P4,negative_zero)1620*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P4, negative_zero) {
1621*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1622*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1623*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1624*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut16_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1625*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1626*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1627*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1628*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1629*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1630*4bdc9457SAndroid Build Coastguard Worker }
1631*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P4,negative_saturation)1632*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P4, negative_saturation) {
1633*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1634*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1635*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1636*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1637*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1638*4bdc9457SAndroid Build Coastguard Worker }
1639*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut16_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1640*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1641*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1642*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1643*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1644*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1645*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1646*4bdc9457SAndroid Build Coastguard Worker }
1647*4bdc9457SAndroid Build Coastguard Worker }
1648*4bdc9457SAndroid Build Coastguard Worker }
1649*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P4,positive_nan)1650*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P4, positive_nan) {
1651*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1652*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1653*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1654*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1655*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1656*4bdc9457SAndroid Build Coastguard Worker }
1657*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut16_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1658*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1659*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1660*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1661*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1662*4bdc9457SAndroid Build Coastguard Worker }
1663*4bdc9457SAndroid Build Coastguard Worker }
1664*4bdc9457SAndroid Build Coastguard Worker }
1665*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P4,negative_nan)1666*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_LUT16_P4, negative_nan) {
1667*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1668*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1669*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1670*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1671*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1672*4bdc9457SAndroid Build Coastguard Worker }
1673*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_lut16_p4(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1674*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1675*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1676*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1677*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1678*4bdc9457SAndroid Build Coastguard Worker }
1679*4bdc9457SAndroid Build Coastguard Worker }
1680*4bdc9457SAndroid Build Coastguard Worker }
1681*4bdc9457SAndroid Build Coastguard Worker
1682*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_P5,negative_zero)1683*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_P5, negative_zero) {
1684*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1685*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1686*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1687*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_p5(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1688*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1689*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1690*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1691*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1692*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1693*4bdc9457SAndroid Build Coastguard Worker }
1694*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_P5,negative_saturation)1695*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_P5, negative_saturation) {
1696*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1697*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1698*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1699*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1700*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1701*4bdc9457SAndroid Build Coastguard Worker }
1702*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_p5(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1703*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1704*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1705*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1706*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1707*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1708*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1709*4bdc9457SAndroid Build Coastguard Worker }
1710*4bdc9457SAndroid Build Coastguard Worker }
1711*4bdc9457SAndroid Build Coastguard Worker }
1712*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_P5,positive_nan)1713*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_P5, positive_nan) {
1714*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1715*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1716*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1717*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1718*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1719*4bdc9457SAndroid Build Coastguard Worker }
1720*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_p5(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1721*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1722*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1723*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1724*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1725*4bdc9457SAndroid Build Coastguard Worker }
1726*4bdc9457SAndroid Build Coastguard Worker }
1727*4bdc9457SAndroid Build Coastguard Worker }
1728*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_P5,negative_nan)1729*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_P5, negative_nan) {
1730*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1731*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1732*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1733*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1734*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1735*4bdc9457SAndroid Build Coastguard Worker }
1736*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_p5(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1737*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1738*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1739*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1740*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1741*4bdc9457SAndroid Build Coastguard Worker }
1742*4bdc9457SAndroid Build Coastguard Worker }
1743*4bdc9457SAndroid Build Coastguard Worker }
1744*4bdc9457SAndroid Build Coastguard Worker
1745*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_P6,negative_zero)1746*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_P6, negative_zero) {
1747*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1748*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1749*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -0.0f);
1750*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1751*4bdc9457SAndroid Build Coastguard Worker const float reference_output = 0.0f;
1752*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[0])
1753*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1754*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1755*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1756*4bdc9457SAndroid Build Coastguard Worker }
1757*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_P6,negative_saturation)1758*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_P6, negative_saturation) {
1759*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1760*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1761*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xC18AA123); n <= UINT32_C(0xFF800000); n += kBlockSize) {
1762*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1763*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(n + i, UINT32_C(0xFF800000)));
1764*4bdc9457SAndroid Build Coastguard Worker }
1765*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1766*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1767*4bdc9457SAndroid Build Coastguard Worker const float reference_output = -1.0f;
1768*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, outputs[i])
1769*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1770*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(reference_output)
1771*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1772*4bdc9457SAndroid Build Coastguard Worker }
1773*4bdc9457SAndroid Build Coastguard Worker }
1774*4bdc9457SAndroid Build Coastguard Worker }
1775*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_P6,positive_nan)1776*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_P6, positive_nan) {
1777*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1778*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1779*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1780*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1781*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), n + i));
1782*4bdc9457SAndroid Build Coastguard Worker }
1783*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1784*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1785*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1786*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1787*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1788*4bdc9457SAndroid Build Coastguard Worker }
1789*4bdc9457SAndroid Build Coastguard Worker }
1790*4bdc9457SAndroid Build Coastguard Worker }
1791*4bdc9457SAndroid Build Coastguard Worker
TEST(EXPM1MINUS__SCALAR_RR2_P6,negative_nan)1792*4bdc9457SAndroid Build Coastguard Worker TEST(EXPM1MINUS__SCALAR_RR2_P6, negative_nan) {
1793*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1794*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1795*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800001); n < UINT32_C(0x80000000); n += kBlockSize) {
1796*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1797*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::min<uint32_t>(UINT32_C(0x7FFFFFFF), UINT32_C(0x80000000) | (n + i)));
1798*4bdc9457SAndroid Build Coastguard Worker }
1799*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_expm1minus__scalar_rr2_p6(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1800*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1801*4bdc9457SAndroid Build Coastguard Worker ASSERT_TRUE(std::isnan(outputs[i]))
1802*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1803*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1804*4bdc9457SAndroid Build Coastguard Worker }
1805*4bdc9457SAndroid Build Coastguard Worker }
1806*4bdc9457SAndroid Build Coastguard Worker }
1807