aco: add tests for fma with opsel
authorGeorg Lehmann <dadschoorse@gmail.com>
Tue, 21 Mar 2023 13:24:28 +0000 (14:24 +0100)
committerMarge Bot <emma+marge@anholt.net>
Thu, 30 Mar 2023 03:34:34 +0000 (03:34 +0000)
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22069>

src/amd/compiler/tests/test_optimizer.cpp

index cc8a09d..90a8abb 100644 (file)
@@ -1947,3 +1947,35 @@ BEGIN_TEST(optimize.fmamix_two_literals)
       finish_opt_test();
    }
 END_TEST
+
+BEGIN_TEST(optimize.fma_opsel)
+   /* TODO make these work before GFX11 using SDWA. */
+   for (unsigned i = GFX11; i <= GFX11; i++) {
+      //>> v2b: %a, v2b: %b, v1: %c, v1: %d, v1: %e  = p_startpgm
+      if (!setup_cs("v2b v2b v1 v1 v1", (amd_gfx_level)i))
+         continue;
+
+      Temp a = inputs[0];
+      Temp b = inputs[1];
+      Temp c = inputs[2];
+      Temp d = inputs[3];
+      Temp e = inputs[4];
+      Temp c_hi = bld.pseudo(aco_opcode::p_extract_vector, bld.def(v2b), c, Operand::c32(1));
+      Temp d_hi = bld.pseudo(aco_opcode::p_extract_vector, bld.def(v2b), d, Operand::c32(1));
+      Temp e_hi = bld.pseudo(aco_opcode::p_extract_vector, bld.def(v2b), e, Operand::c32(1));
+
+      //! v2b: %res0 = v_fma_f16 %b, hi(%c), %a
+      //! p_unit_test 0, %res0
+      writeout(0, fadd(fmul(b, c_hi), a));
+
+      //! v2b: %res1 = v_fma_f16 %a, %b, hi(%d)
+      //! p_unit_test 1, %res1
+      writeout(1, fadd(fmul(a, b), d_hi));
+
+      //! v2b: %res2 = v_fma_f16 %a, %b, hi(%e)
+      //! p_unit_test 2, %res2
+      writeout(2, fma(a, b, e_hi));
+
+      finish_opt_test();
+   }
+END_TEST