/*
* Copyright (C) 2002-2007 Akira Nukada. All rights reserved.
* Copyright (C) 2002-2007 The SSI Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE SSI PROJECT ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE SSI PROJECT BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <stdio.h>
#include "libfftss.h"
static double d[4];
static void fftss_try_normal(void)
{
long i;
double d0, d1, d2, d3;
d0 = d[0];
d1 = d[1];
d2 = d[2];
d3 = d[3];
for (i = 0; i < (1<<14); i++)
d0 = d2 * (d1 * (d0 + d1 - d3));
if (d0 > 1.0) printf("error in fftss_try_normal\n");
}
static void fftss_try_fma(void)
{
long i;
double d0, d1, d2;
d0 = d[0];
d1 = d[1];
d2 = d[3];
for (i = 0; i < (1<<14); i++)
d0 = (d0 * d1 + d2) * d1 + d2;
if (d0 > 1.0) printf("error in fftss_try_fma\n");
}
int fftss_test_fma(void)
{
double t0, t1;
int available;
d[0] = 1.0; d[1] = 0.5; d[2] = 2.0; d[3] = 0.5;
t0 = fftss_get_wtime();
fftss_try_normal();
t0 = fftss_get_wtime() - t0;
t1 = fftss_get_wtime();
fftss_try_fma();
t1 = fftss_get_wtime() - t1;
printf("normal: %lf sec.\tfma: %lf sec.\n", t0, t1);
available = (t0 > t1 * 1.5);
printf("FMA instructions are %s.\n",
available ? "available" : "not available");
return available;
}