Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- llvm/Transforms/Utils/IntegerDivision.h ------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file contains an implementation of 32bit and 64bit scalar integer
  10. // division for targets that don't have native support. It's largely derived
  11. // from compiler-rt's implementations of __udivsi3 and __udivmoddi4,
  12. // but hand-tuned for targets that prefer less control flow.
  13. //
  14. //===----------------------------------------------------------------------===//
  15.  
  16. #ifndef LLVM_TRANSFORMS_UTILS_INTEGERDIVISION_H
  17. #define LLVM_TRANSFORMS_UTILS_INTEGERDIVISION_H
  18.  
  19. namespace llvm {
  20.   class BinaryOperator;
  21. }
  22.  
  23. namespace llvm {
  24.  
  25.   /// Generate code to calculate the remainder of two integers, replacing Rem
  26.   /// with the generated code. This currently generates code using the udiv
  27.   /// expansion, but future work includes generating more specialized code,
  28.   /// e.g. when more information about the operands are known. Implements both
  29.   /// 32bit and 64bit scalar division.
  30.   ///
  31.   /// Replace Rem with generated code.
  32.   bool expandRemainder(BinaryOperator *Rem);
  33.  
  34.   /// Generate code to divide two integers, replacing Div with the generated
  35.   /// code. This currently generates code similarly to compiler-rt's
  36.   /// implementations, but future work includes generating more specialized code
  37.   /// when more information about the operands are known. Implements both
  38.   /// 32bit and 64bit scalar division.
  39.   ///
  40.   /// Replace Div with generated code.
  41.   bool expandDivision(BinaryOperator* Div);
  42.  
  43.   /// Generate code to calculate the remainder of two integers, replacing Rem
  44.   /// with the generated code. Uses ExpandReminder with a 32bit Rem which
  45.   /// makes it useful for targets with little or no support for less than
  46.   /// 32 bit arithmetic.
  47.   ///
  48.   /// Replace Rem with generated code.
  49.   bool expandRemainderUpTo32Bits(BinaryOperator *Rem);
  50.  
  51.   /// Generate code to calculate the remainder of two integers, replacing Rem
  52.   /// with the generated code. Uses ExpandReminder with a 64bit Rem.
  53.   ///
  54.   /// Replace Rem with generated code.
  55.   bool expandRemainderUpTo64Bits(BinaryOperator *Rem);
  56.  
  57.   /// Generate code to divide two integers, replacing Div with the generated
  58.   /// code. Uses ExpandDivision with a 32bit Div which makes it useful for
  59.   /// targets with little or no support for less than 32 bit arithmetic.
  60.   ///
  61.   /// Replace Rem with generated code.
  62.   bool expandDivisionUpTo32Bits(BinaryOperator *Div);
  63.  
  64.   /// Generate code to divide two integers, replacing Div with the generated
  65.   /// code. Uses ExpandDivision with a 64bit Div.
  66.   ///
  67.   /// Replace Rem with generated code.
  68.   bool expandDivisionUpTo64Bits(BinaryOperator *Div);
  69.  
  70. } // End llvm namespace
  71.  
  72. #endif
  73.