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