From 32d871b48fbf38cb309eaaa13c8b425695141b60 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 31 Mar 2020 13:57:42 +0100 Subject: [PATCH] nir/algebraic: don't undo lowering of 8/16-bit comparisons to 32-bit Signed-off-by: Rhys Perry Reviewed-by: Erik Faye-Lund Part-of: --- src/compiler/nir/nir.h | 6 ++++++ src/compiler/nir/nir_opt_algebraic.py | 29 ++++++++++++++++----------- src/intel/compiler/brw_compiler.c | 4 +++- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 04088fc99fa..fd6086af70b 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3011,6 +3011,12 @@ typedef struct nir_shader_compiler_options { */ bool intel_vec4; + /** Whether 8-bit ALU is supported. */ + bool support_8bit_alu; + + /** Whether 16-bit ALU is supported. */ + bool support_16bit_alu; + unsigned max_unroll_iterations; nir_lower_int64_options lower_int64_options; diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 00d18402bd1..6c0ce923c9d 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -1428,6 +1428,11 @@ for t in ['int', 'uint', 'float']: if N == 1 or N >= M: continue + cond = 'true' + if N == 8: + cond = 'options->support_8bit_alu' + elif N == 16: + cond = 'options->support_16bit_alu' x2xM = '{0}2{0}{1}'.format(t[0], M) x2xN = '{0}2{0}{1}'.format(t[0], N) aN = 'a@' + str(N) @@ -1447,12 +1452,12 @@ for t in ['int', 'uint', 'float']: bP = 'b@' + str(P) optimizations += [ - ((xeq, (x2xM, aN), (x2xM, bP)), (xeq, a, (x2xN, b))), - ((xne, (x2xM, aN), (x2xM, bP)), (xne, a, (x2xN, b))), - ((xge, (x2xM, aN), (x2xM, bP)), (xge, a, (x2xN, b))), - ((xlt, (x2xM, aN), (x2xM, bP)), (xlt, a, (x2xN, b))), - ((xge, (x2xM, bP), (x2xM, aN)), (xge, (x2xN, b), a)), - ((xlt, (x2xM, bP), (x2xM, aN)), (xlt, (x2xN, b), a)), + ((xeq, (x2xM, aN), (x2xM, bP)), (xeq, a, (x2xN, b)), cond), + ((xne, (x2xM, aN), (x2xM, bP)), (xne, a, (x2xN, b)), cond), + ((xge, (x2xM, aN), (x2xM, bP)), (xge, a, (x2xN, b)), cond), + ((xlt, (x2xM, aN), (x2xM, bP)), (xlt, a, (x2xN, b)), cond), + ((xge, (x2xM, bP), (x2xM, aN)), (xge, (x2xN, b), a), cond), + ((xlt, (x2xM, bP), (x2xM, aN)), (xlt, (x2xN, b), a), cond), ] # The next bit doesn't work on floats because the range checks would @@ -1472,21 +1477,21 @@ for t in ['int', 'uint', 'float']: # and a check that the constant fits in the smaller bit size. optimizations += [ ((xeq, (x2xM, aN), '#b'), - ('iand', (xeq, a, (x2xN, b)), (xeq, (x2xM, (x2xN, b)), b))), + ('iand', (xeq, a, (x2xN, b)), (xeq, (x2xM, (x2xN, b)), b)), cond), ((xne, (x2xM, aN), '#b'), - ('ior', (xne, a, (x2xN, b)), (xne, (x2xM, (x2xN, b)), b))), + ('ior', (xne, a, (x2xN, b)), (xne, (x2xM, (x2xN, b)), b)), cond), ((xlt, (x2xM, aN), '#b'), ('iand', (xlt, xN_min, b), - ('ior', (xlt, xN_max, b), (xlt, a, (x2xN, b))))), + ('ior', (xlt, xN_max, b), (xlt, a, (x2xN, b)))), cond), ((xlt, '#a', (x2xM, bN)), ('iand', (xlt, a, xN_max), - ('ior', (xlt, a, xN_min), (xlt, (x2xN, a), b)))), + ('ior', (xlt, a, xN_min), (xlt, (x2xN, a), b))), cond), ((xge, (x2xM, aN), '#b'), ('iand', (xge, xN_max, b), - ('ior', (xge, xN_min, b), (xge, a, (x2xN, b))))), + ('ior', (xge, xN_min, b), (xge, a, (x2xN, b)))), cond), ((xge, '#a', (x2xM, bN)), ('iand', (xge, a, xN_min), - ('ior', (xge, a, xN_max), (xge, (x2xN, a), b)))), + ('ior', (xge, a, xN_max), (xge, (x2xN, a), b))), cond), ] def fexp2i(exp, bits): diff --git a/src/intel/compiler/brw_compiler.c b/src/intel/compiler/brw_compiler.c index 20f32b552c0..cede7b44879 100644 --- a/src/intel/compiler/brw_compiler.c +++ b/src/intel/compiler/brw_compiler.c @@ -48,7 +48,9 @@ .use_interpolated_input_intrinsics = true, \ .vertex_id_zero_based = true, \ .lower_base_vertex = true, \ - .use_scoped_memory_barrier = true + .use_scoped_memory_barrier = true, \ + .support_8bit_alu = true, \ + .support_16bit_alu = true #define COMMON_SCALAR_OPTIONS \ .lower_to_scalar = true, \ -- 2.30.2