authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-04-05 23:27:50-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-04-05 23:27:50-07:00
logeb19f73af5b426e27af8a5fcac22440664fd8414
tree6fee82ab52f533263071afbc13d2c3f1c4bc2f6e
parentfc9ab4144cc577e5293e685af2d53ac1cb3415ce

update zig1.wasm


2 files changed, 147 insertions(+), 126 deletions(-)

stage1/zig.h+147-126
......@@ -502,6 +502,15 @@ typedef ptrdiff_t intptr_t;
502502
503503#endif
504504
505#define zig_make_small_i8(val) INT8_C(val)
506#define zig_make_small_u8(val) UINT8_C(val)
507#define zig_make_small_i16(val) INT16_C(val)
508#define zig_make_small_u16(val) UINT16_C(val)
509#define zig_make_small_i32(val) INT32_C(val)
510#define zig_make_small_u32(val) UINT32_C(val)
511#define zig_make_small_i64(val) INT64_C(val)
512#define zig_make_small_u64(val) UINT64_C(val)
513
505514#define zig_minInt_i8 INT8_MIN
506515#define zig_maxInt_i8 INT8_MAX
507516#define zig_minInt_u8 UINT8_C(0)
......@@ -585,7 +594,7 @@ typedef ptrdiff_t intptr_t;
585594 } \
586595\
587596 static inline int##w##_t zig_shlw_i##w(int##w##_t lhs, uint8_t rhs, uint8_t bits) { \
588 return zig_wrap_i##w((int##w##_t)zig_shl_u##w((uint##w##_t)lhs, (uint##w##_t)rhs), bits); \
597 return zig_wrap_i##w((int##w##_t)zig_shl_u##w((uint##w##_t)lhs, rhs), bits); \
589598 } \
590599\
591600 static inline uint##w##_t zig_addw_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \
......@@ -1294,6 +1303,9 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;
12941303
12951304#endif /* zig_has_int128 */
12961305
1306#define zig_make_small_u128(val) zig_make_u128(0, val)
1307#define zig_make_small_i128(val) zig_make_i128((val) < 0 ? -INT64_C(1) : INT64_C(0), val)
1308
12971309#define zig_minInt_u128 zig_make_u128(zig_minInt_u64, zig_minInt_u64)
12981310#define zig_maxInt_u128 zig_make_u128(zig_maxInt_u64, zig_maxInt_u64)
12991311#define zig_minInt_i128 zig_make_i128(zig_minInt_i64, zig_minInt_u64)
......@@ -2796,6 +2808,10 @@ static inline uint16_t zig_popcount_big(const void *val, bool is_signed, uint16_
27962808/* ========================= Floating Point Support ========================= */
27972809
27982810#if _MSC_VER
2811float __cdecl nanf(char const* input);
2812double __cdecl nan(char const* input);
2813long double __cdecl nanl(char const* input);
2814
27992815#define zig_msvc_flt_inf ((double)(1e+300 * 1e+300))
28002816#define zig_msvc_flt_inff ((float)(1e+300 * 1e+300))
28012817#define zig_msvc_flt_infl ((long double)(1e+300 * 1e+300))
......@@ -2828,7 +2844,7 @@ static inline uint16_t zig_popcount_big(const void *val, bool is_signed, uint16_
28282844
28292845#define zig_has_f16 1
28302846#define zig_bitSizeOf_f16 16
2831typedef int16_t zig_repr_f16;
2847typedef uint16_t zig_repr_f16;
28322848#define zig_libc_name_f16(name) __##name##h
28332849#define zig_init_special_f16(sign, name, arg, repr) zig_make_special_f16(sign, name, arg, repr)
28342850#if FLT_MANT_DIG == 11
......@@ -2854,17 +2870,23 @@ typedef __fp16 zig_f16;
28542870#undef zig_has_f16
28552871#define zig_has_f16 0
28562872#define zig_bitSizeOf_repr_f16 16
2857typedef int16_t zig_f16;
2873typedef zig_repr_f16 zig_f16;
28582874#define zig_make_f16(fp, repr) repr
28592875#undef zig_make_special_f16
28602876#define zig_make_special_f16(sign, name, arg, repr) repr
28612877#undef zig_init_special_f16
28622878#define zig_init_special_f16(sign, name, arg, repr) repr
28632879#endif
2880#if __APPLE__
2881typedef zig_repr_f16 zig_compiler_rt_f16;
2882#else
2883typedef zig_f16 zig_compiler_rt_f16;
2884#endif
2885#define zig_compiler_rt_abbrev_zig_compiler_rt_f16 zig_compiler_rt_abbrev_zig_f16
28642886
28652887#define zig_has_f32 1
28662888#define zig_bitSizeOf_f32 32
2867typedef int32_t zig_repr_f32;
2889typedef uint32_t zig_repr_f32;
28682890#define zig_libc_name_f32(name) name##f
28692891#if _MSC_VER
28702892#define zig_init_special_f32(sign, name, arg, repr) sign zig_make_f32(zig_msvc_flt_##name, )
......@@ -2891,7 +2913,7 @@ typedef _Float32 zig_f32;
28912913#undef zig_has_f32
28922914#define zig_has_f32 0
28932915#define zig_bitSizeOf_repr_f32 32
2894typedef int32_t zig_f32;
2916typedef zig_repr_f32 zig_f32;
28952917#define zig_make_f32(fp, repr) repr
28962918#undef zig_make_special_f32
28972919#define zig_make_special_f32(sign, name, arg, repr) repr
......@@ -2901,7 +2923,7 @@ typedef int32_t zig_f32;
29012923
29022924#define zig_has_f64 1
29032925#define zig_bitSizeOf_f64 64
2904typedef int64_t zig_repr_f64;
2926typedef uint64_t zig_repr_f64;
29052927#define zig_libc_name_f64(name) name
29062928#if _MSC_VER
29072929#ifdef ZIG_TARGET_ABI_MSVC
......@@ -2937,7 +2959,7 @@ typedef _Float32x zig_f64;
29372959#undef zig_has_f64
29382960#define zig_has_f64 0
29392961#define zig_bitSizeOf_repr_f64 64
2940typedef int64_t zig_f64;
2962typedef zig_repr_f64 zig_f64;
29412963#define zig_make_f64(fp, repr) repr
29422964#undef zig_make_special_f64
29432965#define zig_make_special_f64(sign, name, arg, repr) repr
......@@ -2947,7 +2969,7 @@ typedef int64_t zig_f64;
29472969
29482970#define zig_has_f80 1
29492971#define zig_bitSizeOf_f80 80
2950typedef zig_i128 zig_repr_f80;
2972typedef zig_u128 zig_repr_f80;
29512973#define zig_libc_name_f80(name) __##name##x
29522974#define zig_init_special_f80(sign, name, arg, repr) zig_make_special_f80(sign, name, arg, repr)
29532975#if FLT_MANT_DIG == 64
......@@ -2976,7 +2998,7 @@ typedef __float80 zig_f80;
29762998#undef zig_has_f80
29772999#define zig_has_f80 0
29783000#define zig_bitSizeOf_repr_f80 128
2979typedef zig_i128 zig_f80;
3001typedef zig_repr_f80 zig_f80;
29803002#define zig_make_f80(fp, repr) repr
29813003#undef zig_make_special_f80
29823004#define zig_make_special_f80(sign, name, arg, repr) repr
......@@ -2986,7 +3008,7 @@ typedef zig_i128 zig_f80;
29863008
29873009#define zig_has_f128 1
29883010#define zig_bitSizeOf_f128 128
2989typedef zig_i128 zig_repr_f128;
3011typedef zig_u128 zig_repr_f128;
29903012#define zig_libc_name_f128(name) name##q
29913013#define zig_init_special_f128(sign, name, arg, repr) zig_make_special_f128(sign, name, arg, repr)
29923014#if FLT_MANT_DIG == 113
......@@ -3017,7 +3039,7 @@ typedef __float128 zig_f128;
30173039#undef zig_has_f128
30183040#define zig_has_f128 0
30193041#define zig_bitSizeOf_repr_f128 128
3020typedef zig_i128 zig_f128;
3042typedef zig_repr_f128 zig_f128;
30213043#define zig_make_f128(fp, repr) repr
30223044#undef zig_make_special_f128
30233045#define zig_make_special_f128(sign, name, arg, repr) repr
......@@ -3076,15 +3098,15 @@ zig_float_from_repr(f128)
30763098#define zig_convert_builtin(ResType, operation, ArgType, version) \
30773099 zig_extern ResType zig_expand_concat(zig_expand_concat(zig_expand_concat(__##operation, \
30783100 zig_compiler_rt_abbrev_##ArgType), zig_compiler_rt_abbrev_##ResType), version)(ArgType);
3079zig_convert_builtin(zig_f16, trunc, zig_f32, 2)
3080zig_convert_builtin(zig_f16, trunc, zig_f64, 2)
3101zig_convert_builtin(zig_compiler_rt_f16, trunc, zig_f32, 2)
3102zig_convert_builtin(zig_compiler_rt_f16, trunc, zig_f64, 2)
30813103zig_convert_builtin(zig_f16, trunc, zig_f80, 2)
30823104zig_convert_builtin(zig_f16, trunc, zig_f128, 2)
3083zig_convert_builtin(zig_f32, extend, zig_f16, 2)
3105zig_convert_builtin(zig_f32, extend, zig_compiler_rt_f16, 2)
30843106zig_convert_builtin(zig_f32, trunc, zig_f64, 2)
30853107zig_convert_builtin(zig_f32, trunc, zig_f80, 2)
30863108zig_convert_builtin(zig_f32, trunc, zig_f128, 2)
3087zig_convert_builtin(zig_f64, extend, zig_f16, 2)
3109zig_convert_builtin(zig_f64, extend, zig_compiler_rt_f16, 2)
30883110zig_convert_builtin(zig_f64, extend, zig_f32, 2)
30893111zig_convert_builtin(zig_f64, trunc, zig_f80, 2)
30903112zig_convert_builtin(zig_f64, trunc, zig_f128, 2)
......@@ -3097,15 +3119,18 @@ zig_convert_builtin(zig_f128, extend, zig_f32, 2)
30973119zig_convert_builtin(zig_f128, extend, zig_f64, 2)
30983120zig_convert_builtin(zig_f128, extend, zig_f80, 2)
30993121
3100#define zig_float_negate_builtin_0(Type) \
3101 static inline zig_##Type zig_neg_##Type(zig_##Type arg) { \
3102 return zig_expand_concat(zig_xor_i, zig_bitSizeOf_repr_##Type)( \
3122#define zig_float_negate_builtin_0(w) \
3123 static inline zig_f##w zig_neg_f##w(zig_f##w arg) { \
3124 return zig_expand_concat(zig_xor_u, zig_bitSizeOf_repr_f##w)( \
31033125 arg, \
3104 zig_minInt_i(zig_bitSizeOf_repr_##Type, zig_bitSizeOf_##Type) \
3126 zig_expand_concat(zig_shl_u, zig_bitSizeOf_repr_f##w)( \
3127 zig_expand_concat(zig_make_small_u, zig_bitSizeOf_repr_f##w)(1), \
3128 UINT8_C(w - 1) \
3129 ) \
31053130 ); \
31063131 }
3107#define zig_float_negate_builtin_1(Type) \
3108 static inline zig_##Type zig_neg_##Type(zig_##Type arg) { \
3132#define zig_float_negate_builtin_1(w) \
3133 static inline zig_f##w zig_neg_f##w(zig_f##w arg) { \
31093134 return -arg; \
31103135 }
31113136
......@@ -3138,75 +3163,75 @@ zig_convert_builtin(zig_f128, extend, zig_f80, 2)
31383163 return lhs operator rhs; \
31393164 }
31403165
3141#define zig_float_builtins(Type) \
3142 zig_convert_builtin( int32_t, fix, zig_##Type, ) \
3143 zig_convert_builtin(uint32_t, fixuns, zig_##Type, ) \
3144 zig_convert_builtin( int64_t, fix, zig_##Type, ) \
3145 zig_convert_builtin(uint64_t, fixuns, zig_##Type, ) \
3146 zig_convert_builtin(zig_i128, fix, zig_##Type, ) \
3147 zig_convert_builtin(zig_u128, fixuns, zig_##Type, ) \
3148 zig_convert_builtin(zig_##Type, float, int32_t, ) \
3149 zig_convert_builtin(zig_##Type, floatun, uint32_t, ) \
3150 zig_convert_builtin(zig_##Type, float, int64_t, ) \
3151 zig_convert_builtin(zig_##Type, floatun, uint64_t, ) \
3152 zig_convert_builtin(zig_##Type, float, zig_i128, ) \
3153 zig_convert_builtin(zig_##Type, floatun, zig_u128, ) \
3154 zig_expand_concat(zig_float_negate_builtin_, zig_has_##Type)(Type) \
3155 zig_expand_concat(zig_float_less_builtin_, zig_has_##Type)(Type, cmp) \
3156 zig_expand_concat(zig_float_less_builtin_, zig_has_##Type)(Type, ne) \
3157 zig_expand_concat(zig_float_less_builtin_, zig_has_##Type)(Type, eq) \
3158 zig_expand_concat(zig_float_less_builtin_, zig_has_##Type)(Type, lt) \
3159 zig_expand_concat(zig_float_less_builtin_, zig_has_##Type)(Type, le) \
3160 zig_expand_concat(zig_float_greater_builtin_, zig_has_##Type)(Type, gt) \
3161 zig_expand_concat(zig_float_greater_builtin_, zig_has_##Type)(Type, ge) \
3162 zig_expand_concat(zig_float_binary_builtin_, zig_has_##Type)(Type, add, +) \
3163 zig_expand_concat(zig_float_binary_builtin_, zig_has_##Type)(Type, sub, -) \
3164 zig_expand_concat(zig_float_binary_builtin_, zig_has_##Type)(Type, mul, *) \
3165 zig_expand_concat(zig_float_binary_builtin_, zig_has_##Type)(Type, div, /) \
3166 zig_extern zig_##Type zig_libc_name_##Type(sqrt)(zig_##Type); \
3167 zig_extern zig_##Type zig_libc_name_##Type(sin)(zig_##Type); \
3168 zig_extern zig_##Type zig_libc_name_##Type(cos)(zig_##Type); \
3169 zig_extern zig_##Type zig_libc_name_##Type(tan)(zig_##Type); \
3170 zig_extern zig_##Type zig_libc_name_##Type(exp)(zig_##Type); \
3171 zig_extern zig_##Type zig_libc_name_##Type(exp2)(zig_##Type); \
3172 zig_extern zig_##Type zig_libc_name_##Type(log)(zig_##Type); \
3173 zig_extern zig_##Type zig_libc_name_##Type(log2)(zig_##Type); \
3174 zig_extern zig_##Type zig_libc_name_##Type(log10)(zig_##Type); \
3175 zig_extern zig_##Type zig_libc_name_##Type(fabs)(zig_##Type); \
3176 zig_extern zig_##Type zig_libc_name_##Type(floor)(zig_##Type); \
3177 zig_extern zig_##Type zig_libc_name_##Type(ceil)(zig_##Type); \
3178 zig_extern zig_##Type zig_libc_name_##Type(round)(zig_##Type); \
3179 zig_extern zig_##Type zig_libc_name_##Type(trunc)(zig_##Type); \
3180 zig_extern zig_##Type zig_libc_name_##Type(fmod)(zig_##Type, zig_##Type); \
3181 zig_extern zig_##Type zig_libc_name_##Type(fmin)(zig_##Type, zig_##Type); \
3182 zig_extern zig_##Type zig_libc_name_##Type(fmax)(zig_##Type, zig_##Type); \
3183 zig_extern zig_##Type zig_libc_name_##Type(fma)(zig_##Type, zig_##Type, zig_##Type); \
3166#define zig_float_builtins(w) \
3167 zig_convert_builtin( int32_t, fix, zig_f##w, ) \
3168 zig_convert_builtin(uint32_t, fixuns, zig_f##w, ) \
3169 zig_convert_builtin( int64_t, fix, zig_f##w, ) \
3170 zig_convert_builtin(uint64_t, fixuns, zig_f##w, ) \
3171 zig_convert_builtin(zig_i128, fix, zig_f##w, ) \
3172 zig_convert_builtin(zig_u128, fixuns, zig_f##w, ) \
3173 zig_convert_builtin(zig_f##w, float, int32_t, ) \
3174 zig_convert_builtin(zig_f##w, floatun, uint32_t, ) \
3175 zig_convert_builtin(zig_f##w, float, int64_t, ) \
3176 zig_convert_builtin(zig_f##w, floatun, uint64_t, ) \
3177 zig_convert_builtin(zig_f##w, float, zig_i128, ) \
3178 zig_convert_builtin(zig_f##w, floatun, zig_u128, ) \
3179 zig_expand_concat(zig_float_negate_builtin_, zig_has_f##w)(w) \
3180 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, cmp) \
3181 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, ne) \
3182 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, eq) \
3183 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, lt) \
3184 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, le) \
3185 zig_expand_concat(zig_float_greater_builtin_, zig_has_f##w)(f##w, gt) \
3186 zig_expand_concat(zig_float_greater_builtin_, zig_has_f##w)(f##w, ge) \
3187 zig_expand_concat(zig_float_binary_builtin_, zig_has_f##w)(f##w, add, +) \
3188 zig_expand_concat(zig_float_binary_builtin_, zig_has_f##w)(f##w, sub, -) \
3189 zig_expand_concat(zig_float_binary_builtin_, zig_has_f##w)(f##w, mul, *) \
3190 zig_expand_concat(zig_float_binary_builtin_, zig_has_f##w)(f##w, div, /) \
3191 zig_extern zig_f##w zig_libc_name_f##w(sqrt)(zig_f##w); \
3192 zig_extern zig_f##w zig_libc_name_f##w(sin)(zig_f##w); \
3193 zig_extern zig_f##w zig_libc_name_f##w(cos)(zig_f##w); \
3194 zig_extern zig_f##w zig_libc_name_f##w(tan)(zig_f##w); \
3195 zig_extern zig_f##w zig_libc_name_f##w(exp)(zig_f##w); \
3196 zig_extern zig_f##w zig_libc_name_f##w(exp2)(zig_f##w); \
3197 zig_extern zig_f##w zig_libc_name_f##w(log)(zig_f##w); \
3198 zig_extern zig_f##w zig_libc_name_f##w(log2)(zig_f##w); \
3199 zig_extern zig_f##w zig_libc_name_f##w(log10)(zig_f##w); \
3200 zig_extern zig_f##w zig_libc_name_f##w(fabs)(zig_f##w); \
3201 zig_extern zig_f##w zig_libc_name_f##w(floor)(zig_f##w); \
3202 zig_extern zig_f##w zig_libc_name_f##w(ceil)(zig_f##w); \
3203 zig_extern zig_f##w zig_libc_name_f##w(round)(zig_f##w); \
3204 zig_extern zig_f##w zig_libc_name_f##w(trunc)(zig_f##w); \
3205 zig_extern zig_f##w zig_libc_name_f##w(fmod)(zig_f##w, zig_f##w); \
3206 zig_extern zig_f##w zig_libc_name_f##w(fmin)(zig_f##w, zig_f##w); \
3207 zig_extern zig_f##w zig_libc_name_f##w(fmax)(zig_f##w, zig_f##w); \
3208 zig_extern zig_f##w zig_libc_name_f##w(fma)(zig_f##w, zig_f##w, zig_f##w); \
31843209\
3185 static inline zig_##Type zig_div_trunc_##Type(zig_##Type lhs, zig_##Type rhs) { \
3186 return zig_libc_name_##Type(trunc)(zig_div_##Type(lhs, rhs)); \
3210 static inline zig_f##w zig_div_trunc_f##w(zig_f##w lhs, zig_f##w rhs) { \
3211 return zig_libc_name_f##w(trunc)(zig_div_f##w(lhs, rhs)); \
31873212 } \
31883213\
3189 static inline zig_##Type zig_div_floor_##Type(zig_##Type lhs, zig_##Type rhs) { \
3190 return zig_libc_name_##Type(floor)(zig_div_##Type(lhs, rhs)); \
3214 static inline zig_f##w zig_div_floor_f##w(zig_f##w lhs, zig_f##w rhs) { \
3215 return zig_libc_name_f##w(floor)(zig_div_f##w(lhs, rhs)); \
31913216 } \
31923217\
3193 static inline zig_##Type zig_mod_##Type(zig_##Type lhs, zig_##Type rhs) { \
3194 return zig_sub_##Type(lhs, zig_mul_##Type(zig_div_floor_##Type(lhs, rhs), rhs)); \
3218 static inline zig_f##w zig_mod_f##w(zig_f##w lhs, zig_f##w rhs) { \
3219 return zig_sub_f##w(lhs, zig_mul_f##w(zig_div_floor_f##w(lhs, rhs), rhs)); \
31953220 }
3196zig_float_builtins(f16)
3197zig_float_builtins(f32)
3198zig_float_builtins(f64)
3199zig_float_builtins(f80)
3200zig_float_builtins(f128)
3221zig_float_builtins(16)
3222zig_float_builtins(32)
3223zig_float_builtins(64)
3224zig_float_builtins(80)
3225zig_float_builtins(128)
32013226
32023227#if _MSC_VER && (_M_IX86 || _M_X64)
32033228
32043229// TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, and load 64 bit without interlocked on x64
32053230
3206#define zig_msvc_atomics(ZigType, Type, suffix) \
3231#define zig_msvc_atomics(ZigType, Type, SigType, suffix) \
32073232 static inline bool zig_msvc_cmpxchg_##ZigType(Type volatile* obj, Type* expected, Type desired) { \
32083233 Type comparand = *expected; \
3209 Type initial = _InterlockedCompareExchange##suffix(obj, desired, comparand); \
3234 Type initial = _InterlockedCompareExchange##suffix((SigType volatile*)obj, (SigType)desired, (SigType)comparand); \
32103235 bool exchanged = initial == comparand; \
32113236 if (!exchanged) { \
32123237 *expected = initial; \
......@@ -3214,10 +3239,10 @@ zig_float_builtins(f128)
32143239 return exchanged; \
32153240 } \
32163241 static inline Type zig_msvc_atomicrmw_xchg_##ZigType(Type volatile* obj, Type value) { \
3217 return _InterlockedExchange##suffix(obj, value); \
3242 return _InterlockedExchange##suffix((SigType volatile*)obj, (SigType)value); \
32183243 } \
32193244 static inline Type zig_msvc_atomicrmw_add_##ZigType(Type volatile* obj, Type value) { \
3220 return _InterlockedExchangeAdd##suffix(obj, value); \
3245 return _InterlockedExchangeAdd##suffix((SigType volatile*)obj, (SigType)value); \
32213246 } \
32223247 static inline Type zig_msvc_atomicrmw_sub_##ZigType(Type volatile* obj, Type value) { \
32233248 bool success = false; \
......@@ -3231,13 +3256,13 @@ zig_float_builtins(f128)
32313256 return prev; \
32323257 } \
32333258 static inline Type zig_msvc_atomicrmw_or_##ZigType(Type volatile* obj, Type value) { \
3234 return _InterlockedOr##suffix(obj, value); \
3259 return _InterlockedOr##suffix((SigType volatile*)obj, (SigType)value); \
32353260 } \
32363261 static inline Type zig_msvc_atomicrmw_xor_##ZigType(Type volatile* obj, Type value) { \
3237 return _InterlockedXor##suffix(obj, value); \
3262 return _InterlockedXor##suffix((SigType volatile*)obj, (SigType)value); \
32383263 } \
32393264 static inline Type zig_msvc_atomicrmw_and_##ZigType(Type volatile* obj, Type value) { \
3240 return _InterlockedAnd##suffix(obj, value); \
3265 return _InterlockedAnd##suffix((SigType volatile*)obj, (SigType)value); \
32413266 } \
32423267 static inline Type zig_msvc_atomicrmw_nand_##ZigType(Type volatile* obj, Type value) { \
32433268 bool success = false; \
......@@ -3273,22 +3298,22 @@ zig_float_builtins(f128)
32733298 return prev; \
32743299 } \
32753300 static inline void zig_msvc_atomic_store_##ZigType(Type volatile* obj, Type value) { \
3276 _InterlockedExchange##suffix(obj, value); \
3301 (void)_InterlockedExchange##suffix((SigType volatile*)obj, (SigType)value); \
32773302 } \
32783303 static inline Type zig_msvc_atomic_load_##ZigType(Type volatile* obj) { \
3279 return _InterlockedOr##suffix(obj, 0); \
3304 return _InterlockedExchangeAdd##suffix((SigType volatile*)obj, (SigType)0); \
32803305 }
32813306
3282zig_msvc_atomics( u8, uint8_t, 8)
3283zig_msvc_atomics( i8, int8_t, 8)
3284zig_msvc_atomics(u16, uint16_t, 16)
3285zig_msvc_atomics(i16, int16_t, 16)
3286zig_msvc_atomics(u32, uint32_t, )
3287zig_msvc_atomics(i32, int32_t, )
3307zig_msvc_atomics( u8, uint8_t, char, 8)
3308zig_msvc_atomics( i8, int8_t, char, 8)
3309zig_msvc_atomics(u16, uint16_t, short, 16)
3310zig_msvc_atomics(i16, int16_t, short, 16)
3311zig_msvc_atomics(u32, uint32_t, long, )
3312zig_msvc_atomics(i32, int32_t, long, )
32883313
32893314#if _M_X64
3290zig_msvc_atomics(u64, uint64_t, 64)
3291zig_msvc_atomics(i64, int64_t, 64)
3315zig_msvc_atomics(u64, uint64_t, __int64, 64)
3316zig_msvc_atomics(i64, int64_t, __int64, 64)
32923317#endif
32933318
32943319#define zig_msvc_flt_atomics(Type, ReprType, suffix) \
......@@ -3336,9 +3361,9 @@ zig_msvc_atomics(i64, int64_t, 64)
33363361 return expected; \
33373362 }
33383363
3339zig_msvc_flt_atomics(f32, uint32_t, )
3364zig_msvc_flt_atomics(f32, long, )
33403365#if _M_X64
3341zig_msvc_flt_atomics(f64, uint64_t, 64)
3366zig_msvc_flt_atomics(f64, int64_t, 64)
33423367#endif
33433368
33443369#if _M_IX86
......@@ -3349,56 +3374,52 @@ static inline void zig_msvc_atomic_barrier() {
33493374 }
33503375}
33513376
3352static inline void* zig_msvc_atomicrmw_xchg_p32(void** obj, void* arg) {
3377static inline void* zig_msvc_atomicrmw_xchg_p32(void volatile* obj, void* arg) {
33533378 return _InterlockedExchangePointer(obj, arg);
33543379}
33553380
3356static inline void zig_msvc_atomic_store_p32(void** obj, void* arg) {
3357 _InterlockedExchangePointer(obj, arg);
3381static inline void zig_msvc_atomic_store_p32(void volatile* obj, void* arg) {
3382 (void)_InterlockedExchangePointer(obj, arg);
33583383}
33593384
3360static inline void* zig_msvc_atomic_load_p32(void** obj) {
3361 return (void*)_InterlockedOr((void*)obj, 0);
3385static inline void* zig_msvc_atomic_load_p32(void volatile* obj) {
3386 return (void*)_InterlockedExchangeAdd(obj, 0);
33623387}
33633388
3364static inline bool zig_msvc_cmpxchg_p32(void** obj, void** expected, void* desired) {
3365 void* comparand = *expected;
3389static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void* desired) {
3390 void* comparand = *(void**)expected;
33663391 void* initial = _InterlockedCompareExchangePointer(obj, desired, comparand);
3367 bool exchanged = initial == comparand;
3368 if (!exchanged) {
3369 *expected = initial;
3370 }
3371 return exchanged;
3392 bool success = initial == comparand;
3393 if (!success) *(void**)expected = initial;
3394 return success;
33723395}
33733396#else /* _M_IX86 */
3374static inline void* zig_msvc_atomicrmw_xchg_p64(void** obj, void* arg) {
3397static inline void* zig_msvc_atomicrmw_xchg_p64(void volatile* obj, void* arg) {
33753398 return _InterlockedExchangePointer(obj, arg);
33763399}
33773400
3378static inline void zig_msvc_atomic_store_p64(void** obj, void* arg) {
3379 _InterlockedExchangePointer(obj, arg);
3401static inline void zig_msvc_atomic_store_p64(void volatile* obj, void* arg) {
3402 (void)_InterlockedExchangePointer(obj, arg);
33803403}
33813404
3382static inline void* zig_msvc_atomic_load_p64(void** obj) {
3383 return (void*)_InterlockedOr64((void*)obj, 0);
3405static inline void* zig_msvc_atomic_load_p64(void volatile* obj) {
3406 return (void*)_InterlockedExchangeAdd64(obj, 0);
33843407}
33853408
3386static inline bool zig_msvc_cmpxchg_p64(void** obj, void** expected, void* desired) {
3387 void* comparand = *expected;
3409static inline bool zig_msvc_cmpxchg_p64(void volatile* obj, void* expected, void* desired) {
3410 void* comparand = *(void**)expected;
33883411 void* initial = _InterlockedCompareExchangePointer(obj, desired, comparand);
3389 bool exchanged = initial == comparand;
3390 if (!exchanged) {
3391 *expected = initial;
3392 }
3393 return exchanged;
3412 bool success = initial == comparand;
3413 if (!success) *(void**)expected = initial;
3414 return success;
33943415}
33953416
33963417static inline bool zig_msvc_cmpxchg_u128(zig_u128 volatile* obj, zig_u128* expected, zig_u128 desired) {
3397 return _InterlockedCompareExchange128((int64_t volatile*)obj, desired.hi, desired.lo, (int64_t*)expected);
3418 return _InterlockedCompareExchange128((__int64 volatile*)obj, (__int64)zig_hi_u128(desired), (__int64)zig_lo_u128(desired), (__int64*)expected);
33983419}
33993420
34003421static inline bool zig_msvc_cmpxchg_i128(zig_i128 volatile* obj, zig_i128* expected, zig_i128 desired) {
3401 return _InterlockedCompareExchange128((int64_t volatile*)obj, desired.hi, desired.lo, (uint64_t*)expected);
3422 return _InterlockedCompareExchange128((__int64 volatile*)obj, (__int64)zig_hi_i128(desired), (__int64)zig_lo_i128(desired), (__int64*)expected);
34023423}
34033424
34043425#define zig_msvc_atomics_128xchg(Type) \
......@@ -3471,16 +3492,16 @@ static inline void* zig_x86_windows_teb(void) {
34713492#if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__)
34723493
34733494static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) {
3474 uint32_t cpu_info[4];
34753495#if _MSC_VER
3496 int cpu_info[4];
34763497 __cpuidex(cpu_info, leaf_id, subid);
3498 *eax = (uint32_t)cpu_info[0];
3499 *ebx = (uint32_t)cpu_info[1];
3500 *ecx = (uint32_t)cpu_info[2];
3501 *edx = (uint32_t)cpu_info[3];
34773502#else
3478 __cpuid_count(leaf_id, subid, cpu_info[0], cpu_info[1], cpu_info[2], cpu_info[3]);
3503 __cpuid_count(leaf_id, subid, *eax, *ebx, *ecx, *edx);
34793504#endif
3480 *eax = cpu_info[0];
3481 *ebx = cpu_info[1];
3482 *ecx = cpu_info[2];
3483 *edx = cpu_info[3];
34843505}
34853506
34863507static inline uint32_t zig_x86_get_xcr0(void) {
stage1/zig1.wasm
Binary files a/stage1/zig1.wasm and b/stage1/zig1.wasm differ