[Mesa-dev] [PATCH 3.5/5] i965/fs: Add unit tests for "Handle CMP.nz ... 0 and AND.nz ... 1 similarly in cmod propagation"

Matt Turner mattst88 at gmail.com
Tue Mar 17 11:30:23 PDT 2015


On Tue, Mar 17, 2015 at 10:30 AM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> This change should get squashed with the afore mentioned change.  Tests
> suggested by Matt.
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Cc: Matt Turner <mattst88 at gmail.com>
> ---
>  .../drivers/dri/i965/test_fs_cmod_propagation.cpp  | 105 +++++++++++++++++++++
>  1 files changed, 105 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/test_fs_cmod_propagation.cpp b/src/mesa/drivers/dri/i965/test_fs_cmod_propagation.cpp
> index cb92abf..8c6ff09 100644
> --- a/src/mesa/drivers/dri/i965/test_fs_cmod_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/test_fs_cmod_propagation.cpp
> @@ -449,3 +449,108 @@ TEST_F(cmod_propagation_test, different_types_cmod_with_zero)
>     EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 1)->opcode);
>     EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 1)->conditional_mod);
>  }
> +
> +TEST_F(cmod_propagation_test, andnz_one)
> +{
> +   fs_reg dest = v->vgrf(glsl_type::int_type);
> +   fs_reg src0 = v->vgrf(glsl_type::float_type);
> +   fs_reg zero(0.0f);
> +   fs_reg one(int(1));
> +
> +   v->emit(BRW_OPCODE_CMP, retype(dest, BRW_REGISTER_TYPE_F), src0, zero)
> +      ->conditional_mod = BRW_CONDITIONAL_L;
> +   v->emit(BRW_OPCODE_AND, v->reg_null_f, dest, one)
> +      ->conditional_mod = BRW_CONDITIONAL_NZ;
> +
> +   /* = Before =
> +    * 0: cmp.l.f0(8)     dest:D  src0:F  0F

We won't be emitting compares with different source and destination types since

commit 6b3a301f611c9aabc090522951eda589e8302562
Author: Matt Turner <mattst88 at gmail.com>
Date:   Wed Jan 7 11:52:05 2015 -0800

    i965: Set CMP's destination type to src0's type.

so let's change this comment (I see that the actual code is already
retype()ing the dest). Same applies to the two below.

> +    * 1: and.nz.f0(8)    null:D  dest:D  1D
> +    *
> +    * = After =
> +    * 0: cmp.l.f0(8)     dest:D  src0:F  0F

and here.

> +    */
> +
> +   v->calculate_cfg();
> +   bblock_t *block0 = v->cfg->blocks[0];
> +
> +   EXPECT_EQ(0, block0->start_ip);
> +   EXPECT_EQ(1, block0->end_ip);
> +
> +   EXPECT_TRUE(cmod_propagation(v));
> +   EXPECT_EQ(0, block0->start_ip);
> +   EXPECT_EQ(0, block0->end_ip);
> +   EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 0)->opcode);
> +   EXPECT_EQ(BRW_CONDITIONAL_L, instruction(block0, 0)->conditional_mod);
> +   EXPECT_TRUE(retype(dest, BRW_REGISTER_TYPE_F)
> +               .equals(instruction(block0, 0)->dst));
> +}
> +
> +TEST_F(cmod_propagation_test, andnz_non_one)
> +{
> +   fs_reg dest = v->vgrf(glsl_type::int_type);
> +   fs_reg src0 = v->vgrf(glsl_type::float_type);
> +   fs_reg zero(0.0f);
> +   fs_reg nonone(int(38));

Can just pass 38 here if you want.

> +
> +   v->emit(BRW_OPCODE_CMP, retype(dest, BRW_REGISTER_TYPE_F), src0, zero)
> +      ->conditional_mod = BRW_CONDITIONAL_L;
> +   v->emit(BRW_OPCODE_AND, v->reg_null_f, dest, nonone)
> +      ->conditional_mod = BRW_CONDITIONAL_NZ;
> +
> +   /* = Before =
> +    * 0: cmp.l.f0(8)     dest:D  src0:F  0F
> +    * 1: and.nz.f0(8)    null:D  dest:D  1D

s/1D/38D/

with the comments fixed,

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

Thanks Ian!


More information about the mesa-dev mailing list