aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/ieee/fp-cmp-5.c
blob: 9c70072f4e00eef48c59b3a323ff84dc6931d735 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* Like fp-cmp-4.c, but test that the setcc patterns are correct.  */

static int
test_isunordered(double x, double y)
{
  return __builtin_isunordered(x, y);
}

static int
test_not_isunordered(double x, double y)
{
  return !__builtin_isunordered(x, y);
}

static int
test_isless(double x, double y)
{
  return __builtin_isless(x, y);
}

static int
test_not_isless(double x, double y)
{
  return !__builtin_isless(x, y);
}

static int
test_islessequal(double x, double y)
{
  return __builtin_islessequal(x, y);
}

static int
test_not_islessequal(double x, double y)
{
  return !__builtin_islessequal(x, y);
}

static int
test_isgreater(double x, double y)
{
  return __builtin_isgreater(x, y);
}

static int
test_not_isgreater(double x, double y)
{
  return !__builtin_isgreater(x, y);
}

static int
test_isgreaterequal(double x, double y)
{
  return __builtin_isgreaterequal(x, y);
}

static int
test_not_isgreaterequal(double x, double y)
{
  return !__builtin_isgreaterequal(x, y);
}

static int
test_islessgreater(double x, double y)
{
  return __builtin_islessgreater(x, y);
}

static int
test_not_islessgreater(double x, double y)
{
  return !__builtin_islessgreater(x, y);
}

static void
one_test(double x, double y, int expected,
         int (*pos) (double, double), int (*neg) (double, double))
{
  if ((*pos)(x, y) != expected)
    abort ();
  if ((*neg)(x, y) != !expected)
    abort ();
}

#define NAN (0.0 / 0.0)

int
main()
{
  struct try
  {
    double x, y;
    int result[6];
  };

  static struct try const data[] =
  {
    { NAN, NAN, { 1, 0, 0, 0, 0, 0 } },
    { 0.0, NAN, { 1, 0, 0, 0, 0, 0 } },
    { NAN, 0.0, { 1, 0, 0, 0, 0, 0 } },
    { 0.0, 0.0, { 0, 0, 1, 0, 1, 0 } },
    { 1.0, 2.0, { 0, 1, 1, 0, 0, 1 } },
    { 2.0, 1.0, { 0, 0, 0, 1, 1, 1 } },
  };

  struct test
  {
    int (*pos)(double, double);
    int (*neg)(double, double);
  };

  static struct test const tests[] =
  {
    { test_isunordered, test_not_isunordered },
    { test_isless, test_not_isless },
    { test_islessequal, test_not_islessequal },
    { test_isgreater, test_not_isgreater },
    { test_isgreaterequal, test_not_isgreaterequal },
    { test_islessgreater, test_not_islessgreater }
  };

  const int n = sizeof(data) / sizeof(data[0]);
  int i, j;

  for (i = 0; i < n; ++i)
    for (j = 0; j < 6; ++j)
      one_test (data[i].x, data[i].y, data[i].result[j],
		tests[j].pos, tests[j].neg);

  exit (0);
}