From 8f2aa72af7695dc8fba9946b60129a4f615d6727 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Wed, 8 Nov 2023 07:20:18 -0500 Subject: x86_64: fix optional comparison --- src/arch/x86_64/CodeGen.zig | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 16a4b4a7f4..4501a01c66 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -4877,11 +4877,14 @@ fn airWrapOptional(self: *Self, inst: Air.Inst.Index) !void { switch (opt_mcv) { else => unreachable, - .register => |opt_reg| try self.asmRegisterImmediate( - .{ ._s, .bt }, - opt_reg, - Immediate.u(@as(u6, @intCast(pl_abi_size * 8))), - ), + .register => |opt_reg| { + try self.truncateRegister(pl_ty, opt_reg); + try self.asmRegisterImmediate( + .{ ._s, .bt }, + opt_reg, + Immediate.u(@as(u6, @intCast(pl_abi_size * 8))), + ); + }, .load_frame => |frame_addr| try self.asmMemoryImmediate( .{ ._, .mov }, -- cgit v1.2.3 From 6c15c34421bbecb8eba7abf56e277ec26a4f018c Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Wed, 8 Nov 2023 07:44:48 -0500 Subject: MachO: support `-fsingle-threaded` mode --- src/link/MachO/uuid.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/link/MachO/uuid.zig b/src/link/MachO/uuid.zig index bfd602d62a..e62e3216f0 100644 --- a/src/link/MachO/uuid.zig +++ b/src/link/MachO/uuid.zig @@ -5,7 +5,7 @@ /// TODO LLD also hashes the output filename to disambiguate between same builds with different /// output files. Should we also do that? pub fn calcUuid(comp: *const Compilation, file: fs.File, file_size: u64, out: *[Md5.digest_length]u8) !void { - const num_chunks = comp.thread_pool.threads.len * 0x10; + const num_chunks = @max(comp.thread_pool.threads.len, 1) * 0x10; const chunk_size = @divTrunc(file_size, num_chunks); const actual_num_chunks = if (@rem(file_size, num_chunks) > 0) num_chunks + 1 else num_chunks; -- cgit v1.2.3 From e387d30b26c62c38c7dd3c92657bfed33b993135 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Wed, 8 Nov 2023 08:49:03 -0500 Subject: x86_64: fix signed not of more than 64 bits --- src/arch/x86_64/CodeGen.zig | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 4501a01c66..95eb16c267 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -7433,16 +7433,20 @@ fn genUnOp(self: *Self, maybe_inst: ?Air.Inst.Index, tag: Air.Inst.Tag, src_air: }; defer if (dst_lock) |lock| self.register_manager.unlockReg(lock); + const abi_size: u16 = @intCast(src_ty.abiSize(mod)); switch (tag) { .not => { - const limb_abi_size: u16 = @intCast(@min(src_ty.abiSize(mod), 8)); + const limb_abi_size: u16 = @min(abi_size, 8); const int_info = if (src_ty.ip_index == .bool_type) std.builtin.Type.Int{ .signedness = .unsigned, .bits = 1 } else src_ty.intInfo(mod); var byte_off: i32 = 0; while (byte_off * 8 < int_info.bits) : (byte_off += limb_abi_size) { - const limb_bits: u16 = @intCast(@min(int_info.bits - byte_off * 8, limb_abi_size * 8)); + const limb_bits: u16 = @intCast(@min(switch (int_info.signedness) { + .signed => abi_size * 8, + .unsigned => int_info.bits, + } - byte_off * 8, limb_abi_size * 8)); const limb_ty = try mod.intType(int_info.signedness, limb_bits); const limb_mcv = switch (byte_off) { 0 => dst_mcv, @@ -7457,7 +7461,6 @@ fn genUnOp(self: *Self, maybe_inst: ?Air.Inst.Index, tag: Air.Inst.Tag, src_air: }, .neg => { try self.genUnOpMir(.{ ._, .neg }, src_ty, dst_mcv); - const abi_size: u16 = @intCast(src_ty.abiSize(mod)); const bit_size = src_ty.intInfo(mod).bits; if (abi_size * 8 > bit_size) { if (dst_mcv.isRegister()) { -- cgit v1.2.3