This patch adds 2 tests to the testsuite to make sure the -mupper-regs-df and
-mupper-regs-sf options work, and you can generate add, subtract, multiply,
divide, and compare instructions on scalars living in the Altivec registers.  I
also fixed the p8vector-ldst.c test, which has been broken for some time (this
test was a preliminary test for the upper regs support).

Assuming the previous patches are checked in, is this patch ok to install?

2014-11-11  Michael Meissner  <meiss...@linux.vnet.ibm.com>

        * gcc.target/powerpc/p8vector-ldst.c: Rewrite to use 40 live
        floating point variables instead of using asm to test allocating
        values to the Altivec registers.

        * gcc.target/powerpc/upper-regs-sf.c: New -mupper-regs-sf and
        -mupper-regs-df tests.
        * gcc.target/powerpc/upper-regs-df.c: Likewise.

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797
Index: gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c    (revision 217391)
+++ gcc/testsuite/gcc.target/powerpc/p8vector-ldst.c    (revision 217392)
@@ -1,43 +1,624 @@
-/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
 /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
 /* { dg-require-effective-target powerpc_p8vector_ok } */
 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { 
"-mcpu=power8" } } */
 /* { dg-options "-mcpu=power8 -O2 -mupper-regs-df -mupper-regs-sf" } */
 
-float load_sf (float *p)
+float
+load_store_sf (unsigned long num,
+              const float *from_ptr,
+              float *to_ptr,
+              const unsigned long *in_mask_ptr,
+              const unsigned long *out_mask_ptr)
 {
-  float f = *p;
-  __asm__ ("# reg %x0" : "+v" (f));
-  return f;
-}
+  float value00        = 0.0f;
+  float value01        = 0.0f;
+  float value02        = 0.0f;
+  float value03        = 0.0f;
+  float value04        = 0.0f;
+  float value05        = 0.0f;
+  float value06        = 0.0f;
+  float value07        = 0.0f;
+  float value08        = 0.0f;
+  float value09        = 0.0f;
+  float value10        = 0.0f;
+  float value11        = 0.0f;
+  float value12        = 0.0f;
+  float value13        = 0.0f;
+  float value14        = 0.0f;
+  float value15        = 0.0f;
+  float value16        = 0.0f;
+  float value17        = 0.0f;
+  float value18        = 0.0f;
+  float value19        = 0.0f;
+  float value20        = 0.0f;
+  float value21        = 0.0f;
+  float value22        = 0.0f;
+  float value23        = 0.0f;
+  float value24        = 0.0f;
+  float value25        = 0.0f;
+  float value26        = 0.0f;
+  float value27        = 0.0f;
+  float value28        = 0.0f;
+  float value29        = 0.0f;
+  float value30        = 0.0f;
+  float value31        = 0.0f;
+  float value32        = 0.0f;
+  float value33        = 0.0f;
+  float value34        = 0.0f;
+  float value35        = 0.0f;
+  float value36        = 0.0f;
+  float value37        = 0.0f;
+  float value38        = 0.0f;
+  float value39        = 0.0f;
+  unsigned long in_mask;
+  unsigned long out_mask;
+  unsigned long i;
 
