aboutsummaryrefslogtreecommitdiff
path: root/src/arch/aarch64/CodeGen.zig
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2022-02-14 22:33:01 +0100
committerjoachimschmidt557 <joachim.schmidt557@outlook.com>2022-02-14 22:33:01 +0100
commit22895f5616c663bb7b8ad9866c29d00bc4bc315c (patch)
treed0bec94aacb933d99b54e469317a1160f8c08ffe /src/arch/aarch64/CodeGen.zig
parent98c71cc88a2d472dded057a4a6f1d610dad9e491 (diff)
downloadzig-22895f5616c663bb7b8ad9866c29d00bc4bc315c.tar.gz
zig-22895f5616c663bb7b8ad9866c29d00bc4bc315c.zip
stage2 AArch64: Enable behavior testing
Diffstat (limited to 'src/arch/aarch64/CodeGen.zig')
-rw-r--r--src/arch/aarch64/CodeGen.zig34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/arch/aarch64/CodeGen.zig b/src/arch/aarch64/CodeGen.zig
index 55c8c64794..b9d5a29f18 100644
--- a/src/arch/aarch64/CodeGen.zig
+++ b/src/arch/aarch64/CodeGen.zig
@@ -1029,14 +1029,16 @@ fn binOpRegister(
if (!rhs_is_register) try self.genSetReg(rhs_ty, rhs_reg, rhs);
const mir_tag: Mir.Inst.Tag = switch (tag) {
- .add => .add_shifted_register,
- .sub => .sub_shifted_register,
+ .add, .ptr_add => .add_shifted_register,
+ .sub, .ptr_sub => .sub_shifted_register,
.xor => .eor_shifted_register,
else => unreachable,
};
const mir_data: Mir.Inst.Data = switch (tag) {
.add,
.sub,
+ .ptr_add,
+ .ptr_sub,
=> .{ .rrr_imm6_shift = .{
.rd = dest_reg,
.rn = lhs_reg,
@@ -1225,7 +1227,24 @@ fn binOp(
},
.ptr_add,
.ptr_sub,
- => return self.fail("TODO ptr_add, ptr_sub", .{}),
+ => {
+ switch (lhs_ty.zigTypeTag()) {
+ .Pointer => {
+ const ptr_ty = lhs_ty;
+ const pointee_ty = switch (ptr_ty.ptrSize()) {
+ .One => ptr_ty.childType().childType(), // ptr to array, so get array element type
+ else => ptr_ty.childType(),
+ };
+
+ if (pointee_ty.abiSize(self.target.*) > 1) {
+ return self.fail("TODO ptr_add, ptr_sub with more element sizes", .{});
+ }
+
+ return try self.binOpRegister(tag, maybe_inst, lhs, rhs, lhs_ty, rhs_ty);
+ },
+ else => unreachable,
+ }
+ },
else => unreachable,
}
}
@@ -1439,7 +1458,14 @@ fn airWrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) !void {
/// E to E!T
fn airWrapErrUnionErr(self: *Self, inst: Air.Inst.Index) !void {
const ty_op = self.air.instructions.items(.data)[inst].ty_op;
- const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement wrap errunion error for {}", .{self.target.cpu.arch});
+ const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
+ const error_union_ty = self.air.getRefType(ty_op.ty);
+ const payload_ty = error_union_ty.errorUnionPayload();
+ const mcv = try self.resolveInst(ty_op.operand);
+ if (!payload_ty.hasRuntimeBits()) break :result mcv;
+
+ return self.fail("TODO implement wrap errunion error for non-empty payloads", .{});
+ };
return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
}