rs6000: Add len_load/len_store optab support

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.
This commit is contained in:
Kewen Lin 2020-07-08 02:44:02 -05:00
parent d496134a6b
commit 4070208f23

View File

@ -5100,6 +5100,34 @@
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