i965/fs: Constant-fold immediates in src0 of CMP instructions.

This is like what we do with add/mul, but we also have to flip the
conditional test.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Eric Anholt
2011-04-09 08:22:42 -10:00
parent 756c262756
commit 811c147220
3 changed files with 45 additions and 0 deletions
+22
View File
@@ -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
+2
View File
@@ -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);
+21
View File
@@ -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;
}
}