rtx bitshift = operands[2];
rtx shift;
rtx insn;
+ rtx zero_reg;
HOST_WIDE_INT bitshift_val;
HOST_WIDE_INT byteshift_val;
if (bitshift_val & 0x7)
FAIL;
byteshift_val = bitshift_val >> 3;
+ zero_reg = gen_reg_rtx (<MODE>mode);
+ emit_move_insn (zero_reg, CONST0_RTX (<MODE>mode));
if (TARGET_VSX && (byteshift_val & 0x3) == 0)
{
shift = gen_rtx_CONST_INT (QImode, byteshift_val >> 2);
- insn = gen_vsx_xxsldwi_<mode> (operands[0], operands[1], operands[1],
+ insn = gen_vsx_xxsldwi_<mode> (operands[0], operands[1], zero_reg,
shift);
}
else
{
shift = gen_rtx_CONST_INT (QImode, byteshift_val);
- insn = gen_altivec_vsldoi_<mode> (operands[0], operands[1], operands[1],
+ insn = gen_altivec_vsldoi_<mode> (operands[0], operands[1], zero_reg,
shift);
}
rtx bitshift = operands[2];
rtx shift;
rtx insn;
+ rtx zero_reg;
HOST_WIDE_INT bitshift_val;
HOST_WIDE_INT byteshift_val;
if (bitshift_val & 0x7)
FAIL;
byteshift_val = 16 - (bitshift_val >> 3);
+ zero_reg = gen_reg_rtx (<MODE>mode);
+ emit_move_insn (zero_reg, CONST0_RTX (<MODE>mode));
if (TARGET_VSX && (byteshift_val & 0x3) == 0)
{
shift = gen_rtx_CONST_INT (QImode, byteshift_val >> 2);
- insn = gen_vsx_xxsldwi_<mode> (operands[0], operands[1], operands[1],
+ insn = gen_vsx_xxsldwi_<mode> (operands[0], zero_reg, operands[1],
shift);
}
else
{
shift = gen_rtx_CONST_INT (QImode, byteshift_val);
- insn = gen_altivec_vsldoi_<mode> (operands[0], operands[1], operands[1],
+ insn = gen_altivec_vsldoi_<mode> (operands[0], zero_reg, operands[1],
shift);
}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-inline" } */
+
+#include <stdlib.h>
+
+typedef struct { double r, i; } complex;
+#define LEN 30
+complex c[LEN];
+double d[LEN];
+
+void
+foo (complex *c, double *d, int len1)
+{
+ int i;
+ for (i = 0; i < len1; i++)
+ {
+ c[i].r = d[i];
+ c[i].i = 0.0;
+ }
+}
+
+int
+main (void)
+{
+ int i;
+ for (i = 0; i < LEN; i++)
+ d[i] = (double) i;
+ foo (c, d, LEN);
+ for (i=0;i<LEN;i++)
+ if ((c[i].r != (double) i) || (c[i].i != 0.0))
+ abort ();
+ return 0;
+}
+