x64: partially fix genImul, enable overflow tests

This commit is contained in:
Jakub Konka 2022-03-28 17:45:50 +02:00
parent 107052aded
commit e6729036e4
2 changed files with 12 additions and 12 deletions

View File

@ -3254,6 +3254,7 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
// Performs integer multiplication between dst_mcv and src_mcv, storing the result in dst_mcv. // Performs integer multiplication between dst_mcv and src_mcv, storing the result in dst_mcv.
fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !void { fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !void {
const abi_size = @intCast(u32, dst_ty.abiSize(self.target.*));
switch (dst_mcv) { switch (dst_mcv) {
.none => unreachable, .none => unreachable,
.undef => unreachable, .undef => unreachable,
@ -3276,8 +3277,8 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
_ = try self.addInst(.{ _ = try self.addInst(.{
.tag = .imul_complex, .tag = .imul_complex,
.ops = (Mir.Ops{ .ops = (Mir.Ops{
.reg1 = registerAlias(dst_reg, @divExact(src_reg.size(), 8)), .reg1 = registerAlias(dst_reg, abi_size),
.reg2 = src_reg, .reg2 = registerAlias(src_reg, abi_size),
}).encode(), }).encode(),
.data = undefined, .data = undefined,
}); });
@ -3305,7 +3306,7 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
_ = try self.addInst(.{ _ = try self.addInst(.{
.tag = .imul_complex, .tag = .imul_complex,
.ops = (Mir.Ops{ .ops = (Mir.Ops{
.reg1 = registerAlias(dst_reg, @intCast(u32, dst_ty.abiSize(self.target.*))), .reg1 = registerAlias(dst_reg, abi_size),
.reg2 = .rbp, .reg2 = .rbp,
.flags = 0b01, .flags = 0b01,
}).encode(), }).encode(),
@ -3342,8 +3343,8 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
_ = try self.addInst(.{ _ = try self.addInst(.{
.tag = .imul_complex, .tag = .imul_complex,
.ops = (Mir.Ops{ .ops = (Mir.Ops{
.reg1 = registerAlias(dst_reg, @divExact(src_reg.size(), 8)), .reg1 = registerAlias(dst_reg, abi_size),
.reg2 = src_reg, .reg2 = registerAlias(src_reg, abi_size),
}).encode(), }).encode(),
.data = undefined, .data = undefined,
}); });

View File

@ -639,7 +639,6 @@ test "128-bit multiplication" {
test "@addWithOverflow" { test "@addWithOverflow" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
@ -684,7 +683,6 @@ test "small int addition" {
test "@mulWithOverflow" { test "@mulWithOverflow" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
@ -698,14 +696,16 @@ test "@mulWithOverflow" {
var b: u8 = 2; var b: u8 = 2;
try expect(!@mulWithOverflow(u8, a, b, &result)); try expect(!@mulWithOverflow(u8, a, b, &result));
try expect(result == 246); try expect(result == 246);
b = 4;
try expect(@mulWithOverflow(u8, a, b, &result)); if (builtin.zig_backend != .stage2_x86_64) { // TODO fix mul/imul on x86_64
try expect(result == 236); b = 4;
try expect(@mulWithOverflow(u8, a, b, &result));
try expect(result == 236);
}
} }
test "@subWithOverflow" { test "@subWithOverflow" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
@ -747,7 +747,6 @@ test "@shlWithOverflow" {
test "overflow arithmetic with u0 values" { test "overflow arithmetic with u0 values" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
var result: u0 = undefined; var result: u0 = undefined;
try expect(!@addWithOverflow(u0, 0, 0, &result)); try expect(!@addWithOverflow(u0, 0, 0, &result));