authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2021-12-21 15:57:03+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-12-21 11:30:56-08:00
log44061cd760cba603ddc2afa10d882ce71c5d389b
tree71e9b4f49058cfb671576035c5dd4938d748698f
parent8df540aeef33b9b02e98aebe311299c101ce44b9

stage2 ARM: Refactor airStore


1 files changed, 50 insertions(+), 10 deletions(-)

src/arch/arm/CodeGen.zig+50-10
......@@ -1308,6 +1308,15 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
13081308 } },
13091309 });
13101310 },
1311 .stack_offset => |off| {
1312 if (elem_ty.abiSize(self.target.*) <= 4) {
1313 const tmp_reg = try self.register_manager.allocReg(null, &.{});
1314 try self.load(.{ .register = tmp_reg }, ptr, elem_ty);
1315 return self.genSetStack(elem_ty, off, MCValue{ .register = tmp_reg });
1316 } else {
1317 return self.fail("TODO implement memcpy", .{});
1318 }
1319 },
13111320 else => return self.fail("TODO load from register into {}", .{dst_mcv}),
13121321 }
13131322 },
......@@ -1351,11 +1360,7 @@ fn airLoad(self: *Self, inst: Air.Inst.Index) !void {
13511360 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
13521361}
13531362
1354fn airStore(self: *Self, inst: Air.Inst.Index) !void {
1355 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1356 const ptr = try self.resolveInst(bin_op.lhs);
1357 const value = try self.resolveInst(bin_op.rhs);
1358 const elem_ty = self.air.typeOf(bin_op.rhs);
1363fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type) InnerError!void {
13591364 switch (ptr) {
13601365 .none => unreachable,
13611366 .undef => unreachable,
......@@ -1365,27 +1370,62 @@ fn airStore(self: *Self, inst: Air.Inst.Index) !void {
13651370 .compare_flags_signed => unreachable,
13661371 .stack_argument_offset => unreachable,
13671372 .immediate => |imm| {
1368 try self.setRegOrMem(elem_ty, .{ .memory = imm }, value);
1373 try self.setRegOrMem(value_ty, .{ .memory = imm }, value);
13691374 },
13701375 .ptr_stack_offset => |off| {
1371 try self.genSetStack(elem_ty, off, value);
1376 try self.genSetStack(value_ty, off, value);
13721377 },
13731378 .ptr_embedded_in_code => |off| {
1374 try self.setRegOrMem(elem_ty, .{ .embedded_in_code = off }, value);
1379 try self.setRegOrMem(value_ty, .{ .embedded_in_code = off }, value);
13751380 },
13761381 .embedded_in_code => {
13771382 return self.fail("TODO implement storing to MCValue.embedded_in_code", .{});
13781383 },
1379 .register => {
1380 return self.fail("TODO implement storing to MCValue.register", .{});
1384 .register => |addr_reg| {
1385 switch (value) {
1386 .register => |value_reg| {
1387 _ = try self.addInst(.{
1388 .tag = .str,
1389 .cond = .al,
1390 .data = .{ .rr_offset = .{
1391 .rt = value_reg,
1392 .rn = addr_reg,
1393 .offset = .{ .offset = Instruction.Offset.none },
1394 } },
1395 });
1396 },
1397 else => {
1398 if (value_ty.abiSize(self.target.*) <= 4) {
1399 const tmp_reg = try self.register_manager.allocReg(null, &.{addr_reg});
1400 try self.genSetReg(value_ty, tmp_reg, value);
1401
1402 try self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
1403 } else {
1404 return self.fail("TODO implement memcpy", .{});
1405 }
1406 },
1407 }
13811408 },
13821409 .memory => {
1410 // const addr_reg = try self.copyToTmpRegister(ptr_ty, ptr);
1411 // try self.store(.{ .register = addr_reg }, value, ptr_ty, value_ty);
13831412 return self.fail("TODO implement storing to MCValue.memory", .{});
13841413 },
13851414 .stack_offset => {
13861415 return self.fail("TODO implement storing to MCValue.stack_offset", .{});
13871416 },
13881417 }
1418}
1419
1420fn airStore(self: *Self, inst: Air.Inst.Index) !void {
1421 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1422 const ptr = try self.resolveInst(bin_op.lhs);
1423 const value = try self.resolveInst(bin_op.rhs);
1424 const ptr_ty = self.air.typeOf(bin_op.lhs);
1425 const value_ty = self.air.typeOf(bin_op.rhs);
1426
1427 try self.store(ptr, value, ptr_ty, value_ty);
1428
13891429 return self.finishAir(inst, .dead, .{ bin_op.lhs, bin_op.rhs, .none });
13901430}
13911431