mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
parent
e83607f52c
commit
0ef3250c34
1 changed files with 12 additions and 22 deletions
|
|
@ -100824,11 +100824,11 @@ const Temp = struct {
|
|||
const new_temp_index = cg.next_temp_index;
|
||||
cg.temp_type[@intFromEnum(new_temp_index)] = .usize;
|
||||
cg.next_temp_index = @enumFromInt(@intFromEnum(new_temp_index) + 1);
|
||||
switch (temp.tracking(cg).short) {
|
||||
else => |mcv| std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),
|
||||
const mcv = temp.tracking(cg).short;
|
||||
switch (mcv) {
|
||||
else => std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),
|
||||
.register => |reg| {
|
||||
const new_reg =
|
||||
try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
|
||||
const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
|
||||
new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });
|
||||
try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{
|
||||
.base = .{ .reg = reg.to64() },
|
||||
|
|
@ -100836,33 +100836,22 @@ const Temp = struct {
|
|||
});
|
||||
},
|
||||
.register_offset => |reg_off| {
|
||||
const new_reg =
|
||||
try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
|
||||
const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
|
||||
new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });
|
||||
try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{
|
||||
.base = .{ .reg = reg_off.reg.to64() },
|
||||
.mod = .{ .rm = .{ .disp = reg_off.off + off } },
|
||||
});
|
||||
},
|
||||
.load_symbol, .load_frame => {
|
||||
const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
|
||||
new_temp_index.tracking(cg).* = .init(.{ .register_offset = .{ .reg = new_reg, .off = off } });
|
||||
try cg.genSetReg(new_reg, .usize, mcv, .{});
|
||||
},
|
||||
.lea_symbol => |sym_off| new_temp_index.tracking(cg).* = .init(.{ .lea_symbol = .{
|
||||
.sym_index = sym_off.sym_index,
|
||||
.off = sym_off.off + off,
|
||||
} }),
|
||||
.load_frame => |frame_addr| {
|
||||
const new_reg =
|
||||
try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
|
||||
new_temp_index.tracking(cg).* = .init(.{ .register_offset = .{
|
||||
.reg = new_reg,
|
||||
.off = off,
|
||||
} });
|
||||
try cg.asmRegisterMemory(.{ ._, .mov }, new_reg.to64(), .{
|
||||
.base = .{ .frame = frame_addr.index },
|
||||
.mod = .{ .rm = .{
|
||||
.size = .qword,
|
||||
.disp = frame_addr.off,
|
||||
} },
|
||||
});
|
||||
},
|
||||
.lea_frame => |frame_addr| new_temp_index.tracking(cg).* = .init(.{ .lea_frame = .{
|
||||
.index = frame_addr.index,
|
||||
.off = frame_addr.off + off,
|
||||
|
|
@ -101179,7 +101168,8 @@ const Temp = struct {
|
|||
=> return temp.toRegClass(true, .general_purpose, cg),
|
||||
.lea_symbol => |sym_off| {
|
||||
const off = sym_off.off;
|
||||
if (off == 0) return false;
|
||||
// hack around linker relocation bugs
|
||||
if (false and off == 0) return false;
|
||||
try temp.toOffset(-off, cg);
|
||||
while (try temp.toRegClass(true, .general_purpose, cg)) {}
|
||||
try temp.toOffset(off, cg);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue