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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user