diff options
| author | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2022-02-14 22:33:01 +0100 |
|---|---|---|
| committer | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2022-02-14 22:33:01 +0100 |
| commit | 22895f5616c663bb7b8ad9866c29d00bc4bc315c (patch) | |
| tree | d0bec94aacb933d99b54e469317a1160f8c08ffe /src | |
| parent | 98c71cc88a2d472dded057a4a6f1d610dad9e491 (diff) | |
| download | zig-22895f5616c663bb7b8ad9866c29d00bc4bc315c.tar.gz zig-22895f5616c663bb7b8ad9866c29d00bc4bc315c.zip | |
stage2 AArch64: Enable behavior testing
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/aarch64/CodeGen.zig | 34 |
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 }); } |
