| ... | ... | @@ -367,54 +367,6 @@ pub const Function = struct { |
| 367 | 367 | fn fmtIntLiteral(f: *Function, ty: Type, val: Value) !std.fmt.Formatter(formatIntLiteral) { |
| 368 | 368 | return f.object.dg.fmtIntLiteral(ty, val); |
| 369 | 369 | } |
| 370 | | |
| 371 | | fn renderTypeForBuiltinFnName(f: *Function, writer: anytype, ty: Type) !void { |
| 372 | | const target = f.object.dg.module.getTarget(); |
| 373 | | const c_bits = if (ty.isAbiInt()) c_bits: { |
| 374 | | const int_info = ty.intInfo(target); |
| 375 | | try writer.writeByte(signAbbrev(int_info.signedness)); |
| 376 | | break :c_bits toCIntBits(int_info.bits) orelse |
| 377 | | return f.fail("TODO: C backend: implement integer types larger than 128 bits", .{}); |
| 378 | | } else if (ty.isRuntimeFloat()) c_bits: { |
| 379 | | try writer.writeByte('f'); |
| 380 | | break :c_bits ty.floatBits(target); |
| 381 | | } else return f.fail("TODO: CBE: implement renderTypeForBuiltinFnName for type {}", .{ |
| 382 | | ty.fmt(f.object.dg.module), |
| 383 | | }); |
| 384 | | try writer.print("{d}", .{c_bits}); |
| 385 | | } |
| 386 | | |
| 387 | | fn renderBuiltinInfo(f: *Function, writer: anytype, ty: Type, info: BuiltinInfo) !void { |
| 388 | | const target = f.object.dg.module.getTarget(); |
| 389 | | switch (info) { |
| 390 | | .None => {}, |
| 391 | | .Range => { |
| 392 | | var arena = std.heap.ArenaAllocator.init(f.object.dg.gpa); |
| 393 | | defer arena.deinit(); |
| 394 | | |
| 395 | | const ExpectedContents = union { u: Value.Payload.U64, i: Value.Payload.I64 }; |
| 396 | | var stack align(@alignOf(ExpectedContents)) = |
| 397 | | std.heap.stackFallback(@sizeOf(ExpectedContents), arena.allocator()); |
| 398 | | |
| 399 | | const int_info = ty.intInfo(target); |
| 400 | | if (int_info.signedness == .signed) { |
| 401 | | const min_val = try ty.minInt(stack.get(), target); |
| 402 | | try writer.print(", {x}", .{try f.object.dg.fmtIntLiteral(ty, min_val)}); |
| 403 | | } |
| 404 | | |
| 405 | | const max_val = try ty.maxInt(stack.get(), target); |
| 406 | | try writer.print(", {x}", .{try f.object.dg.fmtIntLiteral(ty, max_val)}); |
| 407 | | }, |
| 408 | | .Bits => { |
| 409 | | var bits_pl = Value.Payload.U64{ |
| 410 | | .base = .{ .tag = .int_u64 }, |
| 411 | | .data = ty.bitSize(target), |
| 412 | | }; |
| 413 | | const bits_val = Value.initPayload(&bits_pl.base); |
| 414 | | try writer.print(", {}", .{try f.object.dg.fmtIntLiteral(Type.u8, bits_val)}); |
| 415 | | }, |
| 416 | | } |
| 417 | | } |
| 418 | 370 | }; |
| 419 | 371 | |
| 420 | 372 | /// This data is available when outputting .c code for a `Module`. |
| ... | ... | @@ -657,15 +609,18 @@ pub const DeclGen = struct { |
| 657 | 609 | .Float => { |
| 658 | 610 | try writer.writeByte('('); |
| 659 | 611 | try dg.renderTypecast(writer, ty); |
| 660 | | try writer.writeByte(')'); |
| 612 | try writer.writeAll(")zig_suffix_"); |
| 613 | try dg.renderTypeForBuiltinFnName(writer, ty); |
| 614 | try writer.writeByte('('); |
| 661 | 615 | switch (ty.floatBits(target)) { |
| 662 | | 16 => return writer.print("{x}f", .{@bitCast(f16, undefPattern(u16))}), |
| 663 | | 32 => return writer.print("{x}f", .{@bitCast(f32, undefPattern(u32))}), |
| 664 | | 64 => return writer.print("{x}", .{@bitCast(f64, undefPattern(u64))}), |
| 665 | | 80 => return writer.print("{x}l", .{@bitCast(f80, undefPattern(u80))}), |
| 666 | | 128 => return writer.print("{x}l", .{@bitCast(f128, undefPattern(u128))}), |
| 616 | 16 => try writer.print("{x}", .{@bitCast(f16, undefPattern(u16))}), |
| 617 | 32 => try writer.print("{x}", .{@bitCast(f32, undefPattern(u32))}), |
| 618 | 64 => try writer.print("{x}", .{@bitCast(f64, undefPattern(u64))}), |
| 619 | 80 => try writer.print("{x}", .{@bitCast(f80, undefPattern(u80))}), |
| 620 | 128 => try writer.print("{x}", .{@bitCast(f128, undefPattern(u128))}), |
| 667 | 621 | else => unreachable, |
| 668 | 622 | } |
| 623 | return writer.writeByte(')'); |
| 669 | 624 | }, |
| 670 | 625 | .Pointer => switch (ty.ptrSize()) { |
| 671 | 626 | .Slice => { |
| ... | ... | @@ -821,9 +776,21 @@ pub const DeclGen = struct { |
| 821 | 776 | try dg.renderTypecast(writer, ty); |
| 822 | 777 | try writer.writeByte(')'); |
| 823 | 778 | const f128_val = val.toFloat(f128); |
| 824 | | if (!std.math.isFinite(f128_val)) { |
| 825 | | if (std.math.signbit(f128_val)) try writer.writeByte('-'); |
| 826 | | const fn_name = if (std.math.isSignalNan(f128_val)) |
| 779 | if (std.math.signbit(f128_val)) try writer.writeByte('-'); |
| 780 | if (std.math.isFinite(f128_val)) { |
| 781 | try writer.writeAll("zig_suffix_"); |
| 782 | try dg.renderTypeForBuiltinFnName(writer, ty); |
| 783 | try writer.writeByte('('); |
| 784 | switch (ty.floatBits(target)) { |
| 785 | 16 => try writer.print("{x}", .{@fabs(val.toFloat(f16))}), |
| 786 | 32 => try writer.print("{x}", .{@fabs(val.toFloat(f32))}), |
| 787 | 64 => try writer.print("{x}", .{@fabs(val.toFloat(f64))}), |
| 788 | 80 => try writer.print("{x}", .{@fabs(val.toFloat(f80))}), |
| 789 | 128 => try writer.print("{x}", .{@fabs(f128_val)}), |
| 790 | else => unreachable, |
| 791 | } |
| 792 | } else { |
| 793 | const operation = if (std.math.isSignalNan(f128_val)) |
| 827 | 794 | "nans" |
| 828 | 795 | else if (std.math.isNan(f128_val)) |
| 829 | 796 | "nan" |
| ... | ... | @@ -831,27 +798,23 @@ pub const DeclGen = struct { |
| 831 | 798 | "inf" |
| 832 | 799 | else |
| 833 | 800 | unreachable; |
| 834 | | try dg.renderFloatFnName(writer, fn_name, ty); |
| 801 | try writer.writeAll("zig_builtin_"); |
| 802 | try dg.renderTypeForBuiltinFnName(writer, ty); |
| 835 | 803 | try writer.writeByte('('); |
| 804 | try writer.writeAll(operation); |
| 805 | try writer.writeAll(")("); |
| 836 | 806 | if (std.math.isNan(f128_val)) switch (ty.floatBits(target)) { |
| 837 | | // We only actually need to pass the significant, but it will get |
| 807 | // We only actually need to pass the significand, but it will get |
| 838 | 808 | // properly masked anyway, so just pass the whole value. |
| 839 | | 16 => try writer.print("\"0x{x}\"", .{@bitCast(u16, val.toFloat(f16))}), |
| 840 | | 32 => try writer.print("\"0x{x}\"", .{@bitCast(u32, val.toFloat(f32))}), |
| 841 | | 64 => try writer.print("\"0x{x}\"", .{@bitCast(u64, val.toFloat(f64))}), |
| 842 | | 80 => try writer.print("\"0x{x}\"", .{@bitCast(u80, val.toFloat(f80))}), |
| 843 | | 128 => try writer.print("\"0x{x}\"", .{@bitCast(u128, f128_val)}), |
| 809 | 16 => try writer.print("\"0x{x}\"", .{@bitCast(u16, @fabs(val.toFloat(f16)))}), |
| 810 | 32 => try writer.print("\"0x{x}\"", .{@bitCast(u32, @fabs(val.toFloat(f32)))}), |
| 811 | 64 => try writer.print("\"0x{x}\"", .{@bitCast(u64, @fabs(val.toFloat(f64)))}), |
| 812 | 80 => try writer.print("\"0x{x}\"", .{@bitCast(u80, @fabs(val.toFloat(f80)))}), |
| 813 | 128 => try writer.print("\"0x{x}\"", .{@bitCast(u128, @fabs(f128_val))}), |
| 844 | 814 | else => unreachable, |
| 845 | 815 | }; |
| 846 | | return writer.writeByte(')'); |
| 847 | | } else switch (ty.floatBits(target)) { |
| 848 | | 16 => return writer.print("{x}f", .{val.toFloat(f16)}), |
| 849 | | 32 => return writer.print("{x}f", .{val.toFloat(f32)}), |
| 850 | | 64 => return writer.print("{x}", .{val.toFloat(f64)}), |
| 851 | | 80 => return writer.print("{x}l", .{val.toFloat(f80)}), |
| 852 | | 128 => return writer.print("{x}l", .{f128_val}), |
| 853 | | else => unreachable, |
| 854 | 816 | } |
| 817 | return writer.writeByte(')'); |
| 855 | 818 | }, |
| 856 | 819 | .Pointer => switch (val.tag()) { |
| 857 | 820 | .null_value, .zero => { |
| ... | ... | @@ -2041,23 +2004,51 @@ pub const DeclGen = struct { |
| 2041 | 2004 | } |
| 2042 | 2005 | } |
| 2043 | 2006 | |
| 2044 | | fn renderFloatFnName(dg: *DeclGen, writer: anytype, operation: []const u8, float_ty: Type) !void { |
| 2007 | fn renderTypeForBuiltinFnName(dg: *DeclGen, writer: anytype, ty: Type) !void { |
| 2045 | 2008 | const target = dg.module.getTarget(); |
| 2046 | | const float_bits = float_ty.floatBits(target); |
| 2047 | | const is_longdouble = float_bits == CType.longdouble.sizeInBits(target); |
| 2048 | | try writer.writeAll("__"); |
| 2049 | | if (is_longdouble or float_bits != 80) { |
| 2050 | | try writer.writeAll("builtin_"); |
| 2051 | | } |
| 2052 | | try writer.writeAll(operation); |
| 2053 | | if (is_longdouble) { |
| 2054 | | try writer.writeByte('l'); |
| 2055 | | } else switch (float_bits) { |
| 2056 | | 16, 32 => try writer.writeByte('f'), |
| 2057 | | 64 => {}, |
| 2058 | | 80 => try writer.writeByte('x'), |
| 2059 | | 128 => try writer.writeByte('q'), |
| 2060 | | else => unreachable, |
| 2009 | const c_bits = if (ty.isAbiInt()) c_bits: { |
| 2010 | const int_info = ty.intInfo(target); |
| 2011 | try writer.writeByte(signAbbrev(int_info.signedness)); |
| 2012 | break :c_bits toCIntBits(int_info.bits) orelse |
| 2013 | 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); |
| 2017 | } else return dg.fail("TODO: CBE: implement renderTypeForBuiltinFnName for type {}", .{ |
| 2018 | ty.fmt(dg.module), |
| 2019 | }); |
| 2020 | try writer.print("{d}", .{c_bits}); |
| 2021 | } |
| 2022 | |
| 2023 | fn renderBuiltinInfo(dg: *DeclGen, writer: anytype, ty: Type, info: BuiltinInfo) !void { |
| 2024 | const target = dg.module.getTarget(); |
| 2025 | switch (info) { |
| 2026 | .None => {}, |
| 2027 | .Range => { |
| 2028 | var arena = std.heap.ArenaAllocator.init(dg.gpa); |
| 2029 | defer arena.deinit(); |
| 2030 | |
| 2031 | const ExpectedContents = union { u: Value.Payload.U64, i: Value.Payload.I64 }; |
| 2032 | var stack align(@alignOf(ExpectedContents)) = |
| 2033 | std.heap.stackFallback(@sizeOf(ExpectedContents), arena.allocator()); |
| 2034 | |
| 2035 | const int_info = ty.intInfo(target); |
| 2036 | if (int_info.signedness == .signed) { |
| 2037 | const min_val = try ty.minInt(stack.get(), target); |
| 2038 | try writer.print(", {x}", .{try dg.fmtIntLiteral(ty, min_val)}); |
| 2039 | } |
| 2040 | |
| 2041 | const max_val = try ty.maxInt(stack.get(), target); |
| 2042 | try writer.print(", {x}", .{try dg.fmtIntLiteral(ty, max_val)}); |
| 2043 | }, |
| 2044 | .Bits => { |
| 2045 | var bits_pl = Value.Payload.U64{ |
| 2046 | .base = .{ .tag = .int_u64 }, |
| 2047 | .data = ty.bitSize(target), |
| 2048 | }; |
| 2049 | const bits_val = Value.initPayload(&bits_pl.base); |
| 2050 | try writer.print(", {}", .{try dg.fmtIntLiteral(Type.u8, bits_val)}); |
| 2051 | }, |
| 2061 | 2052 | } |
| 2062 | 2053 | } |
| 2063 | 2054 | |
| ... | ... | @@ -2760,15 +2751,15 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue { |
| 2760 | 2751 | try writer.writeAll(" = ("); |
| 2761 | 2752 | try f.renderTypecast(writer, inst_ty); |
| 2762 | 2753 | try writer.writeAll(")zig_wrap_"); |
| 2763 | | try f.renderTypeForBuiltinFnName(writer, field_ty); |
| 2754 | try f.object.dg.renderTypeForBuiltinFnName(writer, field_ty); |
| 2764 | 2755 | try writer.writeAll("(("); |
| 2765 | 2756 | try f.renderTypecast(writer, field_ty); |
| 2766 | 2757 | try writer.writeAll(")zig_shr_"); |
| 2767 | | try f.renderTypeForBuiltinFnName(writer, host_ty); |
| 2758 | try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty); |
| 2768 | 2759 | try writer.writeByte('('); |
| 2769 | 2760 | try f.writeCValueDeref(writer, operand); |
| 2770 | 2761 | try writer.print(", {})", .{try f.fmtIntLiteral(bit_offset_ty, bit_offset_val)}); |
| 2771 | | try f.renderBuiltinInfo(writer, field_ty, .Bits); |
| 2762 | try f.object.dg.renderBuiltinInfo(writer, field_ty, .Bits); |
| 2772 | 2763 | try writer.writeByte(')'); |
| 2773 | 2764 | } else { |
| 2774 | 2765 | try writer.writeAll(" = "); |
| ... | ... | @@ -2998,13 +2989,13 @@ fn airStore(f: *Function, inst: Air.Inst.Index) !CValue { |
| 2998 | 2989 | |
| 2999 | 2990 | try f.writeCValueDeref(writer, ptr_val); |
| 3000 | 2991 | try writer.writeAll(" = zig_or_"); |
| 3001 | | try f.renderTypeForBuiltinFnName(writer, host_ty); |
| 2992 | try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty); |
| 3002 | 2993 | try writer.writeAll("(zig_and_"); |
| 3003 | | try f.renderTypeForBuiltinFnName(writer, host_ty); |
| 2994 | try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty); |
| 3004 | 2995 | try writer.writeByte('('); |
| 3005 | 2996 | try f.writeCValueDeref(writer, ptr_val); |
| 3006 | 2997 | try writer.print(", {x}), zig_shl_", .{try f.fmtIntLiteral(host_ty, mask_val)}); |
| 3007 | | try f.renderTypeForBuiltinFnName(writer, host_ty); |
| 2998 | try f.object.dg.renderTypeForBuiltinFnName(writer, host_ty); |
| 3008 | 2999 | try writer.writeAll("(("); |
| 3009 | 3000 | try f.renderTypecast(writer, host_ty); |
| 3010 | 3001 | try writer.writeByte(')'); |
| ... | ... | @@ -3040,14 +3031,14 @@ fn airOverflow(f: *Function, inst: Air.Inst.Index, operation: []const u8, info: |
| 3040 | 3031 | try w.writeAll(".field_1 = zig_"); |
| 3041 | 3032 | try w.writeAll(operation); |
| 3042 | 3033 | try w.writeAll("o_"); |
| 3043 | | try f.renderTypeForBuiltinFnName(w, scalar_ty); |
| 3034 | try f.object.dg.renderTypeForBuiltinFnName(w, scalar_ty); |
| 3044 | 3035 | try w.writeAll("(&"); |
| 3045 | 3036 | try f.writeCValueMember(w, local, .{ .identifier = "field_0" }); |
| 3046 | 3037 | try w.writeAll(", "); |
| 3047 | 3038 | try f.writeCValue(w, lhs, .FunctionArgument); |
| 3048 | 3039 | try w.writeAll(", "); |
| 3049 | 3040 | try f.writeCValue(w, rhs, .FunctionArgument); |
| 3050 | | try f.renderBuiltinInfo(w, scalar_ty, info); |
| 3041 | try f.object.dg.renderBuiltinInfo(w, scalar_ty, info); |
| 3051 | 3042 | try w.writeAll(");\n"); |
| 3052 | 3043 | return local; |
| 3053 | 3044 | } |
| ... | ... | @@ -4217,17 +4208,17 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4217 | 4208 | |
| 4218 | 4209 | const temp_local = try f.allocLocal(field_int_ty, .Const); |
| 4219 | 4210 | try writer.writeAll(" = zig_wrap_"); |
| 4220 | | try f.renderTypeForBuiltinFnName(writer, field_int_ty); |
| 4211 | try f.object.dg.renderTypeForBuiltinFnName(writer, field_int_ty); |
| 4221 | 4212 | try writer.writeAll("(("); |
| 4222 | 4213 | try f.renderTypecast(writer, field_int_ty); |
| 4223 | 4214 | try writer.writeAll(")zig_shr_"); |
| 4224 | | try f.renderTypeForBuiltinFnName(writer, struct_ty); |
| 4215 | try f.object.dg.renderTypeForBuiltinFnName(writer, struct_ty); |
| 4225 | 4216 | try writer.writeByte('('); |
| 4226 | 4217 | try f.writeCValue(writer, struct_byval, .Other); |
| 4227 | 4218 | try writer.writeAll(", "); |
| 4228 | 4219 | try f.object.dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); |
| 4229 | 4220 | try writer.writeByte(')'); |
| 4230 | | try f.renderBuiltinInfo(writer, field_int_ty, .Bits); |
| 4221 | try f.object.dg.renderBuiltinInfo(writer, field_int_ty, .Bits); |
| 4231 | 4222 | try writer.writeAll(");\n"); |
| 4232 | 4223 | if (inst_ty.eql(field_int_ty, f.object.dg.module)) return temp_local; |
| 4233 | 4224 | |
| ... | ... | @@ -4567,10 +4558,10 @@ fn airUnBuiltinCall( |
| 4567 | 4558 | try writer.writeAll(" = zig_"); |
| 4568 | 4559 | try writer.writeAll(operation); |
| 4569 | 4560 | try writer.writeByte('_'); |
| 4570 | | try f.renderTypeForBuiltinFnName(writer, operand_ty); |
| 4561 | try f.object.dg.renderTypeForBuiltinFnName(writer, operand_ty); |
| 4571 | 4562 | try writer.writeByte('('); |
| 4572 | 4563 | try f.writeCValue(writer, try f.resolveInst(operand), .FunctionArgument); |
| 4573 | | try f.renderBuiltinInfo(writer, operand_ty, info); |
| 4564 | try f.object.dg.renderBuiltinInfo(writer, operand_ty, info); |
| 4574 | 4565 | try writer.writeAll(");\n"); |
| 4575 | 4566 | return local; |
| 4576 | 4567 | } |
| ... | ... | @@ -4592,12 +4583,12 @@ fn airBinBuiltinCall( |
| 4592 | 4583 | try writer.writeAll(" = zig_"); |
| 4593 | 4584 | try writer.writeAll(operation); |
| 4594 | 4585 | try writer.writeByte('_'); |
| 4595 | | try f.renderTypeForBuiltinFnName(writer, operand_ty); |
| 4586 | try f.object.dg.renderTypeForBuiltinFnName(writer, operand_ty); |
| 4596 | 4587 | try writer.writeByte('('); |
| 4597 | 4588 | try f.writeCValue(writer, try f.resolveInst(bin_op.lhs), .FunctionArgument); |
| 4598 | 4589 | try writer.writeAll(", "); |
| 4599 | 4590 | try f.writeCValue(writer, try f.resolveInst(bin_op.rhs), .FunctionArgument); |
| 4600 | | try f.renderBuiltinInfo(writer, operand_ty, info); |
| 4591 | try f.object.dg.renderBuiltinInfo(writer, operand_ty, info); |
| 4601 | 4592 | try writer.writeAll(");\n"); |
| 4602 | 4593 | return local; |
| 4603 | 4594 | } |
| ... | ... | @@ -4612,7 +4603,7 @@ fn airCmpBuiltinCall(f: *Function, inst: Air.Inst.Index, operator: []const u8) ! |
| 4612 | 4603 | const local = try f.allocLocal(inst_ty, .Const); |
| 4613 | 4604 | const writer = f.object.writer(); |
| 4614 | 4605 | try writer.writeAll(" = zig_cmp_"); |
| 4615 | | try f.renderTypeForBuiltinFnName(writer, operand_ty); |
| 4606 | try f.object.dg.renderTypeForBuiltinFnName(writer, operand_ty); |
| 4616 | 4607 | try writer.writeByte('('); |
| 4617 | 4608 | try f.writeCValue(writer, try f.resolveInst(bin_op.lhs), .FunctionArgument); |
| 4618 | 4609 | try writer.writeAll(", "); |
| ... | ... | @@ -5027,7 +5018,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue { |
| 5027 | 5018 | |
| 5028 | 5019 | if (!empty) { |
| 5029 | 5020 | try writer.writeAll("zig_or_"); |
| 5030 | | try f.renderTypeForBuiltinFnName(writer, inst_ty); |
| 5021 | try f.object.dg.renderTypeForBuiltinFnName(writer, inst_ty); |
| 5031 | 5022 | try writer.writeByte('('); |
| 5032 | 5023 | } |
| 5033 | 5024 | empty = false; |
| ... | ... | @@ -5039,14 +5030,14 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue { |
| 5039 | 5030 | |
| 5040 | 5031 | if (!empty) try writer.writeAll(", "); |
| 5041 | 5032 | try writer.writeAll("zig_shlw_"); |
| 5042 | | try f.renderTypeForBuiltinFnName(writer, inst_ty); |
| 5033 | try f.object.dg.renderTypeForBuiltinFnName(writer, inst_ty); |
| 5043 | 5034 | try writer.writeAll("(("); |
| 5044 | 5035 | try f.renderTypecast(writer, inst_ty); |
| 5045 | 5036 | try writer.writeByte(')'); |
| 5046 | 5037 | try f.writeCValue(writer, try f.resolveInst(element), .Other); |
| 5047 | 5038 | try writer.writeAll(", "); |
| 5048 | 5039 | try f.object.dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); |
| 5049 | | try f.renderBuiltinInfo(writer, inst_ty, .Bits); |
| 5040 | try f.object.dg.renderBuiltinInfo(writer, inst_ty, .Bits); |
| 5050 | 5041 | try writer.writeByte(')'); |
| 5051 | 5042 | if (!empty) try writer.writeByte(')'); |
| 5052 | 5043 | |
| ... | ... | @@ -5176,9 +5167,11 @@ fn airUnFloatOp(f: *Function, inst: Air.Inst.Index, operation: []const u8) !CVal |
| 5176 | 5167 | const inst_ty = f.air.typeOfIndex(inst); |
| 5177 | 5168 | const operand = try f.resolveInst(un_op); |
| 5178 | 5169 | const local = try f.allocLocal(inst_ty, .Const); |
| 5179 | | try writer.writeAll(" = "); |
| 5180 | | try f.object.dg.renderFloatFnName(writer, operation, inst_ty); |
| 5170 | try writer.writeAll(" = zig_builtin_"); |
| 5171 | try f.object.dg.renderTypeForBuiltinFnName(writer, inst_ty); |
| 5181 | 5172 | try writer.writeByte('('); |
| 5173 | try writer.writeAll(operation); |
| 5174 | try writer.writeAll(")("); |
| 5182 | 5175 | try f.writeCValue(writer, operand, .FunctionArgument); |
| 5183 | 5176 | try writer.writeAll(");\n"); |
| 5184 | 5177 | return local; |
| ... | ... | @@ -5192,9 +5185,11 @@ fn airBinFloatOp(f: *Function, inst: Air.Inst.Index, operation: []const u8) !CVa |
| 5192 | 5185 | const lhs = try f.resolveInst(bin_op.lhs); |
| 5193 | 5186 | const rhs = try f.resolveInst(bin_op.rhs); |
| 5194 | 5187 | const local = try f.allocLocal(inst_ty, .Const); |
| 5195 | | try writer.writeAll(" = "); |
| 5196 | | try f.object.dg.renderFloatFnName(writer, operation, inst_ty); |
| 5188 | try writer.writeAll(" = zig_builtin_"); |
| 5189 | try f.object.dg.renderTypeForBuiltinFnName(writer, inst_ty); |
| 5197 | 5190 | try writer.writeByte('('); |
| 5191 | try writer.writeAll(operation); |
| 5192 | try writer.writeAll(")("); |
| 5198 | 5193 | try f.writeCValue(writer, lhs, .FunctionArgument); |
| 5199 | 5194 | try writer.writeAll(", "); |
| 5200 | 5195 | try f.writeCValue(writer, rhs, .FunctionArgument); |
| ... | ... | @@ -5212,9 +5207,9 @@ fn airMulAdd(f: *Function, inst: Air.Inst.Index) !CValue { |
| 5212 | 5207 | const addend = try f.resolveInst(pl_op.operand); |
| 5213 | 5208 | const writer = f.object.writer(); |
| 5214 | 5209 | const local = try f.allocLocal(inst_ty, .Const); |
| 5215 | | try writer.writeAll(" = "); |
| 5216 | | try f.object.dg.renderFloatFnName(writer, "fma", inst_ty); |
| 5217 | | try writer.writeByte('('); |
| 5210 | try writer.writeAll(" = zig_builtin_"); |
| 5211 | try f.object.dg.renderTypeForBuiltinFnName(writer, inst_ty); |
| 5212 | try writer.writeAll("(fma)("); |
| 5218 | 5213 | try f.writeCValue(writer, mulend1, .FunctionArgument); |
| 5219 | 5214 | try writer.writeAll(", "); |
| 5220 | 5215 | try f.writeCValue(writer, mulend2, .FunctionArgument); |