From b9af592dfa8f8d0fe9f29c2d48bf6846cbd5c50f Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Wed, 28 Sep 2011 17:37:56 -0700 Subject: [PATCH] i965: Reverse the operands for INT DIV prior to Gen6. Apparently on Gen4 and 5, the denominator comes first. Signed-off-by: Kenneth Graunke Tested-by: Ian Romanick Reviewed-by: Ian Romanick Reviewed-by: Eric Anholt --- src/mesa/drivers/dri/i965/brw_fs.cpp | 17 +++++++++++++++-- src/mesa/drivers/dri/i965/brw_vec4_emit.cpp | 17 +++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 1d93a51a8d1..20001807b1e 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -610,8 +610,21 @@ fs_visitor::emit_math(enum opcode opcode, fs_reg dst, fs_reg src0, fs_reg src1) inst = emit(opcode, dst, src0, src1); } else { - emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + 1, src1.type), src1); - inst = emit(opcode, dst, src0, reg_null_f); + /* From the Ironlake PRM, Volume 4, Part 1, Section 6.1.13 + * "Message Payload": + * + * "Operand0[7]. For the INT DIV functions, this operand is the + * denominator." + * ... + * "Operand1[7]. For the INT DIV functions, this operand is the + * numerator." + */ + bool is_int_div = opcode != SHADER_OPCODE_POW; + fs_reg &op0 = is_int_div ? src1 : src0; + fs_reg &op1 = is_int_div ? src0 : src1; + + emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + 1, op1.type), op1); + inst = emit(opcode, dst, op0, reg_null_f); inst->base_mrf = base_mrf; inst->mlen = 2 * c->dispatch_width / 8; diff --git a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp index c080dfd48b4..5cbbda818cd 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp @@ -307,14 +307,27 @@ vec4_visitor::generate_math2_gen4(vec4_instruction *inst, struct brw_reg src0, struct brw_reg src1) { - brw_MOV(p, retype(brw_message_reg(inst->base_mrf + 1), src1.type), src1); + /* From the Ironlake PRM, Volume 4, Part 1, Section 6.1.13 + * "Message Payload": + * + * "Operand0[7]. For the INT DIV functions, this operand is the + * denominator." + * ... + * "Operand1[7]. For the INT DIV functions, this operand is the + * numerator." + */ + bool is_int_div = inst->opcode != SHADER_OPCODE_POW; + struct brw_reg &op0 = is_int_div ? src1 : src0; + struct brw_reg &op1 = is_int_div ? src0 : src1; + + brw_MOV(p, retype(brw_message_reg(inst->base_mrf + 1), op1.type), op1); brw_math(p, dst, brw_math_function(inst->opcode), BRW_MATH_SATURATE_NONE, inst->base_mrf, - src0, + op0, BRW_MATH_DATA_VECTOR, BRW_MATH_PRECISION_FULL); } -- 2.30.2