authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-09-27 17:56:09-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-09-27 18:30:52-04:00
loga744fbd22fe3666873715c22fabe854f55573bbb
tree4c50f386bda1ea60a66d777f132fd115c2d50e0b
parentd79b3cc1342a6be32d2bf69554f0e15670a54f14

x86_64: fix `~`/`!` miscomps


2 files changed, 638 insertions(+), 123 deletions(-)

src/codegen/x86_64/CodeGen.zig+636-123
...@@ -2292,7 +2292,7 @@ fn genBodyBlock(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2292,7 +2292,7 @@ fn genBodyBlock(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2292}2292}
22932293
2294fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {2294fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2295 @setEvalBranchQuota(29_500);2295 @setEvalBranchQuota(29_600);
2296 const pt = cg.pt;2296 const pt = cg.pt;
2297 const zcu = pt.zcu;2297 const zcu = pt.zcu;
2298 const ip = &zcu.intern_pool;2298 const ip = &zcu.intern_pool;
...@@ -59433,9 +59433,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -59433,9 +59433,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
59433 .required_features = .{ .mmx, null, null, null },59433 .required_features = .{ .mmx, null, null, null },
59434 .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword }, .any },59434 .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword }, .any },
59435 .patterns = &.{59435 .patterns = &.{
59436 .{ .src = .{ .to_mut_mm, .mem, .none } },59436 .{ .src = .{ .to_mut_mmx, .mem, .none } },
59437 .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } },59437 .{ .src = .{ .mem, .to_mut_mmx, .none }, .commute = .{ 0, 1 } },
59438 .{ .src = .{ .to_mut_mm, .to_mm, .none } },59438 .{ .src = .{ .to_mut_mmx, .to_mmx, .none } },
59439 },59439 },
59440 .dst_temps = .{ .{ .ref = .src0 }, .unused },59440 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59441 .each = .{ .once = &.{59441 .each = .{ .once = &.{
...@@ -59445,9 +59445,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -59445,9 +59445,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
59445 .required_features = .{ .avx, null, null, null },59445 .required_features = .{ .avx, null, null, null },
59446 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },59446 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },
59447 .patterns = &.{59447 .patterns = &.{
59448 .{ .src = .{ .to_xmm, .mem, .none } },59448 .{ .src = .{ .to_sse, .mem, .none } },
59449 .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } },59449 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
59450 .{ .src = .{ .to_xmm, .to_xmm, .none } },59450 .{ .src = .{ .to_sse, .to_sse, .none } },
59451 },59451 },
59452 .dst_temps = .{ .{ .rc = .sse }, .unused },59452 .dst_temps = .{ .{ .rc = .sse }, .unused },
59453 .each = .{ .once = &.{59453 .each = .{ .once = &.{
...@@ -59457,9 +59457,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -59457,9 +59457,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
59457 .required_features = .{ .sse2, null, null, null },59457 .required_features = .{ .sse2, null, null, null },
59458 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },59458 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },
59459 .patterns = &.{59459 .patterns = &.{
59460 .{ .src = .{ .to_mut_xmm, .mem, .none } },59460 .{ .src = .{ .to_mut_sse, .mem, .none } },
59461 .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },59461 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
59462 .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },59462 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
59463 },59463 },
59464 .dst_temps = .{ .{ .ref = .src0 }, .unused },59464 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59465 .each = .{ .once = &.{59465 .each = .{ .once = &.{
...@@ -59469,9 +59469,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -59469,9 +59469,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
59469 .required_features = .{ .sse, null, null, null },59469 .required_features = .{ .sse, null, null, null },
59470 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },59470 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any },
59471 .patterns = &.{59471 .patterns = &.{
59472 .{ .src = .{ .to_mut_xmm, .mem, .none } },59472 .{ .src = .{ .to_mut_sse, .mem, .none } },
59473 .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },59473 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
59474 .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },59474 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
59475 },59475 },
59476 .dst_temps = .{ .{ .ref = .src0 }, .unused },59476 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59477 .each = .{ .once = &.{59477 .each = .{ .once = &.{
...@@ -59481,9 +59481,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -59481,9 +59481,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
59481 .required_features = .{ .avx2, null, null, null },59481 .required_features = .{ .avx2, null, null, null },
59482 .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword }, .any },59482 .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword }, .any },
59483 .patterns = &.{59483 .patterns = &.{
59484 .{ .src = .{ .to_ymm, .mem, .none } },59484 .{ .src = .{ .to_sse, .mem, .none } },
59485 .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } },59485 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
59486 .{ .src = .{ .to_ymm, .to_ymm, .none } },59486 .{ .src = .{ .to_sse, .to_sse, .none } },
59487 },59487 },
59488 .dst_temps = .{ .{ .rc = .sse }, .unused },59488 .dst_temps = .{ .{ .rc = .sse }, .unused },
59489 .each = .{ .once = &.{59489 .each = .{ .once = &.{
...@@ -59493,9 +59493,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -59493,9 +59493,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
59493 .required_features = .{ .avx, null, null, null },59493 .required_features = .{ .avx, null, null, null },
59494 .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword }, .any },59494 .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword }, .any },
59495 .patterns = &.{59495 .patterns = &.{
59496 .{ .src = .{ .to_ymm, .mem, .none } },59496 .{ .src = .{ .to_sse, .mem, .none } },
59497 .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } },59497 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
59498 .{ .src = .{ .to_ymm, .to_ymm, .none } },59498 .{ .src = .{ .to_sse, .to_sse, .none } },
59499 },59499 },
59500 .dst_temps = .{ .{ .rc = .sse }, .unused },59500 .dst_temps = .{ .{ .rc = .sse }, .unused },
59501 .each = .{ .once = &.{59501 .each = .{ .once = &.{
...@@ -64081,6 +64081,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64081,6 +64081,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64081 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});64081 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
64082 var res: [1]Temp = undefined;64082 var res: [1]Temp = undefined;
64083 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{64083 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{
64084 .src_constraints = .{ .{ .bool_vec = .byte }, .any, .any },
64085 .patterns = &.{
64086 .{ .src = .{ .mut_mem, .none, .none } },
64087 .{ .src = .{ .to_mut_gpr, .none, .none } },
64088 },
64089 .dst_temps = .{ .{ .ref = .src0 }, .unused },
64090 .each = .{ .once = &.{
64091 .{ ._, ._, .not, .dst0b, ._, ._, ._ },
64092 } },
64093 }, .{
64084 .src_constraints = .{ .{ .signed_or_exact_int = .byte }, .any, .any },64094 .src_constraints = .{ .{ .signed_or_exact_int = .byte }, .any, .any },
64085 .patterns = &.{64095 .patterns = &.{
64086 .{ .src = .{ .mut_mem, .none, .none } },64096 .{ .src = .{ .mut_mem, .none, .none } },
...@@ -64101,6 +64111,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64101,6 +64111,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64101 .each = .{ .once = &.{64111 .each = .{ .once = &.{
64102 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_umax), ._, ._ },64112 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_umax), ._, ._ },
64103 } },64113 } },
64114 }, .{
64115 .src_constraints = .{ .{ .bool_vec = .word }, .any, .any },
64116 .patterns = &.{
64117 .{ .src = .{ .mut_mem, .none, .none } },
64118 .{ .src = .{ .to_mut_gpr, .none, .none } },
64119 },
64120 .dst_temps = .{ .{ .ref = .src0 }, .unused },
64121 .each = .{ .once = &.{
64122 .{ ._, ._, .not, .dst0w, ._, ._, ._ },
64123 } },
64104 }, .{64124 }, .{
64105 .src_constraints = .{ .{ .signed_or_exact_int = .word }, .any, .any },64125 .src_constraints = .{ .{ .signed_or_exact_int = .word }, .any, .any },
64106 .patterns = &.{64126 .patterns = &.{
...@@ -64122,6 +64142,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64122,6 +64142,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64122 .each = .{ .once = &.{64142 .each = .{ .once = &.{
64123 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_umax), ._, ._ },64143 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_umax), ._, ._ },
64124 } },64144 } },
64145 }, .{
64146 .src_constraints = .{ .{ .bool_vec = .dword }, .any, .any },
64147 .patterns = &.{
64148 .{ .src = .{ .mut_mem, .none, .none } },
64149 .{ .src = .{ .to_mut_gpr, .none, .none } },
64150 },
64151 .dst_temps = .{ .{ .ref = .src0 }, .unused },
64152 .each = .{ .once = &.{
64153 .{ ._, ._, .not, .dst0d, ._, ._, ._ },
64154 } },
64125 }, .{64155 }, .{
64126 .src_constraints = .{ .{ .signed_or_exact_int = .dword }, .any, .any },64156 .src_constraints = .{ .{ .signed_or_exact_int = .dword }, .any, .any },
64127 .patterns = &.{64157 .patterns = &.{
...@@ -64143,6 +64173,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64143,6 +64173,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64143 .each = .{ .once = &.{64173 .each = .{ .once = &.{
64144 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_umax), ._, ._ },64174 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_umax), ._, ._ },
64145 } },64175 } },
64176 }, .{
64177 .required_features = .{ .@"64bit", null, null, null },
64178 .src_constraints = .{ .{ .bool_vec = .qword }, .any, .any },
64179 .patterns = &.{
64180 .{ .src = .{ .mut_mem, .none, .none } },
64181 .{ .src = .{ .to_mut_gpr, .none, .none } },
64182 },
64183 .dst_temps = .{ .{ .ref = .src0 }, .unused },
64184 .each = .{ .once = &.{
64185 .{ ._, ._, .not, .dst0q, ._, ._, ._ },
64186 } },
64146 }, .{64187 }, .{
64147 .required_features = .{ .@"64bit", null, null, null },64188 .required_features = .{ .@"64bit", null, null, null },
64148 .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any, .any },64189 .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any, .any },
...@@ -64166,12 +64207,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64166,12 +64207,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64166 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },64207 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
64167 .{ ._, ._, .xor, .dst0q, .src0q, ._, ._ },64208 .{ ._, ._, .xor, .dst0q, .src0q, ._, ._ },
64168 } },64209 } },
64210 }, .{
64211 .required_features = .{ .mmx, null, null, null },
64212 .src_constraints = .{ .{ .bool_vec = .qword }, .any, .any },
64213 .patterns = &.{
64214 .{ .src = .{ .mem, .none, .none } },
64215 .{ .src = .{ .to_mmx, .none, .none } },
64216 },
64217 .dst_temps = .{ .{ .rc = .mmx }, .unused },
64218 .each = .{ .once = &.{
64219 .{ ._, .p_d, .cmpeq, .dst0q, .dst0q, ._, ._ },
64220 .{ ._, .p_, .xor, .dst0q, .src0q, ._, ._ },
64221 } },
64169 }, .{64222 }, .{
64170 .required_features = .{ .mmx, null, null, null },64223 .required_features = .{ .mmx, null, null, null },
64171 .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any, .any },64224 .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any, .any },
64172 .patterns = &.{64225 .patterns = &.{
64173 .{ .src = .{ .mem, .none, .none } },64226 .{ .src = .{ .mem, .none, .none } },
64174 .{ .src = .{ .to_mm, .none, .none } },64227 .{ .src = .{ .to_mmx, .none, .none } },
64175 },64228 },
64176 .dst_temps = .{ .{ .rc = .mmx }, .unused },64229 .dst_temps = .{ .{ .rc = .mmx }, .unused },
64177 .each = .{ .once = &.{64230 .each = .{ .once = &.{
...@@ -64182,7 +64235,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64182,7 +64235,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64182 .required_features = .{ .mmx, null, null, null },64235 .required_features = .{ .mmx, null, null, null },
64183 .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },64236 .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },
64184 .patterns = &.{64237 .patterns = &.{
64185 .{ .src = .{ .to_mut_mm, .none, .none } },64238 .{ .src = .{ .to_mut_mmx, .none, .none } },
64186 },64239 },
64187 .extra_temps = .{64240 .extra_temps = .{
64188 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },64241 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -64202,12 +64255,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64202,12 +64255,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64202 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },64255 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
64203 .{ ._, .p_, .xor, .dst0q, .lea(.tmp0q), ._, ._ },64256 .{ ._, .p_, .xor, .dst0q, .lea(.tmp0q), ._, ._ },
64204 } },64257 } },
64258 }, .{
64259 .required_features = .{ .avx, null, null, null },
64260 .src_constraints = .{ .{ .bool_vec = .xword }, .any, .any },
64261 .patterns = &.{
64262 .{ .src = .{ .mem, .none, .none } },
64263 .{ .src = .{ .to_sse, .none, .none } },
64264 },
64265 .dst_temps = .{ .{ .rc = .sse }, .unused },
64266 .each = .{ .once = &.{
64267 .{ ._, .vp_q, .cmpeq, .dst0x, .dst0x, .dst0x, ._ },
64268 .{ ._, .vp_, .xor, .dst0x, .dst0x, .src0x, ._ },
64269 } },
64205 }, .{64270 }, .{
64206 .required_features = .{ .avx, null, null, null },64271 .required_features = .{ .avx, null, null, null },
64207 .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any, .any },64272 .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any, .any },
64208 .patterns = &.{64273 .patterns = &.{
64209 .{ .src = .{ .mem, .none, .none } },64274 .{ .src = .{ .mem, .none, .none } },
64210 .{ .src = .{ .to_xmm, .none, .none } },64275 .{ .src = .{ .to_sse, .none, .none } },
64211 },64276 },
64212 .dst_temps = .{ .{ .rc = .sse }, .unused },64277 .dst_temps = .{ .{ .rc = .sse }, .unused },
64213 .each = .{ .once = &.{64278 .each = .{ .once = &.{
...@@ -64218,7 +64283,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64218,7 +64283,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64218 .required_features = .{ .avx, null, null, null },64283 .required_features = .{ .avx, null, null, null },
64219 .src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any },64284 .src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any },
64220 .patterns = &.{64285 .patterns = &.{
64221 .{ .src = .{ .to_xmm, .none, .none } },64286 .{ .src = .{ .to_sse, .none, .none } },
64222 },64287 },
64223 .extra_temps = .{64288 .extra_temps = .{
64224 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },64289 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -64238,12 +64303,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64238,12 +64303,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64238 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },64303 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
64239 .{ ._, .vp_, .xor, .dst0x, .src0x, .lea(.tmp0x), ._ },64304 .{ ._, .vp_, .xor, .dst0x, .src0x, .lea(.tmp0x), ._ },
64240 } },64305 } },
64306 }, .{
64307 .required_features = .{ .sse2, null, null, null },
64308 .src_constraints = .{ .{ .bool_vec = .xword }, .any, .any },
64309 .patterns = &.{
64310 .{ .src = .{ .mem, .none, .none } },
64311 .{ .src = .{ .to_sse, .none, .none } },
64312 },
64313 .dst_temps = .{ .{ .rc = .sse }, .unused },
64314 .each = .{ .once = &.{
64315 .{ ._, .p_d, .cmpeq, .dst0x, .dst0x, ._, ._ },
64316 .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ },
64317 } },
64241 }, .{64318 }, .{
64242 .required_features = .{ .sse2, null, null, null },64319 .required_features = .{ .sse2, null, null, null },
64243 .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any, .any },64320 .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any, .any },
64244 .patterns = &.{64321 .patterns = &.{
64245 .{ .src = .{ .mem, .none, .none } },64322 .{ .src = .{ .mem, .none, .none } },
64246 .{ .src = .{ .to_xmm, .none, .none } },64323 .{ .src = .{ .to_sse, .none, .none } },
64247 },64324 },
64248 .dst_temps = .{ .{ .rc = .sse }, .unused },64325 .dst_temps = .{ .{ .rc = .sse }, .unused },
64249 .each = .{ .once = &.{64326 .each = .{ .once = &.{
...@@ -64254,7 +64331,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64254,7 +64331,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64254 .required_features = .{ .sse2, null, null, null },64331 .required_features = .{ .sse2, null, null, null },
64255 .src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any },64332 .src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any },
64256 .patterns = &.{64333 .patterns = &.{
64257 .{ .src = .{ .to_mut_xmm, .none, .none } },64334 .{ .src = .{ .to_mut_sse, .none, .none } },
64258 },64335 },
64259 .extra_temps = .{64336 .extra_temps = .{
64260 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },64337 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -64274,11 +64351,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64274,11 +64351,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64274 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },64351 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
64275 .{ ._, .p_, .xor, .dst0x, .lea(.tmp0x), ._, ._ },64352 .{ ._, .p_, .xor, .dst0x, .lea(.tmp0x), ._, ._ },
64276 } },64353 } },
64354 }, .{
64355 .required_features = .{ .sse, null, null, null },
64356 .src_constraints = .{ .{ .bool_vec = .xword }, .any, .any },
64357 .patterns = &.{
64358 .{ .src = .{ .to_mut_sse, .none, .none } },
64359 },
64360 .extra_temps = .{
64361 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
64362 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
64363 .unused,
64364 .unused,
64365 .unused,
64366 .unused,
64367 .unused,
64368 .unused,
64369 .unused,
64370 .unused,
64371 .unused,
64372 },
64373 .dst_temps = .{ .{ .ref = .src0 }, .unused },
64374 .each = .{ .once = &.{
64375 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
64376 .{ ._, ._ps, .xor, .dst0x, .lea(.tmp0x), ._, ._ },
64377 } },
64277 }, .{64378 }, .{
64278 .required_features = .{ .sse, null, null, null },64379 .required_features = .{ .sse, null, null, null },
64279 .src_constraints = .{ .{ .int = .xword }, .any, .any },64380 .src_constraints = .{ .{ .int = .xword }, .any, .any },
64280 .patterns = &.{64381 .patterns = &.{
64281 .{ .src = .{ .to_mut_xmm, .none, .none } },64382 .{ .src = .{ .to_mut_sse, .none, .none } },
64282 },64383 },
64283 .extra_temps = .{64384 .extra_temps = .{
64284 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },64385 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -64298,12 +64399,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64298,12 +64399,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64298 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },64399 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
64299 .{ ._, ._ps, .xor, .dst0x, .lea(.tmp0x), ._, ._ },64400 .{ ._, ._ps, .xor, .dst0x, .lea(.tmp0x), ._, ._ },
64300 } },64401 } },
64402 }, .{
64403 .required_features = .{ .avx2, null, null, null },
64404 .src_constraints = .{ .{ .bool_vec = .yword }, .any, .any },
64405 .patterns = &.{
64406 .{ .src = .{ .mem, .none, .none } },
64407 .{ .src = .{ .to_sse, .none, .none } },
64408 },
64409 .dst_temps = .{ .{ .rc = .sse }, .unused },
64410 .each = .{ .once = &.{
64411 .{ ._, .vp_q, .cmpeq, .dst0y, .dst0y, .dst0y, ._ },
64412 .{ ._, .vp_, .xor, .dst0y, .dst0y, .src0y, ._ },
64413 } },
64301 }, .{64414 }, .{
64302 .required_features = .{ .avx2, null, null, null },64415 .required_features = .{ .avx2, null, null, null },
64303 .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any, .any },64416 .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any, .any },
64304 .patterns = &.{64417 .patterns = &.{
64305 .{ .src = .{ .mem, .none, .none } },64418 .{ .src = .{ .mem, .none, .none } },
64306 .{ .src = .{ .to_ymm, .none, .none } },64419 .{ .src = .{ .to_sse, .none, .none } },
64307 },64420 },
64308 .dst_temps = .{ .{ .rc = .sse }, .unused },64421 .dst_temps = .{ .{ .rc = .sse }, .unused },
64309 .each = .{ .once = &.{64422 .each = .{ .once = &.{
...@@ -64314,7 +64427,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64314,7 +64427,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64314 .required_features = .{ .avx2, null, null, null },64427 .required_features = .{ .avx2, null, null, null },
64315 .src_constraints = .{ .{ .unsigned_int = .yword }, .any, .any },64428 .src_constraints = .{ .{ .unsigned_int = .yword }, .any, .any },
64316 .patterns = &.{64429 .patterns = &.{
64317 .{ .src = .{ .to_ymm, .none, .none } },64430 .{ .src = .{ .to_sse, .none, .none } },
64318 },64431 },
64319 .extra_temps = .{64432 .extra_temps = .{
64320 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },64433 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -64334,12 +64447,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64334,12 +64447,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64334 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },64447 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
64335 .{ ._, .vp_, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ },64448 .{ ._, .vp_, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ },
64336 } },64449 } },
64450 }, .{
64451 .required_features = .{ .avx, null, null, null },
64452 .src_constraints = .{ .{ .bool_vec = .yword }, .any, .any },
64453 .patterns = &.{
64454 .{ .src = .{ .mem, .none, .none } },
64455 .{ .src = .{ .to_sse, .none, .none } },
64456 },
64457 .dst_temps = .{ .{ .rc = .sse }, .unused },
64458 .each = .{ .once = &.{
64459 .{ ._, .v_pd, .cmp, .dst0y, .dst0y, .dst0y, .vp(.true) },
64460 .{ ._, .v_pd, .xor, .dst0y, .dst0y, .src0y, ._ },
64461 } },
64337 }, .{64462 }, .{
64338 .required_features = .{ .avx, null, null, null },64463 .required_features = .{ .avx, null, null, null },
64339 .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any, .any },64464 .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any, .any },
64340 .patterns = &.{64465 .patterns = &.{
64341 .{ .src = .{ .mem, .none, .none } },64466 .{ .src = .{ .mem, .none, .none } },
64342 .{ .src = .{ .to_ymm, .none, .none } },64467 .{ .src = .{ .to_sse, .none, .none } },
64343 },64468 },
64344 .dst_temps = .{ .{ .rc = .sse }, .unused },64469 .dst_temps = .{ .{ .rc = .sse }, .unused },
64345 .each = .{ .once = &.{64470 .each = .{ .once = &.{
...@@ -64350,7 +64475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64350,7 +64475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64350 .required_features = .{ .avx, null, null, null },64475 .required_features = .{ .avx, null, null, null },
64351 .src_constraints = .{ .{ .unsigned_int = .yword }, .any, .any },64476 .src_constraints = .{ .{ .unsigned_int = .yword }, .any, .any },
64352 .patterns = &.{64477 .patterns = &.{
64353 .{ .src = .{ .to_ymm, .none, .none } },64478 .{ .src = .{ .to_sse, .none, .none } },
64354 },64479 },
64355 .extra_temps = .{64480 .extra_temps = .{
64356 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },64481 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -64370,6 +64495,37 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64370,6 +64495,37 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64370 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },64495 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
64371 .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ },64496 .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ },
64372 } },64497 } },
64498 }, .{
64499 .required_features = .{ .avx2, null, null, null },
64500 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .yword, .is = .xword } }, .any, .any },
64501 .patterns = &.{
64502 .{ .src = .{ .to_mem, .none, .none } },
64503 },
64504 .extra_temps = .{
64505 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
64506 .{ .kind = .{ .rc = .sse } },
64507 .{ .kind = .{ .rc = .sse } },
64508 .unused,
64509 .unused,
64510 .unused,
64511 .unused,
64512 .unused,
64513 .unused,
64514 .unused,
64515 .unused,
64516 },
64517 .dst_temps = .{ .mem, .unused },
64518 .clobbers = .{ .eflags = true },
64519 .each = .{ .once = &.{
64520 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
64521 .{ ._, .vp_q, .cmpeq, .tmp1y, .tmp1y, .tmp1y, ._ },
64522 .{ .@"0:", .vp_, .xor, .tmp2y, .tmp1y, .memiad(.src0y, .tmp0, .add_size, -16), ._ },
64523 .{ ._, .v_dqu, .mov, .memiad(.dst0y, .tmp0, .add_size, -16), .tmp2y, ._, ._ },
64524 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
64525 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64526 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
64527 .{ ._, .v_dqa, .mov, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
64528 } },
64373 }, .{64529 }, .{
64374 .required_features = .{ .avx2, null, null, null },64530 .required_features = .{ .avx2, null, null, null },
64375 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any, .any },64531 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any, .any },
...@@ -64401,6 +64557,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64401,6 +64557,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64401 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },64557 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
64402 .{ ._, .v_dqa, .mov, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },64558 .{ ._, .v_dqa, .mov, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
64403 } },64559 } },
64560 }, .{
64561 .required_features = .{ .avx2, null, null, null },
64562 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .yword, .is = .yword } }, .any, .any },
64563 .patterns = &.{
64564 .{ .src = .{ .to_mem, .none, .none } },
64565 },
64566 .extra_temps = .{
64567 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
64568 .{ .kind = .{ .rc = .sse } },
64569 .{ .kind = .{ .rc = .sse } },
64570 .unused,
64571 .unused,
64572 .unused,
64573 .unused,
64574 .unused,
64575 .unused,
64576 .unused,
64577 .unused,
64578 },
64579 .dst_temps = .{ .mem, .unused },
64580 .clobbers = .{ .eflags = true },
64581 .each = .{ .once = &.{
64582 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
64583 .{ ._, .vp_q, .cmpeq, .tmp1y, .tmp1y, .tmp1y, ._ },
64584 .{ .@"0:", .vp_, .xor, .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._ },
64585 .{ ._, .v_dqu, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp2y, ._, ._ },
64586 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
64587 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64588 } },
64404 }, .{64589 }, .{
64405 .required_features = .{ .avx2, null, null, null },64590 .required_features = .{ .avx2, null, null, null },
64406 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any },64591 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any },
...@@ -64430,6 +64615,37 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64430,6 +64615,37 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64430 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },64615 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
64431 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },64616 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64432 } },64617 } },
64618 }, .{
64619 .required_features = .{ .avx, null, null, null },
64620 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .yword, .is = .xword } }, .any, .any },
64621 .patterns = &.{
64622 .{ .src = .{ .to_mem, .none, .none } },
64623 },
64624 .extra_temps = .{
64625 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
64626 .{ .kind = .{ .rc = .sse } },
64627 .{ .kind = .{ .rc = .sse } },
64628 .unused,
64629 .unused,
64630 .unused,
64631 .unused,
64632 .unused,
64633 .unused,
64634 .unused,
64635 .unused,
64636 },
64637 .dst_temps = .{ .mem, .unused },
64638 .clobbers = .{ .eflags = true },
64639 .each = .{ .once = &.{
64640 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
64641 .{ ._, .v_pd, .cmp, .tmp1y, .tmp1y, .tmp1y, .vp(.true) },
64642 .{ .@"0:", .v_pd, .xor, .tmp2y, .tmp1y, .memiad(.src0y, .tmp0, .add_size, -16), ._ },
64643 .{ ._, .v_pd, .movu, .memiad(.dst0y, .tmp0, .add_size, -16), .tmp2y, ._, ._ },
64644 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
64645 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64646 .{ .@"0:", .v_pd, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
64647 .{ ._, .v_pd, .mova, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
64648 } },
64433 }, .{64649 }, .{
64434 .required_features = .{ .avx, null, null, null },64650 .required_features = .{ .avx, null, null, null },
64435 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any, .any },64651 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any, .any },
...@@ -64461,6 +64677,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64461,6 +64677,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64461 .{ .@"0:", .v_pd, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },64677 .{ .@"0:", .v_pd, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
64462 .{ ._, .v_pd, .mova, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },64678 .{ ._, .v_pd, .mova, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
64463 } },64679 } },
64680 }, .{
64681 .required_features = .{ .avx, null, null, null },
64682 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .yword, .is = .yword } }, .any, .any },
64683 .patterns = &.{
64684 .{ .src = .{ .to_mem, .none, .none } },
64685 },
64686 .extra_temps = .{
64687 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
64688 .{ .kind = .{ .rc = .sse } },
64689 .{ .kind = .{ .rc = .sse } },
64690 .unused,
64691 .unused,
64692 .unused,
64693 .unused,
64694 .unused,
64695 .unused,
64696 .unused,
64697 .unused,
64698 },
64699 .dst_temps = .{ .mem, .unused },
64700 .clobbers = .{ .eflags = true },
64701 .each = .{ .once = &.{
64702 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
64703 .{ ._, .v_pd, .cmp, .tmp1y, .tmp1y, .tmp1y, .vp(.true) },
64704 .{ .@"0:", .v_pd, .xor, .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._ },
64705 .{ ._, .v_pd, .movu, .memia(.dst0y, .tmp0, .add_size), .tmp2y, ._, ._ },
64706 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
64707 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64708 } },
64464 }, .{64709 }, .{
64465 .required_features = .{ .avx, null, null, null },64710 .required_features = .{ .avx, null, null, null },
64466 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any },64711 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any },
...@@ -64490,6 +64735,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64490,6 +64735,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64490 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },64735 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
64491 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },64736 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64492 } },64737 } },
64738 }, .{
64739 .required_features = .{ .avx, null, null, null },
64740 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
64741 .patterns = &.{
64742 .{ .src = .{ .to_mem, .none, .none } },
64743 },
64744 .extra_temps = .{
64745 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
64746 .{ .kind = .{ .rc = .sse } },
64747 .{ .kind = .{ .rc = .sse } },
64748 .unused,
64749 .unused,
64750 .unused,
64751 .unused,
64752 .unused,
64753 .unused,
64754 .unused,
64755 .unused,
64756 },
64757 .dst_temps = .{ .mem, .unused },
64758 .clobbers = .{ .eflags = true },
64759 .each = .{ .once = &.{
64760 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
64761 .{ ._, .vp_q, .cmpeq, .tmp1x, .tmp1x, .tmp1x, ._ },
64762 .{ .@"0:", .v_, .xor, .tmp2x, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._ },
64763 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },
64764 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
64765 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64766 } },
64493 }, .{64767 }, .{
64494 .required_features = .{ .avx, null, null, null },64768 .required_features = .{ .avx, null, null, null },
64495 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },64769 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
...@@ -64519,6 +64793,36 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64519,6 +64793,36 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64519 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },64793 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
64520 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },64794 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64521 } },64795 } },
64796 }, .{
64797 .required_features = .{ .sse2, null, null, null },
64798 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
64799 .patterns = &.{
64800 .{ .src = .{ .to_mem, .none, .none } },
64801 },
64802 .extra_temps = .{
64803 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
64804 .{ .kind = .{ .rc = .sse } },
64805 .{ .kind = .{ .rc = .sse } },
64806 .unused,
64807 .unused,
64808 .unused,
64809 .unused,
64810 .unused,
64811 .unused,
64812 .unused,
64813 .unused,
64814 },
64815 .dst_temps = .{ .mem, .unused },
64816 .clobbers = .{ .eflags = true },
64817 .each = .{ .once = &.{
64818 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
64819 .{ ._, .p_d, .cmpeq, .tmp1x, .tmp1x, ._, ._ },
64820 .{ .@"0:", ._dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
64821 .{ ._, .p_, .xor, .tmp2x, .tmp1x, ._, ._ },
64822 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },
64823 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
64824 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64825 } },
64522 }, .{64826 }, .{
64523 .required_features = .{ .sse2, null, null, null },64827 .required_features = .{ .sse2, null, null, null },
64524 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },64828 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
...@@ -64549,6 +64853,34 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64549,6 +64853,34 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64549 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },64853 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
64550 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },64854 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64551 } },64855 } },
64856 }, .{
64857 .required_features = .{ .@"64bit", null, null, null },
64858 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
64859 .patterns = &.{
64860 .{ .src = .{ .mut_mem, .none, .none } },
64861 },
64862 .extra_temps = .{
64863 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
64864 .unused,
64865 .unused,
64866 .unused,
64867 .unused,
64868 .unused,
64869 .unused,
64870 .unused,
64871 .unused,
64872 .unused,
64873 .unused,
64874 },
64875 .dst_temps = .{ .{ .ref = .src0 }, .unused },
64876 .clobbers = .{ .eflags = true },
64877 .each = .{ .once = &.{
64878 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
64879 .{ .@"0:", ._, .not, .memia(.dst0q, .tmp0, .add_size), ._, ._, ._ },
64880 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, 8), ._, ._, ._ },
64881 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
64882 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64883 } },
64552 }, .{64884 }, .{
64553 .required_features = .{ .@"64bit", null, null, null },64885 .required_features = .{ .@"64bit", null, null, null },
64554 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },64886 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
...@@ -64577,6 +64909,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -64577,6 +64909,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
64577 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },64909 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
64578 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },64910 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64579 } },64911 } },
64912 }, .{
64913 .required_features = .{ .@"64bit", null, null, null },
64914 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
64915 .patterns = &.{
64916 .{ .src = .{ .to_mem, .none, .none } },
64917 },
64918 .extra_temps = .{
64919 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
64920 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
64921 .unused,
64922 .unused,
64923 .unused,
64924 .unused,
64925 .unused,
64926 .unused,
64927 .unused,
64928 .unused,
64929 .unused,
64930 },
64931 .dst_temps = .{ .mem, .unused },
64932 .clobbers = .{ .eflags = true },
64933 .each = .{ .once = &.{
64934 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
64935 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
64936 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
64937 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
64938 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
64939 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
64940 } },
64580 }, .{64941 }, .{
64581 .required_features = .{ .@"64bit", null, null, null },64942 .required_features = .{ .@"64bit", null, null, null },
64582 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },64943 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
...@@ -65042,7 +65403,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65042,7 +65403,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65042 .src_constraints = .{ .{ .signed_int_or_full_vec = .qword }, .any, .any },65403 .src_constraints = .{ .{ .signed_int_or_full_vec = .qword }, .any, .any },
65043 .patterns = &.{65404 .patterns = &.{
65044 .{ .src = .{ .mem, .none, .none } },65405 .{ .src = .{ .mem, .none, .none } },
65045 .{ .src = .{ .to_mm, .none, .none } },65406 .{ .src = .{ .to_mmx, .none, .none } },
65046 },65407 },
65047 .dst_temps = .{ .{ .rc = .mmx }, .unused },65408 .dst_temps = .{ .{ .rc = .mmx }, .unused },
65048 .each = .{ .once = &.{65409 .each = .{ .once = &.{
...@@ -65053,7 +65414,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65053,7 +65414,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65053 .required_features = .{ .mmx, null, null, null },65414 .required_features = .{ .mmx, null, null, null },
65054 .src_constraints = .{ .{ .unsigned_int_vec = .qword }, .any, .any },65415 .src_constraints = .{ .{ .unsigned_int_vec = .qword }, .any, .any },
65055 .patterns = &.{65416 .patterns = &.{
65056 .{ .src = .{ .to_mut_mm, .none, .none } },65417 .{ .src = .{ .to_mut_mmx, .none, .none } },
65057 },65418 },
65058 .extra_temps = .{65419 .extra_temps = .{
65059 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },65420 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -65078,7 +65439,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65078,7 +65439,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65078 .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any, .any },65439 .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any, .any },
65079 .patterns = &.{65440 .patterns = &.{
65080 .{ .src = .{ .mem, .none, .none } },65441 .{ .src = .{ .mem, .none, .none } },
65081 .{ .src = .{ .to_xmm, .none, .none } },65442 .{ .src = .{ .to_sse, .none, .none } },
65082 },65443 },
65083 .dst_temps = .{ .{ .rc = .sse }, .unused },65444 .dst_temps = .{ .{ .rc = .sse }, .unused },
65084 .each = .{ .once = &.{65445 .each = .{ .once = &.{
...@@ -65089,7 +65450,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65089,7 +65450,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65089 .required_features = .{ .avx, null, null, null },65450 .required_features = .{ .avx, null, null, null },
65090 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },65451 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },
65091 .patterns = &.{65452 .patterns = &.{
65092 .{ .src = .{ .to_xmm, .none, .none } },65453 .{ .src = .{ .to_sse, .none, .none } },
65093 },65454 },
65094 .extra_temps = .{65455 .extra_temps = .{
65095 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },65456 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -65114,7 +65475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65114,7 +65475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65114 .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any, .any },65475 .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any, .any },
65115 .patterns = &.{65476 .patterns = &.{
65116 .{ .src = .{ .mem, .none, .none } },65477 .{ .src = .{ .mem, .none, .none } },
65117 .{ .src = .{ .to_xmm, .none, .none } },65478 .{ .src = .{ .to_sse, .none, .none } },
65118 },65479 },
65119 .dst_temps = .{ .{ .rc = .sse }, .unused },65480 .dst_temps = .{ .{ .rc = .sse }, .unused },
65120 .each = .{ .once = &.{65481 .each = .{ .once = &.{
...@@ -65125,7 +65486,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65125,7 +65486,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65125 .required_features = .{ .sse2, null, null, null },65486 .required_features = .{ .sse2, null, null, null },
65126 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },65487 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },
65127 .patterns = &.{65488 .patterns = &.{
65128 .{ .src = .{ .to_mut_xmm, .none, .none } },65489 .{ .src = .{ .to_mut_sse, .none, .none } },
65129 },65490 },
65130 .extra_temps = .{65491 .extra_temps = .{
65131 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },65492 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -65149,7 +65510,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65149,7 +65510,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65149 .required_features = .{ .sse, null, null, null },65510 .required_features = .{ .sse, null, null, null },
65150 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },65511 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any },
65151 .patterns = &.{65512 .patterns = &.{
65152 .{ .src = .{ .to_mut_xmm, .none, .none } },65513 .{ .src = .{ .to_mut_sse, .none, .none } },
65153 },65514 },
65154 .extra_temps = .{65515 .extra_temps = .{
65155 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },65516 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -65174,7 +65535,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65174,7 +65535,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65174 .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any, .any },65535 .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any, .any },
65175 .patterns = &.{65536 .patterns = &.{
65176 .{ .src = .{ .mem, .none, .none } },65537 .{ .src = .{ .mem, .none, .none } },
65177 .{ .src = .{ .to_ymm, .none, .none } },65538 .{ .src = .{ .to_sse, .none, .none } },
65178 },65539 },
65179 .dst_temps = .{ .{ .rc = .sse }, .unused },65540 .dst_temps = .{ .{ .rc = .sse }, .unused },
65180 .each = .{ .once = &.{65541 .each = .{ .once = &.{
...@@ -65185,7 +65546,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65185,7 +65546,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65185 .required_features = .{ .avx2, null, null, null },65546 .required_features = .{ .avx2, null, null, null },
65186 .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any, .any },65547 .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any, .any },
65187 .patterns = &.{65548 .patterns = &.{
65188 .{ .src = .{ .to_ymm, .none, .none } },65549 .{ .src = .{ .to_sse, .none, .none } },
65189 },65550 },
65190 .extra_temps = .{65551 .extra_temps = .{
65191 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },65552 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -65210,7 +65571,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65210,7 +65571,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65210 .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any, .any },65571 .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any, .any },
65211 .patterns = &.{65572 .patterns = &.{
65212 .{ .src = .{ .mem, .none, .none } },65573 .{ .src = .{ .mem, .none, .none } },
65213 .{ .src = .{ .to_ymm, .none, .none } },65574 .{ .src = .{ .to_sse, .none, .none } },
65214 },65575 },
65215 .dst_temps = .{ .{ .rc = .sse }, .unused },65576 .dst_temps = .{ .{ .rc = .sse }, .unused },
65216 .each = .{ .once = &.{65577 .each = .{ .once = &.{
...@@ -65221,7 +65582,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65221,7 +65582,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65221 .required_features = .{ .avx, null, null, null },65582 .required_features = .{ .avx, null, null, null },
65222 .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any, .any },65583 .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any, .any },
65223 .patterns = &.{65584 .patterns = &.{
65224 .{ .src = .{ .to_ymm, .none, .none } },65585 .{ .src = .{ .to_sse, .none, .none } },
65225 },65586 },
65226 .extra_temps = .{65587 .extra_temps = .{
65227 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },65588 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -65241,6 +65602,118 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65241,6 +65602,118 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65241 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },65602 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
65242 .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ },65603 .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ },
65243 } },65604 } },
65605 }, .{
65606 .required_features = .{ .@"64bit", null, null, null },
65607 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .qword } }, .any, .any },
65608 .patterns = &.{
65609 .{ .src = .{ .to_mem, .none, .none } },
65610 },
65611 .extra_temps = .{
65612 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65613 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
65614 .unused,
65615 .unused,
65616 .unused,
65617 .unused,
65618 .unused,
65619 .unused,
65620 .unused,
65621 .unused,
65622 .unused,
65623 },
65624 .dst_temps = .{ .mem, .unused },
65625 .each = .{ .once = &.{
65626 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
65627 .{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
65628 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
65629 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp1q, ._, ._ },
65630 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
65631 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65632 } },
65633 }, .{
65634 .required_features = .{ .@"64bit", null, null, null },
65635 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .xword, .is = .xword } }, .any, .any },
65636 .patterns = &.{
65637 .{ .src = .{ .to_mem, .none, .none } },
65638 },
65639 .extra_temps = .{
65640 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65641 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
65642 .unused,
65643 .unused,
65644 .unused,
65645 .unused,
65646 .unused,
65647 .unused,
65648 .unused,
65649 .unused,
65650 .unused,
65651 },
65652 .dst_temps = .{ .mem, .unused },
65653 .each = .{ .once = &.{
65654 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
65655 .{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
65656 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
65657 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp1q, ._, ._ },
65658 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
65659 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65660 } },
65661 }, .{
65662 .required_features = .{ .@"64bit", null, null, null },
65663 .src_constraints = .{ .any_signed_int_or_full_vec, .any, .any },
65664 .patterns = &.{
65665 .{ .src = .{ .to_mem, .none, .none } },
65666 },
65667 .extra_temps = .{
65668 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65669 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
65670 .unused,
65671 .unused,
65672 .unused,
65673 .unused,
65674 .unused,
65675 .unused,
65676 .unused,
65677 .unused,
65678 .unused,
65679 },
65680 .dst_temps = .{ .mem, .unused },
65681 .each = .{ .once = &.{
65682 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
65683 .{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
65684 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
65685 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp1q, ._, ._ },
65686 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
65687 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65688 } },
65689 }, .{
65690 .required_features = .{ .@"64bit", null, null, null },
65691 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any },
65692 .patterns = &.{
65693 .{ .src = .{ .to_mem, .none, .none } },
65694 },
65695 .extra_temps = .{
65696 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65697 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
65698 .unused,
65699 .unused,
65700 .unused,
65701 .unused,
65702 .unused,
65703 .unused,
65704 .unused,
65705 .unused,
65706 .unused,
65707 },
65708 .dst_temps = .{ .mem, .unused },
65709 .each = .{ .once = &.{
65710 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
65711 .{ .@"0:", ._, .mov, .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
65712 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
65713 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp1q, ._, ._ },
65714 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
65715 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65716 } },
65244 }, .{65717 }, .{
65245 .required_features = .{ .@"64bit", null, null, null },65718 .required_features = .{ .@"64bit", null, null, null },
65246 .patterns = &.{65719 .patterns = &.{
...@@ -65261,14 +65734,94 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65261,14 +65734,94 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65261 },65734 },
65262 .dst_temps = .{ .mem, .unused },65735 .dst_temps = .{ .mem, .unused },
65263 .each = .{ .once = &.{65736 .each = .{ .once = &.{
65264 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },65737 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
65265 .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },65738 .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },
65266 .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp0), ._, ._ },65739 .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp0), ._, ._ },
65267 .{ ._, ._, .xor, .tmp2q, .leai(.tmp1q, .tmp0), ._, ._ },65740 .{ ._, ._, .xor, .tmp2q, .leai(.tmp1q, .tmp0), ._, ._ },
65268 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ },65741 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp2q, ._, ._ },
65269 .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 8), ._, ._ },65742 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
65270 .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ },65743 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65271 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },65744 } },
65745 }, .{
65746 .src_constraints = .{ .{ .remainder_bool_vec = .{ .of = .dword, .is = .dword } }, .any, .any },
65747 .patterns = &.{
65748 .{ .src = .{ .to_mem, .none, .none } },
65749 },
65750 .extra_temps = .{
65751 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65752 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65753 .unused,
65754 .unused,
65755 .unused,
65756 .unused,
65757 .unused,
65758 .unused,
65759 .unused,
65760 .unused,
65761 .unused,
65762 },
65763 .dst_temps = .{ .mem, .unused },
65764 .each = .{ .once = &.{
65765 .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
65766 .{ .@"0:", ._, .mov, .tmp1d, .memi(.src0d, .tmp0), ._, ._ },
65767 .{ ._, ._, .not, .tmp1d, ._, ._, ._ },
65768 .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp1d, ._, ._ },
65769 .{ ._, ._, .sub, .tmp0d, .si(4), ._, ._ },
65770 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65771 } },
65772 }, .{
65773 .src_constraints = .{ .any_signed_int_or_full_vec, .any, .any },
65774 .patterns = &.{
65775 .{ .src = .{ .to_mem, .none, .none } },
65776 },
65777 .extra_temps = .{
65778 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65779 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65780 .unused,
65781 .unused,
65782 .unused,
65783 .unused,
65784 .unused,
65785 .unused,
65786 .unused,
65787 .unused,
65788 .unused,
65789 },
65790 .dst_temps = .{ .mem, .unused },
65791 .each = .{ .once = &.{
65792 .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size_up_4), ._, ._ },
65793 .{ .@"0:", ._, .mov, .tmp1d, .memi(.src0d, .tmp0), ._, ._ },
65794 .{ ._, ._, .not, .tmp1d, ._, ._, ._ },
65795 .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp1d, ._, ._ },
65796 .{ ._, ._, .sub, .tmp0d, .si(4), ._, ._ },
65797 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65798 } },
65799 }, .{
65800 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any, .any },
65801 .patterns = &.{
65802 .{ .src = .{ .to_mem, .none, .none } },
65803 },
65804 .extra_temps = .{
65805 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65806 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
65807 .unused,
65808 .unused,
65809 .unused,
65810 .unused,
65811 .unused,
65812 .unused,
65813 .unused,
65814 .unused,
65815 .unused,
65816 },
65817 .dst_temps = .{ .mem, .unused },
65818 .each = .{ .once = &.{
65819 .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_size), ._, ._ },
65820 .{ .@"0:", ._, .mov, .tmp1d, .memi(.src0d, .tmp0), ._, ._ },
65821 .{ ._, ._, .not, .tmp1d, ._, ._, ._ },
65822 .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp1d, ._, ._ },
65823 .{ ._, ._, .sub, .tmp0d, .si(4), ._, ._ },
65824 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65272 } },65825 } },
65273 }, .{65826 }, .{
65274 .patterns = &.{65827 .patterns = &.{
...@@ -65289,14 +65842,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -65289,14 +65842,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
65289 },65842 },
65290 .dst_temps = .{ .mem, .unused },65843 .dst_temps = .{ .mem, .unused },
65291 .each = .{ .once = &.{65844 .each = .{ .once = &.{
65292 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },65845 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size_up_8), ._, ._ },
65293 .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },65846 .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },
65294 .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp0), ._, ._ },65847 .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp0), ._, ._ },
65295 .{ ._, ._, .xor, .tmp2d, .leai(.tmp1d, .tmp0), ._, ._ },65848 .{ ._, ._, .xor, .tmp2d, .leai(.tmp1d, .tmp0), ._, ._ },
65296 .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp2d, ._, ._ },65849 .{ ._, ._, .mov, .memi(.dst0d, .tmp0), .tmp2d, ._, ._ },
65297 .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 4), ._, ._ },65850 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
65298 .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ },65851 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
65299 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
65300 } },65852 } },
65301 } }) catch |err| switch (err) {65853 } }) catch |err| switch (err) {
65302 error.SelectFailed => return cg.fail("failed to select {s} {f} {f}", .{65854 error.SelectFailed => return cg.fail("failed to select {s} {f} {f}", .{
...@@ -75371,7 +75923,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -75371,7 +75923,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
75371 .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any },75923 .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any },
75372 .patterns = &.{75924 .patterns = &.{
75373 .{ .src = .{ .mem, .none, .none } },75925 .{ .src = .{ .mem, .none, .none } },
75374 .{ .src = .{ .to_mm, .none, .none } },75926 .{ .src = .{ .to_mmx, .none, .none } },
75375 },75927 },
75376 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },75928 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },
75377 .each = .{ .once = &.{75929 .each = .{ .once = &.{
...@@ -75382,7 +75934,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -75382,7 +75934,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
75382 .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any },75934 .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any },
75383 .patterns = &.{75935 .patterns = &.{
75384 .{ .src = .{ .mem, .none, .none } },75936 .{ .src = .{ .mem, .none, .none } },
75385 .{ .src = .{ .to_mm, .none, .none } },75937 .{ .src = .{ .to_mmx, .none, .none } },
75386 },75938 },
75387 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },75939 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },
75388 .each = .{ .once = &.{75940 .each = .{ .once = &.{
...@@ -75393,7 +75945,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -75393,7 +75945,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
75393 .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any },75945 .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any },
75394 .patterns = &.{75946 .patterns = &.{
75395 .{ .src = .{ .mem, .none, .none } },75947 .{ .src = .{ .mem, .none, .none } },
75396 .{ .src = .{ .to_mm, .none, .none } },75948 .{ .src = .{ .to_mmx, .none, .none } },
75397 },75949 },
75398 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },75950 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }, .unused },
75399 .each = .{ .once = &.{75951 .each = .{ .once = &.{
...@@ -190208,9 +190760,9 @@ const Temp = struct {...@@ -190208,9 +190760,9 @@ const Temp = struct {
190208 .required_features = .{ .sse, .mmx, null, null },190760 .required_features = .{ .sse, .mmx, null, null },
190209 .src_constraints = .{ .{ .int = .qword }, .{ .int = .qword }, .any },190761 .src_constraints = .{ .{ .int = .qword }, .{ .int = .qword }, .any },
190210 .patterns = &.{190762 .patterns = &.{
190211 .{ .src = .{ .to_mut_mm, .mem, .none } },190763 .{ .src = .{ .to_mut_mmx, .mem, .none } },
190212 .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } },190764 .{ .src = .{ .mem, .to_mut_mmx, .none }, .commute = .{ 0, 1 } },
190213 .{ .src = .{ .to_mut_mm, .to_mm, .none } },190765 .{ .src = .{ .to_mut_mmx, .to_mmx, .none } },
190214 },190766 },
190215 .extra_temps = .{190767 .extra_temps = .{
190216 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },190768 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
...@@ -190238,9 +190790,9 @@ const Temp = struct {...@@ -190238,9 +190790,9 @@ const Temp = struct {
190238 .required_features = .{ .avx, null, null, null },190790 .required_features = .{ .avx, null, null, null },
190239 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },190791 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },
190240 .patterns = &.{190792 .patterns = &.{
190241 .{ .src = .{ .to_xmm, .mem, .none } },190793 .{ .src = .{ .to_sse, .mem, .none } },
190242 .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } },190794 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
190243 .{ .src = .{ .to_xmm, .to_xmm, .none } },190795 .{ .src = .{ .to_sse, .to_sse, .none } },
190244 },190796 },
190245 .extra_temps = .{190797 .extra_temps = .{
190246 .{ .kind = .{ .rc = .sse } },190798 .{ .kind = .{ .rc = .sse } },
...@@ -190265,9 +190817,9 @@ const Temp = struct {...@@ -190265,9 +190817,9 @@ const Temp = struct {
190265 .required_features = .{ .sse4_1, null, null, null },190817 .required_features = .{ .sse4_1, null, null, null },
190266 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },190818 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },
190267 .patterns = &.{190819 .patterns = &.{
190268 .{ .src = .{ .to_mut_xmm, .mem, .none } },190820 .{ .src = .{ .to_mut_sse, .mem, .none } },
190269 .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },190821 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
190270 .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },190822 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
190271 },190823 },
190272 .dst_temps = .{ .{ .cc = .z }, .unused },190824 .dst_temps = .{ .{ .cc = .z }, .unused },
190273 .clobbers = .{ .eflags = true },190825 .clobbers = .{ .eflags = true },
...@@ -190279,9 +190831,9 @@ const Temp = struct {...@@ -190279,9 +190831,9 @@ const Temp = struct {
190279 .required_features = .{ .sse2, .fast_imm16, null, null },190831 .required_features = .{ .sse2, .fast_imm16, null, null },
190280 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },190832 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },
190281 .patterns = &.{190833 .patterns = &.{
190282 .{ .src = .{ .to_mut_xmm, .mem, .none } },190834 .{ .src = .{ .to_mut_sse, .mem, .none } },
190283 .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },190835 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
190284 .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },190836 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
190285 },190837 },
190286 .extra_temps = .{190838 .extra_temps = .{
190287 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },190839 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
...@@ -190309,9 +190861,9 @@ const Temp = struct {...@@ -190309,9 +190861,9 @@ const Temp = struct {
190309 .required_features = .{ .sse2, null, null, null },190861 .required_features = .{ .sse2, null, null, null },
190310 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },190862 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any },
190311 .patterns = &.{190863 .patterns = &.{
190312 .{ .src = .{ .to_mut_xmm, .mem, .none } },190864 .{ .src = .{ .to_mut_sse, .mem, .none } },
190313 .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } },190865 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
190314 .{ .src = .{ .to_mut_xmm, .to_xmm, .none } },190866 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
190315 },190867 },
190316 .extra_temps = .{190868 .extra_temps = .{
190317 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },190869 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
...@@ -190339,9 +190891,9 @@ const Temp = struct {...@@ -190339,9 +190891,9 @@ const Temp = struct {
190339 .required_features = .{ .avx2, null, null, null },190891 .required_features = .{ .avx2, null, null, null },
190340 .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword }, .any },190892 .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword }, .any },
190341 .patterns = &.{190893 .patterns = &.{
190342 .{ .src = .{ .to_ymm, .mem, .none } },190894 .{ .src = .{ .to_sse, .mem, .none } },
190343 .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } },190895 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
190344 .{ .src = .{ .to_ymm, .to_ymm, .none } },190896 .{ .src = .{ .to_sse, .to_sse, .none } },
190345 },190897 },
190346 .extra_temps = .{190898 .extra_temps = .{
190347 .{ .kind = .{ .rc = .sse } },190899 .{ .kind = .{ .rc = .sse } },
...@@ -190366,9 +190918,9 @@ const Temp = struct {...@@ -190366,9 +190918,9 @@ const Temp = struct {
190366 .required_features = .{ .avx, null, null, null },190918 .required_features = .{ .avx, null, null, null },
190367 .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword }, .any },190919 .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword }, .any },
190368 .patterns = &.{190920 .patterns = &.{
190369 .{ .src = .{ .to_ymm, .mem, .none } },190921 .{ .src = .{ .to_sse, .mem, .none } },
190370 .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } },190922 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
190371 .{ .src = .{ .to_ymm, .to_ymm, .none } },190923 .{ .src = .{ .to_sse, .to_sse, .none } },
190372 },190924 },
190373 .extra_temps = .{190925 .extra_temps = .{
190374 .{ .kind = .{ .rc = .sse } },190926 .{ .kind = .{ .rc = .sse } },
...@@ -192348,6 +192900,7 @@ const Select = struct {...@@ -192348,6 +192900,7 @@ const Select = struct {
192348 any_scalar_int,192900 any_scalar_int,
192349 any_scalar_signed_int,192901 any_scalar_signed_int,
192350 any_scalar_unsigned_int,192902 any_scalar_unsigned_int,
192903 any_signed_int_or_full_vec,
192351 any_float,192904 any_float,
192352 po2_any,192905 po2_any,
192353 bool,192906 bool,
...@@ -192444,6 +192997,11 @@ const Select = struct {...@@ -192444,6 +192997,11 @@ const Select = struct {
192444 .any_scalar_int => cg.intInfo(ty.scalarType(zcu)) != null,192997 .any_scalar_int => cg.intInfo(ty.scalarType(zcu)) != null,
192445 .any_scalar_signed_int => if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .signed else false,192998 .any_scalar_signed_int => if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .signed else false,
192446 .any_scalar_unsigned_int => if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .unsigned else false,192999 .any_scalar_unsigned_int => if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .unsigned else false,
193000 .any_signed_int_or_full_vec => ty.isVector(zcu) and
193001 if (cg.intInfo(ty.childType(zcu))) |int_info| switch (int_info.signedness) {
193002 .signed => true,
193003 .unsigned => (int_info.bits >= 8 and std.math.isPowerOfTwo(int_info.bits)) or int_info.bits % 128 == 0,
193004 } else false,
192447 .any_float => ty.isRuntimeFloat(),193005 .any_float => ty.isRuntimeFloat(),
192448 .po2_any => std.math.isPowerOfTwo(ty.abiSize(zcu)),193006 .po2_any => std.math.isPowerOfTwo(ty.abiSize(zcu)),
192449 .bool => ty.toIntern() == .bool_type,193007 .bool => ty.toIntern() == .bool_type,
...@@ -192484,7 +193042,7 @@ const Select = struct {...@@ -192484,7 +193042,7 @@ const Select = struct {
192484 .signed_int_or_full_vec => |size| ty.isVector(zcu) and @divExact(size.bitSize(cg.target), 8) >= ty.abiSize(zcu) and193042 .signed_int_or_full_vec => |size| ty.isVector(zcu) and @divExact(size.bitSize(cg.target), 8) >= ty.abiSize(zcu) and
192485 if (cg.intInfo(ty.childType(zcu))) |int_info| switch (int_info.signedness) {193043 if (cg.intInfo(ty.childType(zcu))) |int_info| switch (int_info.signedness) {
192486 .signed => true,193044 .signed => true,
192487 .unsigned => int_info.bits >= 8 and std.math.isPowerOfTwo(int_info.bits),193045 .unsigned => (int_info.bits >= 8 and std.math.isPowerOfTwo(int_info.bits)) or int_info.bits % 128 == 0,
192488 } else false,193046 } else false,
192489 .unsigned_int_vec => |size| ty.isVector(zcu) and @divExact(size.bitSize(cg.target), 8) >= ty.abiSize(zcu) and193047 .unsigned_int_vec => |size| ty.isVector(zcu) and @divExact(size.bitSize(cg.target), 8) >= ty.abiSize(zcu) and
192490 if (cg.intInfo(ty.childType(zcu))) |int_info| int_info.signedness == .unsigned else false,193048 if (cg.intInfo(ty.childType(zcu))) |int_info| int_info.signedness == .unsigned else false,
...@@ -192733,22 +193291,10 @@ const Select = struct {...@@ -192733,22 +193291,10 @@ const Select = struct {
192733 to_mmx,193291 to_mmx,
192734 mut_mmx,193292 mut_mmx,
192735 to_mut_mmx,193293 to_mut_mmx,
192736 mm,
192737 to_mm,
192738 mut_mm,
192739 to_mut_mm,
192740 sse,193294 sse,
192741 to_sse,193295 to_sse,
192742 mut_sse,193296 mut_sse,
192743 to_mut_sse,193297 to_mut_sse,
192744 xmm,
192745 to_xmm,
192746 mut_xmm,
192747 to_mut_xmm,
192748 ymm,
192749 to_ymm,
192750 mut_ymm,
192751 to_mut_ymm,
192752 reg_mask: RegMaskSpec,193298 reg_mask: RegMaskSpec,
192753 all_reg_mask: RegMaskSpec,193299 all_reg_mask: RegMaskSpec,
192754193300
...@@ -192838,17 +193384,6 @@ const Select = struct {...@@ -192838,17 +193384,6 @@ const Select = struct {
192838 else => false,193384 else => false,
192839 },193385 },
192840 .to_mmx, .to_mut_mmx => true,193386 .to_mmx, .to_mut_mmx => true,
192841 .mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) {
192842 .register => |reg| reg.isClass(.mmx),
192843 .register_offset => |reg_off| reg_off.reg.isClass(.mmx) and reg_off.off == 0,
192844 else => false,
192845 },
192846 .mut_mm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) {
192847 .register => |reg| reg.isClass(.mmx),
192848 .register_offset => |reg_off| reg_off.reg.isClass(.mmx) and reg_off.off == 0,
192849 else => false,
192850 },
192851 .to_mm, .to_mut_mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8,
192852 .sse => switch (temp.tracking(cg).short) {193387 .sse => switch (temp.tracking(cg).short) {
192853 .register => |reg| reg.isClass(.sse),193388 .register => |reg| reg.isClass(.sse),
192854 .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,193389 .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
...@@ -192860,28 +193395,6 @@ const Select = struct {...@@ -192860,28 +193395,6 @@ const Select = struct {
192860 else => false,193395 else => false,
192861 },193396 },
192862 .to_sse, .to_mut_sse => true,193397 .to_sse, .to_mut_sse => true,
192863 .xmm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 16 and switch (temp.tracking(cg).short) {
192864 .register => |reg| reg.isClass(.sse),
192865 .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
192866 else => false,
192867 },
192868 .mut_xmm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 16 and switch (temp.tracking(cg).short) {
192869 .register => |reg| reg.isClass(.sse),
192870 .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
192871 else => false,
192872 },
192873 .to_xmm, .to_mut_xmm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 16,
192874 .ymm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 32 and switch (temp.tracking(cg).short) {
192875 .register => |reg| reg.isClass(.sse),
192876 .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
192877 else => false,
192878 },
192879 .mut_ymm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 32 and switch (temp.tracking(cg).short) {
192880 .register => |reg| reg.isClass(.sse),
192881 .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0,
192882 else => false,
192883 },
192884 .to_ymm, .to_mut_ymm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 32,
192885 .reg_mask => |mask_spec| switch (temp.tracking(cg).short) {193398 .reg_mask => |mask_spec| switch (temp.tracking(cg).short) {
192886 .register_mask => |reg_mask| mask_spec.size.bitSize(cg.target) >=193399 .register_mask => |reg_mask| mask_spec.size.bitSize(cg.target) >=
192887 reg_mask.info.scalar.bitSize(cg.target) * temp.typeOf(cg).vectorLen(cg.pt.zcu) and193400 reg_mask.info.scalar.bitSize(cg.target) * temp.typeOf(cg).vectorLen(cg.pt.zcu) and
...@@ -192915,10 +193428,10 @@ const Select = struct {...@@ -192915,10 +193428,10 @@ const Select = struct {
192915 .to_mut_gphi => try temp.toRegClass(true, .gphi, cg),193428 .to_mut_gphi => try temp.toRegClass(true, .gphi, cg),
192916 .x87, .to_x87 => try temp.toRegClass(false, .x87, cg),193429 .x87, .to_x87 => try temp.toRegClass(false, .x87, cg),
192917 .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg),193430 .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg),
192918 .mmx, .to_mmx, .mm, .to_mm => try temp.toRegClass(false, .mmx, cg),193431 .mmx, .to_mmx => try temp.toRegClass(false, .mmx, cg),
192919 .mut_mmx, .to_mut_mmx, .mut_mm, .to_mut_mm => try temp.toRegClass(true, .mmx, cg),193432 .mut_mmx, .to_mut_mmx => try temp.toRegClass(true, .mmx, cg),
192920 .sse, .to_sse, .xmm, .to_xmm, .ymm, .to_ymm => try temp.toRegClass(false, .sse, cg),193433 .sse, .to_sse => try temp.toRegClass(false, .sse, cg),
192921 .mut_sse, .to_mut_sse, .mut_xmm, .to_mut_xmm, .mut_ymm, .to_mut_ymm => try temp.toRegClass(true, .sse, cg),193434 .mut_sse, .to_mut_sse => try temp.toRegClass(true, .sse, cg),
192922 };193435 };
192923 }193436 }
192924 };193437 };
test/behavior/x86_64/build.zig+2
...@@ -5,6 +5,7 @@ pub fn build(b: *std.Build) void {...@@ -5,6 +5,7 @@ pub fn build(b: *std.Build) void {
5 "test-filter",5 "test-filter",
6 "Skip tests that do not match any filter",6 "Skip tests that do not match any filter",
7 ) orelse &[0][]const u8{};7 ) orelse &[0][]const u8{};
8 const strip = b.option(bool, "strip", "Omit debug information");
89
9 const compiler_rt_lib = b.addLibrary(.{10 const compiler_rt_lib = b.addLibrary(.{
10 .linkage = .static,11 .linkage = .static,
...@@ -171,6 +172,7 @@ pub fn build(b: *std.Build) void {...@@ -171,6 +172,7 @@ pub fn build(b: *std.Build) void {
171 const test_mod = b.createModule(.{172 const test_mod = b.createModule(.{
172 .root_source_file = b.path(path),173 .root_source_file = b.path(path),
173 .target = target,174 .target = target,
175 .strip = strip,
174 });176 });
175 const test_exe = b.addTest(.{177 const test_exe = b.addTest(.{
176 .name = std.fs.path.stem(path),178 .name = std.fs.path.stem(path),