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