Skip to content

Commit e20d2b3

Browse files
committed
cbe: fix floating point builtins
1 parent 3d22327 commit e20d2b3

File tree

4 files changed

+59
-65
lines changed

4 files changed

+59
-65
lines changed

lib/include/zig.h

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,6 @@ typedef signed long int zig_c_long;
216216
typedef unsigned long int zig_c_ulong;
217217
typedef signed long long int zig_c_longlong;
218218
typedef unsigned long long int zig_c_ulonglong;
219-
typedef long double zig_c_longdouble;
220219

221220
typedef uint8_t zig_u8;
222221
typedef int8_t zig_i8;
@@ -255,120 +254,111 @@ typedef int64_t zig_i64;
255254
#define zig_minInt_i64 INT64_MIN
256255
#define zig_maxInt_i64 INT64_MAX
257256

257+
#define zig_builtin_f16(name) __##name##h
258+
#define zig_builtin_constant_f16(name) zig_suffix_f16(__builtin_##name)
258259
#if FLT_MANT_DIG == 11
259260
typedef float zig_f16;
260261
#define zig_suffix_f16(x) x##f
261-
#define zig_builtin_f16(name) __builtin_##name##f
262262
#elif DBL_MANT_DIG == 11
263263
typedef double zig_f16;
264264
#define zig_suffix_f16(x) x
265-
#define zig_builtin_f16(name) __builtin_##name
266265
#elif LDBL_MANT_DIG == 11
267266
typedef long double zig_f16;
268267
#define zig_suffix_f16(x) x##l
269-
#define zig_builtin_f16(name) __builtin_##name##l
270268
#elif FLT16_MANT_DIG == 11
271269
typedef _Float16 zig_f16;
272270
#define zig_suffix_f16(x) x##f16
273-
#define zig_builtin_f16(name) __builtin_##name
274271
#elif defined(__SIZEOF_FP16__)
275272
typedef __fp16 zig_f16;
276-
#define zig_suffix_f16(x) x
277-
#define zig_builtin_f16(name) __builtin_##name
273+
#define zig_suffix_f16(x) x##f16
278274
#endif
279275

276+
#define zig_builtin_f32(name) name##f
277+
#define zig_builtin_constant_f32(name) zig_suffix_f32(__builtin_##name)
280278
#if FLT_MANT_DIG == 24
281279
typedef float zig_f32;
282280
#define zig_suffix_f32(x) x##f
283-
#define zig_builtin_f32(name) __builtin_##name##f
284281
#elif DBL_MANT_DIG == 24
285282
typedef double zig_f32;
286283
#define zig_suffix_f32(x) x
287-
#define zig_builtin_f32(name) __builtin_##name
288284
#elif LDBL_MANT_DIG == 24
289285
typedef long double zig_f32;
290286
#define zig_suffix_f32(x) x##l
291-
#define zig_builtin_f32(name) __builtin_##name##l
292287
#elif FLT32_MANT_DIG == 24
293288
typedef _Float32 zig_f32;
294289
#define zig_suffix_f32(x) x##f32
295-
#define zig_builtin_f32(name) __builtin_##name
296290
#endif
297291

292+
#define zig_builtin_f64(name) name
293+
#define zig_builtin_constant_f64(name) zig_suffix_f64(__builtin_##name)
298294
#if FLT_MANT_DIG == 53
299295
typedef float zig_f64;
300296
#define zig_suffix_f64(x) x##f
301-
#define zig_builtin_f64(name) __builtin_##name##f
302297
#elif DBL_MANT_DIG == 53
303298
typedef double zig_f64;
304299
#define zig_suffix_f64(x) x
305-
#define zig_builtin_f64(name) __builtin_##name
306300
#elif LDBL_MANT_DIG == 53
307301
typedef long double zig_f64;
308302
#define zig_suffix_f64(x) x##l
309-
#define zig_builtin_f64(name) __builtin_##name##l
310303
#elif FLT64_MANT_DIG == 53
311304
typedef _Float64 zig_f64;
312305
#define zig_suffix_f64(x) x##f64
313-
#define zig_builtin_f64(name) __builtin_##name##l
314306
#elif FLT32X_MANT_DIG == 53
315307
typedef _Float32x zig_f64;
316308
#define zig_suffix_f64(x) x##f32x
317-
#define zig_builtin_f64(name) __builtin_##name##l
318309
#endif
319310

