authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-22 23:51:35+01:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-22 23:51:53+01:00
logdbfa3238fefee0c802fceb39c8605a0b21659bd3
tree7675a3d354c42e548041e058fbd545698089086c
parent83e66d301eede71800a9b5d72010ce63dbbac3fc

Builder: fix float constants in llvm ir


2 files changed, 49 insertions(+), 27 deletions(-)

src/arch/x86_64/CodeGen.zig+31-23
...@@ -16683,36 +16683,44 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {...@@ -16683,36 +16683,44 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
16683 else => null,16683 else => null,
16684 };16684 };
16685 defer if (elem_lock) |lock| self.register_manager.unlockReg(lock);16685 defer if (elem_lock) |lock| self.register_manager.unlockReg(lock);
16686 const elem_reg = registerAlias(16686
16687 try self.copyToTmpRegister(elem_ty, mat_elem_mcv),
16688 elem_abi_size,
16689 );
16690 const elem_extra_bits = self.regExtraBits(elem_ty);16687 const elem_extra_bits = self.regExtraBits(elem_ty);
16691 if (elem_bit_off < elem_extra_bits) {16688 {
16692 try self.truncateRegister(elem_ty, elem_reg);16689 const temp_reg = try self.copyToTmpRegister(elem_ty, mat_elem_mcv);
16690 const temp_alias = registerAlias(temp_reg, elem_abi_size);
16691 const temp_lock = self.register_manager.lockRegAssumeUnused(temp_reg);
16692 defer self.register_manager.unlockReg(temp_lock);
16693
16694 if (elem_bit_off < elem_extra_bits) {
16695 try self.truncateRegister(elem_ty, temp_alias);
16696 }
16697 if (elem_bit_off > 0) try self.genShiftBinOpMir(
16698 .{ ._l, .sh },
16699 elem_ty,
16700 .{ .register = temp_alias },
16701 Type.u8,
16702 .{ .immediate = elem_bit_off },
16703 );
16704 try self.genBinOpMir(
16705 .{ ._, .@"or" },
16706 elem_ty,
16707 .{ .load_frame = .{ .index = frame_index, .off = elem_byte_off } },
16708 .{ .register = temp_alias },
16709 );
16693 }16710 }
16694 if (elem_bit_off > 0) try self.genShiftBinOpMir(
16695 .{ ._l, .sh },
16696 elem_ty,
16697 .{ .register = elem_reg },
16698 Type.u8,
16699 .{ .immediate = elem_bit_off },
16700 );
16701 try self.genBinOpMir(
16702 .{ ._, .@"or" },
16703 elem_ty,
16704 .{ .load_frame = .{ .index = frame_index, .off = elem_byte_off } },
16705 .{ .register = elem_reg },
16706 );
16707 if (elem_bit_off > elem_extra_bits) {16711 if (elem_bit_off > elem_extra_bits) {
16708 const reg = try self.copyToTmpRegister(elem_ty, mat_elem_mcv);16712 const temp_reg = try self.copyToTmpRegister(elem_ty, mat_elem_mcv);
16713 const temp_alias = registerAlias(temp_reg, elem_abi_size);
16714 const temp_lock = self.register_manager.lockRegAssumeUnused(temp_reg);
16715 defer self.register_manager.unlockReg(temp_lock);
16716
16709 if (elem_extra_bits > 0) {16717 if (elem_extra_bits > 0) {
16710 try self.truncateRegister(elem_ty, registerAlias(reg, elem_abi_size));16718 try self.truncateRegister(elem_ty, temp_alias);
16711 }16719 }
16712 try self.genShiftBinOpMir(16720 try self.genShiftBinOpMir(
16713 .{ ._r, .sh },16721 .{ ._r, .sh },
16714 elem_ty,16722 elem_ty,
16715 .{ .register = reg },16723 .{ .register = temp_reg },
16716 Type.u8,16724 Type.u8,
16717 .{ .immediate = elem_abi_bits - elem_bit_off },16725 .{ .immediate = elem_abi_bits - elem_bit_off },
16718 );16726 );
...@@ -16723,7 +16731,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {...@@ -16723,7 +16731,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
16723 .index = frame_index,16731 .index = frame_index,
16724 .off = elem_byte_off + @as(i32, @intCast(elem_abi_size)),16732 .off = elem_byte_off + @as(i32, @intCast(elem_abi_size)),
16725 } },16733 } },
16726 .{ .register = reg },16734 .{ .register = temp_alias },
16727 );16735 );
16728 }16736 }
16729 }16737 }
src/codegen/llvm/Builder.zig+18-4
...@@ -7220,17 +7220,31 @@ pub const Constant = enum(u32) {...@@ -7220,17 +7220,31 @@ pub const Constant = enum(u32) {
7220 };7220 };
7221 }7221 }
7222 };7222 };
7223 const Mantissa64 = std.meta.FieldType(Float.Repr(f64), .mantissa);
7223 const Exponent32 = std.meta.FieldType(Float.Repr(f32), .exponent);7224 const Exponent32 = std.meta.FieldType(Float.Repr(f32), .exponent);
7224 const Exponent64 = std.meta.FieldType(Float.Repr(f64), .exponent);7225 const Exponent64 = std.meta.FieldType(Float.Repr(f64), .exponent);
7226
7225 const repr: Float.Repr(f32) = @bitCast(item.data);7227 const repr: Float.Repr(f32) = @bitCast(item.data);
7228 const denormal_shift = switch (repr.exponent) {
7229 std.math.minInt(Exponent32) => @as(
7230 std.math.Log2Int(Mantissa64),
7231 @clz(repr.mantissa),
7232 ) + 1,
7233 else => 0,
7234 };
7226 try writer.print("0x{X:0>16}", .{@as(u64, @bitCast(Float.Repr(f64){7235 try writer.print("0x{X:0>16}", .{@as(u64, @bitCast(Float.Repr(f64){
7227 .mantissa = std.math.shl(7236 .mantissa = std.math.shl(
7228 std.meta.FieldType(Float.Repr(f64), .mantissa),7237 Mantissa64,
7229 repr.mantissa,7238 repr.mantissa,
7230 std.math.floatMantissaBits(f64) - std.math.floatMantissaBits(f32),7239 std.math.floatMantissaBits(f64) - std.math.floatMantissaBits(f32) +
7240 denormal_shift,
7231 ),7241 ),
7232 .exponent = switch (repr.exponent) {7242 .exponent = switch (repr.exponent) {
7233 std.math.minInt(Exponent32) => std.math.minInt(Exponent64),7243 std.math.minInt(Exponent32) => if (repr.mantissa > 0)
7244 @as(Exponent64, std.math.floatExponentMin(f32) +
7245 std.math.floatExponentMax(f64)) - denormal_shift
7246 else
7247 std.math.minInt(Exponent64),
7234 else => @as(Exponent64, repr.exponent) +7248 else => @as(Exponent64, repr.exponent) +
7235 (std.math.floatExponentMax(f64) - std.math.floatExponentMax(f32)),7249 (std.math.floatExponentMax(f64) - std.math.floatExponentMax(f32)),
7236 std.math.maxInt(Exponent32) => std.math.maxInt(Exponent64),7250 std.math.maxInt(Exponent32) => std.math.maxInt(Exponent64),
...@@ -9920,7 +9934,7 @@ pub fn printUnbuffered(...@@ -9920,7 +9934,7 @@ pub fn printUnbuffered(
9920 .scope = extra.file,9934 .scope = extra.file,
9921 .file = extra.file,9935 .file = extra.file,
9922 .line = extra.line,9936 .line = extra.line,
9923 .type = null,9937 .type = extra.ty,
9924 .scopeLine = extra.scope_line,9938 .scopeLine = extra.scope_line,
9925 .containingType = null,9939 .containingType = null,
9926 .virtualIndex = null,9940 .virtualIndex = null,