1 /* Test vneg works correctly. */
3 /* { dg-options "-std=gnu99 -O3 -Wno-div-by-zero --save-temps" } */
8 /* Used to force a variable to a SIMD register. */
9 #define force_simd(V1) asm volatile ("mov %d0, %1.d[0]" \
13 #define INHIB_OPTIMIZATION asm volatile ("" : : : "memory")
29 extern void abort (void);
31 #define CONCAT(a, b) a##b
32 #define CONCAT1(a, b) CONCAT (a, b)
34 #define REG_INFEX128 q_
35 #define REG_INFEX(reg_len) REG_INFEX##reg_len
36 #define POSTFIX(reg_len, data_len) \
37 CONCAT1 (REG_INFEX (reg_len), s##data_len)
38 #define DATA_TYPE_32 float
39 #define DATA_TYPE_64 double
40 #define DATA_TYPE(data_len) DATA_TYPE_##data_len
42 #define INDEX64_16 [i]
43 #define INDEX64_32 [i]
45 #define INDEX128_8 [i]
46 #define INDEX128_16 [i]
47 #define INDEX128_32 [i]
48 #define INDEX128_64 [i]
50 #define FORCE_SIMD_INST64_8(data)
51 #define FORCE_SIMD_INST64_16(data)
52 #define FORCE_SIMD_INST64_32(data)
53 #define FORCE_SIMD_INST64_64(data) force_simd (data)
54 #define FORCE_SIMD_INST128_8(data)
55 #define FORCE_SIMD_INST128_16(data)
56 #define FORCE_SIMD_INST128_32(data)
57 #define FORCE_SIMD_INST128_64(data)
59 #define INDEX(reg_len, data_len) \
60 CONCAT1 (INDEX, reg_len##_##data_len)
61 #define FORCE_SIMD_INST(reg_len, data_len, data) \
62 CONCAT1 (FORCE_SIMD_INST, reg_len##_##data_len) (data)
63 #define LOAD_INST(reg_len, data_len) \
64 CONCAT1 (vld1, POSTFIX (reg_len, data_len))
65 #define NEG_INST(reg_len, data_len) \
66 CONCAT1 (vneg, POSTFIX (reg_len, data_len))
68 #define RUN_TEST(test_set, answ_set, reg_len, data_len, n, a, b) \
72 (a) = LOAD_INST (reg_len, data_len) (test_set); \
73 (b) = LOAD_INST (reg_len, data_len) (answ_set); \
74 FORCE_SIMD_INST (reg_len, data_len, a) \
75 a = NEG_INST (reg_len, data_len) (a); \
76 FORCE_SIMD_INST (reg_len, data_len, a) \
77 for (i = 0; i < n; i++) \
80 if (a INDEX (reg_len, data_len) \
81 != b INDEX (reg_len, data_len)) \
92 int8_t test_set0
[8] = {
93 TEST0
, TEST1
, TEST2
, TEST3
, TEST4
, TEST5
, SCHAR_MAX
, SCHAR_MIN
95 int8_t answ_set0
[8] = {
96 ANSW0
, ANSW1
, ANSW2
, ANSW3
, ANSW4
, ANSW5
, SCHAR_MIN
+ 1, SCHAR_MIN
99 RUN_TEST (test_set0
, answ_set0
, 64, 8, 8, a
, b
);
104 /* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.8b, v\[0-9\]+\.8b" 1 } } */
112 int16_t test_set0
[4] = { TEST0
, TEST1
, TEST2
, TEST3
};
113 int16_t test_set1
[4] = { TEST4
, TEST5
, SHRT_MAX
, SHRT_MIN
};
115 int16_t answ_set0
[4] = { ANSW0
, ANSW1
, ANSW2
, ANSW3
};
116 int16_t answ_set1
[4] = { ANSW4
, ANSW5
, SHRT_MIN
+ 1, SHRT_MIN
};
118 RUN_TEST (test_set0
, answ_set0
, 64, 16, 4, a
, b
);
119 RUN_TEST (test_set1
, answ_set1
, 64, 16, 4, a
, b
);
124 /* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.4h, v\[0-9\]+\.4h" 2 } } */
132 int32_t test_set0
[2] = { TEST0
, TEST1
};
133 int32_t test_set1
[2] = { TEST2
, TEST3
};
134 int32_t test_set2
[2] = { TEST4
, TEST5
};
135 int32_t test_set3
[2] = { INT_MAX
, INT_MIN
};
137 int32_t answ_set0
[2] = { ANSW0
, ANSW1
};
138 int32_t answ_set1
[2] = { ANSW2
, ANSW3
};
139 int32_t answ_set2
[2] = { ANSW4
, ANSW5
};
140 int32_t answ_set3
[2] = { INT_MIN
+ 1, INT_MIN
};
142 RUN_TEST (test_set0
, answ_set0
, 64, 32, 2, a
, b
);
143 RUN_TEST (test_set1
, answ_set1
, 64, 32, 2, a
, b
);
144 RUN_TEST (test_set2
, answ_set2
, 64, 32, 2, a
, b
);
145 RUN_TEST (test_set3
, answ_set3
, 64, 32, 2, a
, b
);
150 /* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s" 4 } } */
158 int64_t test_set0
[1] = { TEST0
};
159 int64_t test_set1
[1] = { TEST1
};
160 int64_t test_set2
[1] = { TEST2
};
161 int64_t test_set3
[1] = { TEST3
};
162 int64_t test_set4
[1] = { TEST4
};
163 int64_t test_set5
[1] = { TEST5
};
164 int64_t test_set6
[1] = { LLONG_MAX
};
165 int64_t test_set7
[1] = { LLONG_MIN
};
167 int64_t answ_set0
[1] = { ANSW0
};
168 int64_t answ_set1
[1] = { ANSW1
};
169 int64_t answ_set2
[1] = { ANSW2
};
170 int64_t answ_set3
[1] = { ANSW3
};
171 int64_t answ_set4
[1] = { ANSW4
};
172 int64_t answ_set5
[1] = { ANSW5
};
173 int64_t answ_set6
[1] = { LLONG_MIN
+ 1 };
174 int64_t answ_set7
[1] = { LLONG_MIN
};
176 RUN_TEST (test_set0
, answ_set0
, 64, 64, 1, a
, b
);
177 RUN_TEST (test_set1
, answ_set1
, 64, 64, 1, a
, b
);
178 RUN_TEST (test_set2
, answ_set2
, 64, 64, 1, a
, b
);
179 RUN_TEST (test_set3
, answ_set3
, 64, 64, 1, a
, b
);
180 RUN_TEST (test_set4
, answ_set4
, 64, 64, 1, a
, b
);
181 RUN_TEST (test_set5
, answ_set5
, 64, 64, 1, a
, b
);
182 RUN_TEST (test_set6
, answ_set6
, 64, 64, 1, a
, b
);
183 RUN_TEST (test_set7
, answ_set7
, 64, 64, 1, a
, b
);
188 /* { dg-final { scan-assembler-times "neg\\td\[0-9\]+, d\[0-9\]+" 8 } } */
196 int8_t test_set0
[16] = {
197 TEST0
, TEST1
, TEST2
, TEST3
, TEST4
, TEST5
, SCHAR_MAX
, SCHAR_MIN
,
198 4, 8, 15, 16, 23, 42, -1, -2
201 int8_t answ_set0
[16] = {
202 ANSW0
, ANSW1
, ANSW2
, ANSW3
, ANSW4
, ANSW5
, SCHAR_MIN
+ 1, SCHAR_MIN
,
203 -4, -8, -15, -16, -23, -42, 1, 2
206 RUN_TEST (test_set0
, answ_set0
, 128, 8, 8, a
, b
);
211 /* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */
219 int16_t test_set0
[8] = {
220 TEST0
, TEST1
, TEST2
, TEST3
, TEST4
, TEST5
, SHRT_MAX
, SHRT_MIN
222 int16_t answ_set0
[8] = {
223 ANSW0
, ANSW1
, ANSW2
, ANSW3
, ANSW4
, ANSW5
, SHRT_MIN
+ 1, SHRT_MIN
226 RUN_TEST (test_set0
, answ_set0
, 128, 16, 8, a
, b
);
231 /* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h" 1 } } */
239 int32_t test_set0
[4] = { TEST0
, TEST1
, TEST2
, TEST3
};
240 int32_t test_set1
[4] = { TEST4
, TEST5
, INT_MAX
, INT_MIN
};
242 int32_t answ_set0
[4] = { ANSW0
, ANSW1
, ANSW2
, ANSW3
};
243 int32_t answ_set1
[4] = { ANSW4
, ANSW5
, INT_MIN
+ 1, INT_MIN
};
245 RUN_TEST (test_set0
, answ_set0
, 128, 32, 4, a
, b
);
246 RUN_TEST (test_set1
, answ_set1
, 128, 32, 4, a
, b
);
251 /* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 2 } } */
259 int64_t test_set0
[2] = { TEST0
, TEST1
};
260 int64_t test_set1
[2] = { TEST2
, TEST3
};
261 int64_t test_set2
[2] = { TEST4
, TEST5
};
262 int64_t test_set3
[2] = { LLONG_MAX
, LLONG_MIN
};
264 int64_t answ_set0
[2] = { ANSW0
, ANSW1
};
265 int64_t answ_set1
[2] = { ANSW2
, ANSW3
};
266 int64_t answ_set2
[2] = { ANSW4
, ANSW5
};
267 int64_t answ_set3
[2] = { LLONG_MIN
+ 1, LLONG_MIN
};
269 RUN_TEST (test_set0
, answ_set0
, 128, 64, 2, a
, b
);
270 RUN_TEST (test_set1
, answ_set1
, 128, 64, 2, a
, b
);
271 RUN_TEST (test_set2
, answ_set2
, 128, 64, 2, a
, b
);
272 RUN_TEST (test_set3
, answ_set3
, 128, 64, 2, a
, b
);
277 /* { dg-final { scan-assembler-times "neg\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d" 4 } } */
280 main (int argc
, char **argv
)
285 if (test_vneg_s16 ())
288 if (test_vneg_s32 ())
291 if (test_vneg_s64 ())
294 if (test_vnegq_s8 ())
297 if (test_vnegq_s16 ())
300 if (test_vnegq_s32 ())
303 if (test_vnegq_s64 ())
309 /* { dg-final { cleanup-saved-temps } } */