1d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//===- llvm/Transforms/Utils/IntegerDivision.h ------------------*- C++ -*-===//
2d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//
3d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//                     The LLVM Compiler Infrastructure
4d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//
5d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman// This file is distributed under the University of Illinois Open Source
6d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman// License. See LICENSE.TXT for details.
7d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//
8d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//===----------------------------------------------------------------------===//
9d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file contains an implementation of 32bit and 64bit scalar integer
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// division for targets that don't have native support. It's largely derived
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// from compiler-rt's implementations of __udivsi3 and __udivmoddi4,
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// but hand-tuned for targets that prefer less control flow.
14d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//
15d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman//===----------------------------------------------------------------------===//
16d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman
17674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_TRANSFORMS_UTILS_INTEGERDIVISION_H
18674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_TRANSFORMS_UTILS_INTEGERDIVISION_H
19d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman
20d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilsemannamespace llvm {
214c8f2dd6ab5b877de63568b56d542f845a8a3ca8Michael Ilseman  class BinaryOperator;
224c8f2dd6ab5b877de63568b56d542f845a8a3ca8Michael Ilseman}
234c8f2dd6ab5b877de63568b56d542f845a8a3ca8Michael Ilseman
244c8f2dd6ab5b877de63568b56d542f845a8a3ca8Michael Ilsemannamespace llvm {
25d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman
26b55462bcfb9acbf8654dff83159daf695dfc3ec4Michael Ilseman  /// Generate code to calculate the remainder of two integers, replacing Rem
27b55462bcfb9acbf8654dff83159daf695dfc3ec4Michael Ilseman  /// with the generated code. This currently generates code using the udiv
28b55462bcfb9acbf8654dff83159daf695dfc3ec4Michael Ilseman  /// expansion, but future work includes generating more specialized code,
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// e.g. when more information about the operands are known. Implements both
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// 32bit and 64bit scalar division.
31b55462bcfb9acbf8654dff83159daf695dfc3ec4Michael Ilseman  ///
32b55462bcfb9acbf8654dff83159daf695dfc3ec4Michael Ilseman  /// @brief Replace Rem with generated code.
33b55462bcfb9acbf8654dff83159daf695dfc3ec4Michael Ilseman  bool expandRemainder(BinaryOperator *Rem);
34b55462bcfb9acbf8654dff83159daf695dfc3ec4Michael Ilseman
3516514de50a7936950845a3851cae8ce571e0c2c2Michael Ilseman  /// Generate code to divide two integers, replacing Div with the generated
3616514de50a7936950845a3851cae8ce571e0c2c2Michael Ilseman  /// code. This currently generates code similarly to compiler-rt's
3716514de50a7936950845a3851cae8ce571e0c2c2Michael Ilseman  /// implementations, but future work includes generating more specialized code
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// when more information about the operands are known. Implements both
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// 32bit and 64bit scalar division.
4016514de50a7936950845a3851cae8ce571e0c2c2Michael Ilseman  ///
4116514de50a7936950845a3851cae8ce571e0c2c2Michael Ilseman  /// @brief Replace Div with generated code.
42d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman  bool expandDivision(BinaryOperator* Div);
43d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman
44b3201c5cf1e183d840f7c99ff779d57f1549d8e5Pedro Artigas  /// Generate code to calculate the remainder of two integers, replacing Rem
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// with the generated code. Uses ExpandReminder with a 32bit Rem which
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// makes it useful for targets with little or no support for less than
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// 32 bit arithmetic.
48b3201c5cf1e183d840f7c99ff779d57f1549d8e5Pedro Artigas  ///
49b3201c5cf1e183d840f7c99ff779d57f1549d8e5Pedro Artigas  /// @brief Replace Rem with generated code.
50b3201c5cf1e183d840f7c99ff779d57f1549d8e5Pedro Artigas  bool expandRemainderUpTo32Bits(BinaryOperator *Rem);
51b3201c5cf1e183d840f7c99ff779d57f1549d8e5Pedro Artigas
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Generate code to calculate the remainder of two integers, replacing Rem
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// with the generated code. Uses ExpandReminder with a 64bit Rem.
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @brief Replace Rem with generated code.
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool expandRemainderUpTo64Bits(BinaryOperator *Rem);
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Generate code to divide two integers, replacing Div with the generated
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// code. Uses ExpandDivision with a 32bit Div which makes it useful for
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// targets with little or no support for less than 32 bit arithmetic.
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
62b3201c5cf1e183d840f7c99ff779d57f1549d8e5Pedro Artigas  /// @brief Replace Rem with generated code.
63b3201c5cf1e183d840f7c99ff779d57f1549d8e5Pedro Artigas  bool expandDivisionUpTo32Bits(BinaryOperator *Div);
64b3201c5cf1e183d840f7c99ff779d57f1549d8e5Pedro Artigas
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Generate code to divide two integers, replacing Div with the generated
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// code. Uses ExpandDivision with a 64bit Div.
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ///
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// @brief Replace Rem with generated code.
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool expandDivisionUpTo64Bits(BinaryOperator *Div);
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
71d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman} // End llvm namespace
72d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman
73d2014649e0fc3c630c7530f6da060618c789d78dMichael Ilseman#endif
74