| ... | ... | @@ -100824,11 +100824,11 @@ const Temp = struct { |
| 100824 | 100824 | const new_temp_index = cg.next_temp_index; |
| 100825 | 100825 | cg.temp_type[@intFromEnum(new_temp_index)] = .usize; |
| 100826 | 100826 | cg.next_temp_index = @enumFromInt(@intFromEnum(new_temp_index) + 1); |
| 100827 | | switch (temp.tracking(cg).short) { |
| 100828 | | else => |mcv| std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }), |
| 100827 | const mcv = temp.tracking(cg).short; |
| 100828 | switch (mcv) { |
| 100829 | else => std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }), |
| 100829 | 100830 | .register => |reg| { |
| 100830 | | const new_reg = |
| 100831 | | try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); |
| 100831 | const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); |
| 100832 | 100832 | new_temp_index.tracking(cg).* = .init(.{ .register = new_reg }); |
| 100833 | 100833 | try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{ |
| 100834 | 100834 | .base = .{ .reg = reg.to64() }, |
| ... | ... | @@ -100836,33 +100836,22 @@ const Temp = struct { |
| 100836 | 100836 | }); |
| 100837 | 100837 | }, |
| 100838 | 100838 | .register_offset => |reg_off| { |
| 100839 | | const new_reg = |
| 100840 | | try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); |
| 100839 | const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp); |
| 100841 | 100840 | new_temp_index.tracking(cg).* = .init(.{ .register = new_reg }); |
| 100842 | 100841 | try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{ |
| 100843 | 100842 | .base = .{ .reg = reg_off.reg.to64() }, |
| 100844 | 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 | 100851 | .lea_symbol => |sym_off| new_temp_index.tracking(cg).* = .init(.{ .lea_symbol = .{ |
| 100848 | 100852 | .sym_index = sym_off.sym_index, |
| 100849 | 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 | 100855 | .lea_frame => |frame_addr| new_temp_index.tracking(cg).* = .init(.{ .lea_frame = .{ |
| 100867 | 100856 | .index = frame_addr.index, |
| 100868 | 100857 | .off = frame_addr.off + off, |
| ... | ... | @@ -101179,7 +101168,8 @@ const Temp = struct { |
| 101179 | 101168 | => return temp.toRegClass(true, .general_purpose, cg), |
| 101180 | 101169 | .lea_symbol => |sym_off| { |
| 101181 | 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 | 101173 | try temp.toOffset(-off, cg); |
| 101184 | 101174 | while (try temp.toRegClass(true, .general_purpose, cg)) {} |
| 101185 | 101175 | try temp.toOffset(off, cg); |