4 #define BLOCK_SIZE (sizeof (uint32_t))
8 } __attribute__((packed
, may_alias
));
10 static inline uint32_t
11 load_unaligned (const char *p
)
13 return ((struct unaligned
*) p
)->x
;
17 store_unaligned (uint32_t x
, char *p
)
19 ((struct unaligned
*) p
)->x
= x
;
22 void __attribute__((noipa
))
23 copy (char *dst
, const char *src
, size_t n
)
25 for (size_t i
= 0; i
< n
; i
+= BLOCK_SIZE
)
26 store_unaligned (load_unaligned (src
+ i
), dst
+ i
);
32 char x
[INPUT_SIZE
+ MAX_STEP
];
39 for (unsigned int i
= 1; i
< MAX_STEP
; ++i
)
41 for (unsigned int j
= 0; j
< INPUT_SIZE
+ MAX_STEP
; ++j
)
43 copy (x
+ i
, x
, INPUT_SIZE
);
45 for (int j
= 0; j
< INPUT_SIZE
+ i
; ++j
)
50 else if (i
>= BLOCK_SIZE
)
51 expected
= j
% i
+ 10;
52 else if ((j
- i
) % BLOCK_SIZE
< i
)
55 expected
= j
- i
+ 10;