authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2021-08-18 15:09:21+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-08-20 19:05:50-04:00
loge48d7bbb99a81d9e6058aa764266dcc3dbe71644
tree0fea65a266aed401565bf0e618ae1bf9e053bcae
parenta2438357e1f0f3853886a128f272cd27c714b176

stage2 ARM: Implement loading from memory


1 files changed, 27 insertions(+), 23 deletions(-)

src/codegen.zig+27-23
......@@ -1469,7 +1469,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
14691469 return true;
14701470 }
14711471
1472 fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) !void {
1472 fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!void {
14731473 const elem_ty = ptr_ty.elemType();
14741474 switch (ptr) {
14751475 .none => unreachable,
......@@ -1486,11 +1486,25 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
14861486 .embedded_in_code => {
14871487 return self.fail("TODO implement loading from MCValue.embedded_in_code", .{});
14881488 },
1489 .register => {
1490 return self.fail("TODO implement loading from MCValue.register", .{});
1489 .register => |reg| {
1490 switch (arch) {
1491 .arm, .armeb => switch (dst_mcv) {
1492 .dead => unreachable,
1493 .undef => unreachable,
1494 .compare_flags_signed, .compare_flags_unsigned => unreachable,
1495 .embedded_in_code => unreachable,
1496 .register => |dst_reg| {
1497 writeInt(u32, try self.code.addManyAsArray(4), Instruction.ldr(.al, dst_reg, reg, .{ .offset = Instruction.Offset.none }).toU32());
1498 },
1499 else => return self.fail("TODO load from register into {}", .{dst_mcv}),
1500 },
1501 else => return self.fail("TODO implement loading from MCValue.register for {}", .{arch}),
1502 }
14911503 },
1492 .memory => {
1493 return self.fail("TODO implement loading from MCValue.memory", .{});
1504 .memory => |addr| {
1505 const reg = try self.register_manager.allocReg(null, &.{});
1506 try self.genSetReg(ptr_ty, reg, .{ .memory = addr });
1507 try self.load(dst_mcv, .{ .register = reg }, ptr_ty);
14941508 },
14951509 .stack_offset => {
14961510 return self.fail("TODO implement loading from MCValue.stack_offset", .{});
......@@ -3884,15 +3898,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
38843898 else => return self.fail("TODO implement memset", .{}),
38853899 }
38863900 },
3887 .compare_flags_unsigned => |op| {
3888 _ = op;
3889 return self.fail("TODO implement set stack variable with compare flags value (unsigned)", .{});
3890 },
3891 .compare_flags_signed => |op| {
3892 _ = op;
3893 return self.fail("TODO implement set stack variable with compare flags value (signed)", .{});
3894 },
3895 .immediate => {
3901 .compare_flags_unsigned,
3902 .compare_flags_signed,
3903 .immediate,
3904 => {
38963905 const reg = try self.copyToTmpRegister(ty, mcv);
38973906 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
38983907 },
......@@ -4060,15 +4069,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
40604069 else => return self.fail("TODO implement memset", .{}),
40614070 }
40624071 },
4063 .compare_flags_unsigned => |op| {
4064 _ = op;
4065 return self.fail("TODO implement set stack variable with compare flags value (unsigned)", .{});
4066 },
4067 .compare_flags_signed => |op| {
4068 _ = op;
4069 return self.fail("TODO implement set stack variable with compare flags value (signed)", .{});
4070 },
4071 .immediate => {
4072 .compare_flags_unsigned,
4073 .compare_flags_signed,
4074 .immediate,
4075 => {
40724076 const reg = try self.copyToTmpRegister(ty, mcv);
40734077 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
40744078 },