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

Ian Romanick idr at freedesktop.org
Thu Oct 27 02:52:51 UTC 2016


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.

>> 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