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