-double load_df (double *p)
-{
-  double d = *p;
-  __asm__ ("# reg %x0" : "+v" (d));
-  return d;
-}
+  for (i = 0; i < num; i++)
+    {
+      in_mask = *in_mask_ptr++;
+      if ((in_mask & (1L <<  0)) != 0L)
+       value00 = *from_ptr++;
 
-double load_dfsf (float *p)
-{
-  double d = (double) *p;
-  __asm__ ("# reg %x0" : "+v" (d));
-  return d;
-}
+      if ((in_mask & (1L <<  1)) != 0L)
+       value01 = *from_ptr++;
 
-void store_sf (float *p, float f)
-{
-  __asm__ ("# reg %x0" : "+v" (f));
-  *p = f;
+      if ((in_mask & (1L <<  2)) != 0L)
+       value02 = *from_ptr++;
+
+      if ((in_mask & (1L <<  3)) != 0L)
+       value03 = *from_ptr++;
+
+      if ((in_mask & (1L <<  4)) != 0L)
+       value04 = *from_ptr++;
+
+      if ((in_mask & (1L <<  5)) != 0L)
+       value05 = *from_ptr++;
+
+      if ((in_mask & (1L <<  6)) != 0L)
+       value06 = *from_ptr++;
+
+      if ((in_mask & (1L <<  7)) != 0L)
+       value07 = *from_ptr++;
+
+      if ((in_mask & (1L <<  8)) != 0L)
+       value08 = *from_ptr++;
+
+      if ((in_mask & (1L <<  9)) != 0L)
+       value09 = *from_ptr++;
+
+      if ((in_mask & (1L << 10)) != 0L)
+       value10 = *from_ptr++;
+
+      if ((in_mask & (1L << 11)) != 0L)
+       value11 = *from_ptr++;
+
+      if ((in_mask & (1L << 12)) != 0L)
+       value12 = *from_ptr++;
+
+      if ((in_mask & (1L << 13)) != 0L)
+       value13 = *from_ptr++;
+
+      if ((in_mask & (1L << 14)) != 0L)
+       value14 = *from_ptr++;
+
+      if ((in_mask & (1L << 15)) != 0L)
+       value15 = *from_ptr++;
+
+      if ((in_mask & (1L << 16)) != 0L)
+       value16 = *from_ptr++;
+
+      if ((in_mask & (1L << 17)) != 0L)
+       value17 = *from_ptr++;
+
+      if ((in_mask & (1L << 18)) != 0L)
+       value18 = *from_ptr++;
+
+      if ((in_mask & (1L << 19)) != 0L)
+       value19 = *from_ptr++;
+
+      if ((in_mask & (1L << 20)) != 0L)
+       value20 = *from_ptr++;
+
+      if ((in_mask & (1L << 21)) != 0L)
+       value21 = *from_ptr++;
+
+      if ((in_mask & (1L << 22)) != 0L)
+       value22 = *from_ptr++;
+
+      if ((in_mask & (1L << 23)) != 0L)
+       value23 = *from_ptr++;
+
+      if ((in_mask & (1L << 24)) != 0L)
+       value24 = *from_ptr++;
+
+      if ((in_mask & (1L << 25)) != 0L)
+       value25 = *from_ptr++;
+
+      if ((in_mask & (1L << 26)) != 0L)
+       value26 = *from_ptr++;
+
+      if ((in_mask & (1L << 27)) != 0L)
+       value27 = *from_ptr++;
+
+      if ((in_mask & (1L << 28)) != 0L)
+       value28 = *from_ptr++;
+
+      if ((in_mask & (1L << 29)) != 0L)
+       value29 = *from_ptr++;
+
+      if ((in_mask & (1L << 30)) != 0L)
+       value30 = *from_ptr++;
+
+      if ((in_mask & (1L << 31)) != 0L)
+       value31 = *from_ptr++;
+
+      if ((in_mask & (1L << 32)) != 0L)
+       value32 = *from_ptr++;
+
+      if ((in_mask & (1L << 33)) != 0L)
+       value33 = *from_ptr++;
+
+      if ((in_mask & (1L << 34)) != 0L)
+       value34 = *from_ptr++;
+
+      if ((in_mask & (1L << 35)) != 0L)
+       value35 = *from_ptr++;
+
+      if ((in_mask & (1L << 36)) != 0L)
+       value36 = *from_ptr++;
+
+      if ((in_mask & (1L << 37)) != 0L)
+       value37 = *from_ptr++;
+
+      if ((in_mask & (1L << 38)) != 0L)
+       value38 = *from_ptr++;
+
+      if ((in_mask & (1L << 39)) != 0L)
+       value39 = *from_ptr++;
+
+      out_mask = *out_mask_ptr++;
+      if ((out_mask & (1L <<  0)) != 0L)
+       *to_ptr++ = value00;
+
+      if ((out_mask & (1L <<  1)) != 0L)
+       *to_ptr++ = value01;
+
+      if ((out_mask & (1L <<  2)) != 0L)
+       *to_ptr++ = value02;
+
+      if ((out_mask & (1L <<  3)) != 0L)
+       *to_ptr++ = value03;
+
+      if ((out_mask & (1L <<  4)) != 0L)
+       *to_ptr++ = value04;
+
+      if ((out_mask & (1L <<  5)) != 0L)
+       *to_ptr++ = value05;
+
+      if ((out_mask & (1L <<  6)) != 0L)
+       *to_ptr++ = value06;
+
+      if ((out_mask & (1L <<  7)) != 0L)
+       *to_ptr++ = value07;
+
+      if ((out_mask & (1L <<  8)) != 0L)
+       *to_ptr++ = value08;
+
+      if ((out_mask & (1L <<  9)) != 0L)
+       *to_ptr++ = value09;
+
+      if ((out_mask & (1L << 10)) != 0L)
+       *to_ptr++ = value10;
+
+      if ((out_mask & (1L << 11)) != 0L)
+       *to_ptr++ = value11;
+
+      if ((out_mask & (1L << 12)) != 0L)
+       *to_ptr++ = value12;
+
+      if ((out_mask & (1L << 13)) != 0L)
+       *to_ptr++ = value13;
+
+      if ((out_mask & (1L << 14)) != 0L)
+       *to_ptr++ = value14;
+
+      if ((out_mask & (1L << 15)) != 0L)
+       *to_ptr++ = value15;
+
+      if ((out_mask & (1L << 16)) != 0L)
+       *to_ptr++ = value16;
+
+      if ((out_mask & (1L << 17)) != 0L)
+       *to_ptr++ = value17;
+
+      if ((out_mask & (1L << 18)) != 0L)
+       *to_ptr++ = value18;
+
+      if ((out_mask & (1L << 19)) != 0L)
+       *to_ptr++ = value19;
+
+      if ((out_mask & (1L << 20)) != 0L)
+       *to_ptr++ = value20;
+
+      if ((out_mask & (1L << 21)) != 0L)
+       *to_ptr++ = value21;
+
+      if ((out_mask & (1L << 22)) != 0L)
+       *to_ptr++ = value22;
+
+      if ((out_mask & (1L << 23)) != 0L)
+       *to_ptr++ = value23;
+
+      if ((out_mask & (1L << 24)) != 0L)
+       *to_ptr++ = value24;
+
+      if ((out_mask & (1L << 25)) != 0L)
+       *to_ptr++ = value25;
+
+      if ((out_mask & (1L << 26)) != 0L)
+       *to_ptr++ = value26;
+
+      if ((out_mask & (1L << 27)) != 0L)
+       *to_ptr++ = value27;
+
+      if ((out_mask & (1L << 28)) != 0L)
+       *to_ptr++ = value28;
+
+      if ((out_mask & (1L << 29)) != 0L)
+       *to_ptr++ = value29;
+
+      if ((out_mask & (1L << 30)) != 0L)
+       *to_ptr++ = value30;
+
+      if ((out_mask & (1L << 31)) != 0L)
+       *to_ptr++ = value31;
+
+      if ((out_mask & (1L << 32)) != 0L)
+       *to_ptr++ = value32;
+
+      if ((out_mask & (1L << 33)) != 0L)
+       *to_ptr++ = value33;
+
+      if ((out_mask & (1L << 34)) != 0L)
+       *to_ptr++ = value34;
+
+      if ((out_mask & (1L << 35)) != 0L)
+       *to_ptr++ = value35;
+
+      if ((out_mask & (1L << 36)) != 0L)
+       *to_ptr++ = value36;
+
+      if ((out_mask & (1L << 37)) != 0L)
+       *to_ptr++ = value37;
+
+      if ((out_mask & (1L << 38)) != 0L)
+       *to_ptr++ = value38;
+
+      if ((out_mask & (1L << 39)) != 0L)
+       *to_ptr++ = value39;
+    }
+
+  return (  value00 + value01 + value02 + value03 + value04
+         + value05 + value06 + value07 + value08 + value09
+         + value10 + value11 + value12 + value13 + value14
+         + value15 + value16 + value17 + value18 + value19
+         + value20 + value21 + value22 + value23 + value24
+         + value25 + value26 + value27 + value28 + value29
+         + value30 + value31 + value32 + value33 + value34
+         + value35 + value36 + value37 + value38 + value39);
 }
 
-void store_df (double *p, double d)
+double
+load_store_df (unsigned long num,
+              const double *from_ptr,
+              double *to_ptr,
+              const unsigned long *in_mask_ptr,
+              const unsigned long *out_mask_ptr)
 {
-  __asm__ ("# reg %x0" : "+v" (d));
-  *p = d;
+  double value00       = 0.0;
+  double value01       = 0.0;
+  double value02       = 0.0;
+  double value03       = 0.0;
+  double value04       = 0.0;
+  double value05       = 0.0;
+  double value06       = 0.0;
+  double value07       = 0.0;
+  double value08       = 0.0;
+  double value09       = 0.0;
+  double value10       = 0.0;
+  double value11       = 0.0;
+  double value12       = 0.0;
+  double value13       = 0.0;
+  double value14       = 0.0;
+  double value15       = 0.0;
+  double value16       = 0.0;
+  double value17       = 0.0;
+  double value18       = 0.0;
+  double value19       = 0.0;
+  double value20       = 0.0;
+  double value21       = 0.0;
+  double value22       = 0.0;
+  double value23       = 0.0;
+  double value24       = 0.0;
+  double value25       = 0.0;
+  double value26       = 0.0;
+  double value27       = 0.0;
+  double value28       = 0.0;
+  double value29       = 0.0;
+  double value30       = 0.0;
+  double value31       = 0.0;
+  double value32       = 0.0;
+  double value33       = 0.0;
+  double value34       = 0.0;
+  double value35       = 0.0;
+  double value36       = 0.0;
+  double value37       = 0.0;
+  double value38       = 0.0;
+  double value39       = 0.0;
+  unsigned long in_mask;
+  unsigned long out_mask;
+  unsigned long i;
+
+  for (i = 0; i < num; i++)
+    {
+      in_mask = *in_mask_ptr++;
+      if ((in_mask & (1L <<  0)) != 0L)
+       value00 = *from_ptr++;
+
+      if ((in_mask & (1L <<  1)) != 0L)
+       value01 = *from_ptr++;
+
+      if ((in_mask & (1L <<  2)) != 0L)
+       value02 = *from_ptr++;
+
+      if ((in_mask & (1L <<  3)) != 0L)
+       value03 = *from_ptr++;
+
+      if ((in_mask & (1L <<  4)) != 0L)
+       value04 = *from_ptr++;
+
+      if ((in_mask & (1L <<  5)) != 0L)
+       value05 = *from_ptr++;
+
+      if ((in_mask & (1L <<  6)) != 0L)
+       value06 = *from_ptr++;
+
+      if ((in_mask & (1L <<  7)) != 0L)
+       value07 = *from_ptr++;
+
+      if ((in_mask & (1L <<  8)) != 0L)
+       value08 = *from_ptr++;
+
+      if ((in_mask & (1L <<  9)) != 0L)
+       value09 = *from_ptr++;
+
+      if ((in_mask & (1L << 10)) != 0L)
+       value10 = *from_ptr++;
+
+      if ((in_mask & (1L << 11)) != 0L)
+       value11 = *from_ptr++;
+
+      if ((in_mask & (1L << 12)) != 0L)
+       value12 = *from_ptr++;
+
+      if ((in_mask & (1L << 13)) != 0L)
+       value13 = *from_ptr++;
+
+      if ((in_mask & (1L << 14)) != 0L)
+       value14 = *from_ptr++;
+
+      if ((in_mask & (1L << 15)) != 0L)
+       value15 = *from_ptr++;
+
+      if ((in_mask & (1L << 16)) != 0L)
+       value16 = *from_ptr++;
+
+      if ((in_mask & (1L << 17)) != 0L)
+       value17 = *from_ptr++;
+
+      if ((in_mask & (1L << 18)) != 0L)
+       value18 = *from_ptr++;
+
+      if ((in_mask & (1L << 19)) != 0L)
+       value19 = *from_ptr++;
+
+      if ((in_mask & (1L << 20)) != 0L)
+       value20 = *from_ptr++;
+
+      if ((in_mask & (1L << 21)) != 0L)
+       value21 = *from_ptr++;
+
+      if ((in_mask & (1L << 22)) != 0L)
+       value22 = *from_ptr++;
+
+      if ((in_mask & (1L << 23)) != 0L)
+       value23 = *from_ptr++;
+
+      if ((in_mask & (1L << 24)) != 0L)
+       value24 = *from_ptr++;
+
+      if ((in_mask & (1L << 25)) != 0L)
+       value25 = *from_ptr++;
+
+      if ((in_mask & (1L << 26)) != 0L)
+       value26 = *from_ptr++;
+
+      if ((in_mask & (1L << 27)) != 0L)
+       value27 = *from_ptr++;
+
+      if ((in_mask & (1L << 28)) != 0L)
+       value28 = *from_ptr++;
+
+      if ((in_mask & (1L << 29)) != 0L)
+       value29 = *from_ptr++;
+
+      if ((in_mask & (1L << 30)) != 0L)
+       value30 = *from_ptr++;
+
+      if ((in_mask & (1L << 31)) != 0L)
+       value31 = *from_ptr++;
+
+      if ((in_mask & (1L << 32)) != 0L)
+       value32 = *from_ptr++;
+
+      if ((in_mask & (1L << 33)) != 0L)
+       value33 = *from_ptr++;
+
+      if ((in_mask & (1L << 34)) != 0L)
+       value34 = *from_ptr++;
+
+      if ((in_mask & (1L << 35)) != 0L)
+       value35 = *from_ptr++;
+
+      if ((in_mask & (1L << 36)) != 0L)
+       value36 = *from_ptr++;
+
+      if ((in_mask & (1L << 37)) != 0L)
+       value37 = *from_ptr++;
+
+      if ((in_mask & (1L << 38)) != 0L)
+       value38 = *from_ptr++;
+
+      if ((in_mask & (1L << 39)) != 0L)
+       value39 = *from_ptr++;
+
+      out_mask = *out_mask_ptr++;
+      if ((out_mask & (1L <<  0)) != 0L)
+       *to_ptr++ = value00;
+
+      if ((out_mask & (1L <<  1)) != 0L)
+       *to_ptr++ = value01;
+
+      if ((out_mask & (1L <<  2)) != 0L)
+       *to_ptr++ = value02;
+
+      if ((out_mask & (1L <<  3)) != 0L)
+       *to_ptr++ = value03;
+
+      if ((out_mask & (1L <<  4)) != 0L)
+       *to_ptr++ = value04;
+
+      if ((out_mask & (1L <<  5)) != 0L)
+       *to_ptr++ = value05;
+
+      if ((out_mask & (1L <<  6)) != 0L)
+       *to_ptr++ = value06;
+
+      if ((out_mask & (1L <<  7)) != 0L)
+       *to_ptr++ = value07;
+
+      if ((out_mask & (1L <<  8)) != 0L)
+       *to_ptr++ = value08;
+
+      if ((out_mask & (1L <<  9)) != 0L)
+       *to_ptr++ = value09;
+
+      if ((out_mask & (1L << 10)) != 0L)
+       *to_ptr++ = value10;
+
+      if ((out_mask & (1L << 11)) != 0L)
+       *to_ptr++ = value11;
+
+      if ((out_mask & (1L << 12)) != 0L)
+       *to_ptr++ = value12;
+
+      if ((out_mask & (1L << 13)) != 0L)
+       *to_ptr++ = value13;
+
+      if ((out_mask & (1L << 14)) != 0L)
+       *to_ptr++ = value14;
+
+      if ((out_mask & (1L << 15)) != 0L)
+       *to_ptr++ = value15;
+
+      if ((out_mask & (1L << 16)) != 0L)
+       *to_ptr++ = value16;
+
+      if ((out_mask & (1L << 17)) != 0L)
+       *to_ptr++ = value17;
+
+      if ((out_mask & (1L << 18)) != 0L)
+       *to_ptr++ = value18;
+
+      if ((out_mask & (1L << 19)) != 0L)
+       *to_ptr++ = value19;
+
+      if ((out_mask & (1L << 20)) != 0L)
+       *to_ptr++ = value20;
+
+      if ((out_mask & (1L << 21)) != 0L)
+       *to_ptr++ = value21;
+
+      if ((out_mask & (1L << 22)) != 0L)
+       *to_ptr++ = value22;
+
+      if ((out_mask & (1L << 23)) != 0L)
+       *to_ptr++ = value23;
+
+      if ((out_mask & (1L << 24)) != 0L)
+       *to_ptr++ = value24;
+
+      if ((out_mask & (1L << 25)) != 0L)
+       *to_ptr++ = value25;
+
+      if ((out_mask & (1L << 26)) != 0L)
+       *to_ptr++ = value26;
+
+      if ((out_mask & (1L << 27)) != 0L)
+       *to_ptr++ = value27;
+
+      if ((out_mask & (1L << 28)) != 0L)
+       *to_ptr++ = value28;
+
+      if ((out_mask & (1L << 29)) != 0L)
+       *to_ptr++ = value29;
+
+      if ((out_mask & (1L << 30)) != 0L)
+       *to_ptr++ = value30;
+
+      if ((out_mask & (1L << 31)) != 0L)
+       *to_ptr++ = value31;
+
+      if ((out_mask & (1L << 32)) != 0L)
+       *to_ptr++ = value32;
+
+      if ((out_mask & (1L << 33)) != 0L)
+       *to_ptr++ = value33;
+
+      if ((out_mask & (1L << 34)) != 0L)
+       *to_ptr++ = value34;
+
+      if ((out_mask & (1L << 35)) != 0L)
+       *to_ptr++ = value35;
+
+      if ((out_mask & (1L << 36)) != 0L)
+       *to_ptr++ = value36;
+
+      if ((out_mask & (1L << 37)) != 0L)
+       *to_ptr++ = value37;
+
+      if ((out_mask & (1L << 38)) != 0L)
+       *to_ptr++ = value38;
+
+      if ((out_mask & (1L << 39)) != 0L)
+       *to_ptr++ = value39;
+    }
+
+  return (  value00 + value01 + value02 + value03 + value04
+         + value05 + value06 + value07 + value08 + value09
+         + value10 + value11 + value12 + value13 + value14
+         + value15 + value16 + value17 + value18 + value19
+         + value20 + value21 + value22 + value23 + value24
+         + value25 + value26 + value27 + value28 + value29
+         + value30 + value31 + value32 + value33 + value34
+         + value35 + value36 + value37 + value38 + value39);
 }
 
 /* { dg-final { scan-assembler "lxsspx"  } } */
 /* { dg-final { scan-assembler "lxsdx"   } } */
 /* { dg-final { scan-assembler "stxsspx" } } */
 /* { dg-final { scan-assembler "stxsdx"  } } */
+/* { dg-final { scan-assembler "xsaddsp" } } */
+/* { dg-final { scan-assembler "xsadddp" } } */
Index: gcc/testsuite/gcc.target/powerpc/upper-regs-sf.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/upper-regs-sf.c    (revision 0)
+++ gcc/testsuite/gcc.target/powerpc/upper-regs-sf.c    (revision 217392)
@@ -0,0 +1,726 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-require-effective-target powerpc_p8vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { 
"-mcpu=power8" } } */
+/* { dg-options "-mcpu=power8 -O2 -mupper-regs-df -mupper-regs-sf" } */
+
+/* Test for the -mupper-regs-df option to make sure double values are allocated
+   to the Altivec registers as well as the traditional FPR registers.  */
+
+#ifndef TYPE
+#define TYPE float
+#endif
+
+#ifndef MASK_TYPE
+#define MASK_TYPE unsigned long long
+#endif
+
+#define MASK_ONE       ((MASK_TYPE)1)
+#define ZERO           ((TYPE) 0.0)
+
+TYPE
+test_add (const MASK_TYPE *add_mask, const TYPE *add_values,
+         const MASK_TYPE *sub_mask, const TYPE *sub_values,
+         const MASK_TYPE *mul_mask, const TYPE *mul_values,
+         const MASK_TYPE *div_mask, const TYPE *div_values,
+         const MASK_TYPE *eq0_mask, int *eq0_ptr)
+{
+  TYPE value;
+  TYPE value00 = ZERO;
+  TYPE value01 = ZERO;
+  TYPE value02 = ZERO;
+  TYPE value03 = ZERO;
+  TYPE value04 = ZERO;
+  TYPE value05 = ZERO;
+  TYPE value06 = ZERO;
+  TYPE value07 = ZERO;
+  TYPE value08 = ZERO;
+  TYPE value09 = ZERO;
+  TYPE value10 = ZERO;
+  TYPE value11 = ZERO;
+  TYPE value12 = ZERO;
+  TYPE value13 = ZERO;
+  TYPE value14 = ZERO;
+  TYPE value15 = ZERO;
+  TYPE value16 = ZERO;
+  TYPE value17 = ZERO;
+  TYPE value18 = ZERO;
+  TYPE value19 = ZERO;
+  TYPE value20 = ZERO;
+  TYPE value21 = ZERO;
+  TYPE value22 = ZERO;
+  TYPE value23 = ZERO;
+  TYPE value24 = ZERO;
+  TYPE value25 = ZERO;
+  TYPE value26 = ZERO;
+  TYPE value27 = ZERO;
+  TYPE value28 = ZERO;
+  TYPE value29 = ZERO;
+  TYPE value30 = ZERO;
+  TYPE value31 = ZERO;
+  TYPE value32 = ZERO;
+  TYPE value33 = ZERO;
+  TYPE value34 = ZERO;
+  TYPE value35 = ZERO;
+  TYPE value36 = ZERO;
+  TYPE value37 = ZERO;
+  TYPE value38 = ZERO;
+  TYPE value39 = ZERO;
+  MASK_TYPE mask;
+  int eq0;
+
+  while ((mask = *add_mask++) != 0)
+    {
+      value = *add_values++;
+
+      __asm__ (" #reg %0" : "+d" (value));
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       value00 += value;
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       value01 += value;
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       value02 += value;
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       value03 += value;
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       value04 += value;
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       value05 += value;
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       value06 += value;
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       value07 += value;
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       value08 += value;
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       value09 += value;
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       value10 += value;
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       value11 += value;
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       value12 += value;
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       value13 += value;
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       value14 += value;
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       value15 += value;
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       value16 += value;
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       value17 += value;
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       value18 += value;
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       value19 += value;
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       value20 += value;
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       value21 += value;
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       value22 += value;
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       value23 += value;
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       value24 += value;
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       value25 += value;
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       value26 += value;
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       value27 += value;
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       value28 += value;
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       value29 += value;
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       value30 += value;
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       value31 += value;
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       value32 += value;
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       value33 += value;
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       value34 += value;
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       value35 += value;
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       value36 += value;
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       value37 += value;
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       value38 += value;
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       value39 += value;
+    }
+
+  while ((mask = *sub_mask++) != 0)
+    {
+      value = *sub_values++;
+
+      __asm__ (" #reg %0" : "+d" (value));
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       value00 -= value;
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       value01 -= value;
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       value02 -= value;
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       value03 -= value;
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       value04 -= value;
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       value05 -= value;
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       value06 -= value;
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       value07 -= value;
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       value08 -= value;
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       value09 -= value;
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       value10 -= value;
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       value11 -= value;
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       value12 -= value;
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       value13 -= value;
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       value14 -= value;
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       value15 -= value;
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       value16 -= value;
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       value17 -= value;
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       value18 -= value;
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       value19 -= value;
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       value20 -= value;
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       value21 -= value;
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       value22 -= value;
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       value23 -= value;
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       value24 -= value;
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       value25 -= value;
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       value26 -= value;
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       value27 -= value;
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       value28 -= value;
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       value29 -= value;
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       value30 -= value;
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       value31 -= value;
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       value32 -= value;
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       value33 -= value;
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       value34 -= value;
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       value35 -= value;
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       value36 -= value;
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       value37 -= value;
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       value38 -= value;
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       value39 -= value;
+    }
+
+  while ((mask = *mul_mask++) != 0)
+    {
+      value = *mul_values++;
+
+      __asm__ (" #reg %0" : "+d" (value));
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       value00 *= value;
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       value01 *= value;
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       value02 *= value;
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       value03 *= value;
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       value04 *= value;
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       value05 *= value;
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       value06 *= value;
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       value07 *= value;
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       value08 *= value;
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       value09 *= value;
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       value10 *= value;
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       value11 *= value;
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       value12 *= value;
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       value13 *= value;
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       value14 *= value;
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       value15 *= value;
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       value16 *= value;
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       value17 *= value;
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       value18 *= value;
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       value19 *= value;
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       value20 *= value;
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       value21 *= value;
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       value22 *= value;
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       value23 *= value;
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       value24 *= value;
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       value25 *= value;
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       value26 *= value;
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       value27 *= value;
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       value28 *= value;
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       value29 *= value;
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       value30 *= value;
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       value31 *= value;
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       value32 *= value;
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       value33 *= value;
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       value34 *= value;
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       value35 *= value;
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       value36 *= value;
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       value37 *= value;
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       value38 *= value;
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       value39 *= value;
+    }
+
+  while ((mask = *div_mask++) != 0)
+    {
+      value = *div_values++;
+
+      __asm__ (" #reg %0" : "+d" (value));
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       value00 /= value;
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       value01 /= value;
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       value02 /= value;
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       value03 /= value;
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       value04 /= value;
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       value05 /= value;
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       value06 /= value;
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       value07 /= value;
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       value08 /= value;
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       value09 /= value;
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       value10 /= value;
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       value11 /= value;
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       value12 /= value;
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       value13 /= value;
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       value14 /= value;
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       value15 /= value;
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       value16 /= value;
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       value17 /= value;
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       value18 /= value;
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       value19 /= value;
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       value20 /= value;
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       value21 /= value;
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       value22 /= value;
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       value23 /= value;
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       value24 /= value;
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       value25 /= value;
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       value26 /= value;
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       value27 /= value;
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       value28 /= value;
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       value29 /= value;
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       value30 /= value;
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       value31 /= value;
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       value32 /= value;
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       value33 /= value;
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       value34 /= value;
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       value35 /= value;
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       value36 /= value;
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       value37 /= value;
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       value38 /= value;
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       value39 /= value;
+    }
+
+  while ((mask = *eq0_mask++) != 0)
+    {
+      eq0 = 0;
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       eq0 |= (value00 == ZERO);
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       eq0 |= (value01 == ZERO);
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       eq0 |= (value02 == ZERO);
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       eq0 |= (value03 == ZERO);
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       eq0 |= (value04 == ZERO);
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       eq0 |= (value05 == ZERO);
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       eq0 |= (value06 == ZERO);
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       eq0 |= (value07 == ZERO);
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       eq0 |= (value08 == ZERO);
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       eq0 |= (value09 == ZERO);
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       eq0 |= (value10 == ZERO);
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       eq0 |= (value11 == ZERO);
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       eq0 |= (value12 == ZERO);
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       eq0 |= (value13 == ZERO);
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       eq0 |= (value14 == ZERO);
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       eq0 |= (value15 == ZERO);
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       eq0 |= (value16 == ZERO);
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       eq0 |= (value17 == ZERO);
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       eq0 |= (value18 == ZERO);
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       eq0 |= (value19 == ZERO);
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       eq0 |= (value20 == ZERO);
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       eq0 |= (value21 == ZERO);
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       eq0 |= (value22 == ZERO);
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       eq0 |= (value23 == ZERO);
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       eq0 |= (value24 == ZERO);
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       eq0 |= (value25 == ZERO);
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       eq0 |= (value26 == ZERO);
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       eq0 |= (value27 == ZERO);
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       eq0 |= (value28 == ZERO);
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       eq0 |= (value29 == ZERO);
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       eq0 |= (value30 == ZERO);
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       eq0 |= (value31 == ZERO);
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       eq0 |= (value32 == ZERO);
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       eq0 |= (value33 == ZERO);
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       eq0 |= (value34 == ZERO);
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       eq0 |= (value35 == ZERO);
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       eq0 |= (value36 == ZERO);
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       eq0 |= (value37 == ZERO);
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       eq0 |= (value38 == ZERO);
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       eq0 |= (value39 == ZERO);
+
+      *eq0_ptr++ = eq0;
+    }
+
+  return (  value00 + value01 + value02 + value03 + value04
+         + value05 + value06 + value07 + value08 + value09
+         + value10 + value11 + value12 + value13 + value14
+         + value15 + value16 + value17 + value18 + value19
+         + value20 + value21 + value22 + value23 + value24
+         + value25 + value26 + value27 + value28 + value29
+         + value30 + value31 + value32 + value33 + value34
+         + value35 + value36 + value37 + value38 + value39);
+}
+
+/* { dg-final { scan-assembler "fadds"    } } */
+/* { dg-final { scan-assembler "fsubs"    } } */
+/* { dg-final { scan-assembler "fmuls"    } } */
+/* { dg-final { scan-assembler "fdivs"    } } */
+/* { dg-final { scan-assembler "fcmpu"    } } */
+/* { dg-final { scan-assembler "xsaddsp"  } } */
+/* { dg-final { scan-assembler "xssubsp"  } } */
+/* { dg-final { scan-assembler "xsmulsp"  } } */
+/* { dg-final { scan-assembler "xsdivsp"  } } */
+/* { dg-final { scan-assembler "xscmpudp" } } */

Property changes on: gcc/testsuite/gcc.target/powerpc/upper-regs-sf.c
___________________________________________________________________
Added: svn:mergeinfo
   Merged /trunk/gcc/testsuite/gcc.target/powerpc/upper-regs-sf.c:r215303-217365

Index: gcc/testsuite/gcc.target/powerpc/upper-regs-df.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/upper-regs-df.c    (revision 0)
+++ gcc/testsuite/gcc.target/powerpc/upper-regs-df.c    (revision 217392)
@@ -0,0 +1,726 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { 
"-mcpu=power8" } } */
+/* { dg-options "-mcpu=power7 -O2 -mupper-regs-df" } */
+
+/* Test for the -mupper-regs-df option to make sure double values are allocated
+   to the Altivec registers as well as the traditional FPR registers.  */
+
+#ifndef TYPE
+#define TYPE double
+#endif
+
+#ifndef MASK_TYPE
+#define MASK_TYPE unsigned long long
+#endif
+
+#define MASK_ONE       ((MASK_TYPE)1)
+#define ZERO           ((TYPE) 0.0)
+
+TYPE
+test_add (const MASK_TYPE *add_mask, const TYPE *add_values,
+         const MASK_TYPE *sub_mask, const TYPE *sub_values,
+         const MASK_TYPE *mul_mask, const TYPE *mul_values,
+         const MASK_TYPE *div_mask, const TYPE *div_values,
+         const MASK_TYPE *eq0_mask, int *eq0_ptr)
+{
+  TYPE value;
+  TYPE value00 = ZERO;
+  TYPE value01 = ZERO;
+  TYPE value02 = ZERO;
+  TYPE value03 = ZERO;
+  TYPE value04 = ZERO;
+  TYPE value05 = ZERO;
+  TYPE value06 = ZERO;
+  TYPE value07 = ZERO;
+  TYPE value08 = ZERO;
+  TYPE value09 = ZERO;
+  TYPE value10 = ZERO;
+  TYPE value11 = ZERO;
+  TYPE value12 = ZERO;
+  TYPE value13 = ZERO;
+  TYPE value14 = ZERO;
+  TYPE value15 = ZERO;
+  TYPE value16 = ZERO;
+  TYPE value17 = ZERO;
+  TYPE value18 = ZERO;
+  TYPE value19 = ZERO;
+  TYPE value20 = ZERO;
+  TYPE value21 = ZERO;
+  TYPE value22 = ZERO;
+  TYPE value23 = ZERO;
+  TYPE value24 = ZERO;
+  TYPE value25 = ZERO;
+  TYPE value26 = ZERO;
+  TYPE value27 = ZERO;
+  TYPE value28 = ZERO;
+  TYPE value29 = ZERO;
+  TYPE value30 = ZERO;
+  TYPE value31 = ZERO;
+  TYPE value32 = ZERO;
+  TYPE value33 = ZERO;
+  TYPE value34 = ZERO;
+  TYPE value35 = ZERO;
+  TYPE value36 = ZERO;
+  TYPE value37 = ZERO;
+  TYPE value38 = ZERO;
+  TYPE value39 = ZERO;
+  MASK_TYPE mask;
+  int eq0;
+
+  while ((mask = *add_mask++) != 0)
+    {
+      value = *add_values++;
+
+      __asm__ (" #reg %0" : "+d" (value));
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       value00 += value;
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       value01 += value;
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       value02 += value;
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       value03 += value;
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       value04 += value;
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       value05 += value;
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       value06 += value;
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       value07 += value;
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       value08 += value;
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       value09 += value;
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       value10 += value;
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       value11 += value;
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       value12 += value;
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       value13 += value;
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       value14 += value;
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       value15 += value;
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       value16 += value;
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       value17 += value;
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       value18 += value;
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       value19 += value;
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       value20 += value;
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       value21 += value;
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       value22 += value;
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       value23 += value;
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       value24 += value;
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       value25 += value;
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       value26 += value;
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       value27 += value;
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       value28 += value;
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       value29 += value;
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       value30 += value;
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       value31 += value;
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       value32 += value;
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       value33 += value;
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       value34 += value;
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       value35 += value;
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       value36 += value;
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       value37 += value;
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       value38 += value;
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       value39 += value;
+    }
+
+  while ((mask = *sub_mask++) != 0)
+    {
+      value = *sub_values++;
+
+      __asm__ (" #reg %0" : "+d" (value));
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       value00 -= value;
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       value01 -= value;
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       value02 -= value;
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       value03 -= value;
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       value04 -= value;
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       value05 -= value;
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       value06 -= value;
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       value07 -= value;
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       value08 -= value;
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       value09 -= value;
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       value10 -= value;
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       value11 -= value;
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       value12 -= value;
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       value13 -= value;
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       value14 -= value;
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       value15 -= value;
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       value16 -= value;
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       value17 -= value;
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       value18 -= value;
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       value19 -= value;
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       value20 -= value;
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       value21 -= value;
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       value22 -= value;
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       value23 -= value;
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       value24 -= value;
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       value25 -= value;
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       value26 -= value;
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       value27 -= value;
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       value28 -= value;
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       value29 -= value;
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       value30 -= value;
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       value31 -= value;
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       value32 -= value;
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       value33 -= value;
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       value34 -= value;
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       value35 -= value;
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       value36 -= value;
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       value37 -= value;
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       value38 -= value;
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       value39 -= value;
+    }
+
+  while ((mask = *mul_mask++) != 0)
+    {
+      value = *mul_values++;
+
+      __asm__ (" #reg %0" : "+d" (value));
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       value00 *= value;
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       value01 *= value;
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       value02 *= value;
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       value03 *= value;
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       value04 *= value;
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       value05 *= value;
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       value06 *= value;
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       value07 *= value;
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       value08 *= value;
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       value09 *= value;
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       value10 *= value;
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       value11 *= value;
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       value12 *= value;
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       value13 *= value;
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       value14 *= value;
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       value15 *= value;
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       value16 *= value;
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       value17 *= value;
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       value18 *= value;
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       value19 *= value;
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       value20 *= value;
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       value21 *= value;
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       value22 *= value;
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       value23 *= value;
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       value24 *= value;
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       value25 *= value;
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       value26 *= value;
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       value27 *= value;
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       value28 *= value;
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       value29 *= value;
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       value30 *= value;
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       value31 *= value;
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       value32 *= value;
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       value33 *= value;
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       value34 *= value;
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       value35 *= value;
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       value36 *= value;
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       value37 *= value;
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       value38 *= value;
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       value39 *= value;
+    }
+
+  while ((mask = *div_mask++) != 0)
+    {
+      value = *div_values++;
+
+      __asm__ (" #reg %0" : "+d" (value));
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       value00 /= value;
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       value01 /= value;
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       value02 /= value;
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       value03 /= value;
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       value04 /= value;
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       value05 /= value;
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       value06 /= value;
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       value07 /= value;
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       value08 /= value;
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       value09 /= value;
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       value10 /= value;
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       value11 /= value;
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       value12 /= value;
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       value13 /= value;
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       value14 /= value;
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       value15 /= value;
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       value16 /= value;
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       value17 /= value;
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       value18 /= value;
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       value19 /= value;
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       value20 /= value;
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       value21 /= value;
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       value22 /= value;
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       value23 /= value;
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       value24 /= value;
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       value25 /= value;
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       value26 /= value;
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       value27 /= value;
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       value28 /= value;
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       value29 /= value;
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       value30 /= value;
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       value31 /= value;
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       value32 /= value;
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       value33 /= value;
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       value34 /= value;
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       value35 /= value;
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       value36 /= value;
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       value37 /= value;
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       value38 /= value;
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       value39 /= value;
+    }
+
+  while ((mask = *eq0_mask++) != 0)
+    {
+      eq0 = 0;
+
+      if ((mask & (MASK_ONE <<  0)) != 0)
+       eq0 |= (value00 == ZERO);
+
+      if ((mask & (MASK_ONE <<  1)) != 0)
+       eq0 |= (value01 == ZERO);
+
+      if ((mask & (MASK_ONE <<  2)) != 0)
+       eq0 |= (value02 == ZERO);
+
+      if ((mask & (MASK_ONE <<  3)) != 0)
+       eq0 |= (value03 == ZERO);
+
+      if ((mask & (MASK_ONE <<  4)) != 0)
+       eq0 |= (value04 == ZERO);
+
+      if ((mask & (MASK_ONE <<  5)) != 0)
+       eq0 |= (value05 == ZERO);
+
+      if ((mask & (MASK_ONE <<  6)) != 0)
+       eq0 |= (value06 == ZERO);
+
+      if ((mask & (MASK_ONE <<  7)) != 0)
+       eq0 |= (value07 == ZERO);
+
+      if ((mask & (MASK_ONE <<  8)) != 0)
+       eq0 |= (value08 == ZERO);
+
+      if ((mask & (MASK_ONE <<  9)) != 0)
+       eq0 |= (value09 == ZERO);
+
+      if ((mask & (MASK_ONE << 10)) != 0)
+       eq0 |= (value10 == ZERO);
+
+      if ((mask & (MASK_ONE << 11)) != 0)
+       eq0 |= (value11 == ZERO);
+
+      if ((mask & (MASK_ONE << 12)) != 0)
+       eq0 |= (value12 == ZERO);
+
+      if ((mask & (MASK_ONE << 13)) != 0)
+       eq0 |= (value13 == ZERO);
+
+      if ((mask & (MASK_ONE << 14)) != 0)
+       eq0 |= (value14 == ZERO);
+
+      if ((mask & (MASK_ONE << 15)) != 0)
+       eq0 |= (value15 == ZERO);
+
+      if ((mask & (MASK_ONE << 16)) != 0)
+       eq0 |= (value16 == ZERO);
+
+      if ((mask & (MASK_ONE << 17)) != 0)
+       eq0 |= (value17 == ZERO);
+
+      if ((mask & (MASK_ONE << 18)) != 0)
+       eq0 |= (value18 == ZERO);
+
+      if ((mask & (MASK_ONE << 19)) != 0)
+       eq0 |= (value19 == ZERO);
+
+      if ((mask & (MASK_ONE << 20)) != 0)
+       eq0 |= (value20 == ZERO);
+
+      if ((mask & (MASK_ONE << 21)) != 0)
+       eq0 |= (value21 == ZERO);
+
+      if ((mask & (MASK_ONE << 22)) != 0)
+       eq0 |= (value22 == ZERO);
+
+      if ((mask & (MASK_ONE << 23)) != 0)
+       eq0 |= (value23 == ZERO);
+
+      if ((mask & (MASK_ONE << 24)) != 0)
+       eq0 |= (value24 == ZERO);
+
+      if ((mask & (MASK_ONE << 25)) != 0)
+       eq0 |= (value25 == ZERO);
+
+      if ((mask & (MASK_ONE << 26)) != 0)
+       eq0 |= (value26 == ZERO);
+
+      if ((mask & (MASK_ONE << 27)) != 0)
+       eq0 |= (value27 == ZERO);
+
+      if ((mask & (MASK_ONE << 28)) != 0)
+       eq0 |= (value28 == ZERO);
+
+      if ((mask & (MASK_ONE << 29)) != 0)
+       eq0 |= (value29 == ZERO);
+
+      if ((mask & (MASK_ONE << 30)) != 0)
+       eq0 |= (value30 == ZERO);
+
+      if ((mask & (MASK_ONE << 31)) != 0)
+       eq0 |= (value31 == ZERO);
+
+      if ((mask & (MASK_ONE << 32)) != 0)
+       eq0 |= (value32 == ZERO);
+
+      if ((mask & (MASK_ONE << 33)) != 0)
+       eq0 |= (value33 == ZERO);
+
+      if ((mask & (MASK_ONE << 34)) != 0)
+       eq0 |= (value34 == ZERO);
+
+      if ((mask & (MASK_ONE << 35)) != 0)
+       eq0 |= (value35 == ZERO);
+
+      if ((mask & (MASK_ONE << 36)) != 0)
+       eq0 |= (value36 == ZERO);
+
+      if ((mask & (MASK_ONE << 37)) != 0)
+       eq0 |= (value37 == ZERO);
+
+      if ((mask & (MASK_ONE << 38)) != 0)
+       eq0 |= (value38 == ZERO);
+
+      if ((mask & (MASK_ONE << 39)) != 0)
+       eq0 |= (value39 == ZERO);
+
+      *eq0_ptr++ = eq0;
+    }
+
+  return (  value00 + value01 + value02 + value03 + value04
+         + value05 + value06 + value07 + value08 + value09
+         + value10 + value11 + value12 + value13 + value14
+         + value15 + value16 + value17 + value18 + value19
+         + value20 + value21 + value22 + value23 + value24
+         + value25 + value26 + value27 + value28 + value29
+         + value30 + value31 + value32 + value33 + value34
+         + value35 + value36 + value37 + value38 + value39);
+}
+
+/* { dg-final { scan-assembler "fadd"     } } */
+/* { dg-final { scan-assembler "fsub"     } } */
+/* { dg-final { scan-assembler "fmul"     } } */
+/* { dg-final { scan-assembler "fdiv"     } } */
+/* { dg-final { scan-assembler "fcmpu"    } } */
+/* { dg-final { scan-assembler "xsadddp"  } } */
+/* { dg-final { scan-assembler "xssubdp"  } } */
+/* { dg-final { scan-assembler "xsmuldp"  } } */
+/* { dg-final { scan-assembler "xsdivdp"  } } */
+/* { dg-final { scan-assembler "xscmpudp" } } */

Property changes on: gcc/testsuite/gcc.target/powerpc/upper-regs-df.c
___________________________________________________________________
Added: svn:mergeinfo
   Merged /trunk/gcc/testsuite/gcc.target/powerpc/upper-regs-df.c:r215303-217365

Reply via email to