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