@@ -1103,11 +1103,7 @@ const FormatAirData = struct {
1103
1103
inst: Air.Inst.Index,
1104
1104
};
1105
1105
fn formatAir(data: FormatAirData, w: *std.io.Writer) Writer.Error!void {
1106
- // not acceptable implementation because it ignores `w`:
1107
- //data.self.air.dumpInst(data.inst, data.self.pt, data.self.liveness);
1108
- _ = data;
1109
- _ = w;
1110
- @panic("TODO: unimplemented");
1106
+ data.self.air.writeInst(w, data.inst, data.self.pt, data.self.liveness);
1111
1107
}
1112
1108
fn fmtAir(self: *CodeGen, inst: Air.Inst.Index) std.fmt.Formatter(FormatAirData, formatAir) {
1113
1109
return .{ .data = .{ .self = self, .inst = inst } };
@@ -179300,10 +179296,13 @@ fn lowerSwitchBr(
179300
179296
} else undefined;
179301
179297
const table_start: u31 = @intCast(cg.mir_table.items.len);
179302
179298
{
179303
- const condition_index_reg = if (condition_index.isRegister())
179304
- condition_index.getReg().?
179305
- else
179306
- try cg.copyToTmpRegister(.usize, condition_index);
179299
+ const condition_index_reg = condition_index_reg: {
179300
+ if (condition_index.isRegister()) {
179301
+ const condition_index_reg = condition_index.getReg().?;
179302
+ if (condition_index_reg.isClass(.general_purpose)) break :condition_index_reg condition_index_reg;
179303
+ }
179304
+ break :condition_index_reg try cg.copyToTmpRegister(.usize, condition_index);
179305
+ };
179307
179306
const condition_index_lock = cg.register_manager.lockReg(condition_index_reg);
179308
179307
defer if (condition_index_lock) |lock| cg.register_manager.unlockReg(lock);
179309
179308
try cg.truncateRegister(condition_ty, condition_index_reg);
@@ -191921,18 +191920,15 @@ const Select = struct {
191921
191920
error.InvalidInstruction => {
191922
191921
const fixes = @tagName(mir_tag[0]);
191923
191922
const fixes_blank = std.mem.indexOfScalar(u8, fixes, '_').?;
191924
- return s.cg.fail(
191925
- "invalid instruction: '{s}{s}{s} {s} {s} {s} {s}'",
191926
- .{
191927
- fixes[0..fixes_blank],
191928
- @tagName(mir_tag[1]),
191929
- fixes[fixes_blank + 1 ..],
191930
- @tagName(mir_ops[0]),
191931
- @tagName(mir_ops[1]),
191932
- @tagName(mir_ops[2]),
191933
- @tagName(mir_ops[3]),
191934
- },
191935
- );
191923
+ return s.cg.fail("invalid instruction: '{s}{s}{s} {s} {s} {s} {s}'", .{
191924
+ fixes[0..fixes_blank],
191925
+ @tagName(mir_tag[1]),
191926
+ fixes[fixes_blank + 1 ..],
191927
+ @tagName(mir_ops[0]),
191928
+ @tagName(mir_ops[1]),
191929
+ @tagName(mir_ops[2]),
191930
+ @tagName(mir_ops[3]),
191931
+ });
191936
191932
},
191937
191933
else => |e| return e,
191938
191934
};
@@ -194424,6 +194420,18 @@ fn select(
194424
194420
while (true) for (pattern.src[0..src_temps.len], src_temps) |src_pattern, *src_temp| {
194425
194421
if (try src_pattern.convert(src_temp, cg)) break;
194426
194422
} else break;
194423
+ var src_locks: [s_src_temps.len][2]?RegisterLock = @splat(@splat(null));
194424
+ for (src_locks[0..src_temps.len], src_temps) |*locks, src_temp| {
194425
+ const regs: [2]Register = switch (src_temp.tracking(cg).short) {
194426
+ else => continue,
194427
+ .register => |reg| .{ reg, .none },
194428
+ .register_pair => |regs| regs,
194429
+ };
194430
+ for (regs, locks) |reg, *lock| {
194431
+ if (reg == .none) continue;
194432
+ lock.* = cg.register_manager.lockRegIndex(RegisterManager.indexOfRegIntoTracked(reg) orelse continue);
194433
+ }
194434
+ }
194427
194435
@memcpy(s_src_temps[0..src_temps.len], src_temps);
194428
194436
std.mem.swap(Temp, &s_src_temps[pattern.commute[0]], &s_src_temps[pattern.commute[1]]);
194429
194437
@@ -194442,6 +194450,7 @@ fn select(
194442
194450
}
194443
194451
assert(s.top == 0);
194444
194452
194453
+ for (src_locks) |locks| for (locks) |lock| if (lock) |reg| cg.register_manager.unlockReg(reg);
194445
194454
for (tmp_locks) |locks| for (locks) |lock| if (lock) |reg| cg.register_manager.unlockReg(reg);
194446
194455
for (dst_locks) |locks| for (locks) |lock| if (lock) |reg| cg.register_manager.unlockReg(reg);
194447
194456
caller_preserved: {
0 commit comments