linux/arch/m68k/lib/string.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file COPYING in the main directory of this archive
   4 * for more details.
   5 */
   6
   7#define __IN_STRING_C
   8
   9#include <linux/module.h>
  10#include <linux/string.h>
  11
  12char *strcpy(char *dest, const char *src)
  13{
  14        return __kernel_strcpy(dest, src);
  15}
  16EXPORT_SYMBOL(strcpy);
  17
  18char *strcat(char *dest, const char *src)
  19{
  20        return __kernel_strcpy(dest + __kernel_strlen(dest), src);
  21}
  22EXPORT_SYMBOL(strcat);
  23
  24void *memset(void *s, int c, size_t count)
  25{
  26        void *xs = s;
  27        size_t temp, temp1;
  28
  29        if (!count)
  30                return xs;
  31        c &= 0xff;
  32        c |= c << 8;
  33        c |= c << 16;
  34        if ((long)s & 1) {
  35                char *cs = s;
  36                *cs++ = c;
  37                s = cs;
  38                count--;
  39        }
  40        if (count > 2 && (long)s & 2) {
  41                short *ss = s;
  42                *ss++ = c;
  43                s = ss;
  44                count -= 2;
  45        }
  46        temp = count >> 2;
  47        if (temp) {
  48                long *ls = s;
  49
  50                asm volatile (
  51                        "       movel %1,%2\n"
  52                        "       andw  #7,%2\n"
  53                        "       lsrl  #3,%1\n"
  54                        "       negw  %2\n"
  55                        "       jmp   %%pc@(2f,%2:w:2)\n"
  56                        "1:     movel %3,%0@+\n"
  57                        "       movel %3,%0@+\n"
  58                        "       movel %3,%0@+\n"
  59                        "       movel %3,%0@+\n"
  60                        "       movel %3,%0@+\n"
  61                        "       movel %3,%0@+\n"
  62                        "       movel %3,%0@+\n"
  63                        "       movel %3,%0@+\n"
  64                        "2:     dbra  %1,1b\n"
  65                        "       clrw  %1\n"
  66                        "       subql #1,%1\n"
  67                        "       jpl   1b"
  68                        : "=a" (ls), "=d" (temp), "=&d" (temp1)
  69                        : "d" (c), "0" (ls), "1" (temp));
  70                s = ls;
  71        }
  72        if (count & 2) {
  73                short *ss = s;
  74                *ss++ = c;
  75                s = ss;
  76        }
  77        if (count & 1) {
  78                char *cs = s;
  79                *cs = c;
  80        }
  81        return xs;
  82}
  83EXPORT_SYMBOL(memset);
  84
  85void *memcpy(void *to, const void *from, size_t n)
  86{
  87        void *xto = to;
  88        size_t temp, temp1;
  89
  90        if (!n)
  91                return xto;
  92        if ((long)to & 1) {
  93                char *cto = to;
  94                const char *cfrom = from;
  95                *cto++ = *cfrom++;
  96                to = cto;
  97                from = cfrom;
  98                n--;
  99        }
 100        if (n > 2 && (long)to & 2) {
 101                short *sto = to;
 102                const short *sfrom = from;
 103                *sto++ = *sfrom++;
 104                to = sto;
 105                from = sfrom;
 106                n -= 2;
 107        }
 108        temp = n >> 2;
 109        if (temp) {
 110                long *lto = to;
 111                const long *lfrom = from;
 112
 113                asm volatile (
 114                        "       movel %2,%3\n"
 115                        "       andw  #7,%3\n"
 116                        "       lsrl  #3,%2\n"
 117                        "       negw  %3\n"
 118                        "       jmp   %%pc@(1f,%3:w:2)\n"
 119                        "4:     movel %0@+,%1@+\n"
 120                        "       movel %0@+,%1@+\n"
 121                        "       movel %0@+,%1@+\n"
 122                        "       movel %0@+,%1@+\n"
 123                        "       movel %0@+,%1@+\n"
 124                        "       movel %0@+,%1@+\n"
 125                        "       movel %0@+,%1@+\n"
 126                        "       movel %0@+,%1@+\n"
 127                        "1:     dbra  %2,4b\n"
 128                        "       clrw  %2\n"
 129                        "       subql #1,%2\n"
 130                        "       jpl   4b"
 131                        : "=a" (lfrom), "=a" (lto), "=d" (temp), "=&d" (temp1)
 132                        : "0" (lfrom), "1" (lto), "2" (temp));
 133                to = lto;
 134                from = lfrom;
 135        }
 136        if (n & 2) {
 137                short *sto = to;
 138                const short *sfrom = from;
 139                *sto++ = *sfrom++;
 140                to = sto;
 141                from = sfrom;
 142        }
 143        if (n & 1) {
 144                char *cto = to;
 145                const char *cfrom = from;
 146                *cto = *cfrom;
 147        }
 148        return xto;
 149}
 150EXPORT_SYMBOL(memcpy);
 151
 152void *memmove(void *dest, const void *src, size_t n)
 153{
 154        void *xdest = dest;
 155        size_t temp;
 156
 157        if (!n)
 158                return xdest;
 159
 160        if (dest < src) {
 161                if ((long)dest & 1) {
 162                        char *cdest = dest;
 163                        const char *csrc = src;
 164                        *cdest++ = *csrc++;
 165                        dest = cdest;
 166                        src = csrc;
 167                        n--;
 168                }
 169                if (n > 2 && (long)dest & 2) {
 170                        short *sdest = dest;
 171                        const short *ssrc = src;
 172                        *sdest++ = *ssrc++;
 173                        dest = sdest;
 174                        src = ssrc;
 175                        n -= 2;
 176                }
 177                temp = n >> 2;
 178                if (temp) {
 179                        long *ldest = dest;
 180                        const long *lsrc = src;
 181                        temp--;
 182                        do
 183                                *ldest++ = *lsrc++;
 184                        while (temp--);
 185                        dest = ldest;
 186                        src = lsrc;
 187                }
 188                if (n & 2) {
 189                        short *sdest = dest;
 190                        const short *ssrc = src;
 191                        *sdest++ = *ssrc++;
 192                        dest = sdest;
 193                        src = ssrc;
 194                }
 195                if (n & 1) {
 196                        char *cdest = dest;
 197                        const char *csrc = src;
 198                        *cdest = *csrc;
 199                }
 200        } else {
 201                dest = (char *)dest + n;
 202                src = (const char *)src + n;
 203                if ((long)dest & 1) {
 204                        char *cdest = dest;
 205                        const char *csrc = src;
 206                        *--cdest = *--csrc;
 207                        dest = cdest;
 208                        src = csrc;
 209                        n--;
 210                }
 211                if (n > 2 && (long)dest & 2) {
 212                        short *sdest = dest;
 213                        const short *ssrc = src;
 214                        *--sdest = *--ssrc;
 215                        dest = sdest;
 216                        src = ssrc;
 217                        n -= 2;
 218                }
 219                temp = n >> 2;
 220                if (temp) {
 221                        long *ldest = dest;
 222                        const long *lsrc = src;
 223                        temp--;
 224                        do
 225                                *--ldest = *--lsrc;
 226                        while (temp--);
 227                        dest = ldest;
 228                        src = lsrc;
 229                }
 230                if (n & 2) {
 231                        short *sdest = dest;
 232                        const short *ssrc = src;
 233                        *--sdest = *--ssrc;
 234                        dest = sdest;
 235                        src = ssrc;
 236                }
 237                if (n & 1) {
 238                        char *cdest = dest;
 239                        const char *csrc = src;
 240                        *--cdest = *--csrc;
 241                }
 242        }
 243        return xdest;
 244}
 245EXPORT_SYMBOL(memmove);
 246
 247int memcmp(const void *cs, const void *ct, size_t count)
 248{
 249        const unsigned char *su1, *su2;
 250
 251        for (su1 = cs, su2 = ct; count > 0; ++su1, ++su2, count--)
 252                if (*su1 != *su2)
 253                        return *su1 < *su2 ? -1 : +1;
 254        return 0;
 255}
 256EXPORT_SYMBOL(memcmp);
 257