Home | History | Annotate | Download | only in base
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_BASE_DIVISION_BY_CONSTANT_H_
      6 #define V8_BASE_DIVISION_BY_CONSTANT_H_
      7 
      8 namespace v8 {
      9 namespace base {
     10 
     11 // ----------------------------------------------------------------------------
     12 
     13 // The magic numbers for division via multiplication, see Warren's "Hacker's
     14 // Delight", chapter 10. The template parameter must be one of the unsigned
     15 // integral types.
     16 template <class T>
     17 struct MagicNumbersForDivision {
     18   MagicNumbersForDivision(T m, unsigned s, bool a)
     19       : multiplier(m), shift(s), add(a) {}
     20   bool operator==(const MagicNumbersForDivision& rhs) const;
     21 
     22   T multiplier;
     23   unsigned shift;
     24   bool add;
     25 };
     26 
     27 
     28 // Calculate the multiplier and shift for signed division via multiplication.
     29 // The divisor must not be -1, 0 or 1 when interpreted as a signed value.
     30 template <class T>
     31 MagicNumbersForDivision<T> SignedDivisionByConstant(T d);
     32 
     33 
     34 // Calculate the multiplier and shift for unsigned division via multiplication,
     35 // see Warren's "Hacker's Delight", chapter 10. The divisor must not be 0 and
     36 // leading_zeros can be used to speed up the calculation if the given number of
     37 // upper bits of the dividend value are known to be zero.
     38 template <class T>
     39 MagicNumbersForDivision<T> UnsignedDivisionByConstant(
     40     T d, unsigned leading_zeros = 0);
     41 
     42 }  // namespace base
     43 }  // namespace v8
     44 
     45 #endif  // V8_BASE_DIVISION_BY_CONSTANT_H_
     46