107 lines
3.3 KiB
C
Executable File
107 lines
3.3 KiB
C
Executable File
/* string.h - vbcc PowerPC */
|
|
|
|
#ifndef __STRING_H
|
|
#define __STRING_H 1
|
|
|
|
#ifndef __SIZE_T
|
|
#define __SIZE_T 1
|
|
typedef unsigned long size_t;
|
|
#endif
|
|
|
|
#undef NULL
|
|
#define NULL ((void *)0)
|
|
|
|
void *memcpy(void *,const void *,size_t);
|
|
void *memmove(void *,const void *,size_t);
|
|
char *strcpy(char *,const char *);
|
|
char *strncpy(char *,const char *,size_t);
|
|
char *strcat(char *,const char *);
|
|
char *strncat(char *,const char *,size_t);
|
|
int memcmp(const void *,const void *,size_t);
|
|
int strcmp(const char *,const char *);
|
|
int strncmp(const char *,const char *,size_t);
|
|
void *memchr(const void *,int,size_t);
|
|
char *strchr(const char *,int);
|
|
size_t strcspn(const char *,const char *);
|
|
char *strpbrk(const char *,const char *);
|
|
char *strrchr(const char *,int);
|
|
size_t strspn(const char *,const char *);
|
|
char *strstr(const char *,const char *);
|
|
void *memset(void *,int,size_t);
|
|
size_t strlen(const char *);
|
|
char *strtok(char *,const char *);
|
|
char *strerror(int);
|
|
int strcoll(const char *,const char *);
|
|
size_t strxfrm(char *,const char *,size_t);
|
|
|
|
#ifndef __NOINLINE__
|
|
/* PowerPC inline functions */
|
|
size_t strlen(__reg("r3") const char *) =
|
|
"\tsubi\t4,3,1\n"
|
|
"#barrier\n"
|
|
"\tlbzu\t0,1(4)\n"
|
|
"\tcmpwi\t0,0\n"
|
|
"\tbne\t$-8\n"
|
|
"\tsub\t3,4,3";
|
|
char *strcpy(__reg("r3") char *, __reg("r4") const char *) =
|
|
"\tsubi\t5,3,1\n"
|
|
"\tsubi\t4,4,1\n"
|
|
"#barrier\n"
|
|
"\tlbzu\t0,1(4)\n"
|
|
"\tstbu\t0,1(5)\n"
|
|
"\tcmpwi\t0,0\n"
|
|
"\tbne\t$-12";
|
|
char *strncpy(__reg("r3") char *, __reg("r4") const char *,
|
|
__reg("r5") size_t) =
|
|
"\tcmpwi\t5,0\n"
|
|
"\tbeq\t$+36\n"
|
|
"\tmtctr\t5\n"
|
|
"\tsubi\t5,3,1\n"
|
|
"#barrier\n"
|
|
"\tlbz\t0,0(4)\n"
|
|
"\tstbu\t0,1(5)\n"
|
|
"\tcmpwi\t0,0\n"
|
|
"\tbeq\t$+8\n"
|
|
"\taddi\t4,4,1\n"
|
|
"\tbdnz\t$-20";
|
|
int strcmp(__reg("r3") const char *, __reg("r4") const char *) =
|
|
"\tsubi\t5,3,1\n"
|
|
"\tsubi\t4,4,1\n"
|
|
"#barrier\n"
|
|
"\tlbzu\t3,1(5)\n"
|
|
"\tlbzu\t6,1(4)\n"
|
|
"\tsub.\t3,3,6\n"
|
|
"\tbne\t$+12\n"
|
|
"\tcmpwi\t6,0\n"
|
|
"\tbne\t$-20";
|
|
int strncmp(__reg("r3") const char *, __reg("r4") const char *,
|
|
__reg("r5") size_t) =
|
|
"\tsubi\t6,3,1\n"
|
|
"\tli\t3,0\n"
|
|
"\tcmpwi\t5,0\n"
|
|
"\tbeq\t$+36\n"
|
|
"\tsubi\t4,4,1\n"
|
|
"\tmtctr\t5\n"
|
|
"#barrier\n"
|
|
"\tlbzu\t3,1(6)\n"
|
|
"\tlbzu\t5,1(4)\n"
|
|
"\tsub.\t3,3,5\n"
|
|
"\tbne\t$+12\n"
|
|
"\tcmpwi\t5,0\n"
|
|
"\tbdnzf\t2,$-20";
|
|
int memcmp(__reg("r3") const void *, __reg("r4") const void *,
|
|
__reg("r5") size_t) =
|
|
"\tmtctr\t5\n"
|
|
"\tsubi\t6,3,1\n"
|
|
"\tsubi\t4,4,1\n"
|
|
"\tmr.\t3,5\n"
|
|
"\tbeq\t$+20\n"
|
|
"#barrier\n"
|
|
"\tlbzu\t3,1(6)\n"
|
|
"\tlbzu\t5,1(4)\n"
|
|
"\tsubf.\t3,5,3\n"
|
|
"\tbdnzt\t2,$-12";
|
|
#endif /* __NOINLINE__ */
|
|
|
|
#endif
|