Hi! On Mon, Jun 01, 2020 at 09:14:47AM -0700, Carl Love wrote: > * config/rs6000/altivec.h: Add define for vec_replace_elt and > vec_replace_unaligned. * config/rs6000/altivec.h (vec_replace_elt, vec_replace_unaligned): New defines.
> * config/rs6000/vsx.md: Add unspec UNSPEC_REPLACE_ELT and > UNSPEC_REPLACE_UN. > Add mode iterator REPLACE_ELT. > Add mode attributes REPLACE_ELT_atr, REPLACE_ELT_inst, > REPLACE_ELT_char, REPLACE_ELT_sh, REPLACE_ELT_max. > Add define_expand vreplace_elt_<mode>, mode REPLACE_ELT. > Add define_expand vreplace_un_<mode>, mode REPLACE_ELT. > Add define_insn vreplace_elt_<mode>_inst, mode REPLACE_ELT. * config/rs6000/vsx.md (UNSPEC_REPLACE_ELT, UNSPEC_REPLACE_UN): New. (REPLACE_ELT): New mode iterator. (REPLACE_ELT_atr, REPLACE_ELT_inst, REPLACE_ELT_char, REPLACE_ELT_sh, REPLACE_ELT_max): New mode attributes. (vreplace_elt_<mode>, vreplace_un_<mode>, vreplace_elt_<mode>_inst for REPLACE_ELT): New. (etc.) > (builtin_function_type): Add case statements for > FUTURE_BUILTIN_VREPLACE_ELT_UV4SI, > FUTURE_BUILTIN_VREPLACE_ELT_UV2DI, > FUTURE_BUILTIN_VREPLACE_UN_UV4SI, > FUTURE_BUILTIN_VREPLACE_UN_UV2DI. (builtin_function_type) [FUTURE_BUILTIN_VREPLACE_ELT_UV4SI, FUTURE_BUILTIN_VREPLACE_ELT_UV2DI, FUTURE_BUILTIN_VREPLACE_UN_UV4SI, FUTURE_BUILTIN_VREPLACE_UN_UV2DI]: New cases. > + /* Check whether the 3rd argument is an integer constant in the > range > + 0 to 3 inclusive. */ > + STRIP_NOPS (arg2); > + if (TREE_CODE (arg2) != INTEGER_CST || TREE_INT_CST_LOW (arg2) > > 3) Hrm, does this test that is it non-negative as well? Maybe it should use something like if (TREE_CODE (arg2) != INTEGER_CST || !IN_RANGE (TREE_INT_CST_LOW (arg2), 0, 3)) (same below, for 0..12). > +(define_mode_attr REPLACE_ELT_atr [(V4SI "SI") (V4SF "SF") > + (V2DI "DI") (V2DF "DF")]) You can use VS_scalar wherever you use this? > +(define_mode_attr REPLACE_ELT_inst [(V4SI "v4si") (V4SF "v4sf") > + (V2DI "v2di") (V2DF "v2df")]) This one is just <mode>. > > +(define_expand "vreplace_elt_<mode>" > + [(set (match_operand:REPLACE_ELT 0 "register_operand") > + (unspec:REPLACE_ELT [(match_operand:REPLACE_ELT 1 "register_operand") Indent is a bit wrong here (the "unspec" should line up with the "match_operand"). > + Endianess if needed. */ (two n's in endianness). I think the rest is fine. Okay for trunk with these things fixed, or resend it if you prefer? Thanks! Segher