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

Allows CMP instructions with float sources to be compacted and coissued.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Matt Turner
2015-01-07 11:52:05 -08:00
parent 7e60794392
commit 6b3a301f61
2 changed files with 18 additions and 18 deletions
+6 -10
View File
@@ -339,17 +339,13 @@ fs_visitor::CMP(fs_reg dst, fs_reg src0, fs_reg src1,
* *
* Original gen4 does type conversion to the destination type before * Original gen4 does type conversion to the destination type before
* comparison, producing garbage results for floating point comparisons. * comparison, producing garbage results for floating point comparisons.
* gen5 does the comparison on the execution type (resolved source types), *
* so dst type doesn't matter. gen6 does comparison and then uses the * The destination type doesn't matter on newer generations, so we set the
* result as if it was the dst type with no conversion, which happens to * type to match src0 so we can compact the instruction.
* mostly work out for float-interpreted-as-int since our comparisons are
* for >0, =0, <0.
*/ */
if (brw->gen == 4) { dst.type = src0.type;
dst.type = src0.type; if (dst.file == HW_REG)
if (dst.file == HW_REG) dst.fixed_hw_reg.type = dst.type;
dst.fixed_hw_reg.type = dst.type;
}
resolve_ud_negate(&src0); resolve_ud_negate(&src0);
resolve_ud_negate(&src1); resolve_ud_negate(&src1);
+12 -8
View File
@@ -222,15 +222,19 @@ vec4_visitor::CMP(dst_reg dst, src_reg src0, src_reg src1,
{ {
vec4_instruction *inst; vec4_instruction *inst;
/* original gen4 does type conversion to the destination type /* Take the instruction:
* before before comparison, producing garbage results for floating *
* point comparisons. * CMP null<d> src0<f> src1<f>
*
* Original gen4 does type conversion to the destination type before
* comparison, producing garbage results for floating point comparisons.
*
* The destination type doesn't matter on newer generations, so we set the
* type to match src0 so we can compact the instruction.
*/ */
if (brw->gen == 4) { dst.type = src0.type;
dst.type = src0.type; if (dst.file == HW_REG)
if (dst.file == HW_REG) dst.fixed_hw_reg.type = dst.type;
dst.fixed_hw_reg.type = dst.type;
}
resolve_ud_negate(&src0); resolve_ud_negate(&src0);
resolve_ud_negate(&src1); resolve_ud_negate(&src1);