[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