| ... | ... | @@ -1176,10 +1176,10 @@ typedef signed __int128 zig_i128; |
| 1176 | 1176 | |
| 1177 | 1177 | #if zig_little_endian |
| 1178 | 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 | 1180 | #else |
| 1181 | 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 | 1183 | #endif |
| 1184 | 1184 | |
| 1185 | 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 | 3197 | zig_convert_builtin(zig_f16, zig_f16, trunc, zig_f80, zig_f80, 2) |
| 3198 | 3198 | zig_convert_builtin(zig_f16, zig_f16, trunc, zig_f128, zig_f128, 2) |
| 3199 | 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 | 3200 | zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f80, zig_f80, 2) |
| 3202 | 3201 | zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f128, zig_f128, 2) |
| 3203 | 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 | 3203 | zig_convert_builtin(zig_f64, zig_f64, trunc, zig_f80, zig_f80, 2) |
| 3206 | 3204 | zig_convert_builtin(zig_f64, zig_f64, trunc, zig_f128, zig_f128, 2) |
| 3207 | 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 | 3211 | zig_convert_builtin(zig_f128, zig_f128, extend, zig_f64, zig_f64, 2) |
| 3214 | 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 | 3229 | #define zig_float_negate_builtin_0(w, c, sb) \ |
| 3217 | 3230 | zig_expand_concat(zig_xor_, zig_repr_f##w)(arg, zig_make_f##w(-0x0.0p0, c sb)) |
| 3218 | 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 | 3268 | return lhs operator rhs; \ |
| 3256 | 3269 | } |
| 3257 | 3270 | |
| 3258 | | #define zig_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, ) \ |
| 3271 | #define zig_common_float_builtins(w) \ |
| 3261 | 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 | 3273 | zig_convert_builtin(zig_i128, zig_i128, fix, zig_f##w, zig_f##w, ) \ |
| 3264 | 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 | 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 | 3276 | zig_convert_builtin(zig_f##w, zig_f##w, float, zig_i128, zig_i128, ) \ |
| 3270 | 3277 | zig_convert_builtin(zig_f##w, zig_f##w, floatun, zig_u128, zig_u128, ) \ |
| 3271 | 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 | 3316 | static inline zig_f##w zig_mod_f##w(zig_f##w lhs, zig_f##w rhs) { \ |
| 3310 | 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 | 3332 | zig_float_builtins(16) |
| 3313 | | zig_float_builtins(32) |
| 3314 | | zig_float_builtins(64) |
| 3315 | 3333 | zig_float_builtins(80) |
| 3316 | 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 | 3381 | /* ============================ Atomics Support ============================= */ |
| 3319 | 3382 | |
| 3320 | 3383 | /* Note that atomics should be implemented as macros because most |