311+
#define zig_builtin_f80(name) __##name##x
312+
#define zig_builtin_constant_f80(name) zig_suffix_f80(__builtin_##name)
320313
#if FLT_MANT_DIG == 64
321314
typedef float zig_f80;
322315
#define zig_suffix_f80(x) x##f
323-
#define zig_builtin_f80(name) __builtin_##name##f
324316
#elif DBL_MANT_DIG == 64
325317
typedef double zig_f80;
326318
#define zig_suffix_f80(x) x
327-
#define zig_builtin_f80(name) __builtin_##name
328319
#elif LDBL_MANT_DIG == 64
329320
typedef long double zig_f80;
330321
#define zig_suffix_f80(x) x##l
331-
#define zig_builtin_f80(name) __builtin_##name##l
332322
#elif FLT80_MANT_DIG == 64
333323
typedef _Float80 zig_f80;
334324
#define zig_suffix_f80(x) x##f80
335-
#define zig_builtin_f80(name) __builtin_##name##l
336325
#elif FLT64X_MANT_DIG == 64
337326
typedef _Float64x zig_f80;
338327
#define zig_suffix_f80(x) x##f64x
339-
#define zig_builtin_f80(name) __builtin_##name##l
340328
#elif defined(__SIZEOF_FLOAT80__)
341329
typedef __float80 zig_f80;
342330
#define zig_suffix_f80(x) x##l
343-
#define zig_builtin_f80(name) __builtin_##name##l
344331
#endif
345332

333+
#define zig_builtin_f128(name) name##q
334+
#define zig_builtin_constant_f128(name) zig_suffix_f80(__builtin_##name)
346335
#if FLT_MANT_DIG == 113
347336
typedef float zig_f128;
348337
#define zig_suffix_f128(x) x##f
349-
#define zig_builtin_f128(name) __builtin_##name##f
350338
#elif DBL_MANT_DIG == 113
351339
typedef double zig_f128;
352340
#define zig_suffix_f128(x) x
353-
#define zig_builtin_f128(name) __builtin_##name
354341
#elif LDBL_MANT_DIG == 113
355342
typedef long double zig_f128;
356343
#define zig_suffix_f128(x) x##l
357-
#define zig_builtin_f128(name) __builtin_##name##l
358344
#elif FLT128_MANT_DIG == 113
359345
typedef _Float128 zig_f128;
360346
#define zig_suffix_f128(x) x##f128
361-
#define zig_builtin_f128(name) __builtin_##name##l
362347
#elif FLT64X_MANT_DIG == 113
363348
typedef _Float64x zig_f128;
364349
#define zig_suffix_f128(x) x##f64x
365-
#define zig_builtin_f128(name) __builtin_##name##l
366350
#elif defined(__SIZEOF_FLOAT128__)
367351
typedef __float128 zig_f128;
368-
#define zig_suffix_f128(x) x##l
369-
#define zig_builtin_f128(name) __builtin_##name##l
352+
#define zig_suffix_f128(x) x##q
353+
#undef zig_builtin_constant_f128
354+
#define zig_builtin_constant_f128(name) __builtin_##name##f128
370355
#endif
371356

357+
typedef long double zig_c_longdouble;
358+
#define zig_suffix_c_longdouble(x) x##l
359+
#define zig_builtin_c_longdouble(name) zig_suffix_c_longdouble(name)
360+
#define zig_builtin_constant_c_longdouble(name) zig_suffix_c_longdouble(__builtin_##name)
361+
372362
zig_extern_c void *memcpy (void *zig_restrict, void const *zig_restrict, zig_usize);
373363
zig_extern_c void *memset (void *, int, zig_usize);
374364

