Module: Mesa
Branch: main
Commit: de64dfe9404f2b586a83b3933f8c38c3f25e17a9
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=de64dfe9404f2b586a83b3933f8c38c3f25e17a9

Author: Simon Perretta <[email protected]>
Date:   Thu Feb 16 15:33:00 2023 +0000

pvr: Add branch support

Signed-off-by: Simon Perretta <[email protected]>
Acked-by: Frank Binns <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21474>

---

 .../rogue/passes/rogue_schedule_instr_groups.c     | 13 ++++--
 src/imagination/rogue/rogue.h                      |  8 +++-
 src/imagination/rogue/rogue_ctrl_instrs.def        |  3 +-
 src/imagination/rogue/rogue_encode.c               | 52 +++++++++++++++++++---
 src/imagination/rogue/rogue_info.c                 | 15 ++++++-
 5 files changed, 77 insertions(+), 14 deletions(-)

diff --git a/src/imagination/rogue/passes/rogue_schedule_instr_groups.c 
b/src/imagination/rogue/passes/rogue_schedule_instr_groups.c
index 8775b019ad4..bbf3c74afd2 100644
--- a/src/imagination/rogue/passes/rogue_schedule_instr_groups.c
+++ b/src/imagination/rogue/passes/rogue_schedule_instr_groups.c
@@ -662,10 +662,6 @@ static void rogue_calc_ctrl_instrs_size(rogue_instr_group 
*group,
                                         enum rogue_instr_phase phase)
 {
    switch (ctrl->op) {
-   case ROGUE_CTRL_OP_WDF:
-      group->size.instrs[phase] = 0;
-      break;
-
    case ROGUE_CTRL_OP_NOP:
       group->size.instrs[phase] = 1;
       break;
@@ -674,6 +670,15 @@ static void rogue_calc_ctrl_instrs_size(rogue_instr_group 
*group,
       group->size.instrs[phase] = 0;
       break;
 
+   case ROGUE_CTRL_OP_BR:
+   case ROGUE_CTRL_OP_BA:
+      group->size.instrs[phase] = 5;
+      break;
+
+   case ROGUE_CTRL_OP_WDF:
+      group->size.instrs[phase] = 0;
+      break;
+
    default:
       unreachable("Unsupported ctrl op.");
    }
diff --git a/src/imagination/rogue/rogue.h b/src/imagination/rogue/rogue.h
index e70c15e3f11..4acb2ae3033 100644
--- a/src/imagination/rogue/rogue.h
+++ b/src/imagination/rogue/rogue.h
@@ -1101,7 +1101,8 @@ enum rogue_ctrl_op {
    /* Real instructions. */
    ROGUE_CTRL_OP_NOP,
    ROGUE_CTRL_OP_WOP,
-   ROGUE_CTRL_OP_BA,
+   ROGUE_CTRL_OP_BR, /* Branch: relative (to block). */
+   ROGUE_CTRL_OP_BA, /* Branch: absolute (to address). */
    ROGUE_CTRL_OP_WDF,
 
    /* Pseudo-instructions. */
@@ -1113,6 +1114,11 @@ enum rogue_ctrl_op {
 
 enum rogue_ctrl_op_mod {
    /* In order of priority */
+   ROGUE_CTRL_OP_MOD_LINK,
+
+   ROGUE_CTRL_OP_MOD_ALLINST,
+   ROGUE_CTRL_OP_MOD_ANYINST,
+
    ROGUE_CTRL_OP_MOD_END,
 
    ROGUE_CTRL_OP_MOD_COUNT,
diff --git a/src/imagination/rogue/rogue_ctrl_instrs.def 
b/src/imagination/rogue/rogue_ctrl_instrs.def
index 55b61180818..435f5b55e8c 100644
--- a/src/imagination/rogue/rogue_ctrl_instrs.def
+++ b/src/imagination/rogue/rogue_ctrl_instrs.def
@@ -53,13 +53,14 @@
 #define ROGUE_BUILDER_DEFINE_CTRL01(...)
 #endif /* ROGUE_BUILDER_DEFINE_CTRL01 */
 
-ROGUE_BUILDER_DEFINE_CTRLB(BA)
+ROGUE_BUILDER_DEFINE_CTRLB(BR)
 
 ROGUE_BUILDER_DEFINE_CTRL00(END)
 ROGUE_BUILDER_DEFINE_CTRL00(NOP)
 ROGUE_BUILDER_DEFINE_CTRL00(WOP)
 
 ROGUE_BUILDER_DEFINE_CTRL01(WDF)
+ROGUE_BUILDER_DEFINE_CTRL01(BA)
 
 #undef ROGUE_BUILDER_DEFINE_CTRL01
 #undef ROGUE_BUILDER_DEFINE_CTRL00
diff --git a/src/imagination/rogue/rogue_encode.c 
b/src/imagination/rogue/rogue_encode.c
index e9ce7829e56..438e14c51f9 100644
--- a/src/imagination/rogue/rogue_encode.c
+++ b/src/imagination/rogue/rogue_encode.c
@@ -145,26 +145,33 @@ static void 
rogue_encode_instr_group_header(rogue_instr_group *group,
 
    case ROGUE_ALU_CONTROL:
       h.alutype = ALUTYPE_CONTROL;
+#define OM(op_mod) ROGUE_CTRL_OP_MOD_##op_mod
       const rogue_instr *instr = group->instrs[ROGUE_INSTR_PHASE_CTRL];
       const rogue_ctrl_instr *ctrl = rogue_instr_as_ctrl(instr);
       switch (ctrl->op) {
-      case ROGUE_CTRL_OP_WDF:
-         h.ctrlop = CTRLOP_WDF;
-         h.miscctl = rogue_ref_get_drc_index(&ctrl->src[0].ref);
-         break;
-
       case ROGUE_CTRL_OP_NOP:
          h.ctrlop = CTRLOP_NOP;
-         h.miscctl = rogue_ctrl_op_mod_is_set(ctrl, ROGUE_CTRL_OP_MOD_END);
+         h.miscctl = rogue_ctrl_op_mod_is_set(ctrl, OM(END));
          break;
 
       case ROGUE_CTRL_OP_WOP:
          h.ctrlop = CTRLOP_WOP;
          break;
 
+      case ROGUE_CTRL_OP_BR:
+      case ROGUE_CTRL_OP_BA:
+         h.ctrlop = CTRLOP_BA;
+         break;
+
+      case ROGUE_CTRL_OP_WDF:
+         h.ctrlop = CTRLOP_WDF;
+         h.miscctl = rogue_ref_get_drc_index(&ctrl->src[0].ref);
+         break;
+
       default:
          unreachable("Unsupported ctrl op.");
       }
+#undef OM
       break;
 
    default:
@@ -600,6 +607,7 @@ static void rogue_encode_backend_instr(const 
rogue_backend_instr *backend,
 }
 #undef OM
 
+#define OM(op_mod) ROGUE_CTRL_OP_MOD_##op_mod
 static void rogue_encode_ctrl_instr(const rogue_ctrl_instr *ctrl,
                                     unsigned instr_size,
                                     rogue_instr_encoding *instr_encoding)
@@ -610,10 +618,42 @@ static void rogue_encode_ctrl_instr(const 
rogue_ctrl_instr *ctrl,
       memset(&instr_encoding->ctrl.nop, 0, sizeof(instr_encoding->ctrl.nop));
       break;
 
+   case ROGUE_CTRL_OP_BR:
+   case ROGUE_CTRL_OP_BA: {
+      bool branch_abs = (ctrl->op == ROGUE_CTRL_OP_BA);
+      rogue_offset32 offset;
+
+      instr_encoding->ctrl.ba.abs = branch_abs;
+      instr_encoding->ctrl.ba.allp =
+         rogue_ctrl_op_mod_is_set(ctrl, OM(ALLINST));
+      instr_encoding->ctrl.ba.anyp =
+         rogue_ctrl_op_mod_is_set(ctrl, OM(ANYINST));
+      instr_encoding->ctrl.ba.link = rogue_ctrl_op_mod_is_set(ctrl, OM(LINK));
+
+      if (branch_abs) {
+         offset._ = rogue_ref_get_val(&ctrl->src[0].ref);
+      } else {
+         rogue_instr_group *block_group =
+            list_entry(ctrl->target_block->instrs.next,
+                       rogue_instr_group,
+                       link);
+         offset._ = block_group->size.offset - (ctrl->instr.group->size.offset 
+
+                                                ctrl->instr.group->size.total);
+      }
+
+      instr_encoding->ctrl.ba.offset_7_1 = offset._7_1;
+      instr_encoding->ctrl.ba.offset_15_8 = offset._15_8;
+      instr_encoding->ctrl.ba.offset_23_16 = offset._23_16;
+      instr_encoding->ctrl.ba.offset_31_24 = offset._31_24;
+
+      break;
+   }
+
    default:
       unreachable("Unsupported ctrl op.");
    }
 }
+#undef OM
 
 static void rogue_encode_bitwise_instr(const rogue_bitwise_instr *bitwise,
                                        unsigned instr_size,
diff --git a/src/imagination/rogue/rogue_info.c 
b/src/imagination/rogue/rogue_info.c
index bdcb8fad87c..8b40b708f98 100644
--- a/src/imagination/rogue/rogue_info.c
+++ b/src/imagination/rogue/rogue_info.c
@@ -217,9 +217,14 @@ const rogue_alu_src_mod_info 
rogue_alu_src_mod_infos[ROGUE_ALU_SRC_MOD_COUNT] =
        [ROGUE_ALU_SRC_MOD_NEG] = { .str = "neg", },
 };
 
+#define OM(op_mod) BITFIELD64_BIT(ROGUE_CTRL_OP_MOD_##op_mod)
 const rogue_ctrl_op_mod_info rogue_ctrl_op_mod_infos[ROGUE_CTRL_OP_MOD_COUNT] 
= {
-       [ROGUE_CTRL_OP_MOD_END] = { .str = "end", },
+   [ROGUE_CTRL_OP_MOD_LINK] = { .str = "link", },
+   [ROGUE_CTRL_OP_MOD_ALLINST] = { .str = "allinst", .exclude = OM(ANYINST) },
+   [ROGUE_CTRL_OP_MOD_ANYINST] = { .str = "anyinst", .exclude = OM(ALLINST) },
+   [ROGUE_CTRL_OP_MOD_END] = { .str = "end", },
 };
+#undef OM
 
 #define OM(op_mod) BITFIELD64_BIT(ROGUE_CTRL_OP_MOD_##op_mod)
 #define T(type) BITFIELD64_BIT(ROGUE_REF_TYPE_##type - 1)
@@ -230,7 +235,13 @@ const rogue_ctrl_op_info 
rogue_ctrl_op_infos[ROGUE_CTRL_OP_COUNT] = {
                .supported_op_mods = OM(END),
        },
        [ROGUE_CTRL_OP_WOP] = { .str = "wop", },
-       [ROGUE_CTRL_OP_BA] = { .str = "ba", .has_target = true, .ends_block = 
true, },
+       [ROGUE_CTRL_OP_BR] = { .str = "br", .has_target = true, .ends_block = 
true,
+               .supported_op_mods = OM(LINK) | OM(ALLINST) | OM(ANYINST),
+   },
+       [ROGUE_CTRL_OP_BA] = { .str = "ba", .ends_block = true, .num_srcs = 1,
+               .supported_op_mods = OM(LINK) | OM(ALLINST) | OM(ANYINST),
+      .supported_src_types = { [0] = T(VAL), },
+   },
        [ROGUE_CTRL_OP_WDF] = { .str = "wdf", .num_srcs = 1,
       .supported_src_types = { [0] = T(DRC), },
    },

Reply via email to