]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
amdgcn: Add vec_extract for partial vectors
authorAndrew Stubbs <ams@codesourcery.com>
Mon, 29 Jun 2020 14:20:09 +0000 (15:20 +0100)
committerAndrew Stubbs <ams@codesourcery.com>
Wed, 12 Oct 2022 10:41:38 +0000 (11:41 +0100)
Add vec_extract expanders for all valid pairs of vector types.

gcc/ChangeLog:

* config/gcn/gcn-protos.h (get_exec): Add prototypes for two variants.
* config/gcn/gcn-valu.md
(vec_extract<V_ALL:mode><V_ALL_ALT:mode>): New define_expand.
* config/gcn/gcn.cc (get_exec): Export the existing function. Add a
new overload variant.

gcc/ChangeLog.omp
gcc/config/gcn/gcn-protos.h
gcc/config/gcn/gcn-valu.md
gcc/config/gcn/gcn.cc

index 24dff91a9aaa0c4d644f1e0a464ea7738fd4e519..e52be6315ebca3e4be8cb2557949493636bd8a2a 100644 (file)
@@ -1,3 +1,14 @@
+2022-10-12  Andrew Stubbs  <ams@codesourcery.com>
+
+       Backport from mainline:
+       2022-10-11  Andrew Stubbs  <ams@codesourcery.com>
+
+       * config/gcn/gcn-protos.h (get_exec): Add prototypes for two variants.
+       * config/gcn/gcn-valu.md
+       (vec_extract<V_ALL:mode><V_ALL_ALT:mode>): New define_expand.
+       * config/gcn/gcn.cc (get_exec): Export the existing function. Add a
+       new overload variant.
+
 2022-10-12  Andrew Stubbs  <ams@codesourcery.com>
 
        Backport from mainline:
index 6300c1cbd3662d0e38d28a9f3065ab8472b4a4ad..f9a1fc00b4f0c1561c5b7e6ddd31282f4f849e68 100644 (file)
@@ -24,6 +24,8 @@ extern bool gcn_constant64_p (rtx);
 extern bool gcn_constant_p (rtx);
 extern rtx gcn_convert_mask_mode (rtx reg);
 extern unsigned int gcn_dwarf_register_number (unsigned int regno);
+extern rtx get_exec (int64_t);
+extern rtx get_exec (machine_mode mode);
 extern char * gcn_expand_dpp_shr_insn (machine_mode, const char *, int, int);
 extern void gcn_expand_epilogue ();
 extern rtx gcn_expand_scaled_offsets (addr_space_t as, rtx base, rtx offsets,
index cecaa1c0ff72ca742589e461ba70ee6ff16ed407..0b0055e3402b1f96d5655ed3e13e348d9ff9383b 100644 (file)
    (set_attr "exec" "none")
    (set_attr "laneselect" "yes")])
 
+(define_expand "vec_extract<V_ALL:mode><V_ALL_ALT:mode>"
+  [(set (match_operand:V_ALL_ALT 0 "register_operand")
+       (vec_select:V_ALL_ALT
+         (match_operand:V_ALL 1 "register_operand")
+         (parallel [(match_operand 2 "immediate_operand")])))]
+  "MODE_VF (<V_ALL_ALT:MODE>mode) < MODE_VF (<V_ALL:MODE>mode)
+   && <V_ALL_ALT:SCALAR_MODE>mode == <V_ALL:SCALAR_MODE>mode"
+  {
+    int numlanes = GET_MODE_NUNITS (<V_ALL_ALT:MODE>mode);
+    int firstlane = INTVAL (operands[2]) * numlanes;
+    rtx tmp;
+
+    if (firstlane == 0)
+      {
+       /* A plain move will do.  */
+       tmp = operands[1];
+      } else {
+        /* FIXME: optimize this by using DPP where available.  */
+
+        rtx permutation = gen_reg_rtx (<V_ALL:VnSI>mode);
+       emit_insn (gen_vec_series<V_ALL:vnsi> (permutation,
+                                              GEN_INT (firstlane*4),
+                                              GEN_INT (4)));
+
+       tmp = gen_reg_rtx (<V_ALL:MODE>mode);
+       emit_insn (gen_ds_bpermute<V_ALL:mode> (tmp, permutation, operands[1],
+                                               get_exec (<V_ALL:MODE>mode)));
+      }
+
+    emit_move_insn (operands[0],
+                   gen_rtx_SUBREG (<V_ALL_ALT:MODE>mode, tmp, 0));
+    DONE;
+  })
+
 (define_expand "extract_last_<mode>"
   [(match_operand:<SCALAR_MODE> 0 "register_operand")
    (match_operand:DI 1 "gcn_alu_operand")
index 3525ac00df7b638445e95c1ad9cc2c55e02999ac..9c0c44dfa512dce076c87a8b2e771281aed9f879 100644 (file)
@@ -856,7 +856,7 @@ gcn_ira_change_pseudo_allocno_class (int regno, reg_class_t cl,
 /* Create a new DImode pseudo reg and emit an instruction to initialize
    it to VAL.  */
 
-static rtx
+rtx
 get_exec (int64_t val)
 {
   rtx reg = gen_reg_rtx (DImode);
@@ -864,6 +864,13 @@ get_exec (int64_t val)
   return reg;
 }
 
+rtx
+get_exec (machine_mode mode)
+{
+  int vf = (VECTOR_MODE_P (mode) ? GET_MODE_NUNITS (mode) : 1);
+  return get_exec (0xffffffffffffffffUL >> (64-vf));
+}
+
 /* }}}  */
 /* {{{ Immediate constants.  */