On Mon, 2020-06-15 at 16:37 -0700, Carl Love via Gcc-patches wrote:
> v2 changes
> 
> config/rs6000/altivec.md log entry for move from changed as
> suggested.
> 
> config/rs6000/vsx.md log entro for moved to here changed as
> suggested.
> 
> define_mode_iterator VI2 also moved, included in both change log
> entries
> 
> --------------------------------------------
> GCC maintainers:
> 
> Move the existing vector extract support in altivec.md to vsx.md
> so all of the vector insert and extract support is in the same file.
> 
> The patch also updates the name of the builtins and descriptions for
> the
> builtins in the documentation file so they match the approved builtin
> names and descriptions.
> 
> The patch does not make any functional changes.
> 
> Please let me know if the changes are acceptable.  Thanks.
> 
>                   Carl Love
> 
> ------------------------------------------------------
> 
> gcc/ChangeLog
> 
> 2020-06-15  Carl Love  <c...@us.ibm.com>
> 
>         * config/rs6000/altivec.md: (UNSPEC_EXTRACTL,
> UNSPEC_EXTRACTR)
>       (vextractl<mode>, vextractr<mode>)
>         (vextractl<mode>_internal, vextractr<mode>_internal)
>       (VI2): Move to gcc/config/rs6000/vsx.md.
>       * config/rs6000/vsx.md: (UNSPEC_EXTRACTL, UNSPEC_EXTRACTR)
>         (vextractl<mode>, vextractr<mode>)
>         (vextractl<mode>_internal, vextractr<mode>_internal)
>       (VI2): Code was moved from config/rs6000/altivec.md.

Compare the syntax with other patches that move code.  This should be
simplifiable as

        * config/rs6000/altivec.md: (UNSPEC_EXTRACTL,
UNSPEC_EXTRACTR)
        (vextractl<mode>, vextractr<mode>)
        (vextractl<mode>_internal, vextractr<mode>_internal)
        (VI2): Move to ..
        * config/rs6000/vsx.md: (UNSPEC_EXTRACTL, UNSPEC_EXTRACTR)
        (vextractl<mode>, vextractr<mode>)
        (vextractl<mode>_internal, vextractr<mode>_internal)
        (VI2): .. here.




