diff options
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/compiler/brw_eu_defines.h | 1 | ||||
-rw-r--r-- | src/intel/compiler/brw_fs.cpp | 37 | ||||
-rw-r--r-- | src/intel/compiler/brw_fs.h | 1 |
3 files changed, 39 insertions, 0 deletions
diff --git a/src/intel/compiler/brw_eu_defines.h b/src/intel/compiler/brw_eu_defines.h index 8a8f36cbc11..9d5cf05c86e 100644 --- a/src/intel/compiler/brw_eu_defines.h +++ b/src/intel/compiler/brw_eu_defines.h @@ -1252,6 +1252,7 @@ enum PACKED brw_rnd_mode { BRW_RND_MODE_RU = 1, /* Round Up, toward +inf */ BRW_RND_MODE_RD = 2, /* Round Down, toward -inf */ BRW_RND_MODE_RTZ = 3, /* Round Toward Zero */ + BRW_RND_MODE_UNSPECIFIED, /* Unspecified rounding mode */ }; #endif /* BRW_EU_DEFINES_H */ diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 6cdd2bd9f31..36fb337c620 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -3092,6 +3092,42 @@ fs_visitor::remove_duplicate_mrf_writes() return progress; } +/** + * Rounding modes for conversion instructions are included for each + * conversion, but right now it is a state. So once it is set, + * we don't need to call it again for subsequent calls. + * + * This is useful for vector/matrices conversions, as setting the + * mode once is enough for the full vector/matrix + */ +bool +fs_visitor::remove_extra_rounding_modes() +{ + bool progress = false; + + foreach_block (block, cfg) { + brw_rnd_mode prev_mode = BRW_RND_MODE_UNSPECIFIED; + + foreach_inst_in_block_safe (fs_inst, inst, block) { + if (inst->opcode == SHADER_OPCODE_RND_MODE) { + assert(inst->src[0].file == BRW_IMMEDIATE_VALUE); + const brw_rnd_mode mode = (brw_rnd_mode) inst->src[0].d; + if (mode == prev_mode) { + inst->remove(block); + progress = true; + } else { + prev_mode = mode; + } + } + } + } + + if (progress) + invalidate_live_intervals(); + + return progress; +} + static void clear_deps_for_inst_src(fs_inst *inst, bool *deps, int first_grf, int grf_len) { @@ -5808,6 +5844,7 @@ fs_visitor::optimize() int pass_num = 0; OPT(opt_drop_redundant_mov_to_flags); + OPT(remove_extra_rounding_modes); do { progress = false; diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h index 40dd83f45e4..19b897e7a9f 100644 --- a/src/intel/compiler/brw_fs.h +++ b/src/intel/compiler/brw_fs.h @@ -150,6 +150,7 @@ public: bool eliminate_find_live_channel(); bool dead_code_eliminate(); bool remove_duplicate_mrf_writes(); + bool remove_extra_rounding_modes(); bool opt_sampler_eot(); bool virtual_grf_interferes(int a, int b); |