From: Matt Turner Date: Wed, 7 Jan 2015 19:52:05 +0000 (-0800) Subject: i965: Set CMP's destination type to src0's type. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6b3a301f611c9aabc090522951eda589e8302562;p=mesa.git 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 --- diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 0ada5837cfd..2046eba354a 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -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 * 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 - * result as if it was the dst type with no conversion, which happens to - * mostly work out for float-interpreted-as-int since our comparisons are - * for >0, =0, <0. + * + * 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; - if (dst.file == HW_REG) - dst.fixed_hw_reg.type = dst.type; - } + dst.type = src0.type; + if (dst.file == HW_REG) + dst.fixed_hw_reg.type = dst.type; resolve_ud_negate(&src0); resolve_ud_negate(&src1); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 8129118e28d..e6a7ed06020 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -222,15 +222,19 @@ vec4_visitor::CMP(dst_reg dst, src_reg src0, src_reg src1, { vec4_instruction *inst; - /* original gen4 does type conversion to the destination type - * before before comparison, producing garbage results for floating - * point comparisons. + /* Take the instruction: + * + * CMP null src0 src1 + * + * 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; - if (dst.file == HW_REG) - dst.fixed_hw_reg.type = dst.type; - } + dst.type = src0.type; + if (dst.file == HW_REG) + dst.fixed_hw_reg.type = dst.type; resolve_ud_negate(&src0); resolve_ud_negate(&src1);