authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-28 17:45:50+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-28 17:45:50+02:00
loge6729036e44af2a52c52ce9f1f99e01d1e642cf3
treededc9ad09cc815f11a4ca72f31c43caef240ed3e
parent107052aded5dc1666c687838e8e2995654f17a45

x64: partially fix genImul, enable overflow tests


2 files changed, 12 insertions(+), 12 deletions(-)

src/arch/x86_64/CodeGen.zig+6-5
......@@ -3254,6 +3254,7 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
32543254
32553255// Performs integer multiplication between dst_mcv and src_mcv, storing the result in dst_mcv.
32563256fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !void {
3257 const abi_size = @intCast(u32, dst_ty.abiSize(self.target.*));
32573258 switch (dst_mcv) {
32583259 .none => unreachable,
32593260 .undef => unreachable,
......@@ -3276,8 +3277,8 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
32763277 _ = try self.addInst(.{
32773278 .tag = .imul_complex,
32783279 .ops = (Mir.Ops{
3279 .reg1 = registerAlias(dst_reg, @divExact(src_reg.size(), 8)),
3280 .reg2 = src_reg,
3280 .reg1 = registerAlias(dst_reg, abi_size),
3281 .reg2 = registerAlias(src_reg, abi_size),
32813282 }).encode(),
32823283 .data = undefined,
32833284 });
......@@ -3305,7 +3306,7 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
33053306 _ = try self.addInst(.{
33063307 .tag = .imul_complex,
33073308 .ops = (Mir.Ops{
3308 .reg1 = registerAlias(dst_reg, @intCast(u32, dst_ty.abiSize(self.target.*))),
3309 .reg1 = registerAlias(dst_reg, abi_size),
33093310 .reg2 = .rbp,
33103311 .flags = 0b01,
33113312 }).encode(),
......@@ -3342,8 +3343,8 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
33423343 _ = try self.addInst(.{
33433344 .tag = .imul_complex,
33443345 .ops = (Mir.Ops{
3345 .reg1 = registerAlias(dst_reg, @divExact(src_reg.size(), 8)),
3346 .reg2 = src_reg,
3346 .reg1 = registerAlias(dst_reg, abi_size),
3347 .reg2 = registerAlias(src_reg, abi_size),
33473348 }).encode(),
33483349 .data = undefined,
33493350 });
test/behavior/math.zig+6-7
......@@ -639,7 +639,6 @@ test "128-bit multiplication" {
639639
640640test "@addWithOverflow" {
641641 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
642 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
643642 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
644643 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
645644
......@@ -684,7 +683,6 @@ test "small int addition" {
684683
685684test "@mulWithOverflow" {
686685 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
687 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
688686 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
689687 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
690688
......@@ -698,14 +696,16 @@ test "@mulWithOverflow" {
698696 var b: u8 = 2;
699697 try expect(!@mulWithOverflow(u8, a, b, &result));
700698 try expect(result == 246);
701 b = 4;
702 try expect(@mulWithOverflow(u8, a, b, &result));
703 try expect(result == 236);
699
700 if (builtin.zig_backend != .stage2_x86_64) { // TODO fix mul/imul on x86_64
701 b = 4;
702 try expect(@mulWithOverflow(u8, a, b, &result));
703 try expect(result == 236);
704 }
704705}
705706
706707test "@subWithOverflow" {
707708 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
708 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
709709 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
710710 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
711711
......@@ -747,7 +747,6 @@ test "@shlWithOverflow" {
747747
748748test "overflow arithmetic with u0 values" {
749749 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
750 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
751750
752751 var result: u0 = undefined;
753752 try expect(!@addWithOverflow(u0, 0, 0, &result));