[Mesa-dev] [PATCH 48/59] nir: Enable 64-bit integer support for almost all unary and binary operations

Connor Abbott cwabbott0 at gmail.com
Thu Oct 27 03:30:53 UTC 2016


On Wed, Oct 26, 2016 at 10:52 PM, Ian Romanick <idr at freedesktop.org> wrote:
> On 10/26/2016 03:04 PM, Connor Abbott wrote:
>> On Tue, Oct 25, 2016 at 8:59 PM, Ian Romanick <idr at freedesktop.org> wrote:
>>> From: Ian Romanick <ian.d.romanick at intel.com>
>>>
>>> The shift operations are a little weird.  NIR expects both operands to
>>> have the same size, but the shift count operand is always 32-bits in
>>> GLSL.  Upconvert to make the rest of NIR happy, and we'll assume the
>>> driver back-end will do something sensible.
>>
>> TBH, that sounds like a mistake I made while doing the initial bringup
>> of sized types in NIR. It's totally legal for one input to be
>> explicitly sized while the other is unsized, so there shouldn't be any
>> problem fixing NIR to behave like GLSL does.
>
> When I did it the "obvious" way, I hit
>
> ../../src/compiler/nir/nir_builder.h:208: nir_ssa_def*
> nir_build_alu(nir_builder*, nir_op, nir_ssa_def*, nir_ssa_def*,
> nir_ssa_def*, nir_ssa_def*): Assertion `src_bit_size == bit_size' failed.
>
> I assumed that this was some fundamental thing about NIR, so I worked
> around it.  It sounds like this might just be a quirk of nir_builder,
> and that should be easy to fix.  I'll poke at it.

Huh... the logic around that assertion seems correct. It's just
checking that the bitsize of all the unsized sources match, so it
should never trigger if only one of your sources is unsized... Are you
sure you're setting the right thing to be sized? Maybe you
accidentally changed the destination instead of the source?

>
>>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>>> ---
>>>  src/compiler/glsl/glsl_to_nir.cpp | 40 +++++++++++++++++++++++++++++----------
>>>  1 file changed, 30 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp
>>> index b1c8ec6..41c2493 100644
>>> --- a/src/compiler/glsl/glsl_to_nir.cpp
>>> +++ b/src/compiler/glsl/glsl_to_nir.cpp
>>> @@ -1663,7 +1663,7 @@ nir_visitor::visit(ir_expression *ir)
>>>     case ir_binop_div:
>>>        if (type_is_float(out_type))
>>>           result = nir_fdiv(&b, srcs[0], srcs[1]);
>>> -      else if (out_type == GLSL_TYPE_INT)
>>> +      else if (out_type == GLSL_TYPE_INT || out_type == GLSL_TYPE_INT64)
>>>           result = nir_idiv(&b, srcs[0], srcs[1]);
>>>        else
>>>           result = nir_udiv(&b, srcs[0], srcs[1]);
>>> @@ -1675,7 +1675,7 @@ nir_visitor::visit(ir_expression *ir)
>>>     case ir_binop_min:
>>>        if (type_is_float(out_type))
>>>           result = nir_fmin(&b, srcs[0], srcs[1]);
>>> -      else if (out_type == GLSL_TYPE_INT)
>>> +      else if (out_type == GLSL_TYPE_INT || out_type == GLSL_TYPE_INT64)
>>>           result = nir_imin(&b, srcs[0], srcs[1]);
>>>        else
>>>           result = nir_umin(&b, srcs[0], srcs[1]);
>>> @@ -1683,7 +1683,7 @@ nir_visitor::visit(ir_expression *ir)
>>>     case ir_binop_max:
>>>        if (type_is_float(out_type))
>>>           result = nir_fmax(&b, srcs[0], srcs[1]);
>>> -      else if (out_type == GLSL_TYPE_INT)
>>> +      else if (out_type == GLSL_TYPE_INT || out_type == GLSL_TYPE_INT64)
>>>           result = nir_imax(&b, srcs[0], srcs[1]);
>>>        else
>>>           result = nir_umax(&b, srcs[0], srcs[1]);
>>> @@ -1704,10 +1704,30 @@ nir_visitor::visit(ir_expression *ir)
>>>        result = supports_ints ? nir_ixor(&b, srcs[0], srcs[1])
>>>                               : nir_fxor(&b, srcs[0], srcs[1]);
>>>        break;
>>> -   case ir_binop_lshift: result = nir_ishl(&b, srcs[0], srcs[1]); break;
>>> +   case ir_binop_lshift:
>>> +      if (out_type == GLSL_TYPE_UINT || out_type == GLSL_TYPE_INT) {
>>> +         result = nir_ishl(&b, srcs[0], srcs[1]);
>>> +      } else {
>>> +         result = nir_ishl(&b, srcs[0], nir_u2u64(&b, srcs[1]));
>>> +      }
>>> +      break;
>>>     case ir_binop_rshift:
>>> -      result = (out_type == GLSL_TYPE_INT) ? nir_ishr(&b, srcs[0], srcs[1])
>>> -                                           : nir_ushr(&b, srcs[0], srcs[1]);
>>> +      switch (out_type) {
>>> +      case GLSL_TYPE_UINT:
>>> +         result = nir_ushr(&b, srcs[0], srcs[1]);
>>> +         break;
>>> +      case GLSL_TYPE_INT:
>>> +         result = nir_ishr(&b, srcs[0], srcs[1]);
>>> +         break;
>>> +      case GLSL_TYPE_UINT64:
>>> +         result = nir_ushr(&b, srcs[0], nir_u2u64(&b, srcs[1]));
>>> +         break;
>>> +      case GLSL_TYPE_INT64:
>>> +         result = nir_ishr(&b, srcs[0], nir_u2u64(&b, srcs[1]));
>>> +         break;
>>> +      default:
>>> +         unreachable("invalid ir_binop_rshift result type");
>>> +      }
>>>        break;
>>>     case ir_binop_imul_high:
>>>        result = (out_type == GLSL_TYPE_INT) ? nir_imul_high(&b, srcs[0], srcs[1])
>>> @@ -1719,7 +1739,7 @@ nir_visitor::visit(ir_expression *ir)
>>>        if (supports_ints) {
>>>           if (type_is_float(types[0]))
>>>              result = nir_flt(&b, srcs[0], srcs[1]);
>>> -         else if (types[0] == GLSL_TYPE_INT)
>>> +         else if (types[0] == GLSL_TYPE_INT || types[0] == GLSL_TYPE_INT64)
>>>              result = nir_ilt(&b, srcs[0], srcs[1]);
>>>           else
>>>              result = nir_ult(&b, srcs[0], srcs[1]);
>>> @@ -1731,7 +1751,7 @@ nir_visitor::visit(ir_expression *ir)
>>>        if (supports_ints) {
>>>           if (type_is_float(types[0]))
>>>              result = nir_flt(&b, srcs[1], srcs[0]);
>>> -         else if (types[0] == GLSL_TYPE_INT)
>>> +         else if (types[0] == GLSL_TYPE_INT || types[0] == GLSL_TYPE_INT64)
>>>              result = nir_ilt(&b, srcs[1], srcs[0]);
>>>           else
>>>              result = nir_ult(&b, srcs[1], srcs[0]);
>>> @@ -1743,7 +1763,7 @@ nir_visitor::visit(ir_expression *ir)
>>>        if (supports_ints) {
>>>           if (type_is_float(types[0]))
>>>              result = nir_fge(&b, srcs[1], srcs[0]);
>>> -         else if (types[0] == GLSL_TYPE_INT)
>>> +         else if (types[0] == GLSL_TYPE_INT || types[0] == GLSL_TYPE_INT64)
>>>              result = nir_ige(&b, srcs[1], srcs[0]);
>>>           else
>>>              result = nir_uge(&b, srcs[1], srcs[0]);
>>> @@ -1755,7 +1775,7 @@ nir_visitor::visit(ir_expression *ir)
>>>        if (supports_ints) {
>>>           if (type_is_float(types[0]))
>>>              result = nir_fge(&b, srcs[0], srcs[1]);
>>> -         else if (types[0] == GLSL_TYPE_INT)
>>> +         else if (types[0] == GLSL_TYPE_INT || types[0] == GLSL_TYPE_INT64)
>>>              result = nir_ige(&b, srcs[0], srcs[1]);
>>>           else
>>>              result = nir_uge(&b, srcs[0], srcs[1]);
>>> --
>>> 2.5.5
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list