diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-03-31 19:41:50 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-04-01 11:37:18 +0200 |
| commit | fd29ddc06c914a994ecb41714a7c4470ceda5af3 (patch) | |
| tree | 0c9734419eeeaa987afca71152d15a5a15730d73 | |
| parent | 87179d91a76470eb5e09d4e070063a2021c7f176 (diff) | |
| download | zig-fd29ddc06c914a994ecb41714a7c4470ceda5af3.tar.gz zig-fd29ddc06c914a994ecb41714a7c4470ceda5af3.zip | |
x64: implement add/sub with wrapping and xor op
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 28 | ||||
| -rw-r--r-- | test/behavior/math.zig | 5 |
2 files changed, 5 insertions, 28 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index b093209a2e..0a11c1480f 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -645,13 +645,13 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { switch (air_tags[inst]) { // zig fmt: off .add => try self.airAdd(inst), - .addwrap => try self.airAddWrap(inst), + .addwrap => try self.airAdd(inst), .add_sat => try self.airAddSat(inst), .sub => try self.airSub(inst), - .subwrap => try self.airSubWrap(inst), + .subwrap => try self.airSub(inst), .sub_sat => try self.airSubSat(inst), .mul => try self.airMul(inst), - .mulwrap => try self.airMulWrap(inst), + .mulwrap => try self.airMul(inst), .mul_sat => try self.airMulSat(inst), .rem => try self.airRem(inst), .mod => try self.airMod(inst), @@ -1318,7 +1318,7 @@ fn airAddWrap(self: *Self, inst: Air.Inst.Index) !void { const result: MCValue = if (self.liveness.isUnused(inst)) .dead else - return self.fail("TODO implement addwrap for {}", .{self.target.cpu.arch}); + try self.genBinMathOp(inst, bin_op.lhs, bin_op.rhs); return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); } @@ -1375,15 +1375,6 @@ fn airSub(self: *Self, inst: Air.Inst.Index) !void { return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); } -fn airSubWrap(self: *Self, inst: Air.Inst.Index) !void { - const bin_op = self.air.instructions.items(.data)[inst].bin_op; - const result: MCValue = if (self.liveness.isUnused(inst)) - .dead - else - return self.fail("TODO implement subwrap for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); -} - fn airSubSat(self: *Self, inst: Air.Inst.Index) !void { const bin_op = self.air.instructions.items(.data)[inst].bin_op; const result: MCValue = if (self.liveness.isUnused(inst)) @@ -1421,15 +1412,6 @@ fn airMul(self: *Self, inst: Air.Inst.Index) !void { return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); } -fn airMulWrap(self: *Self, inst: Air.Inst.Index) !void { - const bin_op = self.air.instructions.items(.data)[inst].bin_op; - const result: MCValue = if (self.liveness.isUnused(inst)) - .dead - else - return self.fail("TODO implement mulwrap for {}", .{self.target.cpu.arch}); - return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); -} - fn airMulSat(self: *Self, inst: Air.Inst.Index) !void { const bin_op = self.air.instructions.items(.data)[inst].bin_op; const result: MCValue = if (self.liveness.isUnused(inst)) @@ -1826,7 +1808,7 @@ fn airXor(self: *Self, inst: Air.Inst.Index) !void { const result: MCValue = if (self.liveness.isUnused(inst)) .dead else - return self.fail("TODO implement xor for {}", .{self.target.cpu.arch}); + try self.genBinMathOp(inst, bin_op.lhs, bin_op.rhs); return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none }); } diff --git a/test/behavior/math.zig b/test/behavior/math.zig index a79d20dcdb..7a388a0983 100644 --- a/test/behavior/math.zig +++ b/test/behavior/math.zig @@ -320,7 +320,6 @@ test "comptime_int multi-limb partial shift right" { test "xor" { if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO try test_xor(); comptime try test_xor(); @@ -502,7 +501,6 @@ fn mod(comptime T: type, a: T, b: T) T { } test "unsigned wrapping" { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO try testUnsignedWrappingEval(maxInt(u32)); @@ -516,7 +514,6 @@ fn testUnsignedWrappingEval(x: u32) !void { } test "signed wrapping" { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO try testSignedWrappingEval(maxInt(i32)); @@ -530,7 +527,6 @@ fn testSignedWrappingEval(x: i32) !void { } test "signed negation wrapping" { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO try testSignedNegationWrappingEval(minInt(i16)); @@ -543,7 +539,6 @@ fn testSignedNegationWrappingEval(x: i16) !void { } test "unsigned negation wrapping" { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO try testUnsignedNegationWrappingEval(1); |
