142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// found in the LICENSE file.
442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org#ifndef V8_BASE_DIVISION_BY_CONSTANT_H_
642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org#define V8_BASE_DIVISION_BY_CONSTANT_H_
742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgnamespace v8 {
942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgnamespace base {
1042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
1142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// ----------------------------------------------------------------------------
1242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
1342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// The magic numbers for division via multiplication, see Warren's "Hacker's
1442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// Delight", chapter 10. The template parameter must be one of the unsigned
1542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// integral types.
1642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgtemplate <class T>
1742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgstruct MagicNumbersForDivision {
1842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  MagicNumbersForDivision(T m, unsigned s, bool a)
1942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      : multiplier(m), shift(s), add(a) {}
2042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  bool operator==(const MagicNumbersForDivision& rhs) const;
2142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
2242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  T multiplier;
2342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  unsigned shift;
2442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org  bool add;
2542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org};
2642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
2742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
2842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// Calculate the multiplier and shift for signed division via multiplication.
2942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// The divisor must not be -1, 0 or 1 when interpreted as a signed value.
3042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgtemplate <class T>
3142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgMagicNumbersForDivision<T> SignedDivisionByConstant(T d);
3242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
3342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
3442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// Calculate the multiplier and shift for unsigned division via multiplication,
3542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// see Warren's "Hacker's Delight", chapter 10. The divisor must not be 0 and
3642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// leading_zeros can be used to speed up the calculation if the given number of
3742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org// upper bits of the dividend value are known to be zero.
3842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgtemplate <class T>
3942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgMagicNumbersForDivision<T> UnsignedDivisionByConstant(
4042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org    T d, unsigned leading_zeros = 0);
4142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
4242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org}  // namespace base
4342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org}  // namespace v8
4442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
4542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org#endif  // V8_BASE_DIVISION_BY_CONSTANT_H_
46