aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/panfrost/bifrost/test/bi_interpret.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/panfrost/bifrost/test/bi_interpret.c b/src/panfrost/bifrost/test/bi_interpret.c
index 2ad1a21df25..9217b9e42ea 100644
--- a/src/panfrost/bifrost/test/bi_interpret.c
+++ b/src/panfrost/bifrost/test/bi_interpret.c
@@ -214,6 +214,41 @@ bit_srcmod(float raw, bool abs, bool neg)
return raw;
}
+#define BIT_COND(cond, left, right) \
+ if (cond == BI_COND_LT) return left < right; \
+ else if (cond == BI_COND_LE) return left <= right; \
+ else if (cond == BI_COND_GE) return left >= right; \
+ else if (cond == BI_COND_GT) return left > right; \
+ else if (cond == BI_COND_EQ) return left == right; \
+ else if (cond == BI_COND_NE) return left != right; \
+ else { return true; }
+
+static bool
+bit_eval_cond(enum bi_cond cond, bit_t l, bit_t r, nir_alu_type T, unsigned c)
+{
+ if (T == nir_type_float32) {
+ BIT_COND(cond, l.f32, r.f32);
+ } else if (T == nir_type_float16) {
+ float left = bf(l.f16[c]);
+ float right = bf(r.f16[c]);
+ BIT_COND(cond, left, right);
+ } else if (T == nir_type_int32) {
+ int32_t left = (int32_t) l.u32;
+ int32_t right = (int32_t) r.u32;
+ BIT_COND(cond, left, right);
+ } else if (T == nir_type_int16) {
+ int16_t left = (int16_t) l.u32;
+ int16_t right = (int16_t) r.u32;
+ BIT_COND(cond, left, right);
+ } else if (T == nir_type_uint32) {
+ BIT_COND(cond, l.u32, r.u32);
+ } else if (T == nir_type_uint16) {
+ BIT_COND(cond, l.u16[c], r.u16[c]);
+ } else {
+ unreachable("Unknown type evaluated");
+ }
+}
+
void
bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
{
@@ -251,9 +286,17 @@ bit_step(struct bit_state *s, bi_instruction *ins, bool FMA)
case BI_CMP:
case BI_BITWISE:
case BI_CONVERT:
- case BI_CSEL:
unreachable("Unsupported op");
+ case BI_CSEL: {
+ bool direct = ins->csel_cond == BI_COND_ALWAYS;
+ bool cond = direct ? srcs[0].u32 :
+ bit_eval_cond(ins->csel_cond, srcs[0], srcs[1], ins->src_types[0], 0);
+
+ dest = cond ? srcs[2] : srcs[3];
+ break;
+ }
+
case BI_FMA: {
bfloat(bit_f64fma, bit_f32fma);
unreachable("Unknown type");