authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-05-26 13:24:57+07:00
committergravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-05-26 13:48:29+07:00
log3923722cc617251de91d5bc9a5d4f9c0ca93ee1a
tree937db6c3273471c39544c06a83711442036287bb
parent5fa971610e0f987938d43da9d3a40e2a31fe4605

stage2: sparc64: Account for stack bias & reserved area in genSetReg

genSetReg with ptr_stack_offset should add the bias and reserved area before emitting the instruction.

2 files changed, 13 insertions(+), 13 deletions(-)

src/arch/sparc64/CodeGen.zig+6-6
...@@ -352,7 +352,7 @@ fn gen(self: *Self) !void {...@@ -352,7 +352,7 @@ fn gen(self: *Self) !void {
352 if (cc != .Naked) {352 if (cc != .Naked) {
353 // TODO Finish function prologue and epilogue for sparc64.353 // TODO Finish function prologue and epilogue for sparc64.
354354
355 // save %sp, stack_save_area, %sp355 // save %sp, stack_reserved_area, %sp
356 const save_inst = try self.addInst(.{356 const save_inst = try self.addInst(.{
357 .tag = .save,357 .tag = .save,
358 .data = .{358 .data = .{
...@@ -360,7 +360,7 @@ fn gen(self: *Self) !void {...@@ -360,7 +360,7 @@ fn gen(self: *Self) !void {
360 .is_imm = true,360 .is_imm = true,
361 .rd = .sp,361 .rd = .sp,
362 .rs1 = .sp,362 .rs1 = .sp,
363 .rs2_or_imm = .{ .imm = -abi.stack_save_area },363 .rs2_or_imm = .{ .imm = -abi.stack_reserved_area },
364 },364 },
365 },365 },
366 });366 });
...@@ -407,7 +407,7 @@ fn gen(self: *Self) !void {...@@ -407,7 +407,7 @@ fn gen(self: *Self) !void {
407 }407 }
408408
409 // Backpatch stack offset409 // Backpatch stack offset
410 const total_stack_size = self.max_end_stack + abi.stack_save_area; // TODO + self.saved_regs_stack_space;410 const total_stack_size = self.max_end_stack + abi.stack_reserved_area; // TODO + self.saved_regs_stack_space;
411 const stack_size = mem.alignForwardGeneric(u32, total_stack_size, self.stack_align);411 const stack_size = mem.alignForwardGeneric(u32, total_stack_size, self.stack_align);
412 if (math.cast(i13, stack_size)) |size| {412 if (math.cast(i13, stack_size)) |size| {
413 self.mir_instructions.set(save_inst, .{413 self.mir_instructions.set(save_inst, .{
...@@ -2299,7 +2299,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void...@@ -2299,7 +2299,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
2299 return self.genSetReg(ty, reg, .{ .immediate = 0xaaaaaaaaaaaaaaaa });2299 return self.genSetReg(ty, reg, .{ .immediate = 0xaaaaaaaaaaaaaaaa });
2300 },2300 },
2301 .ptr_stack_offset => |off| {2301 .ptr_stack_offset => |off| {
2302 const simm13 = math.cast(u12, off) catch2302 const simm13 = math.cast(u12, off + abi.stack_bias + abi.stack_reserved_area) catch
2303 return self.fail("TODO larger stack offsets", .{});2303 return self.fail("TODO larger stack offsets", .{});
23042304
2305 _ = try self.addInst(.{2305 _ = try self.addInst(.{
...@@ -2431,7 +2431,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void...@@ -2431,7 +2431,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
2431 try self.genLoad(reg, reg, i13, 0, ty.abiSize(self.target.*));2431 try self.genLoad(reg, reg, i13, 0, ty.abiSize(self.target.*));
2432 },2432 },
2433 .stack_offset => |off| {2433 .stack_offset => |off| {
2434 const real_offset = off + abi.stack_bias + abi.stack_save_area;2434 const real_offset = off + abi.stack_bias + abi.stack_reserved_area;
2435 const simm13 = math.cast(i13, real_offset) catch2435 const simm13 = math.cast(i13, real_offset) catch
2436 return self.fail("TODO larger stack offsets", .{});2436 return self.fail("TODO larger stack offsets", .{});
2437 try self.genLoad(reg, .sp, i13, simm13, ty.abiSize(self.target.*));2437 try self.genLoad(reg, .sp, i13, simm13, ty.abiSize(self.target.*));
...@@ -2465,7 +2465,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro...@@ -2465,7 +2465,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
2465 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });2465 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
2466 },2466 },
2467 .register => |reg| {2467 .register => |reg| {
2468 const real_offset = stack_offset + abi.stack_bias + abi.stack_save_area;2468 const real_offset = stack_offset + abi.stack_bias + abi.stack_reserved_area;
2469 const simm13 = math.cast(i13, real_offset) catch2469 const simm13 = math.cast(i13, real_offset) catch
2470 return self.fail("TODO larger stack offsets", .{});2470 return self.fail("TODO larger stack offsets", .{});
2471 return self.genStore(reg, .sp, i13, simm13, abi_size);2471 return self.genStore(reg, .sp, i13, simm13, abi_size);
src/arch/sparc64/abi.zig+7-7
...@@ -3,17 +3,17 @@ const bits = @import("bits.zig");...@@ -3,17 +3,17 @@ const bits = @import("bits.zig");
3const Register = bits.Register;3const Register = bits.Register;
4const RegisterManagerFn = @import("../../register_manager.zig").RegisterManager;4const RegisterManagerFn = @import("../../register_manager.zig").RegisterManager;
55
6// SPARCv9 stack constants.6// SPARCv9 SysV ABI stack constants.
7// See: Registers and the Stack Frame, page 3P-8, SCD 2.4.1.7// See: Registers and the Stack Frame, page 3P-8, SCD 2.4.1.
88
9// On SPARCv9, %sp points to top of stack + stack bias,9// The ABI specifies that %sp points to top of stack - stack bias,
10// and %fp points to top of previous frame + stack bias.10// and %fp points to top of previous frame - stack bias.
11pub const stack_bias = 2047;11pub const stack_bias = 2047;
1212
13// The first 176 bytes of the stack is reserved for register saving purposes.13// The first 128 bytes of the stack is reserved for register saving purposes.
14// SPARCv9 requires to reserve space in the stack for the first six arguments,14// The ABI also requires to reserve space in the stack for the first six
15// even though they are usually passed in registers.15// outgoing arguments, even though they are usually passed in registers.
16pub const stack_save_area = 176;16pub const stack_reserved_area = 128 + 48;
1717
18// There are no callee-preserved registers since the windowing18// There are no callee-preserved registers since the windowing
19// mechanism already takes care of them.19// mechanism already takes care of them.