A patch committed on 2018-01-10 is causing an ICE with existing test
program $GCC_SRC/gcc/testsuite/gcc.target/powerpc/pr83399.c, when
compiled with the -m32 option.  At the time of the commit, it was
thought that this was a problem with the recent resolution of PR83399.
However, further investigation revealed a problem with the patch that
was just committed.  The generated code did not distinguish between 32-
and 64-bit targets.

This patch corrects that problem.

This has been bootstrapped and tested without regressions on
powerpc64le-unknown-linux (P8) and on powerpc64-unknown-linux (P7) with
both -m32 and -m64 target options.  Is this ok for trunk?


gcc/ChangeLog:

2018-01-16  Kelvin Nilsen  <kel...@gcc.gnu.org>

        * config/rs6000/rs6000-p8swap.c (rs6000_gen_stvx): Generate
        different rtl trees depending on TARGET_64BIT.
        (rs6000_gen_lvx): Likewise.

Index: gcc/config/rs6000/rs6000-p8swap.c
===================================================================
--- gcc/config/rs6000/rs6000-p8swap.c   (revision 256710)
+++ gcc/config/rs6000/rs6000-p8swap.c   (working copy)
@@ -1554,23 +1554,31 @@ rs6000_gen_stvx (enum machine_mode mode, rtx dest_
       op1 = XEXP (memory_address, 0);
       op2 = XEXP (memory_address, 1);
       if (mode == V16QImode)
-       stvx = gen_altivec_stvx_v16qi_2op (src_exp, op1, op2);
+       stvx = TARGET_64BIT ? gen_altivec_stvx_v16qi_2op (src_exp, op1, op2)
+         : gen_altivec_stvx_v16qi_2op_si (src_exp, op1, op2);
       else if (mode == V8HImode)
-       stvx = gen_altivec_stvx_v8hi_2op (src_exp, op1, op2);
+       stvx = TARGET_64BIT ? gen_altivec_stvx_v8hi_2op (src_exp, op1, op2)
+         : gen_altivec_stvx_v8hi_2op_si (src_exp, op1, op2);
 #ifdef HAVE_V8HFmode
       else if (mode == V8HFmode)
-       stvx = gen_altivec_stvx_v8hf_2op (src_exp, op1, op2);
+       stvx = TARGET_64BIT ? gen_altivec_stvx_v8hf_2op (src_exp, op1, op2)
+         : gen_altivec_stvx_v8hf_2op_si (src_exp, op1, op2);
 #endif
       else if (mode == V4SImode)
-       stvx = gen_altivec_stvx_v4si_2op (src_exp, op1, op2);
+       stvx = TARGET_64BIT ? gen_altivec_stvx_v4si_2op (src_exp, op1, op2)
+         : gen_altivec_stvx_v4si_2op_si (src_exp, op1, op2);
       else if (mode == V4SFmode)
-       stvx = gen_altivec_stvx_v4sf_2op (src_exp, op1, op2);
+       stvx = TARGET_64BIT ? gen_altivec_stvx_v4sf_2op (src_exp, op1, op2)
+         : gen_altivec_stvx_v4sf_2op_si (src_exp, op1, op2);
       else if (mode == V2DImode)
-       stvx = gen_altivec_stvx_v2di_2op (src_exp, op1, op2);
+       stvx = TARGET_64BIT ? gen_altivec_stvx_v2di_2op (src_exp, op1, op2)
+         : gen_altivec_stvx_v2di_2op_si (src_exp, op1, op2);
       else if (mode == V2DFmode)
-       stvx = gen_altivec_stvx_v2df_2op (src_exp, op1, op2);
+       stvx = TARGET_64BIT ? gen_altivec_stvx_v2df_2op (src_exp, op1, op2)
+         : gen_altivec_stvx_v2df_2op_si (src_exp, op1, op2);
       else if (mode == V1TImode)
-       stvx = gen_altivec_stvx_v1ti_2op (src_exp, op1, op2);
+       stvx = TARGET_64BIT ? gen_altivec_stvx_v1ti_2op (src_exp, op1, op2)
+         : gen_altivec_stvx_v1ti_2op_si (src_exp, op1, op2);
       else
        /* KFmode, TFmode, other modes not expected in this context.  */
        gcc_unreachable ();
@@ -1578,23 +1586,39 @@ rs6000_gen_stvx (enum machine_mode mode, rtx dest_
   else                         /* REG_P (memory_address) */
     {
       if (mode == V16QImode)
-       stvx = gen_altivec_stvx_v16qi_1op (src_exp, memory_address);
+       stvx = TARGET_64BIT ?
+         gen_altivec_stvx_v16qi_1op (src_exp, memory_address)
+         : gen_altivec_stvx_v16qi_1op_si (src_exp, memory_address);
       else if (mode == V8HImode)
-       stvx = gen_altivec_stvx_v8hi_1op (src_exp, memory_address);
+       stvx = TARGET_64BIT ?
+         gen_altivec_stvx_v8hi_1op (src_exp, memory_address)
+         : gen_altivec_stvx_v8hi_1op_si (src_exp, memory_address);
 #ifdef HAVE_V8HFmode
       else if (mode == V8HFmode)
-       stvx = gen_altivec_stvx_v8hf_1op (src_exp, memory_address);
+       stvx = TARGET_64BIT ?
+         gen_altivec_stvx_v8hf_1op (src_exp, memory_address)
+         : gen_altivec_stvx_v8hf_1op_si (src_exp, memory_address);
 #endif
       else if (mode == V4SImode)
-       stvx = gen_altivec_stvx_v4si_1op (src_exp, memory_address);
+       stvx =TARGET_64BIT ?
+         gen_altivec_stvx_v4si_1op (src_exp, memory_address)
+         : gen_altivec_stvx_v4si_1op_si (src_exp, memory_address);
       else if (mode == V4SFmode)
-       stvx = gen_altivec_stvx_v4sf_1op (src_exp, memory_address);
+       stvx = TARGET_64BIT ?
+         gen_altivec_stvx_v4sf_1op (src_exp, memory_address)
+         : gen_altivec_stvx_v4sf_1op_si (src_exp, memory_address);
       else if (mode == V2DImode)
-       stvx = gen_altivec_stvx_v2di_1op (src_exp, memory_address);
+       stvx = TARGET_64BIT ?
+         gen_altivec_stvx_v2di_1op (src_exp, memory_address)
+         : gen_altivec_stvx_v2di_1op_si (src_exp, memory_address);
       else if (mode == V2DFmode)
-       stvx = gen_altivec_stvx_v2df_1op (src_exp, memory_address);
+       stvx = TARGET_64BIT ?
+         gen_altivec_stvx_v2df_1op (src_exp, memory_address)
+         : gen_altivec_stvx_v2df_1op_si (src_exp, memory_address);
       else if (mode == V1TImode)
-       stvx = gen_altivec_stvx_v1ti_1op (src_exp, memory_address);
+       stvx = TARGET_64BIT ?
+         gen_altivec_stvx_v1ti_1op (src_exp, memory_address)
+         : gen_altivec_stvx_v1ti_1op_si (src_exp, memory_address);
       else
        /* KFmode, TFmode, other modes not expected in this context.  */
        gcc_unreachable ();
@@ -1702,23 +1726,31 @@ rs6000_gen_lvx (enum machine_mode mode, rtx dest_e
       op2 = XEXP (memory_address, 1);
 
       if (mode == V16QImode)
-       lvx = gen_altivec_lvx_v16qi_2op (dest_exp, op1, op2);
+       lvx = TARGET_64BIT ? gen_altivec_lvx_v16qi_2op (dest_exp, op1, op2)
+         : gen_altivec_lvx_v16qi_2op_si (dest_exp, op1, op2);
       else if (mode == V8HImode)
-       lvx = gen_altivec_lvx_v8hi_2op (dest_exp, op1, op2);
+       lvx = TARGET_64BIT ? gen_altivec_lvx_v8hi_2op (dest_exp, op1, op2)
+         : gen_altivec_lvx_v8hi_2op_si (dest_exp, op1, op2);
 #ifdef HAVE_V8HFmode
       else if (mode == V8HFmode)
-       lvx = gen_altivec_lvx_v8hf_2op (dest_exp, op1, op2);
+       lvx = TARGET_64BIT ? gen_altivec_lvx_v8hf_2op (dest_exp, op1, op2)
+         : gen_altivec_lvx_v8hf_2op_si (dest_exp, op1, op2);
 #endif
       else if (mode == V4SImode)
-       lvx = gen_altivec_lvx_v4si_2op (dest_exp, op1, op2);
+       lvx = TARGET_64BIT ? gen_altivec_lvx_v4si_2op (dest_exp, op1, op2)
+         : gen_altivec_lvx_v4si_2op_si (dest_exp, op1, op2);
       else if (mode == V4SFmode)
-       lvx = gen_altivec_lvx_v4sf_2op (dest_exp, op1, op2);
+       lvx = TARGET_64BIT ? gen_altivec_lvx_v4sf_2op (dest_exp, op1, op2)
+         : gen_altivec_lvx_v4sf_2op_si (dest_exp, op1, op2);
       else if (mode == V2DImode)
-       lvx = gen_altivec_lvx_v2di_2op (dest_exp, op1, op2);
+       lvx = TARGET_64BIT ? gen_altivec_lvx_v2di_2op (dest_exp, op1, op2)
+         : gen_altivec_lvx_v2di_2op_si (dest_exp, op1, op2);
       else if (mode == V2DFmode)
-       lvx = gen_altivec_lvx_v2df_2op (dest_exp, op1, op2);
+       lvx = TARGET_64BIT ? gen_altivec_lvx_v2df_2op (dest_exp, op1, op2)
+         : gen_altivec_lvx_v2df_2op_si (dest_exp, op1, op2);
       else if (mode == V1TImode)
-       lvx = gen_altivec_lvx_v1ti_2op (dest_exp, op1, op2);
+       lvx = TARGET_64BIT ? gen_altivec_lvx_v1ti_2op (dest_exp, op1, op2)
+         : gen_altivec_lvx_v1ti_2op_si (dest_exp, op1, op2);
       else
        /* KFmode, TFmode, other modes not expected in this context.  */
        gcc_unreachable ();
@@ -1726,23 +1758,39 @@ rs6000_gen_lvx (enum machine_mode mode, rtx dest_e
   else                         /* REG_P (memory_address) */
     {
       if (mode == V16QImode)
-       lvx = gen_altivec_lvx_v16qi_1op (dest_exp, memory_address);
+       lvx = TARGET_64BIT ?
+         gen_altivec_lvx_v16qi_1op (dest_exp, memory_address)
+         : gen_altivec_lvx_v16qi_1op_si (dest_exp, memory_address);
       else if (mode == V8HImode)
-       lvx = gen_altivec_lvx_v8hi_1op (dest_exp, memory_address);
+       lvx = TARGET_64BIT ?
+         gen_altivec_lvx_v8hi_1op (dest_exp, memory_address)
+         : gen_altivec_lvx_v8hi_1op_si (dest_exp, memory_address);
 #ifdef HAVE_V8HFmode
       else if (mode == V8HFmode)
-       lvx = gen_altivec_lvx_v8hf_1op (dest_exp, memory_address);
+       lvx = TARGET_64BIT ?
+         gen_altivec_lvx_v8hf_1op (dest_exp, memory_address)
+         : gen_altivec_lvx_v8hf_1op_si (dest_exp, memory_address);
 #endif
       else if (mode == V4SImode)
-       lvx = gen_altivec_lvx_v4si_1op (dest_exp, memory_address);
+       lvx = TARGET_64BIT ?
+         gen_altivec_lvx_v4si_1op (dest_exp, memory_address)
+         : gen_altivec_lvx_v4si_1op_si (dest_exp, memory_address);
       else if (mode == V4SFmode)
-       lvx = gen_altivec_lvx_v4sf_1op (dest_exp, memory_address);
+       lvx = TARGET_64BIT ?
+         gen_altivec_lvx_v4sf_1op (dest_exp, memory_address)
+         : gen_altivec_lvx_v4sf_1op_si (dest_exp, memory_address);
       else if (mode == V2DImode)
-       lvx = gen_altivec_lvx_v2di_1op (dest_exp, memory_address);
+       lvx = TARGET_64BIT ?
+         gen_altivec_lvx_v2di_1op (dest_exp, memory_address)
+         : gen_altivec_lvx_v2di_1op_si (dest_exp, memory_address);
       else if (mode == V2DFmode)
-       lvx = gen_altivec_lvx_v2df_1op (dest_exp, memory_address);
+       lvx = TARGET_64BIT ?
+         gen_altivec_lvx_v2df_1op (dest_exp, memory_address)
+         : gen_altivec_lvx_v2df_1op_si (dest_exp, memory_address);
       else if (mode == V1TImode)
-       lvx = gen_altivec_lvx_v1ti_1op (dest_exp, memory_address);
+       lvx = TARGET_64BIT ?
+         gen_altivec_lvx_v1ti_1op (dest_exp, memory_address)
+         : gen_altivec_lvx_v1ti_1op_si (dest_exp, memory_address);
       else
        /* KFmode, TFmode, other modes not expected in this context.  */
        gcc_unreachable ();

Reply via email to