xref: /aosp_15_r20/external/gemmlowp/public/bit_depth.h (revision 5f39d1b313f0528e11bae88b3029b54b9e1033e7)
1*5f39d1b3SJooyung Han // Copyright 2015 The Gemmlowp Authors. All Rights Reserved.
2*5f39d1b3SJooyung Han //
3*5f39d1b3SJooyung Han // Licensed under the Apache License, Version 2.0 (the "License");
4*5f39d1b3SJooyung Han // you may not use this file except in compliance with the License.
5*5f39d1b3SJooyung Han // You may obtain a copy of the License at
6*5f39d1b3SJooyung Han //
7*5f39d1b3SJooyung Han //     http://www.apache.org/licenses/LICENSE-2.0
8*5f39d1b3SJooyung Han //
9*5f39d1b3SJooyung Han // Unless required by applicable law or agreed to in writing, software
10*5f39d1b3SJooyung Han // distributed under the License is distributed on an "AS IS" BASIS,
11*5f39d1b3SJooyung Han // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*5f39d1b3SJooyung Han // See the License for the specific language governing permissions and
13*5f39d1b3SJooyung Han // limitations under the License.
14*5f39d1b3SJooyung Han 
15*5f39d1b3SJooyung Han // bit_depth.h: defines the settins controlling LHS/RHS bit depth
16*5f39d1b3SJooyung Han 
17*5f39d1b3SJooyung Han #ifndef GEMMLOWP_PUBLIC_BIT_DEPTH_H_
18*5f39d1b3SJooyung Han #define GEMMLOWP_PUBLIC_BIT_DEPTH_H_
19*5f39d1b3SJooyung Han 
20*5f39d1b3SJooyung Han namespace gemmlowp {
21*5f39d1b3SJooyung Han 
22*5f39d1b3SJooyung Han // The range of allowed values for an operand.
23*5f39d1b3SJooyung Han template <int tMinValue, int tMaxValue>
24*5f39d1b3SJooyung Han struct OperandRange {
25*5f39d1b3SJooyung Han   static constexpr int kMinValue = tMinValue;
26*5f39d1b3SJooyung Han   static constexpr int kMaxValue = tMaxValue;
27*5f39d1b3SJooyung Han   static_assert(kMinValue < kMaxValue, "");
28*5f39d1b3SJooyung Han };
29*5f39d1b3SJooyung Han 
30*5f39d1b3SJooyung Han using Uint8Range = OperandRange<0, 255>;
31*5f39d1b3SJooyung Han using Uint8RangeExcludingZero = OperandRange<1, 255>;
32*5f39d1b3SJooyung Han 
33*5f39d1b3SJooyung Han using Int8Range = OperandRange<-128, 127>;
34*5f39d1b3SJooyung Han using Int8RangeExcludingLow = OperandRange<-127, 127>;
35*5f39d1b3SJooyung Han 
36*5f39d1b3SJooyung Han template <typename tLhsRange, typename tRhsRange>
37*5f39d1b3SJooyung Han struct BitDepthParams {
38*5f39d1b3SJooyung Han   using LhsRange = tLhsRange;
39*5f39d1b3SJooyung Han   using RhsRange = tRhsRange;
40*5f39d1b3SJooyung Han };
41*5f39d1b3SJooyung Han 
42*5f39d1b3SJooyung Han // Default: LHS and RHS are 8bit.
43*5f39d1b3SJooyung Han using DefaultL8R8BitDepthParams = BitDepthParams<Uint8Range, Uint8Range>;
44*5f39d1b3SJooyung Han 
45*5f39d1b3SJooyung Han // Variant: LHS may not take the value 0. This allows using
46*5f39d1b3SJooyung Han // faster kernels using signed arithmetic, see
47*5f39d1b3SJooyung Han // NEON_64bit_GEMM_Int8Operands_Int32Accumulators_AccumTwoWithin16Bits
48*5f39d1b3SJooyung Han using L8R8WithLhsNonzeroBitDepthParams =
49*5f39d1b3SJooyung Han     BitDepthParams<Uint8RangeExcludingZero, Uint8Range>;
50*5f39d1b3SJooyung Han 
51*5f39d1b3SJooyung Han // Signed Variant: This allows using faster kernels using signed arithmetic, see
52*5f39d1b3SJooyung Han // NEON_64bit_GEMM_Int8Operands_Int32Accumulators_AccumTwoWithin16Bits
53*5f39d1b3SJooyung Han using SignedL8R8WithLhsNonzeroBitDepthParams =
54*5f39d1b3SJooyung Han     BitDepthParams<Int8RangeExcludingLow, Int8Range>;
55*5f39d1b3SJooyung Han 
56*5f39d1b3SJooyung Han // Deprecated: when gemmlowp used to allow requantizing 8bit
57*5f39d1b3SJooyung Han // inputs to less-than-8-bit depths, the public setting allowing
58*5f39d1b3SJooyung Han // that was DefaultL7R5BitDepthParams. That requantization
59*5f39d1b3SJooyung Han // feature has been removed, but as the whole point of that
60*5f39d1b3SJooyung Han // requantization was to make less-than-8-bit an internal
61*5f39d1b3SJooyung Han // optimization without any impact on the API (other than lowering
62*5f39d1b3SJooyung Han // accuracy), we can temporarily support users who were using it
63*5f39d1b3SJooyung Han // by mapping it to the default 8bit behavior.
64*5f39d1b3SJooyung Han using DefaultL7R5BitDepthParams = DefaultL8R8BitDepthParams;
65*5f39d1b3SJooyung Han 
66*5f39d1b3SJooyung Han }  // namespace gemmlowp
67*5f39d1b3SJooyung Han 
68*5f39d1b3SJooyung Han #endif  // GEMMLOWP_PUBLIC_BIT_DEPTH_H_
69