[ARM/AArch64][testsuite] Add vmla_n and vmls_n tests.
[official-gcc.git] / gcc / testsuite / gcc.target / aarch64 / advsimd-intrinsics / vmlX_n.inc
blob375023a77cf38775e2a162395fc846600cec652e
1 #define FNNAME1(NAME) exec_ ## NAME
2 #define FNNAME(NAME) FNNAME1(NAME)
4 void FNNAME (INSN_NAME) (void)
6 #define DECL_VMLX_N(VAR)                        \
7   DECL_VARIABLE(VAR, int, 16, 4);               \
8   DECL_VARIABLE(VAR, int, 32, 2);               \
9   DECL_VARIABLE(VAR, uint, 16, 4);              \
10   DECL_VARIABLE(VAR, uint, 32, 2);              \
11   DECL_VARIABLE(VAR, float, 32, 2);             \
12   DECL_VARIABLE(VAR, int, 16, 8);               \
13   DECL_VARIABLE(VAR, int, 32, 4);               \
14   DECL_VARIABLE(VAR, uint, 16, 8);              \
15   DECL_VARIABLE(VAR, float, 32, 4);             \
16   DECL_VARIABLE(VAR, uint, 32, 4)
18   /* vector_res = vmlx_n(vector, vector2, val),
19      then store the result.  */
20 #define TEST_VMLX_N1(INSN, Q, T1, T2, W, N, V)          \
21   VECT_VAR(vector_res, T1, W, N) =                      \
22     INSN##Q##_n_##T2##W(VECT_VAR(vector, T1, W, N),     \
23                         VECT_VAR(vector2, T1, W, N),    \
24                         V);                             \
25   vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N),         \
26                     VECT_VAR(vector_res, T1, W, N))
28 #define TEST_VMLX_N(INSN, Q, T1, T2, W, N, V)   \
29   TEST_VMLX_N1(INSN, Q, T1, T2, W, N, V)
31   DECL_VMLX_N(vector);
32   DECL_VMLX_N(vector2);
33   DECL_VMLX_N(vector_res);
35   clean_results ();
37   VLOAD(vector, buffer, , int, s, 16, 4);
38   VLOAD(vector, buffer, , int, s, 32, 2);
39   VLOAD(vector, buffer, , uint, u, 16, 4);
40   VLOAD(vector, buffer, , uint, u, 32, 2);
41   VLOAD(vector, buffer, , float, f, 32, 2);
42   VLOAD(vector, buffer, q, int, s, 16, 8);
43   VLOAD(vector, buffer, q, int, s, 32, 4);
44   VLOAD(vector, buffer, q, uint, u, 16, 8);
45   VLOAD(vector, buffer, q, uint, u, 32, 4);
46   VLOAD(vector, buffer, q, float, f, 32, 4);
48   VDUP(vector2, , int, s, 16, 4, 0x55);
49   VDUP(vector2, , int, s, 32, 2, 0x55);
50   VDUP(vector2, , uint, u, 16, 4, 0x55);
51   VDUP(vector2, , uint, u, 32, 2, 0x55);
52   VDUP(vector2, , float, f, 32, 2, 55.2f);
53   VDUP(vector2, q, int, s, 16, 8, 0x55);
54   VDUP(vector2, q, int, s, 32, 4, 0x55);
55   VDUP(vector2, q, uint, u, 16, 8, 0x55);
56   VDUP(vector2, q, uint, u, 32, 4, 0x55);
57   VDUP(vector2, q, float, f, 32, 4, 55.9f);
59   /* Choose multiplier arbitrarily.  */
60   TEST_VMLX_N(INSN_NAME, , int, s, 16, 4, 0x11);
61   TEST_VMLX_N(INSN_NAME, , int, s, 32, 2, 0x22);
62   TEST_VMLX_N(INSN_NAME, , uint, u, 16, 4, 0x33);
63   TEST_VMLX_N(INSN_NAME, , uint, u, 32, 2, 0x44);
64   TEST_VMLX_N(INSN_NAME, , float, f, 32, 2, 22.3f);
65   TEST_VMLX_N(INSN_NAME, q, int, s, 16, 8, 0x55);
66   TEST_VMLX_N(INSN_NAME, q, int, s, 32, 4, 0x66);
67   TEST_VMLX_N(INSN_NAME, q, uint, u, 16, 8, 0x77);
68   TEST_VMLX_N(INSN_NAME, q, uint, u, 32, 4, 0x88);
69   TEST_VMLX_N(INSN_NAME, q, float, f, 32, 4, 66.7f);
71   CHECK(TEST_MSG, int, 16, 4, PRIx16, expected, "");
72   CHECK(TEST_MSG, int, 32, 2, PRIx32, expected, "");
73   CHECK(TEST_MSG, uint, 16, 4, PRIx16, expected, "");
74   CHECK(TEST_MSG, uint, 32, 2, PRIx32, expected, "");
75   CHECK_FP(TEST_MSG, float, 32, 2, PRIx32, expected, "");
76   CHECK(TEST_MSG, int, 16, 8, PRIx16, expected, "");
77   CHECK(TEST_MSG, int, 32, 4, PRIx32, expected, "");
78   CHECK(TEST_MSG, uint, 16, 8, PRIx16, expected, "");
79   CHECK(TEST_MSG, uint, 32, 4, PRIx32, expected, "");
80   CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected, "");
83 int main (void)
85   FNNAME (INSN_NAME) ();
86   return 0;