/* Funtional memmov test. */ /* { dg-do run } */ /* { dg-options "-O3" } */ #define MAX_LEN (8 * 1000) #define X 0x11 char gsrc[MAX_LEN + 2]; char gdst[MAX_LEN + 2]; __attribute__ ((noinline)) int compare_mem (int len) { int i; if (gdst[0] != 0x61) __builtin_abort(); for (i = 1; i <= len; i++) if (gsrc[i] != gdst[i]) __builtin_abort(); for (i = len + 1; i < MAX_LEN; i++) if (gdst[i] != 0x61 + i % 4) __builtin_abort(); } __attribute__ ((noinline)) void init_mem (void) { unsigned int *p1; unsigned int *p2; int i; p1 = (unsigned int *)gsrc; p2 = (unsigned int *)gdst; for (i = 0; i < MAX_LEN / sizeof(unsigned int); i++) { p1[i] = 0x71727374; p2[i] = 0x61626364; } } #define MEMCPY_CHECK(DST, SRC, LEN) \ init_mem (); \ __builtin_memcpy ((DST) + 1, (SRC) + 1, (LEN)); \ compare_mem ((LEN)); int main(void) { int lens[] = { 255, 256, 257, 511, 512, 513, 767, 768, 769, 1023, 1024, 1025, 1279, 1280, 1281, 1535, 1536, 1537, -999 }; int t; /* variable length */ for (t = 0; lens[t] != -999; t++) { MEMCPY_CHECK (gdst, gsrc, lens[t]); } /* constant length */ MEMCPY_CHECK (gdst, gsrc, 0); MEMCPY_CHECK (gdst, gsrc, 1); MEMCPY_CHECK (gdst, gsrc, 2); MEMCPY_CHECK (gdst, gsrc, 3); MEMCPY_CHECK (gdst, gsrc, 256); MEMCPY_CHECK (gdst, gsrc, 257); MEMCPY_CHECK (gdst, gsrc, 511); MEMCPY_CHECK (gdst, gsrc, 512); MEMCPY_CHECK (gdst, gsrc, 513); MEMCPY_CHECK (gdst, gsrc, 767); MEMCPY_CHECK (gdst, gsrc, 768); MEMCPY_CHECK (gdst, gsrc, 769); MEMCPY_CHECK (gdst, gsrc, 1023); MEMCPY_CHECK (gdst, gsrc, 1024); MEMCPY_CHECK (gdst, gsrc, 1025); MEMCPY_CHECK (gdst, gsrc, 1279); MEMCPY_CHECK (gdst, gsrc, 1280); MEMCPY_CHECK (gdst, gsrc, 1281); MEMCPY_CHECK (gdst, gsrc, 1535); MEMCPY_CHECK (gdst, gsrc, 1536); MEMCPY_CHECK (gdst, gsrc, 1537); return 0; }