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