1/* Test vqneg_s64 intrinsics work correctly.  */
2/* { dg-do run } */
3/* { dg-options "--save-temps" } */
4
5#include <arm_neon.h>
6
7extern void abort (void);
8
9int __attribute__ ((noinline))
10test_vqneg_s64 (int64x1_t passed, int64_t expected)
11{
12  return vget_lane_s64 (vqneg_s64 (passed), 0) != expected;
13}
14
15int __attribute__ ((noinline))
16test_vqnegd_s64 (int64_t passed, int64_t expected)
17{
18  return vqnegd_s64 (passed) != expected;
19}
20
21/* { dg-final { scan-assembler-times "sqneg\\td\[0-9\]+, d\[0-9\]+" 2 } } */
22
23int
24main (int argc, char **argv)
25{
26  /* Basic test.  */
27  if (test_vqneg_s64 (vcreate_s64 (-1), 1))
28    abort ();
29  if (test_vqnegd_s64 (-1, 1))
30    abort ();
31
32  /* Negating max int64_t.  */
33  if (test_vqneg_s64 (vcreate_s64 (0x7fffffffffffffff), 0x8000000000000001))
34    abort ();
35  if (test_vqnegd_s64 (0x7fffffffffffffff, 0x8000000000000001))
36    abort ();
37
38  /* Negating min int64_t.
39     Note, exact negation cannot be represented as int64_t.  */
40  if (test_vqneg_s64 (vcreate_s64 (0x8000000000000000), 0x7fffffffffffffff))
41    abort ();
42  if (test_vqnegd_s64 (0x8000000000000000, 0x7fffffffffffffff))
43    abort ();
44
45  return 0;
46}
47/* { dg-final { cleanup-saved-temps } } */
48