>       * gcc/doc/extend.texi: Update documentation for vec_extractl.
>       Replace builtin name vec_extractr with vec_extracth.  Update description
>       of vec_extracth.
> ---
>  gcc/config/rs6000/altivec.md | 64 -------------------------------
>  gcc/config/rs6000/vsx.md     | 66 ++++++++++++++++++++++++++++++++
>  gcc/doc/extend.texi          | 73 +++++++++++++++++-------------------
>  3 files changed, 101 insertions(+), 102 deletions(-)
> 
> diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
> index 159f24ebc10..0b0b49ee056 100644
> --- a/gcc/config/rs6000/altivec.md
> +++ b/gcc/config/rs6000/altivec.md
> @@ -171,8 +171,6 @@
>     UNSPEC_XXEVAL
>     UNSPEC_VSTRIR
>     UNSPEC_VSTRIL
> -   UNSPEC_EXTRACTL
> -   UNSPEC_EXTRACTR
>  ])
> 
>  (define_c_enum "unspecv"
> @@ -183,8 +181,6 @@
>     UNSPECV_DSS
>    ])
> 
> -;; Like VI, defined in vector.md, but add ISA 2.07 integer vector ops
> -(define_mode_iterator VI2 [V4SI V8HI V16QI V2DI])
>  ;; Short vec int modes
>  (define_mode_iterator VIshort [V8HI V16QI])
>  ;; Longer vec int modes for rotate/mask ops
> @@ -785,66 +781,6 @@
>    DONE;
>  })
> 
> -(define_expand "vextractl<mode>"
> -  [(set (match_operand:V2DI 0 "altivec_register_operand")
> -     (unspec:V2DI [(match_operand:VI2 1 "altivec_register_operand")
> -                   (match_operand:VI2 2 "altivec_register_operand")
> -                   (match_operand:SI 3 "register_operand")]
> -                  UNSPEC_EXTRACTL))]
> -  "TARGET_FUTURE"
> -{
> -  if (BYTES_BIG_ENDIAN)
> -    {
> -      emit_insn (gen_vextractl<mode>_internal (operands[0], operands[1],
> -                                            operands[2], operands[3]));
> -      emit_insn (gen_xxswapd_v2di (operands[0], operands[0]));
> -    }
> -  else
> -    emit_insn (gen_vextractr<mode>_internal (operands[0], operands[2],
> -                                          operands[1], operands[3]));
> -  DONE;
> -})
> -
> -(define_insn "vextractl<mode>_internal"
> -  [(set (match_operand:V2DI 0 "altivec_register_operand" "=v")
> -     (unspec:V2DI [(match_operand:VEC_I 1 "altivec_register_operand" "v")
> -                   (match_operand:VEC_I 2 "altivec_register_operand" "v")
> -                   (match_operand:SI 3 "register_operand" "r")]
> -                  UNSPEC_EXTRACTL))]
> -  "TARGET_FUTURE"
> -  "vext<du_or_d><wd>vlx %0,%1,%2,%3"
> -  [(set_attr "type" "vecsimple")])
> -
> -(define_expand "vextractr<mode>"
> -  [(set (match_operand:V2DI 0 "altivec_register_operand")
> -     (unspec:V2DI [(match_operand:VI2 1 "altivec_register_operand")
> -                   (match_operand:VI2 2 "altivec_register_operand")
> -                   (match_operand:SI 3 "register_operand")]
> -                  UNSPEC_EXTRACTR))]
> -  "TARGET_FUTURE"
> -{
> -  if (BYTES_BIG_ENDIAN)
> -    {
> -      emit_insn (gen_vextractr<mode>_internal (operands[0], operands[1],
> -                                            operands[2], operands[3]));
> -      emit_insn (gen_xxswapd_v2di (operands[0], operands[0]));
> -    }
> -  else
> -    emit_insn (gen_vextractl<mode>_internal (operands[0], operands[2],
> -                                          operands[1], operands[3]));
> -  DONE;
> -})
> -
> -(define_insn "vextractr<mode>_internal"
> -  [(set (match_operand:V2DI 0 "altivec_register_operand" "=v")
> -     (unspec:V2DI [(match_operand:VEC_I 1 "altivec_register_operand" "v")
> -                   (match_operand:VEC_I 2 "altivec_register_operand" "v")
> -                   (match_operand:SI 3 "register_operand" "r")]
> -                  UNSPEC_EXTRACTR))]
> -  "TARGET_FUTURE"
> -  "vext<du_or_d><wd>vrx %0,%1,%2,%3"
> -  [(set_attr "type" "vecsimple")])
> -
>  (define_expand "vstrir_<mode>"
>    [(set (match_operand:VIshort 0 "altivec_register_operand")
>       (unspec:VIshort [(match_operand:VIshort 1 "altivec_register_operand")]
> diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
> index 2a28215ac5b..51ffe2d2000 100644
> --- a/gcc/config/rs6000/vsx.md
> +++ b/gcc/config/rs6000/vsx.md
> @@ -344,8 +344,13 @@
>     UNSPEC_VSX_FIRST_MISMATCH_INDEX
>     UNSPEC_VSX_FIRST_MISMATCH_EOS_INDEX
>     UNSPEC_XXGENPCV
> +   UNSPEC_EXTRACTL
> +   UNSPEC_EXTRACTR
>    ])
> 
> +;; Like VI, defined in vector.md, but add ISA 2.07 integer vector ops
> +(define_mode_iterator VI2 [V4SI V8HI V16QI V2DI])
> +
>  ;; VSX moves
> 
>  ;; The patterns for LE permuted loads and stores come before the general
> @@ -3781,6 +3786,67 @@
>  }
>    [(set_attr "type" "load")])
> 
> +;; ISA 3.1 extract
> +(define_expand "vextractl<mode>"
> +  [(set (match_operand:V2DI 0 "altivec_register_operand")
> +     (unspec:V2DI [(match_operand:VI2 1 "altivec_register_operand")
> +                   (match_operand:VI2 2 "altivec_register_operand")
> +                   (match_operand:SI 3 "register_operand")]
> +                  UNSPEC_EXTRACTL))]
> +  "TARGET_FUTURE"
> +{
> +  if (BYTES_BIG_ENDIAN)
> +    {
> +      emit_insn (gen_vextractl<mode>_internal (operands[0], operands[1],
> +                                            operands[2], operands[3]));
> +      emit_insn (gen_xxswapd_v2di (operands[0], operands[0]));
> +    }
> +  else
> +    emit_insn (gen_vextractr<mode>_internal (operands[0], operands[2],
> +                                          operands[1], operands[3]));
> +  DONE;
> +})
> +
> +(define_insn "vextractl<mode>_internal"
> +  [(set (match_operand:V2DI 0 "altivec_register_operand" "=v")
> +     (unspec:V2DI [(match_operand:VEC_I 1 "altivec_register_operand" "v")
> +                   (match_operand:VEC_I 2 "altivec_register_operand" "v")
> +                   (match_operand:SI 3 "register_operand" "r")]
> +                  UNSPEC_EXTRACTL))]
> +  "TARGET_FUTURE"
> +  "vext<du_or_d><wd>vlx %0,%1,%2,%3"
> +  [(set_attr "type" "vecsimple")])
> +
> +(define_expand "vextractr<mode>"
> +  [(set (match_operand:V2DI 0 "altivec_register_operand")
> +     (unspec:V2DI [(match_operand:VI2 1 "altivec_register_operand")
> +                   (match_operand:VI2 2 "altivec_register_operand")
> +                   (match_operand:SI 3 "register_operand")]
> +                  UNSPEC_EXTRACTR))]
> +  "TARGET_FUTURE"
> +{
> +  if (BYTES_BIG_ENDIAN)
> +    {
> +      emit_insn (gen_vextractr<mode>_internal (operands[0], operands[1],
> +                                            operands[2], operands[3]));
> +      emit_insn (gen_xxswapd_v2di (operands[0], operands[0]));
> +    }
> +  else
> +    emit_insn (gen_vextractl<mode>_internal (operands[0], operands[2],
> +                                          operands[1], operands[3]));
> +  DONE;
> +})
> +
> +(define_insn "vextractr<mode>_internal"
> +  [(set (match_operand:V2DI 0 "altivec_register_operand" "=v")
> +     (unspec:V2DI [(match_operand:VEC_I 1 "altivec_register_operand" "v")
> +                   (match_operand:VEC_I 2 "altivec_register_operand" "v")
> +                   (match_operand:SI 3 "register_operand" "r")]
> +                  UNSPEC_EXTRACTR))]
> +  "TARGET_FUTURE"
> +  "vext<du_or_d><wd>vrx %0,%1,%2,%3"
> +  [(set_attr "type" "vecsimple")])
> +
>  ;; VSX_EXTRACT optimizations
>  ;; Optimize double d = (double) vec_extract (vi, <n>)
>  ;; Get the element into the top position and use XVCVSWDP/XVCVUWDP
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index e656e66a80c..5549a695b42 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -20919,6 +20919,9 @@ Perform a 128-bit vector gather  operation, as if 
> implemented by the Future
>  integer value between 2 and 7 inclusive.
>  @findex vec_gnb
> 
> +
> +Vector Extract
> +
>  @smallexample
>  @exdent vector unsigned long long int
>  @exdent vec_extractl (vector unsigned char, vector unsigned char, unsigned 
> int)
> @@ -20929,51 +20932,45 @@ integer value between 2 and 7 inclusive.
>  @exdent vector unsigned long long int
>  @exdent vec_extractl (vector unsigned long long, vector unsigned long long, 
> unsigned int)
>  @end smallexample
> -Extract a single element from the vector formed by catenating this function's
> -first two arguments at the byte offset specified by this function's
> -third argument.  On big-endian targets, this function behaves as if
> -implemented by the Future @code{vextdubvlx}, @code{vextduhvlx},
> -@code{vextduwvlx}, or @code{vextddvlx} instructions, depending on the
> -types of the function's first two arguments.  On little-endian
> -targets, this function behaves as if implemented by the Future
> -@code{vextdubvrx}, @code{vextduhvrx},
> -@code{vextduwvrx}, or @code{vextddvrx} instructions.
> -The byte offset of the element to be extracted is calculated
> -by computing the remainder of dividing the third argument by 32.
> -If this reminader value is not a multiple of the vector element size,
> -or if its value added to the vector element size exceeds 32, the
> -result is undefined.
> +Extract an element from two concatenated vectors starting at the given byte 
> index
> +in natural-endian order, and place it zero-extended in doubleword 1 of the 
> result
> +according to natural element order.  If the byte index is out of range for 
> the
> +data type, the intrinsic will be rejected.
> +For little-endian, this output will match the placement by the hardware
> +instruction, i.e., dword[0] in RTL notation.  For big-endian, an additional
> +instruction is needed to move it from the "left" doubleword to the  "right" 
> one.
> +For little-endian, semantics matching the vextdu*vrx instruction will be
> +generated, while for big-endian, semantics matching the vextdu*vlx 
> instruction

