//===- llvm/Transforms/Utils/IntegerDivision.h ------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains an implementation of 32bit and 64bit scalar integer
// division for targets that don't have native support. It's largely derived
// from compiler-rt's implementations of __udivsi3 and __udivmoddi4,
// but hand-tuned for targets that prefer less control flow.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TRANSFORMS_UTILS_INTEGERDIVISION_H
#define LLVM_TRANSFORMS_UTILS_INTEGERDIVISION_H

namespace llvm {
  class BinaryOperator;
}

namespace llvm {

  /// Generate code to calculate the remainder of two integers, replacing Rem
  /// with the generated code. This currently generates code using the udiv
  /// expansion, but future work includes generating more specialized code,
  /// e.g. when more information about the operands are known. Implements both
  /// 32bit and 64bit scalar division.
  ///
  /// Replace Rem with generated code.
  bool expandRemainder(BinaryOperator *Rem);

  /// Generate code to divide two integers, replacing Div with the generated
  /// code. This currently generates code similarly to compiler-rt's
  /// implementations, but future work includes generating more specialized code
  /// when more information about the operands are known. Implements both
  /// 32bit and 64bit scalar division.
  ///
  /// Replace Div with generated code.
  bool expandDivision(BinaryOperator* Div);

  /// Generate code to calculate the remainder of two integers, replacing Rem
  /// with the generated code. Uses ExpandReminder with a 32bit Rem which
  /// makes it useful for targets with little or no support for less than
  /// 32 bit arithmetic.
  ///
  /// Replace Rem with generated code.
  bool expandRemainderUpTo32Bits(BinaryOperator *Rem);

  /// Generate code to calculate the remainder of two integers, replacing Rem
  /// with the generated code. Uses ExpandReminder with a 64bit Rem.
  ///
  /// Replace Rem with generated code.
  bool expandRemainderUpTo64Bits(BinaryOperator *Rem);

  /// Generate code to divide two integers, replacing Div with the generated
  /// code. Uses ExpandDivision with a 32bit Div which makes it useful for
  /// targets with little or no support for less than 32 bit arithmetic.
  ///
  /// Replace Rem with generated code.
  bool expandDivisionUpTo32Bits(BinaryOperator *Div);

  /// Generate code to divide two integers, replacing Div with the generated
  /// code. Uses ExpandDivision with a 64bit Div.
  ///
  /// Replace Rem with generated code.
  bool expandDivisionUpTo64Bits(BinaryOperator *Div);

} // End llvm namespace

#endif
