From: Iago Toral Quiroga Date: Thu, 13 Aug 2015 22:34:24 +0000 (-0700) Subject: i965/vec4/nir: implement double comparisons X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8cdbbbd2cf9e0c42114c7090805fa2b4a93ca499;p=mesa.git i965/vec4/nir: implement double comparisons v2: - Added newline before if() (Matt) Reviewed-by: Matt Turner --- diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp index 835ebdfb00a..d5c199c8123 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp @@ -1394,10 +1394,26 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr) case nir_op_flt: case nir_op_fge: case nir_op_feq: - case nir_op_fne: - emit(CMP(dst, op[0], op[1], - brw_conditional_for_nir_comparison(instr->op))); + case nir_op_fne: { + enum brw_conditional_mod conditional_mod = + brw_conditional_for_nir_comparison(instr->op); + + if (nir_src_bit_size(instr->src[0].src) < 64) { + emit(CMP(dst, op[0], op[1], conditional_mod)); + } else { + /* Produce a 32-bit boolean result from the DF comparison by selecting + * only the low 32-bit in each DF produced. Do this in a temporary + * so we can then move from there to the result using align16 again + * to honor the original writemask. + */ + dst_reg temp = dst_reg(this, glsl_type::dvec4_type); + emit(CMP(temp, op[0], op[1], conditional_mod)); + dst_reg result = dst_reg(this, glsl_type::bvec4_type); + emit(VEC4_OPCODE_PICK_LOW_32BIT, result, src_reg(temp)); + emit(MOV(dst, src_reg(result))); + } break; + } case nir_op_ball_iequal2: case nir_op_ball_iequal3: