71 lines
2.4 KiB
C
71 lines
2.4 KiB
C
|
/***************************************************************************************************
|
||
|
* Copyright (C) Vasiliy Kosenko (vkos), 2009 *
|
||
|
* Kobra is free software: you can redistribute it and/or modify it under the terms of the GNU *
|
||
|
* General Public License as published by the Free Software Foundation, either version 3 *
|
||
|
* of the License, or (at your option) any later version. *
|
||
|
* *
|
||
|
* Kobra is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without *
|
||
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||
|
* General Public License for more details. *
|
||
|
* *
|
||
|
* You should have received a copy of the GNU General Public License along with Kobra. *
|
||
|
* If not, see <http://www.gnu.org/licenses/>. *
|
||
|
***************************************************************************************************/
|
||
|
|
||
|
/***************************************************************************************************
|
||
|
* Some stdlib functions *
|
||
|
***************************************************************************************************/
|
||
|
|
||
|
#include "stdlib.h"
|
||
|
|
||
|
void *memcpy(void *dst, void *src, int length){
|
||
|
void *value;
|
||
|
|
||
|
if (length & 3) { //length not aligned in 4 bytes use rep movsb
|
||
|
__asm__ __volatile__(
|
||
|
"movl %%edi,%%eax\n\t"
|
||
|
"cld\n\t"
|
||
|
"rep\n\t"
|
||
|
"movsb"
|
||
|
:"=D"(value)
|
||
|
:"c"(length),"S"(src),"D"(dst)
|
||
|
:"eax");
|
||
|
} else { //length aligned in 4 bytes use rep movsd
|
||
|
length=length >> 2;//length=length/4
|
||
|
__asm__ __volatile__(
|
||
|
"movl %%edi,%%eax\n\t"
|
||
|
"cld\n\t"
|
||
|
"rep\n\t"
|
||
|
"movsd"
|
||
|
:"=D"(value)
|
||
|
:"c"(length),"S"(src),"D"(dst)
|
||
|
:"eax");
|
||
|
|
||
|
}
|
||
|
return(value);
|
||
|
}
|
||
|
|
||
|
char strcmp(char *s1, char *s2){
|
||
|
while (*s1) {
|
||
|
if (*s1++ != *s2++) {
|
||
|
return *--s1-*--s2;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int strlen(char *s){
|
||
|
int i;
|
||
|
while (*s++) {
|
||
|
++i;
|
||
|
}
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
char *strcpy(char *dest, char *src){
|
||
|
while (*src) {
|
||
|
*dest++ = *src++;
|
||
|
}
|
||
|
*dest = '\0';
|
||
|
}
|