authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-25 07:00:17-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-25 07:02:06-04:00
loge20d2b3151607fe078b43331ea27d5b34f95360b
treeba23d07445cbedb81404b7fc02647be281be3f2f
parent3d22327b2392050e088c8b6d5c21ae31bbd0cd90

cbe: fix floating point builtins


4 files changed, 59 insertions(+), 65 deletions(-)

lib/include/zig.h+49-41
......@@ -216,7 +216,6 @@ typedef signed long int zig_c_long;
216216typedef unsigned long int zig_c_ulong;
217217typedef signed long long int zig_c_longlong;
218218typedef unsigned long long int zig_c_ulonglong;
219typedef long double zig_c_longdouble;
220219
221220typedef uint8_t zig_u8;
222221typedef 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
259260typedef 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
263263typedef double zig_f16;
264264#define zig_suffix_f16(x) x
265#define zig_builtin_f16(name) __builtin_##name
266265#elif LDBL_MANT_DIG == 11
267266typedef 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
271269typedef _Float16 zig_f16;
272270#define zig_suffix_f16(x) x##f16
273#define zig_builtin_f16(name) __builtin_##name
274271#elif defined(__SIZEOF_FP16__)
275272typedef __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
281279typedef 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
285282typedef double zig_f32;
286283#define zig_suffix_f32(x) x
287#define zig_builtin_f32(name) __builtin_##name
288284#elif LDBL_MANT_DIG == 24
289285typedef 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
293288typedef _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
299295typedef 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
303298typedef double zig_f64;
304299#define zig_suffix_f64(x) x
305#define zig_builtin_f64(name) __builtin_##name
306300#elif LDBL_MANT_DIG == 53
307301typedef 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
311304typedef _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
315307typedef _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
321314typedef 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
325317typedef double zig_f80;
326318#define zig_suffix_f80(x) x
327#define zig_builtin_f80(name) __builtin_##name
328319#elif LDBL_MANT_DIG == 64
329320typedef 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
333323typedef _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
337326typedef _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__)
341329typedef __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
347336typedef 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
351339typedef double zig_f128;
352340#define zig_suffix_f128(x) x
353#define zig_builtin_f128(name) __builtin_##name
354341#elif LDBL_MANT_DIG == 113
355342typedef 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
359345typedef _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
363348typedef _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__)
367351typedef __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
357typedef 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
372362zig_extern_c void *memcpy (void *zig_restrict, void const *zig_restrict, zig_usize);
373363zig_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 }
1491zig_float_builtins(16)
1492zig_float_builtins(32)
1493zig_float_builtins(64)
1494zig_float_builtins(80)
1495zig_float_builtins(128)
1498zig_float_builtins(f16)
1499zig_float_builtins(f32)
1500zig_float_builtins(f64)
1501zig_float_builtins(f80)
1502zig_float_builtins(f128)
1503zig_float_builtins(c_longdouble)
src/codegen/c.zig+10-10
......@@ -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-1
......@@ -1379,7 +1379,6 @@ test "pointer to empty struct literal to mutable slice" {
13791379}
13801380
13811381test "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-13
......@@ -990,7 +990,6 @@ test "allow signed integer division/remainder when values are comptime-known and
990990}
991991
992992test "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
11791178test "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
12231221test "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
15551544test "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
15721560test "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