Add execution + assembler tests of AArch64 TRN Intrinsics.
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / sshr64_1.c
blob89c6096ad3934d1c42fac2c8fba6eba6170762da
1 /* Test SIMD shift works correctly. */
2 /* { dg-do run } */
3 /* { dg-options "-O3 --save-temps" } */
5 #include "arm_neon.h"
7 extern void abort (void);
9 int __attribute__ ((noinline))
10 test_sshr64 ()
12 int64x1_t arg;
13 int64x1_t result;
14 int64_t got;
15 int64_t exp;
16 arg = vcreate_s64 (0x0000000080000000);
17 result = vshr_n_s64 (arg, 64);
18 got = vget_lane_s64 (result, 0);
19 exp = 0;
20 /* Expect: "result" = 0000000000000000. */
21 if (exp != got)
22 return 1;
23 return 0;
26 int __attribute__ ((noinline))
27 test_sshr64_neg ()
29 int64x1_t arg;
30 int64x1_t result;
31 int64_t got;
32 int64_t exp;
33 arg = vcreate_s64 (0xffffffff80000000);
34 result = vshr_n_s64 (arg, 64);
35 got = vget_lane_s64 (result, 0);
36 exp = 0xffffffffffffffff;
37 /* Expect: "result" = -1. */
38 if (exp != got)
39 return 1;
40 return 0;
43 int
44 __attribute__ ((noinline))
45 test_other ()
47 int64x1_t arg;
48 int64x1_t result;
49 int64_t got;
50 int64_t exp;
51 arg = vcreate_s64 (0x0000000080000000);
52 result = vshr_n_s64 (arg, 4);
53 got = vget_lane_s64 (result, 0);
54 exp = 0x0000000008000000;
55 /* Expect: "result" = 0x0000000008000000. */
56 if (exp != got)
57 return 1;
58 return 0;
61 int __attribute__ ((noinline))
62 test_other_neg ()
64 int64x1_t arg;
65 int64x1_t result;
66 int64_t got;
67 int64_t exp;
68 arg = vcreate_s64 (0xffffffff80000000);
69 result = vshr_n_s64 (arg, 4);
70 got = vget_lane_s64 (result, 0);
71 exp = 0xfffffffff8000000;
72 /* Expect: "result" = 0xfffffffff8000000. */
73 if (exp != got)
74 return 1;
75 return 0;
78 int __attribute__ ((noinline))
79 test_no_sshr0 ()
81 int64x1_t arg;
82 int64x1_t result;
83 int64_t got;
84 int64_t exp;
85 arg = vcreate_s64 (0x0000000080000000);
86 result = vshr_n_s64 (arg, 0);
87 got = vget_lane_s64 (result, 0);
88 exp = 0x0000000080000000;
89 /* Expect: "result" = 0x0000000080000000. */
90 if (exp != got)
91 return 1;
92 return 0;
95 /* { dg-final { scan-assembler-not "sshr\\td\[0-9\]+, d\[0-9\]+, 0" } } */
96 int
97 main ()
99 if (test_sshr64 ())
100 abort ();
101 if (test_other ())
102 abort ();
104 if (test_sshr64_neg ())
105 abort ();
106 if (test_other_neg ())
107 abort ();
109 if (test_no_sshr0 ())
110 abort ();
112 return 0;
115 /* { dg-final { cleanup-saved-temps } } */