diff options
author | Jason Ekstrand <[email protected]> | 2019-01-14 22:21:48 -0600 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-02-01 16:10:40 -0600 |
commit | f02914a991a19de6a54e45d760eb9de8f4bbae46 (patch) | |
tree | aef58155722b1398068a0b560573a955ec04ed02 /src/intel/compiler/brw_fs_cse.cpp | |
parent | f409a08e5fd66183336bd236f159061df9707ca9 (diff) |
intel/fs/cse: Split create_copy_instr into three cases
Previously, we tried to combine all cases where the instruction being
CSE'd writes to more than one MOV worth of registers into one case with
a bit of special casing for LOAD_PAYLOAD. This commit splits things so
that LOAD_PAYLOAD is entirely it's own case. This makes tweaking the
LOAD_PAYLOAD case simpler in the next commit.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/intel/compiler/brw_fs_cse.cpp')
-rw-r--r-- | src/intel/compiler/brw_fs_cse.cpp | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/src/intel/compiler/brw_fs_cse.cpp b/src/intel/compiler/brw_fs_cse.cpp index 9b897804032..bd917baaa6d 100644 --- a/src/intel/compiler/brw_fs_cse.cpp +++ b/src/intel/compiler/brw_fs_cse.cpp @@ -207,30 +207,30 @@ create_copy_instr(const fs_builder &bld, fs_inst *inst, fs_reg src, bool negate) DIV_ROUND_UP(inst->dst.component_size(inst->exec_size), REG_SIZE); fs_inst *copy; - if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD || - written != dst_width) { - fs_reg *payload; - int sources, header_size; - if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD) { - sources = inst->sources; - header_size = inst->header_size; - } else { - assert(written % dst_width == 0); - sources = written / dst_width; - header_size = 0; - } - + if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD) { assert(src.file == VGRF); - payload = ralloc_array(bld.shader->mem_ctx, fs_reg, sources); - for (int i = 0; i < header_size; i++) { + fs_reg *payload = ralloc_array(bld.shader->mem_ctx, fs_reg, + inst->sources); + for (int i = 0; i < inst->header_size; i++) { payload[i] = src; src.offset += REG_SIZE; } - for (int i = header_size; i < sources; i++) { + for (int i = inst->header_size; i < inst->sources; i++) { + payload[i] = src; + src = offset(src, bld, 1); + } + copy = bld.LOAD_PAYLOAD(inst->dst, payload, inst->sources, + inst->header_size); + } else if (written != dst_width) { + assert(src.file == VGRF); + assert(written % dst_width == 0); + const int sources = written / dst_width; + fs_reg *payload = ralloc_array(bld.shader->mem_ctx, fs_reg, sources); + for (int i = 0; i < sources; i++) { payload[i] = src; src = offset(src, bld, 1); } - copy = bld.LOAD_PAYLOAD(inst->dst, payload, sources, header_size); + copy = bld.LOAD_PAYLOAD(inst->dst, payload, sources, 0); } else { copy = bld.MOV(inst->dst, src); copy->group = inst->group; |