authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-12-26 22:05:38-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-16 20:42:08-05:00
loga7efc56d8680bb51cc2488bbc0680b2fc080174f
tree0cb9a463bcdee05cd0cf9078fed9ed733dbdad0f
parenta1828ebcda0f684cdd146fa3ab5b86701909ca12

x86_64: the previous loop abstraction was too confusing

The temp usage was non-obvious, and implicit instructions hard to reason about.

1 files changed, 811 insertions(+), 696 deletions(-)

src/arch/x86_64/CodeGen.zig+811-696
......@@ -2669,7 +2669,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
26692669 .{ .src = .{ .to_mem, .to_mem } },
26702670 },
26712671 .extra_temps = .{
2672 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
2672 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
26732673 .{ .kind = .{ .rc = .sse } },
26742674 .unused,
26752675 .unused,
......@@ -2677,13 +2677,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
26772677 .unused,
26782678 },
26792679 .dst_temps = .{.mem},
2680 .each = .{ .limb = .{
2681 .of = .src0y,
2682 .body = &.{
2683 .{ ._, .v_dqu, .mov, .tmp1y, .limb(.src0y), ._, ._ },
2684 .{ ._, .vp_, mir_tag, .tmp1y, .tmp1y, .limb(.src1y), ._ },
2685 .{ ._, .v_dqu, .mov, .limb(.dst0y), .tmp1y, ._, ._ },
2686 },
2680 .each = .{ .once = &.{
2681 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2682 .{ .@"0:", .v_dqu, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
2683 .{ ._, .vp_, mir_tag, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
2684 .{ ._, .v_dqu, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
2685 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
2686 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
26872687 } },
26882688 }, .{
26892689 .required_features = .{ .avx, null },
......@@ -2691,7 +2691,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
26912691 .{ .src = .{ .to_mem, .to_mem } },
26922692 },
26932693 .extra_temps = .{
2694 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
2694 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
26952695 .{ .kind = .{ .rc = .sse } },
26962696 .unused,
26972697 .unused,
......@@ -2699,13 +2699,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
26992699 .unused,
27002700 },
27012701 .dst_temps = .{.mem},
2702 .each = .{ .limb = .{
2703 .of = .src0y,
2704 .body = &.{
2705 .{ ._, .v_pd, .movu, .tmp1y, .limb(.src0y), ._, ._ },
2706 .{ ._, .v_pd, mir_tag, .tmp1y, .tmp1y, .limb(.src1y), ._ },
2707 .{ ._, .v_pd, .movu, .limb(.dst0y), .tmp1y, ._, ._ },
2708 },
2702 .each = .{ .once = &.{
2703 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2704 .{ .@"0:", .v_pd, .movu, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
2705 .{ ._, .v_pd, mir_tag, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
2706 .{ ._, .v_pd, .movu, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
2707 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
2708 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27092709 } },
27102710 }, .{
27112711 .required_features = .{ .avx, null },
......@@ -2713,7 +2713,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27132713 .{ .src = .{ .to_mem, .to_mem } },
27142714 },
27152715 .extra_temps = .{
2716 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
2716 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
27172717 .{ .kind = .{ .rc = .sse } },
27182718 .unused,
27192719 .unused,
......@@ -2721,13 +2721,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27212721 .unused,
27222722 },
27232723 .dst_temps = .{.mem},
2724 .each = .{ .limb = .{
2725 .of = .src0x,
2726 .body = &.{
2727 .{ ._, .v_dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },
2728 .{ ._, .vp_, mir_tag, .tmp1x, .tmp1x, .limb(.src1x), ._ },
2729 .{ ._, .v_dqu, .mov, .limb(.dst0x), .tmp1x, ._, ._ },
2730 },
2724 .each = .{ .once = &.{
2725 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2726 .{ .@"0:", .v_dqu, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
2727 .{ ._, .vp_, mir_tag, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
2728 .{ ._, .v_dqu, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
2729 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
2730 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27312731 } },
27322732 }, .{
27332733 .required_features = .{ .sse2, null },
......@@ -2735,7 +2735,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27352735 .{ .src = .{ .to_mem, .to_mem } },
27362736 },
27372737 .extra_temps = .{
2738 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
2738 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
27392739 .{ .kind = .{ .rc = .sse } },
27402740 .unused,
27412741 .unused,
......@@ -2743,13 +2743,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27432743 .unused,
27442744 },
27452745 .dst_temps = .{.mem},
2746 .each = .{ .limb = .{
2747 .of = .src0x,
2748 .body = &.{
2749 .{ ._, ._dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },
2750 .{ ._, .p_, mir_tag, .tmp1x, .limb(.src1x), ._, ._ },
2751 .{ ._, ._dqu, .mov, .limb(.dst0x), .tmp1x, ._, ._ },
2752 },
2746 .each = .{ .once = &.{
2747 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2748 .{ .@"0:", ._dqu, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
2749 .{ ._, .p_, mir_tag, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
2750 .{ ._, ._dqu, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
2751 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
2752 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27532753 } },
27542754 }, .{
27552755 .required_features = .{ .sse, null },
......@@ -2757,7 +2757,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27572757 .{ .src = .{ .to_mem, .to_mem } },
27582758 },
27592759 .extra_temps = .{
2760 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
2760 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
27612761 .{ .kind = .{ .rc = .sse } },
27622762 .unused,
27632763 .unused,
......@@ -2765,13 +2765,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27652765 .unused,
27662766 },
27672767 .dst_temps = .{.mem},
2768 .each = .{ .limb = .{
2769 .of = .src0x,
2770 .body = &.{
2771 .{ ._, ._ps, .movu, .tmp1x, .limb(.src0x), ._, ._ },
2772 .{ ._, ._ps, mir_tag, .tmp1x, .limb(.src1x), ._, ._ },
2773 .{ ._, ._ps, .movu, .limb(.dst0x), .tmp1x, ._, ._ },
2774 },
2768 .each = .{ .once = &.{
2769 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2770 .{ .@"0:", ._ps, .movu, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
2771 .{ ._, ._ps, mir_tag, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
2772 .{ ._, ._ps, .movu, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
2773 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
2774 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27752775 } },
27762776 }, .{
27772777 .required_features = .{ .mmx, null },
......@@ -2779,7 +2779,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27792779 .{ .src = .{ .to_mem, .to_mem } },
27802780 },
27812781 .extra_temps = .{
2782 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
2782 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
27832783 .{ .kind = .{ .rc = .mmx } },
27842784 .unused,
27852785 .unused,
......@@ -2787,20 +2787,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27872787 .unused,
27882788 },
27892789 .dst_temps = .{.mem},
2790 .each = .{ .limb = .{
2791 .of = .src0q,
2792 .body = &.{
2793 .{ ._, ._q, .mov, .tmp1q, .limb(.src0q), ._, ._ },
2794 .{ ._, .p_, mir_tag, .tmp1q, .limb(.src1q), ._, ._ },
2795 .{ ._, ._q, .mov, .limb(.dst0q), .tmp1q, ._, ._ },
2796 },
2790 .each = .{ .once = &.{
2791 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2792 .{ .@"0:", ._q, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
2793 .{ ._, .p_, mir_tag, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
2794 .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
2795 .{ ._, ._, .add, .tmp0p, .i(8), ._, ._ },
2796 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27972797 } },
27982798 }, .{
27992799 .patterns = &.{
28002800 .{ .src = .{ .to_mem, .to_mem } },
28012801 },
28022802 .extra_temps = .{
2803 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
2803 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28042804 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
28052805 .unused,
28062806 .unused,
......@@ -2808,13 +2808,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
28082808 .unused,
28092809 },
28102810 .dst_temps = .{.mem},
2811 .each = .{ .limb = .{
2812 .of = .src0p,
2813 .body = &.{
2814 .{ ._, ._, .mov, .tmp1p, .limb(.src0p), ._, ._ },
2815 .{ ._, ._, mir_tag, .tmp1p, .limb(.src1p), ._, ._ },
2816 .{ ._, ._, .mov, .limb(.dst0p), .tmp1p, ._, ._ },
2817 },
2811 .each = .{ .once = &.{
2812 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2813 .{ .@"0:", ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
2814 .{ ._, ._, mir_tag, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
2815 .{ ._, ._, .mov, .memia(.dst0p, .tmp0, .add_size), .tmp1p, ._, ._ },
2816 .{ ._, ._, .add, .tmp0p, .a(.tmp1, .add_size), ._, ._ },
2817 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
28182818 } },
28192819 } },
28202820 }) catch |err2| switch (err2) {
......@@ -3306,7 +3306,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
33063306 },
33073307 .clobbers = .{ .eflags = true },
33083308 .extra_temps = .{
3309 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3309 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33103310 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33113311 .unused,
33123312 .unused,
......@@ -3341,32 +3341,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
33413341 .{ .src = .{ .to_mem, .to_mem } },
33423342 },
33433343 .extra_temps = .{
3344 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3345 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3344 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3345 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
33463346 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
33473347 .{ .kind = .{ .rc = .sse } },
33483348 .unused,
33493349 .unused,
33503350 },
33513351 .dst_temps = .{.mem},
3352 .each = .{ .limb_and_mask_limb = .{
3353 .of = .src0y,
3354 .of_mask = .dst0b,
3355 .body = switch (cc) {
3356 else => unreachable,
3357 .e => &.{
3358 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },
3359 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },
3360 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3361 .{ ._, ._, .mov, .maskLimb(.dst0d), .tmp2d, ._, ._ },
3362 },
3363 .ne => &.{
3364 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },
3365 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },
3366 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3367 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
3368 .{ ._, ._, .mov, .maskLimb(.dst0d), .tmp2d, ._, ._ },
3369 },
3352 .each = .{ .once = switch (cc) {
3353 else => unreachable,
3354 .e => &.{
3355 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3356 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3357 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3358 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3359 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3360 .{ ._, ._, .mov, .memi(.dst0d, .tmp1), .tmp2d, ._, ._ },
3361 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3362 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3363 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3364 },
3365 .ne => &.{
3366 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3367 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3368 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3369 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3370 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3371 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
3372 .{ ._, ._, .mov, .memi(.dst0d, .tmp1), .tmp2d, ._, ._ },
3373 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3374 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3375 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
33703376 },
33713377 } },
33723378 }, .{
......@@ -3376,34 +3382,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
33763382 .{ .src = .{ .to_mem, .to_mem } },
33773383 },
33783384 .extra_temps = .{
3379 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3380 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3385 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3386 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
33813387 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
33823388 .{ .kind = .{ .rc = .sse } },
33833389 .unused,
33843390 .unused,
33853391 },
33863392 .dst_temps = .{.mem},
3387 .each = .{ .limb_and_mask_limb = .{
3388 .of = .src0y,
3389 .of_mask = .dst0w,
3390 .body = switch (cc) {
3391 else => unreachable,
3392 .e => &.{
3393 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },
3394 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },
3395 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },
3396 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3397 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },
3398 },
3399 .ne => &.{
3400 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },
3401 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },
3402 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },
3403 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3404 .{ ._, ._, .not, .tmp2w, ._, ._, ._ },
3405 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },
3406 },
3393 .each = .{ .once = switch (cc) {
3394 else => unreachable,
3395 .e => &.{
3396 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3397 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3398 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3399 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3400 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },
3401 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3402 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3403 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3404 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3405 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3406 },
3407 .ne => &.{
3408 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3409 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3410 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3411 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3412 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },
3413 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3414 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
3415 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3416 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3417 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3418 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
34073419 },
34083420 } },
34093421 }, .{
......@@ -3413,32 +3425,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
34133425 .{ .src = .{ .to_mem, .to_mem } },
34143426 },
34153427 .extra_temps = .{
3416 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3417 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3428 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3429 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
34183430 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
34193431 .{ .kind = .{ .rc = .sse } },
34203432 .unused,
34213433 .unused,
34223434 },
34233435 .dst_temps = .{.mem},
3424 .each = .{ .limb_and_mask_limb = .{
3425 .of = .src0y,
3426 .of_mask = .dst0d,
3427 .body = switch (cc) {
3428 else => unreachable,
3429 .e => &.{
3430 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },
3431 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },
3432 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3433 .{ ._, ._, .mov, .maskLimb(.dst0b), .tmp2b, ._, ._ },
3434 },
3435 .ne => &.{
3436 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },
3437 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },
3438 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3439 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
3440 .{ ._, ._, .mov, .maskLimb(.dst0b), .tmp2b, ._, ._ },
3441 },
3436 .each = .{ .once = switch (cc) {
3437 else => unreachable,
3438 .e => &.{
3439 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3440 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3441 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3442 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3443 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3444 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3445 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3446 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3447 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3448 },
3449 .ne => &.{
3450 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3451 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3452 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3453 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3454 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3455 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
3456 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3457 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3458 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3459 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
34423460 },
34433461 } },
34443462 }, .{
......@@ -3448,34 +3466,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
34483466 .{ .src = .{ .to_mem, .to_mem } },
34493467 },
34503468 .extra_temps = .{
3451 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3452 .{ .type = .usize, .kind = .{ .reg = .rcx } },
3453 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3454 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3469 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3470 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3471 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3472 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
34553473 .{ .kind = .{ .rc = .sse } },
34563474 .unused,
34573475 },
34583476 .dst_temps = .{.mem},
3459 .each = .{ .limb_and_mask_limb = .{
3460 .of = .src0y,
3461 .of_mask = .dst0q,
3462 .body = switch (cc) {
3463 else => unreachable,
3464 .e => &.{
3465 .{ ._, .v_dqu, .mov, .tmp4y, .limb(.src0y), ._, ._ },
3466 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .limb(.src1y), ._ },
3467 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },
3468 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3469 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3470 },
3471 .ne => &.{
3472 .{ ._, .v_dqu, .mov, .tmp4y, .limb(.src0y), ._, ._ },
3473 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .limb(.src1y), ._ },
3474 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },
3475 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },
3476 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3477 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3478 },
3477 .each = .{ .once = switch (cc) {
3478 else => unreachable,
3479 .e => &.{
3480 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3481 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3482 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3483 .{ .@"0:", .v_dqu, .mov, .tmp4y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3484 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._ },
3485 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },
3486 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3487 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3488 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3489 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3490 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3491 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3492 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3493 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3494 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3495 .{ .@"1:", ._, .add, .tmp0p, .i(32), ._, ._ },
3496 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3497 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3498 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3499 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3500 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3501 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
3502 },
3503 .ne => &.{
3504 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3505 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3506 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3507 .{ .@"0:", .v_dqu, .mov, .tmp4y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3508 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._ },
3509 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },
3510 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },
3511 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3512 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3513 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3514 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3515 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3516 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3517 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3518 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3519 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3520 .{ .@"1:", ._, .add, .tmp0p, .i(32), ._, ._ },
3521 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3522 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3523 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3524 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3525 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3526 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
34793527 },
34803528 } },
34813529 }, .{
......@@ -3485,32 +3533,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
34853533 .{ .src = .{ .to_mem, .to_mem } },
34863534 },
34873535 .extra_temps = .{
3488 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3489 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3536 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3537 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
34903538 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
34913539 .{ .kind = .{ .rc = .sse } },
34923540 .unused,
34933541 .unused,
34943542 },
34953543 .dst_temps = .{.mem},
3496 .each = .{ .limb_and_mask_limb = .{
3497 .of = .src0x,
3498 .of_mask = .dst0b,
3499 .body = switch (cc) {
3500 else => unreachable,
3501 .e => &.{
3502 .{ ._, .v_dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },
3503 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .limb(.src1x), ._ },
3504 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3505 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },
3506 },
3507 .ne => &.{
3508 .{ ._, .v_dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },
3509 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .limb(.src1x), ._ },
3510 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3511 .{ ._, ._, .not, .tmp2w, ._, ._, ._ },
3512 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },
3513 },
3544 .each = .{ .once = switch (cc) {
3545 else => unreachable,
3546 .e => &.{
3547 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3548 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3549 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3550 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
3551 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3552 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3553 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3554 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3555 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3556 },
3557 .ne => &.{
3558 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3559 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3560 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3561 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
3562 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3563 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
3564 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3565 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3566 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3567 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
35143568 },
35153569 } },
35163570 }, .{
......@@ -3520,34 +3574,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
35203574 .{ .src = .{ .to_mem, .to_mem } },
35213575 },
35223576 .extra_temps = .{
3523 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3524 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3577 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3578 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
35253579 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
35263580 .{ .kind = .{ .rc = .sse } },
35273581 .unused,
35283582 .unused,
35293583 },
35303584 .dst_temps = .{.mem},
3531 .each = .{ .limb_and_mask_limb = .{
3532 .of = .src0x,
3533 .of_mask = .dst0w,
3534 .body = switch (cc) {
3535 else => unreachable,
3536 .e => &.{
3537 .{ ._, .v_dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },
3538 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .limb(.src1x), ._ },
3539 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },
3540 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3541 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },
3542 },
3543 .ne => &.{
3544 .{ ._, .v_dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },
3545 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .limb(.src1x), ._ },
3546 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },
3547 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3548 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
3549 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },
3550 },
3585 .each = .{ .once = switch (cc) {
3586 else => unreachable,
3587 .e => &.{
3588 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3589 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3590 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3591 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
3592 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },
3593 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3594 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3595 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3596 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3597 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3598 },
3599 .ne => &.{
3600 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3601 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3602 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3603 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
3604 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },
3605 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3606 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
3607 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3608 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3609 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3610 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
35513611 },
35523612 } },
35533613 }, .{
......@@ -3557,34 +3617,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
35573617 .{ .src = .{ .to_mem, .to_mem } },
35583618 },
35593619 .extra_temps = .{
3560 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3561 .{ .type = .usize, .kind = .{ .reg = .rcx } },
3562 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3563 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3620 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3621 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3622 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3623 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
35643624 .{ .kind = .{ .rc = .sse } },
35653625 .unused,
35663626 },
35673627 .dst_temps = .{.mem},
3568 .each = .{ .limb_and_mask_limb = .{
3569 .of = .src0x,
3570 .of_mask = .dst0d,
3571 .body = switch (cc) {
3572 else => unreachable,
3573 .e => &.{
3574 .{ ._, .v_dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },
3575 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .limb(.src1x), ._ },
3576 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3577 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3578 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3579 },
3580 .ne => &.{
3581 .{ ._, .v_dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },
3582 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .limb(.src1x), ._ },
3583 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3584 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },
3585 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3586 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3587 },
3628 .each = .{ .once = switch (cc) {
3629 else => unreachable,
3630 .e => &.{
3631 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3632 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3633 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3634 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3635 .{ ._, .vp_d, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
3636 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3637 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3638 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3639 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3640 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3641 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3642 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3643 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3644 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3645 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3646 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3647 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3648 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3649 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3650 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3651 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3652 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
3653 },
3654 .ne => &.{
3655 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3656 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3657 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3658 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3659 .{ ._, .vp_d, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
3660 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3661 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },
3662 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3663 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3664 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3665 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3666 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3667 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3668 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3669 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3670 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3671 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3672 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3673 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3674 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3675 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3676 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3677 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
35883678 },
35893679 } },
35903680 }, .{
......@@ -3594,34 +3684,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
35943684 .{ .src = .{ .to_mem, .to_mem } },
35953685 },
35963686 .extra_temps = .{
3597 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3598 .{ .type = .usize, .kind = .{ .reg = .rcx } },
3599 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3600 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3687 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3688 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3689 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3690 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
36013691 .{ .kind = .{ .rc = .sse } },
36023692 .unused,
36033693 },
36043694 .dst_temps = .{.mem},
3605 .each = .{ .limb_and_mask_limb = .{
3606 .of = .src0x,
3607 .of_mask = .dst0q,
3608 .body = switch (cc) {
3609 else => unreachable,
3610 .e => &.{
3611 .{ ._, .v_dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },
3612 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .limb(.src1x), ._ },
3613 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3614 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3615 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3616 },
3617 .ne => &.{
3618 .{ ._, .v_dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },
3619 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .limb(.src1x), ._ },
3620 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3621 .{ ._, ._, .xor, .tmp3b, .i(0b11), ._, ._ },
3622 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3623 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3624 },
3695 .each = .{ .once = switch (cc) {
3696 else => unreachable,
3697 .e => &.{
3698 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3699 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3700 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3701 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3702 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
3703 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3704 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3705 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3706 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3707 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3708 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3709 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3710 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3711 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3712 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3713 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3714 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3715 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3716 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3717 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3718 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3719 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
3720 },
3721 .ne => &.{
3722 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3723 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3724 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3725 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3726 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
3727 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3728 .{ ._, ._, .xor, .tmp3b, .i(0b11), ._, ._ },
3729 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3730 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3731 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3732 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3733 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3734 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3735 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3736 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3737 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3738 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3739 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3740 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3741 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3742 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3743 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3744 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
36253745 },
36263746 } },
36273747 }, .{
......@@ -3631,32 +3751,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
36313751 .{ .src = .{ .to_mem, .to_mem } },
36323752 },
36333753 .extra_temps = .{
3634 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3635 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3754 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3755 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
36363756 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
36373757 .{ .kind = .{ .rc = .sse } },
36383758 .unused,
36393759 .unused,
36403760 },
36413761 .dst_temps = .{.mem},
3642 .each = .{ .limb_and_mask_limb = .{
3643 .of = .src0x,
3644 .of_mask = .dst0b,
3645 .body = switch (cc) {
3646 else => unreachable,
3647 .e => &.{
3648 .{ ._, ._dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },
3649 .{ ._, .p_b, .cmpeq, .tmp3x, .limb(.src1x), ._, ._ },
3650 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3651 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },
3652 },
3653 .ne => &.{
3654 .{ ._, ._dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },
3655 .{ ._, .p_b, .cmpeq, .tmp3x, .limb(.src1x), ._, ._ },
3656 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3657 .{ ._, ._, .not, .tmp2w, ._, ._, ._ },
3658 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },
3659 },
3762 .each = .{ .once = switch (cc) {
3763 else => unreachable,
3764 .e => &.{
3765 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3766 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3767 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3768 .{ ._, .p_b, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3769 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3770 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3771 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3772 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3773 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3774 },
3775 .ne => &.{
3776 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3777 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3778 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3779 .{ ._, .p_b, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3780 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3781 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
3782 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3783 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3784 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3785 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
36603786 },
36613787 } },
36623788 }, .{
......@@ -3666,34 +3792,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
36663792 .{ .src = .{ .to_mem, .to_mem } },
36673793 },
36683794 .extra_temps = .{
3669 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3670 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3795 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3796 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
36713797 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
36723798 .{ .kind = .{ .rc = .sse } },
36733799 .unused,
36743800 .unused,
36753801 },
36763802 .dst_temps = .{.mem},
3677 .each = .{ .limb_and_mask_limb = .{
3678 .of = .src0x,
3679 .of_mask = .dst0w,
3680 .body = switch (cc) {
3681 else => unreachable,
3682 .e => &.{
3683 .{ ._, ._dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },
3684 .{ ._, .p_w, .cmpeq, .tmp3x, .limb(.src1x), ._, ._ },
3685 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },
3686 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3687 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },
3688 },
3689 .ne => &.{
3690 .{ ._, ._dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },
3691 .{ ._, .p_w, .cmpeq, .tmp3x, .limb(.src1x), ._, ._ },
3692 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },
3693 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3694 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
3695 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },
3696 },
3803 .each = .{ .once = switch (cc) {
3804 else => unreachable,
3805 .e => &.{
3806 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3807 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3808 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3809 .{ ._, .p_w, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3810 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },
3811 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3812 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3813 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3814 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3815 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3816 },
3817 .ne => &.{
3818 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3819 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3820 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3821 .{ ._, .p_w, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3822 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },
3823 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3824 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
3825 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3826 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3827 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3828 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
36973829 },
36983830 } },
36993831 }, .{
......@@ -3703,34 +3835,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
37033835 .{ .src = .{ .to_mem, .to_mem } },
37043836 },
37053837 .extra_temps = .{
3706 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3707 .{ .type = .usize, .kind = .{ .reg = .rcx } },
3708 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3709 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3838 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3839 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3840 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3841 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
37103842 .{ .kind = .{ .rc = .sse } },
37113843 .unused,
37123844 },
37133845 .dst_temps = .{.mem},
3714 .each = .{ .limb_and_mask_limb = .{
3715 .of = .src0x,
3716 .of_mask = .dst0d,
3717 .body = switch (cc) {
3718 else => unreachable,
3719 .e => &.{
3720 .{ ._, ._dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },
3721 .{ ._, .p_q, .cmpeq, .tmp4x, .limb(.src1x), ._, ._ },
3722 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3723 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3724 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3725 },
3726 .ne => &.{
3727 .{ ._, ._dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },
3728 .{ ._, .p_d, .cmpeq, .tmp4x, .limb(.src1x), ._, ._ },
3729 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3730 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },
3731 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3732 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3733 },
3846 .each = .{ .once = switch (cc) {
3847 else => unreachable,
3848 .e => &.{
3849 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3850 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3851 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3852 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3853 .{ ._, .p_d, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3854 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3855 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3856 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3857 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3858 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3859 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3860 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3861 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3862 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3863 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3864 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3865 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3866 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3867 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3868 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3869 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3870 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
3871 },
3872 .ne => &.{
3873 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3874 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3875 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3876 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3877 .{ ._, .p_d, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3878 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3879 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },
3880 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3881 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3882 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3883 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3884 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3885 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3886 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3887 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3888 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3889 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3890 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3891 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3892 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3893 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3894 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3895 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
37343896 },
37353897 } },
37363898 }, .{
......@@ -3740,143 +3902,249 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
37403902 .{ .src = .{ .to_mem, .to_mem } },
37413903 },
37423904 .extra_temps = .{
3743 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3744 .{ .type = .usize, .kind = .{ .reg = .rcx } },
3745 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3746 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3905 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3906 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3907 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3908 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
37473909 .{ .kind = .{ .rc = .sse } },
37483910 .unused,
37493911 },
37503912 .dst_temps = .{.mem},
3751 .each = .{ .limb_and_mask_limb = .{
3752 .of = .src0x,
3753 .of_mask = .dst0q,
3754 .body = switch (cc) {
3755 else => unreachable,
3756 .e => &.{
3757 .{ ._, ._dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },
3758 .{ ._, .p_q, .cmpeq, .tmp4x, .limb(.src1x), ._, ._ },
3759 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3760 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3761 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3762 },
3763 .ne => &.{
3764 .{ ._, ._dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },
3765 .{ ._, .p_q, .cmpeq, .tmp4x, .limb(.src1x), ._, ._ },
3766 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3767 .{ ._, ._, .xor, .tmp3b, .i(0b11), ._, ._ },
3768 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3769 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3770 },
3913 .each = .{ .once = switch (cc) {
3914 else => unreachable,
3915 .e => &.{
3916 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3917 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3918 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3919 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3920 .{ ._, .p_q, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3921 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3922 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3923 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3924 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3925 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3926 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3927 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3928 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3929 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3930 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3931 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3932 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3933 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3934 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3935 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3936 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3937 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
3938 },
3939 .ne => &.{
3940 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3941 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3942 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3943 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3944 .{ ._, .p_q, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3945 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3946 .{ ._, ._, .xor, .tmp3b, .i(0b11), ._, ._ },
3947 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3948 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3949 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3950 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3951 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3952 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3953 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3954 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3955 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3956 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3957 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3958 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3959 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
3960 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3961 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3962 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
37713963 },
37723964 } },
37733965 }, .{
3774 .required_features = .{ .mmx, null },
3966 .required_features = .{ .sse, .mmx },
37753967 .src_constraints = .{ .{ .int = .byte }, .{ .int = .byte } },
37763968 .patterns = &.{
37773969 .{ .src = .{ .to_mem, .to_mem } },
37783970 },
37793971 .extra_temps = .{
3780 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3781 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3782 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
3972 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3973 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3974 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
37833975 .{ .kind = .{ .rc = .mmx } },
37843976 .unused,
37853977 .unused,
37863978 },
37873979 .dst_temps = .{.mem},
3788 .each = .{ .limb_and_mask_limb = .{
3789 .of = .src0q,
3790 .of_mask = .dst0b,
3791 .body = switch (cc) {
3792 else => unreachable,
3793 .e => &.{
3794 .{ ._, ._dqu, .mov, .tmp3q, .limb(.src0q), ._, ._ },
3795 .{ ._, .p_b, .cmpeq, .tmp3q, .limb(.src1q), ._, ._ },
3796 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
3797 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },
3798 },
3799 .ne => &.{
3800 .{ ._, ._dqu, .mov, .tmp3q, .limb(.src0q), ._, ._ },
3801 .{ ._, .p_b, .cmpeq, .tmp3q, .limb(.src1q), ._, ._ },
3802 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
3803 .{ ._, ._, .not, .tmp2w, ._, ._, ._ },
3804 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },
3805 },
3980 .each = .{ .once = switch (cc) {
3981 else => unreachable,
3982 .e => &.{
3983 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3984 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3985 .{ .@"0:", ._q, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
3986 .{ ._, .p_b, .cmpeq, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
3987 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
3988 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3989 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3990 .{ ._, ._, .add, .tmp0p, .i(8), ._, ._ },
3991 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3992 },
3993 .ne => &.{
3994 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3995 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3996 .{ .@"0:", ._q, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
3997 .{ ._, .p_b, .cmpeq, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
3998 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
3999 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
4000 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
4001 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
4002 .{ ._, ._, .add, .tmp0p, .i(8), ._, ._ },
4003 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
38064004 },
38074005 } },
38084006 }, .{
3809 .required_features = .{ .mmx, null },
4007 .required_features = .{ .sse, .mmx },
38104008 .src_constraints = .{ .{ .int = .word }, .{ .int = .word } },
38114009 .patterns = &.{
38124010 .{ .src = .{ .to_mem, .to_mem } },
38134011 },
38144012 .extra_temps = .{
3815 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3816 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4013 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4014 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4015 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
4016 .{ .kind = .{ .rc = .mmx } },
38174017 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
38184018 .{ .kind = .{ .rc = .mmx } },
3819 .unused,
3820 .unused,
38214019 },
38224020 .dst_temps = .{.mem},
3823 .each = .{ .limb_and_mask_limb = .{
3824 .of = .src0q,
3825 .of_mask = .dst0w,
3826 .body = switch (cc) {
3827 else => unreachable,
3828 .e => &.{
3829 .{ ._, ._dqu, .mov, .tmp3q, .limb(.src0q), ._, ._ },
3830 .{ ._, .p_w, .cmpeq, .tmp3q, .limb(.src1q), ._, ._ },
3831 .{ ._, .p_b, .ackssw, .tmp3q, .tmp3q, ._, ._ },
3832 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
3833 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },
3834 },
3835 .ne => &.{
3836 .{ ._, ._dqu, .mov, .tmp3q, .limb(.src0q), ._, ._ },
3837 .{ ._, .p_w, .cmpeq, .tmp3q, .limb(.src1q), ._, ._ },
3838 .{ ._, .p_b, .ackssw, .tmp3q, .tmp3q, ._, ._ },
3839 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
3840 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
3841 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },
3842 },
4021 .each = .{ .once = switch (cc) {
4022 else => unreachable,
4023 .e => &.{
4024 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
4025 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
4026 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
4027 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
4028 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4029 .{ ._, .p_w, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4030 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
4031 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
4032 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
4033 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
4034 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
4035 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
4036 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
4037 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
4038 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
4039 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
4040 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
4041 .{ .@"1:", ._, .add, .tmp0p, .i(8), ._, ._ },
4042 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4043 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
4044 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
4045 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
4046 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
4047 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
4048 },
4049 .ne => &.{
4050 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
4051 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
4052 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
4053 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
4054 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4055 .{ ._, .p_w, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4056 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
4057 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
4058 .{ ._, ._, .xor, .tmp4b, .i(0b1111), ._, ._ },
4059 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
4060 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
4061 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
4062 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
4063 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
4064 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
4065 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
4066 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
4067 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
4068 .{ .@"1:", ._, .add, .tmp0p, .i(8), ._, ._ },
4069 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4070 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
4071 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
4072 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
4073 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
4074 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
38434075 },
38444076 } },
38454077 }, .{
3846 .required_features = .{ .mmx, null },
4078 .required_features = .{ .sse, .mmx },
38474079 .src_constraints = .{ .{ .int = .dword }, .{ .int = .dword } },
38484080 .patterns = &.{
38494081 .{ .src = .{ .to_mem, .to_mem } },
38504082 },
38514083 .extra_temps = .{
3852 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3853 .{ .type = .usize, .kind = .{ .reg = .rcx } },
3854 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3855 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4084 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4085 .{ .type = .u32, .kind = .{ .reg = .rcx } },
4086 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
4087 .{ .kind = .{ .rc = .mmx } },
4088 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
38564089 .{ .kind = .{ .rc = .mmx } },
3857 .unused,
38584090 },
38594091 .dst_temps = .{.mem},
3860 .each = .{ .limb_and_mask_limb = .{
3861 .of = .src0q,
3862 .of_mask = .dst0d,
3863 .body = switch (cc) {
3864 else => unreachable,
3865 .e => &.{
3866 .{ ._, ._dqu, .mov, .tmp4q, .limb(.src0q), ._, ._ },
3867 .{ ._, .p_q, .cmpeq, .tmp4q, .limb(.src1q), ._, ._ },
3868 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4q, ._, ._ },
3869 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3870 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3871 },
3872 .ne => &.{
3873 .{ ._, ._dqu, .mov, .tmp4q, .limb(.src0q), ._, ._ },
3874 .{ ._, .p_q, .cmpeq, .tmp4q, .limb(.src1q), ._, ._ },
3875 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4q, ._, ._ },
3876 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },
3877 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3878 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3879 },
4092 .each = .{ .once = switch (cc) {
4093 else => unreachable,
4094 .e => &.{
4095 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
4096 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
4097 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
4098 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
4099 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4100 .{ ._, .p_d, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4101 .{ ._, .p_w, .ackssd, .tmp5q, .tmp3q, ._, ._ },
4102 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
4103 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
4104 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
4105 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
4106 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
4107 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
4108 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
4109 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
4110 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
4111 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
4112 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
4113 .{ .@"1:", ._, .add, .tmp0p, .i(8), ._, ._ },
4114 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4115 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
4116 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
4117 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
4118 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
4119 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
4120 },
4121 .ne => &.{
4122 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
4123 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
4124 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
4125 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
4126 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4127 .{ ._, .p_d, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4128 .{ ._, .p_w, .ackssd, .tmp5q, .tmp3q, ._, ._ },
4129 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
4130 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
4131 .{ ._, ._, .xor, .tmp4b, .i(0b11), ._, ._ },
4132 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
4133 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
4134 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
4135 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
4136 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
4137 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
4138 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
4139 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
4140 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
4141 .{ .@"1:", ._, .add, .tmp0p, .i(8), ._, ._ },
4142 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4143 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
4144 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
4145 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
4146 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
4147 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
38804148 },
38814149 } },
38824150 }, .{
......@@ -3887,7 +4155,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
38874155 .{ .src = .{ .to_mem, .to_mem } },
38884156 },
38894157 .extra_temps = .{
3890 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4158 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
38914159 .{ .type = .u8, .kind = .{ .reg = .cl } },
38924160 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
38934161 .unused,
......@@ -3915,7 +4183,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
39154183 .{ .src = .{ .to_mem, .to_mem } },
39164184 },
39174185 .extra_temps = .{
3918 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4186 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
39194187 .{ .type = .u8, .kind = .{ .reg = .cl } },
39204188 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
39214189 .unused,
......@@ -3944,7 +4212,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
39444212 .{ .src = .{ .to_mem, .to_mem } },
39454213 },
39464214 .extra_temps = .{
3947 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4215 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
39484216 .{ .type = .u8, .kind = .{ .reg = .cl } },
39494217 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
39504218 .unused,
......@@ -3972,7 +4240,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
39724240 .{ .src = .{ .to_mem, .to_mem } },
39734241 },
39744242 .extra_temps = .{
3975 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4243 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
39764244 .{ .type = .u8, .kind = .{ .reg = .cl } },
39774245 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
39784246 .unused,
......@@ -4001,7 +4269,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
40014269 .{ .src = .{ .to_mem, .to_mem } },
40024270 },
40034271 .extra_temps = .{
4004 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4272 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
40054273 .{ .type = .u8, .kind = .{ .reg = .cl } },
40064274 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
40074275 .unused,
......@@ -4029,7 +4297,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
40294297 .{ .src = .{ .to_mem, .to_mem } },
40304298 },
40314299 .extra_temps = .{
4032 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4300 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
40334301 .{ .type = .u8, .kind = .{ .reg = .cl } },
40344302 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
40354303 .unused,
......@@ -4058,7 +4326,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
40584326 .{ .src = .{ .to_mem, .to_mem } },
40594327 },
40604328 .extra_temps = .{
4061 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4329 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
40624330 .{ .type = .u8, .kind = .{ .reg = .cl } },
40634331 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
40644332 .unused,
......@@ -4087,7 +4355,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
40874355 .{ .src = .{ .to_mem, .to_mem } },
40884356 },
40894357 .extra_temps = .{
4090 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4358 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
40914359 .{ .type = .u8, .kind = .{ .reg = .cl } },
40924360 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
40934361 .unused,
......@@ -4185,7 +4453,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
41854453 .{ .src = .{ .to_mem, .to_mem } },
41864454 },
41874455 .extra_temps = .{
4188 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4456 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
41894457 .{ .type = .u8, .kind = .{ .reg = .cl } },
41904458 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
41914459 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
......@@ -4214,7 +4482,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
42144482 .{ .src = .{ .to_mem, .to_mem } },
42154483 },
42164484 .extra_temps = .{
4217 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4485 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
42184486 .{ .type = .u8, .kind = .{ .reg = .cl } },
42194487 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
42204488 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
......@@ -4244,7 +4512,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
42444512 .{ .src = .{ .to_mem, .to_mem } },
42454513 },
42464514 .extra_temps = .{
4247 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4515 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
42484516 .{ .type = .u8, .kind = .{ .reg = .cl } },
42494517 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
42504518 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
......@@ -4273,7 +4541,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
42734541 .{ .src = .{ .to_mem, .to_mem } },
42744542 },
42754543 .extra_temps = .{
4276 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4544 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
42774545 .{ .type = .u8, .kind = .{ .reg = .cl } },
42784546 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
42794547 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
......@@ -4303,7 +4571,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
43034571 .{ .src = .{ .to_mem, .to_mem } },
43044572 },
43054573 .extra_temps = .{
4306 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4574 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
43074575 .{ .type = .u8, .kind = .{ .reg = .cl } },
43084576 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
43094577 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
......@@ -4332,7 +4600,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
43324600 .{ .src = .{ .to_mem, .to_mem } },
43334601 },
43344602 .extra_temps = .{
4335 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4603 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
43364604 .{ .type = .u8, .kind = .{ .reg = .cl } },
43374605 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
43384606 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
......@@ -4362,7 +4630,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
43624630 .{ .src = .{ .to_mem, .to_mem } },
43634631 },
43644632 .extra_temps = .{
4365 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4633 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
43664634 .{ .type = .u8, .kind = .{ .reg = .cl } },
43674635 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
43684636 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
......@@ -4392,7 +4660,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
43924660 .{ .src = .{ .to_mem, .to_mem } },
43934661 },
43944662 .extra_temps = .{
4395 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4663 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
43964664 .{ .type = .u8, .kind = .{ .reg = .cl } },
43974665 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
43984666 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
......@@ -4493,7 +4761,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
44934761 .{ .src = .{ .to_mem, .to_mem } },
44944762 },
44954763 .extra_temps = .{
4496 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4764 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
44974765 .{ .type = .u8, .kind = .{ .reg = .cl } },
44984766 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
44994767 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
......@@ -4523,7 +4791,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
45234791 .{ .src = .{ .to_mem, .to_mem } },
45244792 },
45254793 .extra_temps = .{
4526 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4794 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
45274795 .{ .type = .u8, .kind = .{ .reg = .cl } },
45284796 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
45294797 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
......@@ -4553,7 +4821,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
45534821 .{ .src = .{ .to_mem, .to_mem } },
45544822 },
45554823 .extra_temps = .{
4556 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4824 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
45574825 .{ .type = .u8, .kind = .{ .reg = .cl } },
45584826 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
45594827 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
......@@ -4582,7 +4850,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
45824850 .{ .src = .{ .to_mem, .to_mem } },
45834851 },
45844852 .extra_temps = .{
4585 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4853 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
45864854 .{ .type = .u8, .kind = .{ .reg = .cl } },
45874855 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
45884856 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
......@@ -4612,7 +4880,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
46124880 .{ .src = .{ .to_mem, .to_mem } },
46134881 },
46144882 .extra_temps = .{
4615 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4883 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
46164884 .{ .type = .u8, .kind = .{ .reg = .cl } },
46174885 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
46184886 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
......@@ -4642,7 +4910,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
46424910 .{ .src = .{ .to_mem, .to_mem } },
46434911 },
46444912 .extra_temps = .{
4645 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4913 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
46464914 .{ .type = .u8, .kind = .{ .reg = .cl } },
46474915 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
46484916 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
......@@ -4672,7 +4940,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
46724940 .{ .src = .{ .to_mem, .to_mem } },
46734941 },
46744942 .extra_temps = .{
4675 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4943 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
46764944 .{ .type = .u8, .kind = .{ .reg = .cl } },
46774945 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
46784946 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
......@@ -4702,7 +4970,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
47024970 .{ .src = .{ .to_mem, .to_mem } },
47034971 },
47044972 .extra_temps = .{
4705 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4973 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
47064974 .{ .type = .u8, .kind = .{ .reg = .cl } },
47074975 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
47084976 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
......@@ -4803,7 +5071,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
48035071 .{ .src = .{ .to_mem, .to_mem } },
48045072 },
48055073 .extra_temps = .{
4806 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5074 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
48075075 .{ .type = .u32, .kind = .{ .reg = .ecx } },
48085076 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
48095077 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
......@@ -4822,15 +5090,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
48225090 .{ ._, ._l, .sh, .tmp3p, .tmp1b, ._, ._ },
48235091 .{ ._, ._, .@"or", .tmp2p, .tmp3p, ._, ._ },
48245092 .{ ._, ._, .add, .tmp1d, .i(1), ._, ._ },
4825 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .tmp2, .add_bit_size), ._, ._ },
5093 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .none, .add_ptr_bit_size), ._, ._ },
48265094 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
48275095 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
48285096 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
4829 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_access_size), .tmp2p, ._, ._ },
5097 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_ptr_size), .tmp2p, ._, ._ },
48305098 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
48315099 .{ .@"1:", ._, .add, .tmp0p, .i(1), ._, ._ },
48325100 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4833 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .tmp2, .add_bit_size), ._, ._ },
5101 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .none, .add_ptr_bit_size), ._, ._ },
48345102 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
48355103 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
48365104 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
......@@ -4842,7 +5110,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
48425110 .{ .src = .{ .to_mem, .to_mem } },
48435111 },
48445112 .extra_temps = .{
4845 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5113 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
48465114 .{ .type = .u32, .kind = .{ .reg = .ecx } },
48475115 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
48485116 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
......@@ -4861,15 +5129,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
48615129 .{ ._, ._l, .sh, .tmp3p, .tmp1b, ._, ._ },
48625130 .{ ._, ._, .@"or", .tmp2p, .tmp3p, ._, ._ },
48635131 .{ ._, ._, .inc, .tmp1d, ._, ._, ._ },
4864 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .tmp2, .add_bit_size), ._, ._ },
5132 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .none, .add_ptr_bit_size), ._, ._ },
48655133 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
48665134 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
48675135 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
4868 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_access_size), .tmp2p, ._, ._ },
5136 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_ptr_size), .tmp2p, ._, ._ },
48695137 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
48705138 .{ .@"1:", ._, .inc, .tmp0p, ._, ._, ._ },
48715139 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
4872 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .tmp2, .add_bit_size), ._, ._ },
5140 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .none, .add_ptr_bit_size), ._, ._ },
48735141 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
48745142 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
48755143 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
......@@ -5040,8 +5308,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
50405308 .{ .src = .{ .to_mem, .to_mem } },
50415309 },
50425310 .extra_temps = .{
5311 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
50435312 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5044 .{ .type = .bool, .kind = .{ .rc = .general_purpose } },
50455313 .unused,
50465314 .unused,
50475315 .unused,
......@@ -5049,18 +5317,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
50495317 },
50505318 .clobbers = .{ .eflags = true },
50515319 .dst_temps = .{.{ .rc = .general_purpose }},
5052 .each = .{ .limb = .{
5053 .of = .src0p,
5054 .header = &.{
5055 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
5056 },
5057 .body = &.{
5058 .{ ._, ._, .mov, .tmp0p, .limb(.src0p), ._, ._ },
5059 .{ ._, ._r, .sh, .tmp1b, .i(1), ._, ._ },
5060 .{ ._, ._, .sbb, .tmp0p, .limb(.src1p), ._, ._ },
5061 .{ ._, ._c, .set, .tmp1b, ._, ._, ._ },
5062 .{ ._, .fromCondition(cc), .set, .dst0b, ._, ._, ._ },
5063 },
5320 .each = .{ .once = &.{
5321 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5322 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
5323 .{ .@"0:", ._r, .sh, .tmp1b, .i(1), ._, ._ },
5324 .{ ._, ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
5325 .{ ._, ._, .sbb, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
5326 .{ ._, ._c, .set, .tmp1b, ._, ._, ._ },
5327 .{ ._, .fromCondition(cc), .set, .dst0b, ._, ._, ._ },
5328 .{ ._, ._, .add, .tmp0p, .a(.tmp1, .add_size), ._, ._ },
5329 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
50645330 } },
50655331 } },
50665332 }) catch |err| switch (err) {
......@@ -5296,35 +5562,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
52965562 .{ .src = .{ .to_mem, .to_mem } },
52975563 },
52985564 .extra_temps = .{
5299 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5300 .{ .kind = .{ .rc = .sse } },
5301 .{ .kind = .{ .rc = .sse } },
5302 .unused,
5303 .unused,
5304 .unused,
5305 },
5306 .dst_temps = .{.{ .cc = cc }},
5307 .each = .{ .limb = .{
5308 .of = .src0y,
5309 .header = &.{
5310 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .tmp2y, ._ },
5311 },
5312 .body = &.{
5313 .{ ._, .v_dqu, .mov, .tmp1y, .limb(.src0y), ._, ._ },
5314 .{ ._, .vp_, .xor, .tmp1y, .tmp1y, .limb(.src1y), ._ },
5315 .{ ._, .vp_, .@"or", .tmp2y, .tmp2y, .tmp1y, ._ },
5316 },
5317 .trailer = &.{
5318 .{ ._, .vp_, .@"test", .tmp2y, .tmp2y, ._, ._ },
5319 },
5320 } },
5321 }, .{
5322 .required_features = .{ .avx, null },
5323 .patterns = &.{
5324 .{ .src = .{ .to_mem, .to_mem } },
5325 },
5326 .extra_temps = .{
5327 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5565 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
53285566 .{ .kind = .{ .rc = .sse } },
53295567 .{ .kind = .{ .rc = .sse } },
53305568 .unused,
......@@ -5332,19 +5570,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
53325570 .unused,
53335571 },
53345572 .dst_temps = .{.{ .cc = cc }},
5335 .each = .{ .limb = .{
5336 .of = .src0y,
5337 .header = &.{
5338 .{ ._, .v_pd, .xor, .tmp2y, .tmp2y, .tmp2y, ._ },
5339 },
5340 .body = &.{
5341 .{ ._, .v_pd, .movu, .tmp1y, .limb(.src0y), ._, ._ },
5342 .{ ._, .v_pd, .xor, .tmp1y, .tmp1y, .limb(.src1y), ._ },
5343 .{ ._, .v_pd, .@"or", .tmp2y, .tmp2y, .tmp1y, ._ },
5344 },
5345 .trailer = &.{
5346 .{ ._, .vp_, .@"test", .tmp2y, .tmp2y, ._, ._ },
5347 },
5573 .each = .{ .once = &.{
5574 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5575 .{ ._, .vp_, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },
5576 .{ .@"0:", .v_dqu, .mov, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5577 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._ },
5578 .{ ._, .vp_, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
5579 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
5580 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5581 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
53485582 } },
53495583 }, .{
53505584 .required_features = .{ .avx, null },
......@@ -5352,7 +5586,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
53525586 .{ .src = .{ .to_mem, .to_mem } },
53535587 },
53545588 .extra_temps = .{
5355 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5589 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
53565590 .{ .kind = .{ .rc = .sse } },
53575591 .{ .kind = .{ .rc = .sse } },
53585592 .unused,
......@@ -5360,19 +5594,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
53605594 .unused,
53615595 },
53625596 .dst_temps = .{.{ .cc = cc }},
5363 .each = .{ .limb = .{
5364 .of = .src0x,
5365 .header = &.{
5366 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
5367 },
5368 .body = &.{
5369 .{ ._, .v_dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },
5370 .{ ._, .vp_, .xor, .tmp1x, .tmp1x, .limb(.src1x), ._ },
5371 .{ ._, .vp_, .@"or", .tmp2x, .tmp2x, .tmp1x, ._ },
5372 },
5373 .trailer = &.{
5374 .{ ._, .vp_, .@"test", .tmp2x, .tmp2x, ._, ._ },
5375 },
5597 .each = .{ .once = &.{
5598 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5599 .{ ._, .v_pd, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },
5600 .{ .@"0:", .v_pd, .movu, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5601 .{ ._, .v_pd, .xor, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._ },
5602 .{ ._, .v_pd, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
5603 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
5604 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5605 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
53765606 } },
53775607 }, .{
53785608 .required_features = .{ .avx, null },
......@@ -5380,7 +5610,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
53805610 .{ .src = .{ .to_mem, .to_mem } },
53815611 },
53825612 .extra_temps = .{
5383 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5613 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
53845614 .{ .kind = .{ .rc = .sse } },
53855615 .{ .kind = .{ .rc = .sse } },
53865616 .unused,
......@@ -5388,19 +5618,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
53885618 .unused,
53895619 },
53905620 .dst_temps = .{.{ .cc = cc }},
5391 .each = .{ .limb = .{
5392 .of = .src0x,
5393 .header = &.{
5394 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
5395 },
5396 .body = &.{
5397 .{ ._, .v_dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },
5398 .{ ._, .vp_, .xor, .tmp1x, .tmp1x, .limb(.src1x), ._ },
5399 .{ ._, .vp_, .@"or", .tmp2x, .tmp2x, .tmp1x, ._ },
5400 },
5401 .trailer = &.{
5402 .{ ._, .vp_, .@"test", .tmp2x, .tmp2x, ._, ._ },
5403 },
5621 .each = .{ .once = &.{
5622 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5623 .{ ._, .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ },
5624 .{ .@"0:", .v_dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5625 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._ },
5626 .{ ._, .vp_, .@"or", .tmp1x, .tmp1x, .tmp2x, ._ },
5627 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
5628 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5629 .{ ._, .vp_, .@"test", .tmp1x, .tmp1x, ._, ._ },
54045630 } },
54055631 }, .{
54065632 .required_features = .{ .sse4_1, null },
......@@ -5408,7 +5634,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54085634 .{ .src = .{ .to_mem, .to_mem } },
54095635 },
54105636 .extra_temps = .{
5411 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5637 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
54125638 .{ .kind = .{ .rc = .sse } },
54135639 .{ .kind = .{ .rc = .sse } },
54145640 .unused,
......@@ -5416,19 +5642,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54165642 .unused,
54175643 },
54185644 .dst_temps = .{.{ .cc = cc }},
5419 .each = .{ .limb = .{
5420 .of = .src0x,
5421 .header = &.{
5422 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
5423 },
5424 .body = &.{
5425 .{ ._, ._dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },
5426 .{ ._, .p_, .xor, .tmp1x, .limb(.src1x), ._, ._ },
5427 .{ ._, .p_, .@"or", .tmp2x, .tmp1x, ._, ._ },
5428 },
5429 .trailer = &.{
5430 .{ ._, .p_, .@"test", .tmp2x, .tmp2x, ._, ._ },
5431 },
5645 .each = .{ .once = &.{
5646 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5647 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
5648 .{ .@"0:", ._dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5649 .{ ._, .p_, .xor, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5650 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
5651 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
5652 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5653 .{ ._, .p_, .@"test", .tmp1x, .tmp1x, ._, ._ },
54325654 } },
54335655 }, .{
54345656 .required_features = .{ .sse2, null },
......@@ -5436,7 +5658,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54365658 .{ .src = .{ .to_mem, .to_mem } },
54375659 },
54385660 .extra_temps = .{
5439 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5661 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
54405662 .{ .kind = .{ .rc = .sse } },
54415663 .{ .kind = .{ .rc = .sse } },
54425664 .unused,
......@@ -5444,22 +5666,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54445666 .unused,
54455667 },
54465668 .dst_temps = .{.{ .cc = cc }},
5447 .each = .{ .limb = .{
5448 .of = .src0x,
5449 .header = &.{
5450 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
5451 },
5452 .body = &.{
5453 .{ ._, ._dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },
5454 .{ ._, .p_, .xor, .tmp1x, .limb(.src1x), ._, ._ },
5455 .{ ._, .p_, .@"or", .tmp2x, .tmp1x, ._, ._ },
5456 },
5457 .trailer = &.{
5458 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
5459 .{ ._, .p_b, .cmpeq, .tmp2x, .tmp1x, ._, ._ },
5460 .{ ._, .p_b, .movmsk, .tmp0d, .tmp2x, ._, ._ },
5461 .{ ._, ._, .xor, .tmp0d, .i(0xffff), ._, ._ },
5462 },
5669 .each = .{ .once = &.{
5670 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5671 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
5672 .{ .@"0:", ._dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5673 .{ ._, .p_, .xor, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5674 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
5675 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
5676 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5677 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
5678 .{ ._, .p_b, .cmpeq, .tmp1x, .tmp2x, ._, ._ },
5679 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1x, ._, ._ },
5680 .{ ._, ._, .cmp, .tmp0d, .i(0xffff), ._, ._ },
54635681 } },
54645682 }, .{
54655683 .required_features = .{ .sse, .mmx },
......@@ -5467,7 +5685,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54675685 .{ .src = .{ .to_mem, .to_mem } },
54685686 },
54695687 .extra_temps = .{
5470 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5688 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
54715689 .{ .kind = .{ .rc = .mmx } },
54725690 .{ .kind = .{ .rc = .mmx } },
54735691 .unused,
......@@ -5475,29 +5693,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54755693 .unused,
54765694 },
54775695 .dst_temps = .{.{ .cc = cc }},
5478 .each = .{ .limb = .{
5479 .of = .src0q,
5480 .header = &.{
5481 .{ ._, .p_, .xor, .tmp2q, .tmp2q, ._, ._ },
5482 },
5483 .body = &.{
5484 .{ ._, ._q, .mov, .tmp1q, .limb(.src0q), ._, ._ },
5485 .{ ._, .p_, .xor, .tmp1q, .limb(.src1q), ._, ._ },
5486 .{ ._, .p_, .@"or", .tmp2q, .tmp1q, ._, ._ },
5487 },
5488 .trailer = &.{
5489 .{ ._, .p_, .xor, .tmp1q, .tmp1q, ._, ._ },
5490 .{ ._, .p_b, .cmpeq, .tmp2q, .tmp1q, ._, ._ },
5491 .{ ._, .p_b, .movmsk, .tmp0d, .tmp2q, ._, ._ },
5492 .{ ._, ._, .xor, .tmp0d, .i(0xff), ._, ._ },
5493 },
5696 .each = .{ .once = &.{
5697 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5698 .{ ._, .p_, .xor, .tmp1q, .tmp1q, ._, ._ },
5699 .{ .@"0:", ._q, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
5700 .{ ._, .p_, .xor, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5701 .{ ._, .p_, .@"or", .tmp1q, .tmp2q, ._, ._ },
5702 .{ ._, ._, .add, .tmp0p, .i(8), ._, ._ },
5703 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5704 .{ ._, .p_, .xor, .tmp2q, .tmp2q, ._, ._ },
5705 .{ ._, .p_b, .cmpeq, .tmp1q, .tmp2q, ._, ._ },
5706 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1q, ._, ._ },
5707 .{ ._, ._, .cmp, .tmp0d, .i(0xff), ._, ._ },
54945708 } },
54955709 }, .{
54965710 .patterns = &.{
54975711 .{ .src = .{ .to_mem, .to_mem } },
54985712 },
54995713 .extra_temps = .{
5500 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5714 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
55015715 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
55025716 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
55035717 .unused,
......@@ -5505,19 +5719,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
55055719 .unused,
55065720 },
55075721 .dst_temps = .{.{ .cc = cc }},
5508 .each = .{ .limb = .{
5509 .of = .src0p,
5510 .header = &.{
5511 .{ ._, ._, .xor, .tmp2p, .tmp2p, ._, ._ },
5512 },
5513 .body = &.{
5514 .{ ._, ._, .mov, .tmp1p, .limb(.src0p), ._, ._ },
5515 .{ ._, ._, .xor, .tmp1p, .limb(.src1p), ._, ._ },
5516 .{ ._, ._, .@"or", .tmp2p, .tmp1p, ._, ._ },
5517 },
5518 .trailer = &.{
5519 .{ ._, ._, .@"test", .tmp2p, .tmp2p, ._, ._ },
5520 },
5722 .each = .{ .once = &.{
5723 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5724 .{ ._, ._, .xor, .tmp1p, .tmp1p, ._, ._ },
5725 .{ .@"0:", ._, .mov, .tmp2p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
5726 .{ ._, ._, .xor, .tmp2p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
5727 .{ ._, ._, .@"or", .tmp1p, .tmp2p, ._, ._ },
5728 .{ ._, ._, .add, .tmp0p, .a(.tmp2, .add_size), ._, ._ },
5729 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5730 .{ ._, ._, .@"test", .tmp1p, .tmp1p, ._, ._ },
55215731 } },
55225732 } },
55235733 }) catch |err| switch (err) {
......@@ -24063,8 +24273,6 @@ const Select = struct {
2406324273 backward: ?Mir.Inst.Index,
2406424274 forward: [1]?Mir.Inst.Index,
2406524275 },
24066 limb: Memory.Mod.Rm,
24067 mask_limb: Memory.Mod.Rm,
2406824276
2406924277 fn emitLabel(s: *Select, label_index: Label) void {
2407024278 if (label_index == ._) return;
......@@ -24112,23 +24320,6 @@ const Select = struct {
2411224320 dst_temps: [@intFromEnum(Select.Operand.Ref.src0) - @intFromEnum(Select.Operand.Ref.dst0)]TempSpec.Kind = @splat(.unused),
2411324321 each: union(enum) {
2411424322 once: []const Instruction,
24115 limb: struct {
24116 of: Select.Operand.Ref.Sized,
24117 header: []const Instruction = &.{},
24118 first: ?[]const Instruction = null,
24119 body: []const Instruction,
24120 last: ?[]const Instruction = null,
24121 trailer: []const Instruction = &.{},
24122 },
24123 limb_and_mask_limb: struct {
24124 of: Select.Operand.Ref.Sized,
24125 of_mask: Select.Operand.Ref.Sized,
24126 header: []const Instruction = &.{},
24127 first: ?[]const Instruction = null,
24128 body: []const Instruction,
24129 last: ?[]const Instruction = null,
24130 trailer: []const Instruction = &.{},
24131 },
2413224323 },
2413324324 };
2413424325
......@@ -24349,26 +24540,20 @@ const Select = struct {
2434924540 backward_label,
2435024541 forward_label,
2435124542 ref,
24352 limb,
24353 mask_limb,
2435424543 simm,
2435524544 lea,
2435624545 mem,
2435724546 };
2435824547 const Adjust = enum {
2435924548 none,
24360 add_access_size,
24361 sub_access_size,
24549 add_ptr_size,
24550 sub_ptr_size,
24551 add_ptr_bit_size,
24552 sub_ptr_bit_size,
2436224553 add_size,
2436324554 sub_size,
24364 add_bit_size,
24365 sub_bit_size,
24366 add_limbs,
24367 sub_limbs,
2436824555 add_len,
2436924556 sub_len,
24370 add_elem_size,
24371 sub_elem_size,
2437224557 add_elem_limbs,
2437324558 sub_elem_limbs,
2437424559 };
......@@ -24435,6 +24620,15 @@ const Select = struct {
2443524620 const tmp4x: Sized = .{ .ref = .tmp4, .size = .xword };
2443624621 const tmp4y: Sized = .{ .ref = .tmp4, .size = .yword };
2443724622
24623 const tmp5: Sized = .{ .ref = .tmp5, .size = .none };
24624 const tmp5b: Sized = .{ .ref = .tmp5, .size = .byte };
24625 const tmp5w: Sized = .{ .ref = .tmp5, .size = .word };
24626 const tmp5d: Sized = .{ .ref = .tmp5, .size = .dword };
24627 const tmp5p: Sized = .{ .ref = .tmp5, .size = .ptr };
24628 const tmp5q: Sized = .{ .ref = .tmp5, .size = .qword };
24629 const tmp5x: Sized = .{ .ref = .tmp5, .size = .xword };
24630 const tmp5y: Sized = .{ .ref = .tmp5, .size = .yword };
24631
2443824632 const dst0: Sized = .{ .ref = .dst0, .size = .none };
2443924633 const dst0b: Sized = .{ .ref = .dst0, .size = .byte };
2444024634 const dst0w: Sized = .{ .ref = .dst0, .size = .word };
......@@ -24515,6 +24709,14 @@ const Select = struct {
2451524709 const tmp4x: Select.Operand = .{ .tag = .ref, .base = .tmp4x };
2451624710 const tmp4y: Select.Operand = .{ .tag = .ref, .base = .tmp4y };
2451724711
24712 const tmp5b: Select.Operand = .{ .tag = .ref, .base = .tmp5b };
24713 const tmp5w: Select.Operand = .{ .tag = .ref, .base = .tmp5w };
24714 const tmp5d: Select.Operand = .{ .tag = .ref, .base = .tmp5d };
24715 const tmp5p: Select.Operand = .{ .tag = .ref, .base = .tmp5p };
24716 const tmp5q: Select.Operand = .{ .tag = .ref, .base = .tmp5q };
24717 const tmp5x: Select.Operand = .{ .tag = .ref, .base = .tmp5x };
24718 const tmp5y: Select.Operand = .{ .tag = .ref, .base = .tmp5y };
24719
2451824720 const dst0b: Select.Operand = .{ .tag = .ref, .base = .dst0b };
2451924721 const dst0w: Select.Operand = .{ .tag = .ref, .base = .dst0w };
2452024722 const dst0d: Select.Operand = .{ .tag = .ref, .base = .dst0d };
......@@ -24539,13 +24741,6 @@ const Select = struct {
2453924741 const src1x: Select.Operand = .{ .tag = .ref, .base = .src1x };
2454024742 const src1y: Select.Operand = .{ .tag = .ref, .base = .src1y };
2454124743
24542 fn limb(ref: Ref.Sized) Select.Operand {
24543 return .{ .tag = .limb, .base = ref };
24544 }
24545 fn maskLimb(ref: Ref.Sized) Select.Operand {
24546 return .{ .tag = .mask_limb, .base = ref };
24547 }
24548
2454924744 fn i(imm: i32) Select.Operand {
2455024745 return .{ .tag = .simm, .imm = imm };
2455124746 }
......@@ -24673,28 +24868,14 @@ const Select = struct {
2467324868 fn adjustedImm(op: Select.Operand, s: *const Select) i32 {
2467424869 return switch (op.adjust) {
2467524870 .none => op.imm,
24676 .add_access_size => op.imm + @as(i32, @intCast(@divExact(op.base.size.bitSize(s.cg.target), 8))),
24677 .sub_access_size => op.imm - @as(i32, @intCast(@divExact(op.base.size.bitSize(s.cg.target), 8))),
24871 .add_ptr_size => op.imm + @divExact(s.cg.target.ptrBitWidth(), 8),
24872 .sub_ptr_size => op.imm - @divExact(s.cg.target.ptrBitWidth(), 8),
24873 .add_ptr_bit_size => op.imm + s.cg.target.ptrBitWidth(),
24874 .sub_ptr_bit_size => op.imm - s.cg.target.ptrBitWidth(),
2467824875 .add_size => op.imm + @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu))),
2467924876 .sub_size => op.imm - @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu))),
24680 .add_bit_size => op.imm + @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).bitSize(s.cg.pt.zcu))),
24681 .sub_bit_size => op.imm - @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).bitSize(s.cg.pt.zcu))),
24682 .add_limbs => op.imm + @as(i32, @intCast(@divExact(
24683 op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu),
24684 @divExact(op.base.size.bitSize(s.cg.target), 8),
24685 ))),
24686 .sub_limbs => op.imm + @as(i32, @intCast(@divExact(
24687 op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu),
24688 @divExact(op.base.size.bitSize(s.cg.target), 8),
24689 ))),
2469024877 .add_len => op.imm + @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).vectorLen(s.cg.pt.zcu))),
2469124878 .sub_len => op.imm - @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).vectorLen(s.cg.pt.zcu))),
24692 .add_elem_size => op.imm + @as(i32, @intCast(
24693 op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).abiSize(s.cg.pt.zcu),
24694 )),
24695 .sub_elem_size => op.imm - @as(i32, @intCast(
24696 op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).abiSize(s.cg.pt.zcu),
24697 )),
2469824879 .add_elem_limbs => op.imm + @as(i32, @intCast(@divExact(
2469924880 op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).abiSize(s.cg.pt.zcu),
2470024881 @divExact(op.base.size.bitSize(s.cg.target), 8),
......@@ -24726,7 +24907,6 @@ const Select = struct {
2472624907 else => |mcv| .{ .mem = try mcv.mem(s.cg, .{ .size = op.base.size }) },
2472724908 .register => |reg| .{ .reg = registerAlias(reg, @intCast(@divExact(op.base.size.bitSize(s.cg.target), 8))) },
2472824909 },
24729 inline .limb, .mask_limb => |kind| .{ .mem = try op.base.ref.deref(s).tracking(s.cg).short.mem(s.cg, @field(s, @tagName(kind))) },
2473024910 .simm => .{ .imm = .s(op.adjustedImm(s)) },
2473124911 .lea => .{ .mem = .{
2473224912 .base = .{ .reg = registerAlias(op.base.ref.deref(s).tracking(s.cg).short.register, @divExact(s.cg.target.ptrBitWidth(), 8)) },
......@@ -24775,8 +24955,6 @@ fn select(
2477524955 .cg = cg,
2477624956 .temps = undefined,
2477724957 .labels = @splat(.{ .forward = @splat(null), .backward = null }),
24778 .limb = undefined,
24779 .mask_limb = undefined,
2478024958 };
2478124959 const tmp_slots = s.temps[@intFromEnum(Select.Operand.Ref.tmp0)..@intFromEnum(Select.Operand.Ref.dst0)];
2478224960 const dst_slots = s.temps[@intFromEnum(Select.Operand.Ref.dst0)..@intFromEnum(Select.Operand.Ref.src0)];
......@@ -24797,74 +24975,11 @@ fn select(
2479724975 @memcpy(dst_slots[0..dst_temps.len], dst_temps);
2479824976
2479924977 switch (case.each) {
24800 .once => |body| for (body) |inst| try s.emit(inst),
24801 .limb => |limb| {
24802 const limb_of_size: i32 = @intCast(limb.of.ref.deref(&s).typeOf(cg).abiSize(cg.pt.zcu));
24803 s.limb = .{
24804 .size = limb.of.size,
24805 .index = (try Select.Operand.tmp0p.lower(&s)).reg,
24806 .disp = limb_of_size,
24807 };
24808 for (limb.header) |inst| try s.emit(inst);
24809 try s.emit(.{ ._, ._, .mov, .tmp0p, .i(-limb_of_size), ._, ._ });
24810 assert(s.labels[0].backward == null);
24811 s.labels[0].backward = @intCast(cg.mir_instructions.len);
24812 for (limb.body) |inst| try s.emit(inst);
24813 try s.emit(.{ ._, ._, .add, .tmp0p, .i(@intCast(@divExact(limb.of.size.bitSize(cg.target), 8))), ._, ._ });
24814 try s.emit(.{ ._, ._nc, .j, .@"0b", ._, ._, ._ });
24815 for (limb.trailer) |inst| try s.emit(inst);
24816 },
24817 .limb_and_mask_limb => |limb| {
24818 const limb_of_size: i32 = @intCast(limb.of.ref.deref(&s).typeOf(cg).abiSize(cg.pt.zcu));
24819 s.limb = .{
24820 .size = limb.of.size,
24821 .index = (try Select.Operand.tmp0p.lower(&s)).reg,
24822 .disp = limb_of_size,
24823 };
24824 const mask_limb_bit_size: u31 = @intCast(@divExact(
24825 limb.of.size.bitSize(cg.target),
24826 limb.of_mask.size.bitSize(cg.target),
24827 ));
24828 if (mask_limb_bit_size >= 8) {
24829 s.mask_limb = .{
24830 .size = .fromBitSize(mask_limb_bit_size),
24831 .index = (try Select.Operand.tmp1p.lower(&s)).reg,
24832 };
24833 for (limb.header) |inst| try s.emit(inst);
24834 try s.emit(.{ ._, ._, .mov, .tmp0p, .i(-limb_of_size), ._, ._ });
24835 try s.emit(.{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ });
24836 assert(s.labels[0].backward == null);
24837 s.labels[0].backward = @intCast(cg.mir_instructions.len);
24838 for (limb.body) |inst| try s.emit(inst);
24839 try s.emit(.{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, @divExact(mask_limb_bit_size, 8)), ._, ._ });
24840 try s.emit(.{ ._, ._, .add, .tmp0p, .i(@intCast(@divExact(limb.of.size.bitSize(cg.target), 8))), ._, ._ });
24841 try s.emit(.{ ._, ._nc, .j, .@"0b", ._, ._, ._ });
24842 for (limb.trailer) |inst| try s.emit(inst);
24843 } else {
24844 for (limb.header) |inst| try s.emit(inst);
24845 try s.emit(.{ ._, ._, .mov, .tmp0p, .i(-limb_of_size), ._, ._ });
24846 try s.emit(.{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ });
24847 try s.emit(.{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ });
24848 assert(s.labels[0].backward == null);
24849 s.labels[0].backward = @intCast(cg.mir_instructions.len);
24850 for (limb.body) |inst| try s.emit(inst);
24851 try s.emit(.{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, mask_limb_bit_size), ._, ._ });
24852 try s.emit(.{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ });
24853 try s.emit(.{ ._, ._nz, .j, .@"1f", ._, ._, ._ });
24854 try s.emit(.{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ });
24855 try s.emit(.{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ });
24856 try s.emit(.{ ._, ._, .mov, .memid(.{ .ref = limb.of_mask.ref, .size = .byte }, .tmp3, -1), .tmp2b, ._, ._ });
24857 try s.emit(.{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ });
24858 try s.emit(.{ .@"1:", ._, .add, .tmp0p, .i(@intCast(@divExact(limb.of.size.bitSize(cg.target), 8))), ._, ._ });
24859 try s.emit(.{ ._, ._nc, .j, .@"0b", ._, ._, ._ });
24860 try s.emit(.{ ._, ._, .lea, .tmp3d, .lead(.none, .tmp1, -1), ._, ._ });
24861 try s.emit(.{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ });
24862 try s.emit(.{ ._, ._, .mov, .memi(.{ .ref = limb.of_mask.ref, .size = .byte }, .tmp3), .tmp2b, ._, ._ });
24863 for (limb.trailer) |inst| try s.emit(inst);
24864 }
24978 .once => |body| {
24979 for (body) |inst| try s.emit(inst);
24980 s.emitLabel(.@"0:");
2486524981 },
2486624982 }
24867 s.emitLabel(.@"0:");
2486824983
2486924984 for (dst_temps, case.dst_temps[0..dst_temps.len]) |dst_temp, dst_kind| dst_kind.finish(dst_temp, &s);
2487024985 for (case.extra_temps, tmp_slots) |spec, temp| if (spec.kind != .unused) try temp.die(cg);