Expr raise_to_integer_power(Expr e, int64_t p) { Expr result; if (p == 0) { result = make_one(e.type()); } else if (p == 1) { result = e; } else if (p < 0) { result = make_one(e.type()) / raise_to_integer_power(e, -p); } else { // p is at least 2 Expr y = raise_to_integer_power(e, p>>1); if (p & 1) result = y*y*e; else result = y*y; } return result; }
int main(int argc, char *argv[]) { int translit = 0; if (argc < 2) { printf("%s", usage_msg); exit(1); } /* skip my name */ --argc, ++argv; for (; argc; --argc, ++argv) { if (!strcasecmp(*argv, "-t")) { translit = 1; continue; } else if (!strcasecmp(*argv, "-n")) { translit = 0; continue; } make_one(*argv, translit); } return 0; }
void visit(const Variable *op) { if (op->name == var) { expr = make_one(op->type); } else if (scope.contains(op->name)) { expr = scope.get(op->name); } else { expr = make_zero(op->type); } }
Expr halide_log(Expr x_full) { Type type = x_full.type(); internal_assert(type.element_of() == Float(32)); Expr nan = Call::make(type, "nan_f32", {}, Call::PureExtern); Expr neg_inf = Call::make(type, "neg_inf_f32", {}, Call::PureExtern); Expr use_nan = x_full < 0.0f; // log of a negative returns nan Expr use_neg_inf = x_full == 0.0f; // log of zero is -inf Expr exceptional = use_nan | use_neg_inf; // Avoid producing nans or infs by generating ln(1.0f) instead and // then fixing it later. Expr patched = select(exceptional, make_one(type), x_full); Expr reduced, exponent; range_reduce_log(patched, &reduced, &exponent); // Very close to the Taylor series for log about 1, but tuned to // have minimum relative error in the reduced domain (0.75 - 1.5). float coeff[] = { 0.05111976432738144643f, -0.11793923497136414580f, 0.14971993724699017569f, -0.16862004708254804686f, 0.19980668101718729313f, -0.24991211576292837737f, 0.33333435275479328386f, -0.50000106292873236491f, 1.0f, 0.0f }; Expr x1 = reduced - 1.0f; Expr result = evaluate_polynomial(x1, coeff, sizeof(coeff)/sizeof(coeff[0])); result += cast(type, exponent) * logf(2.0); result = select(exceptional, select(use_nan, nan, neg_inf), result); // This introduces lots of common subexpressions result = common_subexpression_elimination(result); return result; }
Expr const_true(int w) { return make_one(UInt(1, w)); }