summaryrefslogtreecommitdiffstats
path: root/src/intel
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2019-01-14 22:21:48 -0600
committerJason Ekstrand <[email protected]>2019-02-01 16:10:40 -0600
commitf02914a991a19de6a54e45d760eb9de8f4bbae46 (patch)
treeaef58155722b1398068a0b560573a955ec04ed02 /src/intel
parentf409a08e5fd66183336bd236f159061df9707ca9 (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')
-rw-r--r--src/intel/compiler/brw_fs_cse.cpp34
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;