rs6000: Add len_load/len_store optab support
authorKewen Lin <linkw@linux.ibm.com>
Wed, 8 Jul 2020 07:44:02 +0000 (02:44 -0500)
committerKewen Lin <linkw@linux.ibm.com>
Wed, 8 Jul 2020 07:48:01 +0000 (02:48 -0500)
Define rs6000 specific len_load/len_store for the LEN_LOAD/LEN_STORE
internal function's expansion.  As the doc description of the
len_load/len_store optab shows, we should use V16QI to wrap those
available vector modes.

gcc/ChangeLog:

* config/rs6000/vsx.md (len_load_v16qi): New define_expand.
(len_store_v16qi): Likewise.

gcc/config/rs6000/vsx.md

index 732a54842b61afd289bd00552335aa3a1536422b..42a31a60b0e8b75618920247deeedbcbdf83cdb6 100644 (file)
   operands[3] = gen_reg_rtx (DImode);
 })
 
+;; Define optab for vector access with length vectorization exploitation.
+(define_expand "len_load_v16qi"
+  [(match_operand:V16QI 0 "vlogical_operand")
+   (match_operand:V16QI 1 "memory_operand")
+   (match_operand:QI 2 "gpc_reg_operand")]
+  "TARGET_P9_VECTOR && TARGET_64BIT"
+{
+  rtx mem = XEXP (operands[1], 0);
+  mem = force_reg (DImode, mem);
+  rtx len = gen_lowpart (DImode, operands[2]);
+  emit_insn (gen_lxvl (operands[0], mem, len));
+  DONE;
+})
+
+(define_expand "len_store_v16qi"
+  [(match_operand:V16QI 0 "memory_operand")
+   (match_operand:V16QI 1 "vlogical_operand")
+   (match_operand:QI 2 "gpc_reg_operand")
+  ]
+  "TARGET_P9_VECTOR && TARGET_64BIT"
+{
+  rtx mem = XEXP (operands[0], 0);
+  mem = force_reg (DImode, mem);
+  rtx len = gen_lowpart (DImode, operands[2]);
+  emit_insn (gen_stxvl (operands[1], mem, len));
+  DONE;
+})
+
 (define_insn "*stxvl"
   [(set (mem:V16QI (match_operand:DI 1 "gpc_reg_operand" "b"))
        (unspec:V16QI