Viewing file: pr94994.c (1.12 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#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; }
|