1 /* { dg-do run } */
2 /* { dg-skip-if "Don't inline memset using neon instructions" { ! arm_tune_string_ops_prefer_neon } } */
3 /* { dg-options "-save-temps -O2 -fno-inline" } */
4 /* { dg-add-options "arm_neon" } */
5
6 #include <string.h>
7 #include <stdlib.h>
8
9 #define LEN (100)
10 int a[LEN];
11 int b[LEN];
12 int c[LEN];
13 int d[LEN];
14 void
foo1(void)15 foo1 (void)
16 {
17 memset (a, -1, 16);
18 return;
19 }
20
21 void
foo2(void)22 foo2 (void)
23 {
24 memset (b, 1, 25);
25 return;
26 }
27
28 void
foo3(void)29 foo3 (void)
30 {
31 memset (c, -1, 19);
32 return;
33 }
34
35 void
foo4(void)36 foo4 (void)
37 {
38 memset (d, 1, 23);
39 return;
40 }
41
42 void
check(signed char * arr,int idx,int len,int v)43 check (signed char *arr, int idx, int len, int v)
44 {
45 int i;
46 for (i = 0; i < idx; i++)
47 if (arr[i] != v)
48 abort ();
49
50 for (i = idx; i < len; i++)
51 if (arr[i] != 0)
52 abort ();
53 }
54
55 int
main(void)56 main(void)
57 {
58 foo1 ();
59 check ((signed char *)a, 16, sizeof (a), -1);
60
61 foo2 ();
62 check ((signed char *)b, 25, sizeof (b), 1);
63
64 foo3 ();
65 check ((signed char *)c, 19, sizeof (c), -1);
66
67 foo4 ();
68 check ((signed char *)d, 23, sizeof (d), 1);
69
70 return 0;
71 }
72
73 /* { dg-final { scan-assembler-not "bl?\[ \t\]+memset" { target { arm_little_endian && arm_neon } } } } */
74 /* { dg-final { scan-assembler "vst1" { target { arm_little_endian && arm_neon } } } } */
75 /* { dg-final { scan-assembler-not "vstr" { target { arm_little_endian && arm_neon } } } } */
76
77