aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-12-04 13:07:33 -0500
committerJacob Young <jacobly0@users.noreply.github.com>2023-12-04 13:09:13 -0500
commitbdb6546a8f753fff65790fd289e35b1d5ba6cd5b (patch)
treeb6fdd48647a5248ee2c83a4d15d947eb67a534a9 /src
parent50993a8f08595b690e0b566cea3266c5ce2c5131 (diff)
downloadzig-bdb6546a8f753fff65790fd289e35b1d5ba6cd5b.tar.gz
zig-bdb6546a8f753fff65790fd289e35b1d5ba6cd5b.zip
x86_64: fix vector comparisions
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index e727596ed5..e1cc9470cb 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -9977,12 +9977,25 @@ fn genBinOp(
defer self.register_manager.unlockReg(gp_lock);
try self.asmRegisterRegister(switch (mir_tag[0]) {
- ._pd, ._sd => .{ ._pd, .movmsk },
- ._ps, ._ss => .{ ._ps, .movmsk },
- .p_b, .p_d, .p_q, .p_w => .{ .p_b, .movmsk },
- .v_pd, .v_sd => .{ .v_pd, .movmsk },
- .v_ps, .v_ss => .{ .v_ps, .movmsk },
- .vp_b, .vp_d, .vp_q, .vp_w => .{ .vp_b, .movmsk },
+ ._pd, ._sd, .p_q => .{ ._pd, .movmsk },
+ ._ps, ._ss, .p_d => .{ ._ps, .movmsk },
+ .p_b => .{ .p_b, .movmsk },
+ .p_w => movmsk: {
+ try self.asmRegisterRegister(.{ .p_b, .ackssw }, dst_reg, dst_reg);
+ break :movmsk .{ .p_b, .movmsk };
+ },
+ .v_pd, .v_sd, .vp_q => .{ .v_pd, .movmsk },
+ .v_ps, .v_ss, .vp_d => .{ .v_ps, .movmsk },
+ .vp_b => .{ .vp_b, .movmsk },
+ .vp_w => movmsk: {
+ try self.asmRegisterRegisterRegister(
+ .{ .vp_b, .ackssw },
+ dst_reg,
+ dst_reg,
+ dst_reg,
+ );
+ break :movmsk .{ .vp_b, .movmsk };
+ },
else => unreachable,
}, gp_reg.to32(), dst_reg);
return .{ .register = gp_reg };