1//===- llvm/Transforms/Utils/IntegerDivision.h ------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains an implementation of 32bit integer division for targets 11// that don't have native support. It's largely derived from compiler-rt's 12// implementation of __udivsi3, but hand-tuned for targets that prefer less 13// control flow. 14// 15//===----------------------------------------------------------------------===// 16 17#ifndef TRANSFORMS_UTILS_INTEGERDIVISION_H 18#define TRANSFORMS_UTILS_INTEGERDIVISION_H 19 20namespace llvm { 21 class BinaryOperator; 22} 23 24namespace llvm { 25 26 /// Generate code to calculate the remainder of two integers, replacing Rem 27 /// with the generated code. This currently generates code using the udiv 28 /// expansion, but future work includes generating more specialized code, 29 /// e.g. when more information about the operands are known. Currently only 30 /// implements 32bit scalar division (due to udiv's limitation), but future 31 /// work is removing this limitation. 32 /// 33 /// @brief Replace Rem with generated code. 34 bool expandRemainder(BinaryOperator *Rem); 35 36 /// Generate code to divide two integers, replacing Div with the generated 37 /// code. This currently generates code similarly to compiler-rt's 38 /// implementations, but future work includes generating more specialized code 39 /// when more information about the operands are known. Currently only 40 /// implements 32bit scalar division, but future work is removing this 41 /// limitation. 42 /// 43 /// @brief Replace Div with generated code. 44 bool expandDivision(BinaryOperator* Div); 45 46} // End llvm namespace 47 48#endif 49