pan/bi: Add soft NIR->BIR condition translation

We would like to use this routine opportunistically when fusing
conditions into csels and branches, so let's add a mode where we don't
abort.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4276>
This commit is contained in:
Alyssa Rosenzweig 2020-03-21 18:12:31 -04:00 committed by Marge Bot
parent cd7fec782e
commit 5a02c871f2

View file

@ -411,8 +411,13 @@ bi_class_for_nir_alu(nir_op op)
}
}
/* Gets a bi_cond for a given NIR comparison opcode. In soft mode, it will
* return BI_COND_ALWAYS as a sentinel if it fails to do so (when used for
* optimizations). Otherwise it will bail (when used for primary code
* generation). */
static enum bi_cond
bi_cond_for_nir(nir_op op)
bi_cond_for_nir(nir_op op, bool soft)
{
switch (op) {
BI_CASE_CMP(nir_op_flt)
@ -431,7 +436,10 @@ bi_cond_for_nir(nir_op op)
BI_CASE_CMP(nir_op_ine)
return BI_COND_NE;
default:
unreachable("Invalid compare");
if (soft)
return BI_COND_ALWAYS;
else
unreachable("Invalid compare");
}
}
@ -541,7 +549,7 @@ emit_alu(bi_context *ctx, nir_alu_instr *instr)
BI_CASE_CMP(nir_op_ieq)
BI_CASE_CMP(nir_op_fne)
BI_CASE_CMP(nir_op_ine)
alu.op.compare = bi_cond_for_nir(instr->op);
alu.op.compare = bi_cond_for_nir(instr->op, false);
break;
default:
break;