mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
c776a32f75
This change might cause ABI breakages for /opt/cosmos. It's needed to help us better conform to header declaration practices.
27 lines
1,012 B
C
27 lines
1,012 B
C
#ifndef COSMOPOLITAN_LIBC_INTRIN_REPSTOSB_H_
|
|
#define COSMOPOLITAN_LIBC_INTRIN_REPSTOSB_H_
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
#ifdef _COSMO_SOURCE
|
|
|
|
forceinline void *repstosb(void *dest, unsigned char al, size_t cx) {
|
|
unsigned char *di = (unsigned char *)dest;
|
|
while (cx) *di++ = al, cx--;
|
|
return di;
|
|
}
|
|
|
|
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
|
|
#define repstosb(DI, AL, CX) \
|
|
({ \
|
|
void *Di = (DI); \
|
|
size_t Cx = (CX); \
|
|
unsigned char Al = (AL); \
|
|
asm("rep stosb %b5,(%0)" \
|
|
: "=D"(Di), "=c"(Cx), "=m"(*(char(*)[Cx])Di) \
|
|
: "0"(Di), "1"(Cx), "a"(Al)); \
|
|
Di; \
|
|
})
|
|
#endif
|
|
|
|
#endif /* _COSMO_SOURCE */
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* COSMOPOLITAN_LIBC_INTRIN_REPSTOSB_H_ */
|