From be6ac82ee1dc6619576da6dc7ba04213faea998d Mon Sep 17 00:00:00 2001 From: joachimschmidt557 Date: Sun, 3 Jan 2021 21:57:41 +0100 Subject: stage2 ARM: fix stack offsets for genSetReg and genSetStack --- src/codegen.zig | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src/codegen.zig') diff --git a/src/codegen.zig b/src/codegen.zig index 981f88abc3..d704744486 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -2575,12 +2575,12 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { return self.fail(src, "TODO implement set stack variable from embedded_in_code", .{}); }, .register => |reg| { - // TODO: strh - const offset = if (stack_offset <= math.maxInt(u12)) blk: { - break :blk Instruction.Offset.imm(@intCast(u12, stack_offset)); - } else Instruction.Offset.reg(try self.copyToTmpRegister(src, MCValue{ .immediate = stack_offset }), 0); - const abi_size = ty.abiSize(self.target.*); + const adj_off = stack_offset + abi_size; + const offset = if (adj_off <= math.maxInt(u12)) blk: { + break :blk Instruction.Offset.imm(@intCast(u12, adj_off)); + } else Instruction.Offset.reg(try self.copyToTmpRegister(src, MCValue{ .immediate = adj_off }), 0); + switch (abi_size) { 1 => writeInt(u32, try self.code.addManyAsArray(4), Instruction.strb(.al, reg, .fp, .{ .offset = offset, @@ -2778,21 +2778,21 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { writeInt(u32, try self.code.addManyAsArray(4), Instruction.ldr(.al, reg, reg, .{ .offset = Instruction.Offset.none }).toU32()); }, .stack_offset => |unadjusted_off| { - // TODO: ldrh // TODO: maybe addressing from sp instead of fp - const offset = if (unadjusted_off <= math.maxInt(u12)) blk: { - break :blk Instruction.Offset.imm(@intCast(u12, unadjusted_off)); - } else Instruction.Offset.reg(try self.copyToTmpRegister(src, MCValue{ .immediate = unadjusted_off }), 0); - // TODO: supply type information to genSetReg as we do to genSetStack // const abi_size = ty.abiSize(self.target.*); const abi_size = 4; + const adj_off = unadjusted_off + abi_size; + const offset = if (adj_off <= math.maxInt(u12)) blk: { + break :blk Instruction.Offset.imm(@intCast(u12, adj_off)); + } else Instruction.Offset.reg(try self.copyToTmpRegister(src, MCValue{ .immediate = adj_off }), 0); + switch (abi_size) { 1 => writeInt(u32, try self.code.addManyAsArray(4), Instruction.ldrb(.al, reg, .fp, .{ .offset = offset, .positive = false, }).toU32()), - 2 => return self.fail(src, "TODO implement strh", .{}), + 2 => return self.fail(src, "TODO implement ldrh", .{}), 4 => writeInt(u32, try self.code.addManyAsArray(4), Instruction.ldr(.al, reg, .fp, .{ .offset = offset, .positive = false, -- cgit v1.2.3