authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-01 20:36:37-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-04 14:42:35-04:00
log9748096992620a9b1a2169ed3be34616fe417a99
tree9e5d85433310efb2c3a8c887f08d672376cbe32f
parent08c24935b167b1a2c6c8dfe20acb386a57c59f3f

x86_64: fix various crashes


1 files changed, 18 insertions(+), 13 deletions(-)

src/arch/x86_64/CodeGen.zig+18-13
......@@ -9528,13 +9528,16 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
95289528 extra_i += inputs.len;
95299529
95309530 var result: MCValue = .none;
9531 var args = std.StringArrayHashMap(MCValue).init(self.gpa);
9531 var args = std.ArrayList(MCValue).init(self.gpa);
95329532 try args.ensureTotalCapacity(outputs.len + inputs.len);
95339533 defer {
9534 for (args.values()) |arg| if (arg.getReg()) |reg|
9534 for (args.items) |arg| if (arg.getReg()) |reg|
95359535 self.register_manager.unlockReg(.{ .register = reg });
95369536 args.deinit();
95379537 }
9538 var arg_map = std.StringHashMap(u8).init(self.gpa);
9539 try arg_map.ensureTotalCapacity(@intCast(outputs.len + inputs.len));
9540 defer arg_map.deinit();
95389541
95399542 var outputs_extra_i = extra_i;
95409543 for (outputs) |output| {
......@@ -9585,7 +9588,9 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
95859588 if (arg_mcv.getReg()) |reg| if (RegisterManager.indexOfRegIntoTracked(reg)) |_| {
95869589 _ = self.register_manager.lockRegAssumeUnused(reg);
95879590 };
9588 args.putAssumeCapacity(name, arg_mcv);
9591 if (!std.mem.eql(u8, name, "_"))
9592 arg_map.putAssumeCapacityNoClobber(name, @intCast(args.items.len));
9593 args.appendAssumeCapacity(arg_mcv);
95899594 if (output == .none) result = arg_mcv;
95909595 }
95919596
......@@ -9643,7 +9648,9 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
96439648 if (arg_mcv.getReg()) |reg| if (RegisterManager.indexOfRegIntoTracked(reg)) |_| {
96449649 _ = self.register_manager.lockReg(reg);
96459650 };
9646 args.putAssumeCapacity(name, arg_mcv);
9651 if (!std.mem.eql(u8, name, "_"))
9652 arg_map.putAssumeCapacityNoClobber(name, @intCast(args.items.len));
9653 args.appendAssumeCapacity(arg_mcv);
96479654 }
96489655
96499656 {
......@@ -9712,8 +9719,10 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
97129719 op_str[colon_pos + 1 .. op_str.len - "]".len]
97139720 else
97149721 "";
9715 op.* = switch (args.get(op_str["%[".len .. colon orelse op_str.len - "]".len]) orelse
9716 return self.fail("no matching constraint: '{s}'", .{op_str})) {
9722 op.* = switch (args.items[
9723 arg_map.get(op_str["%[".len .. colon orelse op_str.len - "]".len]) orelse
9724 return self.fail("no matching constraint: '{s}'", .{op_str})
9725 ]) {
97179726 .register => |reg| if (std.mem.eql(u8, modifier, ""))
97189727 .{ .reg = reg }
97199728 else
......@@ -9826,7 +9835,7 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
98269835 };
98279836 }
98289837
9829 for (outputs, args.values()[0..outputs.len]) |output, mcv| {
9838 for (outputs, args.items[0..outputs.len]) |output, mcv| {
98309839 const extra_bytes = std.mem.sliceAsBytes(self.air.extra[outputs_extra_i..]);
98319840 const constraint =
98329841 std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra[outputs_extra_i..]), 0);
......@@ -10203,17 +10212,13 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr
1020310212 .sse => try self.asmRegisterRegister(
1020410213 @as(?Mir.Inst.FixedTag, switch (ty.scalarType(mod).zigTypeTag(mod)) {
1020510214 else => switch (abi_size) {
10206 1...4 => if (self.hasFeature(.avx)) .{ .v_d, .mov } else .{ ._d, .mov },
10207 5...8 => if (self.hasFeature(.avx)) .{ .v_q, .mov } else .{ ._q, .mov },
10208 9...16 => if (self.hasFeature(.avx)) .{ .v_, .movdqa } else .{ ._, .movdqa },
10215 1...16 => if (self.hasFeature(.avx)) .{ .v_, .movdqa } else .{ ._, .movdqa },
1020910216 17...32 => if (self.hasFeature(.avx)) .{ .v_, .movdqa } else null,
1021010217 else => null,
1021110218 },
1021210219 .Float => switch (ty.scalarType(mod).floatBits(self.target.*)) {
1021310220 16, 128 => switch (abi_size) {
10214 2...4 => if (self.hasFeature(.avx)) .{ .v_d, .mov } else .{ ._d, .mov },
10215 5...8 => if (self.hasFeature(.avx)) .{ .v_q, .mov } else .{ ._q, .mov },
10216 9...16 => if (self.hasFeature(.avx))
10221 2...16 => if (self.hasFeature(.avx))
1021710222 .{ .v_, .movdqa }
1021810223 else
1021910224 .{ ._, .movdqa },