diff --git a/.vscode/vscode.h b/.vscode/vscode.h index 570eebc6c..129587b68 100644 --- a/.vscode/vscode.h +++ b/.vscode/vscode.h @@ -1,5 +1,4 @@ #define __VSCODE_INTELLISENSE__ 1 -#define __LP64__ /* TODO: this is a lazy kludge */ #include "libc/integral/normalize.inc" #if 0 diff --git a/libc/bits/atomic_load.c b/libc/bits/atomic_load.c index 11922c52d..fbfcae7ff 100644 --- a/libc/bits/atomic_load.c +++ b/libc/bits/atomic_load.c @@ -27,8 +27,21 @@ * optimizations. */ intptr_t(atomic_load)(void *p, size_t n) { - intptr_t x; - x = 0; - memcpy(&x, p, MAX(n, sizeof(x))); - return x; + intptr_t x = 0; + switch (n) { + case 1: + __builtin_memcpy(&x, p, 1); + return x; + case 2: + __builtin_memcpy(&x, p, 2); + return x; + case 4: + __builtin_memcpy(&x, p, 4); + return x; + case 8: + __builtin_memcpy(&x, p, 8); + return x; + default: + return 0; + } } diff --git a/libc/bits/atomic_store.c b/libc/bits/atomic_store.c index c84821b40..8075f8b89 100644 --- a/libc/bits/atomic_store.c +++ b/libc/bits/atomic_store.c @@ -27,6 +27,20 @@ * optimizations. */ intptr_t(atomic_store)(void *p, intptr_t x, size_t n) { - memcpy(p, &x, MAX(n, sizeof(x))); - return x; + switch (n) { + case 1: + __builtin_memcpy(p, &x, 1); + return x; + case 2: + __builtin_memcpy(p, &x, 2); + return x; + case 4: + __builtin_memcpy(p, &x, 4); + return x; + case 8: + __builtin_memcpy(p, &x, 8); + return x; + default: + return 0; + } } diff --git a/libc/integral/llp64.inc b/libc/integral/llp64.inc new file mode 100644 index 000000000..36c224199 --- /dev/null +++ b/libc/integral/llp64.inc @@ -0,0 +1,79 @@ +#define __INT8_MAX__ 0x7f +#define __UINT8_MAX__ 0xff +#define __INT16_MAX__ 0x7fff +#define __UINT16_MAX__ 0xffff +#define __SHRT_MAX__ 0x7fff +#define __INT_MAX__ 0x7fffffff +#define __INT32_MAX__ 0x7fffffff +#define __UINT32_MAX__ 0xffffffffu +#define __INT64_MAX__ 0x7fffffffffffffffl +#define __UINT64_MAX__ 0xffffffffffffffffull +#define __SIZE_MAX__ 0xffffffffffffffffull +#define __INTPTR_MAX__ 0x7fffffffffffffffll +#define __UINTPTR_MAX__ 0xffffffffffffffffull +#define __WINT_MAX__ 0xffffffffu + +#define __SIZEOF_SHORT__ 2 +#define __SIZEOF_INT__ 4 +#define __SIZEOF_LONG__ 4 +#define __SIZEOF_LONG_LONG__ 8 +#define __SIZEOF_POINTER__ 8 +#define __SIZEOF_PTRDIFF_T__ 8 +#define __SIZEOF_SIZE_T__ 4 +#define __SIZEOF_WCHAR_T__ 4 +#define __SIZEOF_WINT_T__ 4 +#define __SIZEOF_FLOAT__ 4 +#define __SIZEOF_FLOAT128__ 16 +#define __SIZEOF_DOUBLE__ 8 +#define __SIZEOF_FLOAT80__ 16 +#define __SIZEOF_LONG_DOUBLE__ 16 + +#define __INT8_C(c) c +#define __UINT8_C(c) c +#define __INT16_C(c) c +#define __UINT16_C(c) c +#define __INT32_C(c) c +#define __UINT32_C(c) c##U +#define __INT64_C(c) c##LL +#define __UINT64_C(c) c##ULL + +#if !(__ASSEMBLER__ + __LINKER__ + 0) + +#define __INT8_TYPE__ signed char +#define __UINT8_TYPE__ unsigned char +#define __INT16_TYPE__ short int +#define __UINT16_TYPE__ short unsigned int +#define __INT32_TYPE__ int +#define __UINT32_TYPE__ unsigned int +#define __INT64_TYPE__ long long int +#define __UINT64_TYPE__ long long unsigned int +#define __INTPTR_TYPE__ long long int +#define __UINTPTR_TYPE__ long long unsigned int +#define __PTRDIFF_TYPE__ long long int +#define __SIZE_TYPE__ unsigned int +#define __WCHAR_TYPE__ int +#define __CHAR16_TYPE__ short unsigned int +#define __CHAR32_TYPE__ unsigned int +#define __WINT_TYPE__ unsigned int +#define __CHAR16_TYPE__ short unsigned int +#define __WCHAR_TYPE__ int +#define __CHAR32_TYPE__ unsigned int + +#define __INT_LEAST8_TYPE__ __INT8_TYPE__ +#define __UINT_LEAST8_TYPE__ __UINT8_TYPE__ +#define __INT_LEAST16_TYPE__ __INT32_TYPE__ +#define __UINT_LEAST16_TYPE__ __UINT16_TYPE__ +#define __INT_LEAST32_TYPE__ __INT16_TYPE__ +#define __UINT_LEAST32_TYPE__ __UINT32_TYPE__ +#define __INT_LEAST64_TYPE__ __INT64_TYPE__ +#define __UINT_LEAST64_TYPE__ __UINT64_TYPE__ +#define __INT_FAST8_TYPE__ __INT8_TYPE__ +#define __UINT_FAST8_TYPE__ __UINT8_TYPE__ +#define __INT_FAST16_TYPE__ __INT32_TYPE__ +#define __UINT_FAST16_TYPE__ __UINT32_TYPE__ +#define __INT_FAST32_TYPE__ __INT32_TYPE__ +#define __UINT_FAST32_TYPE__ __UINT32_TYPE__ +#define __INT_FAST64_TYPE__ __INT64_TYPE__ +#define __UINT_FAST64_TYPE__ __UINT64_TYPE__ + +#endif diff --git a/libc/integral/normalize.inc b/libc/integral/normalize.inc index 22026bbcc..7fd08bed5 100644 --- a/libc/integral/normalize.inc +++ b/libc/integral/normalize.inc @@ -80,6 +80,8 @@ #if defined(__LP64__) && !defined(__INT64_TYPE__) #include "libc/integral/lp64.inc" +#elif defined(_MSC_VER) && !defined(__INT64_TYPE__) +#include "libc/integral/llp64.inc" #endif #if !(__ASSEMBLER__ + __LINKER__ + 0)