@@ -1476,20 +1466,38 @@ static inline zig_i128 zig_bit_reverse_i128(zig_i128 val, zig_u8 bits) {
14761466

14771467
/* ========================== Float Point Routines ========================== */
14781468

1479-
#define zig_float_builtins(w) \
1480-
static inline zig_f##w zig_div_trunc_f##w(zig_f##w lhs, zig_f##w rhs) { \
1481-
return zig_builtin_f##w(trunc)(lhs / rhs); \
1469+
#define zig_float_builtins(Type) \
1470+
zig_extern_c zig_##Type zig_builtin_##Type(sqrt)(zig_##Type); \
1471+
zig_extern_c zig_##Type zig_builtin_##Type(sin)(zig_##Type); \
1472+
zig_extern_c zig_##Type zig_builtin_##Type(cos)(zig_##Type); \
1473+
zig_extern_c zig_##Type zig_builtin_##Type(tan)(zig_##Type); \
1474+
zig_extern_c zig_##Type zig_builtin_##Type(exp)(zig_##Type); \
1475+
zig_extern_c zig_##Type zig_builtin_##Type(exp2)(zig_##Type); \
1476+
zig_extern_c zig_##Type zig_builtin_##Type(log)(zig_##Type); \
1477+
zig_extern_c zig_##Type zig_builtin_##Type(log2)(zig_##Type); \
1478+
zig_extern_c zig_##Type zig_builtin_##Type(log10)(zig_##Type); \
1479+
zig_extern_c zig_##Type zig_builtin_##Type(fabs)(zig_##Type); \
1480+
zig_extern_c zig_##Type zig_builtin_##Type(floor)(zig_##Type); \
1481+
zig_extern_c zig_##Type zig_builtin_##Type(ceil)(zig_##Type); \
1482+
zig_extern_c zig_##Type zig_builtin_##Type(round)(zig_##Type); \
1483+
zig_extern_c zig_##Type zig_builtin_##Type(trunc)(zig_##Type); \
1484+
zig_extern_c zig_##Type zig_builtin_##Type(fmod)(zig_##Type, zig_##Type); \
1485+
zig_extern_c zig_##Type zig_builtin_##Type(fma)(zig_##Type, zig_##Type, zig_##Type); \
1486+
\
1487+
static inline zig_##Type zig_div_trunc_##Type(zig_##Type lhs, zig_##Type rhs) { \
1488+
return zig_builtin_##Type(trunc)(lhs / rhs); \
14821489
} \
14831490
\
1484-
static inline zig_f##w zig_div_floor_f##w(zig_f##w lhs, zig_f##w rhs) { \
1485-
return zig_builtin_f##w(floor)(lhs / rhs); \
1491+
static inline zig_##Type zig_div_floor_##Type(zig_##Type lhs, zig_##Type rhs) { \
1492+
return zig_builtin_##Type(floor)(lhs / rhs); \
14861493
} \
14871494
\
1488-
static inline zig_f##w zig_mod_f##w(zig_f##w lhs, zig_f##w rhs) { \
1489-
return lhs - zig_div_floor_f##w(lhs, rhs) * rhs; \
1495+
static inline zig_##Type zig_mod_##Type(zig_##Type lhs, zig_##Type rhs) { \
1496+
return lhs - zig_div_floor_##Type(lhs, rhs) * rhs; \
14901497
}
1491-
zig_float_builtins(16)
1492-
zig_float_builtins(32)
1493-
zig_float_builtins(64)
1494-
zig_float_builtins(80)
1495-
zig_float_builtins(128)
1498+
zig_float_builtins(f16)
1499+
zig_float_builtins(f32)
1500+
zig_float_builtins(f64)
1501+
zig_float_builtins(f80)
1502+
zig_float_builtins(f128)
1503+
zig_float_builtins(c_longdouble)

