On Sun, Dec 6, 2020 at 7:51 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> commit 266f44a91c0c9705d3d18e82d7c5bab32927a18f
> Author: H.J. Lu <hjl.to...@gmail.com>
> Date:   Sun May 17 10:10:34 2020 -0700
>
>     x86: Allow V1TI vector register pushes
>
>     Add V1TI vector register push and split it after reload to a sequence
>     of:
>
>     (set (reg:P SP_REG) (plus:P SP_REG) (const_int -8)))
>     (set (match_dup 0) (match_dup 1))
>
> added a pseudo register push check.  But
>
> (insn 13 12 14 3 (set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0  S4 A32])
>         (reg/v:SI 87 [ srclen ])) "x.c":37:16 54 {*pushsi2}
>      (expr_list:REG_DEAD (reg/v:SI 87 [ srclen ])
>         (expr_list:REG_ARGS_SIZE (const_int 4 [0x4])
>             (nil))))
>
> is not a pseudo register push.  In 64-bit mode, mode of pseudo register
> push is TImode.  In 32-bit mode, it is DImode.  Add pseudo register push
> mode check to pseudo_reg_set.
>
> gcc/
>
>         PR target/98161
>         * config/i386/i386-features.c (pseudo_reg_set): Check mode of
>         pseudo register push.
>
> gcc/testsuite/
>
>         * gcc.target/i386/pr98161.c: New test.
> ---
>  gcc/config/i386/i386-features.c         |  2 ++
>  gcc/testsuite/gcc.target/i386/pr98161.c | 48 +++++++++++++++++++++++++
>  2 files changed, 50 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr98161.c
>
> diff --git a/gcc/config/i386/i386-features.c b/gcc/config/i386/i386-features.c
> index ff6676f54f7..8ac11b13ad2 100644
> --- a/gcc/config/i386/i386-features.c
> +++ b/gcc/config/i386/i386-features.c
> @@ -1266,8 +1266,10 @@ pseudo_reg_set (rtx_insn *insn)
>      return NULL;
>
>    /* Check pseudo register push first. */
> +  machine_mode mode = TARGET_64BIT ? TImode : DImode;
>    if (REG_P (SET_SRC (set))
>        && !HARD_REGISTER_P (SET_SRC (set))
> +      && GET_MODE (SET_DEST (set)) == mode
>        && push_operand (SET_DEST (set), GET_MODE (SET_DEST (set))))

&& push_operand (SET_DEST (set), mode)

instead?

push_operand checks the mode by itself:

--q--
int
push_operand (rtx op, machine_mode mode)
{
  if (!MEM_P (op))
    return 0;

  if (mode != VOIDmode && GET_MODE (op) != mode)
    return 0;
  ...
-/q-

Uros.

Reply via email to