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/math.h>
22*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/math-stubs.h>
23*4bdc9457SAndroid Build Coastguard Worker
24*4bdc9457SAndroid Build Coastguard Worker
25*4bdc9457SAndroid Build Coastguard Worker constexpr int kBlockSize = 1024;
26*4bdc9457SAndroid Build Coastguard Worker
27*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(ROUNDU__SSE_ADDSUB,positive_zero)28*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, positive_zero) {
29*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
30*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
31*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
32*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
33*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
34*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
35*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
36*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
37*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
38*4bdc9457SAndroid Build Coastguard Worker }
39*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,negative_zero)40*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, negative_zero) {
41*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
42*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
43*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
44*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
45*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
46*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
47*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
48*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
49*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
50*4bdc9457SAndroid Build Coastguard Worker }
51*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,positive_subnormal)52*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, positive_subnormal) {
53*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
54*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
55*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
56*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
57*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
58*4bdc9457SAndroid Build Coastguard Worker }
59*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
60*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
61*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
62*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
63*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
64*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
65*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
66*4bdc9457SAndroid Build Coastguard Worker }
67*4bdc9457SAndroid Build Coastguard Worker }
68*4bdc9457SAndroid Build Coastguard Worker }
69*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,negative_subnormal)70*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, negative_subnormal) {
71*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
72*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
73*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
74*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
75*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
76*4bdc9457SAndroid Build Coastguard Worker }
77*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
78*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
79*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
80*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
81*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
82*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
83*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
84*4bdc9457SAndroid Build Coastguard Worker }
85*4bdc9457SAndroid Build Coastguard Worker }
86*4bdc9457SAndroid Build Coastguard Worker }
87*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,positive_normal)88*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, positive_normal) {
89*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
90*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
91*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
92*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
93*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
94*4bdc9457SAndroid Build Coastguard Worker }
95*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
96*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
97*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
98*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
99*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
100*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
101*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
102*4bdc9457SAndroid Build Coastguard Worker }
103*4bdc9457SAndroid Build Coastguard Worker }
104*4bdc9457SAndroid Build Coastguard Worker }
105*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,negative_normal)106*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, negative_normal) {
107*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
108*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
109*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
110*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
111*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
112*4bdc9457SAndroid Build Coastguard Worker }
113*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
114*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
115*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
116*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
117*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
118*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
119*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
120*4bdc9457SAndroid Build Coastguard Worker }
121*4bdc9457SAndroid Build Coastguard Worker }
122*4bdc9457SAndroid Build Coastguard Worker }
123*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,positive_integral)124*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, positive_integral) {
125*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
126*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
127*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
128*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
129*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
130*4bdc9457SAndroid Build Coastguard Worker }
131*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
132*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
133*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
134*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
135*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
136*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
137*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
138*4bdc9457SAndroid Build Coastguard Worker }
139*4bdc9457SAndroid Build Coastguard Worker }
140*4bdc9457SAndroid Build Coastguard Worker }
141*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,negative_integral)142*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, negative_integral) {
143*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
144*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
145*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
146*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
147*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
148*4bdc9457SAndroid Build Coastguard Worker }
149*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
150*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
151*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
152*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
153*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
154*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
155*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
156*4bdc9457SAndroid Build Coastguard Worker }
157*4bdc9457SAndroid Build Coastguard Worker }
158*4bdc9457SAndroid Build Coastguard Worker }
159*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,positive_infinity)160*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, positive_infinity) {
161*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
162*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
163*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
164*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
165*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
166*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
167*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
168*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
169*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
170*4bdc9457SAndroid Build Coastguard Worker }
171*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,negative_infinity)172*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, negative_infinity) {
173*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
174*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
175*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
176*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
177*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
178*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
179*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
180*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
181*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
182*4bdc9457SAndroid Build Coastguard Worker }
183*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,positive_qnan)184*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, positive_qnan) {
185*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
186*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
187*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
188*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
189*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
190*4bdc9457SAndroid Build Coastguard Worker }
191*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
192*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
193*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
194*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
195*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
196*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
197*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
198*4bdc9457SAndroid Build Coastguard Worker }
199*4bdc9457SAndroid Build Coastguard Worker }
200*4bdc9457SAndroid Build Coastguard Worker }
201*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,negative_qnan)202*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, negative_qnan) {
203*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
204*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
205*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
206*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
207*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
208*4bdc9457SAndroid Build Coastguard Worker }
209*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
210*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
211*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
212*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
213*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
214*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
215*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
216*4bdc9457SAndroid Build Coastguard Worker }
217*4bdc9457SAndroid Build Coastguard Worker }
218*4bdc9457SAndroid Build Coastguard Worker }
219*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,positive_snan)220*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, positive_snan) {
221*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
222*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
223*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
224*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
225*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
226*4bdc9457SAndroid Build Coastguard Worker }
227*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
228*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
229*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
230*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
231*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
232*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
233*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
234*4bdc9457SAndroid Build Coastguard Worker }
235*4bdc9457SAndroid Build Coastguard Worker }
236*4bdc9457SAndroid Build Coastguard Worker }
237*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,negative_snan)238*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, negative_snan) {
239*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
240*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
241*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
242*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
243*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
244*4bdc9457SAndroid Build Coastguard Worker }
245*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
246*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
247*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
248*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
249*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
250*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
251*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
252*4bdc9457SAndroid Build Coastguard Worker }
253*4bdc9457SAndroid Build Coastguard Worker }
254*4bdc9457SAndroid Build Coastguard Worker }
255*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,positive_snan_to_qnan)256*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, positive_snan_to_qnan) {
257*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
258*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
259*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
260*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
261*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
262*4bdc9457SAndroid Build Coastguard Worker }
263*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
264*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
265*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
266*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
267*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
268*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
269*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
270*4bdc9457SAndroid Build Coastguard Worker }
271*4bdc9457SAndroid Build Coastguard Worker }
272*4bdc9457SAndroid Build Coastguard Worker }
273*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE_ADDSUB,negative_snan_to_qnan)274*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE_ADDSUB, negative_snan_to_qnan) {
275*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
276*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
277*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
278*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
279*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
280*4bdc9457SAndroid Build Coastguard Worker }
281*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
282*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
283*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
284*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
285*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
286*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
287*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
288*4bdc9457SAndroid Build Coastguard Worker }
289*4bdc9457SAndroid Build Coastguard Worker }
290*4bdc9457SAndroid Build Coastguard Worker }
291*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
292*4bdc9457SAndroid Build Coastguard Worker
293*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(ROUNDU__SSE2_CVT,positive_zero)294*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, positive_zero) {
295*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
296*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
297*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
298*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
299*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
300*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
301*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
302*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
303*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
304*4bdc9457SAndroid Build Coastguard Worker }
305*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,negative_zero)306*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, negative_zero) {
307*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
308*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
309*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
310*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
311*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
312*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
313*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
314*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
315*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
316*4bdc9457SAndroid Build Coastguard Worker }
317*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,positive_subnormal)318*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, positive_subnormal) {
319*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
320*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
321*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
322*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
323*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
324*4bdc9457SAndroid Build Coastguard Worker }
325*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
326*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
327*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
328*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
329*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
330*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
331*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
332*4bdc9457SAndroid Build Coastguard Worker }
333*4bdc9457SAndroid Build Coastguard Worker }
334*4bdc9457SAndroid Build Coastguard Worker }
335*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,negative_subnormal)336*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, negative_subnormal) {
337*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
338*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
339*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
340*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
341*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
342*4bdc9457SAndroid Build Coastguard Worker }
343*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
344*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
345*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
346*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
347*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
348*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
349*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
350*4bdc9457SAndroid Build Coastguard Worker }
351*4bdc9457SAndroid Build Coastguard Worker }
352*4bdc9457SAndroid Build Coastguard Worker }
353*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,positive_normal)354*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, positive_normal) {
355*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
356*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
357*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
358*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
359*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
360*4bdc9457SAndroid Build Coastguard Worker }
361*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
362*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
363*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
364*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
365*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
366*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
367*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
368*4bdc9457SAndroid Build Coastguard Worker }
369*4bdc9457SAndroid Build Coastguard Worker }
370*4bdc9457SAndroid Build Coastguard Worker }
371*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,negative_normal)372*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, negative_normal) {
373*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
374*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
375*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
376*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
377*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
378*4bdc9457SAndroid Build Coastguard Worker }
379*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
380*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
381*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
382*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
383*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
384*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
385*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
386*4bdc9457SAndroid Build Coastguard Worker }
387*4bdc9457SAndroid Build Coastguard Worker }
388*4bdc9457SAndroid Build Coastguard Worker }
389*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,positive_integral)390*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, positive_integral) {
391*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
392*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
393*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
394*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
395*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
396*4bdc9457SAndroid Build Coastguard Worker }
397*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
398*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
399*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
400*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
401*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
402*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
403*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
404*4bdc9457SAndroid Build Coastguard Worker }
405*4bdc9457SAndroid Build Coastguard Worker }
406*4bdc9457SAndroid Build Coastguard Worker }
407*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,negative_integral)408*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, negative_integral) {
409*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
410*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
411*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
412*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
413*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
414*4bdc9457SAndroid Build Coastguard Worker }
415*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
416*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
417*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
418*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
419*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
420*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
421*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
422*4bdc9457SAndroid Build Coastguard Worker }
423*4bdc9457SAndroid Build Coastguard Worker }
424*4bdc9457SAndroid Build Coastguard Worker }
425*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,positive_infinity)426*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, positive_infinity) {
427*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
428*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
429*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
430*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
431*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
432*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
433*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
434*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
435*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
436*4bdc9457SAndroid Build Coastguard Worker }
437*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,negative_infinity)438*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, negative_infinity) {
439*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
440*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
441*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
442*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
443*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
444*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
445*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
446*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
447*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
448*4bdc9457SAndroid Build Coastguard Worker }
449*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,positive_qnan)450*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, positive_qnan) {
451*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
452*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
453*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
454*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
455*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
456*4bdc9457SAndroid Build Coastguard Worker }
457*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
458*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
459*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
460*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
461*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
462*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
463*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
464*4bdc9457SAndroid Build Coastguard Worker }
465*4bdc9457SAndroid Build Coastguard Worker }
466*4bdc9457SAndroid Build Coastguard Worker }
467*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,negative_qnan)468*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, negative_qnan) {
469*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
470*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
471*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
472*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
473*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
474*4bdc9457SAndroid Build Coastguard Worker }
475*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
476*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
477*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
478*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
479*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
480*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
481*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
482*4bdc9457SAndroid Build Coastguard Worker }
483*4bdc9457SAndroid Build Coastguard Worker }
484*4bdc9457SAndroid Build Coastguard Worker }
485*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,positive_snan)486*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, positive_snan) {
487*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
488*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
489*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
490*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
491*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
492*4bdc9457SAndroid Build Coastguard Worker }
493*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
494*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
495*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
496*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
497*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
498*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
499*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
500*4bdc9457SAndroid Build Coastguard Worker }
501*4bdc9457SAndroid Build Coastguard Worker }
502*4bdc9457SAndroid Build Coastguard Worker }
503*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,negative_snan)504*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, negative_snan) {
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(0x7F800000); n < UINT32_C(0x7FC00000); 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(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
510*4bdc9457SAndroid Build Coastguard Worker }
511*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(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 const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
514*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
515*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
516*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
517*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
518*4bdc9457SAndroid Build Coastguard Worker }
519*4bdc9457SAndroid Build Coastguard Worker }
520*4bdc9457SAndroid Build Coastguard Worker }
521*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,positive_snan_to_qnan)522*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, positive_snan_to_qnan) {
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(0x7F800000); n < UINT32_C(0x7FC00000); 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::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
528*4bdc9457SAndroid Build Coastguard Worker }
529*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(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 const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
532*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
533*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
534*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
535*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
536*4bdc9457SAndroid Build Coastguard Worker }
537*4bdc9457SAndroid Build Coastguard Worker }
538*4bdc9457SAndroid Build Coastguard Worker }
539*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE2_CVT,negative_snan_to_qnan)540*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE2_CVT, negative_snan_to_qnan) {
541*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
542*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
543*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
544*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
545*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
546*4bdc9457SAndroid Build Coastguard Worker }
547*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse2_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
548*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
549*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
550*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
551*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
552*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
553*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
554*4bdc9457SAndroid Build Coastguard Worker }
555*4bdc9457SAndroid Build Coastguard Worker }
556*4bdc9457SAndroid Build Coastguard Worker }
557*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
558*4bdc9457SAndroid Build Coastguard Worker
559*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(ROUNDU__SSE41,positive_zero)560*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, positive_zero) {
561*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
562*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
563*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
564*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
565*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
566*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
567*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
568*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
569*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
570*4bdc9457SAndroid Build Coastguard Worker }
571*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,negative_zero)572*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, negative_zero) {
573*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
574*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
575*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
576*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
577*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
578*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
579*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
580*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
581*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
582*4bdc9457SAndroid Build Coastguard Worker }
583*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,positive_subnormal)584*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, positive_subnormal) {
585*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
586*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
587*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
588*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
589*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
590*4bdc9457SAndroid Build Coastguard Worker }
591*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
592*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
593*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
594*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
595*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
596*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
597*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
598*4bdc9457SAndroid Build Coastguard Worker }
599*4bdc9457SAndroid Build Coastguard Worker }
600*4bdc9457SAndroid Build Coastguard Worker }
601*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,negative_subnormal)602*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, negative_subnormal) {
603*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
604*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
605*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
606*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
607*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
608*4bdc9457SAndroid Build Coastguard Worker }
609*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
610*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
611*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
612*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
613*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
614*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
615*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
616*4bdc9457SAndroid Build Coastguard Worker }
617*4bdc9457SAndroid Build Coastguard Worker }
618*4bdc9457SAndroid Build Coastguard Worker }
619*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,positive_normal)620*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, positive_normal) {
621*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
622*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
623*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
624*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
625*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
626*4bdc9457SAndroid Build Coastguard Worker }
627*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
628*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
629*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
630*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
631*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
632*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
633*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
634*4bdc9457SAndroid Build Coastguard Worker }
635*4bdc9457SAndroid Build Coastguard Worker }
636*4bdc9457SAndroid Build Coastguard Worker }
637*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,negative_normal)638*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, negative_normal) {
639*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
640*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
641*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
642*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
643*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
644*4bdc9457SAndroid Build Coastguard Worker }
645*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
646*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
647*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
648*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
649*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
650*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
651*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
652*4bdc9457SAndroid Build Coastguard Worker }
653*4bdc9457SAndroid Build Coastguard Worker }
654*4bdc9457SAndroid Build Coastguard Worker }
655*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,positive_integral)656*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, positive_integral) {
657*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
658*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
659*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
660*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
661*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
662*4bdc9457SAndroid Build Coastguard Worker }
663*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
664*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
665*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
666*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
667*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
668*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
669*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
670*4bdc9457SAndroid Build Coastguard Worker }
671*4bdc9457SAndroid Build Coastguard Worker }
672*4bdc9457SAndroid Build Coastguard Worker }
673*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,negative_integral)674*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, negative_integral) {
675*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
676*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
677*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
678*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
679*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
680*4bdc9457SAndroid Build Coastguard Worker }
681*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
682*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
683*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
684*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
685*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
686*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
687*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
688*4bdc9457SAndroid Build Coastguard Worker }
689*4bdc9457SAndroid Build Coastguard Worker }
690*4bdc9457SAndroid Build Coastguard Worker }
691*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,positive_infinity)692*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, positive_infinity) {
693*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
694*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
695*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
696*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
697*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
698*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
699*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
700*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
701*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
702*4bdc9457SAndroid Build Coastguard Worker }
703*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,negative_infinity)704*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, negative_infinity) {
705*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
706*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
707*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
708*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
709*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
710*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
711*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
712*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
713*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
714*4bdc9457SAndroid Build Coastguard Worker }
715*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,positive_qnan)716*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, positive_qnan) {
717*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
718*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
719*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
720*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
721*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
722*4bdc9457SAndroid Build Coastguard Worker }
723*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
724*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
725*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
726*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
727*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
728*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
729*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
730*4bdc9457SAndroid Build Coastguard Worker }
731*4bdc9457SAndroid Build Coastguard Worker }
732*4bdc9457SAndroid Build Coastguard Worker }
733*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,negative_qnan)734*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, negative_qnan) {
735*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
736*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
737*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
738*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
739*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
740*4bdc9457SAndroid Build Coastguard Worker }
741*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
742*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
743*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
744*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
745*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
746*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
747*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
748*4bdc9457SAndroid Build Coastguard Worker }
749*4bdc9457SAndroid Build Coastguard Worker }
750*4bdc9457SAndroid Build Coastguard Worker }
751*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,positive_snan)752*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, positive_snan) {
753*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
754*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
755*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
756*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
757*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
758*4bdc9457SAndroid Build Coastguard Worker }
759*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
760*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
761*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
762*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
763*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
764*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
765*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
766*4bdc9457SAndroid Build Coastguard Worker }
767*4bdc9457SAndroid Build Coastguard Worker }
768*4bdc9457SAndroid Build Coastguard Worker }
769*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,negative_snan)770*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, negative_snan) {
771*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
772*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
773*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
774*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
775*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
776*4bdc9457SAndroid Build Coastguard Worker }
777*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
778*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
779*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
780*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
781*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
782*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
783*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
784*4bdc9457SAndroid Build Coastguard Worker }
785*4bdc9457SAndroid Build Coastguard Worker }
786*4bdc9457SAndroid Build Coastguard Worker }
787*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,positive_snan_to_qnan)788*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, positive_snan_to_qnan) {
789*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
790*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
791*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
792*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
793*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
794*4bdc9457SAndroid Build Coastguard Worker }
795*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
796*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
797*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
798*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
799*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
800*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
801*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
802*4bdc9457SAndroid Build Coastguard Worker }
803*4bdc9457SAndroid Build Coastguard Worker }
804*4bdc9457SAndroid Build Coastguard Worker }
805*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SSE41,negative_snan_to_qnan)806*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SSE41, negative_snan_to_qnan) {
807*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
808*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
809*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
810*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
811*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
812*4bdc9457SAndroid Build Coastguard Worker }
813*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__sse41(kBlockSize * sizeof(float), inputs.data(), outputs.data());
814*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
815*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
816*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
817*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
818*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
819*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
820*4bdc9457SAndroid Build Coastguard Worker }
821*4bdc9457SAndroid Build Coastguard Worker }
822*4bdc9457SAndroid Build Coastguard Worker }
823*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_X86 || XNN_ARCH_X86_64
824*4bdc9457SAndroid Build Coastguard Worker
825*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(ROUNDU__NEON_ADDSUB,positive_zero)826*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, positive_zero) {
827*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
828*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
829*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
830*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
831*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
832*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
833*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
834*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
835*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
836*4bdc9457SAndroid Build Coastguard Worker }
837*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,negative_zero)838*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, negative_zero) {
839*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
840*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
841*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
842*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
843*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
844*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
845*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
846*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
847*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
848*4bdc9457SAndroid Build Coastguard Worker }
849*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,positive_subnormal)850*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, positive_subnormal) {
851*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
852*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
853*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
854*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
855*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
856*4bdc9457SAndroid Build Coastguard Worker }
857*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
858*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
859*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
860*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
861*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
862*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
863*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
864*4bdc9457SAndroid Build Coastguard Worker }
865*4bdc9457SAndroid Build Coastguard Worker }
866*4bdc9457SAndroid Build Coastguard Worker }
867*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,negative_subnormal)868*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, negative_subnormal) {
869*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
870*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
871*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
872*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
873*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
874*4bdc9457SAndroid Build Coastguard Worker }
875*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
876*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
877*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
878*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(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 << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
881*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
882*4bdc9457SAndroid Build Coastguard Worker }
883*4bdc9457SAndroid Build Coastguard Worker }
884*4bdc9457SAndroid Build Coastguard Worker }
885*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,positive_normal)886*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, positive_normal) {
887*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
888*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
889*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
890*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
891*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
892*4bdc9457SAndroid Build Coastguard Worker }
893*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
894*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
895*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
896*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(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 << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
899*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
900*4bdc9457SAndroid Build Coastguard Worker }
901*4bdc9457SAndroid Build Coastguard Worker }
902*4bdc9457SAndroid Build Coastguard Worker }
903*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,negative_normal)904*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, negative_normal) {
905*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
906*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
907*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
908*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
909*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
910*4bdc9457SAndroid Build Coastguard Worker }
911*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
912*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
913*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
914*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
915*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
916*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
917*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
918*4bdc9457SAndroid Build Coastguard Worker }
919*4bdc9457SAndroid Build Coastguard Worker }
920*4bdc9457SAndroid Build Coastguard Worker }
921*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,positive_integral)922*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, positive_integral) {
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(0x4B800000); n < UINT32_C(0x7F800000); 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(n + i);
928*4bdc9457SAndroid Build Coastguard Worker }
929*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(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 uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
932*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(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') << 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(ROUNDU__NEON_ADDSUB,negative_integral)940*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, negative_integral) {
941*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
942*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
943*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
944*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
945*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
946*4bdc9457SAndroid Build Coastguard Worker }
947*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
948*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
949*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
950*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
951*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
952*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
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(ROUNDU__NEON_ADDSUB,positive_infinity)958*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, positive_infinity) {
959*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
960*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
961*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
962*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
963*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
964*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
965*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
966*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
967*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
968*4bdc9457SAndroid Build Coastguard Worker }
969*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,negative_infinity)970*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, negative_infinity) {
971*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
972*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
973*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
974*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
975*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
976*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
977*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
978*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
979*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
980*4bdc9457SAndroid Build Coastguard Worker }
981*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,positive_qnan)982*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, positive_qnan) {
983*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
984*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
985*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
986*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
987*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
988*4bdc9457SAndroid Build Coastguard Worker }
989*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
990*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
991*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
992*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
993*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
994*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
995*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
996*4bdc9457SAndroid Build Coastguard Worker }
997*4bdc9457SAndroid Build Coastguard Worker }
998*4bdc9457SAndroid Build Coastguard Worker }
999*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,negative_qnan)1000*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, negative_qnan) {
1001*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1002*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1003*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
1004*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1005*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
1006*4bdc9457SAndroid Build Coastguard Worker }
1007*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1008*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1009*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1010*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1011*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1012*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1013*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1014*4bdc9457SAndroid Build Coastguard Worker }
1015*4bdc9457SAndroid Build Coastguard Worker }
1016*4bdc9457SAndroid Build Coastguard Worker }
1017*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,positive_snan)1018*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, positive_snan) {
1019*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1020*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1021*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1022*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1023*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1024*4bdc9457SAndroid Build Coastguard Worker }
1025*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1026*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1027*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1028*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
1029*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1030*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1031*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1032*4bdc9457SAndroid Build Coastguard Worker }
1033*4bdc9457SAndroid Build Coastguard Worker }
1034*4bdc9457SAndroid Build Coastguard Worker }
1035*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,negative_snan)1036*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, negative_snan) {
1037*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1038*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1039*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1040*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1041*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1042*4bdc9457SAndroid Build Coastguard Worker }
1043*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1044*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1045*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1046*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
1047*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1048*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1049*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1050*4bdc9457SAndroid Build Coastguard Worker }
1051*4bdc9457SAndroid Build Coastguard Worker }
1052*4bdc9457SAndroid Build Coastguard Worker }
1053*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,positive_snan_to_qnan)1054*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, positive_snan_to_qnan) {
1055*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1056*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1057*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1058*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1059*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1060*4bdc9457SAndroid Build Coastguard Worker }
1061*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1062*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1063*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1064*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1065*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1066*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1067*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1068*4bdc9457SAndroid Build Coastguard Worker }
1069*4bdc9457SAndroid Build Coastguard Worker }
1070*4bdc9457SAndroid Build Coastguard Worker }
1071*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_ADDSUB,negative_snan_to_qnan)1072*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_ADDSUB, negative_snan_to_qnan) {
1073*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1074*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1075*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1076*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1077*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1078*4bdc9457SAndroid Build Coastguard Worker }
1079*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1080*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1081*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1082*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1083*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1084*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
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 #endif // XNN_ARCH_ARM || XNN_ARCH_ARM64
1090*4bdc9457SAndroid Build Coastguard Worker
1091*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(ROUNDU__NEON_CVT,positive_zero)1092*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, positive_zero) {
1093*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1094*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1095*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
1096*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1097*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1098*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1099*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1100*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1101*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1102*4bdc9457SAndroid Build Coastguard Worker }
1103*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,negative_zero)1104*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, negative_zero) {
1105*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1106*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1107*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
1108*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1109*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1110*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1111*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1112*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1113*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1114*4bdc9457SAndroid Build Coastguard Worker }
1115*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,positive_subnormal)1116*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, positive_subnormal) {
1117*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1118*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1119*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
1120*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1121*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
1122*4bdc9457SAndroid Build Coastguard Worker }
1123*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1124*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1125*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1126*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1127*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1128*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1129*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1130*4bdc9457SAndroid Build Coastguard Worker }
1131*4bdc9457SAndroid Build Coastguard Worker }
1132*4bdc9457SAndroid Build Coastguard Worker }
1133*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,negative_subnormal)1134*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, negative_subnormal) {
1135*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1136*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1137*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
1138*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1139*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
1140*4bdc9457SAndroid Build Coastguard Worker }
1141*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1142*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1143*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1144*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1145*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1146*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1147*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1148*4bdc9457SAndroid Build Coastguard Worker }
1149*4bdc9457SAndroid Build Coastguard Worker }
1150*4bdc9457SAndroid Build Coastguard Worker }
1151*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,positive_normal)1152*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, positive_normal) {
1153*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1154*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1155*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
1156*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1157*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1158*4bdc9457SAndroid Build Coastguard Worker }
1159*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1160*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1161*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1162*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1163*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1164*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1165*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1166*4bdc9457SAndroid Build Coastguard Worker }
1167*4bdc9457SAndroid Build Coastguard Worker }
1168*4bdc9457SAndroid Build Coastguard Worker }
1169*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,negative_normal)1170*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, negative_normal) {
1171*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1172*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1173*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
1174*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1175*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1176*4bdc9457SAndroid Build Coastguard Worker }
1177*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1178*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1179*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1180*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1181*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1182*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1183*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1184*4bdc9457SAndroid Build Coastguard Worker }
1185*4bdc9457SAndroid Build Coastguard Worker }
1186*4bdc9457SAndroid Build Coastguard Worker }
1187*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,positive_integral)1188*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, positive_integral) {
1189*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1190*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1191*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
1192*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1193*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1194*4bdc9457SAndroid Build Coastguard Worker }
1195*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1196*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1197*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1198*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1199*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1200*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1201*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1202*4bdc9457SAndroid Build Coastguard Worker }
1203*4bdc9457SAndroid Build Coastguard Worker }
1204*4bdc9457SAndroid Build Coastguard Worker }
1205*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,negative_integral)1206*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, negative_integral) {
1207*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1208*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1209*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
1210*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1211*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1212*4bdc9457SAndroid Build Coastguard Worker }
1213*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1214*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1215*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1216*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1217*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1218*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1219*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1220*4bdc9457SAndroid Build Coastguard Worker }
1221*4bdc9457SAndroid Build Coastguard Worker }
1222*4bdc9457SAndroid Build Coastguard Worker }
1223*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,positive_infinity)1224*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, positive_infinity) {
1225*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1226*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1227*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
1228*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1229*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1230*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1231*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1232*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1233*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1234*4bdc9457SAndroid Build Coastguard Worker }
1235*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,negative_infinity)1236*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, negative_infinity) {
1237*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1238*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1239*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
1240*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1241*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1242*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1243*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1244*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1245*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1246*4bdc9457SAndroid Build Coastguard Worker }
1247*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,positive_qnan)1248*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, positive_qnan) {
1249*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1250*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1251*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
1252*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1253*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1254*4bdc9457SAndroid Build Coastguard Worker }
1255*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1256*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1257*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1258*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1259*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1260*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1261*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1262*4bdc9457SAndroid Build Coastguard Worker }
1263*4bdc9457SAndroid Build Coastguard Worker }
1264*4bdc9457SAndroid Build Coastguard Worker }
1265*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,negative_qnan)1266*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, negative_qnan) {
1267*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1268*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1269*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
1270*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1271*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
1272*4bdc9457SAndroid Build Coastguard Worker }
1273*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1274*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1275*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1276*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1277*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1278*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1279*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1280*4bdc9457SAndroid Build Coastguard Worker }
1281*4bdc9457SAndroid Build Coastguard Worker }
1282*4bdc9457SAndroid Build Coastguard Worker }
1283*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,positive_snan)1284*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, positive_snan) {
1285*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1286*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1287*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1288*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1289*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1290*4bdc9457SAndroid Build Coastguard Worker }
1291*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1292*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1293*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1294*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
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 << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1297*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1298*4bdc9457SAndroid Build Coastguard Worker }
1299*4bdc9457SAndroid Build Coastguard Worker }
1300*4bdc9457SAndroid Build Coastguard Worker }
1301*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,negative_snan)1302*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, negative_snan) {
1303*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1304*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1305*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1306*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1307*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1308*4bdc9457SAndroid Build Coastguard Worker }
1309*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1310*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1311*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1312*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
1313*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1314*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1315*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1316*4bdc9457SAndroid Build Coastguard Worker }
1317*4bdc9457SAndroid Build Coastguard Worker }
1318*4bdc9457SAndroid Build Coastguard Worker }
1319*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,positive_snan_to_qnan)1320*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, positive_snan_to_qnan) {
1321*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1322*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1323*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1324*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1325*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1326*4bdc9457SAndroid Build Coastguard Worker }
1327*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1328*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1329*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1330*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1331*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1332*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1333*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1334*4bdc9457SAndroid Build Coastguard Worker }
1335*4bdc9457SAndroid Build Coastguard Worker }
1336*4bdc9457SAndroid Build Coastguard Worker }
1337*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEON_CVT,negative_snan_to_qnan)1338*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEON_CVT, negative_snan_to_qnan) {
1339*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1340*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1341*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1342*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1343*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1344*4bdc9457SAndroid Build Coastguard Worker }
1345*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neon_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1346*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1347*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1348*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1349*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1350*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1351*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1352*4bdc9457SAndroid Build Coastguard Worker }
1353*4bdc9457SAndroid Build Coastguard Worker }
1354*4bdc9457SAndroid Build Coastguard Worker }
1355*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_ARM || XNN_ARCH_ARM64
1356*4bdc9457SAndroid Build Coastguard Worker
1357*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(ROUNDU__NEONV8,positive_zero)1358*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, positive_zero) {
1359*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1360*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1361*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
1362*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1363*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1364*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1365*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1366*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1367*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1368*4bdc9457SAndroid Build Coastguard Worker }
1369*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,negative_zero)1370*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, negative_zero) {
1371*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1372*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1373*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
1374*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1375*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1376*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1377*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1378*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1379*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1380*4bdc9457SAndroid Build Coastguard Worker }
1381*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,positive_subnormal)1382*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, positive_subnormal) {
1383*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1384*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1385*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
1386*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1387*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
1388*4bdc9457SAndroid Build Coastguard Worker }
1389*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1390*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1391*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1392*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1393*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1394*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1395*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1396*4bdc9457SAndroid Build Coastguard Worker }
1397*4bdc9457SAndroid Build Coastguard Worker }
1398*4bdc9457SAndroid Build Coastguard Worker }
1399*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,negative_subnormal)1400*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, negative_subnormal) {
1401*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1402*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1403*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
1404*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1405*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
1406*4bdc9457SAndroid Build Coastguard Worker }
1407*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1408*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1409*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1410*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1411*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1412*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1413*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1414*4bdc9457SAndroid Build Coastguard Worker }
1415*4bdc9457SAndroid Build Coastguard Worker }
1416*4bdc9457SAndroid Build Coastguard Worker }
1417*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,positive_normal)1418*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, positive_normal) {
1419*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1420*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1421*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
1422*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1423*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1424*4bdc9457SAndroid Build Coastguard Worker }
1425*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1426*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1427*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1428*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1429*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1430*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1431*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1432*4bdc9457SAndroid Build Coastguard Worker }
1433*4bdc9457SAndroid Build Coastguard Worker }
1434*4bdc9457SAndroid Build Coastguard Worker }
1435*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,negative_normal)1436*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, negative_normal) {
1437*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1438*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1439*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
1440*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1441*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1442*4bdc9457SAndroid Build Coastguard Worker }
1443*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1444*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1445*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1446*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1447*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1448*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1449*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1450*4bdc9457SAndroid Build Coastguard Worker }
1451*4bdc9457SAndroid Build Coastguard Worker }
1452*4bdc9457SAndroid Build Coastguard Worker }
1453*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,positive_integral)1454*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, positive_integral) {
1455*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1456*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1457*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
1458*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1459*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1460*4bdc9457SAndroid Build Coastguard Worker }
1461*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1462*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1463*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1464*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1465*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1466*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1467*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1468*4bdc9457SAndroid Build Coastguard Worker }
1469*4bdc9457SAndroid Build Coastguard Worker }
1470*4bdc9457SAndroid Build Coastguard Worker }
1471*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,negative_integral)1472*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, negative_integral) {
1473*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1474*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1475*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
1476*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1477*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1478*4bdc9457SAndroid Build Coastguard Worker }
1479*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1480*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1481*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1482*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1483*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1484*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1485*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1486*4bdc9457SAndroid Build Coastguard Worker }
1487*4bdc9457SAndroid Build Coastguard Worker }
1488*4bdc9457SAndroid Build Coastguard Worker }
1489*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,positive_infinity)1490*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, positive_infinity) {
1491*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1492*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1493*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
1494*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1495*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1496*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1497*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1498*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1499*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1500*4bdc9457SAndroid Build Coastguard Worker }
1501*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,negative_infinity)1502*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, negative_infinity) {
1503*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1504*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1505*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
1506*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1507*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1508*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1509*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1510*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1511*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1512*4bdc9457SAndroid Build Coastguard Worker }
1513*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,positive_qnan)1514*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, positive_qnan) {
1515*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1516*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1517*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
1518*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1519*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1520*4bdc9457SAndroid Build Coastguard Worker }
1521*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1522*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1523*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1524*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1525*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1526*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1527*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1528*4bdc9457SAndroid Build Coastguard Worker }
1529*4bdc9457SAndroid Build Coastguard Worker }
1530*4bdc9457SAndroid Build Coastguard Worker }
1531*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,negative_qnan)1532*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, negative_qnan) {
1533*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1534*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1535*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
1536*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1537*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
1538*4bdc9457SAndroid Build Coastguard Worker }
1539*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1540*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1541*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1542*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1543*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1544*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1545*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1546*4bdc9457SAndroid Build Coastguard Worker }
1547*4bdc9457SAndroid Build Coastguard Worker }
1548*4bdc9457SAndroid Build Coastguard Worker }
1549*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,positive_snan)1550*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, positive_snan) {
1551*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1552*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1553*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1554*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1555*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1556*4bdc9457SAndroid Build Coastguard Worker }
1557*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1558*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1559*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1560*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
1561*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1562*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1563*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1564*4bdc9457SAndroid Build Coastguard Worker }
1565*4bdc9457SAndroid Build Coastguard Worker }
1566*4bdc9457SAndroid Build Coastguard Worker }
1567*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,negative_snan)1568*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, negative_snan) {
1569*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1570*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1571*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1572*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1573*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1574*4bdc9457SAndroid Build Coastguard Worker }
1575*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1576*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1577*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1578*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
1579*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1580*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1581*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1582*4bdc9457SAndroid Build Coastguard Worker }
1583*4bdc9457SAndroid Build Coastguard Worker }
1584*4bdc9457SAndroid Build Coastguard Worker }
1585*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,positive_snan_to_qnan)1586*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, positive_snan_to_qnan) {
1587*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1588*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1589*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1590*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1591*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1592*4bdc9457SAndroid Build Coastguard Worker }
1593*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1594*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1595*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1596*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(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 << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1599*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1600*4bdc9457SAndroid Build Coastguard Worker }
1601*4bdc9457SAndroid Build Coastguard Worker }
1602*4bdc9457SAndroid Build Coastguard Worker }
1603*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__NEONV8,negative_snan_to_qnan)1604*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__NEONV8, negative_snan_to_qnan) {
1605*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1606*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1607*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1608*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1609*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1610*4bdc9457SAndroid Build Coastguard Worker }
1611*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__neonv8(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1612*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1613*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1614*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1615*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1616*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1617*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1618*4bdc9457SAndroid Build Coastguard Worker }
1619*4bdc9457SAndroid Build Coastguard Worker }
1620*4bdc9457SAndroid Build Coastguard Worker }
1621*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_ARM || XNN_ARCH_ARM64
1622*4bdc9457SAndroid Build Coastguard Worker
1623*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(ROUNDU__WASMSIMD_ADDSUB,positive_zero)1624*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, positive_zero) {
1625*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1626*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1627*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
1628*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1629*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1630*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1631*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1632*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1633*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1634*4bdc9457SAndroid Build Coastguard Worker }
1635*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,negative_zero)1636*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, negative_zero) {
1637*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1638*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1639*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
1640*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1641*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1642*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1643*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1644*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1645*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1646*4bdc9457SAndroid Build Coastguard Worker }
1647*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,positive_subnormal)1648*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, positive_subnormal) {
1649*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1650*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1651*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
1652*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1653*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
1654*4bdc9457SAndroid Build Coastguard Worker }
1655*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1656*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1657*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1658*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1659*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1660*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
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(ROUNDU__WASMSIMD_ADDSUB,negative_subnormal)1666*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, negative_subnormal) {
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(0x80000000); n < UINT32_C(0x80800000); 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::max<uint32_t>(n + i, UINT32_C(0x80000001)));
1672*4bdc9457SAndroid Build Coastguard Worker }
1673*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(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 const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1676*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1677*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1678*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1679*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1680*4bdc9457SAndroid Build Coastguard Worker }
1681*4bdc9457SAndroid Build Coastguard Worker }
1682*4bdc9457SAndroid Build Coastguard Worker }
1683*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,positive_normal)1684*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, positive_normal) {
1685*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1686*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1687*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
1688*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1689*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1690*4bdc9457SAndroid Build Coastguard Worker }
1691*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1692*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1693*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1694*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1695*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1696*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1697*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1698*4bdc9457SAndroid Build Coastguard Worker }
1699*4bdc9457SAndroid Build Coastguard Worker }
1700*4bdc9457SAndroid Build Coastguard Worker }
1701*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,negative_normal)1702*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, negative_normal) {
1703*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1704*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1705*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
1706*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1707*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1708*4bdc9457SAndroid Build Coastguard Worker }
1709*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1710*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1711*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1712*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1713*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1714*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1715*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1716*4bdc9457SAndroid Build Coastguard Worker }
1717*4bdc9457SAndroid Build Coastguard Worker }
1718*4bdc9457SAndroid Build Coastguard Worker }
1719*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,positive_integral)1720*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, positive_integral) {
1721*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1722*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1723*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
1724*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1725*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1726*4bdc9457SAndroid Build Coastguard Worker }
1727*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1728*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1729*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1730*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1731*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1732*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1733*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1734*4bdc9457SAndroid Build Coastguard Worker }
1735*4bdc9457SAndroid Build Coastguard Worker }
1736*4bdc9457SAndroid Build Coastguard Worker }
1737*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,negative_integral)1738*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, negative_integral) {
1739*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1740*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1741*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
1742*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1743*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1744*4bdc9457SAndroid Build Coastguard Worker }
1745*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1746*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1747*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1748*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1749*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1750*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1751*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1752*4bdc9457SAndroid Build Coastguard Worker }
1753*4bdc9457SAndroid Build Coastguard Worker }
1754*4bdc9457SAndroid Build Coastguard Worker }
1755*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,positive_infinity)1756*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, positive_infinity) {
1757*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1758*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1759*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
1760*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1761*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1762*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1763*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1764*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1765*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1766*4bdc9457SAndroid Build Coastguard Worker }
1767*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,negative_infinity)1768*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, negative_infinity) {
1769*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1770*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1771*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
1772*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1773*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1774*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1775*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1776*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1777*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1778*4bdc9457SAndroid Build Coastguard Worker }
1779*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,positive_qnan)1780*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, positive_qnan) {
1781*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1782*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1783*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
1784*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1785*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1786*4bdc9457SAndroid Build Coastguard Worker }
1787*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1788*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1789*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1790*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1791*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1792*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1793*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1794*4bdc9457SAndroid Build Coastguard Worker }
1795*4bdc9457SAndroid Build Coastguard Worker }
1796*4bdc9457SAndroid Build Coastguard Worker }
1797*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,negative_qnan)1798*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, negative_qnan) {
1799*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1800*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1801*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
1802*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1803*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
1804*4bdc9457SAndroid Build Coastguard Worker }
1805*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1806*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1807*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1808*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1809*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1810*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1811*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1812*4bdc9457SAndroid Build Coastguard Worker }
1813*4bdc9457SAndroid Build Coastguard Worker }
1814*4bdc9457SAndroid Build Coastguard Worker }
1815*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,positive_snan)1816*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, positive_snan) {
1817*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1818*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1819*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1820*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1821*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1822*4bdc9457SAndroid Build Coastguard Worker }
1823*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1824*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1825*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1826*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
1827*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1828*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1829*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1830*4bdc9457SAndroid Build Coastguard Worker }
1831*4bdc9457SAndroid Build Coastguard Worker }
1832*4bdc9457SAndroid Build Coastguard Worker }
1833*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,negative_snan)1834*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, negative_snan) {
1835*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1836*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1837*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1838*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1839*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1840*4bdc9457SAndroid Build Coastguard Worker }
1841*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1842*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1843*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1844*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
1845*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1846*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1847*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1848*4bdc9457SAndroid Build Coastguard Worker }
1849*4bdc9457SAndroid Build Coastguard Worker }
1850*4bdc9457SAndroid Build Coastguard Worker }
1851*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,positive_snan_to_qnan)1852*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, positive_snan_to_qnan) {
1853*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1854*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1855*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1856*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1857*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1858*4bdc9457SAndroid Build Coastguard Worker }
1859*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1860*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1861*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1862*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1863*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1864*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1865*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1866*4bdc9457SAndroid Build Coastguard Worker }
1867*4bdc9457SAndroid Build Coastguard Worker }
1868*4bdc9457SAndroid Build Coastguard Worker }
1869*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_ADDSUB,negative_snan_to_qnan)1870*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_ADDSUB, negative_snan_to_qnan) {
1871*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1872*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1873*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
1874*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1875*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
1876*4bdc9457SAndroid Build Coastguard Worker }
1877*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1878*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1879*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1880*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1881*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1882*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1883*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1884*4bdc9457SAndroid Build Coastguard Worker }
1885*4bdc9457SAndroid Build Coastguard Worker }
1886*4bdc9457SAndroid Build Coastguard Worker }
1887*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1888*4bdc9457SAndroid Build Coastguard Worker
1889*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(ROUNDU__WASMSIMD_CVT,positive_zero)1890*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, positive_zero) {
1891*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1892*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1893*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
1894*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1895*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1896*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1897*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1898*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1899*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1900*4bdc9457SAndroid Build Coastguard Worker }
1901*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,negative_zero)1902*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, negative_zero) {
1903*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1904*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1905*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
1906*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1907*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
1908*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
1909*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
1910*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1911*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
1912*4bdc9457SAndroid Build Coastguard Worker }
1913*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,positive_subnormal)1914*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, positive_subnormal) {
1915*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1916*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1917*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
1918*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1919*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
1920*4bdc9457SAndroid Build Coastguard Worker }
1921*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1922*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1923*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1924*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1925*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1926*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1927*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1928*4bdc9457SAndroid Build Coastguard Worker }
1929*4bdc9457SAndroid Build Coastguard Worker }
1930*4bdc9457SAndroid Build Coastguard Worker }
1931*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,negative_subnormal)1932*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, negative_subnormal) {
1933*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1934*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1935*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
1936*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1937*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
1938*4bdc9457SAndroid Build Coastguard Worker }
1939*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1940*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1941*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1942*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1943*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1944*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1945*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1946*4bdc9457SAndroid Build Coastguard Worker }
1947*4bdc9457SAndroid Build Coastguard Worker }
1948*4bdc9457SAndroid Build Coastguard Worker }
1949*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,positive_normal)1950*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, positive_normal) {
1951*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1952*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1953*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
1954*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1955*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1956*4bdc9457SAndroid Build Coastguard Worker }
1957*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1958*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1959*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1960*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1961*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1962*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1963*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1964*4bdc9457SAndroid Build Coastguard Worker }
1965*4bdc9457SAndroid Build Coastguard Worker }
1966*4bdc9457SAndroid Build Coastguard Worker }
1967*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,negative_normal)1968*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, negative_normal) {
1969*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1970*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1971*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
1972*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1973*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1974*4bdc9457SAndroid Build Coastguard Worker }
1975*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1976*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1977*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1978*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1979*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1980*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1981*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
1982*4bdc9457SAndroid Build Coastguard Worker }
1983*4bdc9457SAndroid Build Coastguard Worker }
1984*4bdc9457SAndroid Build Coastguard Worker }
1985*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,positive_integral)1986*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, positive_integral) {
1987*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
1988*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
1989*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
1990*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1991*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
1992*4bdc9457SAndroid Build Coastguard Worker }
1993*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
1994*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
1995*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
1996*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
1997*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
1998*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
1999*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2000*4bdc9457SAndroid Build Coastguard Worker }
2001*4bdc9457SAndroid Build Coastguard Worker }
2002*4bdc9457SAndroid Build Coastguard Worker }
2003*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,negative_integral)2004*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, negative_integral) {
2005*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2006*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2007*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
2008*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2009*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2010*4bdc9457SAndroid Build Coastguard Worker }
2011*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2012*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2013*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2014*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2015*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2016*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2017*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2018*4bdc9457SAndroid Build Coastguard Worker }
2019*4bdc9457SAndroid Build Coastguard Worker }
2020*4bdc9457SAndroid Build Coastguard Worker }
2021*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,positive_infinity)2022*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, positive_infinity) {
2023*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2024*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2025*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
2026*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2027*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2028*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2029*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2030*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2031*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2032*4bdc9457SAndroid Build Coastguard Worker }
2033*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,negative_infinity)2034*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, negative_infinity) {
2035*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2036*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2037*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
2038*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2039*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2040*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2041*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2042*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2043*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2044*4bdc9457SAndroid Build Coastguard Worker }
2045*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,positive_qnan)2046*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, positive_qnan) {
2047*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2048*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2049*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
2050*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2051*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2052*4bdc9457SAndroid Build Coastguard Worker }
2053*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2054*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2055*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2056*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2057*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2058*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2059*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2060*4bdc9457SAndroid Build Coastguard Worker }
2061*4bdc9457SAndroid Build Coastguard Worker }
2062*4bdc9457SAndroid Build Coastguard Worker }
2063*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,negative_qnan)2064*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, negative_qnan) {
2065*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2066*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2067*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
2068*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2069*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
2070*4bdc9457SAndroid Build Coastguard Worker }
2071*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2072*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2073*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2074*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2075*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2076*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2077*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2078*4bdc9457SAndroid Build Coastguard Worker }
2079*4bdc9457SAndroid Build Coastguard Worker }
2080*4bdc9457SAndroid Build Coastguard Worker }
2081*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,positive_snan)2082*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, positive_snan) {
2083*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2084*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2085*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2086*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2087*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2088*4bdc9457SAndroid Build Coastguard Worker }
2089*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2090*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2091*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2092*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
2093*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2094*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2095*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2096*4bdc9457SAndroid Build Coastguard Worker }
2097*4bdc9457SAndroid Build Coastguard Worker }
2098*4bdc9457SAndroid Build Coastguard Worker }
2099*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,negative_snan)2100*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, negative_snan) {
2101*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2102*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2103*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2104*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2105*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2106*4bdc9457SAndroid Build Coastguard Worker }
2107*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2108*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2109*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2110*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
2111*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2112*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2113*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2114*4bdc9457SAndroid Build Coastguard Worker }
2115*4bdc9457SAndroid Build Coastguard Worker }
2116*4bdc9457SAndroid Build Coastguard Worker }
2117*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,positive_snan_to_qnan)2118*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, positive_snan_to_qnan) {
2119*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2120*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2121*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2122*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2123*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2124*4bdc9457SAndroid Build Coastguard Worker }
2125*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2126*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2127*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2128*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2129*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2130*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2131*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2132*4bdc9457SAndroid Build Coastguard Worker }
2133*4bdc9457SAndroid Build Coastguard Worker }
2134*4bdc9457SAndroid Build Coastguard Worker }
2135*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_CVT,negative_snan_to_qnan)2136*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_CVT, negative_snan_to_qnan) {
2137*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2138*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2139*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2140*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2141*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2142*4bdc9457SAndroid Build Coastguard Worker }
2143*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2144*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2145*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2146*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2147*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2148*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2149*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2150*4bdc9457SAndroid Build Coastguard Worker }
2151*4bdc9457SAndroid Build Coastguard Worker }
2152*4bdc9457SAndroid Build Coastguard Worker }
2153*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
2154*4bdc9457SAndroid Build Coastguard Worker
2155*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(ROUNDU__WASMSIMD_NATIVE,positive_zero)2156*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, positive_zero) {
2157*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2158*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2159*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
2160*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2161*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2162*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2163*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2164*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2165*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2166*4bdc9457SAndroid Build Coastguard Worker }
2167*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,negative_zero)2168*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, negative_zero) {
2169*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2170*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2171*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
2172*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2173*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2174*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2175*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2176*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2177*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2178*4bdc9457SAndroid Build Coastguard Worker }
2179*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,positive_subnormal)2180*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, positive_subnormal) {
2181*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2182*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2183*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
2184*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2185*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
2186*4bdc9457SAndroid Build Coastguard Worker }
2187*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2188*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2189*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2190*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2191*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2192*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2193*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2194*4bdc9457SAndroid Build Coastguard Worker }
2195*4bdc9457SAndroid Build Coastguard Worker }
2196*4bdc9457SAndroid Build Coastguard Worker }
2197*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,negative_subnormal)2198*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, negative_subnormal) {
2199*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2200*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2201*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
2202*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2203*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
2204*4bdc9457SAndroid Build Coastguard Worker }
2205*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2206*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2207*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2208*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2209*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2210*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2211*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2212*4bdc9457SAndroid Build Coastguard Worker }
2213*4bdc9457SAndroid Build Coastguard Worker }
2214*4bdc9457SAndroid Build Coastguard Worker }
2215*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,positive_normal)2216*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, positive_normal) {
2217*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2218*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2219*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
2220*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2221*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2222*4bdc9457SAndroid Build Coastguard Worker }
2223*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2224*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2225*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2226*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2227*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2228*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2229*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2230*4bdc9457SAndroid Build Coastguard Worker }
2231*4bdc9457SAndroid Build Coastguard Worker }
2232*4bdc9457SAndroid Build Coastguard Worker }
2233*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,negative_normal)2234*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, negative_normal) {
2235*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2236*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2237*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
2238*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2239*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2240*4bdc9457SAndroid Build Coastguard Worker }
2241*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2242*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2243*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2244*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2245*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2246*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2247*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2248*4bdc9457SAndroid Build Coastguard Worker }
2249*4bdc9457SAndroid Build Coastguard Worker }
2250*4bdc9457SAndroid Build Coastguard Worker }
2251*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,positive_integral)2252*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, positive_integral) {
2253*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2254*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2255*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
2256*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2257*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2258*4bdc9457SAndroid Build Coastguard Worker }
2259*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2260*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2261*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2262*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2263*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2264*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2265*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2266*4bdc9457SAndroid Build Coastguard Worker }
2267*4bdc9457SAndroid Build Coastguard Worker }
2268*4bdc9457SAndroid Build Coastguard Worker }
2269*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,negative_integral)2270*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, negative_integral) {
2271*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2272*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2273*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
2274*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2275*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2276*4bdc9457SAndroid Build Coastguard Worker }
2277*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2278*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2279*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2280*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2281*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2282*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2283*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2284*4bdc9457SAndroid Build Coastguard Worker }
2285*4bdc9457SAndroid Build Coastguard Worker }
2286*4bdc9457SAndroid Build Coastguard Worker }
2287*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,positive_infinity)2288*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, positive_infinity) {
2289*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2290*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2291*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
2292*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2293*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2294*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2295*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2296*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2297*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2298*4bdc9457SAndroid Build Coastguard Worker }
2299*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,negative_infinity)2300*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, negative_infinity) {
2301*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2302*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2303*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
2304*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2305*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2306*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2307*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2308*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2309*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2310*4bdc9457SAndroid Build Coastguard Worker }
2311*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,positive_qnan)2312*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, positive_qnan) {
2313*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2314*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2315*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
2316*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2317*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2318*4bdc9457SAndroid Build Coastguard Worker }
2319*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2320*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2321*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2322*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2323*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2324*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2325*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2326*4bdc9457SAndroid Build Coastguard Worker }
2327*4bdc9457SAndroid Build Coastguard Worker }
2328*4bdc9457SAndroid Build Coastguard Worker }
2329*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,negative_qnan)2330*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, negative_qnan) {
2331*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2332*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2333*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
2334*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2335*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
2336*4bdc9457SAndroid Build Coastguard Worker }
2337*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2338*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2339*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2340*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2341*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2342*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2343*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2344*4bdc9457SAndroid Build Coastguard Worker }
2345*4bdc9457SAndroid Build Coastguard Worker }
2346*4bdc9457SAndroid Build Coastguard Worker }
2347*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,positive_snan)2348*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, positive_snan) {
2349*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2350*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2351*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2352*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2353*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2354*4bdc9457SAndroid Build Coastguard Worker }
2355*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2356*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2357*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2358*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
2359*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2360*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2361*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2362*4bdc9457SAndroid Build Coastguard Worker }
2363*4bdc9457SAndroid Build Coastguard Worker }
2364*4bdc9457SAndroid Build Coastguard Worker }
2365*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,negative_snan)2366*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, negative_snan) {
2367*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2368*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2369*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2370*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2371*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2372*4bdc9457SAndroid Build Coastguard Worker }
2373*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2374*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2375*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2376*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
2377*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2378*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2379*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2380*4bdc9457SAndroid Build Coastguard Worker }
2381*4bdc9457SAndroid Build Coastguard Worker }
2382*4bdc9457SAndroid Build Coastguard Worker }
2383*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,positive_snan_to_qnan)2384*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, positive_snan_to_qnan) {
2385*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2386*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2387*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2388*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2389*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2390*4bdc9457SAndroid Build Coastguard Worker }
2391*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2392*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2393*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2394*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2395*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2396*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2397*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2398*4bdc9457SAndroid Build Coastguard Worker }
2399*4bdc9457SAndroid Build Coastguard Worker }
2400*4bdc9457SAndroid Build Coastguard Worker }
2401*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__WASMSIMD_NATIVE,negative_snan_to_qnan)2402*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__WASMSIMD_NATIVE, negative_snan_to_qnan) {
2403*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2404*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2405*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2406*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2407*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2408*4bdc9457SAndroid Build Coastguard Worker }
2409*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__wasmsimd_native(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2410*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2411*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2412*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2413*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2414*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2415*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2416*4bdc9457SAndroid Build Coastguard Worker }
2417*4bdc9457SAndroid Build Coastguard Worker }
2418*4bdc9457SAndroid Build Coastguard Worker }
2419*4bdc9457SAndroid Build Coastguard Worker #endif // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
2420*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,positive_zero)2421*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, positive_zero) {
2422*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2423*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2424*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
2425*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2426*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2427*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2428*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2429*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2430*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2431*4bdc9457SAndroid Build Coastguard Worker }
2432*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,negative_zero)2433*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, negative_zero) {
2434*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2435*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2436*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
2437*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2438*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2439*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2440*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2441*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2442*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2443*4bdc9457SAndroid Build Coastguard Worker }
2444*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,positive_subnormal)2445*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, positive_subnormal) {
2446*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2447*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2448*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
2449*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2450*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
2451*4bdc9457SAndroid Build Coastguard Worker }
2452*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2453*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2454*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2455*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2456*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2457*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2458*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2459*4bdc9457SAndroid Build Coastguard Worker }
2460*4bdc9457SAndroid Build Coastguard Worker }
2461*4bdc9457SAndroid Build Coastguard Worker }
2462*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,negative_subnormal)2463*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, negative_subnormal) {
2464*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2465*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2466*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
2467*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2468*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
2469*4bdc9457SAndroid Build Coastguard Worker }
2470*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2471*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2472*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2473*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2474*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2475*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2476*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2477*4bdc9457SAndroid Build Coastguard Worker }
2478*4bdc9457SAndroid Build Coastguard Worker }
2479*4bdc9457SAndroid Build Coastguard Worker }
2480*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,positive_normal)2481*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, positive_normal) {
2482*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2483*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2484*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
2485*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2486*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2487*4bdc9457SAndroid Build Coastguard Worker }
2488*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2489*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2490*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2491*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2492*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2493*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2494*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2495*4bdc9457SAndroid Build Coastguard Worker }
2496*4bdc9457SAndroid Build Coastguard Worker }
2497*4bdc9457SAndroid Build Coastguard Worker }
2498*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,negative_normal)2499*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, negative_normal) {
2500*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2501*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2502*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
2503*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2504*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2505*4bdc9457SAndroid Build Coastguard Worker }
2506*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2507*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2508*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2509*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2510*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2511*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2512*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2513*4bdc9457SAndroid Build Coastguard Worker }
2514*4bdc9457SAndroid Build Coastguard Worker }
2515*4bdc9457SAndroid Build Coastguard Worker }
2516*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,positive_integral)2517*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, positive_integral) {
2518*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2519*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2520*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
2521*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2522*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2523*4bdc9457SAndroid Build Coastguard Worker }
2524*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2525*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2526*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2527*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2528*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2529*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2530*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2531*4bdc9457SAndroid Build Coastguard Worker }
2532*4bdc9457SAndroid Build Coastguard Worker }
2533*4bdc9457SAndroid Build Coastguard Worker }
2534*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,negative_integral)2535*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, negative_integral) {
2536*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2537*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2538*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
2539*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2540*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2541*4bdc9457SAndroid Build Coastguard Worker }
2542*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2543*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2544*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2545*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2546*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2547*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2548*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2549*4bdc9457SAndroid Build Coastguard Worker }
2550*4bdc9457SAndroid Build Coastguard Worker }
2551*4bdc9457SAndroid Build Coastguard Worker }
2552*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,positive_infinity)2553*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, positive_infinity) {
2554*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2555*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2556*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
2557*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2558*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2559*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2560*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2561*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2562*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2563*4bdc9457SAndroid Build Coastguard Worker }
2564*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,negative_infinity)2565*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, negative_infinity) {
2566*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2567*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2568*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
2569*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2570*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2571*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2572*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2573*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2574*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2575*4bdc9457SAndroid Build Coastguard Worker }
2576*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,positive_qnan)2577*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, positive_qnan) {
2578*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2579*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2580*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
2581*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2582*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2583*4bdc9457SAndroid Build Coastguard Worker }
2584*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2585*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2586*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2587*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2588*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2589*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2590*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2591*4bdc9457SAndroid Build Coastguard Worker }
2592*4bdc9457SAndroid Build Coastguard Worker }
2593*4bdc9457SAndroid Build Coastguard Worker }
2594*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,negative_qnan)2595*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, negative_qnan) {
2596*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2597*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2598*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
2599*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2600*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
2601*4bdc9457SAndroid Build Coastguard Worker }
2602*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2603*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2604*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2605*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2606*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2607*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2608*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2609*4bdc9457SAndroid Build Coastguard Worker }
2610*4bdc9457SAndroid Build Coastguard Worker }
2611*4bdc9457SAndroid Build Coastguard Worker }
2612*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,positive_snan)2613*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, positive_snan) {
2614*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2615*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2616*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2617*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2618*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2619*4bdc9457SAndroid Build Coastguard Worker }
2620*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2621*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2622*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2623*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
2624*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2625*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2626*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2627*4bdc9457SAndroid Build Coastguard Worker }
2628*4bdc9457SAndroid Build Coastguard Worker }
2629*4bdc9457SAndroid Build Coastguard Worker }
2630*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,negative_snan)2631*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, negative_snan) {
2632*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2633*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2634*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2635*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2636*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2637*4bdc9457SAndroid Build Coastguard Worker }
2638*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2639*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2640*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2641*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
2642*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2643*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2644*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2645*4bdc9457SAndroid Build Coastguard Worker }
2646*4bdc9457SAndroid Build Coastguard Worker }
2647*4bdc9457SAndroid Build Coastguard Worker }
2648*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,positive_snan_to_qnan)2649*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, positive_snan_to_qnan) {
2650*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2651*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2652*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2653*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2654*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2655*4bdc9457SAndroid Build Coastguard Worker }
2656*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2657*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2658*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2659*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2660*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2661*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2662*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2663*4bdc9457SAndroid Build Coastguard Worker }
2664*4bdc9457SAndroid Build Coastguard Worker }
2665*4bdc9457SAndroid Build Coastguard Worker }
2666*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_ADDSUB,negative_snan_to_qnan)2667*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_ADDSUB, negative_snan_to_qnan) {
2668*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2669*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2670*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2671*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2672*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2673*4bdc9457SAndroid Build Coastguard Worker }
2674*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_addsub(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2675*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2676*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2677*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2678*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2679*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2680*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2681*4bdc9457SAndroid Build Coastguard Worker }
2682*4bdc9457SAndroid Build Coastguard Worker }
2683*4bdc9457SAndroid Build Coastguard Worker }
2684*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,positive_zero)2685*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, positive_zero) {
2686*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2687*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2688*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x00000000));
2689*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2690*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2691*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2692*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2693*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2694*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2695*4bdc9457SAndroid Build Coastguard Worker }
2696*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,negative_zero)2697*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, negative_zero) {
2698*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2699*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2700*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), UINT32_C(0x80000000));
2701*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2702*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2703*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2704*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2705*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2706*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2707*4bdc9457SAndroid Build Coastguard Worker }
2708*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,positive_subnormal)2709*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, positive_subnormal) {
2710*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2711*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2712*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00000000); n < UINT32_C(0x00800000); n += kBlockSize) {
2713*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2714*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x00000001)));
2715*4bdc9457SAndroid Build Coastguard Worker }
2716*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2717*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2718*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2719*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2720*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2721*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2722*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2723*4bdc9457SAndroid Build Coastguard Worker }
2724*4bdc9457SAndroid Build Coastguard Worker }
2725*4bdc9457SAndroid Build Coastguard Worker }
2726*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,negative_subnormal)2727*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, negative_subnormal) {
2728*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2729*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2730*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80000000); n < UINT32_C(0x80800000); n += kBlockSize) {
2731*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2732*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x80000001)));
2733*4bdc9457SAndroid Build Coastguard Worker }
2734*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2735*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2736*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2737*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2738*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2739*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2740*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2741*4bdc9457SAndroid Build Coastguard Worker }
2742*4bdc9457SAndroid Build Coastguard Worker }
2743*4bdc9457SAndroid Build Coastguard Worker }
2744*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,positive_normal)2745*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, positive_normal) {
2746*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2747*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2748*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x00800000); n < UINT32_C(0x4B800000); n += kBlockSize) {
2749*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2750*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2751*4bdc9457SAndroid Build Coastguard Worker }
2752*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2753*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2754*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2755*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2756*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2757*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2758*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2759*4bdc9457SAndroid Build Coastguard Worker }
2760*4bdc9457SAndroid Build Coastguard Worker }
2761*4bdc9457SAndroid Build Coastguard Worker }
2762*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,negative_normal)2763*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, negative_normal) {
2764*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2765*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2766*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x80800000); n < UINT32_C(0xCB800000); n += kBlockSize) {
2767*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2768*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2769*4bdc9457SAndroid Build Coastguard Worker }
2770*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2771*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2772*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2773*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2774*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2775*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2776*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2777*4bdc9457SAndroid Build Coastguard Worker }
2778*4bdc9457SAndroid Build Coastguard Worker }
2779*4bdc9457SAndroid Build Coastguard Worker }
2780*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,positive_integral)2781*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, positive_integral) {
2782*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2783*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2784*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x4B800000); n < UINT32_C(0x7F800000); n += kBlockSize) {
2785*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2786*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2787*4bdc9457SAndroid Build Coastguard Worker }
2788*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2789*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2790*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2791*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2792*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2793*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2794*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2795*4bdc9457SAndroid Build Coastguard Worker }
2796*4bdc9457SAndroid Build Coastguard Worker }
2797*4bdc9457SAndroid Build Coastguard Worker }
2798*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,negative_integral)2799*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, negative_integral) {
2800*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2801*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2802*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0xCB800000); n < UINT32_C(0xFF800000); n += kBlockSize) {
2803*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2804*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2805*4bdc9457SAndroid Build Coastguard Worker }
2806*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2807*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2808*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2809*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2810*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2811*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2812*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2813*4bdc9457SAndroid Build Coastguard Worker }
2814*4bdc9457SAndroid Build Coastguard Worker }
2815*4bdc9457SAndroid Build Coastguard Worker }
2816*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,positive_infinity)2817*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, positive_infinity) {
2818*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2819*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2820*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), +std::numeric_limits<float>::infinity());
2821*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2822*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2823*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2824*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2825*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2826*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2827*4bdc9457SAndroid Build Coastguard Worker }
2828*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,negative_infinity)2829*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, negative_infinity) {
2830*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2831*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2832*4bdc9457SAndroid Build Coastguard Worker std::fill(inputs.begin(), inputs.end(), -std::numeric_limits<float>::infinity());
2833*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2834*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[0]));
2835*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[0]))
2836*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[0])
2837*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2838*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[0]);
2839*4bdc9457SAndroid Build Coastguard Worker }
2840*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,positive_qnan)2841*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, positive_qnan) {
2842*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2843*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2844*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
2845*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2846*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(n + i);
2847*4bdc9457SAndroid Build Coastguard Worker }
2848*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2849*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2850*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2851*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2852*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2853*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2854*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2855*4bdc9457SAndroid Build Coastguard Worker }
2856*4bdc9457SAndroid Build Coastguard Worker }
2857*4bdc9457SAndroid Build Coastguard Worker }
2858*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,negative_qnan)2859*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, negative_qnan) {
2860*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2861*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2862*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7FC00000); n < UINT32_C(0x80000000); n += kBlockSize) {
2863*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2864*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | (n + i));
2865*4bdc9457SAndroid Build Coastguard Worker }
2866*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2867*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2868*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2869*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2870*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2871*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2872*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2873*4bdc9457SAndroid Build Coastguard Worker }
2874*4bdc9457SAndroid Build Coastguard Worker }
2875*4bdc9457SAndroid Build Coastguard Worker }
2876*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,positive_snan)2877*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, positive_snan) {
2878*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2879*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2880*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2881*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2882*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2883*4bdc9457SAndroid Build Coastguard Worker }
2884*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2885*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2886*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2887*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
2888*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2889*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2890*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2891*4bdc9457SAndroid Build Coastguard Worker }
2892*4bdc9457SAndroid Build Coastguard Worker }
2893*4bdc9457SAndroid Build Coastguard Worker }
2894*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,negative_snan)2895*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, negative_snan) {
2896*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2897*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2898*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2899*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2900*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2901*4bdc9457SAndroid Build Coastguard Worker }
2902*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2903*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2904*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2905*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output & UINT32_C(0xFFBFFFFF), float_as_uint32(outputs[i]) & UINT32_C(0xFFBFFFFF))
2906*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2907*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2908*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2909*4bdc9457SAndroid Build Coastguard Worker }
2910*4bdc9457SAndroid Build Coastguard Worker }
2911*4bdc9457SAndroid Build Coastguard Worker }
2912*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,positive_snan_to_qnan)2913*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, positive_snan_to_qnan) {
2914*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2915*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2916*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2917*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2918*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2919*4bdc9457SAndroid Build Coastguard Worker }
2920*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2921*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2922*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2923*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2924*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2925*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2926*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2927*4bdc9457SAndroid Build Coastguard Worker }
2928*4bdc9457SAndroid Build Coastguard Worker }
2929*4bdc9457SAndroid Build Coastguard Worker }
2930*4bdc9457SAndroid Build Coastguard Worker
TEST(ROUNDU__SCALAR_CVT,negative_snan_to_qnan)2931*4bdc9457SAndroid Build Coastguard Worker TEST(ROUNDU__SCALAR_CVT, negative_snan_to_qnan) {
2932*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> inputs(kBlockSize);
2933*4bdc9457SAndroid Build Coastguard Worker std::vector<float, AlignedAllocator<float, 64>> outputs(kBlockSize);
2934*4bdc9457SAndroid Build Coastguard Worker for (uint32_t n = UINT32_C(0x7F800000); n < UINT32_C(0x7FC00000); n += kBlockSize) {
2935*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2936*4bdc9457SAndroid Build Coastguard Worker inputs[i] = uint32_as_float(UINT32_C(0x80000000) | std::max<uint32_t>(n + i, UINT32_C(0x7F800001)));
2937*4bdc9457SAndroid Build Coastguard Worker }
2938*4bdc9457SAndroid Build Coastguard Worker xnn_math_f32_roundu__scalar_cvt(kBlockSize * sizeof(float), inputs.data(), outputs.data());
2939*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
2940*4bdc9457SAndroid Build Coastguard Worker const uint32_t reference_output = float_as_uint32(std::ceil(inputs[i]));
2941*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(reference_output, float_as_uint32(outputs[i]))
2942*4bdc9457SAndroid Build Coastguard Worker << "input = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(inputs[i])
2943*4bdc9457SAndroid Build Coastguard Worker << ", reference = 0x" << std::hex << std::setw(8) << std::setfill('0') << reference_output
2944*4bdc9457SAndroid Build Coastguard Worker << ", optimized = 0x" << std::hex << std::setw(8) << std::setfill('0') << float_as_uint32(outputs[i]);
2945*4bdc9457SAndroid Build Coastguard Worker }
2946*4bdc9457SAndroid Build Coastguard Worker }
2947*4bdc9457SAndroid Build Coastguard Worker }
2948