blob: e98aeb090d8cbcfc9628052b553b7a7d226069d1 [file] [log] [blame]
#include <stdint.h>
#include "tree-vect.h"
#define BLOCK_SIZE (sizeof (uint32_t))
struct unaligned {
uint32_t x;
} __attribute__((packed, may_alias));
static inline uint32_t
load_unaligned (const char *p)
{
return ((struct unaligned *) p)->x;
}
static inline void
store_unaligned (uint32_t x, char *p)
{
((struct unaligned *) p)->x = x;
}
void __attribute__((noipa))
copy (char *dst, const char *src, size_t n)
{
for (size_t i = 0; i < n; i += BLOCK_SIZE)
store_unaligned (load_unaligned (src + i), dst + i);
}
#define INPUT_SIZE 64
#define MAX_STEP 32
char x[INPUT_SIZE + MAX_STEP];
int
main (void)
{
check_vect ();
for (unsigned int i = 1; i < MAX_STEP; ++i)
{
for (unsigned int j = 0; j < INPUT_SIZE + MAX_STEP; ++j)
x[j] = j + 10;
copy (x + i, x, INPUT_SIZE);
for (int j = 0; j < INPUT_SIZE + i; ++j)
{
int expected;
if (j < i)
expected = j + 10;
else if (i >= BLOCK_SIZE)
expected = j % i + 10;
else if ((j - i) % BLOCK_SIZE < i)
expected = x[j - i];
else
expected = j - i + 10;
if (x[j] != expected)
__builtin_abort ();
}
}
return 0;
}