root/arch/alpha/lib/memcpy.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __memcpy_b
  2. __memcpy_q
  3. __memcpy_l
  4. __memcpy

   1 /*
   2  *  linux/arch/alpha/lib/memcpy.c
   3  *
   4  *  Copyright (C) 1995  Linus Torvalds
   5  */
   6 
   7 /*
   8  * This is reasonably optimized for the quad-word-aligned case, which
   9  * happens with page/buffer copies. It's horribly bad for the unaligned
  10  * case: it could be made much better, but that would require lots of
  11  * assembly (unaligned 8-byte load + shift + aligned 4-byte store, for
  12  * example).
  13  */
  14 
  15 #include <linux/types.h>
  16 
  17 static inline void __memcpy_b(unsigned long d, unsigned long s, long n)
     /* [previous][next][first][last][top][bottom][index][help] */
  18 {
  19         while (--n >= 0)
  20                 *(char *) (d++) = *(char *) (s++);
  21 }
  22 
  23 static inline void __memcpy_q(unsigned long d, unsigned long s, long n)
     /* [previous][next][first][last][top][bottom][index][help] */
  24 {
  25         /* this first part could be done in one go with ldq_u*2/mask/stq_u */
  26         while (d & 7) {
  27                 if (--n < 0)
  28                         return;
  29                 *(char *) d = *(char *) s;
  30                 d++;
  31                 s++;
  32         }
  33         while ((n -= 8) >= 0) {
  34                 *(unsigned long *) d = *(unsigned long *) s;
  35                 d += 8;
  36                 s += 8;
  37         }
  38         /* as could this.. */
  39         __memcpy_b(d,s,n+8);
  40 }       
  41 
  42 static inline void __memcpy_l(unsigned long d, unsigned long s, long n)
     /* [previous][next][first][last][top][bottom][index][help] */
  43 {
  44         while (d & 3) {
  45                 if (--n < 0)
  46                         return;
  47                 *(char *) d = *(char *) s;
  48                 d++;
  49                 s++;
  50         }
  51         while ((n -= 4) >= 0) {
  52                 *(unsigned int *) d = *(unsigned int *) s;
  53                 d += 4;
  54                 s += 4;
  55         }
  56         __memcpy_b(d,s,n+4);
  57 }       
  58 
  59 void * __memcpy(void * dest, const void *src, size_t n)
     /* [previous][next][first][last][top][bottom][index][help] */
  60 {
  61         unsigned long differ;
  62         differ = ((unsigned long) dest ^ (unsigned long) src) & 7;
  63 
  64         if (!differ) {
  65                 __memcpy_q((unsigned long) dest, (unsigned long) src, n);
  66                 return dest;
  67         }
  68         if (differ == 4) {
  69                 __memcpy_l((unsigned long) dest, (unsigned long) src, n);
  70                 return dest;
  71         }
  72         __memcpy_b((unsigned long) dest, (unsigned long) src, n);
  73         return dest;
  74 }

/* [previous][next][first][last][top][bottom][index][help] */