From 3177346bfc5d3e10da9054af7a5725dbd709c3f0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 18 Nov 2019 10:33:40 +0100 Subject: [PATCH] aco: refactor visit_store_fs_output() to use the Builder Reviewed-by: Rhys Perry --- .../compiler/aco_instruction_selection.cpp | 64 +++++-------------- 1 file changed, 15 insertions(+), 49 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 0f89cb1aee5..09f9b1e07ec 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -2471,6 +2471,7 @@ void visit_store_vs_output(isel_context *ctx, nir_intrinsic_instr *instr) void visit_store_fs_output(isel_context *ctx, nir_intrinsic_instr *instr) { + Builder bld(ctx->program, ctx->block); unsigned write_mask = nir_intrinsic_write_mask(instr); Operand values[4]; Temp src = get_ssa_temp(ctx, instr->src[0].ssa); @@ -2510,16 +2511,8 @@ void visit_store_fs_output(isel_context *ctx, nir_intrinsic_instr *instr) values[2] = values[0]; values[0] = Operand(v1); } else { - aco_ptr exp{create_instruction(aco_opcode::exp, Format::EXP, 4, 0)}; - exp->valid_mask = false; - exp->done = false; - exp->compressed = true; - exp->dest = V_008DFC_SQ_EXP_MRTZ; - exp->enabled_mask = 0xc; - for (int i = 0; i < 4; i++) - exp->operands[i] = Operand(v1); - exp->operands[1] = Operand(values[0]); - ctx->block->instructions.emplace_back(std::move(exp)); + bld.exp(aco_opcode::exp, Operand(v1), Operand(values[0]), Operand(v1), Operand(v1), + 0xc, V_008DFC_SQ_EXP_MRTZ, true); return; } @@ -2539,23 +2532,9 @@ void visit_store_fs_output(isel_context *ctx, nir_intrinsic_instr *instr) values[1] = values[0]; values[0] = Operand(v1); } else { - aco_ptr shift{create_instruction(aco_opcode::v_lshlrev_b32, Format::VOP2, 2, 1)}; - shift->operands[0] = Operand((uint32_t) 16); - shift->operands[1] = values[0]; - Temp tmp = {ctx->program->allocateId(), v1}; - shift->definitions[0] = Definition(tmp); - ctx->block->instructions.emplace_back(std::move(shift)); - - aco_ptr exp{create_instruction(aco_opcode::exp, Format::EXP, 4, 0)}; - exp->valid_mask = false; - exp->done = false; - exp->compressed = true; - exp->dest = V_008DFC_SQ_EXP_MRTZ; - exp->enabled_mask = 0x3; - exp->operands[0] = Operand(tmp); - for (int i = 1; i < 4; i++) - exp->operands[i] = Operand(v1); - ctx->block->instructions.emplace_back(std::move(exp)); + values[0] = bld.vop2(aco_opcode::v_lshlrev_b32, bld.def(v1), Operand(16u), values[0]); + bld.exp(aco_opcode::exp, values[0], Operand(v1), Operand(v1), Operand(v1), + 0x3, V_008DFC_SQ_EXP_MRTZ, true); return; } @@ -2588,6 +2567,7 @@ void visit_store_fs_output(isel_context *ctx, nir_intrinsic_instr *instr) /* Special case: on GFX10, the outputs are different for 32_AR */ enabled_channels = 0x3; values[1] = values[3]; + values[3] = Operand(v1); } else { enabled_channels = 0x9; } @@ -2637,36 +2617,22 @@ void visit_store_fs_output(isel_context *ctx, nir_intrinsic_instr *instr) unsigned enabled = (write_mask >> (i*2) | write_mask >> (i*2+1)) & 0x1; if (enabled) { enabled_channels |= enabled << (i*2); - aco_ptr compr{create_instruction(compr_op, Format::VOP3A, 2, 1)}; - Temp tmp{ctx->program->allocateId(), v1}; - compr->operands[0] = values[i*2].isUndefined() ? Operand(0u) : values[i*2]; - compr->operands[1] = values[i*2+1].isUndefined() ? Operand(0u): values[i*2+1]; - compr->definitions[0] = Definition(tmp); - values[i] = Operand(tmp); - ctx->block->instructions.emplace_back(std::move(compr)); + values[i] = bld.vop3(compr_op, bld.def(v1), + values[i*2].isUndefined() ? Operand(0u) : values[i*2], + values[i*2+1].isUndefined() ? Operand(0u): values[i*2+1]); } else { values[i] = Operand(v1); } } - } - - aco_ptr exp{create_instruction(aco_opcode::exp, Format::EXP, 4, 0)}; - exp->valid_mask = false; - exp->done = false; - exp->compressed = (bool) compr_op; - exp->dest = target; - exp->enabled_mask = enabled_channels; - if ((bool) compr_op) { - for (int i = 0; i < 2; i++) - exp->operands[i] = enabled_channels & (3 << (i * 2)) ? values[i] : Operand(v1); - exp->operands[2] = Operand(v1); - exp->operands[3] = Operand(v1); + values[2] = Operand(v1); + values[3] = Operand(v1); } else { for (int i = 0; i < 4; i++) - exp->operands[i] = enabled_channels & (1 << i) ? values[i] : Operand(v1); + values[i] = enabled_channels & (1 << i) ? values[i] : Operand(v1); } - ctx->block->instructions.emplace_back(std::move(exp)); + bld.exp(aco_opcode::exp, values[0], values[1], values[2], values[3], + enabled_channels, target, (bool) compr_op); } Operand load_lds_size_m0(isel_context *ctx) -- 2.30.2