cosmopolitan/libc/nexgen32e/tinystrlen.internal.h

56 lines
1.5 KiB
C

#ifndef COSMOPOLITAN_LIBC_NEXGEN32E_TINYSTRLEN_H_
#define COSMOPOLITAN_LIBC_NEXGEN32E_TINYSTRLEN_H_
#if !(__ASSEMBLER__ + __LINKER__ + 0)
#if !defined(__GNUC__) || defined(__STRICT_ANSI__)
int tinystrlen(const char *);
int tinystrnlen(const char *, size_t);
int tinystrlen16(const char16_t *);
int tinystrnlen16(const char16_t *, size_t);
int tinywcslen(const wchar_t *);
int tinywcsnlen(const wchar_t *, size_t);
#else
forceinline int tinystrlen(const char *s) {
unsigned ax;
asm("call\ttinystrlen" : "=a"(ax) : "D"(s), "m"(*(char(*)[PAGESIZE])s));
return ax;
}
forceinline int tinystrnlen(const char *s, size_t n) {
unsigned ax;
asm("call\ttinystrnlen" : "=a"(ax) : "D"(s), "S"(n), "m"(*(char(*)[n])s));
return ax;
}
forceinline int tinystrlen16(const char16_t *s) {
unsigned ax;
asm("call\ttinystrlen16" : "=a"(ax) : "D"(s), "m"(*(char16_t(*)[PAGESIZE])s));
return ax;
}
forceinline int tinystrnlen16(const char16_t *s, size_t n) {
unsigned ax;
asm("call\ttinystrnlen16"
: "=a"(ax)
: "D"(s), "S"(n), "m"(*(char16_t(*)[n])s));
return ax;
}
forceinline int tinywcslen(const wchar_t *s) {
unsigned ax;
asm("call\ttinywcslen" : "=a"(ax) : "D"(s), "m"(*(wchar_t(*)[PAGESIZE])s));
return ax;
}
forceinline int tinywcsnlen(const wchar_t *s, size_t n) {
unsigned ax;
asm("call\ttinywcsnlen" : "=a"(ax) : "D"(s), "S"(n), "m"(*(wchar_t(*)[n])s));
return ax;
}
#endif
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_NEXGEN32E_TINYSTRLEN_H_ */