123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- #include <string.h>
- #include "memcopy.h"
- #include "pagecopy.h"
- #if defined(__ARCH_HAS_BWD_MEMCPY__) || defined(__mips__)
- #include "_memcpy_fwd.c"
- #endif
- static void _wordcopy_bwd_aligned (long int dstp, long int srcp, size_t len)
- {
- op_t a0 = 0;
- op_t a1 = 0;
- switch (len % 8)
- {
- case 2:
- srcp -= 2 * OPSIZ;
- dstp -= 1 * OPSIZ;
- a0 = ((op_t *) srcp)[1];
- len += 6;
- goto do1;
- case 3:
- srcp -= 3 * OPSIZ;
- dstp -= 2 * OPSIZ;
- a1 = ((op_t *) srcp)[2];
- len += 5;
- goto do2;
- case 4:
- srcp -= 4 * OPSIZ;
- dstp -= 3 * OPSIZ;
- a0 = ((op_t *) srcp)[3];
- len += 4;
- goto do3;
- case 5:
- srcp -= 5 * OPSIZ;
- dstp -= 4 * OPSIZ;
- a1 = ((op_t *) srcp)[4];
- len += 3;
- goto do4;
- case 6:
- srcp -= 6 * OPSIZ;
- dstp -= 5 * OPSIZ;
- a0 = ((op_t *) srcp)[5];
- len += 2;
- goto do5;
- case 7:
- srcp -= 7 * OPSIZ;
- dstp -= 6 * OPSIZ;
- a1 = ((op_t *) srcp)[6];
- len += 1;
- goto do6;
- case 0:
- if (OP_T_THRES <= 3 * OPSIZ && len == 0)
- return;
- srcp -= 8 * OPSIZ;
- dstp -= 7 * OPSIZ;
- a0 = ((op_t *) srcp)[7];
- goto do7;
- case 1:
- srcp -= 9 * OPSIZ;
- dstp -= 8 * OPSIZ;
- a1 = ((op_t *) srcp)[8];
- len -= 1;
- if (OP_T_THRES <= 3 * OPSIZ && len == 0)
- goto do0;
- goto do8;
- }
- do
- {
- do8:
- a0 = ((op_t *) srcp)[7];
- ((op_t *) dstp)[7] = a1;
- do7:
- a1 = ((op_t *) srcp)[6];
- ((op_t *) dstp)[6] = a0;
- do6:
- a0 = ((op_t *) srcp)[5];
- ((op_t *) dstp)[5] = a1;
- do5:
- a1 = ((op_t *) srcp)[4];
- ((op_t *) dstp)[4] = a0;
- do4:
- a0 = ((op_t *) srcp)[3];
- ((op_t *) dstp)[3] = a1;
- do3:
- a1 = ((op_t *) srcp)[2];
- ((op_t *) dstp)[2] = a0;
- do2:
- a0 = ((op_t *) srcp)[1];
- ((op_t *) dstp)[1] = a1;
- do1:
- a1 = ((op_t *) srcp)[0];
- ((op_t *) dstp)[0] = a0;
- srcp -= 8 * OPSIZ;
- dstp -= 8 * OPSIZ;
- len -= 8;
- }
- while (len != 0);
-
- do0:
- ((op_t *) dstp)[7] = a1;
- }
- static void _wordcopy_bwd_dest_aligned (long int dstp, long int srcp, size_t len)
- {
- op_t a0 = 0;
- op_t a1 = 0;
- op_t a2 = 0;
- op_t a3 = 0;
- int sh_1, sh_2;
-
- sh_1 = 8 * (srcp % OPSIZ);
- sh_2 = 8 * OPSIZ - sh_1;
-
- srcp &= -OPSIZ;
- srcp += OPSIZ;
- switch (len % 4)
- {
- case 2:
- srcp -= 3 * OPSIZ;
- dstp -= 1 * OPSIZ;
- a2 = ((op_t *) srcp)[2];
- a1 = ((op_t *) srcp)[1];
- len += 2;
- goto do1;
- case 3:
- srcp -= 4 * OPSIZ;
- dstp -= 2 * OPSIZ;
- a3 = ((op_t *) srcp)[3];
- a2 = ((op_t *) srcp)[2];
- len += 1;
- goto do2;
- case 0:
- if (OP_T_THRES <= 3 * OPSIZ && len == 0)
- return;
- srcp -= 5 * OPSIZ;
- dstp -= 3 * OPSIZ;
- a0 = ((op_t *) srcp)[4];
- a3 = ((op_t *) srcp)[3];
- goto do3;
- case 1:
- srcp -= 6 * OPSIZ;
- dstp -= 4 * OPSIZ;
- a1 = ((op_t *) srcp)[5];
- a0 = ((op_t *) srcp)[4];
- len -= 1;
- if (OP_T_THRES <= 3 * OPSIZ && len == 0)
- goto do0;
- goto do4;
- }
- do
- {
- do4:
- a3 = ((op_t *) srcp)[3];
- ((op_t *) dstp)[3] = MERGE (a0, sh_1, a1, sh_2);
- do3:
- a2 = ((op_t *) srcp)[2];
- ((op_t *) dstp)[2] = MERGE (a3, sh_1, a0, sh_2);
- do2:
- a1 = ((op_t *) srcp)[1];
- ((op_t *) dstp)[1] = MERGE (a2, sh_1, a3, sh_2);
- do1:
- a0 = ((op_t *) srcp)[0];
- ((op_t *) dstp)[0] = MERGE (a1, sh_1, a2, sh_2);
- srcp -= 4 * OPSIZ;
- dstp -= 4 * OPSIZ;
- len -= 4;
- }
- while (len != 0);
-
- do0:
- ((op_t *) dstp)[3] = MERGE (a0, sh_1, a1, sh_2);
- }
- void *memmove (void *dest, const void *src, size_t len)
- {
- unsigned long int dstp = (long int) dest;
- unsigned long int srcp = (long int) src;
-
- if (dstp - srcp >= len)
- {
-
- #if !defined(__ARCH_HAS_BWD_MEMCPY_) && !defined(__mips__)
- memcpy(dest, src, len);
- #else
-
-
- if (len >= OP_T_THRES)
- {
-
- len -= (-dstp) % OPSIZ;
- BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);
-
- PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);
-
- WORD_COPY_FWD (dstp, srcp, len, len);
-
- }
-
- BYTE_COPY_FWD (dstp, srcp, len);
- #endif
- }
- else
- {
-
- srcp += len;
- dstp += len;
-
- if (len >= OP_T_THRES)
- {
-
- len -= dstp % OPSIZ;
- BYTE_COPY_BWD (dstp, srcp, dstp % OPSIZ);
-
- WORD_COPY_BWD (dstp, srcp, len, len);
-
- }
-
- BYTE_COPY_BWD (dstp, srcp, len);
- }
- return (dest);
- }
- libc_hidden_weak(memmove)
|