@@ -100824,45 +100824,34 @@ 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() },
100835
100835
.mod = .{ .rm = .{ .disp = off } },
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);
0 commit comments