-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 04/09/2011 10:08 PM, Eric Anholt wrote: > This is like what we do with add/mul, but we also have to flip the > conditional test.
I assume this passes full piglit runs? If so, Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/mesa/drivers/dri/i965/brw_eu.c | 22 ++++++++++++++++++++++ > src/mesa/drivers/dri/i965/brw_eu.h | 2 ++ > src/mesa/drivers/dri/i965/brw_fs.cpp | 21 +++++++++++++++++++++ > 3 files changed, 45 insertions(+), 0 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_eu.c > b/src/mesa/drivers/dri/i965/brw_eu.c > index 3b5c4c0..b59d6b2 100644 > --- a/src/mesa/drivers/dri/i965/brw_eu.c > +++ b/src/mesa/drivers/dri/i965/brw_eu.c > @@ -34,6 +34,28 @@ > #include "brw_defines.h" > #include "brw_eu.h" > > +/* Returns the corresponding conditional mod for swapping src0 and > + * src1 in e.g. CMP. > + */ > +uint32_t > +brw_swap_cmod(uint32_t cmod) > +{ > + switch (cmod) { > + case BRW_CONDITIONAL_Z: > + case BRW_CONDITIONAL_NZ: > + return cmod; > + case BRW_CONDITIONAL_G: > + return BRW_CONDITIONAL_LE; > + case BRW_CONDITIONAL_GE: > + return BRW_CONDITIONAL_L; > + case BRW_CONDITIONAL_L: > + return BRW_CONDITIONAL_GE; > + case BRW_CONDITIONAL_LE: > + return BRW_CONDITIONAL_G; > + default: > + return ~0; > + } > +} > > > /* How does predicate control work when execution_size != 8? Do I > diff --git a/src/mesa/drivers/dri/i965/brw_eu.h > b/src/mesa/drivers/dri/i965/brw_eu.h > index 2d2ed9d..c2e59c1 100644 > --- a/src/mesa/drivers/dri/i965/brw_eu.h > +++ b/src/mesa/drivers/dri/i965/brw_eu.h > @@ -1017,6 +1017,8 @@ void brw_set_src1( struct brw_instruction *insn, > > void brw_set_uip_jip(struct brw_compile *p); > > +uint32_t brw_swap_cmod(uint32_t cmod); > + > /* brw_optimize.c */ > void brw_optimize(struct brw_compile *p); > void brw_remove_duplicate_mrf_moves(struct brw_compile *p); > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp > b/src/mesa/drivers/dri/i965/brw_fs.cpp > index 99cd8f8..128bbe9 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp > @@ -2938,12 +2938,33 @@ fs_visitor::propagate_constants() > progress = true; > } > break; > + > case BRW_OPCODE_CMP: > + if (i == 1) { > + scan_inst->src[i] = inst->src[0]; > + progress = true; > + } else if (i == 0 && scan_inst->src[1].file != IMM) { > + uint32_t new_cmod; > + > + new_cmod = brw_swap_cmod(scan_inst->conditional_mod); > + if (new_cmod != ~0u) { > + /* Fit this constant in by swapping the operands and > + * flipping the test > + */ > + scan_inst->src[0] = scan_inst->src[1]; > + scan_inst->src[1] = inst->src[0]; > + scan_inst->conditional_mod = new_cmod; > + progress = true; > + } > + } > + break; > + > case BRW_OPCODE_SEL: > if (i == 1) { > scan_inst->src[i] = inst->src[0]; > progress = true; > } > + break; > } > } > -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iEYEARECAAYFAk2jKOEACgkQX1gOwKyEAw+wygCeMmR7rx58Cc7iieWWof5GmFRz FnYAn2DY7d1FsFhoTPQ48NmtcVHuUBa0 =U+wk -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev