1  /* { dg-do compile { target { powerpc*-*-* } } } */
       2  /* { dg-skip-if "" { powerpc*-*-darwin* } } */
       3  /* { dg-require-effective-target powerpc_p8vector_ok } */
       4  /* { dg-options "-mdejagnu-cpu=power8 -O2 -fno-math-errno" } */
       5  
       6  float abs_sf (float *p)
       7  {
       8    float f = *p;
       9    __asm__ ("# reg %x0" : "+v" (f));
      10    return __builtin_fabsf (f);
      11  }
      12  
      13  float nabs_sf (float *p)
      14  {
      15    float f = *p;
      16    __asm__ ("# reg %x0" : "+v" (f));
      17    return - __builtin_fabsf (f);
      18  }
      19  
      20  float neg_sf (float *p)
      21  {
      22    float f = *p;
      23    __asm__ ("# reg %x0" : "+v" (f));
      24    return - f;
      25  }
      26  
      27  float add_sf (float *p, float *q)
      28  {
      29    float f1 = *p;
      30    float f2 = *q;
      31    __asm__ ("# reg %x0, %x1" : "+v" (f1), "+v" (f2));
      32    return f1 + f2;
      33  }
      34  
      35  float sub_sf (float *p, float *q)
      36  {
      37    float f1 = *p;
      38    float f2 = *q;
      39    __asm__ ("# reg %x0, %x1" : "+v" (f1), "+v" (f2));
      40    return f1 - f2;
      41  }
      42  
      43  float mul_sf (float *p, float *q)
      44  {
      45    float f1 = *p;
      46    float f2 = *q;
      47    __asm__ ("# reg %x0, %x1" : "+v" (f1), "+v" (f2));
      48    return f1 * f2;
      49  }
      50  
      51  float div_sf (float *p, float *q)
      52  {
      53    float f1 = *p;
      54    float f2 = *q;
      55    __asm__ ("# reg %x0, %x1" : "+v" (f1), "+v" (f2));
      56    return f1 / f2;
      57  }
      58  
      59  float sqrt_sf (float *p)
      60  {
      61    float f = *p;
      62    __asm__ ("# reg %x0" : "+v" (f));
      63    return __builtin_sqrtf (f);
      64  }
      65  
      66  
      67  double abs_df (double *p)
      68  {
      69    double d = *p;
      70    __asm__ ("# reg %x0" : "+v" (d));
      71    return __builtin_fabs (d);
      72  }
      73  
      74  double nabs_df (double *p)
      75  {
      76    double d = *p;
      77    __asm__ ("# reg %x0" : "+v" (d));
      78    return - __builtin_fabs (d);
      79  }
      80  
      81  double neg_df (double *p)
      82  {
      83    double d = *p;
      84    __asm__ ("# reg %x0" : "+v" (d));
      85    return - d;
      86  }
      87  
      88  double add_df (double *p, double *q)
      89  {
      90    double d1 = *p;
      91    double d2 = *q;
      92    __asm__ ("# reg %x0, %x1" : "+v" (d1), "+v" (d2));
      93    return d1 + d2;
      94  }
      95  
      96  double sub_df (double *p, double *q)
      97  {
      98    double d1 = *p;
      99    double d2 = *q;
     100    __asm__ ("# reg %x0, %x1" : "+v" (d1), "+v" (d2));
     101    return d1 - d2;
     102  }
     103  
     104  double mul_df (double *p, double *q)
     105  {
     106    double d1 = *p;
     107    double d2 = *q;
     108    __asm__ ("# reg %x0, %x1" : "+v" (d1), "+v" (d2));
     109    return d1 * d2;
     110  }
     111  
     112  double div_df (double *p, double *q)
     113  {
     114    double d1 = *p;
     115    double d2 = *q;
     116    __asm__ ("# reg %x0, %x1" : "+v" (d1), "+v" (d2));
     117    return d1 / d2;
     118  }
     119  
     120  double sqrt_df (float *p)
     121  {
     122    double d = *p;
     123    __asm__ ("# reg %x0" : "+v" (d));
     124    return __builtin_sqrt (d);
     125  }
     126  
     127  /* { dg-final { scan-assembler "xsabsdp"  } } */
     128  /* { dg-final { scan-assembler "xsadddp"  } } */
     129  /* { dg-final { scan-assembler "xsaddsp"  } } */
     130  /* { dg-final { scan-assembler "xsdivdp"  } } */
     131  /* { dg-final { scan-assembler "xsdivsp"  } } */
     132  /* { dg-final { scan-assembler "xsmuldp"  } } */
     133  /* { dg-final { scan-assembler "xsmulsp"  } } */
     134  /* { dg-final { scan-assembler "xsnabsdp" } } */
     135  /* { dg-final { scan-assembler "xsnegdp"  } } */
     136  /* { dg-final { scan-assembler "xssqrtdp" } } */
     137  /* { dg-final { scan-assembler "xssqrtsp" } } */
     138  /* { dg-final { scan-assembler "xssubdp"  } } */
     139  /* { dg-final { scan-assembler "xssubsp"  } } */