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