| ... | @@ -100824,11 +100824,11 @@ const Temp = struct { | ... | @@ -100824,11 +100824,11 @@ const Temp = struct { |
| 100824 | const new_temp_index = cg.next_temp_index; | 100824 | const new_temp_index = cg.next_temp_index; |
| 100825 | cg.temp_type[@intFromEnum(new_temp_index)] = .usize; | 100825 | cg.temp_type[@intFromEnum(new_temp_index)] = .usize; |
| 100826 | cg.next_temp_index = @enumFromInt(@intFromEnum(new_temp_index) + 1); | 100826 | cg.next_temp_index = @enumFromInt(@intFromEnum(new_temp_index) + 1); |
| 100827 | switch (temp.tracking(cg).short) { | 100827 | const mcv = temp.tracking(cg).short; |
| 100828 | else => |mcv| std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }), | 100828 | switch (mcv) { |
| | 100829 | else => std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }), |
| 100829 | .register => |reg| { | 100830 | .register => |reg| { |
| 100830 | const new_reg = | 100831 | const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); |
| 100831 | try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); | | |
| 100832 | new_temp_index.tracking(cg).* = .init(.{ .register = new_reg }); | 100832 | new_temp_index.tracking(cg).* = .init(.{ .register = new_reg }); |
| 100833 | try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{ | 100833 | try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{ |
| 100834 | .base = .{ .reg = reg.to64() }, | 100834 | .base = .{ .reg = reg.to64() }, |
| ... | @@ -100836,33 +100836,22 @@ const Temp = struct { | ... | @@ -100836,33 +100836,22 @@ const Temp = struct { |
| 100836 | }); | 100836 | }); |
| 100837 | }, | 100837 | }, |
| 100838 | .register_offset => |reg_off| { | 100838 | .register_offset => |reg_off| { |
| 100839 | const new_reg = | 100839 | const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); |
| 100840 | try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); | | |
| 100841 | new_temp_index.tracking(cg).* = .init(.{ .register = new_reg }); | 100840 | new_temp_index.tracking(cg).* = .init(.{ .register = new_reg }); |
| 100842 | try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{ | 100841 | try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{ |
| 100843 | .base = .{ .reg = reg_off.reg.to64() }, | 100842 | .base = .{ .reg = reg_off.reg.to64() }, |
| 100844 | .mod = .{ .rm = .{ .disp = reg_off.off + off } }, | 100843 | .mod = .{ .rm = .{ .disp = reg_off.off + off } }, |
| 100845 | }); | 100844 | }); |
| 100846 | }, | 100845 | }, |
| | 100846 | .load_symbol, .load_frame => { |
| | 100847 | const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); |
| | 100848 | new_temp_index.tracking(cg).* = .init(.{ .register_offset = .{ .reg = new_reg, .off = off } }); |
| | 100849 | try cg.genSetReg(new_reg, .usize, mcv, .{}); |
| | 100850 | }, |
| 100847 | .lea_symbol => |sym_off| new_temp_index.tracking(cg).* = .init(.{ .lea_symbol = .{ | 100851 | .lea_symbol => |sym_off| new_temp_index.tracking(cg).* = .init(.{ .lea_symbol = .{ |
| 100848 | .sym_index = sym_off.sym_index, | 100852 | .sym_index = sym_off.sym_index, |
| 100849 | .off = sym_off.off + off, | 100853 | .off = sym_off.off + off, |
| 100850 | } }), | 100854 | } }), |
| 100851 | .load_frame => |frame_addr| { | | |
| 100852 | const new_reg = | | |
| 100853 | try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); | | |
| 100854 | new_temp_index.tracking(cg).* = .init(.{ .register_offset = .{ | | |
| 100855 | .reg = new_reg, | | |
| 100856 | .off = off, | | |
| 100857 | } }); | | |
| 100858 | try cg.asmRegisterMemory(.{ ._, .mov }, new_reg.to64(), .{ | | |
| 100859 | .base = .{ .frame = frame_addr.index }, | | |
| 100860 | .mod = .{ .rm = .{ | | |
| 100861 | .size = .qword, | | |
| 100862 | .disp = frame_addr.off, | | |
| 100863 | } }, | | |
| 100864 | }); | | |
| 100865 | }, | | |
| 100866 | .lea_frame => |frame_addr| new_temp_index.tracking(cg).* = .init(.{ .lea_frame = .{ | 100855 | .lea_frame => |frame_addr| new_temp_index.tracking(cg).* = .init(.{ .lea_frame = .{ |
| 100867 | .index = frame_addr.index, | 100856 | .index = frame_addr.index, |
| 100868 | .off = frame_addr.off + off, | 100857 | .off = frame_addr.off + off, |
| ... | @@ -101179,7 +101168,8 @@ const Temp = struct { | ... | @@ -101179,7 +101168,8 @@ const Temp = struct { |
| 101179 | => return temp.toRegClass(true, .general_purpose, cg), | 101168 | => return temp.toRegClass(true, .general_purpose, cg), |
| 101180 | .lea_symbol => |sym_off| { | 101169 | .lea_symbol => |sym_off| { |
| 101181 | const off = sym_off.off; | 101170 | const off = sym_off.off; |
| 101182 | if (off == 0) return false; | 101171 | // hack around linker relocation bugs |
| | 101172 | if (false and off == 0) return false; |
| 101183 | try temp.toOffset(-off, cg); | 101173 | try temp.toOffset(-off, cg); |
| 101184 | while (try temp.toRegClass(true, .general_purpose, cg)) {} | 101174 | while (try temp.toRegClass(true, .general_purpose, cg)) {} |
| 101185 | try temp.toOffset(off, cg); | 101175 | try temp.toOffset(off, cg); |