[Mesa-dev] [PATCH] i965/fs: Reimplement nir_op_uadd_carry and _usub_borrow without accumulator.

Ilia Mirkin imirkin at alum.mit.edu
Thu Jul 9 12:52:08 PDT 2015


FYI there's already a lowering pass that does this in the GLSL IR
(CARRY_TO_ARITH in lower_instructions). Perhaps the right place to do
this is NIR though, just wanted to let you know.

On Thu, Jul 9, 2015 at 3:51 PM, Francisco Jerez <currojerez at riseup.net> wrote:
> This gets rid of two no16() fall-backs and should allow better
> scheduling of the generated IR.  There are no uses of usubBorrow() or
> uaddCarry() in shader-db so no changes are expected.  However the
> "arb_gpu_shader5/execution/built-in-functions/fs-usubBorrow" and
> "arb_gpu_shader5/execution/built-in-functions/fs-uaddCarry" piglit
> tests go from 40 to 28 instructions.  The reason is that the plain ADD
> instruction can easily be CSE'ed with the original addition, and the
> negation can easily be propagated into the source modifier of another
> instruction, so effectively both operations can be performed with just
> one instruction.
>
> No piglit regressions.
> ---
>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 33 +++++++++++++-------------------
>  1 file changed, 13 insertions(+), 20 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index 6d9e9d3..3b6aa0a 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -829,29 +829,22 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)
>        bld.emit(SHADER_OPCODE_INT_QUOTIENT, result, op[0], op[1]);
>        break;
>
> -   case nir_op_uadd_carry: {
> -      if (devinfo->gen >= 7)
> -         no16("SIMD16 explicit accumulator operands unsupported\n");
> -
> -      struct brw_reg acc = retype(brw_acc_reg(dispatch_width),
> -                                  BRW_REGISTER_TYPE_UD);
> -
> -      bld.ADDC(bld.null_reg_ud(), op[0], op[1]);
> -      bld.MOV(result, fs_reg(acc));
> +   case nir_op_uadd_carry:
> +      /* Use signed operands for the ADD to be easily CSE'ed with the original
> +       * addition (e.g. in case we're implementing the uaddCarry() GLSL
> +       * built-in).
> +       */
> +      bld.ADD(result, retype(op[0], BRW_REGISTER_TYPE_D),
> +              retype(op[1], BRW_REGISTER_TYPE_D));
> +      bld.CMP(result, retype(result, BRW_REGISTER_TYPE_UD), op[0],
> +              BRW_CONDITIONAL_L);
> +      bld.MOV(result, negate(result));
>        break;
> -   }
>
> -   case nir_op_usub_borrow: {
> -      if (devinfo->gen >= 7)
> -         no16("SIMD16 explicit accumulator operands unsupported\n");
> -
> -      struct brw_reg acc = retype(brw_acc_reg(dispatch_width),
> -                                  BRW_REGISTER_TYPE_UD);
> -
> -      bld.SUBB(bld.null_reg_ud(), op[0], op[1]);
> -      bld.MOV(result, fs_reg(acc));
> +   case nir_op_usub_borrow:
> +      bld.CMP(result, op[0], op[1], BRW_CONDITIONAL_L);
> +      bld.MOV(result, negate(result));
>        break;
> -   }
>
>     case nir_op_umod:
>        bld.emit(SHADER_OPCODE_INT_REMAINDER, result, op[0], op[1]);
> --
> 2.4.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list