Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1029 serge 1
#include "common.h"
2
 
3
char * strcat(char *s, const char *append)
4
{
5
 int d0, d1, d2, d3;
6
 __asm__ __volatile__(
7
	"repne\n\t"
8
	"scasb\n\t"
9
	"decl %1\n"
10
	"1:\tlodsb\n\t"
11
	"stosb\n\t"
12
	"testb %%al,%%al\n\t"
13
	"jne 1b"
14
	: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
15
	: "0" (append),"1"(s),"2"(0),"3" (0xffffffff):"memory");
16
 return s;
17
}
18
 
19
int
20
memcmp(const void *s1, const void *s2, size_t n)
21
{
22
  if (n != 0)
23
  {
24
    const unsigned char *p1 = s1, *p2 = s2;
25
 
26
    do {
27
      if (*p1++ != *p2++)
28
	return (*--p1 - *--p2);
29
    } while (--n != 0);
30
  }
31
  return 0;
32
}
33
 
34
void * memcpy(void * _dest, const void *_src, size_t _n)
35
{
36
int d0, d1, d2;
37
 __asm__ __volatile__(
38
        "jcxz 1f\n\t"
39
	"rep ; movsl\n\t"
40
	"1:\t"
41
	"testb $2,%b4\n\t"
42
	"je 1f\n\t"
43
	"movsw\n"
44
	"1:\ttestb $1,%b4\n\t"
45
	"je 2f\n\t"
46
	"movsb\n"
47
	"2:"
48
	: "=&c" (d0), "=&D" (d1), "=&S" (d2)
49
	:"0" (_n/4), "q" (_n),"1" ((long)_dest),"2" ((long)_src)
50
	: "memory");
51
 return (_dest);
52
}
53
 
54
char * strcpy(char *to, const char *from)
55
{
56
int d0, d1, d2;
57
__asm__ __volatile__(
58
	"1:\tlodsb\n\t"
59
	"stosb\n\t"
60
	"testb %%al,%%al\n\t"
61
	"jne 1b"
62
	: "=&S" (d0), "=&D" (d1), "=&a" (d2)
63
	:"0" (from),"1" (to) : "memory");
64
 return to;
65
}
66
 
67
int strcmp(const char *s1, const char *s2)
68
{
69
int d0, d1;
70
register int __res;
71
__asm__ __volatile__(
72
	"1:\tlodsb\n\t"
73
	"scasb\n\t"
74
	"jne 2f\n\t"
75
	"testb %%al,%%al\n\t"
76
	"jne 1b\n\t"
77
	"xorl %%eax,%%eax\n\t"
78
	"jmp 3f\n"
79
	"2:\tsbbl %%eax,%%eax\n\t"
80
	"orb $1,%%al\n"
81
	"3:"
82
	:"=a" (__res), "=&S" (d0), "=&D" (d1)
83
		     :"1" (s1),"2" (s2));
84
return __res;
85
}
86
 
87
size_t strlen(const char *str)
88
{
89
int d0;
90
register int __res;
91
__asm__ __volatile__(
92
	"repne\n\t"
93
	"scasb\n\t"
94
	"notl %0\n\t"
95
	"decl %0"
96
	:"=c" (__res), "=&D" (d0) :"1" (str),"a" (0), "0" (0xffffffff));
97
return __res;
98
}
99
 
100
char * strdup(const char *_s)
101
{
102
  char *rv;
103
  if (_s == 0)
104
    return 0;
105
  rv = (char *)malloc(strlen(_s) + 1);
106
  if (rv == 0)
107
    return 0;
108
  strcpy(rv, _s);
109
  return rv;
110
}
111
 
112
char * strchr(const char *s, int c)
113
{
114
 int d0;
115
 register char * __res;
116
 __asm__ __volatile__(
117
	"movb %%al,%%ah\n"
118
	"1:\tlodsb\n\t"
119
	"cmpb %%ah,%%al\n\t"
120
	"je 2f\n\t"
121
	"testb %%al,%%al\n\t"
122
	"jne 1b\n\t"
123
	"movl $1,%1\n"
124
	"2:\tmovl %1,%0\n\t"
125
	"decl %0"
126
	:"=a" (__res), "=&S" (d0) : "1" (s),"0" (c));
127
 return __res;
128
}