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 {...@@ -2669,7 +2669,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2669 .{ .src = .{ .to_mem, .to_mem } },2669 .{ .src = .{ .to_mem, .to_mem } },
2670 },2670 },
2671 .extra_temps = .{2671 .extra_temps = .{
2672 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2672 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2673 .{ .kind = .{ .rc = .sse } },2673 .{ .kind = .{ .rc = .sse } },
2674 .unused,2674 .unused,
2675 .unused,2675 .unused,
...@@ -2677,13 +2677,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2677,13 +2677,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2677 .unused,2677 .unused,
2678 },2678 },
2679 .dst_temps = .{.mem},2679 .dst_temps = .{.mem},
2680 .each = .{ .limb = .{2680 .each = .{ .once = &.{
2681 .of = .src0y,2681 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2682 .body = &.{2682 .{ .@"0:", .v_dqu, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
2683 .{ ._, .v_dqu, .mov, .tmp1y, .limb(.src0y), ._, ._ },2683 .{ ._, .vp_, mir_tag, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
2684 .{ ._, .vp_, mir_tag, .tmp1y, .tmp1y, .limb(.src1y), ._ },2684 .{ ._, .v_dqu, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
2685 .{ ._, .v_dqu, .mov, .limb(.dst0y), .tmp1y, ._, ._ },2685 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
2686 },2686 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2687 } },2687 } },
2688 }, .{2688 }, .{
2689 .required_features = .{ .avx, null },2689 .required_features = .{ .avx, null },
...@@ -2691,7 +2691,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2691,7 +2691,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2691 .{ .src = .{ .to_mem, .to_mem } },2691 .{ .src = .{ .to_mem, .to_mem } },
2692 },2692 },
2693 .extra_temps = .{2693 .extra_temps = .{
2694 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2694 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2695 .{ .kind = .{ .rc = .sse } },2695 .{ .kind = .{ .rc = .sse } },
2696 .unused,2696 .unused,
2697 .unused,2697 .unused,
...@@ -2699,13 +2699,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2699,13 +2699,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2699 .unused,2699 .unused,
2700 },2700 },
2701 .dst_temps = .{.mem},2701 .dst_temps = .{.mem},
2702 .each = .{ .limb = .{2702 .each = .{ .once = &.{
2703 .of = .src0y,2703 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2704 .body = &.{2704 .{ .@"0:", .v_pd, .movu, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
2705 .{ ._, .v_pd, .movu, .tmp1y, .limb(.src0y), ._, ._ },2705 .{ ._, .v_pd, mir_tag, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
2706 .{ ._, .v_pd, mir_tag, .tmp1y, .tmp1y, .limb(.src1y), ._ },2706 .{ ._, .v_pd, .movu, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
2707 .{ ._, .v_pd, .movu, .limb(.dst0y), .tmp1y, ._, ._ },2707 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
2708 },2708 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2709 } },2709 } },
2710 }, .{2710 }, .{
2711 .required_features = .{ .avx, null },2711 .required_features = .{ .avx, null },
...@@ -2713,7 +2713,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2713,7 +2713,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2713 .{ .src = .{ .to_mem, .to_mem } },2713 .{ .src = .{ .to_mem, .to_mem } },
2714 },2714 },
2715 .extra_temps = .{2715 .extra_temps = .{
2716 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2716 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2717 .{ .kind = .{ .rc = .sse } },2717 .{ .kind = .{ .rc = .sse } },
2718 .unused,2718 .unused,
2719 .unused,2719 .unused,
...@@ -2721,13 +2721,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2721,13 +2721,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2721 .unused,2721 .unused,
2722 },2722 },
2723 .dst_temps = .{.mem},2723 .dst_temps = .{.mem},
2724 .each = .{ .limb = .{2724 .each = .{ .once = &.{
2725 .of = .src0x,2725 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2726 .body = &.{2726 .{ .@"0:", .v_dqu, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
2727 .{ ._, .v_dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },2727 .{ ._, .vp_, mir_tag, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
2728 .{ ._, .vp_, mir_tag, .tmp1x, .tmp1x, .limb(.src1x), ._ },2728 .{ ._, .v_dqu, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
2729 .{ ._, .v_dqu, .mov, .limb(.dst0x), .tmp1x, ._, ._ },2729 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
2730 },2730 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2731 } },2731 } },
2732 }, .{2732 }, .{
2733 .required_features = .{ .sse2, null },2733 .required_features = .{ .sse2, null },
...@@ -2735,7 +2735,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2735,7 +2735,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2735 .{ .src = .{ .to_mem, .to_mem } },2735 .{ .src = .{ .to_mem, .to_mem } },
2736 },2736 },
2737 .extra_temps = .{2737 .extra_temps = .{
2738 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2738 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2739 .{ .kind = .{ .rc = .sse } },2739 .{ .kind = .{ .rc = .sse } },
2740 .unused,2740 .unused,
2741 .unused,2741 .unused,
...@@ -2743,13 +2743,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2743,13 +2743,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2743 .unused,2743 .unused,
2744 },2744 },
2745 .dst_temps = .{.mem},2745 .dst_temps = .{.mem},
2746 .each = .{ .limb = .{2746 .each = .{ .once = &.{
2747 .of = .src0x,2747 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2748 .body = &.{2748 .{ .@"0:", ._dqu, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
2749 .{ ._, ._dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },2749 .{ ._, .p_, mir_tag, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
2750 .{ ._, .p_, mir_tag, .tmp1x, .limb(.src1x), ._, ._ },2750 .{ ._, ._dqu, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
2751 .{ ._, ._dqu, .mov, .limb(.dst0x), .tmp1x, ._, ._ },2751 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
2752 },2752 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2753 } },2753 } },
2754 }, .{2754 }, .{
2755 .required_features = .{ .sse, null },2755 .required_features = .{ .sse, null },
...@@ -2757,7 +2757,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2757,7 +2757,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2757 .{ .src = .{ .to_mem, .to_mem } },2757 .{ .src = .{ .to_mem, .to_mem } },
2758 },2758 },
2759 .extra_temps = .{2759 .extra_temps = .{
2760 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2760 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2761 .{ .kind = .{ .rc = .sse } },2761 .{ .kind = .{ .rc = .sse } },
2762 .unused,2762 .unused,
2763 .unused,2763 .unused,
...@@ -2765,13 +2765,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2765,13 +2765,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2765 .unused,2765 .unused,
2766 },2766 },
2767 .dst_temps = .{.mem},2767 .dst_temps = .{.mem},
2768 .each = .{ .limb = .{2768 .each = .{ .once = &.{
2769 .of = .src0x,2769 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2770 .body = &.{2770 .{ .@"0:", ._ps, .movu, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
2771 .{ ._, ._ps, .movu, .tmp1x, .limb(.src0x), ._, ._ },2771 .{ ._, ._ps, mir_tag, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
2772 .{ ._, ._ps, mir_tag, .tmp1x, .limb(.src1x), ._, ._ },2772 .{ ._, ._ps, .movu, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
2773 .{ ._, ._ps, .movu, .limb(.dst0x), .tmp1x, ._, ._ },2773 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
2774 },2774 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2775 } },2775 } },
2776 }, .{2776 }, .{
2777 .required_features = .{ .mmx, null },2777 .required_features = .{ .mmx, null },
...@@ -2779,7 +2779,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2779,7 +2779,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2779 .{ .src = .{ .to_mem, .to_mem } },2779 .{ .src = .{ .to_mem, .to_mem } },
2780 },2780 },
2781 .extra_temps = .{2781 .extra_temps = .{
2782 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2782 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2783 .{ .kind = .{ .rc = .mmx } },2783 .{ .kind = .{ .rc = .mmx } },
2784 .unused,2784 .unused,
2785 .unused,2785 .unused,
...@@ -2787,20 +2787,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2787,20 +2787,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2787 .unused,2787 .unused,
2788 },2788 },
2789 .dst_temps = .{.mem},2789 .dst_temps = .{.mem},
2790 .each = .{ .limb = .{2790 .each = .{ .once = &.{
2791 .of = .src0q,2791 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2792 .body = &.{2792 .{ .@"0:", ._q, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
2793 .{ ._, ._q, .mov, .tmp1q, .limb(.src0q), ._, ._ },2793 .{ ._, .p_, mir_tag, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
2794 .{ ._, .p_, mir_tag, .tmp1q, .limb(.src1q), ._, ._ },2794 .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
2795 .{ ._, ._q, .mov, .limb(.dst0q), .tmp1q, ._, ._ },2795 .{ ._, ._, .add, .tmp0p, .i(8), ._, ._ },
2796 },2796 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2797 } },2797 } },
2798 }, .{2798 }, .{
2799 .patterns = &.{2799 .patterns = &.{
2800 .{ .src = .{ .to_mem, .to_mem } },2800 .{ .src = .{ .to_mem, .to_mem } },
2801 },2801 },
2802 .extra_temps = .{2802 .extra_temps = .{
2803 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2803 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2804 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2804 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
2805 .unused,2805 .unused,
2806 .unused,2806 .unused,
...@@ -2808,13 +2808,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2808,13 +2808,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2808 .unused,2808 .unused,
2809 },2809 },
2810 .dst_temps = .{.mem},2810 .dst_temps = .{.mem},
2811 .each = .{ .limb = .{2811 .each = .{ .once = &.{
2812 .of = .src0p,2812 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
2813 .body = &.{2813 .{ .@"0:", ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
2814 .{ ._, ._, .mov, .tmp1p, .limb(.src0p), ._, ._ },2814 .{ ._, ._, mir_tag, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
2815 .{ ._, ._, mir_tag, .tmp1p, .limb(.src1p), ._, ._ },2815 .{ ._, ._, .mov, .memia(.dst0p, .tmp0, .add_size), .tmp1p, ._, ._ },
2816 .{ ._, ._, .mov, .limb(.dst0p), .tmp1p, ._, ._ },2816 .{ ._, ._, .add, .tmp0p, .a(.tmp1, .add_size), ._, ._ },
2817 },2817 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2818 } },2818 } },
2819 } },2819 } },
2820 }) catch |err2| switch (err2) {2820 }) catch |err2| switch (err2) {
...@@ -3306,7 +3306,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3306,7 +3306,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3306 },3306 },
3307 .clobbers = .{ .eflags = true },3307 .clobbers = .{ .eflags = true },
3308 .extra_temps = .{3308 .extra_temps = .{
3309 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3309 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3310 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3310 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3311 .unused,3311 .unused,
3312 .unused,3312 .unused,
...@@ -3341,32 +3341,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3341,32 +3341,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3341 .{ .src = .{ .to_mem, .to_mem } },3341 .{ .src = .{ .to_mem, .to_mem } },
3342 },3342 },
3343 .extra_temps = .{3343 .extra_temps = .{
3344 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3344 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3345 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3345 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3346 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },3346 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3347 .{ .kind = .{ .rc = .sse } },3347 .{ .kind = .{ .rc = .sse } },
3348 .unused,3348 .unused,
3349 .unused,3349 .unused,
3350 },3350 },
3351 .dst_temps = .{.mem},3351 .dst_temps = .{.mem},
3352 .each = .{ .limb_and_mask_limb = .{3352 .each = .{ .once = switch (cc) {
3353 .of = .src0y,3353 else => unreachable,
3354 .of_mask = .dst0b,3354 .e => &.{
3355 .body = switch (cc) {3355 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3356 else => unreachable,3356 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3357 .e => &.{3357 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3358 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },3358 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3359 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },3359 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3360 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },3360 .{ ._, ._, .mov, .memi(.dst0d, .tmp1), .tmp2d, ._, ._ },
3361 .{ ._, ._, .mov, .maskLimb(.dst0d), .tmp2d, ._, ._ },3361 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3362 },3362 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3363 .ne => &.{3363 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3364 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },3364 },
3365 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },3365 .ne => &.{
3366 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },3366 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3367 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },3367 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3368 .{ ._, ._, .mov, .maskLimb(.dst0d), .tmp2d, ._, ._ },3368 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3369 },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", ._, ._, ._ },
3370 },3376 },
3371 } },3377 } },
3372 }, .{3378 }, .{
...@@ -3376,34 +3382,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3376,34 +3382,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3376 .{ .src = .{ .to_mem, .to_mem } },3382 .{ .src = .{ .to_mem, .to_mem } },
3377 },3383 },
3378 .extra_temps = .{3384 .extra_temps = .{
3379 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3385 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3380 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3386 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3381 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },3387 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
3382 .{ .kind = .{ .rc = .sse } },3388 .{ .kind = .{ .rc = .sse } },
3383 .unused,3389 .unused,
3384 .unused,3390 .unused,
3385 },3391 },
3386 .dst_temps = .{.mem},3392 .dst_temps = .{.mem},
3387 .each = .{ .limb_and_mask_limb = .{3393 .each = .{ .once = switch (cc) {
3388 .of = .src0y,3394 else => unreachable,
3389 .of_mask = .dst0w,3395 .e => &.{
3390 .body = switch (cc) {3396 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3391 else => unreachable,3397 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3392 .e => &.{3398 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3393 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },3399 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3394 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },3400 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },
3395 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },3401 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3396 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },3402 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3397 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },3403 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3398 },3404 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3399 .ne => &.{3405 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3400 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },3406 },
3401 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },3407 .ne => &.{
3402 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },3408 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3403 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },3409 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3404 .{ ._, ._, .not, .tmp2w, ._, ._, ._ },3410 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3405 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },3411 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3406 },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", ._, ._, ._ },
3407 },3419 },
3408 } },3420 } },
3409 }, .{3421 }, .{
...@@ -3413,32 +3425,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3413,32 +3425,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3413 .{ .src = .{ .to_mem, .to_mem } },3425 .{ .src = .{ .to_mem, .to_mem } },
3414 },3426 },
3415 .extra_temps = .{3427 .extra_temps = .{
3416 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3428 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3417 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3429 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3418 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },3430 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3419 .{ .kind = .{ .rc = .sse } },3431 .{ .kind = .{ .rc = .sse } },
3420 .unused,3432 .unused,
3421 .unused,3433 .unused,
3422 },3434 },
3423 .dst_temps = .{.mem},3435 .dst_temps = .{.mem},
3424 .each = .{ .limb_and_mask_limb = .{3436 .each = .{ .once = switch (cc) {
3425 .of = .src0y,3437 else => unreachable,
3426 .of_mask = .dst0d,3438 .e => &.{
3427 .body = switch (cc) {3439 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3428 else => unreachable,3440 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3429 .e => &.{3441 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3430 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },3442 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
3431 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },3443 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },
3432 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },3444 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3433 .{ ._, ._, .mov, .maskLimb(.dst0b), .tmp2b, ._, ._ },3445 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3434 },3446 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
3435 .ne => &.{3447 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3436 .{ ._, .v_dqu, .mov, .tmp3y, .limb(.src0y), ._, ._ },3448 },
3437 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .limb(.src1y), ._ },3449 .ne => &.{
3438 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },3450 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3439 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },3451 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3440 .{ ._, ._, .mov, .maskLimb(.dst0b), .tmp2b, ._, ._ },3452 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3441 },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", ._, ._, ._ },
3442 },3460 },
3443 } },3461 } },
3444 }, .{3462 }, .{
...@@ -3448,34 +3466,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3448,34 +3466,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3448 .{ .src = .{ .to_mem, .to_mem } },3466 .{ .src = .{ .to_mem, .to_mem } },
3449 },3467 },
3450 .extra_temps = .{3468 .extra_temps = .{
3451 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3469 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3452 .{ .type = .usize, .kind = .{ .reg = .rcx } },3470 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3453 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3471 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3454 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3472 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3455 .{ .kind = .{ .rc = .sse } },3473 .{ .kind = .{ .rc = .sse } },
3456 .unused,3474 .unused,
3457 },3475 },
3458 .dst_temps = .{.mem},3476 .dst_temps = .{.mem},
3459 .each = .{ .limb_and_mask_limb = .{3477 .each = .{ .once = switch (cc) {
3460 .of = .src0y,3478 else => unreachable,
3461 .of_mask = .dst0q,3479 .e => &.{
3462 .body = switch (cc) {3480 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3463 else => unreachable,3481 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3464 .e => &.{3482 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3465 .{ ._, .v_dqu, .mov, .tmp4y, .limb(.src0y), ._, ._ },3483 .{ .@"0:", .v_dqu, .mov, .tmp4y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3466 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .limb(.src1y), ._ },3484 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._ },
3467 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },3485 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },
3468 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3486 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3469 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3487 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3470 },3488 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3471 .ne => &.{3489 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3472 .{ ._, .v_dqu, .mov, .tmp4y, .limb(.src0y), ._, ._ },3490 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3473 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .limb(.src1y), ._ },3491 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3474 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },3492 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3475 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },3493 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3476 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3494 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3477 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3495 .{ .@"1:", ._, .add, .tmp0p, .i(32), ._, ._ },
3478 },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, ._, ._ },
3479 },3527 },
3480 } },3528 } },
3481 }, .{3529 }, .{
...@@ -3485,32 +3533,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3485,32 +3533,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3485 .{ .src = .{ .to_mem, .to_mem } },3533 .{ .src = .{ .to_mem, .to_mem } },
3486 },3534 },
3487 .extra_temps = .{3535 .extra_temps = .{
3488 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3536 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3489 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3537 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3490 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },3538 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
3491 .{ .kind = .{ .rc = .sse } },3539 .{ .kind = .{ .rc = .sse } },
3492 .unused,3540 .unused,
3493 .unused,3541 .unused,
3494 },3542 },
3495 .dst_temps = .{.mem},3543 .dst_temps = .{.mem},
3496 .each = .{ .limb_and_mask_limb = .{3544 .each = .{ .once = switch (cc) {
3497 .of = .src0x,3545 else => unreachable,
3498 .of_mask = .dst0b,3546 .e => &.{
3499 .body = switch (cc) {3547 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3500 else => unreachable,3548 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3501 .e => &.{3549 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3502 .{ ._, .v_dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },3550 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
3503 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .limb(.src1x), ._ },3551 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3504 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },3552 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3505 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },3553 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3506 },3554 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3507 .ne => &.{3555 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3508 .{ ._, .v_dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },3556 },
3509 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .limb(.src1x), ._ },3557 .ne => &.{
3510 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },3558 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3511 .{ ._, ._, .not, .tmp2w, ._, ._, ._ },3559 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3512 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },3560 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3513 },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", ._, ._, ._ },
3514 },3568 },
3515 } },3569 } },
3516 }, .{3570 }, .{
...@@ -3520,34 +3574,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3520,34 +3574,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3520 .{ .src = .{ .to_mem, .to_mem } },3574 .{ .src = .{ .to_mem, .to_mem } },
3521 },3575 },
3522 .extra_temps = .{3576 .extra_temps = .{
3523 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3577 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3524 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3578 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3525 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },3579 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3526 .{ .kind = .{ .rc = .sse } },3580 .{ .kind = .{ .rc = .sse } },
3527 .unused,3581 .unused,
3528 .unused,3582 .unused,
3529 },3583 },
3530 .dst_temps = .{.mem},3584 .dst_temps = .{.mem},
3531 .each = .{ .limb_and_mask_limb = .{3585 .each = .{ .once = switch (cc) {
3532 .of = .src0x,3586 else => unreachable,
3533 .of_mask = .dst0w,3587 .e => &.{
3534 .body = switch (cc) {3588 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3535 else => unreachable,3589 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3536 .e => &.{3590 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3537 .{ ._, .v_dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },3591 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
3538 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .limb(.src1x), ._ },3592 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },
3539 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },3593 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3540 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },3594 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3541 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },3595 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3542 },3596 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3543 .ne => &.{3597 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3544 .{ ._, .v_dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },3598 },
3545 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .limb(.src1x), ._ },3599 .ne => &.{
3546 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },3600 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3547 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },3601 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3548 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },3602 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3549 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },3603 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
3550 },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", ._, ._, ._ },
3551 },3611 },
3552 } },3612 } },
3553 }, .{3613 }, .{
...@@ -3557,34 +3617,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3557,34 +3617,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3557 .{ .src = .{ .to_mem, .to_mem } },3617 .{ .src = .{ .to_mem, .to_mem } },
3558 },3618 },
3559 .extra_temps = .{3619 .extra_temps = .{
3560 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3620 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3561 .{ .type = .usize, .kind = .{ .reg = .rcx } },3621 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3562 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3622 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3563 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3623 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3564 .{ .kind = .{ .rc = .sse } },3624 .{ .kind = .{ .rc = .sse } },
3565 .unused,3625 .unused,
3566 },3626 },
3567 .dst_temps = .{.mem},3627 .dst_temps = .{.mem},
3568 .each = .{ .limb_and_mask_limb = .{3628 .each = .{ .once = switch (cc) {
3569 .of = .src0x,3629 else => unreachable,
3570 .of_mask = .dst0d,3630 .e => &.{
3571 .body = switch (cc) {3631 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3572 else => unreachable,3632 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3573 .e => &.{3633 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3574 .{ ._, .v_dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },3634 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3575 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .limb(.src1x), ._ },3635 .{ ._, .vp_d, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
3576 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },3636 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3577 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3637 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3578 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3638 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3579 },3639 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3580 .ne => &.{3640 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3581 .{ ._, .v_dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },3641 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3582 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .limb(.src1x), ._ },3642 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3583 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },3643 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3584 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },3644 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3585 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3645 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3586 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3646 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3587 },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, ._, ._ },
3588 },3678 },
3589 } },3679 } },
3590 }, .{3680 }, .{
...@@ -3594,34 +3684,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3594,34 +3684,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3594 .{ .src = .{ .to_mem, .to_mem } },3684 .{ .src = .{ .to_mem, .to_mem } },
3595 },3685 },
3596 .extra_temps = .{3686 .extra_temps = .{
3597 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3687 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3598 .{ .type = .usize, .kind = .{ .reg = .rcx } },3688 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3599 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3689 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3600 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3690 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3601 .{ .kind = .{ .rc = .sse } },3691 .{ .kind = .{ .rc = .sse } },
3602 .unused,3692 .unused,
3603 },3693 },
3604 .dst_temps = .{.mem},3694 .dst_temps = .{.mem},
3605 .each = .{ .limb_and_mask_limb = .{3695 .each = .{ .once = switch (cc) {
3606 .of = .src0x,3696 else => unreachable,
3607 .of_mask = .dst0q,3697 .e => &.{
3608 .body = switch (cc) {3698 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3609 else => unreachable,3699 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3610 .e => &.{3700 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3611 .{ ._, .v_dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },3701 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3612 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .limb(.src1x), ._ },3702 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
3613 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },3703 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3614 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3704 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3615 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3705 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3616 },3706 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3617 .ne => &.{3707 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3618 .{ ._, .v_dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },3708 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3619 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .limb(.src1x), ._ },3709 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3620 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },3710 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3621 .{ ._, ._, .xor, .tmp3b, .i(0b11), ._, ._ },3711 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3622 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3712 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3623 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3713 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3624 },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, ._, ._ },
3625 },3745 },
3626 } },3746 } },
3627 }, .{3747 }, .{
...@@ -3631,32 +3751,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3631,32 +3751,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3631 .{ .src = .{ .to_mem, .to_mem } },3751 .{ .src = .{ .to_mem, .to_mem } },
3632 },3752 },
3633 .extra_temps = .{3753 .extra_temps = .{
3634 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3754 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3635 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3755 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3636 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },3756 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
3637 .{ .kind = .{ .rc = .sse } },3757 .{ .kind = .{ .rc = .sse } },
3638 .unused,3758 .unused,
3639 .unused,3759 .unused,
3640 },3760 },
3641 .dst_temps = .{.mem},3761 .dst_temps = .{.mem},
3642 .each = .{ .limb_and_mask_limb = .{3762 .each = .{ .once = switch (cc) {
3643 .of = .src0x,3763 else => unreachable,
3644 .of_mask = .dst0b,3764 .e => &.{
3645 .body = switch (cc) {3765 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3646 else => unreachable,3766 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3647 .e => &.{3767 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3648 .{ ._, ._dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },3768 .{ ._, .p_b, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3649 .{ ._, .p_b, .cmpeq, .tmp3x, .limb(.src1x), ._, ._ },3769 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3650 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },3770 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
3651 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },3771 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3652 },3772 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3653 .ne => &.{3773 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3654 .{ ._, ._dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },3774 },
3655 .{ ._, .p_b, .cmpeq, .tmp3x, .limb(.src1x), ._, ._ },3775 .ne => &.{
3656 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },3776 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3657 .{ ._, ._, .not, .tmp2w, ._, ._, ._ },3777 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3658 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },3778 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3659 },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", ._, ._, ._ },
3660 },3786 },
3661 } },3787 } },
3662 }, .{3788 }, .{
...@@ -3666,34 +3792,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3666,34 +3792,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3666 .{ .src = .{ .to_mem, .to_mem } },3792 .{ .src = .{ .to_mem, .to_mem } },
3667 },3793 },
3668 .extra_temps = .{3794 .extra_temps = .{
3669 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3795 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3670 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3796 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3671 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },3797 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3672 .{ .kind = .{ .rc = .sse } },3798 .{ .kind = .{ .rc = .sse } },
3673 .unused,3799 .unused,
3674 .unused,3800 .unused,
3675 },3801 },
3676 .dst_temps = .{.mem},3802 .dst_temps = .{.mem},
3677 .each = .{ .limb_and_mask_limb = .{3803 .each = .{ .once = switch (cc) {
3678 .of = .src0x,3804 else => unreachable,
3679 .of_mask = .dst0w,3805 .e => &.{
3680 .body = switch (cc) {3806 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3681 else => unreachable,3807 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3682 .e => &.{3808 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3683 .{ ._, ._dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },3809 .{ ._, .p_w, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3684 .{ ._, .p_w, .cmpeq, .tmp3x, .limb(.src1x), ._, ._ },3810 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },
3685 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },3811 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
3686 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },3812 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3687 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },3813 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3688 },3814 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
3689 .ne => &.{3815 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3690 .{ ._, ._dqu, .mov, .tmp3x, .limb(.src0x), ._, ._ },3816 },
3691 .{ ._, .p_w, .cmpeq, .tmp3x, .limb(.src1x), ._, ._ },3817 .ne => &.{
3692 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },3818 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3693 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },3819 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3694 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },3820 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3695 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },3821 .{ ._, .p_w, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3696 },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", ._, ._, ._ },
3697 },3829 },
3698 } },3830 } },
3699 }, .{3831 }, .{
...@@ -3703,34 +3835,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3703,34 +3835,64 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3703 .{ .src = .{ .to_mem, .to_mem } },3835 .{ .src = .{ .to_mem, .to_mem } },
3704 },3836 },
3705 .extra_temps = .{3837 .extra_temps = .{
3706 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3838 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3707 .{ .type = .usize, .kind = .{ .reg = .rcx } },3839 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3708 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3840 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3709 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3841 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3710 .{ .kind = .{ .rc = .sse } },3842 .{ .kind = .{ .rc = .sse } },
3711 .unused,3843 .unused,
3712 },3844 },
3713 .dst_temps = .{.mem},3845 .dst_temps = .{.mem},
3714 .each = .{ .limb_and_mask_limb = .{3846 .each = .{ .once = switch (cc) {
3715 .of = .src0x,3847 else => unreachable,
3716 .of_mask = .dst0d,3848 .e => &.{
3717 .body = switch (cc) {3849 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3718 else => unreachable,3850 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3719 .e => &.{3851 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3720 .{ ._, ._dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },3852 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3721 .{ ._, .p_q, .cmpeq, .tmp4x, .limb(.src1x), ._, ._ },3853 .{ ._, .p_d, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3722 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },3854 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3723 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3855 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3724 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3856 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3725 },3857 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3726 .ne => &.{3858 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3727 .{ ._, ._dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },3859 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3728 .{ ._, .p_d, .cmpeq, .tmp4x, .limb(.src1x), ._, ._ },3860 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3729 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },3861 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3730 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },3862 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3731 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3863 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3732 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3864 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3733 },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, ._, ._ },
3734 },3896 },
3735 } },3897 } },
3736 }, .{3898 }, .{
...@@ -3740,143 +3902,249 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3740,143 +3902,249 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3740 .{ .src = .{ .to_mem, .to_mem } },3902 .{ .src = .{ .to_mem, .to_mem } },
3741 },3903 },
3742 .extra_temps = .{3904 .extra_temps = .{
3743 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3905 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3744 .{ .type = .usize, .kind = .{ .reg = .rcx } },3906 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3745 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3907 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3746 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3908 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3747 .{ .kind = .{ .rc = .sse } },3909 .{ .kind = .{ .rc = .sse } },
3748 .unused,3910 .unused,
3749 },3911 },
3750 .dst_temps = .{.mem},3912 .dst_temps = .{.mem},
3751 .each = .{ .limb_and_mask_limb = .{3913 .each = .{ .once = switch (cc) {
3752 .of = .src0x,3914 else => unreachable,
3753 .of_mask = .dst0q,3915 .e => &.{
3754 .body = switch (cc) {3916 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3755 else => unreachable,3917 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3756 .e => &.{3918 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3757 .{ ._, ._dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },3919 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3758 .{ ._, .p_q, .cmpeq, .tmp4x, .limb(.src1x), ._, ._ },3920 .{ ._, .p_q, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3759 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },3921 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
3760 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3922 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
3761 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3923 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
3762 },3924 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3763 .ne => &.{3925 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3764 .{ ._, ._dqu, .mov, .tmp4x, .limb(.src0x), ._, ._ },3926 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3765 .{ ._, .p_q, .cmpeq, .tmp4x, .limb(.src1x), ._, ._ },3927 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
3766 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },3928 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
3767 .{ ._, ._, .xor, .tmp3b, .i(0b11), ._, ._ },3929 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
3768 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },3930 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3769 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },3931 .{ .@"1:", ._, .add, .tmp0p, .i(16), ._, ._ },
3770 },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, ._, ._ },
3771 },3963 },
3772 } },3964 } },
3773 }, .{3965 }, .{
3774 .required_features = .{ .mmx, null },3966 .required_features = .{ .sse, .mmx },
3775 .src_constraints = .{ .{ .int = .byte }, .{ .int = .byte } },3967 .src_constraints = .{ .{ .int = .byte }, .{ .int = .byte } },
3776 .patterns = &.{3968 .patterns = &.{
3777 .{ .src = .{ .to_mem, .to_mem } },3969 .{ .src = .{ .to_mem, .to_mem } },
3778 },3970 },
3779 .extra_temps = .{3971 .extra_temps = .{
3780 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3972 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3781 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3973 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3782 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },3974 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3783 .{ .kind = .{ .rc = .mmx } },3975 .{ .kind = .{ .rc = .mmx } },
3784 .unused,3976 .unused,
3785 .unused,3977 .unused,
3786 },3978 },
3787 .dst_temps = .{.mem},3979 .dst_temps = .{.mem},
3788 .each = .{ .limb_and_mask_limb = .{3980 .each = .{ .once = switch (cc) {
3789 .of = .src0q,3981 else => unreachable,
3790 .of_mask = .dst0b,3982 .e => &.{
3791 .body = switch (cc) {3983 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3792 else => unreachable,3984 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3793 .e => &.{3985 .{ .@"0:", ._q, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
3794 .{ ._, ._dqu, .mov, .tmp3q, .limb(.src0q), ._, ._ },3986 .{ ._, .p_b, .cmpeq, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
3795 .{ ._, .p_b, .cmpeq, .tmp3q, .limb(.src1q), ._, ._ },3987 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
3796 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },3988 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
3797 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },3989 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
3798 },3990 .{ ._, ._, .add, .tmp0p, .i(8), ._, ._ },
3799 .ne => &.{3991 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3800 .{ ._, ._dqu, .mov, .tmp3q, .limb(.src0q), ._, ._ },3992 },
3801 .{ ._, .p_b, .cmpeq, .tmp3q, .limb(.src1q), ._, ._ },3993 .ne => &.{
3802 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },3994 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3803 .{ ._, ._, .not, .tmp2w, ._, ._, ._ },3995 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3804 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2w, ._, ._ },3996 .{ .@"0:", ._q, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
3805 },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", ._, ._, ._ },
3806 },4004 },
3807 } },4005 } },
3808 }, .{4006 }, .{
3809 .required_features = .{ .mmx, null },4007 .required_features = .{ .sse, .mmx },
3810 .src_constraints = .{ .{ .int = .word }, .{ .int = .word } },4008 .src_constraints = .{ .{ .int = .word }, .{ .int = .word } },
3811 .patterns = &.{4009 .patterns = &.{
3812 .{ .src = .{ .to_mem, .to_mem } },4010 .{ .src = .{ .to_mem, .to_mem } },
3813 },4011 },
3814 .extra_temps = .{4012 .extra_temps = .{
3815 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4013 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3816 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4014 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4015 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
4016 .{ .kind = .{ .rc = .mmx } },
3817 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },4017 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3818 .{ .kind = .{ .rc = .mmx } },4018 .{ .kind = .{ .rc = .mmx } },
3819 .unused,
3820 .unused,
3821 },4019 },
3822 .dst_temps = .{.mem},4020 .dst_temps = .{.mem},
3823 .each = .{ .limb_and_mask_limb = .{4021 .each = .{ .once = switch (cc) {
3824 .of = .src0q,4022 else => unreachable,
3825 .of_mask = .dst0w,4023 .e => &.{
3826 .body = switch (cc) {4024 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3827 else => unreachable,4025 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3828 .e => &.{4026 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3829 .{ ._, ._dqu, .mov, .tmp3q, .limb(.src0q), ._, ._ },4027 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
3830 .{ ._, .p_w, .cmpeq, .tmp3q, .limb(.src1q), ._, ._ },4028 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
3831 .{ ._, .p_b, .ackssw, .tmp3q, .tmp3q, ._, ._ },4029 .{ ._, .p_w, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
3832 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },4030 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
3833 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },4031 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
3834 },4032 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
3835 .ne => &.{4033 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
3836 .{ ._, ._dqu, .mov, .tmp3q, .limb(.src0q), ._, ._ },4034 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
3837 .{ ._, .p_w, .cmpeq, .tmp3q, .limb(.src1q), ._, ._ },4035 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3838 .{ ._, .p_b, .ackssw, .tmp3q, .tmp3q, ._, ._ },4036 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3839 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },4037 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
3840 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },4038 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
3841 .{ ._, ._, .mov, .maskLimb(.dst0w), .tmp2b, ._, ._ },4039 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
3842 },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, ._, ._ },
3843 },4075 },
3844 } },4076 } },
3845 }, .{4077 }, .{
3846 .required_features = .{ .mmx, null },4078 .required_features = .{ .sse, .mmx },
3847 .src_constraints = .{ .{ .int = .dword }, .{ .int = .dword } },4079 .src_constraints = .{ .{ .int = .dword }, .{ .int = .dword } },
3848 .patterns = &.{4080 .patterns = &.{
3849 .{ .src = .{ .to_mem, .to_mem } },4081 .{ .src = .{ .to_mem, .to_mem } },
3850 },4082 },
3851 .extra_temps = .{4083 .extra_temps = .{
3852 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4084 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3853 .{ .type = .usize, .kind = .{ .reg = .rcx } },4085 .{ .type = .u32, .kind = .{ .reg = .rcx } },
3854 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4086 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3855 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4087 .{ .kind = .{ .rc = .mmx } },
4088 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3856 .{ .kind = .{ .rc = .mmx } },4089 .{ .kind = .{ .rc = .mmx } },
3857 .unused,
3858 },4090 },
3859 .dst_temps = .{.mem},4091 .dst_temps = .{.mem},
3860 .each = .{ .limb_and_mask_limb = .{4092 .each = .{ .once = switch (cc) {
3861 .of = .src0q,4093 else => unreachable,
3862 .of_mask = .dst0d,4094 .e => &.{
3863 .body = switch (cc) {4095 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
3864 else => unreachable,4096 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
3865 .e => &.{4097 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
3866 .{ ._, ._dqu, .mov, .tmp4q, .limb(.src0q), ._, ._ },4098 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
3867 .{ ._, .p_q, .cmpeq, .tmp4q, .limb(.src1q), ._, ._ },4099 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
3868 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4q, ._, ._ },4100 .{ ._, .p_d, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
3869 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },4101 .{ ._, .p_w, .ackssd, .tmp5q, .tmp3q, ._, ._ },
3870 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },4102 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
3871 },4103 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
3872 .ne => &.{4104 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
3873 .{ ._, ._dqu, .mov, .tmp4q, .limb(.src0q), ._, ._ },4105 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
3874 .{ ._, .p_q, .cmpeq, .tmp4q, .limb(.src1q), ._, ._ },4106 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
3875 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4q, ._, ._ },4107 .{ ._, ._, .@"test", .tmp1d, .i(0b111), ._, ._ },
3876 .{ ._, ._, .xor, .tmp3b, .i(0b1111), ._, ._ },4108 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
3877 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },4109 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
3878 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },4110 .{ ._, ._r, .sh, .tmp4d, .i(3), ._, ._ },
3879 },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, ._, ._ },
3880 },4148 },
3881 } },4149 } },
3882 }, .{4150 }, .{
...@@ -3887,7 +4155,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3887,7 +4155,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3887 .{ .src = .{ .to_mem, .to_mem } },4155 .{ .src = .{ .to_mem, .to_mem } },
3888 },4156 },
3889 .extra_temps = .{4157 .extra_temps = .{
3890 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4158 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3891 .{ .type = .u8, .kind = .{ .reg = .cl } },4159 .{ .type = .u8, .kind = .{ .reg = .cl } },
3892 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },4160 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3893 .unused,4161 .unused,
...@@ -3915,7 +4183,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3915,7 +4183,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3915 .{ .src = .{ .to_mem, .to_mem } },4183 .{ .src = .{ .to_mem, .to_mem } },
3916 },4184 },
3917 .extra_temps = .{4185 .extra_temps = .{
3918 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4186 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3919 .{ .type = .u8, .kind = .{ .reg = .cl } },4187 .{ .type = .u8, .kind = .{ .reg = .cl } },
3920 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },4188 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3921 .unused,4189 .unused,
...@@ -3944,7 +4212,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3944,7 +4212,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3944 .{ .src = .{ .to_mem, .to_mem } },4212 .{ .src = .{ .to_mem, .to_mem } },
3945 },4213 },
3946 .extra_temps = .{4214 .extra_temps = .{
3947 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4215 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3948 .{ .type = .u8, .kind = .{ .reg = .cl } },4216 .{ .type = .u8, .kind = .{ .reg = .cl } },
3949 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },4217 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
3950 .unused,4218 .unused,
...@@ -3972,7 +4240,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3972,7 +4240,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3972 .{ .src = .{ .to_mem, .to_mem } },4240 .{ .src = .{ .to_mem, .to_mem } },
3973 },4241 },
3974 .extra_temps = .{4242 .extra_temps = .{
3975 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4243 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3976 .{ .type = .u8, .kind = .{ .reg = .cl } },4244 .{ .type = .u8, .kind = .{ .reg = .cl } },
3977 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },4245 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
3978 .unused,4246 .unused,
...@@ -4001,7 +4269,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4001,7 +4269,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4001 .{ .src = .{ .to_mem, .to_mem } },4269 .{ .src = .{ .to_mem, .to_mem } },
4002 },4270 },
4003 .extra_temps = .{4271 .extra_temps = .{
4004 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4272 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4005 .{ .type = .u8, .kind = .{ .reg = .cl } },4273 .{ .type = .u8, .kind = .{ .reg = .cl } },
4006 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4274 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4007 .unused,4275 .unused,
...@@ -4029,7 +4297,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4029,7 +4297,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4029 .{ .src = .{ .to_mem, .to_mem } },4297 .{ .src = .{ .to_mem, .to_mem } },
4030 },4298 },
4031 .extra_temps = .{4299 .extra_temps = .{
4032 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4300 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4033 .{ .type = .u8, .kind = .{ .reg = .cl } },4301 .{ .type = .u8, .kind = .{ .reg = .cl } },
4034 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4302 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4035 .unused,4303 .unused,
...@@ -4058,7 +4326,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4058,7 +4326,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4058 .{ .src = .{ .to_mem, .to_mem } },4326 .{ .src = .{ .to_mem, .to_mem } },
4059 },4327 },
4060 .extra_temps = .{4328 .extra_temps = .{
4061 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4329 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4062 .{ .type = .u8, .kind = .{ .reg = .cl } },4330 .{ .type = .u8, .kind = .{ .reg = .cl } },
4063 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4331 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4064 .unused,4332 .unused,
...@@ -4087,7 +4355,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4087,7 +4355,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4087 .{ .src = .{ .to_mem, .to_mem } },4355 .{ .src = .{ .to_mem, .to_mem } },
4088 },4356 },
4089 .extra_temps = .{4357 .extra_temps = .{
4090 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4358 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4091 .{ .type = .u8, .kind = .{ .reg = .cl } },4359 .{ .type = .u8, .kind = .{ .reg = .cl } },
4092 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4360 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4093 .unused,4361 .unused,
...@@ -4185,7 +4453,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4185,7 +4453,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4185 .{ .src = .{ .to_mem, .to_mem } },4453 .{ .src = .{ .to_mem, .to_mem } },
4186 },4454 },
4187 .extra_temps = .{4455 .extra_temps = .{
4188 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4456 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4189 .{ .type = .u8, .kind = .{ .reg = .cl } },4457 .{ .type = .u8, .kind = .{ .reg = .cl } },
4190 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4458 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4191 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },4459 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
...@@ -4214,7 +4482,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4214,7 +4482,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4214 .{ .src = .{ .to_mem, .to_mem } },4482 .{ .src = .{ .to_mem, .to_mem } },
4215 },4483 },
4216 .extra_temps = .{4484 .extra_temps = .{
4217 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4485 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4218 .{ .type = .u8, .kind = .{ .reg = .cl } },4486 .{ .type = .u8, .kind = .{ .reg = .cl } },
4219 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4487 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4220 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },4488 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
...@@ -4244,7 +4512,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4244,7 +4512,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4244 .{ .src = .{ .to_mem, .to_mem } },4512 .{ .src = .{ .to_mem, .to_mem } },
4245 },4513 },
4246 .extra_temps = .{4514 .extra_temps = .{
4247 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4515 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4248 .{ .type = .u8, .kind = .{ .reg = .cl } },4516 .{ .type = .u8, .kind = .{ .reg = .cl } },
4249 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4517 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4250 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },4518 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
...@@ -4273,7 +4541,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4273,7 +4541,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4273 .{ .src = .{ .to_mem, .to_mem } },4541 .{ .src = .{ .to_mem, .to_mem } },
4274 },4542 },
4275 .extra_temps = .{4543 .extra_temps = .{
4276 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4544 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4277 .{ .type = .u8, .kind = .{ .reg = .cl } },4545 .{ .type = .u8, .kind = .{ .reg = .cl } },
4278 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4546 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4279 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },4547 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
...@@ -4303,7 +4571,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4303,7 +4571,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4303 .{ .src = .{ .to_mem, .to_mem } },4571 .{ .src = .{ .to_mem, .to_mem } },
4304 },4572 },
4305 .extra_temps = .{4573 .extra_temps = .{
4306 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4574 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4307 .{ .type = .u8, .kind = .{ .reg = .cl } },4575 .{ .type = .u8, .kind = .{ .reg = .cl } },
4308 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4576 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4309 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4577 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
...@@ -4332,7 +4600,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4332,7 +4600,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4332 .{ .src = .{ .to_mem, .to_mem } },4600 .{ .src = .{ .to_mem, .to_mem } },
4333 },4601 },
4334 .extra_temps = .{4602 .extra_temps = .{
4335 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4603 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4336 .{ .type = .u8, .kind = .{ .reg = .cl } },4604 .{ .type = .u8, .kind = .{ .reg = .cl } },
4337 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4605 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4338 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4606 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
...@@ -4362,7 +4630,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4362,7 +4630,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4362 .{ .src = .{ .to_mem, .to_mem } },4630 .{ .src = .{ .to_mem, .to_mem } },
4363 },4631 },
4364 .extra_temps = .{4632 .extra_temps = .{
4365 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4633 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4366 .{ .type = .u8, .kind = .{ .reg = .cl } },4634 .{ .type = .u8, .kind = .{ .reg = .cl } },
4367 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4635 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4368 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4636 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
...@@ -4392,7 +4660,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4392,7 +4660,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4392 .{ .src = .{ .to_mem, .to_mem } },4660 .{ .src = .{ .to_mem, .to_mem } },
4393 },4661 },
4394 .extra_temps = .{4662 .extra_temps = .{
4395 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4663 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4396 .{ .type = .u8, .kind = .{ .reg = .cl } },4664 .{ .type = .u8, .kind = .{ .reg = .cl } },
4397 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4665 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4398 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4666 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
...@@ -4493,7 +4761,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4493,7 +4761,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4493 .{ .src = .{ .to_mem, .to_mem } },4761 .{ .src = .{ .to_mem, .to_mem } },
4494 },4762 },
4495 .extra_temps = .{4763 .extra_temps = .{
4496 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4764 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4497 .{ .type = .u8, .kind = .{ .reg = .cl } },4765 .{ .type = .u8, .kind = .{ .reg = .cl } },
4498 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4766 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4499 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },4767 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
...@@ -4523,7 +4791,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4523,7 +4791,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4523 .{ .src = .{ .to_mem, .to_mem } },4791 .{ .src = .{ .to_mem, .to_mem } },
4524 },4792 },
4525 .extra_temps = .{4793 .extra_temps = .{
4526 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4794 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4527 .{ .type = .u8, .kind = .{ .reg = .cl } },4795 .{ .type = .u8, .kind = .{ .reg = .cl } },
4528 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4796 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4529 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },4797 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
...@@ -4553,7 +4821,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4553,7 +4821,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4553 .{ .src = .{ .to_mem, .to_mem } },4821 .{ .src = .{ .to_mem, .to_mem } },
4554 },4822 },
4555 .extra_temps = .{4823 .extra_temps = .{
4556 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4824 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4557 .{ .type = .u8, .kind = .{ .reg = .cl } },4825 .{ .type = .u8, .kind = .{ .reg = .cl } },
4558 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4826 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4559 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },4827 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
...@@ -4582,7 +4850,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4582,7 +4850,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4582 .{ .src = .{ .to_mem, .to_mem } },4850 .{ .src = .{ .to_mem, .to_mem } },
4583 },4851 },
4584 .extra_temps = .{4852 .extra_temps = .{
4585 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4853 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4586 .{ .type = .u8, .kind = .{ .reg = .cl } },4854 .{ .type = .u8, .kind = .{ .reg = .cl } },
4587 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4855 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4588 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },4856 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
...@@ -4612,7 +4880,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4612,7 +4880,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4612 .{ .src = .{ .to_mem, .to_mem } },4880 .{ .src = .{ .to_mem, .to_mem } },
4613 },4881 },
4614 .extra_temps = .{4882 .extra_temps = .{
4615 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4883 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4616 .{ .type = .u8, .kind = .{ .reg = .cl } },4884 .{ .type = .u8, .kind = .{ .reg = .cl } },
4617 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4885 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4618 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4886 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
...@@ -4642,7 +4910,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4642,7 +4910,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4642 .{ .src = .{ .to_mem, .to_mem } },4910 .{ .src = .{ .to_mem, .to_mem } },
4643 },4911 },
4644 .extra_temps = .{4912 .extra_temps = .{
4645 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4913 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4646 .{ .type = .u8, .kind = .{ .reg = .cl } },4914 .{ .type = .u8, .kind = .{ .reg = .cl } },
4647 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4915 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4648 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4916 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
...@@ -4672,7 +4940,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4672,7 +4940,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4672 .{ .src = .{ .to_mem, .to_mem } },4940 .{ .src = .{ .to_mem, .to_mem } },
4673 },4941 },
4674 .extra_temps = .{4942 .extra_temps = .{
4675 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4943 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4676 .{ .type = .u8, .kind = .{ .reg = .cl } },4944 .{ .type = .u8, .kind = .{ .reg = .cl } },
4677 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4945 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4678 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4946 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
...@@ -4702,7 +4970,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4702,7 +4970,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4702 .{ .src = .{ .to_mem, .to_mem } },4970 .{ .src = .{ .to_mem, .to_mem } },
4703 },4971 },
4704 .extra_temps = .{4972 .extra_temps = .{
4705 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4973 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4706 .{ .type = .u8, .kind = .{ .reg = .cl } },4974 .{ .type = .u8, .kind = .{ .reg = .cl } },
4707 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4975 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4708 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4976 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
...@@ -4803,7 +5071,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4803,7 +5071,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4803 .{ .src = .{ .to_mem, .to_mem } },5071 .{ .src = .{ .to_mem, .to_mem } },
4804 },5072 },
4805 .extra_temps = .{5073 .extra_temps = .{
4806 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5074 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4807 .{ .type = .u32, .kind = .{ .reg = .ecx } },5075 .{ .type = .u32, .kind = .{ .reg = .ecx } },
4808 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5076 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4809 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5077 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -4822,15 +5090,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4822,15 +5090,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4822 .{ ._, ._l, .sh, .tmp3p, .tmp1b, ._, ._ },5090 .{ ._, ._l, .sh, .tmp3p, .tmp1b, ._, ._ },
4823 .{ ._, ._, .@"or", .tmp2p, .tmp3p, ._, ._ },5091 .{ ._, ._, .@"or", .tmp2p, .tmp3p, ._, ._ },
4824 .{ ._, ._, .add, .tmp1d, .i(1), ._, ._ },5092 .{ ._, ._, .add, .tmp1d, .i(1), ._, ._ },
4825 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .tmp2, .add_bit_size), ._, ._ },5093 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .none, .add_ptr_bit_size), ._, ._ },
4826 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },5094 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
4827 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },5095 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
4828 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },5096 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
4829 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_access_size), .tmp2p, ._, ._ },5097 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_ptr_size), .tmp2p, ._, ._ },
4830 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },5098 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
4831 .{ .@"1:", ._, .add, .tmp0p, .i(1), ._, ._ },5099 .{ .@"1:", ._, .add, .tmp0p, .i(1), ._, ._ },
4832 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5100 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4833 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .tmp2, .add_bit_size), ._, ._ },5101 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .none, .add_ptr_bit_size), ._, ._ },
4834 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },5102 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
4835 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },5103 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
4836 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },5104 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
...@@ -4842,7 +5110,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4842,7 +5110,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4842 .{ .src = .{ .to_mem, .to_mem } },5110 .{ .src = .{ .to_mem, .to_mem } },
4843 },5111 },
4844 .extra_temps = .{5112 .extra_temps = .{
4845 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5113 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4846 .{ .type = .u32, .kind = .{ .reg = .ecx } },5114 .{ .type = .u32, .kind = .{ .reg = .ecx } },
4847 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5115 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4848 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5116 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
...@@ -4861,15 +5129,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4861,15 +5129,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4861 .{ ._, ._l, .sh, .tmp3p, .tmp1b, ._, ._ },5129 .{ ._, ._l, .sh, .tmp3p, .tmp1b, ._, ._ },
4862 .{ ._, ._, .@"or", .tmp2p, .tmp3p, ._, ._ },5130 .{ ._, ._, .@"or", .tmp2p, .tmp3p, ._, ._ },
4863 .{ ._, ._, .inc, .tmp1d, ._, ._, ._ },5131 .{ ._, ._, .inc, .tmp1d, ._, ._, ._ },
4864 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .tmp2, .add_bit_size), ._, ._ },5132 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .none, .add_ptr_bit_size), ._, ._ },
4865 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },5133 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
4866 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },5134 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
4867 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },5135 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
4868 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_access_size), .tmp2p, ._, ._ },5136 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_ptr_size), .tmp2p, ._, ._ },
4869 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },5137 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
4870 .{ .@"1:", ._, .inc, .tmp0p, ._, ._, ._ },5138 .{ .@"1:", ._, .inc, .tmp0p, ._, ._, ._ },
4871 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },5139 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
4872 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .tmp2, .add_bit_size), ._, ._ },5140 .{ ._, ._, .@"test", .tmp1d, .ia(-1, .none, .add_ptr_bit_size), ._, ._ },
4873 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },5141 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
4874 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },5142 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
4875 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },5143 .{ ._, ._r, .sh, .tmp3d, .i(3), ._, ._ },
...@@ -5040,8 +5308,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5040,8 +5308,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5040 .{ .src = .{ .to_mem, .to_mem } },5308 .{ .src = .{ .to_mem, .to_mem } },
5041 },5309 },
5042 .extra_temps = .{5310 .extra_temps = .{
5311 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5043 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5312 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5044 .{ .type = .bool, .kind = .{ .rc = .general_purpose } },
5045 .unused,5313 .unused,
5046 .unused,5314 .unused,
5047 .unused,5315 .unused,
...@@ -5049,18 +5317,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5049,18 +5317,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5049 },5317 },
5050 .clobbers = .{ .eflags = true },5318 .clobbers = .{ .eflags = true },
5051 .dst_temps = .{.{ .rc = .general_purpose }},5319 .dst_temps = .{.{ .rc = .general_purpose }},
5052 .each = .{ .limb = .{5320 .each = .{ .once = &.{
5053 .of = .src0p,5321 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5054 .header = &.{5322 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
5055 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },5323 .{ .@"0:", ._r, .sh, .tmp1b, .i(1), ._, ._ },
5056 },5324 .{ ._, ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
5057 .body = &.{5325 .{ ._, ._, .sbb, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
5058 .{ ._, ._, .mov, .tmp0p, .limb(.src0p), ._, ._ },5326 .{ ._, ._c, .set, .tmp1b, ._, ._, ._ },
5059 .{ ._, ._r, .sh, .tmp1b, .i(1), ._, ._ },5327 .{ ._, .fromCondition(cc), .set, .dst0b, ._, ._, ._ },
5060 .{ ._, ._, .sbb, .tmp0p, .limb(.src1p), ._, ._ },5328 .{ ._, ._, .add, .tmp0p, .a(.tmp1, .add_size), ._, ._ },
5061 .{ ._, ._c, .set, .tmp1b, ._, ._, ._ },5329 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5062 .{ ._, .fromCondition(cc), .set, .dst0b, ._, ._, ._ },
5063 },
5064 } },5330 } },
5065 } },5331 } },
5066 }) catch |err| switch (err) {5332 }) catch |err| switch (err) {
...@@ -5296,35 +5562,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5296,35 +5562,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5296 .{ .src = .{ .to_mem, .to_mem } },5562 .{ .src = .{ .to_mem, .to_mem } },
5297 },5563 },
5298 .extra_temps = .{5564 .extra_temps = .{
5299 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5565 .{ .type = .isize, .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 } },
5328 .{ .kind = .{ .rc = .sse } },5566 .{ .kind = .{ .rc = .sse } },
5329 .{ .kind = .{ .rc = .sse } },5567 .{ .kind = .{ .rc = .sse } },
5330 .unused,5568 .unused,
...@@ -5332,19 +5570,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5332,19 +5570,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5332 .unused,5570 .unused,
5333 },5571 },
5334 .dst_temps = .{.{ .cc = cc }},5572 .dst_temps = .{.{ .cc = cc }},
5335 .each = .{ .limb = .{5573 .each = .{ .once = &.{
5336 .of = .src0y,5574 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5337 .header = &.{5575 .{ ._, .vp_, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },
5338 .{ ._, .v_pd, .xor, .tmp2y, .tmp2y, .tmp2y, ._ },5576 .{ .@"0:", .v_dqu, .mov, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5339 },5577 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._ },
5340 .body = &.{5578 .{ ._, .vp_, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
5341 .{ ._, .v_pd, .movu, .tmp1y, .limb(.src0y), ._, ._ },5579 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
5342 .{ ._, .v_pd, .xor, .tmp1y, .tmp1y, .limb(.src1y), ._ },5580 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5343 .{ ._, .v_pd, .@"or", .tmp2y, .tmp2y, .tmp1y, ._ },5581 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
5344 },
5345 .trailer = &.{
5346 .{ ._, .vp_, .@"test", .tmp2y, .tmp2y, ._, ._ },
5347 },
5348 } },5582 } },
5349 }, .{5583 }, .{
5350 .required_features = .{ .avx, null },5584 .required_features = .{ .avx, null },
...@@ -5352,7 +5586,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5352,7 +5586,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5352 .{ .src = .{ .to_mem, .to_mem } },5586 .{ .src = .{ .to_mem, .to_mem } },
5353 },5587 },
5354 .extra_temps = .{5588 .extra_temps = .{
5355 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5589 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5356 .{ .kind = .{ .rc = .sse } },5590 .{ .kind = .{ .rc = .sse } },
5357 .{ .kind = .{ .rc = .sse } },5591 .{ .kind = .{ .rc = .sse } },
5358 .unused,5592 .unused,
...@@ -5360,19 +5594,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5360,19 +5594,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5360 .unused,5594 .unused,
5361 },5595 },
5362 .dst_temps = .{.{ .cc = cc }},5596 .dst_temps = .{.{ .cc = cc }},
5363 .each = .{ .limb = .{5597 .each = .{ .once = &.{
5364 .of = .src0x,5598 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5365 .header = &.{5599 .{ ._, .v_pd, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },
5366 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },5600 .{ .@"0:", .v_pd, .movu, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5367 },5601 .{ ._, .v_pd, .xor, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._ },
5368 .body = &.{5602 .{ ._, .v_pd, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
5369 .{ ._, .v_dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },5603 .{ ._, ._, .add, .tmp0p, .i(32), ._, ._ },
5370 .{ ._, .vp_, .xor, .tmp1x, .tmp1x, .limb(.src1x), ._ },5604 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5371 .{ ._, .vp_, .@"or", .tmp2x, .tmp2x, .tmp1x, ._ },5605 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
5372 },
5373 .trailer = &.{
5374 .{ ._, .vp_, .@"test", .tmp2x, .tmp2x, ._, ._ },
5375 },
5376 } },5606 } },
5377 }, .{5607 }, .{
5378 .required_features = .{ .avx, null },5608 .required_features = .{ .avx, null },
...@@ -5380,7 +5610,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5380,7 +5610,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5380 .{ .src = .{ .to_mem, .to_mem } },5610 .{ .src = .{ .to_mem, .to_mem } },
5381 },5611 },
5382 .extra_temps = .{5612 .extra_temps = .{
5383 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5613 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5384 .{ .kind = .{ .rc = .sse } },5614 .{ .kind = .{ .rc = .sse } },
5385 .{ .kind = .{ .rc = .sse } },5615 .{ .kind = .{ .rc = .sse } },
5386 .unused,5616 .unused,
...@@ -5388,19 +5618,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5388,19 +5618,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5388 .unused,5618 .unused,
5389 },5619 },
5390 .dst_temps = .{.{ .cc = cc }},5620 .dst_temps = .{.{ .cc = cc }},
5391 .each = .{ .limb = .{5621 .each = .{ .once = &.{
5392 .of = .src0x,5622 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5393 .header = &.{5623 .{ ._, .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ },
5394 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },5624 .{ .@"0:", .v_dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5395 },5625 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._ },
5396 .body = &.{5626 .{ ._, .vp_, .@"or", .tmp1x, .tmp1x, .tmp2x, ._ },
5397 .{ ._, .v_dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },5627 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
5398 .{ ._, .vp_, .xor, .tmp1x, .tmp1x, .limb(.src1x), ._ },5628 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5399 .{ ._, .vp_, .@"or", .tmp2x, .tmp2x, .tmp1x, ._ },5629 .{ ._, .vp_, .@"test", .tmp1x, .tmp1x, ._, ._ },
5400 },
5401 .trailer = &.{
5402 .{ ._, .vp_, .@"test", .tmp2x, .tmp2x, ._, ._ },
5403 },
5404 } },5630 } },
5405 }, .{5631 }, .{
5406 .required_features = .{ .sse4_1, null },5632 .required_features = .{ .sse4_1, null },
...@@ -5408,7 +5634,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5408,7 +5634,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5408 .{ .src = .{ .to_mem, .to_mem } },5634 .{ .src = .{ .to_mem, .to_mem } },
5409 },5635 },
5410 .extra_temps = .{5636 .extra_temps = .{
5411 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5637 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5412 .{ .kind = .{ .rc = .sse } },5638 .{ .kind = .{ .rc = .sse } },
5413 .{ .kind = .{ .rc = .sse } },5639 .{ .kind = .{ .rc = .sse } },
5414 .unused,5640 .unused,
...@@ -5416,19 +5642,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5416,19 +5642,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5416 .unused,5642 .unused,
5417 },5643 },
5418 .dst_temps = .{.{ .cc = cc }},5644 .dst_temps = .{.{ .cc = cc }},
5419 .each = .{ .limb = .{5645 .each = .{ .once = &.{
5420 .of = .src0x,5646 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5421 .header = &.{5647 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
5422 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },5648 .{ .@"0:", ._dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5423 },5649 .{ ._, .p_, .xor, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5424 .body = &.{5650 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
5425 .{ ._, ._dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },5651 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
5426 .{ ._, .p_, .xor, .tmp1x, .limb(.src1x), ._, ._ },5652 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5427 .{ ._, .p_, .@"or", .tmp2x, .tmp1x, ._, ._ },5653 .{ ._, .p_, .@"test", .tmp1x, .tmp1x, ._, ._ },
5428 },
5429 .trailer = &.{
5430 .{ ._, .p_, .@"test", .tmp2x, .tmp2x, ._, ._ },
5431 },
5432 } },5654 } },
5433 }, .{5655 }, .{
5434 .required_features = .{ .sse2, null },5656 .required_features = .{ .sse2, null },
...@@ -5436,7 +5658,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5436,7 +5658,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5436 .{ .src = .{ .to_mem, .to_mem } },5658 .{ .src = .{ .to_mem, .to_mem } },
5437 },5659 },
5438 .extra_temps = .{5660 .extra_temps = .{
5439 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5661 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5440 .{ .kind = .{ .rc = .sse } },5662 .{ .kind = .{ .rc = .sse } },
5441 .{ .kind = .{ .rc = .sse } },5663 .{ .kind = .{ .rc = .sse } },
5442 .unused,5664 .unused,
...@@ -5444,22 +5666,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5444,22 +5666,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5444 .unused,5666 .unused,
5445 },5667 },
5446 .dst_temps = .{.{ .cc = cc }},5668 .dst_temps = .{.{ .cc = cc }},
5447 .each = .{ .limb = .{5669 .each = .{ .once = &.{
5448 .of = .src0x,5670 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5449 .header = &.{5671 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
5450 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },5672 .{ .@"0:", ._dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5451 },5673 .{ ._, .p_, .xor, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5452 .body = &.{5674 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
5453 .{ ._, ._dqu, .mov, .tmp1x, .limb(.src0x), ._, ._ },5675 .{ ._, ._, .add, .tmp0p, .i(16), ._, ._ },
5454 .{ ._, .p_, .xor, .tmp1x, .limb(.src1x), ._, ._ },5676 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5455 .{ ._, .p_, .@"or", .tmp2x, .tmp1x, ._, ._ },5677 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
5456 },5678 .{ ._, .p_b, .cmpeq, .tmp1x, .tmp2x, ._, ._ },
5457 .trailer = &.{5679 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1x, ._, ._ },
5458 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },5680 .{ ._, ._, .cmp, .tmp0d, .i(0xffff), ._, ._ },
5459 .{ ._, .p_b, .cmpeq, .tmp2x, .tmp1x, ._, ._ },
5460 .{ ._, .p_b, .movmsk, .tmp0d, .tmp2x, ._, ._ },
5461 .{ ._, ._, .xor, .tmp0d, .i(0xffff), ._, ._ },
5462 },
5463 } },5681 } },
5464 }, .{5682 }, .{
5465 .required_features = .{ .sse, .mmx },5683 .required_features = .{ .sse, .mmx },
...@@ -5467,7 +5685,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5467,7 +5685,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5467 .{ .src = .{ .to_mem, .to_mem } },5685 .{ .src = .{ .to_mem, .to_mem } },
5468 },5686 },
5469 .extra_temps = .{5687 .extra_temps = .{
5470 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5688 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5471 .{ .kind = .{ .rc = .mmx } },5689 .{ .kind = .{ .rc = .mmx } },
5472 .{ .kind = .{ .rc = .mmx } },5690 .{ .kind = .{ .rc = .mmx } },
5473 .unused,5691 .unused,
...@@ -5475,29 +5693,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5475,29 +5693,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5475 .unused,5693 .unused,
5476 },5694 },
5477 .dst_temps = .{.{ .cc = cc }},5695 .dst_temps = .{.{ .cc = cc }},
5478 .each = .{ .limb = .{5696 .each = .{ .once = &.{
5479 .of = .src0q,5697 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5480 .header = &.{5698 .{ ._, .p_, .xor, .tmp1q, .tmp1q, ._, ._ },
5481 .{ ._, .p_, .xor, .tmp2q, .tmp2q, ._, ._ },5699 .{ .@"0:", ._q, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
5482 },5700 .{ ._, .p_, .xor, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5483 .body = &.{5701 .{ ._, .p_, .@"or", .tmp1q, .tmp2q, ._, ._ },
5484 .{ ._, ._q, .mov, .tmp1q, .limb(.src0q), ._, ._ },5702 .{ ._, ._, .add, .tmp0p, .i(8), ._, ._ },
5485 .{ ._, .p_, .xor, .tmp1q, .limb(.src1q), ._, ._ },5703 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5486 .{ ._, .p_, .@"or", .tmp2q, .tmp1q, ._, ._ },5704 .{ ._, .p_, .xor, .tmp2q, .tmp2q, ._, ._ },
5487 },5705 .{ ._, .p_b, .cmpeq, .tmp1q, .tmp2q, ._, ._ },
5488 .trailer = &.{5706 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1q, ._, ._ },
5489 .{ ._, .p_, .xor, .tmp1q, .tmp1q, ._, ._ },5707 .{ ._, ._, .cmp, .tmp0d, .i(0xff), ._, ._ },
5490 .{ ._, .p_b, .cmpeq, .tmp2q, .tmp1q, ._, ._ },
5491 .{ ._, .p_b, .movmsk, .tmp0d, .tmp2q, ._, ._ },
5492 .{ ._, ._, .xor, .tmp0d, .i(0xff), ._, ._ },
5493 },
5494 } },5708 } },
5495 }, .{5709 }, .{
5496 .patterns = &.{5710 .patterns = &.{
5497 .{ .src = .{ .to_mem, .to_mem } },5711 .{ .src = .{ .to_mem, .to_mem } },
5498 },5712 },
5499 .extra_temps = .{5713 .extra_temps = .{
5500 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5714 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5501 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5715 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5502 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },5716 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5503 .unused,5717 .unused,
...@@ -5505,19 +5719,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5505,19 +5719,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5505 .unused,5719 .unused,
5506 },5720 },
5507 .dst_temps = .{.{ .cc = cc }},5721 .dst_temps = .{.{ .cc = cc }},
5508 .each = .{ .limb = .{5722 .each = .{ .once = &.{
5509 .of = .src0p,5723 .{ ._, ._, .mov, .tmp0p, .a(.src0, .sub_size), ._, ._ },
5510 .header = &.{5724 .{ ._, ._, .xor, .tmp1p, .tmp1p, ._, ._ },
5511 .{ ._, ._, .xor, .tmp2p, .tmp2p, ._, ._ },5725 .{ .@"0:", ._, .mov, .tmp2p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
5512 },5726 .{ ._, ._, .xor, .tmp2p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
5513 .body = &.{5727 .{ ._, ._, .@"or", .tmp1p, .tmp2p, ._, ._ },
5514 .{ ._, ._, .mov, .tmp1p, .limb(.src0p), ._, ._ },5728 .{ ._, ._, .add, .tmp0p, .a(.tmp2, .add_size), ._, ._ },
5515 .{ ._, ._, .xor, .tmp1p, .limb(.src1p), ._, ._ },5729 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5516 .{ ._, ._, .@"or", .tmp2p, .tmp1p, ._, ._ },5730 .{ ._, ._, .@"test", .tmp1p, .tmp1p, ._, ._ },
5517 },
5518 .trailer = &.{
5519 .{ ._, ._, .@"test", .tmp2p, .tmp2p, ._, ._ },
5520 },
5521 } },5731 } },
5522 } },5732 } },
5523 }) catch |err| switch (err) {5733 }) catch |err| switch (err) {
...@@ -24063,8 +24273,6 @@ const Select = struct {...@@ -24063,8 +24273,6 @@ const Select = struct {
24063 backward: ?Mir.Inst.Index,24273 backward: ?Mir.Inst.Index,
24064 forward: [1]?Mir.Inst.Index,24274 forward: [1]?Mir.Inst.Index,
24065 },24275 },
24066 limb: Memory.Mod.Rm,
24067 mask_limb: Memory.Mod.Rm,
2406824276
24069 fn emitLabel(s: *Select, label_index: Label) void {24277 fn emitLabel(s: *Select, label_index: Label) void {
24070 if (label_index == ._) return;24278 if (label_index == ._) return;
...@@ -24112,23 +24320,6 @@ const Select = struct {...@@ -24112,23 +24320,6 @@ const Select = struct {
24112 dst_temps: [@intFromEnum(Select.Operand.Ref.src0) - @intFromEnum(Select.Operand.Ref.dst0)]TempSpec.Kind = @splat(.unused),24320 dst_temps: [@intFromEnum(Select.Operand.Ref.src0) - @intFromEnum(Select.Operand.Ref.dst0)]TempSpec.Kind = @splat(.unused),
24113 each: union(enum) {24321 each: union(enum) {
24114 once: []const Instruction,24322 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 },
24132 },24323 },
24133 };24324 };
2413424325
...@@ -24349,26 +24540,20 @@ const Select = struct {...@@ -24349,26 +24540,20 @@ const Select = struct {
24349 backward_label,24540 backward_label,
24350 forward_label,24541 forward_label,
24351 ref,24542 ref,
24352 limb,
24353 mask_limb,
24354 simm,24543 simm,
24355 lea,24544 lea,
24356 mem,24545 mem,
24357 };24546 };
24358 const Adjust = enum {24547 const Adjust = enum {
24359 none,24548 none,
24360 add_access_size,24549 add_ptr_size,
24361 sub_access_size,24550 sub_ptr_size,
24551 add_ptr_bit_size,
24552 sub_ptr_bit_size,
24362 add_size,24553 add_size,
24363 sub_size,24554 sub_size,
24364 add_bit_size,
24365 sub_bit_size,
24366 add_limbs,
24367 sub_limbs,
24368 add_len,24555 add_len,
24369 sub_len,24556 sub_len,
24370 add_elem_size,
24371 sub_elem_size,
24372 add_elem_limbs,24557 add_elem_limbs,
24373 sub_elem_limbs,24558 sub_elem_limbs,
24374 };24559 };
...@@ -24435,6 +24620,15 @@ const Select = struct {...@@ -24435,6 +24620,15 @@ const Select = struct {
24435 const tmp4x: Sized = .{ .ref = .tmp4, .size = .xword };24620 const tmp4x: Sized = .{ .ref = .tmp4, .size = .xword };
24436 const tmp4y: Sized = .{ .ref = .tmp4, .size = .yword };24621 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
24438 const dst0: Sized = .{ .ref = .dst0, .size = .none };24632 const dst0: Sized = .{ .ref = .dst0, .size = .none };
24439 const dst0b: Sized = .{ .ref = .dst0, .size = .byte };24633 const dst0b: Sized = .{ .ref = .dst0, .size = .byte };
24440 const dst0w: Sized = .{ .ref = .dst0, .size = .word };24634 const dst0w: Sized = .{ .ref = .dst0, .size = .word };
...@@ -24515,6 +24709,14 @@ const Select = struct {...@@ -24515,6 +24709,14 @@ const Select = struct {
24515 const tmp4x: Select.Operand = .{ .tag = .ref, .base = .tmp4x };24709 const tmp4x: Select.Operand = .{ .tag = .ref, .base = .tmp4x };
24516 const tmp4y: Select.Operand = .{ .tag = .ref, .base = .tmp4y };24710 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
24518 const dst0b: Select.Operand = .{ .tag = .ref, .base = .dst0b };24720 const dst0b: Select.Operand = .{ .tag = .ref, .base = .dst0b };
24519 const dst0w: Select.Operand = .{ .tag = .ref, .base = .dst0w };24721 const dst0w: Select.Operand = .{ .tag = .ref, .base = .dst0w };
24520 const dst0d: Select.Operand = .{ .tag = .ref, .base = .dst0d };24722 const dst0d: Select.Operand = .{ .tag = .ref, .base = .dst0d };
...@@ -24539,13 +24741,6 @@ const Select = struct {...@@ -24539,13 +24741,6 @@ const Select = struct {
24539 const src1x: Select.Operand = .{ .tag = .ref, .base = .src1x };24741 const src1x: Select.Operand = .{ .tag = .ref, .base = .src1x };
24540 const src1y: Select.Operand = .{ .tag = .ref, .base = .src1y };24742 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
24549 fn i(imm: i32) Select.Operand {24744 fn i(imm: i32) Select.Operand {
24550 return .{ .tag = .simm, .imm = imm };24745 return .{ .tag = .simm, .imm = imm };
24551 }24746 }
...@@ -24673,28 +24868,14 @@ const Select = struct {...@@ -24673,28 +24868,14 @@ const Select = struct {
24673 fn adjustedImm(op: Select.Operand, s: *const Select) i32 {24868 fn adjustedImm(op: Select.Operand, s: *const Select) i32 {
24674 return switch (op.adjust) {24869 return switch (op.adjust) {
24675 .none => op.imm,24870 .none => op.imm,
24676 .add_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),
24677 .sub_access_size => op.imm - @as(i32, @intCast(@divExact(op.base.size.bitSize(s.cg.target), 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(),
24678 .add_size => op.imm + @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu))),24875 .add_size => op.imm + @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu))),
24679 .sub_size => op.imm - @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu))),24876 .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 ))),
24690 .add_len => op.imm + @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).vectorLen(s.cg.pt.zcu))),24877 .add_len => op.imm + @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).vectorLen(s.cg.pt.zcu))),
24691 .sub_len => op.imm - @as(i32, @intCast(op.base.ref.deref(s).typeOf(s.cg).vectorLen(s.cg.pt.zcu))),24878 .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 )),
24698 .add_elem_limbs => op.imm + @as(i32, @intCast(@divExact(24879 .add_elem_limbs => op.imm + @as(i32, @intCast(@divExact(
24699 op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).abiSize(s.cg.pt.zcu),24880 op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).abiSize(s.cg.pt.zcu),
24700 @divExact(op.base.size.bitSize(s.cg.target), 8),24881 @divExact(op.base.size.bitSize(s.cg.target), 8),
...@@ -24726,7 +24907,6 @@ const Select = struct {...@@ -24726,7 +24907,6 @@ const Select = struct {
24726 else => |mcv| .{ .mem = try mcv.mem(s.cg, .{ .size = op.base.size }) },24907 else => |mcv| .{ .mem = try mcv.mem(s.cg, .{ .size = op.base.size }) },
24727 .register => |reg| .{ .reg = registerAlias(reg, @intCast(@divExact(op.base.size.bitSize(s.cg.target), 8))) },24908 .register => |reg| .{ .reg = registerAlias(reg, @intCast(@divExact(op.base.size.bitSize(s.cg.target), 8))) },
24728 },24909 },
24729 inline .limb, .mask_limb => |kind| .{ .mem = try op.base.ref.deref(s).tracking(s.cg).short.mem(s.cg, @field(s, @tagName(kind))) },
24730 .simm => .{ .imm = .s(op.adjustedImm(s)) },24910 .simm => .{ .imm = .s(op.adjustedImm(s)) },
24731 .lea => .{ .mem = .{24911 .lea => .{ .mem = .{
24732 .base = .{ .reg = registerAlias(op.base.ref.deref(s).tracking(s.cg).short.register, @divExact(s.cg.target.ptrBitWidth(), 8)) },24912 .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(...@@ -24775,8 +24955,6 @@ fn select(
24775 .cg = cg,24955 .cg = cg,
24776 .temps = undefined,24956 .temps = undefined,
24777 .labels = @splat(.{ .forward = @splat(null), .backward = null }),24957 .labels = @splat(.{ .forward = @splat(null), .backward = null }),
24778 .limb = undefined,
24779 .mask_limb = undefined,
24780 };24958 };
24781 const tmp_slots = s.temps[@intFromEnum(Select.Operand.Ref.tmp0)..@intFromEnum(Select.Operand.Ref.dst0)];24959 const tmp_slots = s.temps[@intFromEnum(Select.Operand.Ref.tmp0)..@intFromEnum(Select.Operand.Ref.dst0)];
24782 const dst_slots = s.temps[@intFromEnum(Select.Operand.Ref.dst0)..@intFromEnum(Select.Operand.Ref.src0)];24960 const dst_slots = s.temps[@intFromEnum(Select.Operand.Ref.dst0)..@intFromEnum(Select.Operand.Ref.src0)];
...@@ -24797,74 +24975,11 @@ fn select(...@@ -24797,74 +24975,11 @@ fn select(
24797 @memcpy(dst_slots[0..dst_temps.len], dst_temps);24975 @memcpy(dst_slots[0..dst_temps.len], dst_temps);
2479824976
24799 switch (case.each) {24977 switch (case.each) {
24800 .once => |body| for (body) |inst| try s.emit(inst),24978 .once => |body| {
24801 .limb => |limb| {24979 for (body) |inst| try s.emit(inst);
24802 const limb_of_size: i32 = @intCast(limb.of.ref.deref(&s).typeOf(cg).abiSize(cg.pt.zcu));24980 s.emitLabel(.@"0:");
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 }
24865 },24981 },
24866 }24982 }
24867 s.emitLabel(.@"0:");
2486824983
24869 for (dst_temps, case.dst_temps[0..dst_temps.len]) |dst_temp, dst_kind| dst_kind.finish(dst_temp, &s);24984 for (dst_temps, case.dst_temps[0..dst_temps.len]) |dst_temp, dst_kind| dst_kind.finish(dst_temp, &s);
24870 for (case.extra_temps, tmp_slots) |spec, temp| if (spec.kind != .unused) try temp.die(cg);24985 for (case.extra_temps, tmp_slots) |spec, temp| if (spec.kind != .unused) try temp.die(cg);