diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 5ed9594f7d6..4bb4e0534f8 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -3804,6 +3804,8 @@ nir_atomic_op_to_alu(nir_atomic_op op) switch (op) { case nir_atomic_op_iadd: return nir_op_iadd; + case nir_atomic_op_isub: + return nir_op_isub; case nir_atomic_op_imin: return nir_op_imin; case nir_atomic_op_umin: diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index b23651bef24..12b345ccaf8 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1251,6 +1251,7 @@ nir_op nir_type_conversion_op(nir_alu_type src, nir_alu_type dst, */ typedef enum { nir_atomic_op_iadd, + nir_atomic_op_isub, nir_atomic_op_imin, nir_atomic_op_umin, nir_atomic_op_imax, @@ -1284,6 +1285,7 @@ nir_atomic_op_type(nir_atomic_op op) return nir_type_float; case nir_atomic_op_iadd: + case nir_atomic_op_isub: case nir_atomic_op_iand: case nir_atomic_op_ior: case nir_atomic_op_ixor: diff --git a/src/compiler/nir/nir_opt_uniform_atomics.c b/src/compiler/nir/nir_opt_uniform_atomics.c index a4b629c9dd0..c719f51adf3 100644 --- a/src/compiler/nir/nir_opt_uniform_atomics.c +++ b/src/compiler/nir/nir_opt_uniform_atomics.c @@ -191,6 +191,9 @@ static void reduce_data(nir_builder *b, nir_op op, nir_def *data, nir_def **reduce, nir_def **scan) { + if (op == nir_op_isub) + op = nir_op_iadd; + if (scan) { *scan = nir_exclusive_scan(b, data, .reduction_op = op); if (reduce) { diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c index 8cd6bb00aa8..a13f3ea26e5 100644 --- a/src/compiler/nir/nir_print.c +++ b/src/compiler/nir/nir_print.c @@ -1268,6 +1268,9 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state) case nir_atomic_op_iadd: fprintf(fp, "iadd"); break; + case nir_atomic_op_isub: + fprintf(fp, "isub"); + break; case nir_atomic_op_imin: fprintf(fp, "imin"); break;