diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-15 01:15:37 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-15 03:07:51 -0400 |
| commit | f39ff6cc68ab7a0d8ef349d4d930118890c19b01 (patch) | |
| tree | 8417a0902fdad49eb9c4e97ee7a762593ee5732e /src/arch/x86_64/CodeGen.zig | |
| parent | bd771bec49fbb7845ad2635c0dd13aa971a81fee (diff) | |
| download | zig-f39ff6cc68ab7a0d8ef349d4d930118890c19b01.tar.gz zig-f39ff6cc68ab7a0d8ef349d4d930118890c19b01.zip | |
x86_64: implement integer vector mul
Diffstat (limited to 'src/arch/x86_64/CodeGen.zig')
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index b791ec5ecc..c5af53b2cf 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -2800,8 +2800,10 @@ fn airMulDivBinOp(self: *Self, inst: Air.Inst.Index) !void { const result = result: { const tag = self.air.instructions.items(.tag)[inst]; const dst_ty = self.air.typeOfIndex(inst); - if (dst_ty.zigTypeTag() == .Float) - break :result try self.genBinOp(inst, tag, bin_op.lhs, bin_op.rhs); + switch (dst_ty.zigTypeTag()) { + .Float, .Vector => break :result try self.genBinOp(inst, tag, bin_op.lhs, bin_op.rhs), + else => {}, + } const dst_info = dst_ty.intInfo(self.target.*); var src_pl = Type.Payload.Bits{ .base = .{ .tag = switch (dst_info.signedness) { @@ -6531,6 +6533,15 @@ fn genBinOp( => if (self.hasFeature(.avx)) .{ .vp_b, .sub } else .{ .p_b, .sub }, else => null, }, + 17...32 => switch (air_tag) { + .add, + .addwrap, + => if (self.hasFeature(.avx2)) .{ .vp_b, .add } else null, + .sub, + .subwrap, + => if (self.hasFeature(.avx2)) .{ .vp_b, .sub } else null, + else => null, + }, else => null, }, 16 => switch (lhs_ty.vectorLen()) { @@ -6541,6 +6552,21 @@ fn genBinOp( .sub, .subwrap, => if (self.hasFeature(.avx)) .{ .vp_w, .sub } else .{ .p_w, .sub }, + .mul, + .mulwrap, + => if (self.hasFeature(.avx)) .{ .vp_w, .mull } else .{ .p_d, .mull }, + else => null, + }, + 9...16 => switch (air_tag) { + .add, + .addwrap, + => if (self.hasFeature(.avx2)) .{ .vp_w, .add } else null, + .sub, + .subwrap, + => if (self.hasFeature(.avx2)) .{ .vp_w, .sub } else null, + .mul, + .mulwrap, + => if (self.hasFeature(.avx2)) .{ .vp_w, .mull } else null, else => null, }, else => null, @@ -6553,6 +6579,26 @@ fn genBinOp( .sub, .subwrap, => if (self.hasFeature(.avx)) .{ .vp_d, .sub } else .{ .p_d, .sub }, + .mul, + .mulwrap, + => if (self.hasFeature(.avx)) + .{ .vp_d, .mull } + else if (self.hasFeature(.sse4_1)) + .{ .p_d, .mull } + else + null, + else => null, + }, + 5...8 => switch (air_tag) { + .add, + .addwrap, + => if (self.hasFeature(.avx2)) .{ .vp_d, .add } else null, + .sub, + .subwrap, + => if (self.hasFeature(.avx2)) .{ .vp_d, .sub } else null, + .mul, + .mulwrap, + => if (self.hasFeature(.avx2)) .{ .vp_d, .mull } else null, else => null, }, else => null, @@ -6567,6 +6613,15 @@ fn genBinOp( => if (self.hasFeature(.avx)) .{ .vp_q, .sub } else .{ .p_q, .sub }, else => null, }, + 3...4 => switch (air_tag) { + .add, + .addwrap, + => if (self.hasFeature(.avx2)) .{ .vp_q, .add } else null, + .sub, + .subwrap, + => if (self.hasFeature(.avx2)) .{ .vp_q, .sub } else null, + else => null, + }, else => null, }, else => null, |
