Halide 19.0.0
Halide compiler and libraries
Loading...
Searching...
No Matches
FastIntegerDivide.h
Go to the documentation of this file.
1#ifndef HALIDE_FAST_INTEGER_DIVIDE_H
2#define HALIDE_FAST_INTEGER_DIVIDE_H
3
4#include "Buffer.h"
5#include "Expr.h"
6
7namespace Halide {
8
9/** Integer division by small values can be done exactly as multiplies
10 * and shifts. This function does integer division for numerators of
11 * various integer types (8, 16, 32 bit signed and unsigned)
12 * numerators and uint8 denominators. The type of the result is the
13 * type of the numerator. The unsigned version is faster than the
14 * signed version, so cast the numerator to an unsigned int if you
15 * know it's positive.
16 *
17 * If your divisor is compile-time constant, Halide performs a
18 * slightly better optimization automatically, so there's no need to
19 * use this function (but it won't hurt).
20 *
21 * This function vectorizes well on arm, and well on x86 for 16 and 8
22 * bit vectors. For 32-bit vectors on x86 you're better off using
23 * native integer division.
24 *
25 * Also, this routine treats division by zero as division by
26 * 256. I.e. it interprets the uint8 divisor as a number from 1 to 256
27 * inclusive.
28 */
29Expr fast_integer_divide(const Expr &numerator, const Expr &denominator);
30
31/** A variant of the above which rounds towards zero instead of rounding towards
32 * negative infinity. */
33Expr fast_integer_divide_round_to_zero(const Expr &numerator, const Expr &denominator);
34
35/** Use the fast integer division tables to implement a modulo
36 * operation via the Euclidean identity: a%b = a - (a/b)*b
37 */
38Expr fast_integer_modulo(const Expr &numerator, const Expr &denominator);
39
40} // namespace Halide
41
42#endif
Base classes for Halide expressions (Halide::Expr) and statements (Halide::Internal::Stmt)
This file defines the class FunctionDAG, which is our representation of a Halide pipeline,...
Expr fast_integer_modulo(const Expr &numerator, const Expr &denominator)
Use the fast integer division tables to implement a modulo operation via the Euclidean identity: ab =...
Expr fast_integer_divide(const Expr &numerator, const Expr &denominator)
Integer division by small values can be done exactly as multiplies and shifts.
Expr fast_integer_divide_round_to_zero(const Expr &numerator, const Expr &denominator)
A variant of the above which rounds towards zero instead of rounding towards negative infinity.
A fragment of Halide syntax.
Definition Expr.h:258