authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-04-21 00:13:41-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-04-21 16:36:31-04:00
loge364627e3ea0de3037ced086406516d956c3bcd7
tree5dd55dbdaab91f4741ba16c138c5c4bdf8b32192
parentb45bcd642052612906e4d333d69a2edac396d7d7

cbe: fix float casts involving f16

Fixes bugs with a previous fix to the f16 abi on x86 darwin.

2 files changed, 47 insertions(+), 38 deletions(-)

lib/zig.h+46-36
...@@ -3358,29 +3358,40 @@ zig_float_from_repr(f128)...@@ -3358,29 +3358,40 @@ zig_float_from_repr(f128)
3358#define zig_cast_f128 (zig_f128)3358#define zig_cast_f128 (zig_f128)
3359#endif3359#endif
33603360
3361#define zig_convert_builtin(ResType, operation, ArgType, version) \3361#define zig_convert_builtin(ExternResType, ResType, operation, ExternArgType, ArgType, version) \
3362 zig_extern ResType zig_expand_concat(zig_expand_concat(zig_expand_concat(__##operation, \3362 zig_extern ExternResType zig_expand_concat(zig_expand_concat(zig_expand_concat(__##operation, \
3363 zig_compiler_rt_abbrev_##ArgType), zig_compiler_rt_abbrev_##ResType), version)(ArgType);3363 zig_compiler_rt_abbrev_##ArgType), zig_compiler_rt_abbrev_##ResType), version)(ExternArgType); \
3364zig_convert_builtin(zig_compiler_rt_f16, trunc, zig_f32, 2)3364 static inline ResType zig_expand_concat(zig_expand_concat(zig_##operation, \
3365zig_convert_builtin(zig_compiler_rt_f16, trunc, zig_f64, 2)3365 zig_compiler_rt_abbrev_##ArgType), zig_compiler_rt_abbrev_##ResType)(ArgType arg) { \
3366zig_convert_builtin(zig_f16, trunc, zig_f80, 2)3366 ResType res; \
3367zig_convert_builtin(zig_f16, trunc, zig_f128, 2)3367 ExternResType extern_res; \
3368zig_convert_builtin(zig_f32, extend, zig_compiler_rt_f16, 2)3368 ExternArgType extern_arg; \
3369zig_convert_builtin(zig_f32, trunc, zig_f64, 2)3369 memcpy(&extern_arg, &arg, sizeof(extern_arg)); \
3370zig_convert_builtin(zig_f32, trunc, zig_f80, 2)3370 extern_res = zig_expand_concat(zig_expand_concat(zig_expand_concat(__##operation, \
3371zig_convert_builtin(zig_f32, trunc, zig_f128, 2)3371 zig_compiler_rt_abbrev_##ArgType), zig_compiler_rt_abbrev_##ResType), version)(extern_arg); \
3372zig_convert_builtin(zig_f64, extend, zig_compiler_rt_f16, 2)3372 memcpy(&res, &extern_res, sizeof(res)); \
3373zig_convert_builtin(zig_f64, extend, zig_f32, 2)3373 return extern_res; \
3374zig_convert_builtin(zig_f64, trunc, zig_f80, 2)3374 }
3375zig_convert_builtin(zig_f64, trunc, zig_f128, 2)3375zig_convert_builtin(zig_compiler_rt_f16, zig_f16, trunc, zig_f32, zig_f32, 2)
3376zig_convert_builtin(zig_f80, extend, zig_f16, 2)3376zig_convert_builtin(zig_compiler_rt_f16, zig_f16, trunc, zig_f64, zig_f64, 2)
3377zig_convert_builtin(zig_f80, extend, zig_f32, 2)3377zig_convert_builtin(zig_f16, zig_f16, trunc, zig_f80, zig_f80, 2)
3378zig_convert_builtin(zig_f80, extend, zig_f64, 2)3378zig_convert_builtin(zig_f16, zig_f16, trunc, zig_f128, zig_f128, 2)
3379zig_convert_builtin(zig_f80, trunc, zig_f128, 2)3379zig_convert_builtin(zig_f32, zig_f32, extend, zig_compiler_rt_f16, zig_f16, 2)
3380zig_convert_builtin(zig_f128, extend, zig_f16, 2)3380zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f64, zig_f64, 2)
3381zig_convert_builtin(zig_f128, extend, zig_f32, 2)3381zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f80, zig_f80, 2)
3382zig_convert_builtin(zig_f128, extend, zig_f64, 2)3382zig_convert_builtin(zig_f32, zig_f32, trunc, zig_f128, zig_f128, 2)
3383zig_convert_builtin(zig_f128, extend, zig_f80, 2)3383zig_convert_builtin(zig_f64, zig_f64, extend, zig_compiler_rt_f16, zig_f16, 2)
3384zig_convert_builtin(zig_f64, zig_f64, extend, zig_f32, zig_f32, 2)
3385zig_convert_builtin(zig_f64, zig_f64, trunc, zig_f80, zig_f80, 2)
3386zig_convert_builtin(zig_f64, zig_f64, trunc, zig_f128, zig_f128, 2)
3387zig_convert_builtin(zig_f80, zig_f80, extend, zig_f16, zig_f16, 2)
3388zig_convert_builtin(zig_f80, zig_f80, extend, zig_f32, zig_f32, 2)
3389zig_convert_builtin(zig_f80, zig_f80, extend, zig_f64, zig_f64, 2)
3390zig_convert_builtin(zig_f80, zig_f80, trunc, zig_f128, zig_f128, 2)
3391zig_convert_builtin(zig_f128, zig_f128, extend, zig_f16, zig_f16, 2)
3392zig_convert_builtin(zig_f128, zig_f128, extend, zig_f32, zig_f32, 2)
3393zig_convert_builtin(zig_f128, zig_f128, extend, zig_f64, zig_f64, 2)
3394zig_convert_builtin(zig_f128, zig_f128, extend, zig_f80, zig_f80, 2)
33843395
3385#define zig_float_negate_builtin_0(w, r, c, sb) zig_xor_u##r(arg, zig_make_f##w(-0x0.0p0, c sb))3396#define zig_float_negate_builtin_0(w, r, c, sb) zig_xor_u##r(arg, zig_make_f##w(-0x0.0p0, c sb))
3386#define zig_float_negate_builtin_1(w, r, c, sb) -arg3397#define zig_float_negate_builtin_1(w, r, c, sb) -arg
...@@ -3424,19 +3435,18 @@ zig_float_negate_builtin(128, 128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0...@@ -3424,19 +3435,18 @@ zig_float_negate_builtin(128, 128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0
3424 }3435 }
34253436
3426#define zig_float_builtins(w) \3437#define zig_float_builtins(w) \
3427 zig_convert_builtin( int32_t, fix, zig_f##w, ) \3438 zig_convert_builtin( int32_t, int32_t, fix, zig_f##w, zig_f##w, ) \
3428 zig_convert_builtin(uint32_t, fixuns, zig_f##w, ) \3439 zig_convert_builtin(uint32_t, uint32_t, fixuns, zig_f##w, zig_f##w, ) \
3429 zig_convert_builtin( int64_t, fix, zig_f##w, ) \3440 zig_convert_builtin( int64_t, int64_t, fix, zig_f##w, zig_f##w, ) \
3430 zig_convert_builtin(uint64_t, fixuns, zig_f##w, ) \3441 zig_convert_builtin(uint64_t, uint64_t, fixuns, zig_f##w, zig_f##w, ) \
3431 zig_convert_builtin(zig_i128, fix, zig_f##w, ) \3442 zig_convert_builtin(zig_i128, zig_i128, fix, zig_f##w, zig_f##w, ) \
3432 zig_convert_builtin(zig_u128, fixuns, zig_f##w, ) \3443 zig_convert_builtin(zig_u128, zig_u128, fixuns, zig_f##w, zig_f##w, ) \
3433 zig_convert_builtin(zig_f##w, float, int32_t, ) \3444 zig_convert_builtin(zig_f##w, zig_f##w, float, int32_t, int32_t, ) \
3434 zig_convert_builtin(zig_f##w, floatun, uint32_t, ) \3445 zig_convert_builtin(zig_f##w, zig_f##w, floatun, uint32_t, uint32_t, ) \
3435 zig_convert_builtin(zig_f##w, float, int64_t, ) \3446 zig_convert_builtin(zig_f##w, zig_f##w, float, int64_t, int64_t, ) \
3436 zig_convert_builtin(zig_f##w, floatun, uint64_t, ) \3447 zig_convert_builtin(zig_f##w, zig_f##w, floatun, uint64_t, uint64_t, ) \
3437 zig_convert_builtin(zig_f##w, float, zig_i128, ) \3448 zig_convert_builtin(zig_f##w, zig_f##w, float, zig_i128, zig_i128, ) \
3438 zig_convert_builtin(zig_f##w, floatun, zig_u128, ) \3449 zig_convert_builtin(zig_f##w, zig_f##w, floatun, zig_u128, zig_u128, ) \
3439 zig_expand_concat(zig_float_negate_builtin_, zig_has_f##w)(w) \
3440 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, cmp) \3450 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, cmp) \
3441 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, ne) \3451 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, ne) \
3442 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, eq) \3452 zig_expand_concat(zig_float_less_builtin_, zig_has_f##w)(f##w, eq) \
src/codegen/c.zig+1-2
...@@ -5755,11 +5755,10 @@ fn airFloatCast(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -5755,11 +5755,10 @@ fn airFloatCast(f: *Function, inst: Air.Inst.Index) !CValue {
5755 try f.object.dg.renderTypeForBuiltinFnName(writer, inst_ty);5755 try f.object.dg.renderTypeForBuiltinFnName(writer, inst_ty);
5756 try writer.writeByte('(');5756 try writer.writeByte('(');
5757 }5757 }
5758 try writer.writeAll("__");5758 try writer.writeAll("zig_");
5759 try writer.writeAll(operation);5759 try writer.writeAll(operation);
5760 try writer.writeAll(compilerRtAbbrev(operand_ty, target));5760 try writer.writeAll(compilerRtAbbrev(operand_ty, target));
5761 try writer.writeAll(compilerRtAbbrev(inst_ty, target));5761 try writer.writeAll(compilerRtAbbrev(inst_ty, target));
5762 if (inst_ty.isRuntimeFloat() and operand_ty.isRuntimeFloat()) try writer.writeByte('2');
5763 try writer.writeByte('(');5762 try writer.writeByte('(');
5764 try f.writeCValue(writer, operand, .FunctionArgument);5763 try f.writeCValue(writer, operand, .FunctionArgument);
5765 try writer.writeByte(')');5764 try writer.writeByte(')');