diff options
author | Daniel Schürmann <daniel@schuermann.dev> | 2021-10-04 11:13:08 +0100 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2021-12-31 14:52:14 +0000 |
commit | 5ad9c20d4ad7dbcb20515091750658e133feaf25 (patch) | |
tree | 156745f9021e23762a611f35e171d8570d14cf70 | |
parent | 11712729eb837f093816028b5ec9802a03f6f6ed (diff) |
aco/optimizer: apply extract from p_extract_vector
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13576>
-rw-r--r-- | src/amd/compiler/aco_optimizer.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 1e314ed9550..bc842a58906 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -942,9 +942,14 @@ parse_extract(Instruction* instr) return SubdwordSel(size, offset, sext); } else if (instr->opcode == aco_opcode::p_insert && instr->operands[1].constantEquals(0)) { return instr->operands[2].constantEquals(8) ? SubdwordSel::ubyte : SubdwordSel::uword; - } else { - return SubdwordSel(); + } else if (instr->opcode == aco_opcode::p_extract_vector) { + unsigned size = instr->definitions[0].bytes(); + unsigned offset = instr->operands[1].constantValue() * size; + if (size <= 2) + return SubdwordSel(size, offset, false); } + + return SubdwordSel(); } SubdwordSel @@ -1482,12 +1487,18 @@ label_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr) instr->operands[0] = Operand::get_const(ctx.program->chip_class, val, instr->definitions[0].bytes()); ; - } else if (index == 0 && instr->operands[0].size() == instr->definitions[0].size()) { - ctx.info[instr->definitions[0].tempId()].set_temp(instr->operands[0].getTemp()); } - if (instr->operands[0].bytes() != instr->definitions[0].bytes()) + if (instr->operands[0].bytes() != instr->definitions[0].bytes()) { + if (instr->operands[0].size() != 1) + break; + + if (index == 0) + ctx.info[instr->definitions[0].tempId()].set_temp(instr->operands[0].getTemp()); + else + ctx.info[instr->definitions[0].tempId()].set_extract(instr.get()); break; + } /* convert this extract into a copy instruction */ instr->opcode = aco_opcode::p_parallelcopy; |