@@ -34678,8 +34678,14 @@ rs6000_register_move_cost (machine_mode mode,
{
if (TARGET_DIRECT_MOVE)
{
+ /* Keep the cost for direct moves above that for within
+ a register class even if the actual processor cost is
+ comparable. We do this because a direct move insn
+ can't be a nop, whereas with ideal register
+ allocation a move within the same class might turn
+ out to be a nop. */
if (rs6000_tune == PROCESSOR_POWER9)
- ret = 2 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
+ ret = 3 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
else
ret = 4 * hard_regno_nregs (FIRST_GPR_REGNO, mode);
/* SFmode requires a conversion when moving between gprs
@@ -8,20 +8,20 @@
#include <altivec.h>
vector float
-test1d (float x)
+test1f (float x)
{
return vec_splats (x);
}
vector double
-test1f (double x)
+test1d (double x)
{
return vec_splats (x);
}
-// float test generates the permute instruction.
+// double test generates the permute instruction.
/* { dg-final { scan-assembler-times "xxpermdi" 1 } } */
-// double test generates a convert (double to single non-signalling) followed by a splat.
+// float test generates a convert (double to single non-signalling) followed by a splat.
/* { dg-final { scan-assembler-times {\mxscvdpspn?\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvspltw\M|\mxxspltw\M} 1 } } */