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 -march=z13" } */
       6  
       7  /* 1 stc */
       8  void
       9  *memset0(void *s, int c)
      10  {
      11    return __builtin_memset (s, c, 1);
      12  }
      13  
      14  /* 1 stc 1 mvc */
      15  void
      16  *memset1(void *s, int c)
      17  {
      18    return __builtin_memset (s, c, 42);
      19  }
      20  
      21  /* 3 stc 3 mvc */
      22  void
      23  *memset2(void *s, int c)
      24  {
      25    return __builtin_memset (s, c, 700);
      26  }
      27  
      28  /* nop */
      29  void
      30  *memset3(void *s, int c)
      31  {
      32    return __builtin_memset (s, c, 0);
      33  }
      34  
      35  /* 1 stc 1 mvc */
      36  void
      37  *memset4(void *s, int c)
      38  {
      39    return __builtin_memset (s, c, 256);
      40  }
      41  
      42  /* 2 stc 2 mvc */
      43  void
      44  *memset5(void *s, int c)
      45  {
      46    return __builtin_memset (s, c, 512);
      47  }
      48  
      49  /* 2 stc 2 mvc - still due to the stc bytes */
      50  void
      51  *memset6(void *s, int c)
      52  {
      53    return __builtin_memset (s, c, 514);
      54  }
      55  
      56  /* 3 stc 2 mvc */
      57  void
      58  *memset7(void *s, int c)
      59  {
      60    return __builtin_memset (s, c, 515);
      61  }
      62  
      63  /* 4 stc 4 mvc - 4 * 256 + 4 stc bytes */
      64  void
      65  *memset8(void *s, int c)
      66  {
      67    return __builtin_memset (s, c, 1028);
      68  }
      69  
      70  /* 2 stc 1 pfd 2 mvc - start using mvc loop */
      71  void
      72  *memset9(void *s, int c)
      73  {
      74    return __builtin_memset (s, c, 1029);
      75  }
      76  
      77  /* 3 stc 3 mvc - displacement overflow after the first */
      78  void
      79  *memset10(void *s, int c)
      80  {
      81    return __builtin_memset ((char*)s + 4000, c, 700);
      82  }
      83  
      84  /* 1 mvi */
      85  void
      86  *clrmem0(void *s)
      87  {
      88    return __builtin_memset (s, 0, 1);
      89  }
      90  
      91  /* 1 xc */
      92  void
      93  *clrmem1(void *s)
      94  {
      95    return __builtin_memset (s, 0, 42);
      96  }
      97  
      98  /* 3 xc */
      99  void
     100  *clrmem2(void *s)
     101  {
     102    return __builtin_memset (s, 0, 700);
     103  }
     104  
     105  /* nop */
     106  void
     107  *clrmem3(void *s)
     108  {
     109    return __builtin_memset (s, 0, 0);
     110  }
     111  
     112  /* 1 xc */
     113  void
     114  *clrmem4(void *s)
     115  {
     116    return __builtin_memset (s, 0, 256);
     117  }
     118  
     119  /* 2 xc */
     120  void
     121  *clrmem5(void *s)
     122  {
     123    return __builtin_memset (s, 0, 512);
     124  }
     125  
     126  /* 4 xc */
     127  void
     128  *clrmem6(void *s)
     129  {
     130    return __builtin_memset (s, 0, 1024);
     131  }
     132  
     133  /* 2 xc - start using xc loop*/
     134  void
     135  *clrmem7(void *s)
     136  {
     137    return __builtin_memset (s, 0, 1025);
     138  }
     139  
     140  /* 5 xc - on z10 PFD would be used in the loop body so the unrolled
     141     variant would still be shorter.  */
     142  __attribute__ ((target("tune=z10")))
     143  void
     144  *clrmem7_z10(void *s)
     145  {
     146    return __builtin_memset (s, 0, 1025);
     147  }
     148  
     149  /* 5 xc */
     150  __attribute__ ((target("tune=z10")))
     151  void
     152  *clrmem8_z10(void *s)
     153  {
     154    return __builtin_memset (s, 0, 1280);
     155  }
     156  
     157  /* 1 pfd 2 xc - start using xc loop also on z10 */
     158  __attribute__ ((target("tune=z10")))
     159  void
     160  *clrmem9_z10(void *s)
     161  {
     162    return __builtin_memset (s, 0, 1281);
     163  }
     164  
     165  /* 3 xc - displacement overflow after the first */
     166  void
     167  *clrmem10(void *s)
     168  {
     169    return __builtin_memset (s + 4000, 0, 700);
     170  }
     171  
     172  /* { dg-final { scan-assembler-times "mvi\\s" 1 } } */
     173  /* { dg-final { scan-assembler-times "mvc\\s" 20 } } */
     174  /* { dg-final { scan-assembler-times "xc\\s" 28 } } */
     175  /* { dg-final { scan-assembler-times "stc\\s" 22 } } */
     176  /* { dg-final { scan-assembler-times "stcy\\s" 0 } } */
     177  /* { dg-final { scan-assembler-times "pfd\\s" 2 } } */