1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2022 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 <vector>
12*4bdc9457SAndroid Build Coastguard Worker
13*4bdc9457SAndroid Build Coastguard Worker #include <gtest/gtest.h>
14*4bdc9457SAndroid Build Coastguard Worker
15*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/aligned-allocator.h>
16*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/common.h>
17*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/math-stubs.h>
18*4bdc9457SAndroid Build Coastguard Worker
19*4bdc9457SAndroid Build Coastguard Worker
20*4bdc9457SAndroid Build Coastguard Worker constexpr int kBlockSize = 1024;
21*4bdc9457SAndroid Build Coastguard Worker
22*4bdc9457SAndroid Build Coastguard Worker
23*4bdc9457SAndroid Build Coastguard Worker namespace {
24*4bdc9457SAndroid Build Coastguard Worker
Sqrt(uint64_t n)25*4bdc9457SAndroid Build Coastguard Worker uint64_t Sqrt(uint64_t n) {
26*4bdc9457SAndroid Build Coastguard Worker if (n == 0) {
27*4bdc9457SAndroid Build Coastguard Worker return n;
28*4bdc9457SAndroid Build Coastguard Worker }
29*4bdc9457SAndroid Build Coastguard Worker
30*4bdc9457SAndroid Build Coastguard Worker uint64_t x0 = n >> 1;
31*4bdc9457SAndroid Build Coastguard Worker uint64_t x1 = (x0 + n / x0) >> 1;
32*4bdc9457SAndroid Build Coastguard Worker do {
33*4bdc9457SAndroid Build Coastguard Worker x0 = x1;
34*4bdc9457SAndroid Build Coastguard Worker x1 = (x0 + n / x0) >> 1;
35*4bdc9457SAndroid Build Coastguard Worker } while (x1 < x0);
36*4bdc9457SAndroid Build Coastguard Worker
37*4bdc9457SAndroid Build Coastguard Worker // x0 is sqrt(n) rounded down, round up if needed
38*4bdc9457SAndroid Build Coastguard Worker if (int64_t(x0 * x0 + x0 - n) < 0) {
39*4bdc9457SAndroid Build Coastguard Worker x0 += 1;
40*4bdc9457SAndroid Build Coastguard Worker }
41*4bdc9457SAndroid Build Coastguard Worker return x0;
42*4bdc9457SAndroid Build Coastguard Worker }
43*4bdc9457SAndroid Build Coastguard Worker
44*4bdc9457SAndroid Build Coastguard Worker } // namespace
45*4bdc9457SAndroid Build Coastguard Worker
46*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64,min_mantissa_exact_input)47*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64, min_mantissa_exact_input) {
48*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
49*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
50*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
51*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
52*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x0010000000000000) << s;
53*4bdc9457SAndroid Build Coastguard Worker }
54*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_cvtsatu32f64(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
55*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
56*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
57*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
58*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
59*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
60*4bdc9457SAndroid Build Coastguard Worker }
61*4bdc9457SAndroid Build Coastguard Worker }
62*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64,min_mantissa_min_input)63*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64, min_mantissa_min_input) {
64*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
65*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
66*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
67*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
68*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x001FFFFFFFFFFFFF) << (s - 1);
69*4bdc9457SAndroid Build Coastguard Worker }
70*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_cvtsatu32f64(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
71*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
72*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
73*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
74*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
75*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
76*4bdc9457SAndroid Build Coastguard Worker }
77*4bdc9457SAndroid Build Coastguard Worker }
78*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64,min_mantissa_max_input)79*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64, min_mantissa_max_input) {
80*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
81*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
82*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
83*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
84*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x0020000000000001) << (s - 1);
85*4bdc9457SAndroid Build Coastguard Worker }
86*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_cvtsatu32f64(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
87*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
88*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
89*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
90*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
91*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
92*4bdc9457SAndroid Build Coastguard Worker }
93*4bdc9457SAndroid Build Coastguard Worker }
94*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64,max_mantissa_exact_input)95*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64, max_mantissa_exact_input) {
96*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
97*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
98*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
99*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
100*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x001FFFFFFFFFFFFF) << s;
101*4bdc9457SAndroid Build Coastguard Worker }
102*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_cvtsatu32f64(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
103*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
104*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
105*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
106*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
107*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
108*4bdc9457SAndroid Build Coastguard Worker }
109*4bdc9457SAndroid Build Coastguard Worker }
110*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64,max_mantissa_min_input)111*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64, max_mantissa_min_input) {
112*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
113*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
114*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
115*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
116*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x003FFFFFFFFFFFFD) << (s - 1);
117*4bdc9457SAndroid Build Coastguard Worker }
118*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_cvtsatu32f64(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
119*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
120*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
121*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
122*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
123*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
124*4bdc9457SAndroid Build Coastguard Worker }
125*4bdc9457SAndroid Build Coastguard Worker }
126*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64,max_mantissa_max_input)127*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64, max_mantissa_max_input) {
128*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
129*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
130*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
131*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
132*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x003FFFFFFFFFFFFF) << (s - 1);
133*4bdc9457SAndroid Build Coastguard Worker }
134*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_cvtsatu32f64(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
135*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
136*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
137*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
138*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
139*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
140*4bdc9457SAndroid Build Coastguard Worker }
141*4bdc9457SAndroid Build Coastguard Worker }
142*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64,largest_inputs)143*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64, largest_inputs) {
144*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
145*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
146*4bdc9457SAndroid Build Coastguard Worker for (uint64_t i = 0; i < kBlockSize; i++) {
147*4bdc9457SAndroid Build Coastguard Worker inputs[i] = -i;
148*4bdc9457SAndroid Build Coastguard Worker }
149*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_cvtsatu32f64(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
150*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
151*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
152*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
153*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
154*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
155*4bdc9457SAndroid Build Coastguard Worker }
156*4bdc9457SAndroid Build Coastguard Worker }
157*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64,double_rounding)158*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_CVTSATU32F64, double_rounding) {
159*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
160*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
161*4bdc9457SAndroid Build Coastguard Worker for (uint64_t n = UINT64_C(33554432); n <= UINT64_C(4294967295); n += kBlockSize) {
162*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
163*4bdc9457SAndroid Build Coastguard Worker const uint64_t t = std::min(n + uint64_t(i), UINT64_C(4294967295));
164*4bdc9457SAndroid Build Coastguard Worker inputs[i] = t * t + t;
165*4bdc9457SAndroid Build Coastguard Worker }
166*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_cvtsatu32f64(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
167*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
168*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
169*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
170*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
171*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
172*4bdc9457SAndroid Build Coastguard Worker }
173*4bdc9457SAndroid Build Coastguard Worker }
174*4bdc9457SAndroid Build Coastguard Worker }
175*4bdc9457SAndroid Build Coastguard Worker
176*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT,min_mantissa_exact_input)177*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT, min_mantissa_exact_input) {
178*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
179*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
180*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
181*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
182*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x0010000000000000) << s;
183*4bdc9457SAndroid Build Coastguard Worker }
184*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
185*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
186*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
187*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
188*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
189*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
190*4bdc9457SAndroid Build Coastguard Worker }
191*4bdc9457SAndroid Build Coastguard Worker }
192*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT,min_mantissa_min_input)193*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT, min_mantissa_min_input) {
194*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
195*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
196*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
197*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
198*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x001FFFFFFFFFFFFF) << (s - 1);
199*4bdc9457SAndroid Build Coastguard Worker }
200*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
201*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
202*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
203*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
204*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
205*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
206*4bdc9457SAndroid Build Coastguard Worker }
207*4bdc9457SAndroid Build Coastguard Worker }
208*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT,min_mantissa_max_input)209*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT, min_mantissa_max_input) {
210*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
211*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
212*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
213*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
214*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x0020000000000001) << (s - 1);
215*4bdc9457SAndroid Build Coastguard Worker }
216*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
217*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
218*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
219*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
220*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
221*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
222*4bdc9457SAndroid Build Coastguard Worker }
223*4bdc9457SAndroid Build Coastguard Worker }
224*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT,max_mantissa_exact_input)225*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT, max_mantissa_exact_input) {
226*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
227*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
228*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
229*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
230*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x001FFFFFFFFFFFFF) << s;
231*4bdc9457SAndroid Build Coastguard Worker }
232*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
233*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
234*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
235*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
236*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
237*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
238*4bdc9457SAndroid Build Coastguard Worker }
239*4bdc9457SAndroid Build Coastguard Worker }
240*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT,max_mantissa_min_input)241*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT, max_mantissa_min_input) {
242*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
243*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
244*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
245*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
246*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x003FFFFFFFFFFFFD) << (s - 1);
247*4bdc9457SAndroid Build Coastguard Worker }
248*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
249*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
250*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
251*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
252*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
253*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
254*4bdc9457SAndroid Build Coastguard Worker }
255*4bdc9457SAndroid Build Coastguard Worker }
256*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT,max_mantissa_max_input)257*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT, max_mantissa_max_input) {
258*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
259*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
260*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
261*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
262*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x003FFFFFFFFFFFFF) << (s - 1);
263*4bdc9457SAndroid Build Coastguard Worker }
264*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
265*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
266*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
267*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
268*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
269*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
270*4bdc9457SAndroid Build Coastguard Worker }
271*4bdc9457SAndroid Build Coastguard Worker }
272*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT,largest_inputs)273*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT, largest_inputs) {
274*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
275*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
276*4bdc9457SAndroid Build Coastguard Worker for (uint64_t i = 0; i < kBlockSize; i++) {
277*4bdc9457SAndroid Build Coastguard Worker inputs[i] = -i;
278*4bdc9457SAndroid Build Coastguard Worker }
279*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
280*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
281*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
282*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
283*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
284*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
285*4bdc9457SAndroid Build Coastguard Worker }
286*4bdc9457SAndroid Build Coastguard Worker }
287*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT,double_rounding)288*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU32_SQRT_LLRINT, double_rounding) {
289*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
290*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
291*4bdc9457SAndroid Build Coastguard Worker for (uint64_t n = UINT64_C(33554432); n <= UINT64_C(4294967295); n += kBlockSize) {
292*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
293*4bdc9457SAndroid Build Coastguard Worker const uint64_t t = std::min(n + uint64_t(i), UINT64_C(4294967295));
294*4bdc9457SAndroid Build Coastguard Worker inputs[i] = t * t + t;
295*4bdc9457SAndroid Build Coastguard Worker }
296*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu32_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
297*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
298*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
299*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
300*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
301*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
302*4bdc9457SAndroid Build Coastguard Worker }
303*4bdc9457SAndroid Build Coastguard Worker }
304*4bdc9457SAndroid Build Coastguard Worker }
305*4bdc9457SAndroid Build Coastguard Worker
306*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT,min_mantissa_exact_input)307*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT, min_mantissa_exact_input) {
308*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
309*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
310*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
311*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
312*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x0010000000000000) << s;
313*4bdc9457SAndroid Build Coastguard Worker }
314*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu64_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
315*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
316*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
317*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
318*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
319*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
320*4bdc9457SAndroid Build Coastguard Worker }
321*4bdc9457SAndroid Build Coastguard Worker }
322*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT,min_mantissa_min_input)323*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT, min_mantissa_min_input) {
324*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
325*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
326*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
327*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
328*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x001FFFFFFFFFFFFF) << (s - 1);
329*4bdc9457SAndroid Build Coastguard Worker }
330*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu64_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
331*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
332*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
333*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
334*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
335*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
336*4bdc9457SAndroid Build Coastguard Worker }
337*4bdc9457SAndroid Build Coastguard Worker }
338*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT,min_mantissa_max_input)339*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT, min_mantissa_max_input) {
340*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
341*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
342*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
343*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
344*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x0020000000000001) << (s - 1);
345*4bdc9457SAndroid Build Coastguard Worker }
346*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu64_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
347*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
348*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
349*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
350*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
351*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
352*4bdc9457SAndroid Build Coastguard Worker }
353*4bdc9457SAndroid Build Coastguard Worker }
354*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT,max_mantissa_exact_input)355*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT, max_mantissa_exact_input) {
356*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
357*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
358*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
359*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
360*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x001FFFFFFFFFFFFF) << s;
361*4bdc9457SAndroid Build Coastguard Worker }
362*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu64_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
363*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
364*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
365*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
366*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
367*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
368*4bdc9457SAndroid Build Coastguard Worker }
369*4bdc9457SAndroid Build Coastguard Worker }
370*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT,max_mantissa_min_input)371*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT, max_mantissa_min_input) {
372*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
373*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
374*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
375*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
376*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x003FFFFFFFFFFFFD) << (s - 1);
377*4bdc9457SAndroid Build Coastguard Worker }
378*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu64_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
379*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
380*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
381*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
382*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
383*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
384*4bdc9457SAndroid Build Coastguard Worker }
385*4bdc9457SAndroid Build Coastguard Worker }
386*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT,max_mantissa_max_input)387*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT, max_mantissa_max_input) {
388*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
389*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
390*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
391*4bdc9457SAndroid Build Coastguard Worker const uint32_t s = std::min<uint32_t>(i + 1, 11);
392*4bdc9457SAndroid Build Coastguard Worker inputs[i] = UINT64_C(0x003FFFFFFFFFFFFF) << (s - 1);
393*4bdc9457SAndroid Build Coastguard Worker }
394*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu64_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
395*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
396*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
397*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
398*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
399*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
400*4bdc9457SAndroid Build Coastguard Worker }
401*4bdc9457SAndroid Build Coastguard Worker }
402*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT,largest_inputs)403*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT, largest_inputs) {
404*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
405*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
406*4bdc9457SAndroid Build Coastguard Worker for (uint64_t i = 0; i < kBlockSize; i++) {
407*4bdc9457SAndroid Build Coastguard Worker inputs[i] = -i;
408*4bdc9457SAndroid Build Coastguard Worker }
409*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu64_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
410*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
411*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
412*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
413*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
414*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
415*4bdc9457SAndroid Build Coastguard Worker }
416*4bdc9457SAndroid Build Coastguard Worker }
417*4bdc9457SAndroid Build Coastguard Worker
TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT,double_rounding)418*4bdc9457SAndroid Build Coastguard Worker TEST(SQRT__SCALAR_CVTU64_SQRT_LLRINT, double_rounding) {
419*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> inputs(kBlockSize);
420*4bdc9457SAndroid Build Coastguard Worker std::vector<uint64_t, AlignedAllocator<uint64_t, 64>> outputs(kBlockSize);
421*4bdc9457SAndroid Build Coastguard Worker for (uint64_t n = UINT64_C(33554432); n <= UINT64_C(4294967295); n += kBlockSize) {
422*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
423*4bdc9457SAndroid Build Coastguard Worker const uint64_t t = std::min(n + uint64_t(i), UINT64_C(4294967295));
424*4bdc9457SAndroid Build Coastguard Worker inputs[i] = t * t + t;
425*4bdc9457SAndroid Build Coastguard Worker }
426*4bdc9457SAndroid Build Coastguard Worker xnn_math_u64_sqrt__scalar_cvtu64_sqrt_llrint(kBlockSize * sizeof(uint64_t), inputs.data(), outputs.data());
427*4bdc9457SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kBlockSize; i++) {
428*4bdc9457SAndroid Build Coastguard Worker const uint64_t input = inputs[i];
429*4bdc9457SAndroid Build Coastguard Worker const uint64_t output = outputs[i];
430*4bdc9457SAndroid Build Coastguard Worker const uint64_t reference_output = Sqrt(input);
431*4bdc9457SAndroid Build Coastguard Worker ASSERT_EQ(output, reference_output) << "input: " << input;
432*4bdc9457SAndroid Build Coastguard Worker }
433*4bdc9457SAndroid Build Coastguard Worker }
434*4bdc9457SAndroid Build Coastguard Worker }
435