xref: /aosp_15_r20/external/XNNPACK/test/f32-qu8-vcvt.cc (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1 // Copyright 2021 Google LLC
2 //
3 // This source code is licensed under the BSD-style license found in the
4 // LICENSE file in the root directory of this source tree.
5 //
6 // Auto-generated file. Do not edit!
7 //   Specification: test/f32-qu8-vcvt.yaml
8 //   Generator: tools/generate-vcvt-test.py
9 
10 
11 #include <gtest/gtest.h>
12 
13 #include <xnnpack/common.h>
14 #include <xnnpack/isa-checks.h>
15 
16 #include <xnnpack/vcvt.h>
17 #include "vcvt-microkernel-tester.h"
18 
19 
20 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_QU8_VCVT__NEON_X8,batch_eq_8)21   TEST(F32_QU8_VCVT__NEON_X8, batch_eq_8) {
22     TEST_REQUIRES_ARM_NEON;
23     VCvtMicrokernelTester()
24       .batch_size(8)
25       .qmin(std::numeric_limits<uint8_t>::min())
26       .qmax(std::numeric_limits<uint8_t>::max())
27       .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
28   }
29 
TEST(F32_QU8_VCVT__NEON_X8,batch_div_8)30   TEST(F32_QU8_VCVT__NEON_X8, batch_div_8) {
31     TEST_REQUIRES_ARM_NEON;
32     for (size_t batch_size = 16; batch_size < 80; batch_size += 8) {
33       VCvtMicrokernelTester()
34         .batch_size(batch_size)
35         .qmin(std::numeric_limits<uint8_t>::min())
36         .qmax(std::numeric_limits<uint8_t>::max())
37         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
38     }
39   }
40 
TEST(F32_QU8_VCVT__NEON_X8,batch_lt_8)41   TEST(F32_QU8_VCVT__NEON_X8, batch_lt_8) {
42     TEST_REQUIRES_ARM_NEON;
43     for (size_t batch_size = 1; batch_size < 8; batch_size++) {
44       VCvtMicrokernelTester()
45         .batch_size(batch_size)
46         .qmin(std::numeric_limits<uint8_t>::min())
47         .qmax(std::numeric_limits<uint8_t>::max())
48         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
49     }
50   }
51 
TEST(F32_QU8_VCVT__NEON_X8,batch_gt_8)52   TEST(F32_QU8_VCVT__NEON_X8, batch_gt_8) {
53     TEST_REQUIRES_ARM_NEON;
54     for (size_t batch_size = 9; batch_size < 16; batch_size++) {
55       VCvtMicrokernelTester()
56         .batch_size(batch_size)
57         .qmin(std::numeric_limits<uint8_t>::min())
58         .qmax(std::numeric_limits<uint8_t>::max())
59         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
60     }
61   }
62 
TEST(F32_QU8_VCVT__NEON_X8,scale)63   TEST(F32_QU8_VCVT__NEON_X8, scale) {
64     TEST_REQUIRES_ARM_NEON;
65     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
66       VCvtMicrokernelTester()
67         .batch_size(batch_size)
68         .scale(50)
69         .output_zero_point(100)
70         .qmin(std::numeric_limits<uint8_t>::min())
71         .qmax(std::numeric_limits<uint8_t>::max())
72         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
73     }
74   }
75 
TEST(F32_QU8_VCVT__NEON_X8,output_zero_point)76   TEST(F32_QU8_VCVT__NEON_X8, output_zero_point) {
77     TEST_REQUIRES_ARM_NEON;
78     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
79       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
80         VCvtMicrokernelTester()
81           .batch_size(batch_size)
82           .output_zero_point(output_zero_point)
83           .qmin(std::numeric_limits<uint8_t>::min())
84           .qmax(std::numeric_limits<uint8_t>::max())
85           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
86       }
87     }
88   }
89 
TEST(F32_QU8_VCVT__NEON_X8,saturation)90   TEST(F32_QU8_VCVT__NEON_X8, saturation) {
91     TEST_REQUIRES_ARM_NEON;
92     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
93       VCvtMicrokernelTester()
94         .batch_size(batch_size)
95         .scale(500)
96         .output_zero_point(128)
97         .qmin(std::numeric_limits<uint8_t>::min())
98         .qmax(std::numeric_limits<uint8_t>::max())
99         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
100     }
101   }
102 
TEST(F32_QU8_VCVT__NEON_X8,overflow)103   TEST(F32_QU8_VCVT__NEON_X8, overflow) {
104     TEST_REQUIRES_ARM_NEON;
105     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
106       VCvtMicrokernelTester()
107         .batch_size(batch_size)
108         .scale(4294967296.0f)
109         .qmin(std::numeric_limits<uint8_t>::min())
110         .qmax(std::numeric_limits<uint8_t>::max())
111         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
112     }
113   }
114 
TEST(F32_QU8_VCVT__NEON_X8,qmin)115   TEST(F32_QU8_VCVT__NEON_X8, qmin) {
116     TEST_REQUIRES_ARM_NEON;
117     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
118       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
119         VCvtMicrokernelTester()
120           .batch_size(batch_size)
121           .scale(500)
122           .output_zero_point(128)
123           .qmin(qmin)
124           .qmax(std::numeric_limits<uint8_t>::max())
125           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
126       }
127     }
128   }
129 
TEST(F32_QU8_VCVT__NEON_X8,qmax)130   TEST(F32_QU8_VCVT__NEON_X8, qmax) {
131     TEST_REQUIRES_ARM_NEON;
132     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
133       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
134         VCvtMicrokernelTester()
135           .batch_size(batch_size)
136           .scale(500)
137           .output_zero_point(128)
138           .qmin(std::numeric_limits<uint8_t>::min())
139           .qmax(qmax)
140           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x8, xnn_init_f32_qu8_cvt_neon_params);
141       }
142     }
143   }
144 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
145 
146 
147 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_QU8_VCVT__NEON_X16,batch_eq_16)148   TEST(F32_QU8_VCVT__NEON_X16, batch_eq_16) {
149     TEST_REQUIRES_ARM_NEON;
150     VCvtMicrokernelTester()
151       .batch_size(16)
152       .qmin(std::numeric_limits<uint8_t>::min())
153       .qmax(std::numeric_limits<uint8_t>::max())
154       .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
155   }
156 
TEST(F32_QU8_VCVT__NEON_X16,batch_div_16)157   TEST(F32_QU8_VCVT__NEON_X16, batch_div_16) {
158     TEST_REQUIRES_ARM_NEON;
159     for (size_t batch_size = 32; batch_size < 160; batch_size += 16) {
160       VCvtMicrokernelTester()
161         .batch_size(batch_size)
162         .qmin(std::numeric_limits<uint8_t>::min())
163         .qmax(std::numeric_limits<uint8_t>::max())
164         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
165     }
166   }
167 
TEST(F32_QU8_VCVT__NEON_X16,batch_lt_16)168   TEST(F32_QU8_VCVT__NEON_X16, batch_lt_16) {
169     TEST_REQUIRES_ARM_NEON;
170     for (size_t batch_size = 1; batch_size < 16; batch_size++) {
171       VCvtMicrokernelTester()
172         .batch_size(batch_size)
173         .qmin(std::numeric_limits<uint8_t>::min())
174         .qmax(std::numeric_limits<uint8_t>::max())
175         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
176     }
177   }
178 
TEST(F32_QU8_VCVT__NEON_X16,batch_gt_16)179   TEST(F32_QU8_VCVT__NEON_X16, batch_gt_16) {
180     TEST_REQUIRES_ARM_NEON;
181     for (size_t batch_size = 17; batch_size < 32; batch_size++) {
182       VCvtMicrokernelTester()
183         .batch_size(batch_size)
184         .qmin(std::numeric_limits<uint8_t>::min())
185         .qmax(std::numeric_limits<uint8_t>::max())
186         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
187     }
188   }
189 
TEST(F32_QU8_VCVT__NEON_X16,scale)190   TEST(F32_QU8_VCVT__NEON_X16, scale) {
191     TEST_REQUIRES_ARM_NEON;
192     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
193       VCvtMicrokernelTester()
194         .batch_size(batch_size)
195         .scale(50)
196         .output_zero_point(100)
197         .qmin(std::numeric_limits<uint8_t>::min())
198         .qmax(std::numeric_limits<uint8_t>::max())
199         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
200     }
201   }
202 
TEST(F32_QU8_VCVT__NEON_X16,output_zero_point)203   TEST(F32_QU8_VCVT__NEON_X16, output_zero_point) {
204     TEST_REQUIRES_ARM_NEON;
205     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
206       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
207         VCvtMicrokernelTester()
208           .batch_size(batch_size)
209           .output_zero_point(output_zero_point)
210           .qmin(std::numeric_limits<uint8_t>::min())
211           .qmax(std::numeric_limits<uint8_t>::max())
212           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
213       }
214     }
215   }
216 
TEST(F32_QU8_VCVT__NEON_X16,saturation)217   TEST(F32_QU8_VCVT__NEON_X16, saturation) {
218     TEST_REQUIRES_ARM_NEON;
219     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
220       VCvtMicrokernelTester()
221         .batch_size(batch_size)
222         .scale(500)
223         .output_zero_point(128)
224         .qmin(std::numeric_limits<uint8_t>::min())
225         .qmax(std::numeric_limits<uint8_t>::max())
226         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
227     }
228   }
229 
TEST(F32_QU8_VCVT__NEON_X16,overflow)230   TEST(F32_QU8_VCVT__NEON_X16, overflow) {
231     TEST_REQUIRES_ARM_NEON;
232     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
233       VCvtMicrokernelTester()
234         .batch_size(batch_size)
235         .scale(4294967296.0f)
236         .qmin(std::numeric_limits<uint8_t>::min())
237         .qmax(std::numeric_limits<uint8_t>::max())
238         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
239     }
240   }
241 
TEST(F32_QU8_VCVT__NEON_X16,qmin)242   TEST(F32_QU8_VCVT__NEON_X16, qmin) {
243     TEST_REQUIRES_ARM_NEON;
244     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
245       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
246         VCvtMicrokernelTester()
247           .batch_size(batch_size)
248           .scale(500)
249           .output_zero_point(128)
250           .qmin(qmin)
251           .qmax(std::numeric_limits<uint8_t>::max())
252           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
253       }
254     }
255   }
256 
TEST(F32_QU8_VCVT__NEON_X16,qmax)257   TEST(F32_QU8_VCVT__NEON_X16, qmax) {
258     TEST_REQUIRES_ARM_NEON;
259     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
260       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
261         VCvtMicrokernelTester()
262           .batch_size(batch_size)
263           .scale(500)
264           .output_zero_point(128)
265           .qmin(std::numeric_limits<uint8_t>::min())
266           .qmax(qmax)
267           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x16, xnn_init_f32_qu8_cvt_neon_params);
268       }
269     }
270   }
271 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
272 
273 
274 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_QU8_VCVT__NEON_X24,batch_eq_24)275   TEST(F32_QU8_VCVT__NEON_X24, batch_eq_24) {
276     TEST_REQUIRES_ARM_NEON;
277     VCvtMicrokernelTester()
278       .batch_size(24)
279       .qmin(std::numeric_limits<uint8_t>::min())
280       .qmax(std::numeric_limits<uint8_t>::max())
281       .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
282   }
283 
TEST(F32_QU8_VCVT__NEON_X24,batch_div_24)284   TEST(F32_QU8_VCVT__NEON_X24, batch_div_24) {
285     TEST_REQUIRES_ARM_NEON;
286     for (size_t batch_size = 48; batch_size < 240; batch_size += 24) {
287       VCvtMicrokernelTester()
288         .batch_size(batch_size)
289         .qmin(std::numeric_limits<uint8_t>::min())
290         .qmax(std::numeric_limits<uint8_t>::max())
291         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
292     }
293   }
294 
TEST(F32_QU8_VCVT__NEON_X24,batch_lt_24)295   TEST(F32_QU8_VCVT__NEON_X24, batch_lt_24) {
296     TEST_REQUIRES_ARM_NEON;
297     for (size_t batch_size = 1; batch_size < 24; batch_size++) {
298       VCvtMicrokernelTester()
299         .batch_size(batch_size)
300         .qmin(std::numeric_limits<uint8_t>::min())
301         .qmax(std::numeric_limits<uint8_t>::max())
302         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
303     }
304   }
305 
TEST(F32_QU8_VCVT__NEON_X24,batch_gt_24)306   TEST(F32_QU8_VCVT__NEON_X24, batch_gt_24) {
307     TEST_REQUIRES_ARM_NEON;
308     for (size_t batch_size = 25; batch_size < 48; batch_size++) {
309       VCvtMicrokernelTester()
310         .batch_size(batch_size)
311         .qmin(std::numeric_limits<uint8_t>::min())
312         .qmax(std::numeric_limits<uint8_t>::max())
313         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
314     }
315   }
316 
TEST(F32_QU8_VCVT__NEON_X24,scale)317   TEST(F32_QU8_VCVT__NEON_X24, scale) {
318     TEST_REQUIRES_ARM_NEON;
319     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
320       VCvtMicrokernelTester()
321         .batch_size(batch_size)
322         .scale(50)
323         .output_zero_point(100)
324         .qmin(std::numeric_limits<uint8_t>::min())
325         .qmax(std::numeric_limits<uint8_t>::max())
326         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
327     }
328   }
329 
TEST(F32_QU8_VCVT__NEON_X24,output_zero_point)330   TEST(F32_QU8_VCVT__NEON_X24, output_zero_point) {
331     TEST_REQUIRES_ARM_NEON;
332     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
333       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
334         VCvtMicrokernelTester()
335           .batch_size(batch_size)
336           .output_zero_point(output_zero_point)
337           .qmin(std::numeric_limits<uint8_t>::min())
338           .qmax(std::numeric_limits<uint8_t>::max())
339           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
340       }
341     }
342   }
343 
TEST(F32_QU8_VCVT__NEON_X24,saturation)344   TEST(F32_QU8_VCVT__NEON_X24, saturation) {
345     TEST_REQUIRES_ARM_NEON;
346     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
347       VCvtMicrokernelTester()
348         .batch_size(batch_size)
349         .scale(500)
350         .output_zero_point(128)
351         .qmin(std::numeric_limits<uint8_t>::min())
352         .qmax(std::numeric_limits<uint8_t>::max())
353         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
354     }
355   }
356 
TEST(F32_QU8_VCVT__NEON_X24,overflow)357   TEST(F32_QU8_VCVT__NEON_X24, overflow) {
358     TEST_REQUIRES_ARM_NEON;
359     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
360       VCvtMicrokernelTester()
361         .batch_size(batch_size)
362         .scale(4294967296.0f)
363         .qmin(std::numeric_limits<uint8_t>::min())
364         .qmax(std::numeric_limits<uint8_t>::max())
365         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
366     }
367   }
368 
TEST(F32_QU8_VCVT__NEON_X24,qmin)369   TEST(F32_QU8_VCVT__NEON_X24, qmin) {
370     TEST_REQUIRES_ARM_NEON;
371     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
372       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
373         VCvtMicrokernelTester()
374           .batch_size(batch_size)
375           .scale(500)
376           .output_zero_point(128)
377           .qmin(qmin)
378           .qmax(std::numeric_limits<uint8_t>::max())
379           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
380       }
381     }
382   }
383 
TEST(F32_QU8_VCVT__NEON_X24,qmax)384   TEST(F32_QU8_VCVT__NEON_X24, qmax) {
385     TEST_REQUIRES_ARM_NEON;
386     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
387       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
388         VCvtMicrokernelTester()
389           .batch_size(batch_size)
390           .scale(500)
391           .output_zero_point(128)
392           .qmin(std::numeric_limits<uint8_t>::min())
393           .qmax(qmax)
394           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x24, xnn_init_f32_qu8_cvt_neon_params);
395       }
396     }
397   }
398 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
399 
400 
401 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_QU8_VCVT__NEON_X32,batch_eq_32)402   TEST(F32_QU8_VCVT__NEON_X32, batch_eq_32) {
403     TEST_REQUIRES_ARM_NEON;
404     VCvtMicrokernelTester()
405       .batch_size(32)
406       .qmin(std::numeric_limits<uint8_t>::min())
407       .qmax(std::numeric_limits<uint8_t>::max())
408       .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
409   }
410 
TEST(F32_QU8_VCVT__NEON_X32,batch_div_32)411   TEST(F32_QU8_VCVT__NEON_X32, batch_div_32) {
412     TEST_REQUIRES_ARM_NEON;
413     for (size_t batch_size = 64; batch_size < 320; batch_size += 32) {
414       VCvtMicrokernelTester()
415         .batch_size(batch_size)
416         .qmin(std::numeric_limits<uint8_t>::min())
417         .qmax(std::numeric_limits<uint8_t>::max())
418         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
419     }
420   }
421 
TEST(F32_QU8_VCVT__NEON_X32,batch_lt_32)422   TEST(F32_QU8_VCVT__NEON_X32, batch_lt_32) {
423     TEST_REQUIRES_ARM_NEON;
424     for (size_t batch_size = 1; batch_size < 32; batch_size++) {
425       VCvtMicrokernelTester()
426         .batch_size(batch_size)
427         .qmin(std::numeric_limits<uint8_t>::min())
428         .qmax(std::numeric_limits<uint8_t>::max())
429         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
430     }
431   }
432 
TEST(F32_QU8_VCVT__NEON_X32,batch_gt_32)433   TEST(F32_QU8_VCVT__NEON_X32, batch_gt_32) {
434     TEST_REQUIRES_ARM_NEON;
435     for (size_t batch_size = 33; batch_size < 64; batch_size++) {
436       VCvtMicrokernelTester()
437         .batch_size(batch_size)
438         .qmin(std::numeric_limits<uint8_t>::min())
439         .qmax(std::numeric_limits<uint8_t>::max())
440         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
441     }
442   }
443 
TEST(F32_QU8_VCVT__NEON_X32,scale)444   TEST(F32_QU8_VCVT__NEON_X32, scale) {
445     TEST_REQUIRES_ARM_NEON;
446     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
447       VCvtMicrokernelTester()
448         .batch_size(batch_size)
449         .scale(50)
450         .output_zero_point(100)
451         .qmin(std::numeric_limits<uint8_t>::min())
452         .qmax(std::numeric_limits<uint8_t>::max())
453         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
454     }
455   }
456 
TEST(F32_QU8_VCVT__NEON_X32,output_zero_point)457   TEST(F32_QU8_VCVT__NEON_X32, output_zero_point) {
458     TEST_REQUIRES_ARM_NEON;
459     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
460       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
461         VCvtMicrokernelTester()
462           .batch_size(batch_size)
463           .output_zero_point(output_zero_point)
464           .qmin(std::numeric_limits<uint8_t>::min())
465           .qmax(std::numeric_limits<uint8_t>::max())
466           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
467       }
468     }
469   }
470 
TEST(F32_QU8_VCVT__NEON_X32,saturation)471   TEST(F32_QU8_VCVT__NEON_X32, saturation) {
472     TEST_REQUIRES_ARM_NEON;
473     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
474       VCvtMicrokernelTester()
475         .batch_size(batch_size)
476         .scale(500)
477         .output_zero_point(128)
478         .qmin(std::numeric_limits<uint8_t>::min())
479         .qmax(std::numeric_limits<uint8_t>::max())
480         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
481     }
482   }
483 
TEST(F32_QU8_VCVT__NEON_X32,overflow)484   TEST(F32_QU8_VCVT__NEON_X32, overflow) {
485     TEST_REQUIRES_ARM_NEON;
486     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
487       VCvtMicrokernelTester()
488         .batch_size(batch_size)
489         .scale(4294967296.0f)
490         .qmin(std::numeric_limits<uint8_t>::min())
491         .qmax(std::numeric_limits<uint8_t>::max())
492         .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
493     }
494   }
495 
TEST(F32_QU8_VCVT__NEON_X32,qmin)496   TEST(F32_QU8_VCVT__NEON_X32, qmin) {
497     TEST_REQUIRES_ARM_NEON;
498     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
499       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
500         VCvtMicrokernelTester()
501           .batch_size(batch_size)
502           .scale(500)
503           .output_zero_point(128)
504           .qmin(qmin)
505           .qmax(std::numeric_limits<uint8_t>::max())
506           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
507       }
508     }
509   }
510 
TEST(F32_QU8_VCVT__NEON_X32,qmax)511   TEST(F32_QU8_VCVT__NEON_X32, qmax) {
512     TEST_REQUIRES_ARM_NEON;
513     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
514       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
515         VCvtMicrokernelTester()
516           .batch_size(batch_size)
517           .scale(500)
518           .output_zero_point(128)
519           .qmin(std::numeric_limits<uint8_t>::min())
520           .qmax(qmax)
521           .Test(xnn_f32_qu8_vcvt_ukernel__neon_x32, xnn_init_f32_qu8_cvt_neon_params);
522       }
523     }
524   }
525 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
526 
527 
528 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_QU8_VCVT__NEONV8_X8,batch_eq_8)529   TEST(F32_QU8_VCVT__NEONV8_X8, batch_eq_8) {
530     TEST_REQUIRES_ARM_NEON_V8;
531     VCvtMicrokernelTester()
532       .batch_size(8)
533       .qmin(std::numeric_limits<uint8_t>::min())
534       .qmax(std::numeric_limits<uint8_t>::max())
535       .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
536   }
537 
TEST(F32_QU8_VCVT__NEONV8_X8,batch_div_8)538   TEST(F32_QU8_VCVT__NEONV8_X8, batch_div_8) {
539     TEST_REQUIRES_ARM_NEON_V8;
540     for (size_t batch_size = 16; batch_size < 80; batch_size += 8) {
541       VCvtMicrokernelTester()
542         .batch_size(batch_size)
543         .qmin(std::numeric_limits<uint8_t>::min())
544         .qmax(std::numeric_limits<uint8_t>::max())
545         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
546     }
547   }
548 
TEST(F32_QU8_VCVT__NEONV8_X8,batch_lt_8)549   TEST(F32_QU8_VCVT__NEONV8_X8, batch_lt_8) {
550     TEST_REQUIRES_ARM_NEON_V8;
551     for (size_t batch_size = 1; batch_size < 8; batch_size++) {
552       VCvtMicrokernelTester()
553         .batch_size(batch_size)
554         .qmin(std::numeric_limits<uint8_t>::min())
555         .qmax(std::numeric_limits<uint8_t>::max())
556         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
557     }
558   }
559 
TEST(F32_QU8_VCVT__NEONV8_X8,batch_gt_8)560   TEST(F32_QU8_VCVT__NEONV8_X8, batch_gt_8) {
561     TEST_REQUIRES_ARM_NEON_V8;
562     for (size_t batch_size = 9; batch_size < 16; batch_size++) {
563       VCvtMicrokernelTester()
564         .batch_size(batch_size)
565         .qmin(std::numeric_limits<uint8_t>::min())
566         .qmax(std::numeric_limits<uint8_t>::max())
567         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
568     }
569   }
570 
TEST(F32_QU8_VCVT__NEONV8_X8,scale)571   TEST(F32_QU8_VCVT__NEONV8_X8, scale) {
572     TEST_REQUIRES_ARM_NEON_V8;
573     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
574       VCvtMicrokernelTester()
575         .batch_size(batch_size)
576         .scale(50)
577         .output_zero_point(100)
578         .qmin(std::numeric_limits<uint8_t>::min())
579         .qmax(std::numeric_limits<uint8_t>::max())
580         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
581     }
582   }
583 
TEST(F32_QU8_VCVT__NEONV8_X8,output_zero_point)584   TEST(F32_QU8_VCVT__NEONV8_X8, output_zero_point) {
585     TEST_REQUIRES_ARM_NEON_V8;
586     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
587       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
588         VCvtMicrokernelTester()
589           .batch_size(batch_size)
590           .output_zero_point(output_zero_point)
591           .qmin(std::numeric_limits<uint8_t>::min())
592           .qmax(std::numeric_limits<uint8_t>::max())
593           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
594       }
595     }
596   }
597 
TEST(F32_QU8_VCVT__NEONV8_X8,saturation)598   TEST(F32_QU8_VCVT__NEONV8_X8, saturation) {
599     TEST_REQUIRES_ARM_NEON_V8;
600     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
601       VCvtMicrokernelTester()
602         .batch_size(batch_size)
603         .scale(500)
604         .output_zero_point(128)
605         .qmin(std::numeric_limits<uint8_t>::min())
606         .qmax(std::numeric_limits<uint8_t>::max())
607         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
608     }
609   }
610 
TEST(F32_QU8_VCVT__NEONV8_X8,overflow)611   TEST(F32_QU8_VCVT__NEONV8_X8, overflow) {
612     TEST_REQUIRES_ARM_NEON_V8;
613     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
614       VCvtMicrokernelTester()
615         .batch_size(batch_size)
616         .scale(4294967296.0f)
617         .qmin(std::numeric_limits<uint8_t>::min())
618         .qmax(std::numeric_limits<uint8_t>::max())
619         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
620     }
621   }
622 
TEST(F32_QU8_VCVT__NEONV8_X8,qmin)623   TEST(F32_QU8_VCVT__NEONV8_X8, qmin) {
624     TEST_REQUIRES_ARM_NEON_V8;
625     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
626       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
627         VCvtMicrokernelTester()
628           .batch_size(batch_size)
629           .scale(500)
630           .output_zero_point(128)
631           .qmin(qmin)
632           .qmax(std::numeric_limits<uint8_t>::max())
633           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
634       }
635     }
636   }
637 
TEST(F32_QU8_VCVT__NEONV8_X8,qmax)638   TEST(F32_QU8_VCVT__NEONV8_X8, qmax) {
639     TEST_REQUIRES_ARM_NEON_V8;
640     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
641       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
642         VCvtMicrokernelTester()
643           .batch_size(batch_size)
644           .scale(500)
645           .output_zero_point(128)
646           .qmin(std::numeric_limits<uint8_t>::min())
647           .qmax(qmax)
648           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x8, xnn_init_f32_qu8_cvt_neonv8_params);
649       }
650     }
651   }
652 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
653 
654 
655 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_QU8_VCVT__NEONV8_X16,batch_eq_16)656   TEST(F32_QU8_VCVT__NEONV8_X16, batch_eq_16) {
657     TEST_REQUIRES_ARM_NEON_V8;
658     VCvtMicrokernelTester()
659       .batch_size(16)
660       .qmin(std::numeric_limits<uint8_t>::min())
661       .qmax(std::numeric_limits<uint8_t>::max())
662       .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
663   }
664 
TEST(F32_QU8_VCVT__NEONV8_X16,batch_div_16)665   TEST(F32_QU8_VCVT__NEONV8_X16, batch_div_16) {
666     TEST_REQUIRES_ARM_NEON_V8;
667     for (size_t batch_size = 32; batch_size < 160; batch_size += 16) {
668       VCvtMicrokernelTester()
669         .batch_size(batch_size)
670         .qmin(std::numeric_limits<uint8_t>::min())
671         .qmax(std::numeric_limits<uint8_t>::max())
672         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
673     }
674   }
675 
TEST(F32_QU8_VCVT__NEONV8_X16,batch_lt_16)676   TEST(F32_QU8_VCVT__NEONV8_X16, batch_lt_16) {
677     TEST_REQUIRES_ARM_NEON_V8;
678     for (size_t batch_size = 1; batch_size < 16; batch_size++) {
679       VCvtMicrokernelTester()
680         .batch_size(batch_size)
681         .qmin(std::numeric_limits<uint8_t>::min())
682         .qmax(std::numeric_limits<uint8_t>::max())
683         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
684     }
685   }
686 
TEST(F32_QU8_VCVT__NEONV8_X16,batch_gt_16)687   TEST(F32_QU8_VCVT__NEONV8_X16, batch_gt_16) {
688     TEST_REQUIRES_ARM_NEON_V8;
689     for (size_t batch_size = 17; batch_size < 32; batch_size++) {
690       VCvtMicrokernelTester()
691         .batch_size(batch_size)
692         .qmin(std::numeric_limits<uint8_t>::min())
693         .qmax(std::numeric_limits<uint8_t>::max())
694         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
695     }
696   }
697 
TEST(F32_QU8_VCVT__NEONV8_X16,scale)698   TEST(F32_QU8_VCVT__NEONV8_X16, scale) {
699     TEST_REQUIRES_ARM_NEON_V8;
700     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
701       VCvtMicrokernelTester()
702         .batch_size(batch_size)
703         .scale(50)
704         .output_zero_point(100)
705         .qmin(std::numeric_limits<uint8_t>::min())
706         .qmax(std::numeric_limits<uint8_t>::max())
707         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
708     }
709   }
710 
TEST(F32_QU8_VCVT__NEONV8_X16,output_zero_point)711   TEST(F32_QU8_VCVT__NEONV8_X16, output_zero_point) {
712     TEST_REQUIRES_ARM_NEON_V8;
713     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
714       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
715         VCvtMicrokernelTester()
716           .batch_size(batch_size)
717           .output_zero_point(output_zero_point)
718           .qmin(std::numeric_limits<uint8_t>::min())
719           .qmax(std::numeric_limits<uint8_t>::max())
720           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
721       }
722     }
723   }
724 
TEST(F32_QU8_VCVT__NEONV8_X16,saturation)725   TEST(F32_QU8_VCVT__NEONV8_X16, saturation) {
726     TEST_REQUIRES_ARM_NEON_V8;
727     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
728       VCvtMicrokernelTester()
729         .batch_size(batch_size)
730         .scale(500)
731         .output_zero_point(128)
732         .qmin(std::numeric_limits<uint8_t>::min())
733         .qmax(std::numeric_limits<uint8_t>::max())
734         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
735     }
736   }
737 
TEST(F32_QU8_VCVT__NEONV8_X16,overflow)738   TEST(F32_QU8_VCVT__NEONV8_X16, overflow) {
739     TEST_REQUIRES_ARM_NEON_V8;
740     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
741       VCvtMicrokernelTester()
742         .batch_size(batch_size)
743         .scale(4294967296.0f)
744         .qmin(std::numeric_limits<uint8_t>::min())
745         .qmax(std::numeric_limits<uint8_t>::max())
746         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
747     }
748   }
749 
TEST(F32_QU8_VCVT__NEONV8_X16,qmin)750   TEST(F32_QU8_VCVT__NEONV8_X16, qmin) {
751     TEST_REQUIRES_ARM_NEON_V8;
752     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
753       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
754         VCvtMicrokernelTester()
755           .batch_size(batch_size)
756           .scale(500)
757           .output_zero_point(128)
758           .qmin(qmin)
759           .qmax(std::numeric_limits<uint8_t>::max())
760           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
761       }
762     }
763   }
764 
TEST(F32_QU8_VCVT__NEONV8_X16,qmax)765   TEST(F32_QU8_VCVT__NEONV8_X16, qmax) {
766     TEST_REQUIRES_ARM_NEON_V8;
767     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
768       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
769         VCvtMicrokernelTester()
770           .batch_size(batch_size)
771           .scale(500)
772           .output_zero_point(128)
773           .qmin(std::numeric_limits<uint8_t>::min())
774           .qmax(qmax)
775           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x16, xnn_init_f32_qu8_cvt_neonv8_params);
776       }
777     }
778   }
779 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
780 
781 
782 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_QU8_VCVT__NEONV8_X24,batch_eq_24)783   TEST(F32_QU8_VCVT__NEONV8_X24, batch_eq_24) {
784     TEST_REQUIRES_ARM_NEON_V8;
785     VCvtMicrokernelTester()
786       .batch_size(24)
787       .qmin(std::numeric_limits<uint8_t>::min())
788       .qmax(std::numeric_limits<uint8_t>::max())
789       .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
790   }
791 
TEST(F32_QU8_VCVT__NEONV8_X24,batch_div_24)792   TEST(F32_QU8_VCVT__NEONV8_X24, batch_div_24) {
793     TEST_REQUIRES_ARM_NEON_V8;
794     for (size_t batch_size = 48; batch_size < 240; batch_size += 24) {
795       VCvtMicrokernelTester()
796         .batch_size(batch_size)
797         .qmin(std::numeric_limits<uint8_t>::min())
798         .qmax(std::numeric_limits<uint8_t>::max())
799         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
800     }
801   }
802 
TEST(F32_QU8_VCVT__NEONV8_X24,batch_lt_24)803   TEST(F32_QU8_VCVT__NEONV8_X24, batch_lt_24) {
804     TEST_REQUIRES_ARM_NEON_V8;
805     for (size_t batch_size = 1; batch_size < 24; batch_size++) {
806       VCvtMicrokernelTester()
807         .batch_size(batch_size)
808         .qmin(std::numeric_limits<uint8_t>::min())
809         .qmax(std::numeric_limits<uint8_t>::max())
810         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
811     }
812   }
813 
TEST(F32_QU8_VCVT__NEONV8_X24,batch_gt_24)814   TEST(F32_QU8_VCVT__NEONV8_X24, batch_gt_24) {
815     TEST_REQUIRES_ARM_NEON_V8;
816     for (size_t batch_size = 25; batch_size < 48; batch_size++) {
817       VCvtMicrokernelTester()
818         .batch_size(batch_size)
819         .qmin(std::numeric_limits<uint8_t>::min())
820         .qmax(std::numeric_limits<uint8_t>::max())
821         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
822     }
823   }
824 
TEST(F32_QU8_VCVT__NEONV8_X24,scale)825   TEST(F32_QU8_VCVT__NEONV8_X24, scale) {
826     TEST_REQUIRES_ARM_NEON_V8;
827     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
828       VCvtMicrokernelTester()
829         .batch_size(batch_size)
830         .scale(50)
831         .output_zero_point(100)
832         .qmin(std::numeric_limits<uint8_t>::min())
833         .qmax(std::numeric_limits<uint8_t>::max())
834         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
835     }
836   }
837 
TEST(F32_QU8_VCVT__NEONV8_X24,output_zero_point)838   TEST(F32_QU8_VCVT__NEONV8_X24, output_zero_point) {
839     TEST_REQUIRES_ARM_NEON_V8;
840     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
841       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
842         VCvtMicrokernelTester()
843           .batch_size(batch_size)
844           .output_zero_point(output_zero_point)
845           .qmin(std::numeric_limits<uint8_t>::min())
846           .qmax(std::numeric_limits<uint8_t>::max())
847           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
848       }
849     }
850   }
851 
TEST(F32_QU8_VCVT__NEONV8_X24,saturation)852   TEST(F32_QU8_VCVT__NEONV8_X24, saturation) {
853     TEST_REQUIRES_ARM_NEON_V8;
854     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
855       VCvtMicrokernelTester()
856         .batch_size(batch_size)
857         .scale(500)
858         .output_zero_point(128)
859         .qmin(std::numeric_limits<uint8_t>::min())
860         .qmax(std::numeric_limits<uint8_t>::max())
861         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
862     }
863   }
864 
TEST(F32_QU8_VCVT__NEONV8_X24,overflow)865   TEST(F32_QU8_VCVT__NEONV8_X24, overflow) {
866     TEST_REQUIRES_ARM_NEON_V8;
867     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
868       VCvtMicrokernelTester()
869         .batch_size(batch_size)
870         .scale(4294967296.0f)
871         .qmin(std::numeric_limits<uint8_t>::min())
872         .qmax(std::numeric_limits<uint8_t>::max())
873         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
874     }
875   }
876 
TEST(F32_QU8_VCVT__NEONV8_X24,qmin)877   TEST(F32_QU8_VCVT__NEONV8_X24, qmin) {
878     TEST_REQUIRES_ARM_NEON_V8;
879     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
880       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
881         VCvtMicrokernelTester()
882           .batch_size(batch_size)
883           .scale(500)
884           .output_zero_point(128)
885           .qmin(qmin)
886           .qmax(std::numeric_limits<uint8_t>::max())
887           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
888       }
889     }
890   }
891 
TEST(F32_QU8_VCVT__NEONV8_X24,qmax)892   TEST(F32_QU8_VCVT__NEONV8_X24, qmax) {
893     TEST_REQUIRES_ARM_NEON_V8;
894     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
895       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
896         VCvtMicrokernelTester()
897           .batch_size(batch_size)
898           .scale(500)
899           .output_zero_point(128)
900           .qmin(std::numeric_limits<uint8_t>::min())
901           .qmax(qmax)
902           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x24, xnn_init_f32_qu8_cvt_neonv8_params);
903       }
904     }
905   }
906 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
907 
908 
909 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_QU8_VCVT__NEONV8_X32,batch_eq_32)910   TEST(F32_QU8_VCVT__NEONV8_X32, batch_eq_32) {
911     TEST_REQUIRES_ARM_NEON_V8;
912     VCvtMicrokernelTester()
913       .batch_size(32)
914       .qmin(std::numeric_limits<uint8_t>::min())
915       .qmax(std::numeric_limits<uint8_t>::max())
916       .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
917   }
918 
TEST(F32_QU8_VCVT__NEONV8_X32,batch_div_32)919   TEST(F32_QU8_VCVT__NEONV8_X32, batch_div_32) {
920     TEST_REQUIRES_ARM_NEON_V8;
921     for (size_t batch_size = 64; batch_size < 320; batch_size += 32) {
922       VCvtMicrokernelTester()
923         .batch_size(batch_size)
924         .qmin(std::numeric_limits<uint8_t>::min())
925         .qmax(std::numeric_limits<uint8_t>::max())
926         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
927     }
928   }
929 
TEST(F32_QU8_VCVT__NEONV8_X32,batch_lt_32)930   TEST(F32_QU8_VCVT__NEONV8_X32, batch_lt_32) {
931     TEST_REQUIRES_ARM_NEON_V8;
932     for (size_t batch_size = 1; batch_size < 32; batch_size++) {
933       VCvtMicrokernelTester()
934         .batch_size(batch_size)
935         .qmin(std::numeric_limits<uint8_t>::min())
936         .qmax(std::numeric_limits<uint8_t>::max())
937         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
938     }
939   }
940 
TEST(F32_QU8_VCVT__NEONV8_X32,batch_gt_32)941   TEST(F32_QU8_VCVT__NEONV8_X32, batch_gt_32) {
942     TEST_REQUIRES_ARM_NEON_V8;
943     for (size_t batch_size = 33; batch_size < 64; batch_size++) {
944       VCvtMicrokernelTester()
945         .batch_size(batch_size)
946         .qmin(std::numeric_limits<uint8_t>::min())
947         .qmax(std::numeric_limits<uint8_t>::max())
948         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
949     }
950   }
951 
TEST(F32_QU8_VCVT__NEONV8_X32,scale)952   TEST(F32_QU8_VCVT__NEONV8_X32, scale) {
953     TEST_REQUIRES_ARM_NEON_V8;
954     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
955       VCvtMicrokernelTester()
956         .batch_size(batch_size)
957         .scale(50)
958         .output_zero_point(100)
959         .qmin(std::numeric_limits<uint8_t>::min())
960         .qmax(std::numeric_limits<uint8_t>::max())
961         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
962     }
963   }
964 
TEST(F32_QU8_VCVT__NEONV8_X32,output_zero_point)965   TEST(F32_QU8_VCVT__NEONV8_X32, output_zero_point) {
966     TEST_REQUIRES_ARM_NEON_V8;
967     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
968       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
969         VCvtMicrokernelTester()
970           .batch_size(batch_size)
971           .output_zero_point(output_zero_point)
972           .qmin(std::numeric_limits<uint8_t>::min())
973           .qmax(std::numeric_limits<uint8_t>::max())
974           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
975       }
976     }
977   }
978 
TEST(F32_QU8_VCVT__NEONV8_X32,saturation)979   TEST(F32_QU8_VCVT__NEONV8_X32, saturation) {
980     TEST_REQUIRES_ARM_NEON_V8;
981     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
982       VCvtMicrokernelTester()
983         .batch_size(batch_size)
984         .scale(500)
985         .output_zero_point(128)
986         .qmin(std::numeric_limits<uint8_t>::min())
987         .qmax(std::numeric_limits<uint8_t>::max())
988         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
989     }
990   }
991 
TEST(F32_QU8_VCVT__NEONV8_X32,overflow)992   TEST(F32_QU8_VCVT__NEONV8_X32, overflow) {
993     TEST_REQUIRES_ARM_NEON_V8;
994     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
995       VCvtMicrokernelTester()
996         .batch_size(batch_size)
997         .scale(4294967296.0f)
998         .qmin(std::numeric_limits<uint8_t>::min())
999         .qmax(std::numeric_limits<uint8_t>::max())
1000         .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
1001     }
1002   }
1003 
TEST(F32_QU8_VCVT__NEONV8_X32,qmin)1004   TEST(F32_QU8_VCVT__NEONV8_X32, qmin) {
1005     TEST_REQUIRES_ARM_NEON_V8;
1006     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
1007       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1008         VCvtMicrokernelTester()
1009           .batch_size(batch_size)
1010           .scale(500)
1011           .output_zero_point(128)
1012           .qmin(qmin)
1013           .qmax(std::numeric_limits<uint8_t>::max())
1014           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
1015       }
1016     }
1017   }
1018 
TEST(F32_QU8_VCVT__NEONV8_X32,qmax)1019   TEST(F32_QU8_VCVT__NEONV8_X32, qmax) {
1020     TEST_REQUIRES_ARM_NEON_V8;
1021     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
1022       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1023         VCvtMicrokernelTester()
1024           .batch_size(batch_size)
1025           .scale(500)
1026           .output_zero_point(128)
1027           .qmin(std::numeric_limits<uint8_t>::min())
1028           .qmax(qmax)
1029           .Test(xnn_f32_qu8_vcvt_ukernel__neonv8_x32, xnn_init_f32_qu8_cvt_neonv8_params);
1030       }
1031     }
1032   }
1033 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
1034 
1035 
1036 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__SSE2_X8,batch_eq_8)1037   TEST(F32_QU8_VCVT__SSE2_X8, batch_eq_8) {
1038     TEST_REQUIRES_X86_SSE2;
1039     VCvtMicrokernelTester()
1040       .batch_size(8)
1041       .qmin(std::numeric_limits<uint8_t>::min())
1042       .qmax(std::numeric_limits<uint8_t>::max())
1043       .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1044   }
1045 
TEST(F32_QU8_VCVT__SSE2_X8,batch_div_8)1046   TEST(F32_QU8_VCVT__SSE2_X8, batch_div_8) {
1047     TEST_REQUIRES_X86_SSE2;
1048     for (size_t batch_size = 16; batch_size < 80; batch_size += 8) {
1049       VCvtMicrokernelTester()
1050         .batch_size(batch_size)
1051         .qmin(std::numeric_limits<uint8_t>::min())
1052         .qmax(std::numeric_limits<uint8_t>::max())
1053         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1054     }
1055   }
1056 
TEST(F32_QU8_VCVT__SSE2_X8,batch_lt_8)1057   TEST(F32_QU8_VCVT__SSE2_X8, batch_lt_8) {
1058     TEST_REQUIRES_X86_SSE2;
1059     for (size_t batch_size = 1; batch_size < 8; batch_size++) {
1060       VCvtMicrokernelTester()
1061         .batch_size(batch_size)
1062         .qmin(std::numeric_limits<uint8_t>::min())
1063         .qmax(std::numeric_limits<uint8_t>::max())
1064         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1065     }
1066   }
1067 
TEST(F32_QU8_VCVT__SSE2_X8,batch_gt_8)1068   TEST(F32_QU8_VCVT__SSE2_X8, batch_gt_8) {
1069     TEST_REQUIRES_X86_SSE2;
1070     for (size_t batch_size = 9; batch_size < 16; batch_size++) {
1071       VCvtMicrokernelTester()
1072         .batch_size(batch_size)
1073         .qmin(std::numeric_limits<uint8_t>::min())
1074         .qmax(std::numeric_limits<uint8_t>::max())
1075         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1076     }
1077   }
1078 
TEST(F32_QU8_VCVT__SSE2_X8,scale)1079   TEST(F32_QU8_VCVT__SSE2_X8, scale) {
1080     TEST_REQUIRES_X86_SSE2;
1081     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1082       VCvtMicrokernelTester()
1083         .batch_size(batch_size)
1084         .scale(50)
1085         .output_zero_point(100)
1086         .qmin(std::numeric_limits<uint8_t>::min())
1087         .qmax(std::numeric_limits<uint8_t>::max())
1088         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1089     }
1090   }
1091 
TEST(F32_QU8_VCVT__SSE2_X8,output_zero_point)1092   TEST(F32_QU8_VCVT__SSE2_X8, output_zero_point) {
1093     TEST_REQUIRES_X86_SSE2;
1094     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
1095       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1096         VCvtMicrokernelTester()
1097           .batch_size(batch_size)
1098           .output_zero_point(output_zero_point)
1099           .qmin(std::numeric_limits<uint8_t>::min())
1100           .qmax(std::numeric_limits<uint8_t>::max())
1101           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1102       }
1103     }
1104   }
1105 
TEST(F32_QU8_VCVT__SSE2_X8,saturation)1106   TEST(F32_QU8_VCVT__SSE2_X8, saturation) {
1107     TEST_REQUIRES_X86_SSE2;
1108     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1109       VCvtMicrokernelTester()
1110         .batch_size(batch_size)
1111         .scale(500)
1112         .output_zero_point(128)
1113         .qmin(std::numeric_limits<uint8_t>::min())
1114         .qmax(std::numeric_limits<uint8_t>::max())
1115         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1116     }
1117   }
1118 
TEST(F32_QU8_VCVT__SSE2_X8,overflow)1119   TEST(F32_QU8_VCVT__SSE2_X8, overflow) {
1120     TEST_REQUIRES_X86_SSE2;
1121     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1122       VCvtMicrokernelTester()
1123         .batch_size(batch_size)
1124         .scale(4294967296.0f)
1125         .qmin(std::numeric_limits<uint8_t>::min())
1126         .qmax(std::numeric_limits<uint8_t>::max())
1127         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1128     }
1129   }
1130 
TEST(F32_QU8_VCVT__SSE2_X8,qmin)1131   TEST(F32_QU8_VCVT__SSE2_X8, qmin) {
1132     TEST_REQUIRES_X86_SSE2;
1133     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
1134       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1135         VCvtMicrokernelTester()
1136           .batch_size(batch_size)
1137           .scale(500)
1138           .output_zero_point(128)
1139           .qmin(qmin)
1140           .qmax(std::numeric_limits<uint8_t>::max())
1141           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1142       }
1143     }
1144   }
1145 
TEST(F32_QU8_VCVT__SSE2_X8,qmax)1146   TEST(F32_QU8_VCVT__SSE2_X8, qmax) {
1147     TEST_REQUIRES_X86_SSE2;
1148     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
1149       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1150         VCvtMicrokernelTester()
1151           .batch_size(batch_size)
1152           .scale(500)
1153           .output_zero_point(128)
1154           .qmin(std::numeric_limits<uint8_t>::min())
1155           .qmax(qmax)
1156           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x8, xnn_init_f32_qu8_cvt_sse2_params);
1157       }
1158     }
1159   }
1160 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
1161 
1162 
1163 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__SSE2_X16,batch_eq_16)1164   TEST(F32_QU8_VCVT__SSE2_X16, batch_eq_16) {
1165     TEST_REQUIRES_X86_SSE2;
1166     VCvtMicrokernelTester()
1167       .batch_size(16)
1168       .qmin(std::numeric_limits<uint8_t>::min())
1169       .qmax(std::numeric_limits<uint8_t>::max())
1170       .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1171   }
1172 
TEST(F32_QU8_VCVT__SSE2_X16,batch_div_16)1173   TEST(F32_QU8_VCVT__SSE2_X16, batch_div_16) {
1174     TEST_REQUIRES_X86_SSE2;
1175     for (size_t batch_size = 32; batch_size < 160; batch_size += 16) {
1176       VCvtMicrokernelTester()
1177         .batch_size(batch_size)
1178         .qmin(std::numeric_limits<uint8_t>::min())
1179         .qmax(std::numeric_limits<uint8_t>::max())
1180         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1181     }
1182   }
1183 
TEST(F32_QU8_VCVT__SSE2_X16,batch_lt_16)1184   TEST(F32_QU8_VCVT__SSE2_X16, batch_lt_16) {
1185     TEST_REQUIRES_X86_SSE2;
1186     for (size_t batch_size = 1; batch_size < 16; batch_size++) {
1187       VCvtMicrokernelTester()
1188         .batch_size(batch_size)
1189         .qmin(std::numeric_limits<uint8_t>::min())
1190         .qmax(std::numeric_limits<uint8_t>::max())
1191         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1192     }
1193   }
1194 
TEST(F32_QU8_VCVT__SSE2_X16,batch_gt_16)1195   TEST(F32_QU8_VCVT__SSE2_X16, batch_gt_16) {
1196     TEST_REQUIRES_X86_SSE2;
1197     for (size_t batch_size = 17; batch_size < 32; batch_size++) {
1198       VCvtMicrokernelTester()
1199         .batch_size(batch_size)
1200         .qmin(std::numeric_limits<uint8_t>::min())
1201         .qmax(std::numeric_limits<uint8_t>::max())
1202         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1203     }
1204   }
1205 
TEST(F32_QU8_VCVT__SSE2_X16,scale)1206   TEST(F32_QU8_VCVT__SSE2_X16, scale) {
1207     TEST_REQUIRES_X86_SSE2;
1208     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1209       VCvtMicrokernelTester()
1210         .batch_size(batch_size)
1211         .scale(50)
1212         .output_zero_point(100)
1213         .qmin(std::numeric_limits<uint8_t>::min())
1214         .qmax(std::numeric_limits<uint8_t>::max())
1215         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1216     }
1217   }
1218 
TEST(F32_QU8_VCVT__SSE2_X16,output_zero_point)1219   TEST(F32_QU8_VCVT__SSE2_X16, output_zero_point) {
1220     TEST_REQUIRES_X86_SSE2;
1221     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
1222       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1223         VCvtMicrokernelTester()
1224           .batch_size(batch_size)
1225           .output_zero_point(output_zero_point)
1226           .qmin(std::numeric_limits<uint8_t>::min())
1227           .qmax(std::numeric_limits<uint8_t>::max())
1228           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1229       }
1230     }
1231   }
1232 
TEST(F32_QU8_VCVT__SSE2_X16,saturation)1233   TEST(F32_QU8_VCVT__SSE2_X16, saturation) {
1234     TEST_REQUIRES_X86_SSE2;
1235     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1236       VCvtMicrokernelTester()
1237         .batch_size(batch_size)
1238         .scale(500)
1239         .output_zero_point(128)
1240         .qmin(std::numeric_limits<uint8_t>::min())
1241         .qmax(std::numeric_limits<uint8_t>::max())
1242         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1243     }
1244   }
1245 
TEST(F32_QU8_VCVT__SSE2_X16,overflow)1246   TEST(F32_QU8_VCVT__SSE2_X16, overflow) {
1247     TEST_REQUIRES_X86_SSE2;
1248     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1249       VCvtMicrokernelTester()
1250         .batch_size(batch_size)
1251         .scale(4294967296.0f)
1252         .qmin(std::numeric_limits<uint8_t>::min())
1253         .qmax(std::numeric_limits<uint8_t>::max())
1254         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1255     }
1256   }
1257 
TEST(F32_QU8_VCVT__SSE2_X16,qmin)1258   TEST(F32_QU8_VCVT__SSE2_X16, qmin) {
1259     TEST_REQUIRES_X86_SSE2;
1260     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
1261       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1262         VCvtMicrokernelTester()
1263           .batch_size(batch_size)
1264           .scale(500)
1265           .output_zero_point(128)
1266           .qmin(qmin)
1267           .qmax(std::numeric_limits<uint8_t>::max())
1268           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1269       }
1270     }
1271   }
1272 
TEST(F32_QU8_VCVT__SSE2_X16,qmax)1273   TEST(F32_QU8_VCVT__SSE2_X16, qmax) {
1274     TEST_REQUIRES_X86_SSE2;
1275     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
1276       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1277         VCvtMicrokernelTester()
1278           .batch_size(batch_size)
1279           .scale(500)
1280           .output_zero_point(128)
1281           .qmin(std::numeric_limits<uint8_t>::min())
1282           .qmax(qmax)
1283           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x16, xnn_init_f32_qu8_cvt_sse2_params);
1284       }
1285     }
1286   }
1287 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
1288 
1289 
1290 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__SSE2_X24,batch_eq_24)1291   TEST(F32_QU8_VCVT__SSE2_X24, batch_eq_24) {
1292     TEST_REQUIRES_X86_SSE2;
1293     VCvtMicrokernelTester()
1294       .batch_size(24)
1295       .qmin(std::numeric_limits<uint8_t>::min())
1296       .qmax(std::numeric_limits<uint8_t>::max())
1297       .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1298   }
1299 
TEST(F32_QU8_VCVT__SSE2_X24,batch_div_24)1300   TEST(F32_QU8_VCVT__SSE2_X24, batch_div_24) {
1301     TEST_REQUIRES_X86_SSE2;
1302     for (size_t batch_size = 48; batch_size < 240; batch_size += 24) {
1303       VCvtMicrokernelTester()
1304         .batch_size(batch_size)
1305         .qmin(std::numeric_limits<uint8_t>::min())
1306         .qmax(std::numeric_limits<uint8_t>::max())
1307         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1308     }
1309   }
1310 
TEST(F32_QU8_VCVT__SSE2_X24,batch_lt_24)1311   TEST(F32_QU8_VCVT__SSE2_X24, batch_lt_24) {
1312     TEST_REQUIRES_X86_SSE2;
1313     for (size_t batch_size = 1; batch_size < 24; batch_size++) {
1314       VCvtMicrokernelTester()
1315         .batch_size(batch_size)
1316         .qmin(std::numeric_limits<uint8_t>::min())
1317         .qmax(std::numeric_limits<uint8_t>::max())
1318         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1319     }
1320   }
1321 
TEST(F32_QU8_VCVT__SSE2_X24,batch_gt_24)1322   TEST(F32_QU8_VCVT__SSE2_X24, batch_gt_24) {
1323     TEST_REQUIRES_X86_SSE2;
1324     for (size_t batch_size = 25; batch_size < 48; batch_size++) {
1325       VCvtMicrokernelTester()
1326         .batch_size(batch_size)
1327         .qmin(std::numeric_limits<uint8_t>::min())
1328         .qmax(std::numeric_limits<uint8_t>::max())
1329         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1330     }
1331   }
1332 
TEST(F32_QU8_VCVT__SSE2_X24,scale)1333   TEST(F32_QU8_VCVT__SSE2_X24, scale) {
1334     TEST_REQUIRES_X86_SSE2;
1335     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1336       VCvtMicrokernelTester()
1337         .batch_size(batch_size)
1338         .scale(50)
1339         .output_zero_point(100)
1340         .qmin(std::numeric_limits<uint8_t>::min())
1341         .qmax(std::numeric_limits<uint8_t>::max())
1342         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1343     }
1344   }
1345 
TEST(F32_QU8_VCVT__SSE2_X24,output_zero_point)1346   TEST(F32_QU8_VCVT__SSE2_X24, output_zero_point) {
1347     TEST_REQUIRES_X86_SSE2;
1348     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
1349       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1350         VCvtMicrokernelTester()
1351           .batch_size(batch_size)
1352           .output_zero_point(output_zero_point)
1353           .qmin(std::numeric_limits<uint8_t>::min())
1354           .qmax(std::numeric_limits<uint8_t>::max())
1355           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1356       }
1357     }
1358   }
1359 
TEST(F32_QU8_VCVT__SSE2_X24,saturation)1360   TEST(F32_QU8_VCVT__SSE2_X24, saturation) {
1361     TEST_REQUIRES_X86_SSE2;
1362     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1363       VCvtMicrokernelTester()
1364         .batch_size(batch_size)
1365         .scale(500)
1366         .output_zero_point(128)
1367         .qmin(std::numeric_limits<uint8_t>::min())
1368         .qmax(std::numeric_limits<uint8_t>::max())
1369         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1370     }
1371   }
1372 
TEST(F32_QU8_VCVT__SSE2_X24,overflow)1373   TEST(F32_QU8_VCVT__SSE2_X24, overflow) {
1374     TEST_REQUIRES_X86_SSE2;
1375     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1376       VCvtMicrokernelTester()
1377         .batch_size(batch_size)
1378         .scale(4294967296.0f)
1379         .qmin(std::numeric_limits<uint8_t>::min())
1380         .qmax(std::numeric_limits<uint8_t>::max())
1381         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1382     }
1383   }
1384 
TEST(F32_QU8_VCVT__SSE2_X24,qmin)1385   TEST(F32_QU8_VCVT__SSE2_X24, qmin) {
1386     TEST_REQUIRES_X86_SSE2;
1387     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
1388       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1389         VCvtMicrokernelTester()
1390           .batch_size(batch_size)
1391           .scale(500)
1392           .output_zero_point(128)
1393           .qmin(qmin)
1394           .qmax(std::numeric_limits<uint8_t>::max())
1395           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1396       }
1397     }
1398   }
1399 
TEST(F32_QU8_VCVT__SSE2_X24,qmax)1400   TEST(F32_QU8_VCVT__SSE2_X24, qmax) {
1401     TEST_REQUIRES_X86_SSE2;
1402     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
1403       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1404         VCvtMicrokernelTester()
1405           .batch_size(batch_size)
1406           .scale(500)
1407           .output_zero_point(128)
1408           .qmin(std::numeric_limits<uint8_t>::min())
1409           .qmax(qmax)
1410           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x24, xnn_init_f32_qu8_cvt_sse2_params);
1411       }
1412     }
1413   }
1414 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
1415 
1416 
1417 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__SSE2_X32,batch_eq_32)1418   TEST(F32_QU8_VCVT__SSE2_X32, batch_eq_32) {
1419     TEST_REQUIRES_X86_SSE2;
1420     VCvtMicrokernelTester()
1421       .batch_size(32)
1422       .qmin(std::numeric_limits<uint8_t>::min())
1423       .qmax(std::numeric_limits<uint8_t>::max())
1424       .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1425   }
1426 
TEST(F32_QU8_VCVT__SSE2_X32,batch_div_32)1427   TEST(F32_QU8_VCVT__SSE2_X32, batch_div_32) {
1428     TEST_REQUIRES_X86_SSE2;
1429     for (size_t batch_size = 64; batch_size < 320; batch_size += 32) {
1430       VCvtMicrokernelTester()
1431         .batch_size(batch_size)
1432         .qmin(std::numeric_limits<uint8_t>::min())
1433         .qmax(std::numeric_limits<uint8_t>::max())
1434         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1435     }
1436   }
1437 
TEST(F32_QU8_VCVT__SSE2_X32,batch_lt_32)1438   TEST(F32_QU8_VCVT__SSE2_X32, batch_lt_32) {
1439     TEST_REQUIRES_X86_SSE2;
1440     for (size_t batch_size = 1; batch_size < 32; batch_size++) {
1441       VCvtMicrokernelTester()
1442         .batch_size(batch_size)
1443         .qmin(std::numeric_limits<uint8_t>::min())
1444         .qmax(std::numeric_limits<uint8_t>::max())
1445         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1446     }
1447   }
1448 
TEST(F32_QU8_VCVT__SSE2_X32,batch_gt_32)1449   TEST(F32_QU8_VCVT__SSE2_X32, batch_gt_32) {
1450     TEST_REQUIRES_X86_SSE2;
1451     for (size_t batch_size = 33; batch_size < 64; batch_size++) {
1452       VCvtMicrokernelTester()
1453         .batch_size(batch_size)
1454         .qmin(std::numeric_limits<uint8_t>::min())
1455         .qmax(std::numeric_limits<uint8_t>::max())
1456         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1457     }
1458   }
1459 
TEST(F32_QU8_VCVT__SSE2_X32,scale)1460   TEST(F32_QU8_VCVT__SSE2_X32, scale) {
1461     TEST_REQUIRES_X86_SSE2;
1462     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1463       VCvtMicrokernelTester()
1464         .batch_size(batch_size)
1465         .scale(50)
1466         .output_zero_point(100)
1467         .qmin(std::numeric_limits<uint8_t>::min())
1468         .qmax(std::numeric_limits<uint8_t>::max())
1469         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1470     }
1471   }
1472 
TEST(F32_QU8_VCVT__SSE2_X32,output_zero_point)1473   TEST(F32_QU8_VCVT__SSE2_X32, output_zero_point) {
1474     TEST_REQUIRES_X86_SSE2;
1475     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
1476       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1477         VCvtMicrokernelTester()
1478           .batch_size(batch_size)
1479           .output_zero_point(output_zero_point)
1480           .qmin(std::numeric_limits<uint8_t>::min())
1481           .qmax(std::numeric_limits<uint8_t>::max())
1482           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1483       }
1484     }
1485   }
1486 
TEST(F32_QU8_VCVT__SSE2_X32,saturation)1487   TEST(F32_QU8_VCVT__SSE2_X32, saturation) {
1488     TEST_REQUIRES_X86_SSE2;
1489     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1490       VCvtMicrokernelTester()
1491         .batch_size(batch_size)
1492         .scale(500)
1493         .output_zero_point(128)
1494         .qmin(std::numeric_limits<uint8_t>::min())
1495         .qmax(std::numeric_limits<uint8_t>::max())
1496         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1497     }
1498   }
1499 
TEST(F32_QU8_VCVT__SSE2_X32,overflow)1500   TEST(F32_QU8_VCVT__SSE2_X32, overflow) {
1501     TEST_REQUIRES_X86_SSE2;
1502     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1503       VCvtMicrokernelTester()
1504         .batch_size(batch_size)
1505         .scale(4294967296.0f)
1506         .qmin(std::numeric_limits<uint8_t>::min())
1507         .qmax(std::numeric_limits<uint8_t>::max())
1508         .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1509     }
1510   }
1511 
TEST(F32_QU8_VCVT__SSE2_X32,qmin)1512   TEST(F32_QU8_VCVT__SSE2_X32, qmin) {
1513     TEST_REQUIRES_X86_SSE2;
1514     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
1515       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1516         VCvtMicrokernelTester()
1517           .batch_size(batch_size)
1518           .scale(500)
1519           .output_zero_point(128)
1520           .qmin(qmin)
1521           .qmax(std::numeric_limits<uint8_t>::max())
1522           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1523       }
1524     }
1525   }
1526 
TEST(F32_QU8_VCVT__SSE2_X32,qmax)1527   TEST(F32_QU8_VCVT__SSE2_X32, qmax) {
1528     TEST_REQUIRES_X86_SSE2;
1529     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
1530       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1531         VCvtMicrokernelTester()
1532           .batch_size(batch_size)
1533           .scale(500)
1534           .output_zero_point(128)
1535           .qmin(std::numeric_limits<uint8_t>::min())
1536           .qmax(qmax)
1537           .Test(xnn_f32_qu8_vcvt_ukernel__sse2_x32, xnn_init_f32_qu8_cvt_sse2_params);
1538       }
1539     }
1540   }
1541 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
1542 
1543 
1544 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX_X8,batch_eq_8)1545   TEST(F32_QU8_VCVT__AVX_X8, batch_eq_8) {
1546     TEST_REQUIRES_X86_AVX;
1547     VCvtMicrokernelTester()
1548       .batch_size(8)
1549       .qmin(std::numeric_limits<uint8_t>::min())
1550       .qmax(std::numeric_limits<uint8_t>::max())
1551       .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1552   }
1553 
TEST(F32_QU8_VCVT__AVX_X8,batch_div_8)1554   TEST(F32_QU8_VCVT__AVX_X8, batch_div_8) {
1555     TEST_REQUIRES_X86_AVX;
1556     for (size_t batch_size = 16; batch_size < 80; batch_size += 8) {
1557       VCvtMicrokernelTester()
1558         .batch_size(batch_size)
1559         .qmin(std::numeric_limits<uint8_t>::min())
1560         .qmax(std::numeric_limits<uint8_t>::max())
1561         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1562     }
1563   }
1564 
TEST(F32_QU8_VCVT__AVX_X8,batch_lt_8)1565   TEST(F32_QU8_VCVT__AVX_X8, batch_lt_8) {
1566     TEST_REQUIRES_X86_AVX;
1567     for (size_t batch_size = 1; batch_size < 8; batch_size++) {
1568       VCvtMicrokernelTester()
1569         .batch_size(batch_size)
1570         .qmin(std::numeric_limits<uint8_t>::min())
1571         .qmax(std::numeric_limits<uint8_t>::max())
1572         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1573     }
1574   }
1575 
TEST(F32_QU8_VCVT__AVX_X8,batch_gt_8)1576   TEST(F32_QU8_VCVT__AVX_X8, batch_gt_8) {
1577     TEST_REQUIRES_X86_AVX;
1578     for (size_t batch_size = 9; batch_size < 16; batch_size++) {
1579       VCvtMicrokernelTester()
1580         .batch_size(batch_size)
1581         .qmin(std::numeric_limits<uint8_t>::min())
1582         .qmax(std::numeric_limits<uint8_t>::max())
1583         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1584     }
1585   }
1586 
TEST(F32_QU8_VCVT__AVX_X8,scale)1587   TEST(F32_QU8_VCVT__AVX_X8, scale) {
1588     TEST_REQUIRES_X86_AVX;
1589     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1590       VCvtMicrokernelTester()
1591         .batch_size(batch_size)
1592         .scale(50)
1593         .output_zero_point(100)
1594         .qmin(std::numeric_limits<uint8_t>::min())
1595         .qmax(std::numeric_limits<uint8_t>::max())
1596         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1597     }
1598   }
1599 
TEST(F32_QU8_VCVT__AVX_X8,output_zero_point)1600   TEST(F32_QU8_VCVT__AVX_X8, output_zero_point) {
1601     TEST_REQUIRES_X86_AVX;
1602     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
1603       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1604         VCvtMicrokernelTester()
1605           .batch_size(batch_size)
1606           .output_zero_point(output_zero_point)
1607           .qmin(std::numeric_limits<uint8_t>::min())
1608           .qmax(std::numeric_limits<uint8_t>::max())
1609           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1610       }
1611     }
1612   }
1613 
TEST(F32_QU8_VCVT__AVX_X8,saturation)1614   TEST(F32_QU8_VCVT__AVX_X8, saturation) {
1615     TEST_REQUIRES_X86_AVX;
1616     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1617       VCvtMicrokernelTester()
1618         .batch_size(batch_size)
1619         .scale(500)
1620         .output_zero_point(128)
1621         .qmin(std::numeric_limits<uint8_t>::min())
1622         .qmax(std::numeric_limits<uint8_t>::max())
1623         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1624     }
1625   }
1626 
TEST(F32_QU8_VCVT__AVX_X8,overflow)1627   TEST(F32_QU8_VCVT__AVX_X8, overflow) {
1628     TEST_REQUIRES_X86_AVX;
1629     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1630       VCvtMicrokernelTester()
1631         .batch_size(batch_size)
1632         .scale(4294967296.0f)
1633         .qmin(std::numeric_limits<uint8_t>::min())
1634         .qmax(std::numeric_limits<uint8_t>::max())
1635         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1636     }
1637   }
1638 
TEST(F32_QU8_VCVT__AVX_X8,qmin)1639   TEST(F32_QU8_VCVT__AVX_X8, qmin) {
1640     TEST_REQUIRES_X86_AVX;
1641     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
1642       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1643         VCvtMicrokernelTester()
1644           .batch_size(batch_size)
1645           .scale(500)
1646           .output_zero_point(128)
1647           .qmin(qmin)
1648           .qmax(std::numeric_limits<uint8_t>::max())
1649           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1650       }
1651     }
1652   }
1653 
TEST(F32_QU8_VCVT__AVX_X8,qmax)1654   TEST(F32_QU8_VCVT__AVX_X8, qmax) {
1655     TEST_REQUIRES_X86_AVX;
1656     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
1657       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
1658         VCvtMicrokernelTester()
1659           .batch_size(batch_size)
1660           .scale(500)
1661           .output_zero_point(128)
1662           .qmin(std::numeric_limits<uint8_t>::min())
1663           .qmax(qmax)
1664           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x8, xnn_init_f32_qu8_cvt_avx_params);
1665       }
1666     }
1667   }
1668 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
1669 
1670 
1671 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX_X16,batch_eq_16)1672   TEST(F32_QU8_VCVT__AVX_X16, batch_eq_16) {
1673     TEST_REQUIRES_X86_AVX;
1674     VCvtMicrokernelTester()
1675       .batch_size(16)
1676       .qmin(std::numeric_limits<uint8_t>::min())
1677       .qmax(std::numeric_limits<uint8_t>::max())
1678       .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1679   }
1680 
TEST(F32_QU8_VCVT__AVX_X16,batch_div_16)1681   TEST(F32_QU8_VCVT__AVX_X16, batch_div_16) {
1682     TEST_REQUIRES_X86_AVX;
1683     for (size_t batch_size = 32; batch_size < 160; batch_size += 16) {
1684       VCvtMicrokernelTester()
1685         .batch_size(batch_size)
1686         .qmin(std::numeric_limits<uint8_t>::min())
1687         .qmax(std::numeric_limits<uint8_t>::max())
1688         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1689     }
1690   }
1691 
TEST(F32_QU8_VCVT__AVX_X16,batch_lt_16)1692   TEST(F32_QU8_VCVT__AVX_X16, batch_lt_16) {
1693     TEST_REQUIRES_X86_AVX;
1694     for (size_t batch_size = 1; batch_size < 16; batch_size++) {
1695       VCvtMicrokernelTester()
1696         .batch_size(batch_size)
1697         .qmin(std::numeric_limits<uint8_t>::min())
1698         .qmax(std::numeric_limits<uint8_t>::max())
1699         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1700     }
1701   }
1702 
TEST(F32_QU8_VCVT__AVX_X16,batch_gt_16)1703   TEST(F32_QU8_VCVT__AVX_X16, batch_gt_16) {
1704     TEST_REQUIRES_X86_AVX;
1705     for (size_t batch_size = 17; batch_size < 32; batch_size++) {
1706       VCvtMicrokernelTester()
1707         .batch_size(batch_size)
1708         .qmin(std::numeric_limits<uint8_t>::min())
1709         .qmax(std::numeric_limits<uint8_t>::max())
1710         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1711     }
1712   }
1713 
TEST(F32_QU8_VCVT__AVX_X16,scale)1714   TEST(F32_QU8_VCVT__AVX_X16, scale) {
1715     TEST_REQUIRES_X86_AVX;
1716     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1717       VCvtMicrokernelTester()
1718         .batch_size(batch_size)
1719         .scale(50)
1720         .output_zero_point(100)
1721         .qmin(std::numeric_limits<uint8_t>::min())
1722         .qmax(std::numeric_limits<uint8_t>::max())
1723         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1724     }
1725   }
1726 
TEST(F32_QU8_VCVT__AVX_X16,output_zero_point)1727   TEST(F32_QU8_VCVT__AVX_X16, output_zero_point) {
1728     TEST_REQUIRES_X86_AVX;
1729     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
1730       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1731         VCvtMicrokernelTester()
1732           .batch_size(batch_size)
1733           .output_zero_point(output_zero_point)
1734           .qmin(std::numeric_limits<uint8_t>::min())
1735           .qmax(std::numeric_limits<uint8_t>::max())
1736           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1737       }
1738     }
1739   }
1740 
TEST(F32_QU8_VCVT__AVX_X16,saturation)1741   TEST(F32_QU8_VCVT__AVX_X16, saturation) {
1742     TEST_REQUIRES_X86_AVX;
1743     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1744       VCvtMicrokernelTester()
1745         .batch_size(batch_size)
1746         .scale(500)
1747         .output_zero_point(128)
1748         .qmin(std::numeric_limits<uint8_t>::min())
1749         .qmax(std::numeric_limits<uint8_t>::max())
1750         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1751     }
1752   }
1753 
TEST(F32_QU8_VCVT__AVX_X16,overflow)1754   TEST(F32_QU8_VCVT__AVX_X16, overflow) {
1755     TEST_REQUIRES_X86_AVX;
1756     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1757       VCvtMicrokernelTester()
1758         .batch_size(batch_size)
1759         .scale(4294967296.0f)
1760         .qmin(std::numeric_limits<uint8_t>::min())
1761         .qmax(std::numeric_limits<uint8_t>::max())
1762         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1763     }
1764   }
1765 
TEST(F32_QU8_VCVT__AVX_X16,qmin)1766   TEST(F32_QU8_VCVT__AVX_X16, qmin) {
1767     TEST_REQUIRES_X86_AVX;
1768     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
1769       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1770         VCvtMicrokernelTester()
1771           .batch_size(batch_size)
1772           .scale(500)
1773           .output_zero_point(128)
1774           .qmin(qmin)
1775           .qmax(std::numeric_limits<uint8_t>::max())
1776           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1777       }
1778     }
1779   }
1780 
TEST(F32_QU8_VCVT__AVX_X16,qmax)1781   TEST(F32_QU8_VCVT__AVX_X16, qmax) {
1782     TEST_REQUIRES_X86_AVX;
1783     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
1784       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
1785         VCvtMicrokernelTester()
1786           .batch_size(batch_size)
1787           .scale(500)
1788           .output_zero_point(128)
1789           .qmin(std::numeric_limits<uint8_t>::min())
1790           .qmax(qmax)
1791           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x16, xnn_init_f32_qu8_cvt_avx_params);
1792       }
1793     }
1794   }
1795 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
1796 
1797 
1798 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX_X24,batch_eq_24)1799   TEST(F32_QU8_VCVT__AVX_X24, batch_eq_24) {
1800     TEST_REQUIRES_X86_AVX;
1801     VCvtMicrokernelTester()
1802       .batch_size(24)
1803       .qmin(std::numeric_limits<uint8_t>::min())
1804       .qmax(std::numeric_limits<uint8_t>::max())
1805       .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1806   }
1807 
TEST(F32_QU8_VCVT__AVX_X24,batch_div_24)1808   TEST(F32_QU8_VCVT__AVX_X24, batch_div_24) {
1809     TEST_REQUIRES_X86_AVX;
1810     for (size_t batch_size = 48; batch_size < 240; batch_size += 24) {
1811       VCvtMicrokernelTester()
1812         .batch_size(batch_size)
1813         .qmin(std::numeric_limits<uint8_t>::min())
1814         .qmax(std::numeric_limits<uint8_t>::max())
1815         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1816     }
1817   }
1818 
TEST(F32_QU8_VCVT__AVX_X24,batch_lt_24)1819   TEST(F32_QU8_VCVT__AVX_X24, batch_lt_24) {
1820     TEST_REQUIRES_X86_AVX;
1821     for (size_t batch_size = 1; batch_size < 24; batch_size++) {
1822       VCvtMicrokernelTester()
1823         .batch_size(batch_size)
1824         .qmin(std::numeric_limits<uint8_t>::min())
1825         .qmax(std::numeric_limits<uint8_t>::max())
1826         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1827     }
1828   }
1829 
TEST(F32_QU8_VCVT__AVX_X24,batch_gt_24)1830   TEST(F32_QU8_VCVT__AVX_X24, batch_gt_24) {
1831     TEST_REQUIRES_X86_AVX;
1832     for (size_t batch_size = 25; batch_size < 48; batch_size++) {
1833       VCvtMicrokernelTester()
1834         .batch_size(batch_size)
1835         .qmin(std::numeric_limits<uint8_t>::min())
1836         .qmax(std::numeric_limits<uint8_t>::max())
1837         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1838     }
1839   }
1840 
TEST(F32_QU8_VCVT__AVX_X24,scale)1841   TEST(F32_QU8_VCVT__AVX_X24, scale) {
1842     TEST_REQUIRES_X86_AVX;
1843     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1844       VCvtMicrokernelTester()
1845         .batch_size(batch_size)
1846         .scale(50)
1847         .output_zero_point(100)
1848         .qmin(std::numeric_limits<uint8_t>::min())
1849         .qmax(std::numeric_limits<uint8_t>::max())
1850         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1851     }
1852   }
1853 
TEST(F32_QU8_VCVT__AVX_X24,output_zero_point)1854   TEST(F32_QU8_VCVT__AVX_X24, output_zero_point) {
1855     TEST_REQUIRES_X86_AVX;
1856     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
1857       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1858         VCvtMicrokernelTester()
1859           .batch_size(batch_size)
1860           .output_zero_point(output_zero_point)
1861           .qmin(std::numeric_limits<uint8_t>::min())
1862           .qmax(std::numeric_limits<uint8_t>::max())
1863           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1864       }
1865     }
1866   }
1867 
TEST(F32_QU8_VCVT__AVX_X24,saturation)1868   TEST(F32_QU8_VCVT__AVX_X24, saturation) {
1869     TEST_REQUIRES_X86_AVX;
1870     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1871       VCvtMicrokernelTester()
1872         .batch_size(batch_size)
1873         .scale(500)
1874         .output_zero_point(128)
1875         .qmin(std::numeric_limits<uint8_t>::min())
1876         .qmax(std::numeric_limits<uint8_t>::max())
1877         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1878     }
1879   }
1880 
TEST(F32_QU8_VCVT__AVX_X24,overflow)1881   TEST(F32_QU8_VCVT__AVX_X24, overflow) {
1882     TEST_REQUIRES_X86_AVX;
1883     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1884       VCvtMicrokernelTester()
1885         .batch_size(batch_size)
1886         .scale(4294967296.0f)
1887         .qmin(std::numeric_limits<uint8_t>::min())
1888         .qmax(std::numeric_limits<uint8_t>::max())
1889         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1890     }
1891   }
1892 
TEST(F32_QU8_VCVT__AVX_X24,qmin)1893   TEST(F32_QU8_VCVT__AVX_X24, qmin) {
1894     TEST_REQUIRES_X86_AVX;
1895     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
1896       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1897         VCvtMicrokernelTester()
1898           .batch_size(batch_size)
1899           .scale(500)
1900           .output_zero_point(128)
1901           .qmin(qmin)
1902           .qmax(std::numeric_limits<uint8_t>::max())
1903           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1904       }
1905     }
1906   }
1907 
TEST(F32_QU8_VCVT__AVX_X24,qmax)1908   TEST(F32_QU8_VCVT__AVX_X24, qmax) {
1909     TEST_REQUIRES_X86_AVX;
1910     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
1911       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
1912         VCvtMicrokernelTester()
1913           .batch_size(batch_size)
1914           .scale(500)
1915           .output_zero_point(128)
1916           .qmin(std::numeric_limits<uint8_t>::min())
1917           .qmax(qmax)
1918           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x24, xnn_init_f32_qu8_cvt_avx_params);
1919       }
1920     }
1921   }
1922 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
1923 
1924 
1925 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX_X32,batch_eq_32)1926   TEST(F32_QU8_VCVT__AVX_X32, batch_eq_32) {
1927     TEST_REQUIRES_X86_AVX;
1928     VCvtMicrokernelTester()
1929       .batch_size(32)
1930       .qmin(std::numeric_limits<uint8_t>::min())
1931       .qmax(std::numeric_limits<uint8_t>::max())
1932       .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
1933   }
1934 
TEST(F32_QU8_VCVT__AVX_X32,batch_div_32)1935   TEST(F32_QU8_VCVT__AVX_X32, batch_div_32) {
1936     TEST_REQUIRES_X86_AVX;
1937     for (size_t batch_size = 64; batch_size < 320; batch_size += 32) {
1938       VCvtMicrokernelTester()
1939         .batch_size(batch_size)
1940         .qmin(std::numeric_limits<uint8_t>::min())
1941         .qmax(std::numeric_limits<uint8_t>::max())
1942         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
1943     }
1944   }
1945 
TEST(F32_QU8_VCVT__AVX_X32,batch_lt_32)1946   TEST(F32_QU8_VCVT__AVX_X32, batch_lt_32) {
1947     TEST_REQUIRES_X86_AVX;
1948     for (size_t batch_size = 1; batch_size < 32; batch_size++) {
1949       VCvtMicrokernelTester()
1950         .batch_size(batch_size)
1951         .qmin(std::numeric_limits<uint8_t>::min())
1952         .qmax(std::numeric_limits<uint8_t>::max())
1953         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
1954     }
1955   }
1956 
TEST(F32_QU8_VCVT__AVX_X32,batch_gt_32)1957   TEST(F32_QU8_VCVT__AVX_X32, batch_gt_32) {
1958     TEST_REQUIRES_X86_AVX;
1959     for (size_t batch_size = 33; batch_size < 64; batch_size++) {
1960       VCvtMicrokernelTester()
1961         .batch_size(batch_size)
1962         .qmin(std::numeric_limits<uint8_t>::min())
1963         .qmax(std::numeric_limits<uint8_t>::max())
1964         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
1965     }
1966   }
1967 
TEST(F32_QU8_VCVT__AVX_X32,scale)1968   TEST(F32_QU8_VCVT__AVX_X32, scale) {
1969     TEST_REQUIRES_X86_AVX;
1970     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1971       VCvtMicrokernelTester()
1972         .batch_size(batch_size)
1973         .scale(50)
1974         .output_zero_point(100)
1975         .qmin(std::numeric_limits<uint8_t>::min())
1976         .qmax(std::numeric_limits<uint8_t>::max())
1977         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
1978     }
1979   }
1980 
TEST(F32_QU8_VCVT__AVX_X32,output_zero_point)1981   TEST(F32_QU8_VCVT__AVX_X32, output_zero_point) {
1982     TEST_REQUIRES_X86_AVX;
1983     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
1984       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1985         VCvtMicrokernelTester()
1986           .batch_size(batch_size)
1987           .output_zero_point(output_zero_point)
1988           .qmin(std::numeric_limits<uint8_t>::min())
1989           .qmax(std::numeric_limits<uint8_t>::max())
1990           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
1991       }
1992     }
1993   }
1994 
TEST(F32_QU8_VCVT__AVX_X32,saturation)1995   TEST(F32_QU8_VCVT__AVX_X32, saturation) {
1996     TEST_REQUIRES_X86_AVX;
1997     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
1998       VCvtMicrokernelTester()
1999         .batch_size(batch_size)
2000         .scale(500)
2001         .output_zero_point(128)
2002         .qmin(std::numeric_limits<uint8_t>::min())
2003         .qmax(std::numeric_limits<uint8_t>::max())
2004         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
2005     }
2006   }
2007 
TEST(F32_QU8_VCVT__AVX_X32,overflow)2008   TEST(F32_QU8_VCVT__AVX_X32, overflow) {
2009     TEST_REQUIRES_X86_AVX;
2010     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2011       VCvtMicrokernelTester()
2012         .batch_size(batch_size)
2013         .scale(4294967296.0f)
2014         .qmin(std::numeric_limits<uint8_t>::min())
2015         .qmax(std::numeric_limits<uint8_t>::max())
2016         .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
2017     }
2018   }
2019 
TEST(F32_QU8_VCVT__AVX_X32,qmin)2020   TEST(F32_QU8_VCVT__AVX_X32, qmin) {
2021     TEST_REQUIRES_X86_AVX;
2022     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
2023       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2024         VCvtMicrokernelTester()
2025           .batch_size(batch_size)
2026           .scale(500)
2027           .output_zero_point(128)
2028           .qmin(qmin)
2029           .qmax(std::numeric_limits<uint8_t>::max())
2030           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
2031       }
2032     }
2033   }
2034 
TEST(F32_QU8_VCVT__AVX_X32,qmax)2035   TEST(F32_QU8_VCVT__AVX_X32, qmax) {
2036     TEST_REQUIRES_X86_AVX;
2037     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
2038       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2039         VCvtMicrokernelTester()
2040           .batch_size(batch_size)
2041           .scale(500)
2042           .output_zero_point(128)
2043           .qmin(std::numeric_limits<uint8_t>::min())
2044           .qmax(qmax)
2045           .Test(xnn_f32_qu8_vcvt_ukernel__avx_x32, xnn_init_f32_qu8_cvt_avx_params);
2046       }
2047     }
2048   }
2049 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2050 
2051 
2052 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX2_X16,batch_eq_16)2053   TEST(F32_QU8_VCVT__AVX2_X16, batch_eq_16) {
2054     TEST_REQUIRES_X86_AVX2;
2055     VCvtMicrokernelTester()
2056       .batch_size(16)
2057       .qmin(std::numeric_limits<uint8_t>::min())
2058       .qmax(std::numeric_limits<uint8_t>::max())
2059       .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2060   }
2061 
TEST(F32_QU8_VCVT__AVX2_X16,batch_div_16)2062   TEST(F32_QU8_VCVT__AVX2_X16, batch_div_16) {
2063     TEST_REQUIRES_X86_AVX2;
2064     for (size_t batch_size = 32; batch_size < 160; batch_size += 16) {
2065       VCvtMicrokernelTester()
2066         .batch_size(batch_size)
2067         .qmin(std::numeric_limits<uint8_t>::min())
2068         .qmax(std::numeric_limits<uint8_t>::max())
2069         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2070     }
2071   }
2072 
TEST(F32_QU8_VCVT__AVX2_X16,batch_lt_16)2073   TEST(F32_QU8_VCVT__AVX2_X16, batch_lt_16) {
2074     TEST_REQUIRES_X86_AVX2;
2075     for (size_t batch_size = 1; batch_size < 16; batch_size++) {
2076       VCvtMicrokernelTester()
2077         .batch_size(batch_size)
2078         .qmin(std::numeric_limits<uint8_t>::min())
2079         .qmax(std::numeric_limits<uint8_t>::max())
2080         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2081     }
2082   }
2083 
TEST(F32_QU8_VCVT__AVX2_X16,batch_gt_16)2084   TEST(F32_QU8_VCVT__AVX2_X16, batch_gt_16) {
2085     TEST_REQUIRES_X86_AVX2;
2086     for (size_t batch_size = 17; batch_size < 32; batch_size++) {
2087       VCvtMicrokernelTester()
2088         .batch_size(batch_size)
2089         .qmin(std::numeric_limits<uint8_t>::min())
2090         .qmax(std::numeric_limits<uint8_t>::max())
2091         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2092     }
2093   }
2094 
TEST(F32_QU8_VCVT__AVX2_X16,scale)2095   TEST(F32_QU8_VCVT__AVX2_X16, scale) {
2096     TEST_REQUIRES_X86_AVX2;
2097     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
2098       VCvtMicrokernelTester()
2099         .batch_size(batch_size)
2100         .scale(50)
2101         .output_zero_point(100)
2102         .qmin(std::numeric_limits<uint8_t>::min())
2103         .qmax(std::numeric_limits<uint8_t>::max())
2104         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2105     }
2106   }
2107 
TEST(F32_QU8_VCVT__AVX2_X16,output_zero_point)2108   TEST(F32_QU8_VCVT__AVX2_X16, output_zero_point) {
2109     TEST_REQUIRES_X86_AVX2;
2110     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
2111       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
2112         VCvtMicrokernelTester()
2113           .batch_size(batch_size)
2114           .output_zero_point(output_zero_point)
2115           .qmin(std::numeric_limits<uint8_t>::min())
2116           .qmax(std::numeric_limits<uint8_t>::max())
2117           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2118       }
2119     }
2120   }
2121 
TEST(F32_QU8_VCVT__AVX2_X16,saturation)2122   TEST(F32_QU8_VCVT__AVX2_X16, saturation) {
2123     TEST_REQUIRES_X86_AVX2;
2124     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
2125       VCvtMicrokernelTester()
2126         .batch_size(batch_size)
2127         .scale(500)
2128         .output_zero_point(128)
2129         .qmin(std::numeric_limits<uint8_t>::min())
2130         .qmax(std::numeric_limits<uint8_t>::max())
2131         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2132     }
2133   }
2134 
TEST(F32_QU8_VCVT__AVX2_X16,overflow)2135   TEST(F32_QU8_VCVT__AVX2_X16, overflow) {
2136     TEST_REQUIRES_X86_AVX2;
2137     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
2138       VCvtMicrokernelTester()
2139         .batch_size(batch_size)
2140         .scale(4294967296.0f)
2141         .qmin(std::numeric_limits<uint8_t>::min())
2142         .qmax(std::numeric_limits<uint8_t>::max())
2143         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2144     }
2145   }
2146 
TEST(F32_QU8_VCVT__AVX2_X16,qmin)2147   TEST(F32_QU8_VCVT__AVX2_X16, qmin) {
2148     TEST_REQUIRES_X86_AVX2;
2149     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
2150       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
2151         VCvtMicrokernelTester()
2152           .batch_size(batch_size)
2153           .scale(500)
2154           .output_zero_point(128)
2155           .qmin(qmin)
2156           .qmax(std::numeric_limits<uint8_t>::max())
2157           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2158       }
2159     }
2160   }
2161 
TEST(F32_QU8_VCVT__AVX2_X16,qmax)2162   TEST(F32_QU8_VCVT__AVX2_X16, qmax) {
2163     TEST_REQUIRES_X86_AVX2;
2164     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
2165       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
2166         VCvtMicrokernelTester()
2167           .batch_size(batch_size)
2168           .scale(500)
2169           .output_zero_point(128)
2170           .qmin(std::numeric_limits<uint8_t>::min())
2171           .qmax(qmax)
2172           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x16, xnn_init_f32_qu8_cvt_avx2_params);
2173       }
2174     }
2175   }
2176 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2177 
2178 
2179 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX2_X32,batch_eq_32)2180   TEST(F32_QU8_VCVT__AVX2_X32, batch_eq_32) {
2181     TEST_REQUIRES_X86_AVX2;
2182     VCvtMicrokernelTester()
2183       .batch_size(32)
2184       .qmin(std::numeric_limits<uint8_t>::min())
2185       .qmax(std::numeric_limits<uint8_t>::max())
2186       .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2187   }
2188 
TEST(F32_QU8_VCVT__AVX2_X32,batch_div_32)2189   TEST(F32_QU8_VCVT__AVX2_X32, batch_div_32) {
2190     TEST_REQUIRES_X86_AVX2;
2191     for (size_t batch_size = 64; batch_size < 320; batch_size += 32) {
2192       VCvtMicrokernelTester()
2193         .batch_size(batch_size)
2194         .qmin(std::numeric_limits<uint8_t>::min())
2195         .qmax(std::numeric_limits<uint8_t>::max())
2196         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2197     }
2198   }
2199 
TEST(F32_QU8_VCVT__AVX2_X32,batch_lt_32)2200   TEST(F32_QU8_VCVT__AVX2_X32, batch_lt_32) {
2201     TEST_REQUIRES_X86_AVX2;
2202     for (size_t batch_size = 1; batch_size < 32; batch_size++) {
2203       VCvtMicrokernelTester()
2204         .batch_size(batch_size)
2205         .qmin(std::numeric_limits<uint8_t>::min())
2206         .qmax(std::numeric_limits<uint8_t>::max())
2207         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2208     }
2209   }
2210 
TEST(F32_QU8_VCVT__AVX2_X32,batch_gt_32)2211   TEST(F32_QU8_VCVT__AVX2_X32, batch_gt_32) {
2212     TEST_REQUIRES_X86_AVX2;
2213     for (size_t batch_size = 33; batch_size < 64; batch_size++) {
2214       VCvtMicrokernelTester()
2215         .batch_size(batch_size)
2216         .qmin(std::numeric_limits<uint8_t>::min())
2217         .qmax(std::numeric_limits<uint8_t>::max())
2218         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2219     }
2220   }
2221 
TEST(F32_QU8_VCVT__AVX2_X32,scale)2222   TEST(F32_QU8_VCVT__AVX2_X32, scale) {
2223     TEST_REQUIRES_X86_AVX2;
2224     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2225       VCvtMicrokernelTester()
2226         .batch_size(batch_size)
2227         .scale(50)
2228         .output_zero_point(100)
2229         .qmin(std::numeric_limits<uint8_t>::min())
2230         .qmax(std::numeric_limits<uint8_t>::max())
2231         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2232     }
2233   }
2234 
TEST(F32_QU8_VCVT__AVX2_X32,output_zero_point)2235   TEST(F32_QU8_VCVT__AVX2_X32, output_zero_point) {
2236     TEST_REQUIRES_X86_AVX2;
2237     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
2238       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2239         VCvtMicrokernelTester()
2240           .batch_size(batch_size)
2241           .output_zero_point(output_zero_point)
2242           .qmin(std::numeric_limits<uint8_t>::min())
2243           .qmax(std::numeric_limits<uint8_t>::max())
2244           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2245       }
2246     }
2247   }
2248 
TEST(F32_QU8_VCVT__AVX2_X32,saturation)2249   TEST(F32_QU8_VCVT__AVX2_X32, saturation) {
2250     TEST_REQUIRES_X86_AVX2;
2251     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2252       VCvtMicrokernelTester()
2253         .batch_size(batch_size)
2254         .scale(500)
2255         .output_zero_point(128)
2256         .qmin(std::numeric_limits<uint8_t>::min())
2257         .qmax(std::numeric_limits<uint8_t>::max())
2258         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2259     }
2260   }
2261 
TEST(F32_QU8_VCVT__AVX2_X32,overflow)2262   TEST(F32_QU8_VCVT__AVX2_X32, overflow) {
2263     TEST_REQUIRES_X86_AVX2;
2264     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2265       VCvtMicrokernelTester()
2266         .batch_size(batch_size)
2267         .scale(4294967296.0f)
2268         .qmin(std::numeric_limits<uint8_t>::min())
2269         .qmax(std::numeric_limits<uint8_t>::max())
2270         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2271     }
2272   }
2273 
TEST(F32_QU8_VCVT__AVX2_X32,qmin)2274   TEST(F32_QU8_VCVT__AVX2_X32, qmin) {
2275     TEST_REQUIRES_X86_AVX2;
2276     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
2277       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2278         VCvtMicrokernelTester()
2279           .batch_size(batch_size)
2280           .scale(500)
2281           .output_zero_point(128)
2282           .qmin(qmin)
2283           .qmax(std::numeric_limits<uint8_t>::max())
2284           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2285       }
2286     }
2287   }
2288 
TEST(F32_QU8_VCVT__AVX2_X32,qmax)2289   TEST(F32_QU8_VCVT__AVX2_X32, qmax) {
2290     TEST_REQUIRES_X86_AVX2;
2291     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
2292       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2293         VCvtMicrokernelTester()
2294           .batch_size(batch_size)
2295           .scale(500)
2296           .output_zero_point(128)
2297           .qmin(std::numeric_limits<uint8_t>::min())
2298           .qmax(qmax)
2299           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x32, xnn_init_f32_qu8_cvt_avx2_params);
2300       }
2301     }
2302   }
2303 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2304 
2305 
2306 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX2_X48,batch_eq_48)2307   TEST(F32_QU8_VCVT__AVX2_X48, batch_eq_48) {
2308     TEST_REQUIRES_X86_AVX2;
2309     VCvtMicrokernelTester()
2310       .batch_size(48)
2311       .qmin(std::numeric_limits<uint8_t>::min())
2312       .qmax(std::numeric_limits<uint8_t>::max())
2313       .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2314   }
2315 
TEST(F32_QU8_VCVT__AVX2_X48,batch_div_48)2316   TEST(F32_QU8_VCVT__AVX2_X48, batch_div_48) {
2317     TEST_REQUIRES_X86_AVX2;
2318     for (size_t batch_size = 96; batch_size < 480; batch_size += 48) {
2319       VCvtMicrokernelTester()
2320         .batch_size(batch_size)
2321         .qmin(std::numeric_limits<uint8_t>::min())
2322         .qmax(std::numeric_limits<uint8_t>::max())
2323         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2324     }
2325   }
2326 
TEST(F32_QU8_VCVT__AVX2_X48,batch_lt_48)2327   TEST(F32_QU8_VCVT__AVX2_X48, batch_lt_48) {
2328     TEST_REQUIRES_X86_AVX2;
2329     for (size_t batch_size = 1; batch_size < 48; batch_size++) {
2330       VCvtMicrokernelTester()
2331         .batch_size(batch_size)
2332         .qmin(std::numeric_limits<uint8_t>::min())
2333         .qmax(std::numeric_limits<uint8_t>::max())
2334         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2335     }
2336   }
2337 
TEST(F32_QU8_VCVT__AVX2_X48,batch_gt_48)2338   TEST(F32_QU8_VCVT__AVX2_X48, batch_gt_48) {
2339     TEST_REQUIRES_X86_AVX2;
2340     for (size_t batch_size = 49; batch_size < 96; batch_size++) {
2341       VCvtMicrokernelTester()
2342         .batch_size(batch_size)
2343         .qmin(std::numeric_limits<uint8_t>::min())
2344         .qmax(std::numeric_limits<uint8_t>::max())
2345         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2346     }
2347   }
2348 
TEST(F32_QU8_VCVT__AVX2_X48,scale)2349   TEST(F32_QU8_VCVT__AVX2_X48, scale) {
2350     TEST_REQUIRES_X86_AVX2;
2351     for (size_t batch_size = 1; batch_size <= 240; batch_size += 47) {
2352       VCvtMicrokernelTester()
2353         .batch_size(batch_size)
2354         .scale(50)
2355         .output_zero_point(100)
2356         .qmin(std::numeric_limits<uint8_t>::min())
2357         .qmax(std::numeric_limits<uint8_t>::max())
2358         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2359     }
2360   }
2361 
TEST(F32_QU8_VCVT__AVX2_X48,output_zero_point)2362   TEST(F32_QU8_VCVT__AVX2_X48, output_zero_point) {
2363     TEST_REQUIRES_X86_AVX2;
2364     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
2365       for (size_t batch_size = 1; batch_size <= 240; batch_size += 47) {
2366         VCvtMicrokernelTester()
2367           .batch_size(batch_size)
2368           .output_zero_point(output_zero_point)
2369           .qmin(std::numeric_limits<uint8_t>::min())
2370           .qmax(std::numeric_limits<uint8_t>::max())
2371           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2372       }
2373     }
2374   }
2375 
TEST(F32_QU8_VCVT__AVX2_X48,saturation)2376   TEST(F32_QU8_VCVT__AVX2_X48, saturation) {
2377     TEST_REQUIRES_X86_AVX2;
2378     for (size_t batch_size = 1; batch_size <= 240; batch_size += 47) {
2379       VCvtMicrokernelTester()
2380         .batch_size(batch_size)
2381         .scale(500)
2382         .output_zero_point(128)
2383         .qmin(std::numeric_limits<uint8_t>::min())
2384         .qmax(std::numeric_limits<uint8_t>::max())
2385         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2386     }
2387   }
2388 
TEST(F32_QU8_VCVT__AVX2_X48,overflow)2389   TEST(F32_QU8_VCVT__AVX2_X48, overflow) {
2390     TEST_REQUIRES_X86_AVX2;
2391     for (size_t batch_size = 1; batch_size <= 240; batch_size += 47) {
2392       VCvtMicrokernelTester()
2393         .batch_size(batch_size)
2394         .scale(4294967296.0f)
2395         .qmin(std::numeric_limits<uint8_t>::min())
2396         .qmax(std::numeric_limits<uint8_t>::max())
2397         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2398     }
2399   }
2400 
TEST(F32_QU8_VCVT__AVX2_X48,qmin)2401   TEST(F32_QU8_VCVT__AVX2_X48, qmin) {
2402     TEST_REQUIRES_X86_AVX2;
2403     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
2404       for (size_t batch_size = 1; batch_size <= 240; batch_size += 47) {
2405         VCvtMicrokernelTester()
2406           .batch_size(batch_size)
2407           .scale(500)
2408           .output_zero_point(128)
2409           .qmin(qmin)
2410           .qmax(std::numeric_limits<uint8_t>::max())
2411           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2412       }
2413     }
2414   }
2415 
TEST(F32_QU8_VCVT__AVX2_X48,qmax)2416   TEST(F32_QU8_VCVT__AVX2_X48, qmax) {
2417     TEST_REQUIRES_X86_AVX2;
2418     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
2419       for (size_t batch_size = 1; batch_size <= 240; batch_size += 47) {
2420         VCvtMicrokernelTester()
2421           .batch_size(batch_size)
2422           .scale(500)
2423           .output_zero_point(128)
2424           .qmin(std::numeric_limits<uint8_t>::min())
2425           .qmax(qmax)
2426           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x48, xnn_init_f32_qu8_cvt_avx2_params);
2427       }
2428     }
2429   }
2430 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2431 
2432 
2433 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX2_X64,batch_eq_64)2434   TEST(F32_QU8_VCVT__AVX2_X64, batch_eq_64) {
2435     TEST_REQUIRES_X86_AVX2;
2436     VCvtMicrokernelTester()
2437       .batch_size(64)
2438       .qmin(std::numeric_limits<uint8_t>::min())
2439       .qmax(std::numeric_limits<uint8_t>::max())
2440       .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2441   }
2442 
TEST(F32_QU8_VCVT__AVX2_X64,batch_div_64)2443   TEST(F32_QU8_VCVT__AVX2_X64, batch_div_64) {
2444     TEST_REQUIRES_X86_AVX2;
2445     for (size_t batch_size = 128; batch_size < 640; batch_size += 64) {
2446       VCvtMicrokernelTester()
2447         .batch_size(batch_size)
2448         .qmin(std::numeric_limits<uint8_t>::min())
2449         .qmax(std::numeric_limits<uint8_t>::max())
2450         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2451     }
2452   }
2453 
TEST(F32_QU8_VCVT__AVX2_X64,batch_lt_64)2454   TEST(F32_QU8_VCVT__AVX2_X64, batch_lt_64) {
2455     TEST_REQUIRES_X86_AVX2;
2456     for (size_t batch_size = 1; batch_size < 64; batch_size++) {
2457       VCvtMicrokernelTester()
2458         .batch_size(batch_size)
2459         .qmin(std::numeric_limits<uint8_t>::min())
2460         .qmax(std::numeric_limits<uint8_t>::max())
2461         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2462     }
2463   }
2464 
TEST(F32_QU8_VCVT__AVX2_X64,batch_gt_64)2465   TEST(F32_QU8_VCVT__AVX2_X64, batch_gt_64) {
2466     TEST_REQUIRES_X86_AVX2;
2467     for (size_t batch_size = 65; batch_size < 128; batch_size++) {
2468       VCvtMicrokernelTester()
2469         .batch_size(batch_size)
2470         .qmin(std::numeric_limits<uint8_t>::min())
2471         .qmax(std::numeric_limits<uint8_t>::max())
2472         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2473     }
2474   }
2475 
TEST(F32_QU8_VCVT__AVX2_X64,scale)2476   TEST(F32_QU8_VCVT__AVX2_X64, scale) {
2477     TEST_REQUIRES_X86_AVX2;
2478     for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2479       VCvtMicrokernelTester()
2480         .batch_size(batch_size)
2481         .scale(50)
2482         .output_zero_point(100)
2483         .qmin(std::numeric_limits<uint8_t>::min())
2484         .qmax(std::numeric_limits<uint8_t>::max())
2485         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2486     }
2487   }
2488 
TEST(F32_QU8_VCVT__AVX2_X64,output_zero_point)2489   TEST(F32_QU8_VCVT__AVX2_X64, output_zero_point) {
2490     TEST_REQUIRES_X86_AVX2;
2491     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
2492       for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2493         VCvtMicrokernelTester()
2494           .batch_size(batch_size)
2495           .output_zero_point(output_zero_point)
2496           .qmin(std::numeric_limits<uint8_t>::min())
2497           .qmax(std::numeric_limits<uint8_t>::max())
2498           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2499       }
2500     }
2501   }
2502 
TEST(F32_QU8_VCVT__AVX2_X64,saturation)2503   TEST(F32_QU8_VCVT__AVX2_X64, saturation) {
2504     TEST_REQUIRES_X86_AVX2;
2505     for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2506       VCvtMicrokernelTester()
2507         .batch_size(batch_size)
2508         .scale(500)
2509         .output_zero_point(128)
2510         .qmin(std::numeric_limits<uint8_t>::min())
2511         .qmax(std::numeric_limits<uint8_t>::max())
2512         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2513     }
2514   }
2515 
TEST(F32_QU8_VCVT__AVX2_X64,overflow)2516   TEST(F32_QU8_VCVT__AVX2_X64, overflow) {
2517     TEST_REQUIRES_X86_AVX2;
2518     for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2519       VCvtMicrokernelTester()
2520         .batch_size(batch_size)
2521         .scale(4294967296.0f)
2522         .qmin(std::numeric_limits<uint8_t>::min())
2523         .qmax(std::numeric_limits<uint8_t>::max())
2524         .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2525     }
2526   }
2527 
TEST(F32_QU8_VCVT__AVX2_X64,qmin)2528   TEST(F32_QU8_VCVT__AVX2_X64, qmin) {
2529     TEST_REQUIRES_X86_AVX2;
2530     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
2531       for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2532         VCvtMicrokernelTester()
2533           .batch_size(batch_size)
2534           .scale(500)
2535           .output_zero_point(128)
2536           .qmin(qmin)
2537           .qmax(std::numeric_limits<uint8_t>::max())
2538           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2539       }
2540     }
2541   }
2542 
TEST(F32_QU8_VCVT__AVX2_X64,qmax)2543   TEST(F32_QU8_VCVT__AVX2_X64, qmax) {
2544     TEST_REQUIRES_X86_AVX2;
2545     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
2546       for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2547         VCvtMicrokernelTester()
2548           .batch_size(batch_size)
2549           .scale(500)
2550           .output_zero_point(128)
2551           .qmin(std::numeric_limits<uint8_t>::min())
2552           .qmax(qmax)
2553           .Test(xnn_f32_qu8_vcvt_ukernel__avx2_x64, xnn_init_f32_qu8_cvt_avx2_params);
2554       }
2555     }
2556   }
2557 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2558 
2559 
2560 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX512SKX_X32,batch_eq_32)2561   TEST(F32_QU8_VCVT__AVX512SKX_X32, batch_eq_32) {
2562     TEST_REQUIRES_X86_AVX512SKX;
2563     VCvtMicrokernelTester()
2564       .batch_size(32)
2565       .qmin(std::numeric_limits<uint8_t>::min())
2566       .qmax(std::numeric_limits<uint8_t>::max())
2567       .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2568   }
2569 
TEST(F32_QU8_VCVT__AVX512SKX_X32,batch_div_32)2570   TEST(F32_QU8_VCVT__AVX512SKX_X32, batch_div_32) {
2571     TEST_REQUIRES_X86_AVX512SKX;
2572     for (size_t batch_size = 64; batch_size < 320; batch_size += 32) {
2573       VCvtMicrokernelTester()
2574         .batch_size(batch_size)
2575         .qmin(std::numeric_limits<uint8_t>::min())
2576         .qmax(std::numeric_limits<uint8_t>::max())
2577         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2578     }
2579   }
2580 
TEST(F32_QU8_VCVT__AVX512SKX_X32,batch_lt_32)2581   TEST(F32_QU8_VCVT__AVX512SKX_X32, batch_lt_32) {
2582     TEST_REQUIRES_X86_AVX512SKX;
2583     for (size_t batch_size = 1; batch_size < 32; batch_size++) {
2584       VCvtMicrokernelTester()
2585         .batch_size(batch_size)
2586         .qmin(std::numeric_limits<uint8_t>::min())
2587         .qmax(std::numeric_limits<uint8_t>::max())
2588         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2589     }
2590   }
2591 
TEST(F32_QU8_VCVT__AVX512SKX_X32,batch_gt_32)2592   TEST(F32_QU8_VCVT__AVX512SKX_X32, batch_gt_32) {
2593     TEST_REQUIRES_X86_AVX512SKX;
2594     for (size_t batch_size = 33; batch_size < 64; batch_size++) {
2595       VCvtMicrokernelTester()
2596         .batch_size(batch_size)
2597         .qmin(std::numeric_limits<uint8_t>::min())
2598         .qmax(std::numeric_limits<uint8_t>::max())
2599         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2600     }
2601   }
2602 
TEST(F32_QU8_VCVT__AVX512SKX_X32,scale)2603   TEST(F32_QU8_VCVT__AVX512SKX_X32, scale) {
2604     TEST_REQUIRES_X86_AVX512SKX;
2605     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2606       VCvtMicrokernelTester()
2607         .batch_size(batch_size)
2608         .scale(50)
2609         .output_zero_point(100)
2610         .qmin(std::numeric_limits<uint8_t>::min())
2611         .qmax(std::numeric_limits<uint8_t>::max())
2612         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2613     }
2614   }
2615 
TEST(F32_QU8_VCVT__AVX512SKX_X32,output_zero_point)2616   TEST(F32_QU8_VCVT__AVX512SKX_X32, output_zero_point) {
2617     TEST_REQUIRES_X86_AVX512SKX;
2618     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
2619       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2620         VCvtMicrokernelTester()
2621           .batch_size(batch_size)
2622           .output_zero_point(output_zero_point)
2623           .qmin(std::numeric_limits<uint8_t>::min())
2624           .qmax(std::numeric_limits<uint8_t>::max())
2625           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2626       }
2627     }
2628   }
2629 
TEST(F32_QU8_VCVT__AVX512SKX_X32,saturation)2630   TEST(F32_QU8_VCVT__AVX512SKX_X32, saturation) {
2631     TEST_REQUIRES_X86_AVX512SKX;
2632     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2633       VCvtMicrokernelTester()
2634         .batch_size(batch_size)
2635         .scale(500)
2636         .output_zero_point(128)
2637         .qmin(std::numeric_limits<uint8_t>::min())
2638         .qmax(std::numeric_limits<uint8_t>::max())
2639         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2640     }
2641   }
2642 
TEST(F32_QU8_VCVT__AVX512SKX_X32,overflow)2643   TEST(F32_QU8_VCVT__AVX512SKX_X32, overflow) {
2644     TEST_REQUIRES_X86_AVX512SKX;
2645     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2646       VCvtMicrokernelTester()
2647         .batch_size(batch_size)
2648         .scale(4294967296.0f)
2649         .qmin(std::numeric_limits<uint8_t>::min())
2650         .qmax(std::numeric_limits<uint8_t>::max())
2651         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2652     }
2653   }
2654 
TEST(F32_QU8_VCVT__AVX512SKX_X32,qmin)2655   TEST(F32_QU8_VCVT__AVX512SKX_X32, qmin) {
2656     TEST_REQUIRES_X86_AVX512SKX;
2657     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
2658       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2659         VCvtMicrokernelTester()
2660           .batch_size(batch_size)
2661           .scale(500)
2662           .output_zero_point(128)
2663           .qmin(qmin)
2664           .qmax(std::numeric_limits<uint8_t>::max())
2665           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2666       }
2667     }
2668   }
2669 
TEST(F32_QU8_VCVT__AVX512SKX_X32,qmax)2670   TEST(F32_QU8_VCVT__AVX512SKX_X32, qmax) {
2671     TEST_REQUIRES_X86_AVX512SKX;
2672     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
2673       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
2674         VCvtMicrokernelTester()
2675           .batch_size(batch_size)
2676           .scale(500)
2677           .output_zero_point(128)
2678           .qmin(std::numeric_limits<uint8_t>::min())
2679           .qmax(qmax)
2680           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x32, xnn_init_f32_qu8_cvt_avx512_params);
2681       }
2682     }
2683   }
2684 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2685 
2686 
2687 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX512SKX_X64,batch_eq_64)2688   TEST(F32_QU8_VCVT__AVX512SKX_X64, batch_eq_64) {
2689     TEST_REQUIRES_X86_AVX512SKX;
2690     VCvtMicrokernelTester()
2691       .batch_size(64)
2692       .qmin(std::numeric_limits<uint8_t>::min())
2693       .qmax(std::numeric_limits<uint8_t>::max())
2694       .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2695   }
2696 
TEST(F32_QU8_VCVT__AVX512SKX_X64,batch_div_64)2697   TEST(F32_QU8_VCVT__AVX512SKX_X64, batch_div_64) {
2698     TEST_REQUIRES_X86_AVX512SKX;
2699     for (size_t batch_size = 128; batch_size < 640; batch_size += 64) {
2700       VCvtMicrokernelTester()
2701         .batch_size(batch_size)
2702         .qmin(std::numeric_limits<uint8_t>::min())
2703         .qmax(std::numeric_limits<uint8_t>::max())
2704         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2705     }
2706   }
2707 
TEST(F32_QU8_VCVT__AVX512SKX_X64,batch_lt_64)2708   TEST(F32_QU8_VCVT__AVX512SKX_X64, batch_lt_64) {
2709     TEST_REQUIRES_X86_AVX512SKX;
2710     for (size_t batch_size = 1; batch_size < 64; batch_size++) {
2711       VCvtMicrokernelTester()
2712         .batch_size(batch_size)
2713         .qmin(std::numeric_limits<uint8_t>::min())
2714         .qmax(std::numeric_limits<uint8_t>::max())
2715         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2716     }
2717   }
2718 
TEST(F32_QU8_VCVT__AVX512SKX_X64,batch_gt_64)2719   TEST(F32_QU8_VCVT__AVX512SKX_X64, batch_gt_64) {
2720     TEST_REQUIRES_X86_AVX512SKX;
2721     for (size_t batch_size = 65; batch_size < 128; batch_size++) {
2722       VCvtMicrokernelTester()
2723         .batch_size(batch_size)
2724         .qmin(std::numeric_limits<uint8_t>::min())
2725         .qmax(std::numeric_limits<uint8_t>::max())
2726         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2727     }
2728   }
2729 
TEST(F32_QU8_VCVT__AVX512SKX_X64,scale)2730   TEST(F32_QU8_VCVT__AVX512SKX_X64, scale) {
2731     TEST_REQUIRES_X86_AVX512SKX;
2732     for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2733       VCvtMicrokernelTester()
2734         .batch_size(batch_size)
2735         .scale(50)
2736         .output_zero_point(100)
2737         .qmin(std::numeric_limits<uint8_t>::min())
2738         .qmax(std::numeric_limits<uint8_t>::max())
2739         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2740     }
2741   }
2742 
TEST(F32_QU8_VCVT__AVX512SKX_X64,output_zero_point)2743   TEST(F32_QU8_VCVT__AVX512SKX_X64, output_zero_point) {
2744     TEST_REQUIRES_X86_AVX512SKX;
2745     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
2746       for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2747         VCvtMicrokernelTester()
2748           .batch_size(batch_size)
2749           .output_zero_point(output_zero_point)
2750           .qmin(std::numeric_limits<uint8_t>::min())
2751           .qmax(std::numeric_limits<uint8_t>::max())
2752           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2753       }
2754     }
2755   }
2756 
TEST(F32_QU8_VCVT__AVX512SKX_X64,saturation)2757   TEST(F32_QU8_VCVT__AVX512SKX_X64, saturation) {
2758     TEST_REQUIRES_X86_AVX512SKX;
2759     for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2760       VCvtMicrokernelTester()
2761         .batch_size(batch_size)
2762         .scale(500)
2763         .output_zero_point(128)
2764         .qmin(std::numeric_limits<uint8_t>::min())
2765         .qmax(std::numeric_limits<uint8_t>::max())
2766         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2767     }
2768   }
2769 
TEST(F32_QU8_VCVT__AVX512SKX_X64,overflow)2770   TEST(F32_QU8_VCVT__AVX512SKX_X64, overflow) {
2771     TEST_REQUIRES_X86_AVX512SKX;
2772     for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2773       VCvtMicrokernelTester()
2774         .batch_size(batch_size)
2775         .scale(4294967296.0f)
2776         .qmin(std::numeric_limits<uint8_t>::min())
2777         .qmax(std::numeric_limits<uint8_t>::max())
2778         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2779     }
2780   }
2781 
TEST(F32_QU8_VCVT__AVX512SKX_X64,qmin)2782   TEST(F32_QU8_VCVT__AVX512SKX_X64, qmin) {
2783     TEST_REQUIRES_X86_AVX512SKX;
2784     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
2785       for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2786         VCvtMicrokernelTester()
2787           .batch_size(batch_size)
2788           .scale(500)
2789           .output_zero_point(128)
2790           .qmin(qmin)
2791           .qmax(std::numeric_limits<uint8_t>::max())
2792           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2793       }
2794     }
2795   }
2796 
TEST(F32_QU8_VCVT__AVX512SKX_X64,qmax)2797   TEST(F32_QU8_VCVT__AVX512SKX_X64, qmax) {
2798     TEST_REQUIRES_X86_AVX512SKX;
2799     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
2800       for (size_t batch_size = 1; batch_size <= 320; batch_size += 63) {
2801         VCvtMicrokernelTester()
2802           .batch_size(batch_size)
2803           .scale(500)
2804           .output_zero_point(128)
2805           .qmin(std::numeric_limits<uint8_t>::min())
2806           .qmax(qmax)
2807           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x64, xnn_init_f32_qu8_cvt_avx512_params);
2808       }
2809     }
2810   }
2811 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2812 
2813 
2814 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX512SKX_X96,batch_eq_96)2815   TEST(F32_QU8_VCVT__AVX512SKX_X96, batch_eq_96) {
2816     TEST_REQUIRES_X86_AVX512SKX;
2817     VCvtMicrokernelTester()
2818       .batch_size(96)
2819       .qmin(std::numeric_limits<uint8_t>::min())
2820       .qmax(std::numeric_limits<uint8_t>::max())
2821       .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2822   }
2823 
TEST(F32_QU8_VCVT__AVX512SKX_X96,batch_div_96)2824   TEST(F32_QU8_VCVT__AVX512SKX_X96, batch_div_96) {
2825     TEST_REQUIRES_X86_AVX512SKX;
2826     for (size_t batch_size = 192; batch_size < 960; batch_size += 96) {
2827       VCvtMicrokernelTester()
2828         .batch_size(batch_size)
2829         .qmin(std::numeric_limits<uint8_t>::min())
2830         .qmax(std::numeric_limits<uint8_t>::max())
2831         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2832     }
2833   }
2834 
TEST(F32_QU8_VCVT__AVX512SKX_X96,batch_lt_96)2835   TEST(F32_QU8_VCVT__AVX512SKX_X96, batch_lt_96) {
2836     TEST_REQUIRES_X86_AVX512SKX;
2837     for (size_t batch_size = 1; batch_size < 96; batch_size++) {
2838       VCvtMicrokernelTester()
2839         .batch_size(batch_size)
2840         .qmin(std::numeric_limits<uint8_t>::min())
2841         .qmax(std::numeric_limits<uint8_t>::max())
2842         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2843     }
2844   }
2845 
TEST(F32_QU8_VCVT__AVX512SKX_X96,batch_gt_96)2846   TEST(F32_QU8_VCVT__AVX512SKX_X96, batch_gt_96) {
2847     TEST_REQUIRES_X86_AVX512SKX;
2848     for (size_t batch_size = 97; batch_size < 192; batch_size++) {
2849       VCvtMicrokernelTester()
2850         .batch_size(batch_size)
2851         .qmin(std::numeric_limits<uint8_t>::min())
2852         .qmax(std::numeric_limits<uint8_t>::max())
2853         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2854     }
2855   }
2856 
TEST(F32_QU8_VCVT__AVX512SKX_X96,scale)2857   TEST(F32_QU8_VCVT__AVX512SKX_X96, scale) {
2858     TEST_REQUIRES_X86_AVX512SKX;
2859     for (size_t batch_size = 1; batch_size <= 480; batch_size += 95) {
2860       VCvtMicrokernelTester()
2861         .batch_size(batch_size)
2862         .scale(50)
2863         .output_zero_point(100)
2864         .qmin(std::numeric_limits<uint8_t>::min())
2865         .qmax(std::numeric_limits<uint8_t>::max())
2866         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2867     }
2868   }
2869 
TEST(F32_QU8_VCVT__AVX512SKX_X96,output_zero_point)2870   TEST(F32_QU8_VCVT__AVX512SKX_X96, output_zero_point) {
2871     TEST_REQUIRES_X86_AVX512SKX;
2872     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
2873       for (size_t batch_size = 1; batch_size <= 480; batch_size += 95) {
2874         VCvtMicrokernelTester()
2875           .batch_size(batch_size)
2876           .output_zero_point(output_zero_point)
2877           .qmin(std::numeric_limits<uint8_t>::min())
2878           .qmax(std::numeric_limits<uint8_t>::max())
2879           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2880       }
2881     }
2882   }
2883 
TEST(F32_QU8_VCVT__AVX512SKX_X96,saturation)2884   TEST(F32_QU8_VCVT__AVX512SKX_X96, saturation) {
2885     TEST_REQUIRES_X86_AVX512SKX;
2886     for (size_t batch_size = 1; batch_size <= 480; batch_size += 95) {
2887       VCvtMicrokernelTester()
2888         .batch_size(batch_size)
2889         .scale(500)
2890         .output_zero_point(128)
2891         .qmin(std::numeric_limits<uint8_t>::min())
2892         .qmax(std::numeric_limits<uint8_t>::max())
2893         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2894     }
2895   }
2896 
TEST(F32_QU8_VCVT__AVX512SKX_X96,overflow)2897   TEST(F32_QU8_VCVT__AVX512SKX_X96, overflow) {
2898     TEST_REQUIRES_X86_AVX512SKX;
2899     for (size_t batch_size = 1; batch_size <= 480; batch_size += 95) {
2900       VCvtMicrokernelTester()
2901         .batch_size(batch_size)
2902         .scale(4294967296.0f)
2903         .qmin(std::numeric_limits<uint8_t>::min())
2904         .qmax(std::numeric_limits<uint8_t>::max())
2905         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2906     }
2907   }
2908 
TEST(F32_QU8_VCVT__AVX512SKX_X96,qmin)2909   TEST(F32_QU8_VCVT__AVX512SKX_X96, qmin) {
2910     TEST_REQUIRES_X86_AVX512SKX;
2911     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
2912       for (size_t batch_size = 1; batch_size <= 480; batch_size += 95) {
2913         VCvtMicrokernelTester()
2914           .batch_size(batch_size)
2915           .scale(500)
2916           .output_zero_point(128)
2917           .qmin(qmin)
2918           .qmax(std::numeric_limits<uint8_t>::max())
2919           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2920       }
2921     }
2922   }
2923 
TEST(F32_QU8_VCVT__AVX512SKX_X96,qmax)2924   TEST(F32_QU8_VCVT__AVX512SKX_X96, qmax) {
2925     TEST_REQUIRES_X86_AVX512SKX;
2926     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
2927       for (size_t batch_size = 1; batch_size <= 480; batch_size += 95) {
2928         VCvtMicrokernelTester()
2929           .batch_size(batch_size)
2930           .scale(500)
2931           .output_zero_point(128)
2932           .qmin(std::numeric_limits<uint8_t>::min())
2933           .qmax(qmax)
2934           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x96, xnn_init_f32_qu8_cvt_avx512_params);
2935       }
2936     }
2937   }
2938 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2939 
2940 
2941 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_QU8_VCVT__AVX512SKX_X128,batch_eq_128)2942   TEST(F32_QU8_VCVT__AVX512SKX_X128, batch_eq_128) {
2943     TEST_REQUIRES_X86_AVX512SKX;
2944     VCvtMicrokernelTester()
2945       .batch_size(128)
2946       .qmin(std::numeric_limits<uint8_t>::min())
2947       .qmax(std::numeric_limits<uint8_t>::max())
2948       .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
2949   }
2950 
TEST(F32_QU8_VCVT__AVX512SKX_X128,batch_div_128)2951   TEST(F32_QU8_VCVT__AVX512SKX_X128, batch_div_128) {
2952     TEST_REQUIRES_X86_AVX512SKX;
2953     for (size_t batch_size = 256; batch_size < 1280; batch_size += 128) {
2954       VCvtMicrokernelTester()
2955         .batch_size(batch_size)
2956         .qmin(std::numeric_limits<uint8_t>::min())
2957         .qmax(std::numeric_limits<uint8_t>::max())
2958         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
2959     }
2960   }
2961 
TEST(F32_QU8_VCVT__AVX512SKX_X128,batch_lt_128)2962   TEST(F32_QU8_VCVT__AVX512SKX_X128, batch_lt_128) {
2963     TEST_REQUIRES_X86_AVX512SKX;
2964     for (size_t batch_size = 1; batch_size < 128; batch_size++) {
2965       VCvtMicrokernelTester()
2966         .batch_size(batch_size)
2967         .qmin(std::numeric_limits<uint8_t>::min())
2968         .qmax(std::numeric_limits<uint8_t>::max())
2969         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
2970     }
2971   }
2972 
TEST(F32_QU8_VCVT__AVX512SKX_X128,batch_gt_128)2973   TEST(F32_QU8_VCVT__AVX512SKX_X128, batch_gt_128) {
2974     TEST_REQUIRES_X86_AVX512SKX;
2975     for (size_t batch_size = 129; batch_size < 256; batch_size++) {
2976       VCvtMicrokernelTester()
2977         .batch_size(batch_size)
2978         .qmin(std::numeric_limits<uint8_t>::min())
2979         .qmax(std::numeric_limits<uint8_t>::max())
2980         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
2981     }
2982   }
2983 
TEST(F32_QU8_VCVT__AVX512SKX_X128,scale)2984   TEST(F32_QU8_VCVT__AVX512SKX_X128, scale) {
2985     TEST_REQUIRES_X86_AVX512SKX;
2986     for (size_t batch_size = 1; batch_size <= 640; batch_size += 127) {
2987       VCvtMicrokernelTester()
2988         .batch_size(batch_size)
2989         .scale(50)
2990         .output_zero_point(100)
2991         .qmin(std::numeric_limits<uint8_t>::min())
2992         .qmax(std::numeric_limits<uint8_t>::max())
2993         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
2994     }
2995   }
2996 
TEST(F32_QU8_VCVT__AVX512SKX_X128,output_zero_point)2997   TEST(F32_QU8_VCVT__AVX512SKX_X128, output_zero_point) {
2998     TEST_REQUIRES_X86_AVX512SKX;
2999     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3000       for (size_t batch_size = 1; batch_size <= 640; batch_size += 127) {
3001         VCvtMicrokernelTester()
3002           .batch_size(batch_size)
3003           .output_zero_point(output_zero_point)
3004           .qmin(std::numeric_limits<uint8_t>::min())
3005           .qmax(std::numeric_limits<uint8_t>::max())
3006           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
3007       }
3008     }
3009   }
3010 
TEST(F32_QU8_VCVT__AVX512SKX_X128,saturation)3011   TEST(F32_QU8_VCVT__AVX512SKX_X128, saturation) {
3012     TEST_REQUIRES_X86_AVX512SKX;
3013     for (size_t batch_size = 1; batch_size <= 640; batch_size += 127) {
3014       VCvtMicrokernelTester()
3015         .batch_size(batch_size)
3016         .scale(500)
3017         .output_zero_point(128)
3018         .qmin(std::numeric_limits<uint8_t>::min())
3019         .qmax(std::numeric_limits<uint8_t>::max())
3020         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
3021     }
3022   }
3023 
TEST(F32_QU8_VCVT__AVX512SKX_X128,overflow)3024   TEST(F32_QU8_VCVT__AVX512SKX_X128, overflow) {
3025     TEST_REQUIRES_X86_AVX512SKX;
3026     for (size_t batch_size = 1; batch_size <= 640; batch_size += 127) {
3027       VCvtMicrokernelTester()
3028         .batch_size(batch_size)
3029         .scale(4294967296.0f)
3030         .qmin(std::numeric_limits<uint8_t>::min())
3031         .qmax(std::numeric_limits<uint8_t>::max())
3032         .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
3033     }
3034   }
3035 
TEST(F32_QU8_VCVT__AVX512SKX_X128,qmin)3036   TEST(F32_QU8_VCVT__AVX512SKX_X128, qmin) {
3037     TEST_REQUIRES_X86_AVX512SKX;
3038     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3039       for (size_t batch_size = 1; batch_size <= 640; batch_size += 127) {
3040         VCvtMicrokernelTester()
3041           .batch_size(batch_size)
3042           .scale(500)
3043           .output_zero_point(128)
3044           .qmin(qmin)
3045           .qmax(std::numeric_limits<uint8_t>::max())
3046           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
3047       }
3048     }
3049   }
3050 
TEST(F32_QU8_VCVT__AVX512SKX_X128,qmax)3051   TEST(F32_QU8_VCVT__AVX512SKX_X128, qmax) {
3052     TEST_REQUIRES_X86_AVX512SKX;
3053     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3054       for (size_t batch_size = 1; batch_size <= 640; batch_size += 127) {
3055         VCvtMicrokernelTester()
3056           .batch_size(batch_size)
3057           .scale(500)
3058           .output_zero_point(128)
3059           .qmin(std::numeric_limits<uint8_t>::min())
3060           .qmax(qmax)
3061           .Test(xnn_f32_qu8_vcvt_ukernel__avx512skx_x128, xnn_init_f32_qu8_cvt_avx512_params);
3062       }
3063     }
3064   }
3065 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
3066 
3067 
3068 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,batch_eq_8)3069   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, batch_eq_8) {
3070     VCvtMicrokernelTester()
3071       .batch_size(8)
3072       .qmin(std::numeric_limits<uint8_t>::min())
3073       .qmax(std::numeric_limits<uint8_t>::max())
3074       .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3075   }
3076 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,batch_div_8)3077   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, batch_div_8) {
3078     for (size_t batch_size = 16; batch_size < 80; batch_size += 8) {
3079       VCvtMicrokernelTester()
3080         .batch_size(batch_size)
3081         .qmin(std::numeric_limits<uint8_t>::min())
3082         .qmax(std::numeric_limits<uint8_t>::max())
3083         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3084     }
3085   }
3086 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,batch_lt_8)3087   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, batch_lt_8) {
3088     for (size_t batch_size = 1; batch_size < 8; batch_size++) {
3089       VCvtMicrokernelTester()
3090         .batch_size(batch_size)
3091         .qmin(std::numeric_limits<uint8_t>::min())
3092         .qmax(std::numeric_limits<uint8_t>::max())
3093         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3094     }
3095   }
3096 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,batch_gt_8)3097   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, batch_gt_8) {
3098     for (size_t batch_size = 9; batch_size < 16; batch_size++) {
3099       VCvtMicrokernelTester()
3100         .batch_size(batch_size)
3101         .qmin(std::numeric_limits<uint8_t>::min())
3102         .qmax(std::numeric_limits<uint8_t>::max())
3103         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3104     }
3105   }
3106 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,scale)3107   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, scale) {
3108     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3109       VCvtMicrokernelTester()
3110         .batch_size(batch_size)
3111         .scale(50)
3112         .output_zero_point(100)
3113         .qmin(std::numeric_limits<uint8_t>::min())
3114         .qmax(std::numeric_limits<uint8_t>::max())
3115         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3116     }
3117   }
3118 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,output_zero_point)3119   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, output_zero_point) {
3120     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3121       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3122         VCvtMicrokernelTester()
3123           .batch_size(batch_size)
3124           .output_zero_point(output_zero_point)
3125           .qmin(std::numeric_limits<uint8_t>::min())
3126           .qmax(std::numeric_limits<uint8_t>::max())
3127           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3128       }
3129     }
3130   }
3131 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,saturation)3132   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, saturation) {
3133     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3134       VCvtMicrokernelTester()
3135         .batch_size(batch_size)
3136         .scale(500)
3137         .output_zero_point(128)
3138         .qmin(std::numeric_limits<uint8_t>::min())
3139         .qmax(std::numeric_limits<uint8_t>::max())
3140         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3141     }
3142   }
3143 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,overflow)3144   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, overflow) {
3145     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3146       VCvtMicrokernelTester()
3147         .batch_size(batch_size)
3148         .scale(4294967296.0f)
3149         .qmin(std::numeric_limits<uint8_t>::min())
3150         .qmax(std::numeric_limits<uint8_t>::max())
3151         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3152     }
3153   }
3154 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,qmin)3155   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, qmin) {
3156     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3157       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3158         VCvtMicrokernelTester()
3159           .batch_size(batch_size)
3160           .scale(500)
3161           .output_zero_point(128)
3162           .qmin(qmin)
3163           .qmax(std::numeric_limits<uint8_t>::max())
3164           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3165       }
3166     }
3167   }
3168 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8,qmax)3169   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X8, qmax) {
3170     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3171       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3172         VCvtMicrokernelTester()
3173           .batch_size(batch_size)
3174           .scale(500)
3175           .output_zero_point(128)
3176           .qmin(std::numeric_limits<uint8_t>::min())
3177           .qmax(qmax)
3178           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x8, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3179       }
3180     }
3181   }
3182 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
3183 
3184 
3185 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,batch_eq_16)3186   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, batch_eq_16) {
3187     VCvtMicrokernelTester()
3188       .batch_size(16)
3189       .qmin(std::numeric_limits<uint8_t>::min())
3190       .qmax(std::numeric_limits<uint8_t>::max())
3191       .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3192   }
3193 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,batch_div_16)3194   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, batch_div_16) {
3195     for (size_t batch_size = 32; batch_size < 160; batch_size += 16) {
3196       VCvtMicrokernelTester()
3197         .batch_size(batch_size)
3198         .qmin(std::numeric_limits<uint8_t>::min())
3199         .qmax(std::numeric_limits<uint8_t>::max())
3200         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3201     }
3202   }
3203 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,batch_lt_16)3204   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, batch_lt_16) {
3205     for (size_t batch_size = 1; batch_size < 16; batch_size++) {
3206       VCvtMicrokernelTester()
3207         .batch_size(batch_size)
3208         .qmin(std::numeric_limits<uint8_t>::min())
3209         .qmax(std::numeric_limits<uint8_t>::max())
3210         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3211     }
3212   }
3213 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,batch_gt_16)3214   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, batch_gt_16) {
3215     for (size_t batch_size = 17; batch_size < 32; batch_size++) {
3216       VCvtMicrokernelTester()
3217         .batch_size(batch_size)
3218         .qmin(std::numeric_limits<uint8_t>::min())
3219         .qmax(std::numeric_limits<uint8_t>::max())
3220         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3221     }
3222   }
3223 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,scale)3224   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, scale) {
3225     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3226       VCvtMicrokernelTester()
3227         .batch_size(batch_size)
3228         .scale(50)
3229         .output_zero_point(100)
3230         .qmin(std::numeric_limits<uint8_t>::min())
3231         .qmax(std::numeric_limits<uint8_t>::max())
3232         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3233     }
3234   }
3235 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,output_zero_point)3236   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, output_zero_point) {
3237     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3238       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3239         VCvtMicrokernelTester()
3240           .batch_size(batch_size)
3241           .output_zero_point(output_zero_point)
3242           .qmin(std::numeric_limits<uint8_t>::min())
3243           .qmax(std::numeric_limits<uint8_t>::max())
3244           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3245       }
3246     }
3247   }
3248 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,saturation)3249   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, saturation) {
3250     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3251       VCvtMicrokernelTester()
3252         .batch_size(batch_size)
3253         .scale(500)
3254         .output_zero_point(128)
3255         .qmin(std::numeric_limits<uint8_t>::min())
3256         .qmax(std::numeric_limits<uint8_t>::max())
3257         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3258     }
3259   }
3260 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,overflow)3261   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, overflow) {
3262     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3263       VCvtMicrokernelTester()
3264         .batch_size(batch_size)
3265         .scale(4294967296.0f)
3266         .qmin(std::numeric_limits<uint8_t>::min())
3267         .qmax(std::numeric_limits<uint8_t>::max())
3268         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3269     }
3270   }
3271 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,qmin)3272   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, qmin) {
3273     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3274       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3275         VCvtMicrokernelTester()
3276           .batch_size(batch_size)
3277           .scale(500)
3278           .output_zero_point(128)
3279           .qmin(qmin)
3280           .qmax(std::numeric_limits<uint8_t>::max())
3281           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3282       }
3283     }
3284   }
3285 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16,qmax)3286   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X16, qmax) {
3287     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3288       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3289         VCvtMicrokernelTester()
3290           .batch_size(batch_size)
3291           .scale(500)
3292           .output_zero_point(128)
3293           .qmin(std::numeric_limits<uint8_t>::min())
3294           .qmax(qmax)
3295           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x16, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3296       }
3297     }
3298   }
3299 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
3300 
3301 
3302 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,batch_eq_24)3303   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, batch_eq_24) {
3304     VCvtMicrokernelTester()
3305       .batch_size(24)
3306       .qmin(std::numeric_limits<uint8_t>::min())
3307       .qmax(std::numeric_limits<uint8_t>::max())
3308       .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3309   }
3310 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,batch_div_24)3311   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, batch_div_24) {
3312     for (size_t batch_size = 48; batch_size < 240; batch_size += 24) {
3313       VCvtMicrokernelTester()
3314         .batch_size(batch_size)
3315         .qmin(std::numeric_limits<uint8_t>::min())
3316         .qmax(std::numeric_limits<uint8_t>::max())
3317         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3318     }
3319   }
3320 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,batch_lt_24)3321   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, batch_lt_24) {
3322     for (size_t batch_size = 1; batch_size < 24; batch_size++) {
3323       VCvtMicrokernelTester()
3324         .batch_size(batch_size)
3325         .qmin(std::numeric_limits<uint8_t>::min())
3326         .qmax(std::numeric_limits<uint8_t>::max())
3327         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3328     }
3329   }
3330 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,batch_gt_24)3331   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, batch_gt_24) {
3332     for (size_t batch_size = 25; batch_size < 48; batch_size++) {
3333       VCvtMicrokernelTester()
3334         .batch_size(batch_size)
3335         .qmin(std::numeric_limits<uint8_t>::min())
3336         .qmax(std::numeric_limits<uint8_t>::max())
3337         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3338     }
3339   }
3340 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,scale)3341   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, scale) {
3342     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3343       VCvtMicrokernelTester()
3344         .batch_size(batch_size)
3345         .scale(50)
3346         .output_zero_point(100)
3347         .qmin(std::numeric_limits<uint8_t>::min())
3348         .qmax(std::numeric_limits<uint8_t>::max())
3349         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3350     }
3351   }
3352 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,output_zero_point)3353   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, output_zero_point) {
3354     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3355       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3356         VCvtMicrokernelTester()
3357           .batch_size(batch_size)
3358           .output_zero_point(output_zero_point)
3359           .qmin(std::numeric_limits<uint8_t>::min())
3360           .qmax(std::numeric_limits<uint8_t>::max())
3361           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3362       }
3363     }
3364   }
3365 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,saturation)3366   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, saturation) {
3367     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3368       VCvtMicrokernelTester()
3369         .batch_size(batch_size)
3370         .scale(500)
3371         .output_zero_point(128)
3372         .qmin(std::numeric_limits<uint8_t>::min())
3373         .qmax(std::numeric_limits<uint8_t>::max())
3374         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3375     }
3376   }
3377 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,overflow)3378   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, overflow) {
3379     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3380       VCvtMicrokernelTester()
3381         .batch_size(batch_size)
3382         .scale(4294967296.0f)
3383         .qmin(std::numeric_limits<uint8_t>::min())
3384         .qmax(std::numeric_limits<uint8_t>::max())
3385         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3386     }
3387   }
3388 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,qmin)3389   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, qmin) {
3390     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3391       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3392         VCvtMicrokernelTester()
3393           .batch_size(batch_size)
3394           .scale(500)
3395           .output_zero_point(128)
3396           .qmin(qmin)
3397           .qmax(std::numeric_limits<uint8_t>::max())
3398           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3399       }
3400     }
3401   }
3402 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24,qmax)3403   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X24, qmax) {
3404     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3405       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3406         VCvtMicrokernelTester()
3407           .batch_size(batch_size)
3408           .scale(500)
3409           .output_zero_point(128)
3410           .qmin(std::numeric_limits<uint8_t>::min())
3411           .qmax(qmax)
3412           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x24, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3413       }
3414     }
3415   }
3416 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
3417 
3418 
3419 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,batch_eq_32)3420   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, batch_eq_32) {
3421     VCvtMicrokernelTester()
3422       .batch_size(32)
3423       .qmin(std::numeric_limits<uint8_t>::min())
3424       .qmax(std::numeric_limits<uint8_t>::max())
3425       .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3426   }
3427 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,batch_div_32)3428   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, batch_div_32) {
3429     for (size_t batch_size = 64; batch_size < 320; batch_size += 32) {
3430       VCvtMicrokernelTester()
3431         .batch_size(batch_size)
3432         .qmin(std::numeric_limits<uint8_t>::min())
3433         .qmax(std::numeric_limits<uint8_t>::max())
3434         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3435     }
3436   }
3437 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,batch_lt_32)3438   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, batch_lt_32) {
3439     for (size_t batch_size = 1; batch_size < 32; batch_size++) {
3440       VCvtMicrokernelTester()
3441         .batch_size(batch_size)
3442         .qmin(std::numeric_limits<uint8_t>::min())
3443         .qmax(std::numeric_limits<uint8_t>::max())
3444         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3445     }
3446   }
3447 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,batch_gt_32)3448   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, batch_gt_32) {
3449     for (size_t batch_size = 33; batch_size < 64; batch_size++) {
3450       VCvtMicrokernelTester()
3451         .batch_size(batch_size)
3452         .qmin(std::numeric_limits<uint8_t>::min())
3453         .qmax(std::numeric_limits<uint8_t>::max())
3454         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3455     }
3456   }
3457 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,scale)3458   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, scale) {
3459     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3460       VCvtMicrokernelTester()
3461         .batch_size(batch_size)
3462         .scale(50)
3463         .output_zero_point(100)
3464         .qmin(std::numeric_limits<uint8_t>::min())
3465         .qmax(std::numeric_limits<uint8_t>::max())
3466         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3467     }
3468   }
3469 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,output_zero_point)3470   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, output_zero_point) {
3471     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3472       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3473         VCvtMicrokernelTester()
3474           .batch_size(batch_size)
3475           .output_zero_point(output_zero_point)
3476           .qmin(std::numeric_limits<uint8_t>::min())
3477           .qmax(std::numeric_limits<uint8_t>::max())
3478           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3479       }
3480     }
3481   }
3482 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,saturation)3483   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, saturation) {
3484     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3485       VCvtMicrokernelTester()
3486         .batch_size(batch_size)
3487         .scale(500)
3488         .output_zero_point(128)
3489         .qmin(std::numeric_limits<uint8_t>::min())
3490         .qmax(std::numeric_limits<uint8_t>::max())
3491         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3492     }
3493   }
3494 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,overflow)3495   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, overflow) {
3496     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3497       VCvtMicrokernelTester()
3498         .batch_size(batch_size)
3499         .scale(4294967296.0f)
3500         .qmin(std::numeric_limits<uint8_t>::min())
3501         .qmax(std::numeric_limits<uint8_t>::max())
3502         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3503     }
3504   }
3505 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,qmin)3506   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, qmin) {
3507     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3508       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3509         VCvtMicrokernelTester()
3510           .batch_size(batch_size)
3511           .scale(500)
3512           .output_zero_point(128)
3513           .qmin(qmin)
3514           .qmax(std::numeric_limits<uint8_t>::max())
3515           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3516       }
3517     }
3518   }
3519 
TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32,qmax)3520   TEST(F32_QU8_VCVT__WASMSIMD_CVT_X32, qmax) {
3521     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3522       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3523         VCvtMicrokernelTester()
3524           .batch_size(batch_size)
3525           .scale(500)
3526           .output_zero_point(128)
3527           .qmin(std::numeric_limits<uint8_t>::min())
3528           .qmax(qmax)
3529           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_cvt_x32, xnn_init_f32_qu8_cvt_wasmsimd_cvt_params);
3530       }
3531     }
3532   }
3533 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
3534 
3535 
3536 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,batch_eq_8)3537   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, batch_eq_8) {
3538     VCvtMicrokernelTester()
3539       .batch_size(8)
3540       .qmin(std::numeric_limits<uint8_t>::min())
3541       .qmax(std::numeric_limits<uint8_t>::max())
3542       .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3543   }
3544 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,batch_div_8)3545   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, batch_div_8) {
3546     for (size_t batch_size = 16; batch_size < 80; batch_size += 8) {
3547       VCvtMicrokernelTester()
3548         .batch_size(batch_size)
3549         .qmin(std::numeric_limits<uint8_t>::min())
3550         .qmax(std::numeric_limits<uint8_t>::max())
3551         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3552     }
3553   }
3554 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,batch_lt_8)3555   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, batch_lt_8) {
3556     for (size_t batch_size = 1; batch_size < 8; batch_size++) {
3557       VCvtMicrokernelTester()
3558         .batch_size(batch_size)
3559         .qmin(std::numeric_limits<uint8_t>::min())
3560         .qmax(std::numeric_limits<uint8_t>::max())
3561         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3562     }
3563   }
3564 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,batch_gt_8)3565   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, batch_gt_8) {
3566     for (size_t batch_size = 9; batch_size < 16; batch_size++) {
3567       VCvtMicrokernelTester()
3568         .batch_size(batch_size)
3569         .qmin(std::numeric_limits<uint8_t>::min())
3570         .qmax(std::numeric_limits<uint8_t>::max())
3571         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3572     }
3573   }
3574 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,scale)3575   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, scale) {
3576     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3577       VCvtMicrokernelTester()
3578         .batch_size(batch_size)
3579         .scale(50)
3580         .output_zero_point(100)
3581         .qmin(std::numeric_limits<uint8_t>::min())
3582         .qmax(std::numeric_limits<uint8_t>::max())
3583         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3584     }
3585   }
3586 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,output_zero_point)3587   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, output_zero_point) {
3588     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3589       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3590         VCvtMicrokernelTester()
3591           .batch_size(batch_size)
3592           .output_zero_point(output_zero_point)
3593           .qmin(std::numeric_limits<uint8_t>::min())
3594           .qmax(std::numeric_limits<uint8_t>::max())
3595           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3596       }
3597     }
3598   }
3599 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,saturation)3600   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, saturation) {
3601     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3602       VCvtMicrokernelTester()
3603         .batch_size(batch_size)
3604         .scale(500)
3605         .output_zero_point(128)
3606         .qmin(std::numeric_limits<uint8_t>::min())
3607         .qmax(std::numeric_limits<uint8_t>::max())
3608         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3609     }
3610   }
3611 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,overflow)3612   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, overflow) {
3613     for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3614       VCvtMicrokernelTester()
3615         .batch_size(batch_size)
3616         .scale(4294967296.0f)
3617         .qmin(std::numeric_limits<uint8_t>::min())
3618         .qmax(std::numeric_limits<uint8_t>::max())
3619         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3620     }
3621   }
3622 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,qmin)3623   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, qmin) {
3624     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3625       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3626         VCvtMicrokernelTester()
3627           .batch_size(batch_size)
3628           .scale(500)
3629           .output_zero_point(128)
3630           .qmin(qmin)
3631           .qmax(std::numeric_limits<uint8_t>::max())
3632           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3633       }
3634     }
3635   }
3636 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8,qmax)3637   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X8, qmax) {
3638     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3639       for (size_t batch_size = 1; batch_size <= 40; batch_size += 7) {
3640         VCvtMicrokernelTester()
3641           .batch_size(batch_size)
3642           .scale(500)
3643           .output_zero_point(128)
3644           .qmin(std::numeric_limits<uint8_t>::min())
3645           .qmax(qmax)
3646           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x8, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3647       }
3648     }
3649   }
3650 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
3651 
3652 
3653 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,batch_eq_16)3654   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, batch_eq_16) {
3655     VCvtMicrokernelTester()
3656       .batch_size(16)
3657       .qmin(std::numeric_limits<uint8_t>::min())
3658       .qmax(std::numeric_limits<uint8_t>::max())
3659       .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3660   }
3661 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,batch_div_16)3662   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, batch_div_16) {
3663     for (size_t batch_size = 32; batch_size < 160; batch_size += 16) {
3664       VCvtMicrokernelTester()
3665         .batch_size(batch_size)
3666         .qmin(std::numeric_limits<uint8_t>::min())
3667         .qmax(std::numeric_limits<uint8_t>::max())
3668         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3669     }
3670   }
3671 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,batch_lt_16)3672   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, batch_lt_16) {
3673     for (size_t batch_size = 1; batch_size < 16; batch_size++) {
3674       VCvtMicrokernelTester()
3675         .batch_size(batch_size)
3676         .qmin(std::numeric_limits<uint8_t>::min())
3677         .qmax(std::numeric_limits<uint8_t>::max())
3678         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3679     }
3680   }
3681 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,batch_gt_16)3682   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, batch_gt_16) {
3683     for (size_t batch_size = 17; batch_size < 32; batch_size++) {
3684       VCvtMicrokernelTester()
3685         .batch_size(batch_size)
3686         .qmin(std::numeric_limits<uint8_t>::min())
3687         .qmax(std::numeric_limits<uint8_t>::max())
3688         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3689     }
3690   }
3691 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,scale)3692   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, scale) {
3693     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3694       VCvtMicrokernelTester()
3695         .batch_size(batch_size)
3696         .scale(50)
3697         .output_zero_point(100)
3698         .qmin(std::numeric_limits<uint8_t>::min())
3699         .qmax(std::numeric_limits<uint8_t>::max())
3700         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3701     }
3702   }
3703 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,output_zero_point)3704   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, output_zero_point) {
3705     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3706       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3707         VCvtMicrokernelTester()
3708           .batch_size(batch_size)
3709           .output_zero_point(output_zero_point)
3710           .qmin(std::numeric_limits<uint8_t>::min())
3711           .qmax(std::numeric_limits<uint8_t>::max())
3712           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3713       }
3714     }
3715   }
3716 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,saturation)3717   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, saturation) {
3718     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3719       VCvtMicrokernelTester()
3720         .batch_size(batch_size)
3721         .scale(500)
3722         .output_zero_point(128)
3723         .qmin(std::numeric_limits<uint8_t>::min())
3724         .qmax(std::numeric_limits<uint8_t>::max())
3725         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3726     }
3727   }
3728 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,overflow)3729   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, overflow) {
3730     for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3731       VCvtMicrokernelTester()
3732         .batch_size(batch_size)
3733         .scale(4294967296.0f)
3734         .qmin(std::numeric_limits<uint8_t>::min())
3735         .qmax(std::numeric_limits<uint8_t>::max())
3736         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3737     }
3738   }
3739 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,qmin)3740   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, qmin) {
3741     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3742       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3743         VCvtMicrokernelTester()
3744           .batch_size(batch_size)
3745           .scale(500)
3746           .output_zero_point(128)
3747           .qmin(qmin)
3748           .qmax(std::numeric_limits<uint8_t>::max())
3749           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3750       }
3751     }
3752   }
3753 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16,qmax)3754   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X16, qmax) {
3755     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3756       for (size_t batch_size = 1; batch_size <= 80; batch_size += 15) {
3757         VCvtMicrokernelTester()
3758           .batch_size(batch_size)
3759           .scale(500)
3760           .output_zero_point(128)
3761           .qmin(std::numeric_limits<uint8_t>::min())
3762           .qmax(qmax)
3763           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x16, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3764       }
3765     }
3766   }
3767 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
3768 
3769 
3770 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,batch_eq_24)3771   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, batch_eq_24) {
3772     VCvtMicrokernelTester()
3773       .batch_size(24)
3774       .qmin(std::numeric_limits<uint8_t>::min())
3775       .qmax(std::numeric_limits<uint8_t>::max())
3776       .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3777   }
3778 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,batch_div_24)3779   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, batch_div_24) {
3780     for (size_t batch_size = 48; batch_size < 240; batch_size += 24) {
3781       VCvtMicrokernelTester()
3782         .batch_size(batch_size)
3783         .qmin(std::numeric_limits<uint8_t>::min())
3784         .qmax(std::numeric_limits<uint8_t>::max())
3785         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3786     }
3787   }
3788 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,batch_lt_24)3789   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, batch_lt_24) {
3790     for (size_t batch_size = 1; batch_size < 24; batch_size++) {
3791       VCvtMicrokernelTester()
3792         .batch_size(batch_size)
3793         .qmin(std::numeric_limits<uint8_t>::min())
3794         .qmax(std::numeric_limits<uint8_t>::max())
3795         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3796     }
3797   }
3798 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,batch_gt_24)3799   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, batch_gt_24) {
3800     for (size_t batch_size = 25; batch_size < 48; batch_size++) {
3801       VCvtMicrokernelTester()
3802         .batch_size(batch_size)
3803         .qmin(std::numeric_limits<uint8_t>::min())
3804         .qmax(std::numeric_limits<uint8_t>::max())
3805         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3806     }
3807   }
3808 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,scale)3809   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, scale) {
3810     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3811       VCvtMicrokernelTester()
3812         .batch_size(batch_size)
3813         .scale(50)
3814         .output_zero_point(100)
3815         .qmin(std::numeric_limits<uint8_t>::min())
3816         .qmax(std::numeric_limits<uint8_t>::max())
3817         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3818     }
3819   }
3820 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,output_zero_point)3821   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, output_zero_point) {
3822     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3823       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3824         VCvtMicrokernelTester()
3825           .batch_size(batch_size)
3826           .output_zero_point(output_zero_point)
3827           .qmin(std::numeric_limits<uint8_t>::min())
3828           .qmax(std::numeric_limits<uint8_t>::max())
3829           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3830       }
3831     }
3832   }
3833 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,saturation)3834   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, saturation) {
3835     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3836       VCvtMicrokernelTester()
3837         .batch_size(batch_size)
3838         .scale(500)
3839         .output_zero_point(128)
3840         .qmin(std::numeric_limits<uint8_t>::min())
3841         .qmax(std::numeric_limits<uint8_t>::max())
3842         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3843     }
3844   }
3845 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,overflow)3846   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, overflow) {
3847     for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3848       VCvtMicrokernelTester()
3849         .batch_size(batch_size)
3850         .scale(4294967296.0f)
3851         .qmin(std::numeric_limits<uint8_t>::min())
3852         .qmax(std::numeric_limits<uint8_t>::max())
3853         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3854     }
3855   }
3856 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,qmin)3857   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, qmin) {
3858     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3859       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3860         VCvtMicrokernelTester()
3861           .batch_size(batch_size)
3862           .scale(500)
3863           .output_zero_point(128)
3864           .qmin(qmin)
3865           .qmax(std::numeric_limits<uint8_t>::max())
3866           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3867       }
3868     }
3869   }
3870 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24,qmax)3871   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X24, qmax) {
3872     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3873       for (size_t batch_size = 1; batch_size <= 120; batch_size += 23) {
3874         VCvtMicrokernelTester()
3875           .batch_size(batch_size)
3876           .scale(500)
3877           .output_zero_point(128)
3878           .qmin(std::numeric_limits<uint8_t>::min())
3879           .qmax(qmax)
3880           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x24, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3881       }
3882     }
3883   }
3884 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
3885 
3886 
3887 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,batch_eq_32)3888   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, batch_eq_32) {
3889     VCvtMicrokernelTester()
3890       .batch_size(32)
3891       .qmin(std::numeric_limits<uint8_t>::min())
3892       .qmax(std::numeric_limits<uint8_t>::max())
3893       .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3894   }
3895 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,batch_div_32)3896   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, batch_div_32) {
3897     for (size_t batch_size = 64; batch_size < 320; batch_size += 32) {
3898       VCvtMicrokernelTester()
3899         .batch_size(batch_size)
3900         .qmin(std::numeric_limits<uint8_t>::min())
3901         .qmax(std::numeric_limits<uint8_t>::max())
3902         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3903     }
3904   }
3905 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,batch_lt_32)3906   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, batch_lt_32) {
3907     for (size_t batch_size = 1; batch_size < 32; batch_size++) {
3908       VCvtMicrokernelTester()
3909         .batch_size(batch_size)
3910         .qmin(std::numeric_limits<uint8_t>::min())
3911         .qmax(std::numeric_limits<uint8_t>::max())
3912         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3913     }
3914   }
3915 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,batch_gt_32)3916   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, batch_gt_32) {
3917     for (size_t batch_size = 33; batch_size < 64; batch_size++) {
3918       VCvtMicrokernelTester()
3919         .batch_size(batch_size)
3920         .qmin(std::numeric_limits<uint8_t>::min())
3921         .qmax(std::numeric_limits<uint8_t>::max())
3922         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3923     }
3924   }
3925 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,scale)3926   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, scale) {
3927     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3928       VCvtMicrokernelTester()
3929         .batch_size(batch_size)
3930         .scale(50)
3931         .output_zero_point(100)
3932         .qmin(std::numeric_limits<uint8_t>::min())
3933         .qmax(std::numeric_limits<uint8_t>::max())
3934         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3935     }
3936   }
3937 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,output_zero_point)3938   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, output_zero_point) {
3939     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
3940       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3941         VCvtMicrokernelTester()
3942           .batch_size(batch_size)
3943           .output_zero_point(output_zero_point)
3944           .qmin(std::numeric_limits<uint8_t>::min())
3945           .qmax(std::numeric_limits<uint8_t>::max())
3946           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3947       }
3948     }
3949   }
3950 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,saturation)3951   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, saturation) {
3952     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3953       VCvtMicrokernelTester()
3954         .batch_size(batch_size)
3955         .scale(500)
3956         .output_zero_point(128)
3957         .qmin(std::numeric_limits<uint8_t>::min())
3958         .qmax(std::numeric_limits<uint8_t>::max())
3959         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3960     }
3961   }
3962 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,overflow)3963   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, overflow) {
3964     for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3965       VCvtMicrokernelTester()
3966         .batch_size(batch_size)
3967         .scale(4294967296.0f)
3968         .qmin(std::numeric_limits<uint8_t>::min())
3969         .qmax(std::numeric_limits<uint8_t>::max())
3970         .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3971     }
3972   }
3973 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,qmin)3974   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, qmin) {
3975     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
3976       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3977         VCvtMicrokernelTester()
3978           .batch_size(batch_size)
3979           .scale(500)
3980           .output_zero_point(128)
3981           .qmin(qmin)
3982           .qmax(std::numeric_limits<uint8_t>::max())
3983           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3984       }
3985     }
3986   }
3987 
TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32,qmax)3988   TEST(F32_QU8_VCVT__WASMSIMD_MAGIC_X32, qmax) {
3989     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
3990       for (size_t batch_size = 1; batch_size <= 160; batch_size += 31) {
3991         VCvtMicrokernelTester()
3992           .batch_size(batch_size)
3993           .scale(500)
3994           .output_zero_point(128)
3995           .qmin(std::numeric_limits<uint8_t>::min())
3996           .qmax(qmax)
3997           .Test(xnn_f32_qu8_vcvt_ukernel__wasmsimd_magic_x32, xnn_init_f32_qu8_cvt_wasmsimd_magic_params);
3998       }
3999     }
4000   }
4001 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
4002 
4003 
4004 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASM_FMAGIC_X1,batch_eq_1)4005   TEST(F32_QU8_VCVT__WASM_FMAGIC_X1, batch_eq_1) {
4006     VCvtMicrokernelTester()
4007       .batch_size(1)
4008       .qmin(std::numeric_limits<uint8_t>::min())
4009       .qmax(std::numeric_limits<uint8_t>::max())
4010       .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4011   }
4012 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X1,batch_gt_1)4013   TEST(F32_QU8_VCVT__WASM_FMAGIC_X1, batch_gt_1) {
4014     for (size_t batch_size = 2; batch_size < 10; batch_size++) {
4015       VCvtMicrokernelTester()
4016         .batch_size(batch_size)
4017         .qmin(std::numeric_limits<uint8_t>::min())
4018         .qmax(std::numeric_limits<uint8_t>::max())
4019         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4020     }
4021   }
4022 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X1,scale)4023   TEST(F32_QU8_VCVT__WASM_FMAGIC_X1, scale) {
4024     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4025       VCvtMicrokernelTester()
4026         .batch_size(batch_size)
4027         .scale(50)
4028         .output_zero_point(100)
4029         .qmin(std::numeric_limits<uint8_t>::min())
4030         .qmax(std::numeric_limits<uint8_t>::max())
4031         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4032     }
4033   }
4034 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X1,output_zero_point)4035   TEST(F32_QU8_VCVT__WASM_FMAGIC_X1, output_zero_point) {
4036     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4037       for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4038         VCvtMicrokernelTester()
4039           .batch_size(batch_size)
4040           .output_zero_point(output_zero_point)
4041           .qmin(std::numeric_limits<uint8_t>::min())
4042           .qmax(std::numeric_limits<uint8_t>::max())
4043           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4044       }
4045     }
4046   }
4047 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X1,saturation)4048   TEST(F32_QU8_VCVT__WASM_FMAGIC_X1, saturation) {
4049     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4050       VCvtMicrokernelTester()
4051         .batch_size(batch_size)
4052         .scale(500)
4053         .output_zero_point(128)
4054         .qmin(std::numeric_limits<uint8_t>::min())
4055         .qmax(std::numeric_limits<uint8_t>::max())
4056         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4057     }
4058   }
4059 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X1,overflow)4060   TEST(F32_QU8_VCVT__WASM_FMAGIC_X1, overflow) {
4061     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4062       VCvtMicrokernelTester()
4063         .batch_size(batch_size)
4064         .scale(4294967296.0f)
4065         .qmin(std::numeric_limits<uint8_t>::min())
4066         .qmax(std::numeric_limits<uint8_t>::max())
4067         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4068     }
4069   }
4070 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X1,qmin)4071   TEST(F32_QU8_VCVT__WASM_FMAGIC_X1, qmin) {
4072     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4073       for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4074         VCvtMicrokernelTester()
4075           .batch_size(batch_size)
4076           .scale(500)
4077           .output_zero_point(128)
4078           .qmin(qmin)
4079           .qmax(std::numeric_limits<uint8_t>::max())
4080           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4081       }
4082     }
4083   }
4084 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X1,qmax)4085   TEST(F32_QU8_VCVT__WASM_FMAGIC_X1, qmax) {
4086     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4087       for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4088         VCvtMicrokernelTester()
4089           .batch_size(batch_size)
4090           .scale(500)
4091           .output_zero_point(128)
4092           .qmin(std::numeric_limits<uint8_t>::min())
4093           .qmax(qmax)
4094           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4095       }
4096     }
4097   }
4098 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
4099 
4100 
4101 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,batch_eq_2)4102   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, batch_eq_2) {
4103     VCvtMicrokernelTester()
4104       .batch_size(2)
4105       .qmin(std::numeric_limits<uint8_t>::min())
4106       .qmax(std::numeric_limits<uint8_t>::max())
4107       .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4108   }
4109 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,batch_div_2)4110   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, batch_div_2) {
4111     for (size_t batch_size = 4; batch_size < 20; batch_size += 2) {
4112       VCvtMicrokernelTester()
4113         .batch_size(batch_size)
4114         .qmin(std::numeric_limits<uint8_t>::min())
4115         .qmax(std::numeric_limits<uint8_t>::max())
4116         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4117     }
4118   }
4119 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,batch_lt_2)4120   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, batch_lt_2) {
4121     for (size_t batch_size = 1; batch_size < 2; batch_size++) {
4122       VCvtMicrokernelTester()
4123         .batch_size(batch_size)
4124         .qmin(std::numeric_limits<uint8_t>::min())
4125         .qmax(std::numeric_limits<uint8_t>::max())
4126         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4127     }
4128   }
4129 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,batch_gt_2)4130   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, batch_gt_2) {
4131     for (size_t batch_size = 3; batch_size < 4; batch_size++) {
4132       VCvtMicrokernelTester()
4133         .batch_size(batch_size)
4134         .qmin(std::numeric_limits<uint8_t>::min())
4135         .qmax(std::numeric_limits<uint8_t>::max())
4136         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4137     }
4138   }
4139 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,scale)4140   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, scale) {
4141     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4142       VCvtMicrokernelTester()
4143         .batch_size(batch_size)
4144         .scale(50)
4145         .output_zero_point(100)
4146         .qmin(std::numeric_limits<uint8_t>::min())
4147         .qmax(std::numeric_limits<uint8_t>::max())
4148         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4149     }
4150   }
4151 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,output_zero_point)4152   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, output_zero_point) {
4153     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4154       for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4155         VCvtMicrokernelTester()
4156           .batch_size(batch_size)
4157           .output_zero_point(output_zero_point)
4158           .qmin(std::numeric_limits<uint8_t>::min())
4159           .qmax(std::numeric_limits<uint8_t>::max())
4160           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4161       }
4162     }
4163   }
4164 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,saturation)4165   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, saturation) {
4166     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4167       VCvtMicrokernelTester()
4168         .batch_size(batch_size)
4169         .scale(500)
4170         .output_zero_point(128)
4171         .qmin(std::numeric_limits<uint8_t>::min())
4172         .qmax(std::numeric_limits<uint8_t>::max())
4173         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4174     }
4175   }
4176 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,overflow)4177   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, overflow) {
4178     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4179       VCvtMicrokernelTester()
4180         .batch_size(batch_size)
4181         .scale(4294967296.0f)
4182         .qmin(std::numeric_limits<uint8_t>::min())
4183         .qmax(std::numeric_limits<uint8_t>::max())
4184         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4185     }
4186   }
4187 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,qmin)4188   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, qmin) {
4189     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4190       for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4191         VCvtMicrokernelTester()
4192           .batch_size(batch_size)
4193           .scale(500)
4194           .output_zero_point(128)
4195           .qmin(qmin)
4196           .qmax(std::numeric_limits<uint8_t>::max())
4197           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4198       }
4199     }
4200   }
4201 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X2,qmax)4202   TEST(F32_QU8_VCVT__WASM_FMAGIC_X2, qmax) {
4203     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4204       for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4205         VCvtMicrokernelTester()
4206           .batch_size(batch_size)
4207           .scale(500)
4208           .output_zero_point(128)
4209           .qmin(std::numeric_limits<uint8_t>::min())
4210           .qmax(qmax)
4211           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4212       }
4213     }
4214   }
4215 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
4216 
4217 
4218 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,batch_eq_3)4219   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, batch_eq_3) {
4220     VCvtMicrokernelTester()
4221       .batch_size(3)
4222       .qmin(std::numeric_limits<uint8_t>::min())
4223       .qmax(std::numeric_limits<uint8_t>::max())
4224       .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4225   }
4226 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,batch_div_3)4227   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, batch_div_3) {
4228     for (size_t batch_size = 6; batch_size < 30; batch_size += 3) {
4229       VCvtMicrokernelTester()
4230         .batch_size(batch_size)
4231         .qmin(std::numeric_limits<uint8_t>::min())
4232         .qmax(std::numeric_limits<uint8_t>::max())
4233         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4234     }
4235   }
4236 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,batch_lt_3)4237   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, batch_lt_3) {
4238     for (size_t batch_size = 1; batch_size < 3; batch_size++) {
4239       VCvtMicrokernelTester()
4240         .batch_size(batch_size)
4241         .qmin(std::numeric_limits<uint8_t>::min())
4242         .qmax(std::numeric_limits<uint8_t>::max())
4243         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4244     }
4245   }
4246 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,batch_gt_3)4247   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, batch_gt_3) {
4248     for (size_t batch_size = 4; batch_size < 6; batch_size++) {
4249       VCvtMicrokernelTester()
4250         .batch_size(batch_size)
4251         .qmin(std::numeric_limits<uint8_t>::min())
4252         .qmax(std::numeric_limits<uint8_t>::max())
4253         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4254     }
4255   }
4256 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,scale)4257   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, scale) {
4258     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4259       VCvtMicrokernelTester()
4260         .batch_size(batch_size)
4261         .scale(50)
4262         .output_zero_point(100)
4263         .qmin(std::numeric_limits<uint8_t>::min())
4264         .qmax(std::numeric_limits<uint8_t>::max())
4265         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4266     }
4267   }
4268 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,output_zero_point)4269   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, output_zero_point) {
4270     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4271       for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4272         VCvtMicrokernelTester()
4273           .batch_size(batch_size)
4274           .output_zero_point(output_zero_point)
4275           .qmin(std::numeric_limits<uint8_t>::min())
4276           .qmax(std::numeric_limits<uint8_t>::max())
4277           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4278       }
4279     }
4280   }
4281 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,saturation)4282   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, saturation) {
4283     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4284       VCvtMicrokernelTester()
4285         .batch_size(batch_size)
4286         .scale(500)
4287         .output_zero_point(128)
4288         .qmin(std::numeric_limits<uint8_t>::min())
4289         .qmax(std::numeric_limits<uint8_t>::max())
4290         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4291     }
4292   }
4293 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,overflow)4294   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, overflow) {
4295     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4296       VCvtMicrokernelTester()
4297         .batch_size(batch_size)
4298         .scale(4294967296.0f)
4299         .qmin(std::numeric_limits<uint8_t>::min())
4300         .qmax(std::numeric_limits<uint8_t>::max())
4301         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4302     }
4303   }
4304 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,qmin)4305   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, qmin) {
4306     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4307       for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4308         VCvtMicrokernelTester()
4309           .batch_size(batch_size)
4310           .scale(500)
4311           .output_zero_point(128)
4312           .qmin(qmin)
4313           .qmax(std::numeric_limits<uint8_t>::max())
4314           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4315       }
4316     }
4317   }
4318 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X3,qmax)4319   TEST(F32_QU8_VCVT__WASM_FMAGIC_X3, qmax) {
4320     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4321       for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4322         VCvtMicrokernelTester()
4323           .batch_size(batch_size)
4324           .scale(500)
4325           .output_zero_point(128)
4326           .qmin(std::numeric_limits<uint8_t>::min())
4327           .qmax(qmax)
4328           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4329       }
4330     }
4331   }
4332 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
4333 
4334 
4335 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,batch_eq_4)4336   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, batch_eq_4) {
4337     VCvtMicrokernelTester()
4338       .batch_size(4)
4339       .qmin(std::numeric_limits<uint8_t>::min())
4340       .qmax(std::numeric_limits<uint8_t>::max())
4341       .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4342   }
4343 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,batch_div_4)4344   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, batch_div_4) {
4345     for (size_t batch_size = 8; batch_size < 40; batch_size += 4) {
4346       VCvtMicrokernelTester()
4347         .batch_size(batch_size)
4348         .qmin(std::numeric_limits<uint8_t>::min())
4349         .qmax(std::numeric_limits<uint8_t>::max())
4350         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4351     }
4352   }
4353 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,batch_lt_4)4354   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, batch_lt_4) {
4355     for (size_t batch_size = 1; batch_size < 4; batch_size++) {
4356       VCvtMicrokernelTester()
4357         .batch_size(batch_size)
4358         .qmin(std::numeric_limits<uint8_t>::min())
4359         .qmax(std::numeric_limits<uint8_t>::max())
4360         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4361     }
4362   }
4363 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,batch_gt_4)4364   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, batch_gt_4) {
4365     for (size_t batch_size = 5; batch_size < 8; batch_size++) {
4366       VCvtMicrokernelTester()
4367         .batch_size(batch_size)
4368         .qmin(std::numeric_limits<uint8_t>::min())
4369         .qmax(std::numeric_limits<uint8_t>::max())
4370         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4371     }
4372   }
4373 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,scale)4374   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, scale) {
4375     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4376       VCvtMicrokernelTester()
4377         .batch_size(batch_size)
4378         .scale(50)
4379         .output_zero_point(100)
4380         .qmin(std::numeric_limits<uint8_t>::min())
4381         .qmax(std::numeric_limits<uint8_t>::max())
4382         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4383     }
4384   }
4385 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,output_zero_point)4386   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, output_zero_point) {
4387     for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4388       for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4389         VCvtMicrokernelTester()
4390           .batch_size(batch_size)
4391           .output_zero_point(output_zero_point)
4392           .qmin(std::numeric_limits<uint8_t>::min())
4393           .qmax(std::numeric_limits<uint8_t>::max())
4394           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4395       }
4396     }
4397   }
4398 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,saturation)4399   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, saturation) {
4400     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4401       VCvtMicrokernelTester()
4402         .batch_size(batch_size)
4403         .scale(500)
4404         .output_zero_point(128)
4405         .qmin(std::numeric_limits<uint8_t>::min())
4406         .qmax(std::numeric_limits<uint8_t>::max())
4407         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4408     }
4409   }
4410 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,overflow)4411   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, overflow) {
4412     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4413       VCvtMicrokernelTester()
4414         .batch_size(batch_size)
4415         .scale(4294967296.0f)
4416         .qmin(std::numeric_limits<uint8_t>::min())
4417         .qmax(std::numeric_limits<uint8_t>::max())
4418         .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4419     }
4420   }
4421 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,qmin)4422   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, qmin) {
4423     for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4424       for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4425         VCvtMicrokernelTester()
4426           .batch_size(batch_size)
4427           .scale(500)
4428           .output_zero_point(128)
4429           .qmin(qmin)
4430           .qmax(std::numeric_limits<uint8_t>::max())
4431           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4432       }
4433     }
4434   }
4435 
TEST(F32_QU8_VCVT__WASM_FMAGIC_X4,qmax)4436   TEST(F32_QU8_VCVT__WASM_FMAGIC_X4, qmax) {
4437     for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4438       for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4439         VCvtMicrokernelTester()
4440           .batch_size(batch_size)
4441           .scale(500)
4442           .output_zero_point(128)
4443           .qmin(std::numeric_limits<uint8_t>::min())
4444           .qmax(qmax)
4445           .Test(xnn_f32_qu8_vcvt_ukernel__wasm_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4446       }
4447     }
4448   }
4449 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
4450 
4451 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1,batch_eq_1)4452 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1, batch_eq_1) {
4453   VCvtMicrokernelTester()
4454     .batch_size(1)
4455     .qmin(std::numeric_limits<uint8_t>::min())
4456     .qmax(std::numeric_limits<uint8_t>::max())
4457     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4458 }
4459 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1,batch_gt_1)4460 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1, batch_gt_1) {
4461   for (size_t batch_size = 2; batch_size < 10; batch_size++) {
4462     VCvtMicrokernelTester()
4463       .batch_size(batch_size)
4464       .qmin(std::numeric_limits<uint8_t>::min())
4465       .qmax(std::numeric_limits<uint8_t>::max())
4466       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4467   }
4468 }
4469 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1,scale)4470 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1, scale) {
4471   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4472     VCvtMicrokernelTester()
4473       .batch_size(batch_size)
4474       .scale(50)
4475       .output_zero_point(100)
4476       .qmin(std::numeric_limits<uint8_t>::min())
4477       .qmax(std::numeric_limits<uint8_t>::max())
4478       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4479   }
4480 }
4481 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1,output_zero_point)4482 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1, output_zero_point) {
4483   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4484     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4485       VCvtMicrokernelTester()
4486         .batch_size(batch_size)
4487         .output_zero_point(output_zero_point)
4488         .qmin(std::numeric_limits<uint8_t>::min())
4489         .qmax(std::numeric_limits<uint8_t>::max())
4490         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4491     }
4492   }
4493 }
4494 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1,saturation)4495 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1, saturation) {
4496   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4497     VCvtMicrokernelTester()
4498       .batch_size(batch_size)
4499       .scale(500)
4500       .output_zero_point(128)
4501       .qmin(std::numeric_limits<uint8_t>::min())
4502       .qmax(std::numeric_limits<uint8_t>::max())
4503       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4504   }
4505 }
4506 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1,overflow)4507 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1, overflow) {
4508   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4509     VCvtMicrokernelTester()
4510       .batch_size(batch_size)
4511       .scale(4294967296.0f)
4512       .qmin(std::numeric_limits<uint8_t>::min())
4513       .qmax(std::numeric_limits<uint8_t>::max())
4514       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4515   }
4516 }
4517 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1,qmin)4518 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1, qmin) {
4519   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4520     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4521       VCvtMicrokernelTester()
4522         .batch_size(batch_size)
4523         .scale(500)
4524         .output_zero_point(128)
4525         .qmin(qmin)
4526         .qmax(std::numeric_limits<uint8_t>::max())
4527         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4528     }
4529   }
4530 }
4531 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1,qmax)4532 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X1, qmax) {
4533   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4534     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4535       VCvtMicrokernelTester()
4536         .batch_size(batch_size)
4537         .scale(500)
4538         .output_zero_point(128)
4539         .qmin(std::numeric_limits<uint8_t>::min())
4540         .qmax(qmax)
4541         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x1, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4542     }
4543   }
4544 }
4545 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,batch_eq_2)4546 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, batch_eq_2) {
4547   VCvtMicrokernelTester()
4548     .batch_size(2)
4549     .qmin(std::numeric_limits<uint8_t>::min())
4550     .qmax(std::numeric_limits<uint8_t>::max())
4551     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4552 }
4553 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,batch_div_2)4554 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, batch_div_2) {
4555   for (size_t batch_size = 4; batch_size < 20; batch_size += 2) {
4556     VCvtMicrokernelTester()
4557       .batch_size(batch_size)
4558       .qmin(std::numeric_limits<uint8_t>::min())
4559       .qmax(std::numeric_limits<uint8_t>::max())
4560       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4561   }
4562 }
4563 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,batch_lt_2)4564 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, batch_lt_2) {
4565   for (size_t batch_size = 1; batch_size < 2; batch_size++) {
4566     VCvtMicrokernelTester()
4567       .batch_size(batch_size)
4568       .qmin(std::numeric_limits<uint8_t>::min())
4569       .qmax(std::numeric_limits<uint8_t>::max())
4570       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4571   }
4572 }
4573 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,batch_gt_2)4574 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, batch_gt_2) {
4575   for (size_t batch_size = 3; batch_size < 4; batch_size++) {
4576     VCvtMicrokernelTester()
4577       .batch_size(batch_size)
4578       .qmin(std::numeric_limits<uint8_t>::min())
4579       .qmax(std::numeric_limits<uint8_t>::max())
4580       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4581   }
4582 }
4583 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,scale)4584 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, scale) {
4585   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4586     VCvtMicrokernelTester()
4587       .batch_size(batch_size)
4588       .scale(50)
4589       .output_zero_point(100)
4590       .qmin(std::numeric_limits<uint8_t>::min())
4591       .qmax(std::numeric_limits<uint8_t>::max())
4592       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4593   }
4594 }
4595 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,output_zero_point)4596 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, output_zero_point) {
4597   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4598     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4599       VCvtMicrokernelTester()
4600         .batch_size(batch_size)
4601         .output_zero_point(output_zero_point)
4602         .qmin(std::numeric_limits<uint8_t>::min())
4603         .qmax(std::numeric_limits<uint8_t>::max())
4604         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4605     }
4606   }
4607 }
4608 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,saturation)4609 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, saturation) {
4610   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4611     VCvtMicrokernelTester()
4612       .batch_size(batch_size)
4613       .scale(500)
4614       .output_zero_point(128)
4615       .qmin(std::numeric_limits<uint8_t>::min())
4616       .qmax(std::numeric_limits<uint8_t>::max())
4617       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4618   }
4619 }
4620 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,overflow)4621 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, overflow) {
4622   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4623     VCvtMicrokernelTester()
4624       .batch_size(batch_size)
4625       .scale(4294967296.0f)
4626       .qmin(std::numeric_limits<uint8_t>::min())
4627       .qmax(std::numeric_limits<uint8_t>::max())
4628       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4629   }
4630 }
4631 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,qmin)4632 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, qmin) {
4633   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4634     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4635       VCvtMicrokernelTester()
4636         .batch_size(batch_size)
4637         .scale(500)
4638         .output_zero_point(128)
4639         .qmin(qmin)
4640         .qmax(std::numeric_limits<uint8_t>::max())
4641         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4642     }
4643   }
4644 }
4645 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2,qmax)4646 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X2, qmax) {
4647   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4648     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
4649       VCvtMicrokernelTester()
4650         .batch_size(batch_size)
4651         .scale(500)
4652         .output_zero_point(128)
4653         .qmin(std::numeric_limits<uint8_t>::min())
4654         .qmax(qmax)
4655         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x2, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4656     }
4657   }
4658 }
4659 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,batch_eq_3)4660 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, batch_eq_3) {
4661   VCvtMicrokernelTester()
4662     .batch_size(3)
4663     .qmin(std::numeric_limits<uint8_t>::min())
4664     .qmax(std::numeric_limits<uint8_t>::max())
4665     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4666 }
4667 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,batch_div_3)4668 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, batch_div_3) {
4669   for (size_t batch_size = 6; batch_size < 30; batch_size += 3) {
4670     VCvtMicrokernelTester()
4671       .batch_size(batch_size)
4672       .qmin(std::numeric_limits<uint8_t>::min())
4673       .qmax(std::numeric_limits<uint8_t>::max())
4674       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4675   }
4676 }
4677 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,batch_lt_3)4678 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, batch_lt_3) {
4679   for (size_t batch_size = 1; batch_size < 3; batch_size++) {
4680     VCvtMicrokernelTester()
4681       .batch_size(batch_size)
4682       .qmin(std::numeric_limits<uint8_t>::min())
4683       .qmax(std::numeric_limits<uint8_t>::max())
4684       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4685   }
4686 }
4687 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,batch_gt_3)4688 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, batch_gt_3) {
4689   for (size_t batch_size = 4; batch_size < 6; batch_size++) {
4690     VCvtMicrokernelTester()
4691       .batch_size(batch_size)
4692       .qmin(std::numeric_limits<uint8_t>::min())
4693       .qmax(std::numeric_limits<uint8_t>::max())
4694       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4695   }
4696 }
4697 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,scale)4698 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, scale) {
4699   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4700     VCvtMicrokernelTester()
4701       .batch_size(batch_size)
4702       .scale(50)
4703       .output_zero_point(100)
4704       .qmin(std::numeric_limits<uint8_t>::min())
4705       .qmax(std::numeric_limits<uint8_t>::max())
4706       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4707   }
4708 }
4709 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,output_zero_point)4710 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, output_zero_point) {
4711   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4712     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4713       VCvtMicrokernelTester()
4714         .batch_size(batch_size)
4715         .output_zero_point(output_zero_point)
4716         .qmin(std::numeric_limits<uint8_t>::min())
4717         .qmax(std::numeric_limits<uint8_t>::max())
4718         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4719     }
4720   }
4721 }
4722 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,saturation)4723 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, saturation) {
4724   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4725     VCvtMicrokernelTester()
4726       .batch_size(batch_size)
4727       .scale(500)
4728       .output_zero_point(128)
4729       .qmin(std::numeric_limits<uint8_t>::min())
4730       .qmax(std::numeric_limits<uint8_t>::max())
4731       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4732   }
4733 }
4734 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,overflow)4735 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, overflow) {
4736   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4737     VCvtMicrokernelTester()
4738       .batch_size(batch_size)
4739       .scale(4294967296.0f)
4740       .qmin(std::numeric_limits<uint8_t>::min())
4741       .qmax(std::numeric_limits<uint8_t>::max())
4742       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4743   }
4744 }
4745 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,qmin)4746 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, qmin) {
4747   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4748     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4749       VCvtMicrokernelTester()
4750         .batch_size(batch_size)
4751         .scale(500)
4752         .output_zero_point(128)
4753         .qmin(qmin)
4754         .qmax(std::numeric_limits<uint8_t>::max())
4755         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4756     }
4757   }
4758 }
4759 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3,qmax)4760 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X3, qmax) {
4761   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4762     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
4763       VCvtMicrokernelTester()
4764         .batch_size(batch_size)
4765         .scale(500)
4766         .output_zero_point(128)
4767         .qmin(std::numeric_limits<uint8_t>::min())
4768         .qmax(qmax)
4769         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x3, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4770     }
4771   }
4772 }
4773 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,batch_eq_4)4774 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, batch_eq_4) {
4775   VCvtMicrokernelTester()
4776     .batch_size(4)
4777     .qmin(std::numeric_limits<uint8_t>::min())
4778     .qmax(std::numeric_limits<uint8_t>::max())
4779     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4780 }
4781 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,batch_div_4)4782 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, batch_div_4) {
4783   for (size_t batch_size = 8; batch_size < 40; batch_size += 4) {
4784     VCvtMicrokernelTester()
4785       .batch_size(batch_size)
4786       .qmin(std::numeric_limits<uint8_t>::min())
4787       .qmax(std::numeric_limits<uint8_t>::max())
4788       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4789   }
4790 }
4791 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,batch_lt_4)4792 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, batch_lt_4) {
4793   for (size_t batch_size = 1; batch_size < 4; batch_size++) {
4794     VCvtMicrokernelTester()
4795       .batch_size(batch_size)
4796       .qmin(std::numeric_limits<uint8_t>::min())
4797       .qmax(std::numeric_limits<uint8_t>::max())
4798       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4799   }
4800 }
4801 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,batch_gt_4)4802 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, batch_gt_4) {
4803   for (size_t batch_size = 5; batch_size < 8; batch_size++) {
4804     VCvtMicrokernelTester()
4805       .batch_size(batch_size)
4806       .qmin(std::numeric_limits<uint8_t>::min())
4807       .qmax(std::numeric_limits<uint8_t>::max())
4808       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4809   }
4810 }
4811 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,scale)4812 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, scale) {
4813   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4814     VCvtMicrokernelTester()
4815       .batch_size(batch_size)
4816       .scale(50)
4817       .output_zero_point(100)
4818       .qmin(std::numeric_limits<uint8_t>::min())
4819       .qmax(std::numeric_limits<uint8_t>::max())
4820       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4821   }
4822 }
4823 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,output_zero_point)4824 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, output_zero_point) {
4825   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4826     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4827       VCvtMicrokernelTester()
4828         .batch_size(batch_size)
4829         .output_zero_point(output_zero_point)
4830         .qmin(std::numeric_limits<uint8_t>::min())
4831         .qmax(std::numeric_limits<uint8_t>::max())
4832         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4833     }
4834   }
4835 }
4836 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,saturation)4837 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, saturation) {
4838   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4839     VCvtMicrokernelTester()
4840       .batch_size(batch_size)
4841       .scale(500)
4842       .output_zero_point(128)
4843       .qmin(std::numeric_limits<uint8_t>::min())
4844       .qmax(std::numeric_limits<uint8_t>::max())
4845       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4846   }
4847 }
4848 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,overflow)4849 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, overflow) {
4850   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4851     VCvtMicrokernelTester()
4852       .batch_size(batch_size)
4853       .scale(4294967296.0f)
4854       .qmin(std::numeric_limits<uint8_t>::min())
4855       .qmax(std::numeric_limits<uint8_t>::max())
4856       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4857   }
4858 }
4859 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,qmin)4860 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, qmin) {
4861   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4862     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4863       VCvtMicrokernelTester()
4864         .batch_size(batch_size)
4865         .scale(500)
4866         .output_zero_point(128)
4867         .qmin(qmin)
4868         .qmax(std::numeric_limits<uint8_t>::max())
4869         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4870     }
4871   }
4872 }
4873 
TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4,qmax)4874 TEST(F32_QU8_VCVT__SCALAR_FMAGIC_X4, qmax) {
4875   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4876     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
4877       VCvtMicrokernelTester()
4878         .batch_size(batch_size)
4879         .scale(500)
4880         .output_zero_point(128)
4881         .qmin(std::numeric_limits<uint8_t>::min())
4882         .qmax(qmax)
4883         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_fmagic_x4, xnn_init_f32_qu8_cvt_scalar_fmagic_params);
4884     }
4885   }
4886 }
4887 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1,batch_eq_1)4888 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1, batch_eq_1) {
4889   VCvtMicrokernelTester()
4890     .batch_size(1)
4891     .qmin(std::numeric_limits<uint8_t>::min())
4892     .qmax(std::numeric_limits<uint8_t>::max())
4893     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4894 }
4895 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1,batch_gt_1)4896 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1, batch_gt_1) {
4897   for (size_t batch_size = 2; batch_size < 10; batch_size++) {
4898     VCvtMicrokernelTester()
4899       .batch_size(batch_size)
4900       .qmin(std::numeric_limits<uint8_t>::min())
4901       .qmax(std::numeric_limits<uint8_t>::max())
4902       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4903   }
4904 }
4905 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1,scale)4906 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1, scale) {
4907   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4908     VCvtMicrokernelTester()
4909       .batch_size(batch_size)
4910       .scale(50)
4911       .output_zero_point(100)
4912       .qmin(std::numeric_limits<uint8_t>::min())
4913       .qmax(std::numeric_limits<uint8_t>::max())
4914       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4915   }
4916 }
4917 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1,output_zero_point)4918 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1, output_zero_point) {
4919   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
4920     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4921       VCvtMicrokernelTester()
4922         .batch_size(batch_size)
4923         .output_zero_point(output_zero_point)
4924         .qmin(std::numeric_limits<uint8_t>::min())
4925         .qmax(std::numeric_limits<uint8_t>::max())
4926         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4927     }
4928   }
4929 }
4930 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1,saturation)4931 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1, saturation) {
4932   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4933     VCvtMicrokernelTester()
4934       .batch_size(batch_size)
4935       .scale(500)
4936       .output_zero_point(128)
4937       .qmin(std::numeric_limits<uint8_t>::min())
4938       .qmax(std::numeric_limits<uint8_t>::max())
4939       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4940   }
4941 }
4942 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1,overflow)4943 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1, overflow) {
4944   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4945     VCvtMicrokernelTester()
4946       .batch_size(batch_size)
4947       .scale(4294967296.0f)
4948       .qmin(std::numeric_limits<uint8_t>::min())
4949       .qmax(std::numeric_limits<uint8_t>::max())
4950       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4951   }
4952 }
4953 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1,qmin)4954 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1, qmin) {
4955   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
4956     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4957       VCvtMicrokernelTester()
4958         .batch_size(batch_size)
4959         .scale(500)
4960         .output_zero_point(128)
4961         .qmin(qmin)
4962         .qmax(std::numeric_limits<uint8_t>::max())
4963         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4964     }
4965   }
4966 }
4967 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1,qmax)4968 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X1, qmax) {
4969   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
4970     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
4971       VCvtMicrokernelTester()
4972         .batch_size(batch_size)
4973         .scale(500)
4974         .output_zero_point(128)
4975         .qmin(std::numeric_limits<uint8_t>::min())
4976         .qmax(qmax)
4977         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4978     }
4979   }
4980 }
4981 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,batch_eq_2)4982 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, batch_eq_2) {
4983   VCvtMicrokernelTester()
4984     .batch_size(2)
4985     .qmin(std::numeric_limits<uint8_t>::min())
4986     .qmax(std::numeric_limits<uint8_t>::max())
4987     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4988 }
4989 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,batch_div_2)4990 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, batch_div_2) {
4991   for (size_t batch_size = 4; batch_size < 20; batch_size += 2) {
4992     VCvtMicrokernelTester()
4993       .batch_size(batch_size)
4994       .qmin(std::numeric_limits<uint8_t>::min())
4995       .qmax(std::numeric_limits<uint8_t>::max())
4996       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
4997   }
4998 }
4999 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,batch_lt_2)5000 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, batch_lt_2) {
5001   for (size_t batch_size = 1; batch_size < 2; batch_size++) {
5002     VCvtMicrokernelTester()
5003       .batch_size(batch_size)
5004       .qmin(std::numeric_limits<uint8_t>::min())
5005       .qmax(std::numeric_limits<uint8_t>::max())
5006       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5007   }
5008 }
5009 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,batch_gt_2)5010 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, batch_gt_2) {
5011   for (size_t batch_size = 3; batch_size < 4; batch_size++) {
5012     VCvtMicrokernelTester()
5013       .batch_size(batch_size)
5014       .qmin(std::numeric_limits<uint8_t>::min())
5015       .qmax(std::numeric_limits<uint8_t>::max())
5016       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5017   }
5018 }
5019 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,scale)5020 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, scale) {
5021   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5022     VCvtMicrokernelTester()
5023       .batch_size(batch_size)
5024       .scale(50)
5025       .output_zero_point(100)
5026       .qmin(std::numeric_limits<uint8_t>::min())
5027       .qmax(std::numeric_limits<uint8_t>::max())
5028       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5029   }
5030 }
5031 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,output_zero_point)5032 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, output_zero_point) {
5033   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
5034     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5035       VCvtMicrokernelTester()
5036         .batch_size(batch_size)
5037         .output_zero_point(output_zero_point)
5038         .qmin(std::numeric_limits<uint8_t>::min())
5039         .qmax(std::numeric_limits<uint8_t>::max())
5040         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5041     }
5042   }
5043 }
5044 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,saturation)5045 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, saturation) {
5046   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5047     VCvtMicrokernelTester()
5048       .batch_size(batch_size)
5049       .scale(500)
5050       .output_zero_point(128)
5051       .qmin(std::numeric_limits<uint8_t>::min())
5052       .qmax(std::numeric_limits<uint8_t>::max())
5053       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5054   }
5055 }
5056 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,overflow)5057 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, overflow) {
5058   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5059     VCvtMicrokernelTester()
5060       .batch_size(batch_size)
5061       .scale(4294967296.0f)
5062       .qmin(std::numeric_limits<uint8_t>::min())
5063       .qmax(std::numeric_limits<uint8_t>::max())
5064       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5065   }
5066 }
5067 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,qmin)5068 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, qmin) {
5069   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
5070     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5071       VCvtMicrokernelTester()
5072         .batch_size(batch_size)
5073         .scale(500)
5074         .output_zero_point(128)
5075         .qmin(qmin)
5076         .qmax(std::numeric_limits<uint8_t>::max())
5077         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5078     }
5079   }
5080 }
5081 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2,qmax)5082 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X2, qmax) {
5083   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
5084     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5085       VCvtMicrokernelTester()
5086         .batch_size(batch_size)
5087         .scale(500)
5088         .output_zero_point(128)
5089         .qmin(std::numeric_limits<uint8_t>::min())
5090         .qmax(qmax)
5091         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x2, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5092     }
5093   }
5094 }
5095 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,batch_eq_3)5096 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, batch_eq_3) {
5097   VCvtMicrokernelTester()
5098     .batch_size(3)
5099     .qmin(std::numeric_limits<uint8_t>::min())
5100     .qmax(std::numeric_limits<uint8_t>::max())
5101     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5102 }
5103 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,batch_div_3)5104 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, batch_div_3) {
5105   for (size_t batch_size = 6; batch_size < 30; batch_size += 3) {
5106     VCvtMicrokernelTester()
5107       .batch_size(batch_size)
5108       .qmin(std::numeric_limits<uint8_t>::min())
5109       .qmax(std::numeric_limits<uint8_t>::max())
5110       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5111   }
5112 }
5113 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,batch_lt_3)5114 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, batch_lt_3) {
5115   for (size_t batch_size = 1; batch_size < 3; batch_size++) {
5116     VCvtMicrokernelTester()
5117       .batch_size(batch_size)
5118       .qmin(std::numeric_limits<uint8_t>::min())
5119       .qmax(std::numeric_limits<uint8_t>::max())
5120       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5121   }
5122 }
5123 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,batch_gt_3)5124 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, batch_gt_3) {
5125   for (size_t batch_size = 4; batch_size < 6; batch_size++) {
5126     VCvtMicrokernelTester()
5127       .batch_size(batch_size)
5128       .qmin(std::numeric_limits<uint8_t>::min())
5129       .qmax(std::numeric_limits<uint8_t>::max())
5130       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5131   }
5132 }
5133 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,scale)5134 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, scale) {
5135   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5136     VCvtMicrokernelTester()
5137       .batch_size(batch_size)
5138       .scale(50)
5139       .output_zero_point(100)
5140       .qmin(std::numeric_limits<uint8_t>::min())
5141       .qmax(std::numeric_limits<uint8_t>::max())
5142       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5143   }
5144 }
5145 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,output_zero_point)5146 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, output_zero_point) {
5147   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
5148     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5149       VCvtMicrokernelTester()
5150         .batch_size(batch_size)
5151         .output_zero_point(output_zero_point)
5152         .qmin(std::numeric_limits<uint8_t>::min())
5153         .qmax(std::numeric_limits<uint8_t>::max())
5154         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5155     }
5156   }
5157 }
5158 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,saturation)5159 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, saturation) {
5160   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5161     VCvtMicrokernelTester()
5162       .batch_size(batch_size)
5163       .scale(500)
5164       .output_zero_point(128)
5165       .qmin(std::numeric_limits<uint8_t>::min())
5166       .qmax(std::numeric_limits<uint8_t>::max())
5167       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5168   }
5169 }
5170 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,overflow)5171 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, overflow) {
5172   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5173     VCvtMicrokernelTester()
5174       .batch_size(batch_size)
5175       .scale(4294967296.0f)
5176       .qmin(std::numeric_limits<uint8_t>::min())
5177       .qmax(std::numeric_limits<uint8_t>::max())
5178       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5179   }
5180 }
5181 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,qmin)5182 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, qmin) {
5183   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
5184     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5185       VCvtMicrokernelTester()
5186         .batch_size(batch_size)
5187         .scale(500)
5188         .output_zero_point(128)
5189         .qmin(qmin)
5190         .qmax(std::numeric_limits<uint8_t>::max())
5191         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5192     }
5193   }
5194 }
5195 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3,qmax)5196 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X3, qmax) {
5197   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
5198     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5199       VCvtMicrokernelTester()
5200         .batch_size(batch_size)
5201         .scale(500)
5202         .output_zero_point(128)
5203         .qmin(std::numeric_limits<uint8_t>::min())
5204         .qmax(qmax)
5205         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x3, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5206     }
5207   }
5208 }
5209 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,batch_eq_4)5210 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, batch_eq_4) {
5211   VCvtMicrokernelTester()
5212     .batch_size(4)
5213     .qmin(std::numeric_limits<uint8_t>::min())
5214     .qmax(std::numeric_limits<uint8_t>::max())
5215     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5216 }
5217 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,batch_div_4)5218 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, batch_div_4) {
5219   for (size_t batch_size = 8; batch_size < 40; batch_size += 4) {
5220     VCvtMicrokernelTester()
5221       .batch_size(batch_size)
5222       .qmin(std::numeric_limits<uint8_t>::min())
5223       .qmax(std::numeric_limits<uint8_t>::max())
5224       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5225   }
5226 }
5227 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,batch_lt_4)5228 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, batch_lt_4) {
5229   for (size_t batch_size = 1; batch_size < 4; batch_size++) {
5230     VCvtMicrokernelTester()
5231       .batch_size(batch_size)
5232       .qmin(std::numeric_limits<uint8_t>::min())
5233       .qmax(std::numeric_limits<uint8_t>::max())
5234       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5235   }
5236 }
5237 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,batch_gt_4)5238 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, batch_gt_4) {
5239   for (size_t batch_size = 5; batch_size < 8; batch_size++) {
5240     VCvtMicrokernelTester()
5241       .batch_size(batch_size)
5242       .qmin(std::numeric_limits<uint8_t>::min())
5243       .qmax(std::numeric_limits<uint8_t>::max())
5244       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5245   }
5246 }
5247 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,scale)5248 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, scale) {
5249   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5250     VCvtMicrokernelTester()
5251       .batch_size(batch_size)
5252       .scale(50)
5253       .output_zero_point(100)
5254       .qmin(std::numeric_limits<uint8_t>::min())
5255       .qmax(std::numeric_limits<uint8_t>::max())
5256       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5257   }
5258 }
5259 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,output_zero_point)5260 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, output_zero_point) {
5261   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
5262     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5263       VCvtMicrokernelTester()
5264         .batch_size(batch_size)
5265         .output_zero_point(output_zero_point)
5266         .qmin(std::numeric_limits<uint8_t>::min())
5267         .qmax(std::numeric_limits<uint8_t>::max())
5268         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5269     }
5270   }
5271 }
5272 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,saturation)5273 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, saturation) {
5274   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5275     VCvtMicrokernelTester()
5276       .batch_size(batch_size)
5277       .scale(500)
5278       .output_zero_point(128)
5279       .qmin(std::numeric_limits<uint8_t>::min())
5280       .qmax(std::numeric_limits<uint8_t>::max())
5281       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5282   }
5283 }
5284 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,overflow)5285 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, overflow) {
5286   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5287     VCvtMicrokernelTester()
5288       .batch_size(batch_size)
5289       .scale(4294967296.0f)
5290       .qmin(std::numeric_limits<uint8_t>::min())
5291       .qmax(std::numeric_limits<uint8_t>::max())
5292       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5293   }
5294 }
5295 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,qmin)5296 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, qmin) {
5297   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
5298     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5299       VCvtMicrokernelTester()
5300         .batch_size(batch_size)
5301         .scale(500)
5302         .output_zero_point(128)
5303         .qmin(qmin)
5304         .qmax(std::numeric_limits<uint8_t>::max())
5305         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5306     }
5307   }
5308 }
5309 
TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4,qmax)5310 TEST(F32_QU8_VCVT__SCALAR_IMAGIC_X4, qmax) {
5311   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
5312     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5313       VCvtMicrokernelTester()
5314         .batch_size(batch_size)
5315         .scale(500)
5316         .output_zero_point(128)
5317         .qmin(std::numeric_limits<uint8_t>::min())
5318         .qmax(qmax)
5319         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x4, xnn_init_f32_qu8_cvt_scalar_imagic_params);
5320     }
5321   }
5322 }
5323 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1,batch_eq_1)5324 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1, batch_eq_1) {
5325   VCvtMicrokernelTester()
5326     .batch_size(1)
5327     .qmin(std::numeric_limits<uint8_t>::min())
5328     .qmax(std::numeric_limits<uint8_t>::max())
5329     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x1, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5330 }
5331 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1,batch_gt_1)5332 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1, batch_gt_1) {
5333   for (size_t batch_size = 2; batch_size < 10; batch_size++) {
5334     VCvtMicrokernelTester()
5335       .batch_size(batch_size)
5336       .qmin(std::numeric_limits<uint8_t>::min())
5337       .qmax(std::numeric_limits<uint8_t>::max())
5338       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x1, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5339   }
5340 }
5341 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1,scale)5342 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1, scale) {
5343   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
5344     VCvtMicrokernelTester()
5345       .batch_size(batch_size)
5346       .scale(50)
5347       .output_zero_point(100)
5348       .qmin(std::numeric_limits<uint8_t>::min())
5349       .qmax(std::numeric_limits<uint8_t>::max())
5350       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x1, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5351   }
5352 }
5353 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1,output_zero_point)5354 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1, output_zero_point) {
5355   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
5356     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
5357       VCvtMicrokernelTester()
5358         .batch_size(batch_size)
5359         .output_zero_point(output_zero_point)
5360         .qmin(std::numeric_limits<uint8_t>::min())
5361         .qmax(std::numeric_limits<uint8_t>::max())
5362         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x1, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5363     }
5364   }
5365 }
5366 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1,saturation)5367 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1, saturation) {
5368   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
5369     VCvtMicrokernelTester()
5370       .batch_size(batch_size)
5371       .scale(500)
5372       .output_zero_point(128)
5373       .qmin(std::numeric_limits<uint8_t>::min())
5374       .qmax(std::numeric_limits<uint8_t>::max())
5375       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x1, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5376   }
5377 }
5378 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1,overflow)5379 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1, overflow) {
5380   for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
5381     VCvtMicrokernelTester()
5382       .batch_size(batch_size)
5383       .scale(4294967296.0f)
5384       .qmin(std::numeric_limits<uint8_t>::min())
5385       .qmax(std::numeric_limits<uint8_t>::max())
5386       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x1, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5387   }
5388 }
5389 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1,qmin)5390 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1, qmin) {
5391   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
5392     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
5393       VCvtMicrokernelTester()
5394         .batch_size(batch_size)
5395         .scale(500)
5396         .output_zero_point(128)
5397         .qmin(qmin)
5398         .qmax(std::numeric_limits<uint8_t>::max())
5399         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x1, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5400     }
5401   }
5402 }
5403 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1,qmax)5404 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X1, qmax) {
5405   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
5406     for (size_t batch_size = 1; batch_size <= 5; batch_size += 1) {
5407       VCvtMicrokernelTester()
5408         .batch_size(batch_size)
5409         .scale(500)
5410         .output_zero_point(128)
5411         .qmin(std::numeric_limits<uint8_t>::min())
5412         .qmax(qmax)
5413         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x1, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5414     }
5415   }
5416 }
5417 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,batch_eq_2)5418 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, batch_eq_2) {
5419   VCvtMicrokernelTester()
5420     .batch_size(2)
5421     .qmin(std::numeric_limits<uint8_t>::min())
5422     .qmax(std::numeric_limits<uint8_t>::max())
5423     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5424 }
5425 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,batch_div_2)5426 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, batch_div_2) {
5427   for (size_t batch_size = 4; batch_size < 20; batch_size += 2) {
5428     VCvtMicrokernelTester()
5429       .batch_size(batch_size)
5430       .qmin(std::numeric_limits<uint8_t>::min())
5431       .qmax(std::numeric_limits<uint8_t>::max())
5432       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5433   }
5434 }
5435 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,batch_lt_2)5436 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, batch_lt_2) {
5437   for (size_t batch_size = 1; batch_size < 2; batch_size++) {
5438     VCvtMicrokernelTester()
5439       .batch_size(batch_size)
5440       .qmin(std::numeric_limits<uint8_t>::min())
5441       .qmax(std::numeric_limits<uint8_t>::max())
5442       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5443   }
5444 }
5445 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,batch_gt_2)5446 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, batch_gt_2) {
5447   for (size_t batch_size = 3; batch_size < 4; batch_size++) {
5448     VCvtMicrokernelTester()
5449       .batch_size(batch_size)
5450       .qmin(std::numeric_limits<uint8_t>::min())
5451       .qmax(std::numeric_limits<uint8_t>::max())
5452       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5453   }
5454 }
5455 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,scale)5456 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, scale) {
5457   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5458     VCvtMicrokernelTester()
5459       .batch_size(batch_size)
5460       .scale(50)
5461       .output_zero_point(100)
5462       .qmin(std::numeric_limits<uint8_t>::min())
5463       .qmax(std::numeric_limits<uint8_t>::max())
5464       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5465   }
5466 }
5467 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,output_zero_point)5468 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, output_zero_point) {
5469   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
5470     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5471       VCvtMicrokernelTester()
5472         .batch_size(batch_size)
5473         .output_zero_point(output_zero_point)
5474         .qmin(std::numeric_limits<uint8_t>::min())
5475         .qmax(std::numeric_limits<uint8_t>::max())
5476         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5477     }
5478   }
5479 }
5480 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,saturation)5481 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, saturation) {
5482   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5483     VCvtMicrokernelTester()
5484       .batch_size(batch_size)
5485       .scale(500)
5486       .output_zero_point(128)
5487       .qmin(std::numeric_limits<uint8_t>::min())
5488       .qmax(std::numeric_limits<uint8_t>::max())
5489       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5490   }
5491 }
5492 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,overflow)5493 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, overflow) {
5494   for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5495     VCvtMicrokernelTester()
5496       .batch_size(batch_size)
5497       .scale(4294967296.0f)
5498       .qmin(std::numeric_limits<uint8_t>::min())
5499       .qmax(std::numeric_limits<uint8_t>::max())
5500       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5501   }
5502 }
5503 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,qmin)5504 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, qmin) {
5505   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
5506     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5507       VCvtMicrokernelTester()
5508         .batch_size(batch_size)
5509         .scale(500)
5510         .output_zero_point(128)
5511         .qmin(qmin)
5512         .qmax(std::numeric_limits<uint8_t>::max())
5513         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5514     }
5515   }
5516 }
5517 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2,qmax)5518 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X2, qmax) {
5519   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
5520     for (size_t batch_size = 1; batch_size <= 10; batch_size += 1) {
5521       VCvtMicrokernelTester()
5522         .batch_size(batch_size)
5523         .scale(500)
5524         .output_zero_point(128)
5525         .qmin(std::numeric_limits<uint8_t>::min())
5526         .qmax(qmax)
5527         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x2, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5528     }
5529   }
5530 }
5531 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,batch_eq_3)5532 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, batch_eq_3) {
5533   VCvtMicrokernelTester()
5534     .batch_size(3)
5535     .qmin(std::numeric_limits<uint8_t>::min())
5536     .qmax(std::numeric_limits<uint8_t>::max())
5537     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5538 }
5539 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,batch_div_3)5540 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, batch_div_3) {
5541   for (size_t batch_size = 6; batch_size < 30; batch_size += 3) {
5542     VCvtMicrokernelTester()
5543       .batch_size(batch_size)
5544       .qmin(std::numeric_limits<uint8_t>::min())
5545       .qmax(std::numeric_limits<uint8_t>::max())
5546       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5547   }
5548 }
5549 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,batch_lt_3)5550 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, batch_lt_3) {
5551   for (size_t batch_size = 1; batch_size < 3; batch_size++) {
5552     VCvtMicrokernelTester()
5553       .batch_size(batch_size)
5554       .qmin(std::numeric_limits<uint8_t>::min())
5555       .qmax(std::numeric_limits<uint8_t>::max())
5556       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5557   }
5558 }
5559 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,batch_gt_3)5560 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, batch_gt_3) {
5561   for (size_t batch_size = 4; batch_size < 6; batch_size++) {
5562     VCvtMicrokernelTester()
5563       .batch_size(batch_size)
5564       .qmin(std::numeric_limits<uint8_t>::min())
5565       .qmax(std::numeric_limits<uint8_t>::max())
5566       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5567   }
5568 }
5569 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,scale)5570 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, scale) {
5571   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5572     VCvtMicrokernelTester()
5573       .batch_size(batch_size)
5574       .scale(50)
5575       .output_zero_point(100)
5576       .qmin(std::numeric_limits<uint8_t>::min())
5577       .qmax(std::numeric_limits<uint8_t>::max())
5578       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5579   }
5580 }
5581 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,output_zero_point)5582 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, output_zero_point) {
5583   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
5584     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5585       VCvtMicrokernelTester()
5586         .batch_size(batch_size)
5587         .output_zero_point(output_zero_point)
5588         .qmin(std::numeric_limits<uint8_t>::min())
5589         .qmax(std::numeric_limits<uint8_t>::max())
5590         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5591     }
5592   }
5593 }
5594 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,saturation)5595 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, saturation) {
5596   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5597     VCvtMicrokernelTester()
5598       .batch_size(batch_size)
5599       .scale(500)
5600       .output_zero_point(128)
5601       .qmin(std::numeric_limits<uint8_t>::min())
5602       .qmax(std::numeric_limits<uint8_t>::max())
5603       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5604   }
5605 }
5606 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,overflow)5607 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, overflow) {
5608   for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5609     VCvtMicrokernelTester()
5610       .batch_size(batch_size)
5611       .scale(4294967296.0f)
5612       .qmin(std::numeric_limits<uint8_t>::min())
5613       .qmax(std::numeric_limits<uint8_t>::max())
5614       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5615   }
5616 }
5617 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,qmin)5618 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, qmin) {
5619   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
5620     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5621       VCvtMicrokernelTester()
5622         .batch_size(batch_size)
5623         .scale(500)
5624         .output_zero_point(128)
5625         .qmin(qmin)
5626         .qmax(std::numeric_limits<uint8_t>::max())
5627         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5628     }
5629   }
5630 }
5631 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3,qmax)5632 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X3, qmax) {
5633   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
5634     for (size_t batch_size = 1; batch_size <= 15; batch_size += 2) {
5635       VCvtMicrokernelTester()
5636         .batch_size(batch_size)
5637         .scale(500)
5638         .output_zero_point(128)
5639         .qmin(std::numeric_limits<uint8_t>::min())
5640         .qmax(qmax)
5641         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x3, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5642     }
5643   }
5644 }
5645 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,batch_eq_4)5646 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, batch_eq_4) {
5647   VCvtMicrokernelTester()
5648     .batch_size(4)
5649     .qmin(std::numeric_limits<uint8_t>::min())
5650     .qmax(std::numeric_limits<uint8_t>::max())
5651     .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5652 }
5653 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,batch_div_4)5654 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, batch_div_4) {
5655   for (size_t batch_size = 8; batch_size < 40; batch_size += 4) {
5656     VCvtMicrokernelTester()
5657       .batch_size(batch_size)
5658       .qmin(std::numeric_limits<uint8_t>::min())
5659       .qmax(std::numeric_limits<uint8_t>::max())
5660       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5661   }
5662 }
5663 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,batch_lt_4)5664 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, batch_lt_4) {
5665   for (size_t batch_size = 1; batch_size < 4; batch_size++) {
5666     VCvtMicrokernelTester()
5667       .batch_size(batch_size)
5668       .qmin(std::numeric_limits<uint8_t>::min())
5669       .qmax(std::numeric_limits<uint8_t>::max())
5670       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5671   }
5672 }
5673 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,batch_gt_4)5674 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, batch_gt_4) {
5675   for (size_t batch_size = 5; batch_size < 8; batch_size++) {
5676     VCvtMicrokernelTester()
5677       .batch_size(batch_size)
5678       .qmin(std::numeric_limits<uint8_t>::min())
5679       .qmax(std::numeric_limits<uint8_t>::max())
5680       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5681   }
5682 }
5683 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,scale)5684 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, scale) {
5685   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5686     VCvtMicrokernelTester()
5687       .batch_size(batch_size)
5688       .scale(50)
5689       .output_zero_point(100)
5690       .qmin(std::numeric_limits<uint8_t>::min())
5691       .qmax(std::numeric_limits<uint8_t>::max())
5692       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5693   }
5694 }
5695 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,output_zero_point)5696 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, output_zero_point) {
5697   for (int16_t output_zero_point = 0; output_zero_point < 5; output_zero_point += 2) {
5698     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5699       VCvtMicrokernelTester()
5700         .batch_size(batch_size)
5701         .output_zero_point(output_zero_point)
5702         .qmin(std::numeric_limits<uint8_t>::min())
5703         .qmax(std::numeric_limits<uint8_t>::max())
5704         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5705     }
5706   }
5707 }
5708 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,saturation)5709 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, saturation) {
5710   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5711     VCvtMicrokernelTester()
5712       .batch_size(batch_size)
5713       .scale(500)
5714       .output_zero_point(128)
5715       .qmin(std::numeric_limits<uint8_t>::min())
5716       .qmax(std::numeric_limits<uint8_t>::max())
5717       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5718   }
5719 }
5720 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,overflow)5721 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, overflow) {
5722   for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5723     VCvtMicrokernelTester()
5724       .batch_size(batch_size)
5725       .scale(4294967296.0f)
5726       .qmin(std::numeric_limits<uint8_t>::min())
5727       .qmax(std::numeric_limits<uint8_t>::max())
5728       .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5729   }
5730 }
5731 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,qmin)5732 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, qmin) {
5733   for (int16_t qmin = 0; qmin < 255; qmin += 51) {
5734     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5735       VCvtMicrokernelTester()
5736         .batch_size(batch_size)
5737         .scale(500)
5738         .output_zero_point(128)
5739         .qmin(qmin)
5740         .qmax(std::numeric_limits<uint8_t>::max())
5741         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5742     }
5743   }
5744 }
5745 
TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4,qmax)5746 TEST(F32_QU8_VCVT__SCALAR_LRINTF_X4, qmax) {
5747   for (int16_t qmax = 1; qmax <= 255; qmax += 51) {
5748     for (size_t batch_size = 1; batch_size <= 20; batch_size += 3) {
5749       VCvtMicrokernelTester()
5750         .batch_size(batch_size)
5751         .scale(500)
5752         .output_zero_point(128)
5753         .qmin(std::numeric_limits<uint8_t>::min())
5754         .qmax(qmax)
5755         .Test(xnn_f32_qu8_vcvt_ukernel__scalar_lrintf_x4, xnn_init_f32_qu8_cvt_scalar_lrintf_params);
5756     }
5757   }
5758 }