summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/i386/avx512f-vcomisd-2.c
blob: a84580e29c56032c17243636da9e5e9ebd0dab81 (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
/* { dg-do run } */
/* { dg-require-effective-target avx512f } */
/* { dg-options "-O2 -mavx512f" } */

#include "avx512f-check.h"

static inline void __attribute__ ((__always_inline__))
check_cmp (double s1, double s2, const int imm, int expected)
{
  __m128d source1 = _mm_load_sd (&s1);
  __m128d source2 = _mm_load_sd (&s2);
  int res = _mm_comi_round_sd (source1, source2, imm,
			       _MM_FROUND_NO_EXC);
  if (expected != res)
    abort();
}

static void
do_check (double s1, double s2)
{
  check_cmp (s1, s2, _CMP_EQ_OQ,
	     !__builtin_isunordered (s1, s2) && s1 == s2);
  check_cmp (s1, s2, _CMP_LT_OS,
	     !__builtin_isunordered (s1, s2) && s1 < s2);
  check_cmp (s1, s2, _CMP_LE_OS,
	     !__builtin_isunordered (s1, s2) && s1 <= s2);
  check_cmp (s1, s2, _CMP_UNORD_Q,
	     __builtin_isunordered (s1, s2));
  check_cmp (s1, s2, _CMP_NEQ_UQ,
	     __builtin_isunordered (s1, s2) || s1 != s2);
  check_cmp (s1, s2, _CMP_NLT_US,
	     __builtin_isunordered (s1, s2) || s1 >= s2);
  check_cmp (s1, s2, _CMP_NLE_US,
	     __builtin_isunordered (s1, s2) || s1 > s2);
  check_cmp (s1, s2, _CMP_ORD_Q,
	     !__builtin_isunordered (s1, s2));
  check_cmp (s1, s2, _CMP_EQ_UQ,
	     __builtin_isunordered (s1, s2) || s1 == s2);
  check_cmp (s1, s2, _CMP_NGE_US,
	     __builtin_isunordered (s1, s2) || s1 < s2);
  check_cmp (s1, s2, _CMP_NGT_US,
	     __builtin_isunordered (s1, s2) || s1 <= s2);
  check_cmp (s1, s2, _CMP_FALSE_OQ, 0);
  check_cmp (s1, s2, _CMP_NEQ_OQ,
	     !__builtin_isunordered (s1, s2) && s1 != s2);
  check_cmp (s1, s2, _CMP_GE_OS,
	     !__builtin_isunordered (s1, s2) && s1 >= s2);
  check_cmp (s1, s2, _CMP_GT_OS,
	     !__builtin_isunordered (s1, s2) && s1 > s2);
  check_cmp (s1, s2, _CMP_TRUE_UQ, 1);
  check_cmp (s1, s2, _CMP_EQ_OS,
	     !__builtin_isunordered (s1, s2) && s1 == s2);
  check_cmp (s1, s2, _CMP_LT_OQ,
	     !__builtin_isunordered (s1, s2) && s1 < s2);
  check_cmp (s1, s2, _CMP_LE_OQ,
	     !__builtin_isunordered (s1, s2) && s1 <= s2);
  check_cmp (s1, s2, _CMP_UNORD_S,
	     __builtin_isunordered (s1, s2));
  check_cmp (s1, s2, _CMP_NEQ_US,
	     __builtin_isunordered (s1, s2) || s1 != s2);
  check_cmp (s1, s2, _CMP_NLT_UQ,
	     __builtin_isunordered (s1, s2) || s1 >= s2);
  check_cmp (s1, s2, _CMP_NLE_UQ,
	     __builtin_isunordered (s1, s2) || s1 > s2);
  check_cmp (s1, s2, _CMP_ORD_S, !__builtin_isunordered (s1, s2));
  check_cmp (s1, s2, _CMP_EQ_US,
	     __builtin_isunordered (s1, s2) || s1 == s2);
  check_cmp (s1, s2, _CMP_NGE_UQ,
	     __builtin_isunordered (s1, s2) || s1 < s2);
  check_cmp (s1, s2, _CMP_NGT_UQ,
	     __builtin_isunordered (s1, s2) || s1 <= s2);
  check_cmp (s1, s2, _CMP_FALSE_OS, 0);
  check_cmp (s1, s2, _CMP_NEQ_OS,
	     !__builtin_isunordered (s1, s2) && s1 != s2);
  check_cmp (s1, s2, _CMP_GE_OQ,
	     !__builtin_isunordered (s1, s2) && s1 >= s2);
  check_cmp (s1, s2, _CMP_GT_OQ,
	     !__builtin_isunordered (s1, s2) && s1 > s2);
  check_cmp (s1, s2, _CMP_TRUE_US, 1);
}

static void
avx512f_test (void)
{
  struct
    {
      double x1;
      double x2;
    }
  inputs[] =
    {
      { 4.3, 2.18 },
      { -4.3, 3.18 },
      { __builtin_nan (""), -5.8 },
      { -4.8, __builtin_nans ("") },
      { 3.8, __builtin_nans ("") },
      { 4.2, 4.2 },
      { __builtin_nan (""), __builtin_nans ("") },
    };
  int i;

  for (i = 0; i < sizeof (inputs) / sizeof (inputs[0]); i++)
    do_check (inputs[i].x1, inputs[i].x2);
}