| /* Make sure that short memcpy's with constant length are emitted |
| without loop statements. */ |
| |
| /* { dg-do compile } */ |
| /* { dg-options "-O3 -mzarch" } */ |
| |
| /* 3 MVCs */ |
| void |
| *memcpy1(void *dest, const void *src) |
| { |
| return __builtin_memcpy (dest, src, 700); |
| } |
| |
| /* NOP */ |
| void |
| *memcpy2(void *dest, const void *src) |
| { |
| return __builtin_memcpy (dest, src, 0); |
| } |
| |
| /* 1 MVC */ |
| void |
| *memcpy3(void *dest, const void *src) |
| { |
| return __builtin_memcpy (dest, src, 256); |
| } |
| |
| /* 2 MVCs */ |
| void |
| *memcpy4(void *dest, const void *src) |
| { |
| return __builtin_memcpy (dest, src, 512); |
| } |
| |
| /* 3 MVCs */ |
| void |
| *memcpy5(void *dest, const void *src) |
| { |
| return __builtin_memcpy (dest, src, 768); |
| } |
| |
| /* Loop with 2 MVCs */ |
| void |
| *memcpy6(void *dest, const void *src) |
| { |
| return __builtin_memcpy (dest, src, 1537); |
| } |
| |
| /* memcpy6 uses a loop - check for the two load address instructions |
| used to increment src and dest. */ |
| /* { dg-final { scan-assembler-times "la" 2 } } */ |
| |
| /* { dg-final { scan-assembler-times "mvc" 11 } } */ |