authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-04-21 13:30:40-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-04-21 16:36:31-04:00
logb45bcd642052612906e4d333d69a2edac396d7d7
tree72b0a26294051982b57aba0ad5b66a3fddd87fef
parentd9596a128fe3c6b141cc6e82bc80c64646342dbf

cbe: fix f128 and c_longdouble abi

Fixes the abi of `f128` on darwin and/or aarch64. Also, when `double` and `long double` were the same size, we used to incorrectly define `zig_c_longdouble` as `zig_f128`.

1 files changed, 42 insertions(+), 76 deletions(-)

lib/zig.h+42-76
...@@ -559,15 +559,6 @@ typedef ptrdiff_t intptr_t;...@@ -559,15 +559,6 @@ typedef ptrdiff_t intptr_t;
559559
560#endif560#endif
561561
562#define zig_make_small_i8(val) INT8_C(val)
563#define zig_make_small_u8(val) UINT8_C(val)
564#define zig_make_small_i16(val) INT16_C(val)
565#define zig_make_small_u16(val) UINT16_C(val)
566#define zig_make_small_i32(val) INT32_C(val)
567#define zig_make_small_u32(val) UINT32_C(val)
568#define zig_make_small_i64(val) INT64_C(val)
569#define zig_make_small_u64(val) UINT64_C(val)
570
571#define zig_minInt_i8 INT8_MIN562#define zig_minInt_i8 INT8_MIN
572#define zig_maxInt_i8 INT8_MAX563#define zig_maxInt_i8 INT8_MAX
573#define zig_minInt_u8 UINT8_C(0)564#define zig_minInt_u8 UINT8_C(0)
...@@ -1360,9 +1351,6 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;...@@ -1360,9 +1351,6 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128;
13601351
1361#endif /* zig_has_int128 */1352#endif /* zig_has_int128 */
13621353
1363#define zig_make_small_u128(val) zig_make_u128(0, val)
1364#define zig_make_small_i128(val) zig_make_i128((val) < 0 ? -INT64_C(1) : INT64_C(0), val)
1365
1366#define zig_minInt_u128 zig_make_u128(zig_minInt_u64, zig_minInt_u64)1354#define zig_minInt_u128 zig_make_u128(zig_minInt_u64, zig_minInt_u64)
1367#define zig_maxInt_u128 zig_make_u128(zig_maxInt_u64, zig_maxInt_u64)1355#define zig_maxInt_u128 zig_make_u128(zig_maxInt_u64, zig_maxInt_u64)
1368#define zig_minInt_i128 zig_make_i128(zig_minInt_i64, zig_minInt_u64)1356#define zig_minInt_i128 zig_make_i128(zig_minInt_i64, zig_minInt_u64)
...@@ -3148,10 +3136,6 @@ typedef float zig_f16;...@@ -3148,10 +3136,6 @@ typedef float zig_f16;
3148typedef double zig_f16;3136typedef double zig_f16;
3149#define zig_make_f16(fp, repr) fp3137#define zig_make_f16(fp, repr) fp
3150#elif LDBL_MANT_DIG == 113138#elif LDBL_MANT_DIG == 11
3151#define zig_bitSizeOf_c_longdouble 16
3152#ifndef ZIG_TARGET_ABI_MSVC
3153typedef zig_repr_f16 zig_repr_c_longdouble;
3154#endif
3155typedef long double zig_f16;3139typedef long double zig_f16;
3156#define zig_make_f16(fp, repr) fp##l3140#define zig_make_f16(fp, repr) fp##l
3157#elif FLT16_MANT_DIG == 11 && (zig_has_builtin(inff16) || defined(zig_gnuc))3141#elif FLT16_MANT_DIG == 11 && (zig_has_builtin(inff16) || defined(zig_gnuc))
...@@ -3163,7 +3147,6 @@ typedef __fp16 zig_f16;...@@ -3163,7 +3147,6 @@ typedef __fp16 zig_f16;
3163#else3147#else
3164#undef zig_has_f163148#undef zig_has_f16
3165#define zig_has_f16 03149#define zig_has_f16 0
3166#define zig_bitSizeOf_repr_f16 16
3167typedef zig_repr_f16 zig_f16;3150typedef zig_repr_f16 zig_f16;
3168#define zig_make_f16(fp, repr) repr3151#define zig_make_f16(fp, repr) repr
3169#undef zig_make_special_f163152#undef zig_make_special_f16
...@@ -3176,7 +3159,6 @@ typedef zig_repr_f16 zig_compiler_rt_f16;...@@ -3176,7 +3159,6 @@ typedef zig_repr_f16 zig_compiler_rt_f16;
3176#else3159#else
3177typedef zig_f16 zig_compiler_rt_f16;3160typedef zig_f16 zig_compiler_rt_f16;
3178#endif3161#endif
3179#define zig_compiler_rt_abbrev_zig_compiler_rt_f16 zig_compiler_rt_abbrev_zig_f16
31803162
3181#define zig_has_f32 13163#define zig_has_f32 1
3182#define zig_bitSizeOf_f32 323164#define zig_bitSizeOf_f32 32
...@@ -3194,10 +3176,6 @@ typedef float zig_f32;...@@ -3194,10 +3176,6 @@ typedef float zig_f32;
3194typedef double zig_f32;3176typedef double zig_f32;
3195#define zig_make_f32(fp, repr) fp3177#define zig_make_f32(fp, repr) fp
3196#elif LDBL_MANT_DIG == 243178#elif LDBL_MANT_DIG == 24
3197#define zig_bitSizeOf_c_longdouble 32
3198#ifndef ZIG_TARGET_ABI_MSVC
3199typedef zig_repr_f32 zig_repr_c_longdouble;
3200#endif
3201typedef long double zig_f32;3179typedef long double zig_f32;
3202#define zig_make_f32(fp, repr) fp##l3180#define zig_make_f32(fp, repr) fp##l
3203#elif FLT32_MANT_DIG == 243181#elif FLT32_MANT_DIG == 24
...@@ -3206,7 +3184,6 @@ typedef _Float32 zig_f32;...@@ -3206,7 +3184,6 @@ typedef _Float32 zig_f32;
3206#else3184#else
3207#undef zig_has_f323185#undef zig_has_f32
3208#define zig_has_f32 03186#define zig_has_f32 0
3209#define zig_bitSizeOf_repr_f32 32
3210typedef zig_repr_f32 zig_f32;3187typedef zig_repr_f32 zig_f32;
3211#define zig_make_f32(fp, repr) repr3188#define zig_make_f32(fp, repr) repr
3212#undef zig_make_special_f323189#undef zig_make_special_f32
...@@ -3220,16 +3197,10 @@ typedef zig_repr_f32 zig_f32;...@@ -3220,16 +3197,10 @@ typedef zig_repr_f32 zig_f32;
3220typedef uint64_t zig_repr_f64;3197typedef uint64_t zig_repr_f64;
3221#define zig_libc_name_f64(name) name3198#define zig_libc_name_f64(name) name
3222#if _MSC_VER3199#if _MSC_VER
3223#ifdef ZIG_TARGET_ABI_MSVC
3224#define zig_bitSizeOf_c_longdouble 64
3225#ifndef ZIG_TARGET_ABI_MSVC
3226typedef zig_repr_f64 zig_repr_c_longdouble;
3227#endif
3228#endif
3229#define zig_init_special_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, )3200#define zig_init_special_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, )
3230#else /* _MSC_VER */3201#else
3231#define zig_init_special_f64(sign, name, arg, repr) zig_make_special_f64(sign, name, arg, repr)3202#define zig_init_special_f64(sign, name, arg, repr) zig_make_special_f64(sign, name, arg, repr)
3232#endif /* _MSC_VER */3203#endif
3233#if FLT_MANT_DIG == 533204#if FLT_MANT_DIG == 53
3234typedef float zig_f64;3205typedef float zig_f64;
3235#define zig_make_f64(fp, repr) fp##f3206#define zig_make_f64(fp, repr) fp##f
...@@ -3237,10 +3208,6 @@ typedef float zig_f64;...@@ -3237,10 +3208,6 @@ typedef float zig_f64;
3237typedef double zig_f64;3208typedef double zig_f64;
3238#define zig_make_f64(fp, repr) fp3209#define zig_make_f64(fp, repr) fp
3239#elif LDBL_MANT_DIG == 533210#elif LDBL_MANT_DIG == 53
3240#define zig_bitSizeOf_c_longdouble 64
3241#ifndef ZIG_TARGET_ABI_MSVC
3242typedef zig_repr_f64 zig_repr_c_longdouble;
3243#endif
3244typedef long double zig_f64;3211typedef long double zig_f64;
3245#define zig_make_f64(fp, repr) fp##l3212#define zig_make_f64(fp, repr) fp##l
3246#elif FLT64_MANT_DIG == 533213#elif FLT64_MANT_DIG == 53
...@@ -3252,7 +3219,6 @@ typedef _Float32x zig_f64;...@@ -3252,7 +3219,6 @@ typedef _Float32x zig_f64;
3252#else3219#else
3253#undef zig_has_f643220#undef zig_has_f64
3254#define zig_has_f64 03221#define zig_has_f64 0
3255#define zig_bitSizeOf_repr_f64 64
3256typedef zig_repr_f64 zig_f64;3222typedef zig_repr_f64 zig_f64;
3257#define zig_make_f64(fp, repr) repr3223#define zig_make_f64(fp, repr) repr
3258#undef zig_make_special_f643224#undef zig_make_special_f64
...@@ -3273,10 +3239,6 @@ typedef float zig_f80;...@@ -3273,10 +3239,6 @@ typedef float zig_f80;
3273typedef double zig_f80;3239typedef double zig_f80;
3274#define zig_make_f80(fp, repr) fp3240#define zig_make_f80(fp, repr) fp
3275#elif LDBL_MANT_DIG == 643241#elif LDBL_MANT_DIG == 64
3276#define zig_bitSizeOf_c_longdouble 80
3277#ifndef ZIG_TARGET_ABI_MSVC
3278typedef zig_repr_f80 zig_repr_c_longdouble;
3279#endif
3280typedef long double zig_f80;3242typedef long double zig_f80;
3281#define zig_make_f80(fp, repr) fp##l3243#define zig_make_f80(fp, repr) fp##l
3282#elif FLT80_MANT_DIG == 643244#elif FLT80_MANT_DIG == 64
...@@ -3291,7 +3253,6 @@ typedef __float80 zig_f80;...@@ -3291,7 +3253,6 @@ typedef __float80 zig_f80;
3291#else3253#else
3292#undef zig_has_f803254#undef zig_has_f80
3293#define zig_has_f80 03255#define zig_has_f80 0
3294#define zig_bitSizeOf_repr_f80 128
3295typedef zig_repr_f80 zig_f80;3256typedef zig_repr_f80 zig_f80;
3296#define zig_make_f80(fp, repr) repr3257#define zig_make_f80(fp, repr) repr
3297#undef zig_make_special_f803258#undef zig_make_special_f80
...@@ -3312,10 +3273,6 @@ typedef float zig_f128;...@@ -3312,10 +3273,6 @@ typedef float zig_f128;
3312typedef double zig_f128;3273typedef double zig_f128;
3313#define zig_make_f128(fp, repr) fp3274#define zig_make_f128(fp, repr) fp
3314#elif LDBL_MANT_DIG == 1133275#elif LDBL_MANT_DIG == 113
3315#define zig_bitSizeOf_c_longdouble 128
3316#ifndef ZIG_TARGET_ABI_MSVC
3317typedef zig_repr_f128 zig_repr_c_longdouble;
3318#endif
3319typedef long double zig_f128;3276typedef long double zig_f128;
3320#define zig_make_f128(fp, repr) fp##l3277#define zig_make_f128(fp, repr) fp##l
3321#elif FLT128_MANT_DIG == 1133278#elif FLT128_MANT_DIG == 113
...@@ -3332,36 +3289,48 @@ typedef __float128 zig_f128;...@@ -3332,36 +3289,48 @@ typedef __float128 zig_f128;
3332#else3289#else
3333#undef zig_has_f1283290#undef zig_has_f128
3334#define zig_has_f128 03291#define zig_has_f128 0
3335#define zig_bitSizeOf_repr_f128 1283292#undef zig_make_special_f128
3293#undef zig_init_special_f128
3294#if __APPLE__ || defined(__aarch64__)
3295typedef __attribute__((__vector_size__(16))) uint64_t zig_f128;
3296#define zig_make_f128_zig_make_u128(hi, lo) (zig_f128){ lo, hi }
3297#define zig_make_f128_zig_init_u128 zig_make_f128_zig_make_u128
3298#define zig_make_f128(fp, repr) zig_make_f128_##repr
3299#define zig_make_special_f128(sign, name, arg, repr) zig_make_f128_##repr
3300#define zig_init_special_f128(sign, name, arg, repr) zig_make_f128_##repr
3301#else
3336typedef zig_repr_f128 zig_f128;3302typedef zig_repr_f128 zig_f128;
3337#define zig_make_f128(fp, repr) repr3303#define zig_make_f128(fp, repr) repr
3338#undef zig_make_special_f128
3339#define zig_make_special_f128(sign, name, arg, repr) repr3304#define zig_make_special_f128(sign, name, arg, repr) repr
3340#undef zig_init_special_f128
3341#define zig_init_special_f128(sign, name, arg, repr) repr3305#define zig_init_special_f128(sign, name, arg, repr) repr
3342#endif3306#endif
3307#endif
33433308
3344#ifdef zig_bitSizeOf_c_longdouble3309#if _MSC_VER && !defined(ZIG_TARGET_ABI_MSVC)
33453310// Use gnu abi with the msvc compiler
3346#define zig_has_c_longdouble 13311#define zig_bitSizeOf_c_longdouble 128
3347#ifdef ZIG_TARGET_ABI_MSVC3312typedef zig_repr_f128 zig_repr_c_longdouble;
3348#undef zig_bitSizeOf_c_longdouble3313typedef zig_f128 zig_c_longdouble;
3314#else
3315#if LDBL_MANT_DIG == 11
3316#define zig_bitSizeOf_c_longdouble 16
3317typedef zig_repr_f16 zig_repr_c_longdouble;
3318#elif LDBL_MANT_DIG == 24
3319#define zig_bitSizeOf_c_longdouble 32
3320typedef zig_repr_f32 zig_repr_c_longdouble;
3321#elif LDBL_MANT_DIG == 53
3349#define zig_bitSizeOf_c_longdouble 643322#define zig_bitSizeOf_c_longdouble 64
3350typedef zig_f64 zig_c_longdouble;
3351typedef zig_repr_f64 zig_repr_c_longdouble;3323typedef zig_repr_f64 zig_repr_c_longdouble;
3352#else3324#elif LDBL_MANT_DIG == 64
3325#define zig_bitSizeOf_c_longdouble 80
3326typedef zig_repr_f80 zig_repr_c_longdouble;
3327#elif LDBL_MANT_DIG == 113
3328#define zig_bitSizeOf_c_longdouble 128
3329typedef zig_repr_f128 zig_repr_c_longdouble;
3330#endif
3353typedef long double zig_c_longdouble;3331typedef long double zig_c_longdouble;
3354#endif3332#endif
33553333
3356#else /* zig_bitSizeOf_c_longdouble */
3357
3358#define zig_has_c_longdouble 0
3359#define zig_bitSizeOf_repr_c_longdouble 128
3360typedef zig_f128 zig_c_longdouble;
3361typedef zig_repr_f128 zig_repr_c_longdouble;
3362
3363#endif /* zig_bitSizeOf_c_longdouble */
3364
3365#if !zig_has_float_builtins3334#if !zig_has_float_builtins
3366#define zig_float_from_repr(Type) \3335#define zig_float_from_repr(Type) \
3367 static inline zig_##Type zig_float_from_repr_##Type(zig_repr_##Type repr) { \3336 static inline zig_##Type zig_float_from_repr_##Type(zig_repr_##Type repr) { \
...@@ -3413,20 +3382,17 @@ zig_convert_builtin(zig_f128, extend, zig_f32, 2)...@@ -3413,20 +3382,17 @@ zig_convert_builtin(zig_f128, extend, zig_f32, 2)
3413zig_convert_builtin(zig_f128, extend, zig_f64, 2)3382zig_convert_builtin(zig_f128, extend, zig_f64, 2)
3414zig_convert_builtin(zig_f128, extend, zig_f80, 2)3383zig_convert_builtin(zig_f128, extend, zig_f80, 2)
34153384
3416#define zig_float_negate_builtin_0(w) \3385#define zig_float_negate_builtin_0(w, r, c, sb) zig_xor_u##r(arg, zig_make_f##w(-0x0.0p0, c sb))
3417 static inline zig_f##w zig_neg_f##w(zig_f##w arg) { \3386#define zig_float_negate_builtin_1(w, r, c, sb) -arg
3418 return zig_expand_concat(zig_xor_u, zig_bitSizeOf_repr_f##w)( \3387#define zig_float_negate_builtin(w, r, c, sb) \
3419 arg, \
3420 zig_expand_concat(zig_shl_u, zig_bitSizeOf_repr_f##w)( \
3421 zig_expand_concat(zig_make_small_u, zig_bitSizeOf_repr_f##w)(1), \
3422 UINT8_C(w - 1) \
3423 ) \
3424 ); \
3425 }
3426#define zig_float_negate_builtin_1(w) \
3427 static inline zig_f##w zig_neg_f##w(zig_f##w arg) { \3388 static inline zig_f##w zig_neg_f##w(zig_f##w arg) { \
3428 return -arg; \3389 return zig_expand_concat(zig_float_negate_builtin_, zig_has_f##w)(w, r, c, sb); \
3429 }3390 }
3391zig_float_negate_builtin(16, 16, , UINT16_C(1) << 15 )
3392zig_float_negate_builtin(32, 32, , UINT32_C(1) << 31 )
3393zig_float_negate_builtin(64, 64, , UINT64_C(1) << 63 )
3394zig_float_negate_builtin(80, 128, zig_make_u128, (UINT64_C(1) << 15, UINT64_C(0)))
3395zig_float_negate_builtin(128, 128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0)))
34303396
3431#define zig_float_less_builtin_0(Type, operation) \3397#define zig_float_less_builtin_0(Type, operation) \
3432 zig_extern int32_t zig_expand_concat(zig_expand_concat(__##operation, \3398 zig_extern int32_t zig_expand_concat(zig_expand_concat(__##operation, \