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 {...@@ -1469,7 +1469,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
1469 return true;1469 return true;
1470 }1470 }
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 {
1473 const elem_ty = ptr_ty.elemType();1473 const elem_ty = ptr_ty.elemType();
1474 switch (ptr) {1474 switch (ptr) {
1475 .none => unreachable,1475 .none => unreachable,
...@@ -1486,11 +1486,25 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {...@@ -1486,11 +1486,25 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
1486 .embedded_in_code => {1486 .embedded_in_code => {
1487 return self.fail("TODO implement loading from MCValue.embedded_in_code", .{});1487 return self.fail("TODO implement loading from MCValue.embedded_in_code", .{});
1488 },1488 },
1489 .register => {1489 .register => |reg| {
1490 return self.fail("TODO implement loading from MCValue.register", .{});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 }
1491 },1503 },
1492 .memory => {1504 .memory => |addr| {
1493 return self.fail("TODO implement loading from MCValue.memory", .{});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);
1494 },1508 },
1495 .stack_offset => {1509 .stack_offset => {
1496 return self.fail("TODO implement loading from MCValue.stack_offset", .{});1510 return self.fail("TODO implement loading from MCValue.stack_offset", .{});
...@@ -3884,15 +3898,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {...@@ -3884,15 +3898,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
3884 else => return self.fail("TODO implement memset", .{}),3898 else => return self.fail("TODO implement memset", .{}),
3885 }3899 }
3886 },3900 },
3887 .compare_flags_unsigned => |op| {3901 .compare_flags_unsigned,
3888 _ = op;3902 .compare_flags_signed,
3889 return self.fail("TODO implement set stack variable with compare flags value (unsigned)", .{});3903 .immediate,
3890 },3904 => {
3891 .compare_flags_signed => |op| {
3892 _ = op;
3893 return self.fail("TODO implement set stack variable with compare flags value (signed)", .{});
3894 },
3895 .immediate => {
3896 const reg = try self.copyToTmpRegister(ty, mcv);3905 const reg = try self.copyToTmpRegister(ty, mcv);
3897 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });3906 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
3898 },3907 },
...@@ -4060,15 +4069,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {...@@ -4060,15 +4069,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
4060 else => return self.fail("TODO implement memset", .{}),4069 else => return self.fail("TODO implement memset", .{}),
4061 }4070 }
4062 },4071 },
4063 .compare_flags_unsigned => |op| {4072 .compare_flags_unsigned,
4064 _ = op;4073 .compare_flags_signed,
4065 return self.fail("TODO implement set stack variable with compare flags value (unsigned)", .{});4074 .immediate,
4066 },4075 => {
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 const reg = try self.copyToTmpRegister(ty, mcv);4076 const reg = try self.copyToTmpRegister(ty, mcv);
4073 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });4077 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
4074 },4078 },