nouveau/mme: Fix nested while instructions on Turing+
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Thu, 9 Mar 2023 21:45:44 +0000 (15:45 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:32:04 +0000 (21:32 +0000)
Closes: https://gitlab.freedesktop.org/nouveau/mesa/-/issues/49
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/mme/mme_tu104_builder.c
src/nouveau/mme/tests/mme_tu104_sim_hw_test.cpp

index 8fc8ad5..99be133 100644 (file)
@@ -681,6 +681,11 @@ mme_tu104_end_while(struct mme_builder *b,
                       (if_true ? BITFIELD_BIT(15) : 0);
    build_alu_to(b, mme_zero(), mme_cmp_to_tu104_branch_op(cmp),
                 x, y, control, true);
+
+   /* Start a new instruction so next thing to come along doesn't end up being
+    * the 2nd half of of our back-edge while.
+    */
+   mme_tu104_new_inst(tb);
 }
 
 uint32_t *
index 24c1e6a..5f2ff12 100644 (file)
@@ -1264,6 +1264,44 @@ WHILE_TEST(ine, 0, 1, 7)
 
 #undef WHILE_TEST
 
+TEST_F(mme_tu104_sim_test, nested_while)
+{
+   mme_builder b;
+   mme_builder_init(&b, devinfo);
+
+   mme_value n = mme_load(&b);
+   mme_value m = mme_load(&b);
+
+   mme_value count = mme_mov(&b, mme_zero());
+
+   mme_value i = mme_mov(&b, mme_zero());
+   mme_value j = mme_mov(&b, mme_imm(0xffff));
+   mme_while(&b, ine, i, n) {
+      mme_mov_to(&b, j, mme_zero());
+      mme_while(&b, ine, j, m) {
+         mme_add_to(&b, count, count, mme_imm(1));
+         mme_add_to(&b, j, j, mme_imm(1));
+      }
+
+      mme_add_to(&b, i, i, mme_imm(1));
+   }
+
+   mme_store_imm_addr(&b, data_addr + 0, i);
+   mme_store_imm_addr(&b, data_addr + 4, j);
+   mme_store_imm_addr(&b, data_addr + 8, count);
+
+   auto macro = mme_builder_finish_vec(&b);
+
+   std::vector<uint32_t> params;
+   params.push_back(3);
+   params.push_back(5);
+
+   test_macro(&b, macro, params);
+   ASSERT_EQ(data[0], 3);
+   ASSERT_EQ(data[1], 5);
+   ASSERT_EQ(data[2], 15);
+}
+
 #if 0
 TEST_F(mme_tu104_sim_test, do_ble)
 {