[Mesa-dev] [PATCH] glsl: Use a separate div_to_mul_rcp lowering flag for integers.
eric at anholt.net
Mon Aug 29 10:28:09 PDT 2011
On Sun, 28 Aug 2011 20:51:10 -0500, Bryan Cain <bryancain3 at gmail.com> wrote:
> On 08/28/2011 07:38 PM, Eric Anholt wrote:
> > On Sat, 27 Aug 2011 20:18:55 -0700, Kenneth Graunke <kenneth at whitecape.org> wrote:
> >> From: Bryan Cain <bryancain3 at gmail.com>
> >> Using multiply and reciprocal for integer division involves potentially
> >> lossy floating point conversions. This is okay for older GPUs that
> >> represent integers as floating point, but undesirable for GPUs with
> >> native integer division instructions.
> >> TGSI, for example, has UDIV/IDIV instructions for integer division,
> >> so it makes sense to handle this directly. Likewise for i965.
> >> Signed-off-by: Bryan Cain <bryancain3 at gmail.com>
> >> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> >> ---
> >> case ir_binop_div:
> >> - if (lowering(DIV_TO_MUL_RCP))
> >> + if (lowering(INT_DIV_TO_MUL_RCP) && ir->operands->type->is_integer())
> >> + int_div_to_mul_rcp(ir);
> >> + else if (lowering(DIV_TO_MUL_RCP))
> >> div_to_mul_rcp(ir);
> >> break;
> > Sure looks odd to me for one of these to be checking the type and ther
> > other not.
> It works, though. If it's not an integer type, it's going to be a float
Not to my reading. If ir->op->type->is_integer() &&
!lowering(INT_DIV_TO_MULL_RCP) && lowering(DIV_TO_MUL_RCP), then
assert(ir->operands->type->is_float()) should fail.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Size: 197 bytes
Desc: not available
More information about the mesa-dev