1 /* Make sure that short memset's with constant length are emitted
2 without loop statements. */
3
4 /* { dg-do compile } */
5 /* { dg-options "-O3 -mzarch" } */
6
7 /* 1 mvc */
8 void
memset1(void * s,int c)9 *memset1(void *s, int c)
10 {
11 return __builtin_memset (s, c, 42);
12 }
13
14 /* 3 mvc */
15 void
memset2(void * s,int c)16 *memset2(void *s, int c)
17 {
18 return __builtin_memset (s, c, 700);
19 }
20
21 /* nop */
22 void
memset3(void * s,int c)23 *memset3(void *s, int c)
24 {
25 return __builtin_memset (s, c, 0);
26 }
27
28 /* mvc */
29 void
memset4(void * s,int c)30 *memset4(void *s, int c)
31 {
32 return __builtin_memset (s, c, 256);
33 }
34
35 /* 2 mvc */
36 void
memset5(void * s,int c)37 *memset5(void *s, int c)
38 {
39 return __builtin_memset (s, c, 512);
40 }
41
42 /* still 2 mvc through the additional first byte */
43 void
memset6(void * s,int c)44 *memset6(void *s, int c)
45 {
46 return __builtin_memset (s, c, 514);
47 }
48
49 /* 3 mvc */
50 void
memset7(void * s,int c)51 *memset7(void *s, int c)
52 {
53 return __builtin_memset (s, c, 515);
54 }
55
56 /* still 3 mvc through the additional first byte */
57 void
memset8(void * s,int c)58 *memset8(void *s, int c)
59 {
60 return __builtin_memset (s, c, 771);
61 }
62
63 /* Use mvc loop: 2 mvc */
64 void
memset9(void * s,int c)65 *memset9(void *s, int c)
66 {
67 return __builtin_memset (s, c, 772);
68 }
69
70 /* 3 mvc with displacement overflow after the first */
71 void
memset10(void * s,int c)72 *memset10(void *s, int c)
73 {
74 return __builtin_memset ((char*)s + 4000, c, 700);
75 }
76
77 /* 1 xc */
78 void
clrmem1(void * s)79 *clrmem1(void *s)
80 {
81 return __builtin_memset (s, 0, 42);
82 }
83
84 /* 3 xc */
85 void
clrmem2(void * s)86 *clrmem2(void *s)
87 {
88 return __builtin_memset (s, 0, 700);
89 }
90
91 /* nop */
92 void
clrmem3(void * s)93 *clrmem3(void *s)
94 {
95 return __builtin_memset (s, 0, 0);
96 }
97
98 /* 1 xc */
99 void
clrmem4(void * s)100 *clrmem4(void *s)
101 {
102 return __builtin_memset (s, 0, 256);
103 }
104
105 /* 2 xc */
106 void
clrmem5(void * s)107 *clrmem5(void *s)
108 {
109 return __builtin_memset (s, 0, 512);
110 }
111
112 /* 3 xc */
113 void
clrmem6(void * s)114 *clrmem6(void *s)
115 {
116 return __builtin_memset (s, 0, 768);
117 }
118
119 /* start using xc loop */
120 void
clrmem7(void * s)121 *clrmem7(void *s)
122 {
123 return __builtin_memset (s, 0, 1281);
124 }
125
126 /* 3 xc with displacement overflow after the first */
127 void
clrmem8(void * s)128 *clrmem8(void *s)
129 {
130 return __builtin_memset (s + 4000, 0, 700);
131 }
132
133 /* { dg-final { scan-assembler-times "mvc" 19 } } */
134 /* { dg-final { scan-assembler-times "xc" 15 } } */
135