aboutsummaryrefslogtreecommitdiff
path: root/lib/zig.h
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2022-12-17 17:55:10 -0500
committerkcbanner <kcbanner@gmail.com>2023-01-01 16:44:29 -0500
commit7b999dae730c2938865df05fdeecf15aaff2254d (patch)
tree394ff9e4f5bda4f8ae3af0c65c17c9436b7c8937 /lib/zig.h
parent5470708a89cb11eefc3e0cbb43337dbf3f99c8ac (diff)
downloadzig-7b999dae730c2938865df05fdeecf15aaff2254d.tar.gz
zig-7b999dae730c2938865df05fdeecf15aaff2254d.zip
cbe: special float macros passthrough to builtins if available, but fallback to conversion from repr if not
Diffstat (limited to 'lib/zig.h')
-rw-r--r--lib/zig.h108
1 files changed, 100 insertions, 8 deletions
diff --git a/lib/zig.h b/lib/zig.h
index a43fcf16be..b8e64708d5 100644
--- a/lib/zig.h
+++ b/lib/zig.h
@@ -1749,11 +1749,27 @@ static inline zig_i128 zig_bit_reverse_i128(zig_i128 val, zig_u8 bits) {
#define __builtin_infl() zig_msvc_flt_infl
#endif
+#define zig_has_float_builtins (zig_has_builtin(nan) && zig_has_builtin(nans) && zig_has_builtin(inf))
+#if zig_has_float_builtins
+#define zig_as_special_f16(sign, name, arg, repr) sign zig_as_f16(__builtin_##name, )(arg)
+#define zig_as_special_f32(sign, name, arg, repr) sign zig_as_f32(__builtin_##name, )(arg)
+#define zig_as_special_f64(sign, name, arg, repr) sign zig_as_f64(__builtin_##name, )(arg)
+#define zig_as_special_f80(sign, name, arg, repr) sign zig_as_f80(__builtin_##name, )(arg)
+#define zig_as_special_f128(sign, name, arg, repr) sign zig_as_f128(__builtin_##name, )(arg)
+#define zig_as_special_c_longdouble(sign, name, arg, repr) sign zig_as_c_longdouble(__builtin_##name, )(arg)
+#else
+#define zig_as_special_f16(sign, name, arg, repr) zig_float_from_repr_f16(repr)
+#define zig_as_special_f32(sign, name, arg, repr) zig_float_from_repr_f32(repr)
+#define zig_as_special_f64(sign, name, arg, repr) zig_float_from_repr_f64(repr)
+#define zig_as_special_f80(sign, name, arg, repr) zig_float_from_repr_f80(repr)
+#define zig_as_special_f128(sign, name, arg, repr) zig_float_from_repr_f128(repr)
+#define zig_as_special_c_longdouble(sign, name, arg, repr) zig_float_from_repr_c_longdouble(repr)
+#endif
+
#define zig_has_f16 1
#define zig_bitSizeOf_f16 16
#define zig_libc_name_f16(name) __##name##h
#define zig_as_special_constant_f16(sign, name, arg, repr) zig_as_special_f16(sign, name, arg, repr)
-#define zig_as_special_f16(sign, name, arg, repr) sign zig_as_f16(__builtin_##name, )(arg)
#if FLT_MANT_DIG == 11
typedef float zig_f16;
#define zig_as_f16(fp, repr) fp##f
@@ -1790,7 +1806,6 @@ typedef zig_i16 zig_f16;
#else
#define zig_as_special_constant_f32(sign, name, arg, repr) zig_as_special_f32(sign, name, arg, repr)
#endif
-#define zig_as_special_f32(sign, name, arg, repr) sign zig_as_f32(__builtin_##name, )(arg)
#if FLT_MANT_DIG == 24
typedef float zig_f32;
#define zig_as_f32(fp, repr) fp##f
@@ -1824,7 +1839,6 @@ typedef zig_i32 zig_f32;
#else
#define zig_as_special_constant_f64(sign, name, arg, repr) zig_as_special_f64(sign, name, arg, repr)
#endif
-#define zig_as_special_f64(sign, name, arg, repr) sign zig_as_f64(__builtin_##name, )(arg)
#if FLT_MANT_DIG == 53
typedef float zig_f64;
#define zig_as_f64(fp, repr) fp##f
@@ -1857,7 +1871,6 @@ typedef zig_i64 zig_f64;
#define zig_bitSizeOf_f80 80
#define zig_libc_name_f80(name) __##name##x
#define zig_as_special_constant_f80(sign, name, arg, repr) zig_as_special_f80(sign, name, arg, repr)
-#define zig_as_special_f80(sign, name, arg, repr) sign zig_as_f80(__builtin_##name, )(arg)
#if FLT_MANT_DIG == 64
typedef float zig_f80;
#define zig_as_f80(fp, repr) fp##f
@@ -1893,7 +1906,6 @@ typedef zig_i128 zig_f80;
#define zig_bitSizeOf_f128 128
#define zig_libc_name_f128(name) name##q
#define zig_as_special_constant_f128(sign, name, arg, repr) zig_as_special_f128(sign, name, arg, repr)
-#define zig_as_special_f128(sign, name, arg, repr) sign zig_as_f128(__builtin_##name, )(arg)
#if FLT_MANT_DIG == 113
typedef float zig_f128;
#define zig_as_f128(fp, repr) fp##f
@@ -1930,8 +1942,7 @@ typedef zig_i128 zig_f128;
#define zig_has_c_longdouble 1
#define zig_libc_name_c_longdouble(name) name##l
#define zig_as_special_constant_c_longdouble(sign, name, arg, repr) zig_as_special_c_longdouble(sign, name, arg, repr)
-#define zig_as_special_c_longdouble(sign, name, arg, repr) sign __builtin_##name##l(arg)
-#if !_MSC_VER // TODO: Is there a better way to detect this is just double?
+#if !_MSC_VER // TODO: Is there a better way to detect long double == double on msvc?
typedef long double zig_c_longdouble;
#define zig_as_c_longdouble(fp, repr) fp##l
#else
@@ -1947,6 +1958,87 @@ typedef zig_i128 zig_c_longdouble;
#define zig_as_special_constant_c_longdouble(sign, name, arg, repr) repr
#endif
+#if !zig_has_float_builtins
+#define zig_float_from_repr(Type, ReprType) \
+ static inline zig_##Type zig_float_from_repr_##Type(zig_##ReprType repr) { \
+ return *((zig_##Type*)&repr); \
+ }
+
+zig_float_from_repr(f16, u16)
+zig_float_from_repr(f32, u32)
+zig_float_from_repr(f64, u64)
+zig_float_from_repr(f80, u128)
+zig_float_from_repr(f128, u128)
+zig_float_from_repr(c_longdouble, u128)
+#endif
+
+/* #define zig_float_from_repr(Type) *((zig_##Type*)&repr) */
+
+/* #define zig_float_inf_builtin_0(Type, ReprType) \ */
+/* static inline zig_##Type zig_as_special_inf_##Type(zig_##ReprType repr) { \ */
+/* return zig_float_from_repr(Type); \ */
+/* } */
+/* #define zig_float_inf_builtin_1(Type, ReprType) \ */
+/* static inline zig_##Type zig_as_special_inf_##Type(zig_##ReprType repr) { \ */
+/* return __builtin_inf(); \ */
+/* } */
+/* #define zig_float_nan_builtin_0(Type, ReprType) \ */
+/* static inline zig_##Type zig_as_special_nan_##Type(const char* arg, zig_##ReprType repr) { \ */
+/* return zig_float_from_repr(Type); \ */
+/* } */
+/* #define zig_float_nan_builtin_1(Type, ReprType) \ */
+/* static inline zig_##Type zig_as_special_nan_##Type(const char* arg, zig_##ReprType repr) { \ */
+/* return __builtin_nan(arg); \ */
+/* } */
+/* #define zig_float_nans_builtin_0(Type, ReprType) \ */
+/* static inline zig_##Type zig_as_special_nans_##Type(const char* arg, zig_##ReprType repr) { \ */
+/* return zig_float_from_repr(Type); \ */
+/* } */
+/* #define zig_float_nans_builtin_1(Type, ReprType) \ */
+/* static inline zig_##Type zig_as_special_nans_##Type(const char* arg, zig_##ReprType repr) { \ */
+/* return __builtin_nans(arg); \ */
+/* } */
+
+/* #define zig_float_special_builtins(Type, ReprType) \ */
+/* zig_expand_concat(zig_float_inf_builtin_, zig_has_builtin(inf))(Type, ReprType) \ */
+/* zig_expand_concat(zig_float_nan_builtin_, zig_has_builtin(nan))(Type, ReprType) \ */
+/* zig_expand_concat(zig_float_nans_builtin_, zig_has_builtin(nans))(Type, ReprType) */
+
+/* #if zig_has_builtin(nan) */
+/* #define zig_as_special_nan(arg, repr) __builtin_nan(arg); */
+/* #define zig_as_special_nan_f16(arg, repr) __builtin_nan(arg); */
+/* #define zig_as_special_nan_f32(arg, repr) __builtin_nan(arg); */
+/* #define zig_as_special_nan_f64(arg, repr) __builtin_nan(arg); */
+/* #define zig_as_special_nan_f80(arg, repr) __builtin_nan(arg); */
+/* #define zig_as_special_nan_f128(arg, repr) __builtin_nan(arg); */
+/* #else */
+/* zig_float_special_builtins(); */
+/* #endif */
+
+/* #if zig_has_f16 */
+/* zig_float_special_builtins(f16, u16) */
+/* #endif */
+
+/* #if zig_has_f32 */
+/* zig_float_special_builtins(f32, u32) */
+/* #endif */
+
+/* #if zig_has_f64 */
+/* zig_float_special_builtins(f64, u64) */
+/* #endif */
+
+/* #if zig_has_f80 */
+/* zig_float_special_builtins(f80, u128) */
+/* #endif */
+
+/* #if zig_has_f128 */
+/* zig_float_special_builtins(f128, u128) */
+/* #endif */
+
+/* #if zig_has_c_longdouble */
+/* zig_float_special_builtins(c_longdouble, u128) */
+/* #endif */
+
#if zig_bitSizeOf_c_longdouble == 16
#define zig_compiler_rt_abbrev_c_longdouble zig_compiler_rt_abbrev_f16
#elif zig_bitSizeOf_c_longdouble == 32
@@ -2100,7 +2192,7 @@ zig_float_builtins(c_longdouble)
#if _MSC_VER && (_M_IX86 || _M_X64)
#include <intrin.h>
-// TODO: zig_msvc_atomic_load should just load 32 bit without interlocked on x86, and just load 64 bit without interlocked on x64
+// TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, and load 64 bit without interlocked on x64
#define zig_msvc_atomics(Type, suffix) \
static inline bool zig_msvc_cmpxchg_##Type(zig_##Type volatile* obj, zig_##Type* expected, zig_##Type desired) { \