Mesa (master): r600/sfn: lower isign and iabs in nir

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Mar 2 18:03:29 UTC 2021


Module: Mesa
Branch: master
Commit: 911c6af2fde69dd4721403e47da40126b9d1b9e3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=911c6af2fde69dd4721403e47da40126b9d1b9e3

Author: Gert Wollny <gert.wollny at collabora.com>
Date:   Fri Feb 26 18:42:52 2021 +0100

r600/sfn: lower isign and iabs in nir

Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9330>

---

 src/gallium/drivers/r600/r600_pipe_common.c        |  3 +
 .../drivers/r600/sfn/sfn_emitaluinstruction.cpp    | 72 ----------------------
 .../drivers/r600/sfn/sfn_emitaluinstruction.h      |  2 -
 3 files changed, 3 insertions(+), 74 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c
index 20060685570..d8918806d95 100644
--- a/src/gallium/drivers/r600/r600_pipe_common.c
+++ b/src/gallium/drivers/r600/r600_pipe_common.c
@@ -1195,6 +1195,7 @@ const struct nir_shader_compiler_options r600_nir_fs_options = {
 	.use_interpolated_input_intrinsics = true,
 	.has_fsub = true,
 	.has_isub = true,
+	.lower_iabs = true,
 };
 
 const struct nir_shader_compiler_options r600_nir_options = {
@@ -1218,6 +1219,8 @@ const struct nir_shader_compiler_options r600_nir_options = {
 	.has_umul24 = true,
 	.has_fsub = true,
 	.has_isub = true,
+	.lower_iabs = true,
+	.lower_isign = true,
 };
 
 
diff --git a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp
index 337c8c5819b..b6e0d30e772 100644
--- a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp
@@ -118,12 +118,10 @@ bool EmitAluInstruction::do_emit(nir_instr* ir)
    case nir_op_umin: return emit_alu_op2_int(instr, op2_min_uint);
    case nir_op_ior: return emit_alu_op2_int(instr, op2_or_int);
    case nir_op_inot: return emit_alu_op1(instr, op1_not_int);
-   case nir_op_iabs: return emit_alu_iabs(instr);
    case nir_op_ineg: return emit_alu_ineg(instr);
    case nir_op_idiv: return emit_alu_div_int(instr, true, false);
    case nir_op_udiv: return emit_alu_div_int(instr, false, false);
    case nir_op_umod: return emit_alu_div_int(instr, false, true);
-   case nir_op_isign: return emit_alu_isign(instr);
 
    case nir_op_ushr: return emit_alu_op2_int(instr, op2_lshr_int);
 
@@ -1019,48 +1017,6 @@ bool EmitAluInstruction::emit_alu_op2_split_src_mods(const nir_alu_instr& instr,
    return true;
 }
 
-
-bool EmitAluInstruction::emit_alu_isign(const nir_alu_instr& instr)
-{
-   int sel_tmp = allocate_temp_register();
-   GPRVector tmp(sel_tmp, {0,1,2,3});
-
-   AluInstruction *ir = nullptr;
-   PValue help[4];
-
-   for (int i = 0; i < 4 ; ++i) {
-      if (instr.dest.write_mask & (1 << i)){
-         help[i] = from_nir(instr.dest, i);
-         auto s = m_src[0][i];
-         ir = new AluInstruction(op3_cndgt_int, help[i], s, Value::one_i, s, write);
-         emit_instruction(ir);
-      }
-   }
-   if (ir)
-      ir->set_flag(alu_last_instr);
-
-   for (int i = 0; i < 4 ; ++i) {
-      if (instr.dest.write_mask & (1 << i)){
-         ir = new AluInstruction(op2_sub_int, tmp.reg_i(i), Value::zero, help[i], write);
-         emit_instruction(ir);
-      }
-   }
-   if (ir)
-      ir->set_flag(alu_last_instr);
-
-   for (int i = 0; i < 4 ; ++i) {
-      if (instr.dest.write_mask & (1 << i)){
-
-         ir = new AluInstruction(op3_cndgt_int, help[i], tmp.reg_i(i),
-                                 PValue(new LiteralValue(-1,0)), help[i], write);
-         emit_instruction(ir);
-      }
-   }
-   if (ir)
-      ir->set_flag(alu_last_instr);
-   return true;
-}
-
 bool EmitAluInstruction::emit_fsign(const nir_alu_instr& instr)
 {
    PValue help[4];
@@ -1174,34 +1130,6 @@ bool EmitAluInstruction::emit_alu_ineg(const nir_alu_instr& instr)
 
 static const char swz[] = "xyzw01?_";
 
-
-
-bool EmitAluInstruction::emit_alu_iabs(const nir_alu_instr& instr)
-{
-   int sel_tmp = allocate_temp_register();
-   GPRVector tmp(sel_tmp, {0,1,2,3});
-
-   std::array<PValue,4> src;
-   AluInstruction *ir = nullptr;
-   for (int i = 0; i < 4 ; ++i) {
-      if (instr.dest.write_mask & (1 << i)){
-         ir = new AluInstruction(op2_sub_int, tmp.reg_i(i), Value::zero, m_src[0][i], write);
-         emit_instruction(ir);
-      }
-   }
-   make_last(ir);
-
-   for (int i = 0; i < 4 ; ++i) {
-      if (instr.dest.write_mask & (1 << i)){
-         ir = new AluInstruction(op3_cndge_int, from_nir(instr.dest, i), m_src[0][i],
-                                 m_src[0][i], tmp.reg_i(i), write);
-         emit_instruction(ir);
-      }
-   }
-   make_last(ir);
-   return true;
-}
-
 bool EmitAluInstruction::emit_alu_div_int(const nir_alu_instr& instr, bool use_signed, bool mod)
 {
 
diff --git a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h
index 6a948e7dc2e..131ebec91b2 100644
--- a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h
+++ b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h
@@ -61,9 +61,7 @@ private:
    bool emit_alu_trans_op2(const nir_alu_instr& instr, EAluOp opcode);
 
    bool emit_alu_inot(const nir_alu_instr& instr);
-   bool emit_alu_iabs(const nir_alu_instr& instr);
    bool emit_alu_ineg(const nir_alu_instr& instr);
-   bool emit_alu_isign(const nir_alu_instr& instr);
    bool emit_alu_div_int(const nir_alu_instr& instr, bool use_signed, bool mod);
    bool emit_alu_op2_int(const nir_alu_instr& instr, EAluOp opcode, AluOp2Opts ops = op2_opt_none);
 



More information about the mesa-commit mailing list