src/codegen/c.zig

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,7 @@ pub const DeclGen = struct {
798798
"inf"
799799
else
800800
unreachable;
801-
try writer.writeAll("zig_builtin_");
801+
try writer.writeAll("zig_builtin_constant_");
802802
try dg.renderTypeForBuiltinFnName(writer, ty);
803803
try writer.writeByte('(');
804804
try writer.writeAll(operation);
@@ -2006,18 +2006,16 @@ pub const DeclGen = struct {
20062006

20072007
fn renderTypeForBuiltinFnName(dg: *DeclGen, writer: anytype, ty: Type) !void {
20082008
const target = dg.module.getTarget();
2009-
const c_bits = if (ty.isAbiInt()) c_bits: {
2009+
if (ty.isAbiInt()) {
20102010
const int_info = ty.intInfo(target);
2011-
try writer.writeByte(signAbbrev(int_info.signedness));
2012-
break :c_bits toCIntBits(int_info.bits) orelse
2011+
const c_bits = toCIntBits(int_info.bits) orelse
20132012
return dg.fail("TODO: C backend: implement integer types larger than 128 bits", .{});
2014-
} else if (ty.isRuntimeFloat()) c_bits: {
2015-
try writer.writeByte('f');
2016-
break :c_bits ty.floatBits(target);
2013+
try writer.print("{c}{d}", .{ signAbbrev(int_info.signedness), c_bits });
2014+
} else if (ty.isRuntimeFloat()) {
2015+
try ty.print(writer, dg.module);
20172016
} else return dg.fail("TODO: CBE: implement renderTypeForBuiltinFnName for type {}", .{
20182017
ty.fmt(dg.module),
20192018
});
2020-
try writer.print("{d}", .{c_bits});
20212019
}
20222020

20232021
fn renderBuiltinInfo(dg: *DeclGen, writer: anytype, ty: Type, info: BuiltinInfo) !void {
@@ -3077,7 +3075,8 @@ fn airBinOp(
30773075

30783076
const operand_ty = f.air.typeOf(bin_op.lhs);
30793077
const target = f.object.dg.module.getTarget();
3080-
if (operand_ty.bitSize(target) > 64) return try airBinBuiltinCall(f, inst, operation, info);
3078+
if (operand_ty.isInt() and operand_ty.bitSize(target) > 64)
3079+
return try airBinBuiltinCall(f, inst, operation, info);
30813080

30823081
const inst_ty = f.air.typeOfIndex(inst);
30833082
const lhs = try f.resolveInst(bin_op.lhs);
@@ -3104,7 +3103,8 @@ fn airCmpOp(f: *Function, inst: Air.Inst.Index, operator: []const u8) !CValue {
31043103

31053104
const operand_ty = f.air.typeOf(bin_op.lhs);
31063105
const target = f.object.dg.module.getTarget();
3107-
if (operand_ty.bitSize(target) > 64) return try airCmpBuiltinCall(f, inst, operator);
3106+
if (operand_ty.isInt() and operand_ty.bitSize(target) > 64)
3107+
return try airCmpBuiltinCall(f, inst, operator);
31083108

31093109
const inst_ty = f.air.typeOfIndex(inst);
31103110
const lhs = try f.resolveInst(bin_op.lhs);

test/behavior/cast.zig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1379,7 +1379,6 @@ test "pointer to empty struct literal to mutable slice" {
13791379
}
13801380

13811381
test "coerce between pointers of compatible differently-named floats" {
1382-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
13831382
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
13841383
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13851384
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO

test/behavior/math.zig

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,6 @@ test "allow signed integer division/remainder when values are comptime-known and
990990
}
991991

992992
test "quad hex float literal parsing accurate" {
993-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
994993
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
995994
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
996995
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
@@ -1178,7 +1177,6 @@ fn remdivOne(comptime T: type, a: T, b: T, c: T) !void {
11781177

11791178
test "float remainder division using @rem" {
11801179
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1181-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
11821180
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11831181
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
11841182
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
@@ -1222,7 +1220,6 @@ fn fremOne(comptime T: type, a: T, b: T, c: T, epsilon: T) !void {
12221220

12231221
test "float modulo division using @mod" {
12241222
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1225-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
12261223
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12271224
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12281225
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
@@ -1349,7 +1346,6 @@ test "@floor f80" {
13491346
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13501347
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
13511348
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1352-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
13531349
if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/12602
13541350

13551351
try testFloor(f80, 12.0);
@@ -1361,7 +1357,6 @@ test "@floor f128" {
13611357
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13621358
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
13631359
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1364-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
13651360

13661361
try testFloor(f128, 12.0);
13671362
comptime try testFloor(f128, 12.0);
@@ -1397,7 +1392,6 @@ test "@ceil f80" {
13971392
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13981393
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
13991394
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1400-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
14011395
if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/12602
14021396

14031397
try testCeil(f80, 12.0);
@@ -1409,7 +1403,6 @@ test "@ceil f128" {
14091403
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14101404
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
14111405
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1412-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
14131406

14141407
try testCeil(f128, 12.0);
14151408
comptime try testCeil(f128, 12.0);
@@ -1445,7 +1438,6 @@ test "@trunc f80" {
14451438
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14461439
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
14471440
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1448-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
14491441
if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/12602
14501442

14511443
try testTrunc(f80, 12.0);
@@ -1463,7 +1455,6 @@ test "@trunc f128" {
14631455
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14641456
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
14651457
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1466-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
14671458

14681459
try testTrunc(f128, 12.0);
14691460
comptime try testTrunc(f128, 12.0);
@@ -1507,7 +1498,6 @@ test "@round f80" {
15071498
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
15081499
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
15091500
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1510-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
15111501
if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/12602
15121502

15131503
try testRound(f80, 12.0);
@@ -1519,7 +1509,6 @@ test "@round f128" {
15191509
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
15201510
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
15211511
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1522-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
15231512

15241513
try testRound(f128, 12.0);
15251514
comptime try testRound(f128, 12.0);
@@ -1553,7 +1542,6 @@ test "vector integer addition" {
15531542
}
15541543

15551544
test "NaN comparison" {
1556-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
15571545
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
15581546
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
15591547
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
@@ -1570,7 +1558,6 @@ test "NaN comparison" {
15701558
}
15711559

15721560
test "NaN comparison f80" {
1573-
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
15741561
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
15751562
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
15761563
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO

0 commit comments

Comments
 (0)