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