| ... | @@ -1176,10 +1176,10 @@ typedef signed __int128 zig_i128; | ... | @@ -1176,10 +1176,10 @@ typedef signed __int128 zig_i128; |
| 1176 | | 1176 | |
| 1177 | #if zig_little_endian | 1177 | #if zig_little_endian |
| 1178 | typedef struct { zig_align(16) uint64_t lo; uint64_t hi; } zig_u128; | 1178 | typedef struct { zig_align(16) uint64_t lo; uint64_t hi; } zig_u128; |
| 1179 | typedef struct { zig_align(16) uint64_t lo; int64_t hi; } zig_i128; | 1179 | typedef struct { zig_align(16) uint64_t lo; int64_t hi; } zig_i128; |
| 1180 | #else | 1180 | #else |
| 1181 | typedef struct { zig_align(16) uint64_t hi; uint64_t lo; } zig_u128; | 1181 | typedef struct { zig_align(16) uint64_t hi; uint64_t lo; } zig_u128; |
| 1182 | typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128; | 1182 | typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128; |
| 1183 | #endif | 1183 | #endif |
| 1184 | | 1184 | |
| 1185 | #define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) }) | 1185 | #define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) }) |
| ... | @@ -3197,11 +3197,9 @@ zig_convert_builtin(zig_compiler_rt_f16, zig_f16, trunc, zig_f64, | ... | @@ -3197,11 +3197,9 @@ zig_convert_builtin(zig_compiler_rt_f16, zig_f16, trunc, zig_f64, |
| 3197 | zig_convert_builtin(zig_f16, zig_f16, trunc, zig_f80, zig_f80, 2) | 3197 | zig_convert_builtin(zig_f16, zig_f16, trunc, zig_f80, zig_f80, 2) |
| 3198 | zig_convert_builtin(zig_f16, zig_f16, trunc, zig_f128, zig_f128, 2) | 3198 | zig_convert_builtin(zig_f16, zig_f16, trunc, zig_f128, zig_f128, 2) |
| 3199 | zig_convert_builtin(zig_f32, zig_f32, extend, zig_compiler_rt_f16, zig_f16, 2) | 3199 | zig_convert_builtin(zig_f32, zig_f32, extend, zig_compiler_rt_f16, zig_f16, 2) |
| 3200 | zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f64, zig_f64, 2) | | |
| 3201 | zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f80, zig_f80, 2) | 3200 | zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f80, zig_f80, 2) |
| 3202 | zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f128, zig_f128, 2) | 3201 | zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f128, zig_f128, 2) |
| 3203 | zig_convert_builtin(zig_f64, zig_f64, extend, zig_compiler_rt_f16, zig_f16, 2) | 3202 | zig_convert_builtin(zig_f64, zig_f64, extend, zig_compiler_rt_f16, zig_f16, 2) |
| 3204 | zig_convert_builtin(zig_f64, zig_f64, extend, zig_f32, zig_f32, 2) | | |
| 3205 | zig_convert_builtin(zig_f64, zig_f64, trunc, zig_f80, zig_f80, 2) | 3203 | zig_convert_builtin(zig_f64, zig_f64, trunc, zig_f80, zig_f80, 2) |
| 3206 | zig_convert_builtin(zig_f64, zig_f64, trunc, zig_f128, zig_f128, 2) | 3204 | zig_convert_builtin(zig_f64, zig_f64, trunc, zig_f128, zig_f128, 2) |
| 3207 | zig_convert_builtin(zig_f80, zig_f80, extend, zig_f16, zig_f16, 2) | 3205 | zig_convert_builtin(zig_f80, zig_f80, extend, zig_f16, zig_f16, 2) |
| ... | @@ -3213,6 +3211,21 @@ zig_convert_builtin(zig_f128, zig_f128, extend, zig_f32, | ... | @@ -3213,6 +3211,21 @@ zig_convert_builtin(zig_f128, zig_f128, extend, zig_f32, |
| 3213 | zig_convert_builtin(zig_f128, zig_f128, extend, zig_f64, zig_f64, 2) | 3211 | zig_convert_builtin(zig_f128, zig_f128, extend, zig_f64, zig_f64, 2) |
| 3214 | zig_convert_builtin(zig_f128, zig_f128, extend, zig_f80, zig_f80, 2) | 3212 | zig_convert_builtin(zig_f128, zig_f128, extend, zig_f80, zig_f80, 2) |
| 3215 | | 3213 | |
| | 3214 | #ifdef __ARM_EABI__ |
| | 3215 | |
| | 3216 | zig_extern zig_callconv(pcs("aapcs")) zig_f32 __aeabi_d2f(zig_f64); |
| | 3217 | static inline zig_f32 zig_truncdfsf(zig_f64 arg) { return __aeabi_d2f(arg); } |
| | 3218 | |
| | 3219 | zig_extern zig_callconv(pcs("aapcs")) zig_f64 __aeabi_f2d(zig_f32); |
| | 3220 | static inline zig_f64 zig_extendsfdf(zig_f32 arg) { return __aeabi_f2d(arg); } |
| | 3221 | |
| | 3222 | #else /* __ARM_EABI__ */ |
| | 3223 | |
| | 3224 | zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f64, zig_f64, 2) |
| | 3225 | zig_convert_builtin(zig_f64, zig_f64, extend, zig_f32, zig_f32, 2) |
| | 3226 | |
| | 3227 | #endif /* __ARM_EABI__ */ |
| | 3228 | |
| 3216 | #define zig_float_negate_builtin_0(w, c, sb) \ | 3229 | #define zig_float_negate_builtin_0(w, c, sb) \ |
| 3217 | zig_expand_concat(zig_xor_, zig_repr_f##w)(arg, zig_make_f##w(-0x0.0p0, c sb)) | 3230 | zig_expand_concat(zig_xor_, zig_repr_f##w)(arg, zig_make_f##w(-0x0.0p0, c sb)) |
| 3218 | #define zig_float_negate_builtin_1(w, c, sb) -arg | 3231 | #define zig_float_negate_builtin_1(w, c, sb) -arg |
| ... | @@ -3255,17 +3268,11 @@ zig_float_negate_builtin(128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0))) | ... | @@ -3255,17 +3268,11 @@ zig_float_negate_builtin(128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0))) |
| 3255 | return lhs operator rhs; \ | 3268 | return lhs operator rhs; \ |
| 3256 | } | 3269 | } |
| 3257 | | 3270 | |
| 3258 | #define zig_float_builtins(w) \ | 3271 | #define zig_common_float_builtins(w) \ |
| 3259 | zig_convert_builtin( int32_t, int32_t, fix, zig_f##w, zig_f##w, ) \ | | |
| 3260 | zig_convert_builtin(uint32_t, uint32_t, fixuns, zig_f##w, zig_f##w, ) \ | | |
| 3261 | zig_convert_builtin( int64_t, int64_t, fix, zig_f##w, zig_f##w, ) \ | 3272 | zig_convert_builtin( int64_t, int64_t, fix, zig_f##w, zig_f##w, ) \ |
| 3262 | zig_convert_builtin(uint64_t, uint64_t, fixuns, zig_f##w, zig_f##w, ) \ | | |
| 3263 | zig_convert_builtin(zig_i128, zig_i128, fix, zig_f##w, zig_f##w, ) \ | 3273 | zig_convert_builtin(zig_i128, zig_i128, fix, zig_f##w, zig_f##w, ) \ |
| 3264 | zig_convert_builtin(zig_u128, zig_u128, fixuns, zig_f##w, zig_f##w, ) \ | 3274 | zig_convert_builtin(zig_u128, zig_u128, fixuns, zig_f##w, zig_f##w, ) \ |
| 3265 | zig_convert_builtin(zig_f##w, zig_f##w, float, int32_t, int32_t, ) \ | | |
| 3266 | zig_convert_builtin(zig_f##w, zig_f##w, floatun, uint32_t, uint32_t, ) \ | | |
| 3267 | zig_convert_builtin(zig_f##w, zig_f##w, float, int64_t, int64_t, ) \ | 3275 | zig_convert_builtin(zig_f##w, zig_f##w, float, int64_t, int64_t, ) \ |
| 3268 | zig_convert_builtin(zig_f##w, zig_f##w, floatun, uint64_t, uint64_t, ) \ | | |
| 3269 | zig_convert_builtin(zig_f##w, zig_f##w, float, zig_i128, zig_i128, ) \ | 3276 | zig_convert_builtin(zig_f##w, zig_f##w, float, zig_i128, zig_i128, ) \ |
| 3270 | zig_convert_builtin(zig_f##w, zig_f##w, floatun, zig_u128, zig_u128, ) \ | 3277 | zig_convert_builtin(zig_f##w, zig_f##w, floatun, zig_u128, zig_u128, ) \ |
| 3271 | zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, cmp) \ | 3278 | zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, cmp) \ |
| ... | @@ -3309,12 +3316,68 @@ zig_float_negate_builtin(128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0))) | ... | @@ -3309,12 +3316,68 @@ zig_float_negate_builtin(128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0))) |
| 3309 | static inline zig_f##w zig_mod_f##w(zig_f##w lhs, zig_f##w rhs) { \ | 3316 | static inline zig_f##w zig_mod_f##w(zig_f##w lhs, zig_f##w rhs) { \ |
| 3310 | return zig_sub_f##w(lhs, zig_mul_f##w(zig_div_floor_f##w(lhs, rhs), rhs)); \ | 3317 | return zig_sub_f##w(lhs, zig_mul_f##w(zig_div_floor_f##w(lhs, rhs), rhs)); \ |
| 3311 | } | 3318 | } |
| | 3319 | zig_common_float_builtins(16) |
| | 3320 | zig_common_float_builtins(32) |
| | 3321 | zig_common_float_builtins(64) |
| | 3322 | zig_common_float_builtins(80) |
| | 3323 | zig_common_float_builtins(128) |
| | 3324 | |
| | 3325 | #define zig_float_builtins(w) \ |
| | 3326 | zig_convert_builtin( int32_t, int32_t, fix, zig_f##w, zig_f##w, ) \ |
| | 3327 | zig_convert_builtin(uint32_t, uint32_t, fixuns, zig_f##w, zig_f##w, ) \ |
| | 3328 | zig_convert_builtin(uint64_t, uint64_t, fixuns, zig_f##w, zig_f##w, ) \ |
| | 3329 | zig_convert_builtin(zig_f##w, zig_f##w, float, int32_t, int32_t, ) \ |
| | 3330 | zig_convert_builtin(zig_f##w, zig_f##w, floatun, uint32_t, uint32_t, ) \ |
| | 3331 | zig_convert_builtin(zig_f##w, zig_f##w, floatun, uint64_t, uint64_t, ) |
| 3312 | zig_float_builtins(16) | 3332 | zig_float_builtins(16) |
| 3313 | zig_float_builtins(32) | | |
| 3314 | zig_float_builtins(64) | | |
| 3315 | zig_float_builtins(80) | 3333 | zig_float_builtins(80) |
| 3316 | zig_float_builtins(128) | 3334 | zig_float_builtins(128) |
| 3317 | | 3335 | |
| | 3336 | #ifdef __ARM_EABI__ |
| | 3337 | |
| | 3338 | zig_extern zig_callconv(pcs("aapcs")) int32_t __aeabi_f2iz(zig_f32); |
| | 3339 | static inline int32_t zig_fixsfsi(zig_f32 arg) { return __aeabi_f2iz(arg); } |
| | 3340 | |
| | 3341 | zig_extern zig_callconv(pcs("aapcs")) uint32_t __aeabi_f2uiz(zig_f32); |
| | 3342 | static inline uint32_t zig_fixunssfsi(zig_f32 arg) { return __aeabi_f2uiz(arg); } |
| | 3343 | |
| | 3344 | zig_extern zig_callconv(pcs("aapcs")) uint64_t __aeabi_f2ulz(zig_f32); |
| | 3345 | static inline uint64_t zig_fixunssfdi(zig_f32 arg) { return __aeabi_f2ulz(arg); } |
| | 3346 | |
| | 3347 | zig_extern zig_callconv(pcs("aapcs")) zig_f32 __aeabi_i2f(int32_t); |
| | 3348 | static inline zig_f32 zig_floatsisf(int32_t arg) { return __aeabi_i2f(arg); } |
| | 3349 | |
| | 3350 | zig_extern zig_callconv(pcs("aapcs")) zig_f32 __aeabi_ui2f(uint32_t); |
| | 3351 | static inline zig_f32 zig_floatunsisf(uint32_t arg) { return __aeabi_ui2f(arg); } |
| | 3352 | |
| | 3353 | zig_extern zig_callconv(pcs("aapcs")) zig_f32 __aeabi_ul2f(uint64_t); |
| | 3354 | static inline zig_f32 zig_floatundisf(uint64_t arg) { return __aeabi_ul2f(arg); } |
| | 3355 | |
| | 3356 | zig_extern zig_callconv(pcs("aapcs")) int32_t __aeabi_d2iz(zig_f64); |
| | 3357 | static inline int32_t zig_fixdfsi(zig_f64 arg) { return __aeabi_d2iz(arg); } |
| | 3358 | |
| | 3359 | zig_extern zig_callconv(pcs("aapcs")) uint32_t __aeabi_d2uiz(zig_f64); |
| | 3360 | static inline uint32_t zig_fixunsdfsi(zig_f64 arg) { return __aeabi_d2uiz(arg); } |
| | 3361 | |
| | 3362 | zig_extern zig_callconv(pcs("aapcs")) uint64_t __aeabi_d2ulz(zig_f64); |
| | 3363 | static inline uint64_t zig_fixunsdfdi(zig_f64 arg) { return __aeabi_d2ulz(arg); } |
| | 3364 | |
| | 3365 | zig_extern zig_callconv(pcs("aapcs")) zig_f64 __aeabi_i2d(int32_t); |
| | 3366 | static inline zig_f64 zig_floatsidf(int32_t arg) { return __aeabi_i2d(arg); } |
| | 3367 | |
| | 3368 | zig_extern zig_callconv(pcs("aapcs")) zig_f64 __aeabi_ui2d(uint32_t); |
| | 3369 | static inline zig_f64 zig_floatunsidf(uint32_t arg) { return __aeabi_ui2d(arg); } |
| | 3370 | |
| | 3371 | zig_extern zig_callconv(pcs("aapcs")) zig_f64 __aeabi_ul2d(uint64_t); |
| | 3372 | static inline zig_f64 zig_floatundidf(uint64_t arg) { return __aeabi_ul2d(arg); } |
| | 3373 | |
| | 3374 | #else /* __ARM_EABI__ */ |
| | 3375 | |
| | 3376 | zig_float_builtins(32) |
| | 3377 | zig_float_builtins(64) |
| | 3378 | |
| | 3379 | #endif /* __ARM_EABI__ */ |
| | 3380 | |
| 3318 | /* ============================ Atomics Support ============================= */ | 3381 | /* ============================ Atomics Support ============================= */ |
| 3319 | | 3382 | |
| 3320 | /* Note that atomics should be implemented as macros because most | 3383 | /* Note that atomics should be implemented as macros because most |