| ... | @@ -1735,7 +1735,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -1735,7 +1735,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 1735 | | 1735 | |
| 1736 | switch (result) { | 1736 | switch (result) { |
| 1737 | .register => |reg| { | 1737 | .register => |reg| { |
| 1738 | try self.register_manager.getRegAssumeFree(toCanonicalReg(reg), &inst.base); | 1738 | try self.register_manager.registers.ensureCapacity(self.gpa, self.register_manager.registers.count() + 1); |
| | 1739 | self.register_manager.getRegAssumeFree(toCanonicalReg(reg), &inst.base); |
| 1739 | }, | 1740 | }, |
| 1740 | else => {}, | 1741 | else => {}, |
| 1741 | } | 1742 | } |
| ... | @@ -1783,8 +1784,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -1783,8 +1784,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 1783 | switch (mc_arg) { | 1784 | switch (mc_arg) { |
| 1784 | .none => continue, | 1785 | .none => continue, |
| 1785 | .register => |reg| { | 1786 | .register => |reg| { |
| | 1787 | try self.register_manager.getRegWithoutTracking(reg); |
| 1786 | try self.genSetReg(arg.src, arg.ty, reg, arg_mcv); | 1788 | try self.genSetReg(arg.src, arg.ty, reg, arg_mcv); |
| 1787 | // TODO interact with the register allocator to mark the instruction as moved. | | |
| 1788 | }, | 1789 | }, |
| 1789 | .stack_offset => { | 1790 | .stack_offset => { |
| 1790 | // Here we need to emit instructions like this: | 1791 | // Here we need to emit instructions like this: |
| ... | @@ -1925,8 +1926,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -1925,8 +1926,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 1925 | .compare_flags_signed => unreachable, | 1926 | .compare_flags_signed => unreachable, |
| 1926 | .compare_flags_unsigned => unreachable, | 1927 | .compare_flags_unsigned => unreachable, |
| 1927 | .register => |reg| { | 1928 | .register => |reg| { |
| | 1929 | try self.register_manager.getRegWithoutTracking(reg); |
| 1928 | try self.genSetReg(arg.src, arg.ty, reg, arg_mcv); | 1930 | try self.genSetReg(arg.src, arg.ty, reg, arg_mcv); |
| 1929 | // TODO interact with the register allocator to mark the instruction as moved. | | |
| 1930 | }, | 1931 | }, |
| 1931 | .stack_offset => { | 1932 | .stack_offset => { |
| 1932 | return self.fail(inst.base.src, "TODO implement calling with parameters in memory", .{}); | 1933 | return self.fail(inst.base.src, "TODO implement calling with parameters in memory", .{}); |
| ... | @@ -1988,8 +1989,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -1988,8 +1989,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 1988 | .compare_flags_signed => unreachable, | 1989 | .compare_flags_signed => unreachable, |
| 1989 | .compare_flags_unsigned => unreachable, | 1990 | .compare_flags_unsigned => unreachable, |
| 1990 | .register => |reg| { | 1991 | .register => |reg| { |
| | 1992 | try self.register_manager.getRegWithoutTracking(reg); |
| 1991 | try self.genSetReg(arg.src, arg.ty, reg, arg_mcv); | 1993 | try self.genSetReg(arg.src, arg.ty, reg, arg_mcv); |
| 1992 | // TODO interact with the register allocator to mark the instruction as moved. | | |
| 1993 | }, | 1994 | }, |
| 1994 | .stack_offset => { | 1995 | .stack_offset => { |
| 1995 | return self.fail(inst.base.src, "TODO implement calling with parameters in memory", .{}); | 1996 | return self.fail(inst.base.src, "TODO implement calling with parameters in memory", .{}); |
| ... | @@ -2039,8 +2040,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -2039,8 +2040,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 2039 | switch (mc_arg) { | 2040 | switch (mc_arg) { |
| 2040 | .none => continue, | 2041 | .none => continue, |
| 2041 | .register => |reg| { | 2042 | .register => |reg| { |
| | 2043 | try self.register_manager.getRegWithoutTracking(reg); |
| 2042 | try self.genSetReg(arg.src, arg.ty, reg, arg_mcv); | 2044 | try self.genSetReg(arg.src, arg.ty, reg, arg_mcv); |
| 2043 | // TODO interact with the register allocator to mark the instruction as moved. | | |
| 2044 | }, | 2045 | }, |
| 2045 | .stack_offset => { | 2046 | .stack_offset => { |
| 2046 | // Here we need to emit instructions like this: | 2047 | // Here we need to emit instructions like this: |
| ... | @@ -2704,8 +2705,11 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -2704,8 +2705,11 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 2704 | const reg_name = input[1 .. input.len - 1]; | 2705 | const reg_name = input[1 .. input.len - 1]; |
| 2705 | const reg = parseRegName(reg_name) orelse | 2706 | const reg = parseRegName(reg_name) orelse |
| 2706 | return self.fail(inst.base.src, "unrecognized register: '{s}'", .{reg_name}); | 2707 | return self.fail(inst.base.src, "unrecognized register: '{s}'", .{reg_name}); |
| 2707 | const arg = try self.resolveInst(inst.args[i]); | 2708 | |
| 2708 | try self.genSetReg(inst.base.src, inst.args[i].ty, reg, arg); | 2709 | const arg = inst.args[i]; |
| | 2710 | const arg_mcv = try self.resolveInst(arg); |
| | 2711 | try self.register_manager.getRegWithoutTracking(reg); |
| | 2712 | try self.genSetReg(inst.base.src, arg.ty, reg, arg_mcv); |
| 2709 | } | 2713 | } |
| 2710 | | 2714 | |
| 2711 | if (mem.eql(u8, inst.asm_source, "svc #0")) { | 2715 | if (mem.eql(u8, inst.asm_source, "svc #0")) { |
| ... | @@ -2734,8 +2738,11 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -2734,8 +2738,11 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 2734 | const reg_name = input[1 .. input.len - 1]; | 2738 | const reg_name = input[1 .. input.len - 1]; |
| 2735 | const reg = parseRegName(reg_name) orelse | 2739 | const reg = parseRegName(reg_name) orelse |
| 2736 | return self.fail(inst.base.src, "unrecognized register: '{s}'", .{reg_name}); | 2740 | return self.fail(inst.base.src, "unrecognized register: '{s}'", .{reg_name}); |
| 2737 | const arg = try self.resolveInst(inst.args[i]); | 2741 | |
| 2738 | try self.genSetReg(inst.base.src, inst.args[i].ty, reg, arg); | 2742 | const arg = inst.args[i]; |
| | 2743 | const arg_mcv = try self.resolveInst(arg); |
| | 2744 | try self.register_manager.getRegWithoutTracking(reg); |
| | 2745 | try self.genSetReg(inst.base.src, arg.ty, reg, arg_mcv); |
| 2739 | } | 2746 | } |
| 2740 | | 2747 | |
| 2741 | if (mem.eql(u8, inst.asm_source, "svc #0")) { | 2748 | if (mem.eql(u8, inst.asm_source, "svc #0")) { |
| ... | @@ -2766,8 +2773,11 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -2766,8 +2773,11 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 2766 | const reg_name = input[1 .. input.len - 1]; | 2773 | const reg_name = input[1 .. input.len - 1]; |
| 2767 | const reg = parseRegName(reg_name) orelse | 2774 | const reg = parseRegName(reg_name) orelse |
| 2768 | return self.fail(inst.base.src, "unrecognized register: '{s}'", .{reg_name}); | 2775 | return self.fail(inst.base.src, "unrecognized register: '{s}'", .{reg_name}); |
| 2769 | const arg = try self.resolveInst(inst.args[i]); | 2776 | |
| 2770 | try self.genSetReg(inst.base.src, inst.args[i].ty, reg, arg); | 2777 | const arg = inst.args[i]; |
| | 2778 | const arg_mcv = try self.resolveInst(arg); |
| | 2779 | try self.register_manager.getRegWithoutTracking(reg); |
| | 2780 | try self.genSetReg(inst.base.src, arg.ty, reg, arg_mcv); |
| 2771 | } | 2781 | } |
| 2772 | | 2782 | |
| 2773 | if (mem.eql(u8, inst.asm_source, "ecall")) { | 2783 | if (mem.eql(u8, inst.asm_source, "ecall")) { |
| ... | @@ -2796,8 +2806,11 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { | ... | @@ -2796,8 +2806,11 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { |
| 2796 | const reg_name = input[1 .. input.len - 1]; | 2806 | const reg_name = input[1 .. input.len - 1]; |
| 2797 | const reg = parseRegName(reg_name) orelse | 2807 | const reg = parseRegName(reg_name) orelse |
| 2798 | return self.fail(inst.base.src, "unrecognized register: '{s}'", .{reg_name}); | 2808 | return self.fail(inst.base.src, "unrecognized register: '{s}'", .{reg_name}); |
| 2799 | const arg = try self.resolveInst(inst.args[i]); | 2809 | |
| 2800 | try self.genSetReg(inst.base.src, inst.args[i].ty, reg, arg); | 2810 | const arg = inst.args[i]; |
| | 2811 | const arg_mcv = try self.resolveInst(arg); |
| | 2812 | try self.register_manager.getRegWithoutTracking(reg); |
| | 2813 | try self.genSetReg(inst.base.src, arg.ty, reg, arg_mcv); |
| 2801 | } | 2814 | } |
| 2802 | | 2815 | |
| 2803 | if (mem.eql(u8, inst.asm_source, "syscall")) { | 2816 | if (mem.eql(u8, inst.asm_source, "syscall")) { |