/* APPLE LOCAL file AltiVec */
/* { dg-do compile { target powerpc*-*-* } } */
/* { dg-options "-O3 -finline-limit=9999 -maltivec -Wa,-force_cpusubtype_ALL -fdump-ipa-cgraph -S -faltivec" } */
/* Inliner should inline AltiVec(tm) functions normally when -maltivec is on.  */
/* <rdar://problem/3837835> Selective inlining of functions that use Altivec */
#include	<Carbon/Carbon.h>
#include	<stdio.h>
#include	<stdlib.h>
#include	<math.h>

#define	N	400
#define	N4	((N+3)/4)
#define	N8	((N+7)/8)

typedef union 
{
  signed short		sInt[8];
  vector signed short	vInt;
} IntegerToVector;

static signed long vIntDotProduct (vector signed short [], vector signed short [], long int);
static int mainInt();
static Ptr getMemory ( size_t amount );

static int
mainInt()
{
  long int			n = N, n8 = N8, m, i, j;
  signed long			vDotProduct, sDotProduct;
  signed short		*sx, *sy;
  vector signed short	*x, *y;
  IntegerToVector		*sX, *sY;
	
  sx = (short *) getMemory( 4*(n+3) );
  if (sx == nil)
    return 0;
  sy = (short *) getMemory( 4*(n+3) );
  if (sy == nil)
    return 0;
		
  x = (vector signed short *) getMemory( n8*16 );
  if ( x == nil)
    return 0;
  y = (vector signed short *) getMemory( n8*16 );
  if ( y == nil)
    return 0;
	
  sX = (IntegerToVector *) getMemory( n8*16 );
  if (sX == nil)
    return 0;
  sY = (IntegerToVector *) getMemory( n8*16 );
  if (sY == nil)
    return 0;
	
  for ( i = 0; i < n; i++ )
    {
      sx[i] = ( signed short ) scalb(( M_PI * ( double ) ( i ) / ( double ) n ), 8) + 0.5;
      sy[i] = ( signed short ) scalb(( M_PI * ( double ) ( n - i ) / ( double ) n ), 8) + 0.5;
    }
	
  m = n % 8;
  if (m != 0)
    for (i = n; i < n + 8 - m; i++)
      {
	sx[i] = 0.0;
	sy[i] = 0.0;
      }

  for ( i = 0; i < n8; i++ )
    for ( j = 0; j < 8; j++ )
      {
	sX[i].sInt[j] = sx[i*8+j];
	sY[i].sInt[j] = sy[i*8+j];
      }

  for ( i = 0; i < n8; i++ )
    {
      x[i] = sX[i].vInt;
      y[i] = sY[i].vInt;
    }
		
  vDotProduct = vIntDotProduct ( x, y, n8 );

  printf ( "\nVector dot product = %10d\n", (int) vDotProduct );
	
  return 0;
}

static Ptr
getMemory ( size_t amount )
{
  Ptr	ptr;
	
  ptr = malloc(amount);
  if (ptr ==  nil)
    printf ("\nUnable to allocate sufficient memory.");
  return (ptr);
}

static signed long
vIntDotProduct ( vector signed short x[], vector signed short y[], long int n )
{

  typedef union 
  {
    signed long			xElem[4];
    vector signed int	vWord;
  } WordToVector;
	
  long int i;

  vector signed int partialProduct, zero = ( vector signed int ) { 0,0,0,0 };
  WordToVector sum;

  partialProduct = zero;
	
  for ( i = 0; i < n ; i++ )
    partialProduct = vec_msums ( x[i], y[i], partialProduct );	
	
  sum.vWord = vec_sums( partialProduct, zero);
		
  return sum.xElem[3];
}

int
main()
{
  mainInt();
  exit(0);
}

/* { dg-final { global compiler_flags; if ![string match "*-m64 *" $compiler_flags]
   { scan-tree-dump-times "callee has AltiVec" 0 "cgraph" } } } */
/* { dg-final { global compiler_flags; if ![string match "*-m64 *" $compiler_flags]
   { scan-assembler-not "vIntDotProduct" } } } */
/* { dg-final { global compiler_flags; if ![string match "*-m64 *" $compiler_flags]
   { scan-assembler-not "mainInt" } } } */
