1 /* { dg-do run } */
2 /* { dg-options "-save-temps -O2 -ftree-vectorize -fno-inline -fno-vect-cost-model" } */
3
4 #pragma GCC target "+nosve"
5
6 #define N 1024
7
8 #define FUNC_DEF(__a) \
9 void \
10 foo##__a (float *a, int *b) \
11 { \
12 int i; \
13 for (i = 0; i < N; i++) \
14 b[i] = a[i] * __a##.0f; \
15 }
16
17 FUNC_DEF (4)
18 FUNC_DEF (8)
19 FUNC_DEF (16)
20
21 int ints[N];
22 float floats[N];
23
24 void
25 reset_ints (int *arr)
26 {
27 int i;
28
29 for (i = 0; i < N; i++)
30 arr[i] = 0;
31 }
32
33 void
34 check_result (int *is, int n)
35 {
36 int i;
37
38 for (i = 0; i < N; i++)
39 if (is[i] != i * n)
40 __builtin_abort ();
41 }
42
43 #define FUNC_CHECK(__a) \
44 do \
45 { \
46 reset_ints (ints); \
47 foo##__a (floats, ints); \
48 check_result (ints, __a); \
49 } while (0)
50
51
52 int
53 main (void)
54 {
55 int i;
56 for (i = 0; i < N; i++)
57 floats[i] = (float) i;
58
59 FUNC_CHECK (4);
60 FUNC_CHECK (8);
61 FUNC_CHECK (16);
62
63 return 0;
64 }
65
66 /* { dg-final { scan-assembler-not "fmul\tv\[0-9\]*.*" } } */
67 /* { dg-final { scan-assembler-times "fcvtzs\tv\[0-9\].4s, v\[0-9\].4s*.*#2" 1 } } */
68 /* { dg-final { scan-assembler-times "fcvtzs\tv\[0-9\].4s, v\[0-9\].4s*.*#3" 1 } } */
69 /* { dg-final { scan-assembler-times "fcvtzs\tv\[0-9\].4s, v\[0-9\].4s*.*#4" 1 } } */