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 {
1668316683 else => null,
1668416684 };
1668516685 defer if (elem_lock) |lock| self.register_manager.unlockReg(lock);
16686 const elem_reg = registerAlias(
16687 try self.copyToTmpRegister(elem_ty, mat_elem_mcv),
16688 elem_abi_size,
16689 );
16686
1669016687 const elem_extra_bits = self.regExtraBits(elem_ty);
16691 if (elem_bit_off < elem_extra_bits) {
16692 try self.truncateRegister(elem_ty, elem_reg);
16688 {
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 );
1669316710 }
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 );
1670716711 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
1670916717 if (elem_extra_bits > 0) {
16710 try self.truncateRegister(elem_ty, registerAlias(reg, elem_abi_size));
16718 try self.truncateRegister(elem_ty, temp_alias);
1671116719 }
1671216720 try self.genShiftBinOpMir(
1671316721 .{ ._r, .sh },
1671416722 elem_ty,
16715 .{ .register = reg },
16723 .{ .register = temp_reg },
1671616724 Type.u8,
1671716725 .{ .immediate = elem_abi_bits - elem_bit_off },
1671816726 );
......@@ -16723,7 +16731,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
1672316731 .index = frame_index,
1672416732 .off = elem_byte_off + @as(i32, @intCast(elem_abi_size)),
1672516733 } },
16726 .{ .register = reg },
16734 .{ .register = temp_alias },
1672716735 );
1672816736 }
1672916737 }
src/codegen/llvm/Builder.zig+18-4
......@@ -7220,17 +7220,31 @@ pub const Constant = enum(u32) {
72207220 };
72217221 }
72227222 };
7223 const Mantissa64 = std.meta.FieldType(Float.Repr(f64), .mantissa);
72237224 const Exponent32 = std.meta.FieldType(Float.Repr(f32), .exponent);
72247225 const Exponent64 = std.meta.FieldType(Float.Repr(f64), .exponent);
7226
72257227 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 };
72267235 try writer.print("0x{X:0>16}", .{@as(u64, @bitCast(Float.Repr(f64){
72277236 .mantissa = std.math.shl(
7228 std.meta.FieldType(Float.Repr(f64), .mantissa),
7237 Mantissa64,
72297238 repr.mantissa,
7230 std.math.floatMantissaBits(f64) - std.math.floatMantissaBits(f32),
7239 std.math.floatMantissaBits(f64) - std.math.floatMantissaBits(f32) +
7240 denormal_shift,
72317241 ),
72327242 .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),
72347248 else => @as(Exponent64, repr.exponent) +
72357249 (std.math.floatExponentMax(f64) - std.math.floatExponentMax(f32)),
72367250 std.math.maxInt(Exponent32) => std.math.maxInt(Exponent64),
......@@ -9920,7 +9934,7 @@ pub fn printUnbuffered(
99209934 .scope = extra.file,
99219935 .file = extra.file,
99229936 .line = extra.line,
9923 .type = null,
9937 .type = extra.ty,
99249938 .scopeLine = extra.scope_line,
99259939 .containingType = null,
99269940 .virtualIndex = null,