blob: c4311c7a8d03a1a50397b0bb578f1c1159068685 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-mcpu=sifive-u74 -march=rv64gc -mabi=lp64" } */
/* { dg-skip-if "" { *-*-* } { "-O0" "-Os" "-Oz" "-Og" } } */
#define ZERO_N(N) \
void zero##N (char *dst) \
{ \
dst = __builtin_assume_aligned (dst, 4096); \
__builtin_memset (dst, 0, N); \
}
/* Emits 1x sd and 1x {sh,sb}. */
ZERO_N(11)
/* Emits 1x sd and 1x {sw,sb}. */
ZERO_N(13)
/* Emits 1x sd and 1x {sw,sh}. */
ZERO_N(14)
/* Emits 1x sd and 1x {sw,sh,sb}. */
ZERO_N(15)
/* Emits 2x sd and 1x {sh,sb}. */
ZERO_N(19)
/* Emits 2x sd and 1x {sw,sh,sb}. */
ZERO_N(23)
/* The by-pieces infrastructure handles up to 24 bytes.
So the code below is emitted via cpymemsi/block_move_straight. */
/* Emits 3x sd and 1x {sh,sb}. */
ZERO_N(27)
/* Emits 3x sd and 1x {sw,sb}. */
ZERO_N(29)
/* Emits 3x sd and 1x {sw,sh,sb}. */
ZERO_N(31)
/* { dg-final { scan-assembler-times "sd\t" 17 } } */
/* { dg-final { scan-assembler-times "sw\t" 6 } } */
/* { dg-final { scan-assembler-times "sh\t" 7 } } */
/* { dg-final { scan-assembler-times "sb\t" 8 } } */