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;
}
Example #2
0
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;
}
Example #3
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));
}