[Mesa-dev] [PATCH 1/2] glsl: add lowering passes for carry/borrow

Matt Turner mattst88 at gmail.com
Mon Apr 28 21:37:38 PDT 2014


On Mon, Apr 28, 2014 at 8:17 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>
> It didn't seem useful to add 2 separate lowering flags. I can't really imagine
> wanting to lower one but not the other.

I'd prefer to just have two flags.

> Also, this is my first foray into the GLSL compiler, so please look out for
> noob mistakes. This did pass piglit tests though.
>
>  src/glsl/ir_optimization.h      |  1 +
>  src/glsl/lower_instructions.cpp | 55 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 56 insertions(+)
>
> diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h
> index 40bb613..5f0267d 100644
> --- a/src/glsl/ir_optimization.h
> +++ b/src/glsl/ir_optimization.h
> @@ -38,6 +38,7 @@
>  #define INT_DIV_TO_MUL_RCP 0x40
>  #define BITFIELD_INSERT_TO_BFM_BFI 0x80
>  #define LDEXP_TO_ARITH     0x100
> +#define CARRY_TO_ARITH     0x200
>
>  /**
>   * \see class lower_packing_builtins_visitor
> diff --git a/src/glsl/lower_instructions.cpp b/src/glsl/lower_instructions.cpp
> index 49316d0..ecbda96 100644
> --- a/src/glsl/lower_instructions.cpp
> +++ b/src/glsl/lower_instructions.cpp
> @@ -39,6 +39,7 @@
>   * - MOD_TO_FRACT
>   * - LDEXP_TO_ARITH
>   * - BITFIELD_INSERT_TO_BFM_BFI
> + * - CARRY_TO_ARITH
>   *
>   * SUB_TO_ADD_NEG:
>   * ---------------
> @@ -91,6 +92,10 @@
>   * Breaks ir_quadop_bitfield_insert into ir_binop_bfm (bitfield mask) and
>   * ir_triop_bfi (bitfield insert).
>   *
> + * CARRY_TO_ARITH:
> + * ---------------
> + * Converts ir_carry and ir_borrow into (x + y) > x and (x < y)
> + *
>   * Many GPUs implement the bitfieldInsert() built-in from ARB_gpu_shader_5
>   * with a pair of instructions.
>   *
> @@ -127,6 +132,8 @@ private:
>     void log_to_log2(ir_expression *);
>     void bitfield_insert_to_bfm_bfi(ir_expression *);
>     void ldexp_to_arith(ir_expression *);
> +   void carry_to_arith(ir_expression *);
> +   void borrow_to_arith(ir_expression *);
>  };
>
>  } /* anonymous namespace */
> @@ -436,6 +443,44 @@ lower_instructions_visitor::ldexp_to_arith(ir_expression *ir)
>     this->progress = true;
>  }
>
> +void
> +lower_instructions_visitor::carry_to_arith(ir_expression *ir)
> +{
> +   /* Translates
> +    *   ir_binop_carry x y
> +    * into
> +    *   sum = ir_binop_add x y
> +    *   bcarry = ir_binop_less sum x
> +    *   carry = ir_unop_b2i bcarry
> +    */
> +
> +   ir_rvalue *x_clone = ir->operands[0]->clone(ir, NULL);
> +   ir->operation = ir_unop_i2u;
> +   ir->operands[0] = b2i(less(
> +         add(ir->operands[0], ir->operands[1]),
> +         x_clone));

Weird indentation.

With another flag, better indentation, and fixed descriptions

Reviewed-by: Matt Turner <mattst88 at gmail.com>


More information about the mesa-dev mailing list