The instructions should be wrapped in @code{foo}.

After a very quick halfhearted glance I don't see any instruction
wildcards in the existing texi,  I think either convert the instruction
references to using the longword descriptions "Vector extract double
unsigned .. using left-index"  or leave as the instruction searchable 
@code{vextdubvrx} references.

> +will be generated.  Note that some fairly anomalous results can be generated 
> if
> +the byte index is not aligned on an element boundary for the element being
> +extracted.  This is a limitation of the bi-endian vector programming model is
> +consistent with the limitation on vec_perm, for example.
>  @findex vec_extractl
> 
>  @smallexample
>  @exdent vector unsigned long long int
> -@exdent vec_extractr (vector unsigned char, vector unsigned char, unsigned 
> int)
> +@exdent vec_extracth (vector unsigned char, vector unsigned char, unsigned 
> int)
>  @exdent vector unsigned long long int
> -@exdent vec_extractr (vector unsigned short, vector unsigned short, unsigned 
> int)
> +@exdent vec_extracth (vector unsigned short, vector unsigned short, unsigned 
> int)
>  @exdent vector unsigned long long int
> -@exdent vec_extractr (vector unsigned int, vector unsigned int, unsigned int)
> +@exdent vec_extracth (vector unsigned int, vector unsigned int, unsigned int)
>  @exdent vector unsigned long long int
> -@exdent vec_extractr (vector unsigned long long, vector unsigned long long, 
> unsigned int)
> -@end smallexample
> -Extract a single element from the vector formed by catenating this function's
> -first two arguments at the byte offset calculated by subtracting this
> -function's third argument from 31.  On big-endian targets, this
> -function behaves as if
> -implemented by the Future
> -@code{vextdubvrx}, @code{vextduhvrx},
> -@code{vextduwvrx}, or @code{vextddvrx} instructions, depending on the
> -types of the function's first two arguments.
> -On little-endian
> -targets, this function behaves as if implemented by the Future
> -@code{vextdubvlx}, @code{vextduhvlx},
> -@code{vextduwvlx}, or @code{vextddvlx} instructions.
> -The byte offset of the element to be extracted, measured from the
> -right end of the catenation of the two vector arguments, is calculated
> -by computing the remainder of dividing the third argument by 32.
> -If this reminader value is not a multiple of the vector element size,
> -or if its value added to the vector element size exceeds 32, the
> -result is undefined.
> -@findex vec_extractr
> +@exdent vec_extracth (vector unsigned long long, vector unsigned long long, 
> unsigned int)
> +@end smallexample
> +Extract an element from two concatenated vectors starting at the given byte 
> index
> +in opposite-endian order, and place it zero-extended in doubleword 1 
> according to
> +natural element order.  If the byte index is out of range for the data type,
> +the intrinsic will be rejected.  For little-endian,
> +this output will match the placement by the hardware instruction, i.e., 
> dword[0]
> +in RTL notation.  For big-endian, an additional instruction is needed to 
> move it
> +from the "left" doubleword to the "right" one.  For little-endian, semantics
> +matching the vextdu*vlx instruction will be generated, while for big-endian,
> +semantics matching the vextdu*vrx instruction will be generated.  Note that 
> some
> +fairly anomalous results can be generated if the byte index is not aligned 
> on the
> +element boundary for the element being extracted.  This is a
> +limitation of the bi-endian vector programming model consistent with the
> +limitation on vec_perm, for example.
> +@findex vec_extracth
> 
>  @smallexample
>  @exdent vector unsigned long long int


Reply via email to