blob: 295b3d44b25e7890da457a867ad686ac8fda5eb0 [file] [log] [blame]
/* { dg-options "-std=gnu99" } */
/* { dg-do run } */
#include <stdfix.h>
extern void abort (void);
short fract test1_hr (short fract x)
{
return abshr (x);
}
fract test1_r (fract x)
{
return absr (x);
}
long fract test1_lr (long fract x)
{
return abslr (x);
}
long long fract test1_llr (long long fract x)
{
return absllr (x);
}
short accum test1_hk (short accum x)
{
return abshk (x);
}
accum test1_k (accum x)
{
return absk (x);
}
long accum test1_lk (long accum x)
{
return abslk (x);
}
long long accum test1_llk (long long accum x)
{
return absllk (x);
}
short fract test2_hr (void)
{
return abshr (-0.12hr);
}
fract test2_r (void)
{
return absr (-0.12r);
}
long fract test2_lr (void)
{
return abslr (-0.12lr);
}
long long fract test2_llr (void)
{
return absllr (-0.123456llr);
}
short accum test2_hk (void)
{
return abshk (-221.12hk);
}
accum test2_k (void)
{
return absk (-4321.12k);
}
long accum test2_lk (void)
{
return abslk (-4321.12lk);
}
long long accum test2_llk (void)
{
return absllk (-4321.12llk);
}
#define TEST1(VAL,FX) \
if (abs ## FX (-VAL ## FX -v) != VAL ## FX + v) \
abort(); \
if (abs ## FX (-VAL ## FX -v) != abs ## FX (VAL ## FX + v)) \
abort();
#define TEST2(VAL,FX) \
if (abs ## FX (-VAL ## FX) != VAL ## FX) \
abort(); \
if (abs ## FX (-VAL ## FX) != abs ## FX (VAL ## FX)) \
abort();
#ifndef __FLASH
#define __flash /* empty */
#endif
const __flash short fract volatile v = 0.33hr;
const __flash short fract volatile z = 0hr;
void test1 (void)
{
TEST1 (0.123, hr);
TEST1 (0.123, r);
TEST1 (0.1234567, lr);
TEST1 (0.1234567, llr);
TEST1 (223.123, hk);
TEST1 (12345.123, k);
TEST1 (12342345.123, lk);
TEST1 (12345.123, llk);
}
void test2 (void)
{
TEST2 (0.123, hr);
TEST2 (0.123, r);
TEST2 (0.1234567, lr);
TEST2 (0.1234567, llr);
TEST2 (223.123, hk);
TEST2 (12345.123, k);
TEST2 (12342345.123, lk);
TEST2 (12345.123, llk);
}
#define MINMAX(T,FX) \
{ \
int_ ## FX ## _t imin \
= (int_ ## FX ## _t) 1 << (8 * sizeof (int_ ## FX ## _t) -1); \
int_ ## FX ## _t imax = ~imin; \
T fmin = FX ## bits (imin); \
T fmax = FX ## bits (imax); \
\
if (abs ## FX (fmin) != fmax) \
abort(); \
if (abs ## FX (fmin) != abs ## FX (fmax)) \
abort(); \
if (abs ## FX (fmin + z) != fmax + z) \
abort(); \
if (abs ## FX (fmin - z) != abs ## FX (fmax + z)) \
abort(); \
}
void test3 (void)
{
MINMAX (short fract, hr);
MINMAX (fract, r);
MINMAX (long fract, lr);
MINMAX (long long fract, llr);
MINMAX (short accum, hk);
MINMAX (accum, k);
MINMAX (long accum, lk);
MINMAX (long long accum, llk);
}
int main (void)
{
test1();
test2();
test3();
return 0;
}