nir/algebraic: add option to lower fdph
authorJonathan Marek <jonathan@marek.ca>
Fri, 21 Jun 2019 01:47:16 +0000 (21:47 -0400)
committerJonathan Marek <jonathan@marek.ca>
Wed, 24 Jul 2019 21:36:21 +0000 (17:36 -0400)
For backends that don't have a 'fdph' instructions

Signed-off-by: Jonathan Marek <jonathan@marek.ca>
Reviewed-by: Thomas Helland <thomashelland90@gmail.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/compiler/nir/nir.h
src/compiler/nir/nir_opt_algebraic.py

index 31e731baa44e85ff681c6570d9650585afa0bfcc..f41302676d1664d98b23d08913067d4321ea6248 100644 (file)
@@ -2549,6 +2549,9 @@ typedef struct nir_shader_compiler_options {
    /** enables rules to lower fsign to fsub and flt */
    bool lower_fsign;
 
+   /* lower fdph to fdot4 */
+   bool lower_fdph;
+
    /* Does the native fdot instruction replicate its result for four
     * components?  If so, then opt_algebraic_late will turn all fdotN
     * instructions into fdot_replicatedN instructions.
index 951771fa37ac9202e22086c63d19ea1dc8ed3b03..d57eff2fdded286c5a8d18cc42aa582e9ac6ddd0 100644 (file)
@@ -181,7 +181,9 @@ optimizations = [
    (('~fmul', ('fadd', ('iand', ('ineg', ('b2i32', 'a@bool')), ('fmul', b, c)), '#d'), '#e'),
     ('bcsel', a, ('fmul', ('fadd', ('fmul', b, c), d), e), ('fmul', d, e))),
 
-   (('fdot4', ('vec4', a, b,   c,   1.0), d), ('fdph',  ('vec3', a, b, c), d)),
+   (('fdph', a, b), ('fdot4', ('vec4', 'a.x', 'a.y', 'a.z', 1.0), b), 'options->lower_fdph'),
+
+   (('fdot4', ('vec4', a, b,   c,   1.0), d), ('fdph',  ('vec3', a, b, c), d), '!options->lower_fdph'),
    (('fdot4', ('vec4', a, 0.0, 0.0, 0.0), b), ('fmul', a, b)),
    (('fdot4', ('vec4', a, b,   0.0, 0.0), c), ('fdot2', ('vec2', a, b), c)),
    (('fdot4', ('vec4', a, b,   c,   0.0), d), ('fdot3', ('vec3', a, b, c), d)),