program: Use u_bit_scan64 in prog_to_nir.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 1 Feb 2019 06:02:55 +0000 (22:02 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 5 Feb 2019 21:51:50 +0000 (13:51 -0800)
We can simply iterate the bits rather than using util_last_bit and
checking each one up until that point.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/program/prog_to_nir.c

index 10ba037..0f7601a 100644 (file)
@@ -858,10 +858,9 @@ setup_registers_and_variables(struct ptn_compile *c)
    struct nir_shader *shader = b->shader;
 
    /* Create input variables. */
-   const int num_inputs = util_last_bit64(c->prog->info.inputs_read);
-   for (int i = 0; i < num_inputs; i++) {
-      if (!(c->prog->info.inputs_read & BITFIELD64_BIT(i)))
-         continue;
+   uint64_t inputs_read = c->prog->info.inputs_read;
+   while (inputs_read) {
+      const int i = u_bit_scan64(&inputs_read);
 
       nir_variable *var =
          nir_variable_create(shader, nir_var_shader_in, glsl_vec4_type(),
@@ -907,9 +906,9 @@ setup_registers_and_variables(struct ptn_compile *c)
    int max_outputs = util_last_bit(c->prog->info.outputs_written);
    c->output_regs = rzalloc_array(c, nir_register *, max_outputs);
 
-   for (int i = 0; i < max_outputs; i++) {
-      if (!(c->prog->info.outputs_written & BITFIELD64_BIT(i)))
-         continue;
+   uint64_t outputs_written = c->prog->info.outputs_written;
+   while (outputs_written) {
+      const int i = u_bit_scan64(&outputs_written);
 
       /* Since we can't load from outputs in the IR, we make temporaries
        * for the outputs and emit stores to the real outputs at the end of