2014-11-18 Christophe Lyon <christophe.lyon@linaro.org>
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / advsimd-intrinsics / vext.c
blob0b014ebda87e1486ea6005d597f6dc30b5dfc470
1 #include <arm_neon.h>
2 #include "arm-neon-ref.h"
3 #include "compute-ref-data.h"
5 /* Expected results. */
6 VECT_VAR_DECL(expected,int,8,8) [] = { 0xf7, 0x11, 0x11, 0x11,
7 0x11, 0x11, 0x11, 0x11 };
8 VECT_VAR_DECL(expected,int,16,4) [] = { 0xfff3, 0x22, 0x22, 0x22 };
9 VECT_VAR_DECL(expected,int,32,2) [] = { 0xfffffff1, 0x33 };
10 VECT_VAR_DECL(expected,int,64,1) [] = { 0xfffffffffffffff0 };
11 VECT_VAR_DECL(expected,uint,8,8) [] = { 0xf6, 0xf7, 0x55, 0x55,
12 0x55, 0x55, 0x55, 0x55 };
13 VECT_VAR_DECL(expected,uint,16,4) [] = { 0xfff2, 0xfff3, 0x66, 0x66 };
14 VECT_VAR_DECL(expected,uint,32,2) [] = { 0xfffffff1, 0x77 };
15 VECT_VAR_DECL(expected,uint,64,1) [] = { 0xfffffffffffffff0 };
16 VECT_VAR_DECL(expected,poly,8,8) [] = { 0xf6, 0xf7, 0x55, 0x55,
17 0x55, 0x55, 0x55, 0x55 };
18 VECT_VAR_DECL(expected,poly,16,4) [] = { 0xfff2, 0xfff3, 0x66, 0x66 };
19 VECT_VAR_DECL(expected,hfloat,32,2) [] = { 0xc1700000, 0x42066666 };
20 VECT_VAR_DECL(expected,int,8,16) [] = { 0xfe, 0xff, 0x11, 0x11,
21 0x11, 0x11, 0x11, 0x11,
22 0x11, 0x11, 0x11, 0x11,
23 0x11, 0x11, 0x11, 0x11 };
24 VECT_VAR_DECL(expected,int,16,8) [] = { 0xfff7, 0x22, 0x22, 0x22,
25 0x22, 0x22, 0x22, 0x22 };
26 VECT_VAR_DECL(expected,int,32,4) [] = { 0xfffffff3, 0x33, 0x33, 0x33 };
27 VECT_VAR_DECL(expected,int,64,2) [] = { 0xfffffffffffffff1, 0x44 };
28 VECT_VAR_DECL(expected,uint,8,16) [] = { 0xfc, 0xfd, 0xfe, 0xff,
29 0x55, 0x55, 0x55, 0x55,
30 0x55, 0x55, 0x55, 0x55,
31 0x55, 0x55, 0x55, 0x55 };
32 VECT_VAR_DECL(expected,uint,16,8) [] = { 0xfff6, 0xfff7, 0x66, 0x66,
33 0x66, 0x66, 0x66, 0x66 };
34 VECT_VAR_DECL(expected,uint,32,4) [] = { 0xfffffff3, 0x77, 0x77, 0x77 };
35 VECT_VAR_DECL(expected,uint,64,2) [] = { 0xfffffffffffffff1, 0x88 };
36 VECT_VAR_DECL(expected,poly,8,16) [] = { 0xfc, 0xfd, 0xfe, 0xff,
37 0x55, 0x55, 0x55, 0x55,
38 0x55, 0x55, 0x55, 0x55,
39 0x55, 0x55, 0x55, 0x55 };
40 VECT_VAR_DECL(expected,poly,16,8) [] = { 0xfff6, 0xfff7, 0x66, 0x66,
41 0x66, 0x66, 0x66, 0x66 };
42 VECT_VAR_DECL(expected,hfloat,32,4) [] = { 0xc1500000, 0x4204cccd,
43 0x4204cccd, 0x4204cccd };
45 #define TEST_MSG "VEXT/VEXTQ"
46 void exec_vext (void)
48 /* vector_res = vext(vector1,vector2,offset), then store the result. */
49 #define TEST_VEXT(Q, T1, T2, W, N, V) \
50 VECT_VAR(vector_res, T1, W, N) = \
51 vext##Q##_##T2##W(VECT_VAR(vector1, T1, W, N), \
52 VECT_VAR(vector2, T1, W, N), \
53 V); \
54 vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(vector_res, T1, W, N))
56 DECL_VARIABLE_ALL_VARIANTS(vector1);
57 DECL_VARIABLE_ALL_VARIANTS(vector2);
58 DECL_VARIABLE_ALL_VARIANTS(vector_res);
60 clean_results ();
62 TEST_MACRO_ALL_VARIANTS_2_5(VLOAD, vector1, buffer);
63 VLOAD(vector1, buffer, , float, f, 32, 2);
64 VLOAD(vector1, buffer, q, float, f, 32, 4);
66 /* Choose arbitrary initialization values. */
67 VDUP(vector2, , int, s, 8, 8, 0x11);
68 VDUP(vector2, , int, s, 16, 4, 0x22);
69 VDUP(vector2, , int, s, 32, 2, 0x33);
70 VDUP(vector2, , int, s, 64, 1, 0x44);
71 VDUP(vector2, , uint, u, 8, 8, 0x55);
72 VDUP(vector2, , uint, u, 16, 4, 0x66);
73 VDUP(vector2, , uint, u, 32, 2, 0x77);
74 VDUP(vector2, , uint, u, 64, 1, 0x88);
75 VDUP(vector2, , poly, p, 8, 8, 0x55);
76 VDUP(vector2, , poly, p, 16, 4, 0x66);
77 VDUP(vector2, , float, f, 32, 2, 33.6f);
79 VDUP(vector2, q, int, s, 8, 16, 0x11);
80 VDUP(vector2, q, int, s, 16, 8, 0x22);
81 VDUP(vector2, q, int, s, 32, 4, 0x33);
82 VDUP(vector2, q, int, s, 64, 2, 0x44);
83 VDUP(vector2, q, uint, u, 8, 16, 0x55);
84 VDUP(vector2, q, uint, u, 16, 8, 0x66);
85 VDUP(vector2, q, uint, u, 32, 4, 0x77);
86 VDUP(vector2, q, uint, u, 64, 2, 0x88);
87 VDUP(vector2, q, poly, p, 8, 16, 0x55);
88 VDUP(vector2, q, poly, p, 16, 8, 0x66);
89 VDUP(vector2, q, float, f, 32, 4, 33.2f);
91 /* Choose arbitrary extract offsets. */
92 TEST_VEXT(, int, s, 8, 8, 7);
93 TEST_VEXT(, int, s, 16, 4, 3);
94 TEST_VEXT(, int, s, 32, 2, 1);
95 TEST_VEXT(, int, s, 64, 1, 0);
96 TEST_VEXT(, uint, u, 8, 8, 6);
97 TEST_VEXT(, uint, u, 16, 4, 2);
98 TEST_VEXT(, uint, u, 32, 2, 1);
99 TEST_VEXT(, uint, u, 64, 1, 0);
100 TEST_VEXT(, poly, p, 8, 8, 6);
101 TEST_VEXT(, poly, p, 16, 4, 2);
102 TEST_VEXT(, float, f, 32, 2, 1);
104 TEST_VEXT(q, int, s, 8, 16, 14);
105 TEST_VEXT(q, int, s, 16, 8, 7);
106 TEST_VEXT(q, int, s, 32, 4, 3);
107 TEST_VEXT(q, int, s, 64, 2, 1);
108 TEST_VEXT(q, uint, u, 8, 16, 12);
109 TEST_VEXT(q, uint, u, 16, 8, 6);
110 TEST_VEXT(q, uint, u, 32, 4, 3);
111 TEST_VEXT(q, uint, u, 64, 2, 1);
112 TEST_VEXT(q, poly, p, 8, 16, 12);
113 TEST_VEXT(q, poly, p, 16, 8, 6);
114 TEST_VEXT(q, float, f, 32, 4, 3);
116 CHECK_RESULTS (TEST_MSG, "");
119 int main (void)
121 exec_vext ();
122 return 0;