From 6d4d42e328d8d9490ac79326ed53041c820c20c1 Mon Sep 17 00:00:00 2001 From: Christoph Pillmayer Date: Fri, 16 May 2025 12:18:39 +0000 Subject: [PATCH] panvk: Add support for 64bit conditionals in CSF This will be used to implement timestamp queries for CSF GPUs. Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/genxml/cs_builder.h | 61 ++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/panfrost/genxml/cs_builder.h b/src/panfrost/genxml/cs_builder.h index c460b8a383d..52e38dfb867 100644 --- a/src/panfrost/genxml/cs_builder.h +++ b/src/panfrost/genxml/cs_builder.h @@ -934,8 +934,8 @@ cs_branch(struct cs_builder *b, int offset, enum mali_cs_condition cond, } static inline void -cs_branch_label(struct cs_builder *b, struct cs_label *label, - enum mali_cs_condition cond, struct cs_index val) +cs_branch_label_cond32(struct cs_builder *b, struct cs_label *label, + enum mali_cs_condition cond, struct cs_index val) { assert(cs_cur_block(b) != NULL); @@ -1007,6 +1007,63 @@ cs_invert_cond(enum mali_cs_condition cond) } } +static inline void +cs_branch_label_cond64(struct cs_builder *b, struct cs_label *label, + enum mali_cs_condition cond, struct cs_index val) +{ + struct cs_label false_label; + cs_label_init(&false_label); + + struct cs_index val_lo = cs_extract32(b, val, 0); + struct cs_index val_hi = cs_extract32(b, val, 1); + + switch (cond) { + case MALI_CS_CONDITION_ALWAYS: + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_ALWAYS, cs_undef()); + break; + case MALI_CS_CONDITION_LEQUAL: + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_LESS, val_hi); + cs_branch_label_cond32(b, &false_label, MALI_CS_CONDITION_NEQUAL, val_hi); + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_EQUAL, val_lo); + break; + case MALI_CS_CONDITION_GREATER: + cs_branch_label_cond32(b, &false_label, MALI_CS_CONDITION_LESS, val_hi); + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_NEQUAL, val_hi); + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_NEQUAL, val_lo); + break; + case MALI_CS_CONDITION_GEQUAL: + cs_branch_label_cond32(b, &false_label, MALI_CS_CONDITION_LESS, val_hi); + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_ALWAYS, cs_undef()); + break; + case MALI_CS_CONDITION_LESS: + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_LESS, val_hi); + break; + case MALI_CS_CONDITION_NEQUAL: + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_NEQUAL, val_lo); + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_NEQUAL, val_hi); + break; + case MALI_CS_CONDITION_EQUAL: + cs_branch_label_cond32(b, &false_label, MALI_CS_CONDITION_NEQUAL, val_lo); + cs_branch_label_cond32(b, label, MALI_CS_CONDITION_EQUAL, val_hi); + break; + default: + unreachable("unsupported 64bit condition"); + } + + cs_set_label(b, &false_label); +} + +static inline void +cs_branch_label(struct cs_builder *b, struct cs_label *label, + enum mali_cs_condition cond, struct cs_index val) +{ + if (val.size == 2) { + cs_branch_label_cond64(b, label, cond, val); + } else { + cs_branch_label_cond32(b, label, cond, val); + } +} + static inline struct cs_if_else * cs_if_start(struct cs_builder *b, struct cs_if_else *if_else, enum mali_cs_condition cond, struct cs_index val)