| ... | ... | @@ -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: { |