/* string.h - vbcc PowerPC */

#ifndef __STRING_H
#define __STRING_H 1

#include <stddef.h>

void *memcpy(void *s1,const void *s2,size_t n);
void *memmove(void *,const void *,size_t);
void *memset(void *,int,size_t);
int memcmp(const void *,const void *,size_t);
void *memchr(const void *,int,size_t);
char *strcat(char *,const char *);
char *strncat(char *,const char *,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 *);
char *strtok(char *,const char *);
char *strerror(int);

/* PowerPC inline functions */
size_t strlen(__reg("r3") const char *) =
                "\tsubi\t4,3,1\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"
                "\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"
                "\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"
                "\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"
                "\tlbzu\t3,1(6)\n"
                "\tlbzu\t5,1(4)\n"
                "\tsub.\t3,3,5\n"
                "\tbne\t$+12\n"
                "\tcmpwi\t6,0\n"
                "\tbdnzf\t2,$-20";
#endif
