| ... | @@ -1397,6 +1397,10 @@ static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) { | ... | @@ -1397,6 +1397,10 @@ static inline zig_i128 zig_mod_i128(zig_i128 lhs, zig_i128 rhs) { |
| 1397 | #define zig_div_floor_u128 zig_div_trunc_u128 | 1397 | #define zig_div_floor_u128 zig_div_trunc_u128 |
| 1398 | #define zig_mod_u128 zig_rem_u128 | 1398 | #define zig_mod_u128 zig_rem_u128 |
| 1399 | | 1399 | |
| | 1400 | static inline zig_u128 zig_nand_u128(zig_u128 lhs, zig_u128 rhs) { |
| | 1401 | return zig_not_u128(zig_and_u128(lhs, rhs), 128); |
| | 1402 | } |
| | 1403 | |
| 1400 | static inline zig_u128 zig_min_u128(zig_u128 lhs, zig_u128 rhs) { | 1404 | static inline zig_u128 zig_min_u128(zig_u128 lhs, zig_u128 rhs) { |
| 1401 | return zig_cmp_u128(lhs, rhs) < zig_as_i32(0) ? lhs : rhs; | 1405 | return zig_cmp_u128(lhs, rhs) < zig_as_i32(0) ? lhs : rhs; |
| 1402 | } | 1406 | } |
| ... | @@ -2237,4 +2241,40 @@ static inline bool zig_msvc_cmpxchg_i128(zig_i128 volatile* obj, zig_i128* expec | ... | @@ -2237,4 +2241,40 @@ static inline bool zig_msvc_cmpxchg_i128(zig_i128 volatile* obj, zig_i128* expec |
| 2237 | return _InterlockedCompareExchange128((zig_i64 volatile*)obj, desired.hi, desired.lo, (zig_u64*)expected); | 2241 | return _InterlockedCompareExchange128((zig_i64 volatile*)obj, desired.hi, desired.lo, (zig_u64*)expected); |
| 2238 | } | 2242 | } |
| 2239 | | 2243 | |
| | 2244 | #define zig_msvc_atomics_128xchg(Type) \ |
| | 2245 | static inline zig_##Type zig_msvc_atomicrmw_xchg_##Type(zig_##Type volatile* obj, zig_##Type value) { \ |
| | 2246 | bool success = false; \ |
| | 2247 | zig_##Type prev; \ |
| | 2248 | while (!success) { \ |
| | 2249 | prev = *obj; \ |
| | 2250 | success = zig_msvc_cmpxchg_##Type(obj, &prev, value); \ |
| | 2251 | } \ |
| | 2252 | return prev; \ |
| | 2253 | } |
| | 2254 | |
| | 2255 | zig_msvc_atomics_128xchg(u128) |
| | 2256 | zig_msvc_atomics_128xchg(i128) |
| | 2257 | |
| | 2258 | #define zig_msvc_atomics_128op(Type, operation) \ |
| | 2259 | static inline zig_##Type zig_msvc_atomicrmw_##operation##_##Type(zig_##Type volatile* obj, zig_##Type value) { \ |
| | 2260 | bool success = false; \ |
| | 2261 | zig_##Type new; \ |
| | 2262 | zig_##Type prev; \ |
| | 2263 | while (!success) { \ |
| | 2264 | prev = *obj; \ |
| | 2265 | new = zig_##operation##_##Type(prev, value); \ |
| | 2266 | success = zig_msvc_cmpxchg_##Type(obj, &prev, new); \ |
| | 2267 | } \ |
| | 2268 | return prev; \ |
| | 2269 | } |
| | 2270 | |
| | 2271 | zig_msvc_atomics_128op(u128, add) |
| | 2272 | zig_msvc_atomics_128op(u128, sub) |
| | 2273 | zig_msvc_atomics_128op(u128, or) |
| | 2274 | zig_msvc_atomics_128op(u128, xor) |
| | 2275 | zig_msvc_atomics_128op(u128, and) |
| | 2276 | zig_msvc_atomics_128op(u128, nand) |
| | 2277 | zig_msvc_atomics_128op(u128, min) |
| | 2278 | zig_msvc_atomics_128op(u128, max) |
| | 2279 | |
| 2240 | #endif | 2280 | #endif |