X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fpanfrost%2Futil%2Flcra.c;h=d922972b6196c001ae04f46a364ba064e75da472;hb=c8ac01af33a5bc63822915f08f89a7dbaf7d433f;hp=0e30c1d10829fe59efe69a6c919ae50e33ff6136;hpb=0737080ba611f6703a2cec5f4aa3389fc42338a4;p=mesa.git diff --git a/src/panfrost/util/lcra.c b/src/panfrost/util/lcra.c index 0e30c1d1082..d922972b619 100644 --- a/src/panfrost/util/lcra.c +++ b/src/panfrost/util/lcra.c @@ -41,14 +41,12 @@ struct lcra_state * lcra_alloc_equations( - unsigned node_count, - unsigned bound, unsigned class_count) + unsigned node_count, unsigned class_count) { struct lcra_state *l = calloc(1, sizeof(*l)); l->node_count = node_count; l->class_count = class_count; - l->bound = bound; l->alignment = calloc(sizeof(l->alignment[0]), node_count); l->linear = calloc(sizeof(l->linear[0]), node_count * node_count); @@ -85,9 +83,9 @@ lcra_free(struct lcra_state *l) } void -lcra_set_alignment(struct lcra_state *l, unsigned node, unsigned align_log2) +lcra_set_alignment(struct lcra_state *l, unsigned node, unsigned align_log2, unsigned bound) { - l->alignment[node] = align_log2 + 1; + l->alignment[node] = (align_log2 + 1) | (bound << 16); } void @@ -100,8 +98,12 @@ lcra_set_disjoint_class(struct lcra_state *l, unsigned c1, unsigned c2) void lcra_restrict_range(struct lcra_state *l, unsigned node, unsigned len) { - if (node < l->node_count && l->alignment[node]) - l->modulus[node] = DIV_ROUND_UP(l->bound - len + 1, 1 << (l->alignment[node] - 1)); + if (node < l->node_count && l->alignment[node]) { + unsigned BA = l->alignment[node]; + unsigned alignment = (BA & 0xffff) - 1; + unsigned bound = BA >> 16; + l->modulus[node] = DIV_ROUND_UP(bound - len + 1, 1 << alignment); + } } void @@ -163,9 +165,11 @@ lcra_solve(struct lcra_state *l) unsigned _class = l->class[step]; unsigned class_start = l->class_start[_class]; - unsigned shift = l->alignment[step] - 1; + unsigned BA = l->alignment[step]; + unsigned shift = (BA & 0xffff) - 1; + unsigned bound = BA >> 16; - unsigned P = l->bound >> shift; + unsigned P = bound >> shift; unsigned Q = l->modulus[step]; unsigned r_max = l->class_size[_class]; unsigned k_max = r_max >> shift;