From 7bfdb7f26d85b8f9df8dfb39de70160d1881208b Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Wed, 21 May 2025 12:27:24 -0400 Subject: [PATCH] x86_64: implement integer `@reduce(.Mul)` --- src/arch/x86_64/CodeGen.zig | 3885 +++++++++++++++++++++++++++++++- src/arch/x86_64/Encoding.zig | 48 +- src/arch/x86_64/Lower.zig | 2 +- src/arch/x86_64/Mir.zig | 8 + src/arch/x86_64/encodings.zon | 20 +- test/behavior/x86_64/unary.zig | 8 + 6 files changed, 3830 insertions(+), 141 deletions(-) diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index b37a62f149..3be4356873 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -2389,7 +2389,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { - @setEvalBranchQuota(22_500); + @setEvalBranchQuota(23_100); const pt = cg.pt; const zcu = pt.zcu; const ip = &zcu.intern_pool; @@ -98880,6 +98880,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .v_dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, @@ -99134,6 +99135,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_ps, .cvtph2, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, @@ -99164,6 +99166,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_ps, .cvtph2, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, @@ -99291,6 +99294,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_ps, .cvtph2, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, @@ -99320,6 +99324,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, @@ -99545,6 +99550,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, @@ -100555,6 +100561,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .v_dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, @@ -100586,6 +100593,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, @@ -100617,6 +100625,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .cvttss2si, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, @@ -100645,6 +100654,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .cvttss2si, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, @@ -100849,6 +100859,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_, .cvttps2dq, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, @@ -100878,6 +100889,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .cvttps2dq, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, @@ -100907,6 +100919,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_, .cvttps2dq, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, @@ -100936,6 +100949,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .cvttps2dq, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, @@ -101051,6 +101065,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_, .cvttps2dq, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, @@ -101079,6 +101094,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .cvttps2dq, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, @@ -101231,6 +101247,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_, .cvttss2si, .tmp1q, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, @@ -101259,6 +101276,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .cvttss2si, .tmp1q, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, @@ -101687,6 +101705,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .{ .type = .u16, .kind = .mem }, .{ .type = .i16, .kind = .mem }, .unused, .unused, @@ -101696,13 +101715,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, .unused, - .unused, }, .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, .each = .{ .once = &.{ .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, - .{ ._, .fi_p, .stt, .tmp1w, ._, ._, ._ }, - .{ ._, ._, .movsx, .dst0d, .tmp1b, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .dst0w, ._, ._ }, + .{ ._, .fi_p, .st, .tmp2w, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movsx, .dst0d, .tmp2b, ._, ._ }, } }, }, .{ .required_features = .{ .x87, null, null, null }, @@ -101713,6 +101737,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .{ .type = .u16, .kind = .mem }, .{ .type = .i16, .kind = .mem }, .unused, .unused, @@ -101722,13 +101747,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, .unused, - .unused, }, .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, .each = .{ .once = &.{ .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, - .{ ._, .fi_p, .stt, .tmp1w, ._, ._, ._ }, - .{ ._, ._, .movzx, .dst0d, .tmp1b, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .dst0w, ._, ._ }, + .{ ._, .fi_p, .st, .tmp2w, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .tmp2b, ._, ._ }, } }, }, .{ .required_features = .{ .x87, null, null, null }, @@ -101739,8 +101769,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .f64, .kind = .{ .reg = .st7 } }, - .unused, - .unused, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -101753,7 +101783,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{ .mem, .unused }, .each = .{ .once = &.{ .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, - .{ ._, .fi_p, .stt, .dst0w, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, + .{ ._, .fi_p, .st, .dst0w, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .x87, null, null, null }, @@ -101764,8 +101800,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .f64, .kind = .{ .reg = .st7 } }, - .unused, - .unused, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -101778,7 +101814,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{ .mem, .unused }, .each = .{ .once = &.{ .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, - .{ ._, .fi_p, .stt, .dst0d, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, + .{ ._, .fi_p, .st, .dst0d, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", .avx, null, null }, @@ -101813,8 +101855,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .f64, .kind = .{ .reg = .st7 } }, - .unused, - .unused, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -101827,7 +101869,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{ .mem, .unused }, .each = .{ .once = &.{ .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, - .{ ._, .fi_p, .stt, .dst0q, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, + .{ ._, .fi_p, .st, .dst0q, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", .avx, null, null }, @@ -101901,12 +101949,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f32, .kind = .{ .@"0x1p63_mem" = .{} } }, - .{ .type = .f64, .kind = .{ .reg = .st6 } }, .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .f32, .kind = .{ .@"0x1p63_mem" = .{} } }, .{ .type = .i64, .kind = .mem }, - .unused, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -101917,16 +101965,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .f_, .ld, .tmp3t, ._, ._, ._ }, - .{ ._, .fi_p, .stt, .tmp4q, ._, ._, ._ }, - .{ ._, ._, .mov, .dst0q, .tmp4q, ._, ._ }, - .{ ._, .f_, .sub, .lea(.tmp0d), ._, ._, ._ }, - .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ }, - .{ ._, .fi_p, .stt, .tmp4q, ._, ._, ._ }, + .{ ._, .f_, .ld, .tmp0t, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .tmp2w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp2b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2w, .dst0w, ._, ._ }, + .{ ._, ._, .lea, .dst0q, .mem(.tmp3), ._, ._ }, + .{ ._, .fi_p, .st, .tmp4q, ._, ._, ._ }, + .{ ._, .f_, .sub, .lea(.dst0d), ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .tmp4q, ._, ._ }, + .{ ._, .fi_p, .st, .tmp4q, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .tmp5q, ._, ._ }, .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ }, .{ ._, ._, .@"and", .dst0q, .tmp4q, ._, ._ }, - .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .dst0q, .tmp5q, ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", .sse, null, null }, @@ -102248,10 +102302,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .i16, .kind = .mem }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, .unused, .unused, .unused, @@ -102260,14 +102314,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .fi_p, .stt, .tmp2w, ._, ._, ._ }, - .{ ._, ._, .movzx, .tmp3d, .tmp2b, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, .fi_p, .st, .tmp4w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp4b, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .x87, null, null, null }, @@ -102278,10 +102339,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .i16, .kind = .mem }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, .unused, .unused, .unused, @@ -102290,14 +102351,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .fi_p, .stt, .tmp2w, ._, ._, ._ }, - .{ ._, ._, .movzx, .tmp3d, .tmp2b, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, .fi_p, .st, .tmp4w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp4b, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, .slow_incdec, null, null }, @@ -102723,6 +102791,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, @@ -102732,15 +102801,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, .unused, - .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp0w, ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .fi_p, .stt, .memia(.dst0w, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .fi_p, .st, .memia(.dst0w, .tmp0, .add_unaligned_size), ._, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .x87, null, null, null }, @@ -102751,10 +102826,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .i32, .kind = .mem }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, .unused, .unused, .unused, @@ -102763,14 +102838,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .fi_p, .stt, .tmp2d, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, .fi_p, .st, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .tmp4d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, @@ -102969,6 +103051,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, @@ -102978,15 +103061,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, .unused, - .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp0w, ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .fi_p, .stt, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .fi_p, .st, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .x87, null, null, null }, @@ -102997,10 +103086,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .i64, .kind = .mem }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, .unused, .unused, .unused, @@ -103009,14 +103098,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .fi_p, .stt, .tmp2q, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp3d, ._, ._ }, + .{ ._, .fi_p, .st, .tmp4q, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .tmp4d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, @@ -103273,6 +103369,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, @@ -103282,15 +103379,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, .unused, - .unused, }, .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp0w, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .fi_p, .stt, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .fi_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, @@ -103881,7 +103984,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, .dst_constraints = .{ .{ .signed_int = .byte }, .any }, .patterns = &.{ @@ -103889,7 +103992,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .src = .{ .to_x87, .none, .none } }, }, .extra_temps = .{ - .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .{ .type = .i16, .kind = .mem }, .unused, .unused, @@ -103910,13 +104013,46 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .x87, null, null, null }, .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, + .dst_constraints = .{ .{ .signed_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .i16, .kind = .mem }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .dst0w, ._, ._ }, + .{ ._, .fi_p, .st, .tmp2w, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movsx, .dst0d, .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, + .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, .dst_constraints = .{ .{ .unsigned_int = .byte }, .any }, .patterns = &.{ .{ .src = .{ .mem, .none, .none } }, .{ .src = .{ .to_x87, .none, .none } }, }, .extra_temps = .{ - .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .{ .type = .i16, .kind = .mem }, .unused, .unused, @@ -103935,7 +104071,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .movzx, .dst0d, .tmp1b, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, .slow_incdec, null, null }, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, + .dst_constraints = .{ .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .i16, .kind = .mem }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .dst0w, ._, ._ }, + .{ ._, .fi_p, .st, .tmp2w, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, .slow_incdec, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, .patterns = &.{ @@ -103946,7 +104115,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .f80, .kind = .{ .reg = .st7 } }, .{ .type = .i16, .kind = .mem }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -103968,7 +104137,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, .patterns = &.{ @@ -103979,7 +104148,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .f80, .kind = .{ .reg = .st7 } }, .{ .type = .i16, .kind = .mem }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -104003,6 +104172,84 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .x87, .slow_incdec, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .i16, .kind = .mem }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .mov, .tmp1p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp3d, .tmp2w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp2b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2w, .tmp3w, ._, ._ }, + .{ .@"0:", .f_, .ld, .lea(.tmp0t), ._, ._, ._ }, + .{ ._, .fi_p, .st, .tmp5w, ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp3d, .tmp5b, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp1, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 16), ._, ._ }, + .{ ._, ._, .add, .tmp1p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .i16, .kind = .mem }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .mov, .tmp1p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp3d, .tmp2w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp2b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2w, .tmp3w, ._, ._ }, + .{ .@"0:", .f_, .ld, .lea(.tmp0t), ._, ._, ._ }, + .{ ._, .fi_p, .st, .tmp5w, ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp3d, .tmp5b, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp1, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 16), ._, ._ }, + .{ ._, ._c, .in, .tmp1p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, .slow_incdec, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .any }, .patterns = &.{ .{ .src = .{ .to_mem, .none, .none } }, @@ -104034,7 +104281,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .any }, .patterns = &.{ @@ -104066,8 +104313,86 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._c, .in, .tmp1p, ._, ._, ._ }, .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, + }, .{ + .required_features = .{ .x87, .slow_incdec, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .i16, .kind = .mem }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .mov, .tmp1p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp3d, .tmp2w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp2b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2w, .tmp3w, ._, ._ }, + .{ .@"0:", .f_, .ld, .lea(.tmp0t), ._, ._, ._ }, + .{ ._, .fi_p, .st, .tmp5w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp3d, .tmp5b, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp1, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 16), ._, ._ }, + .{ ._, ._, .add, .tmp1p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + } }, }, .{ .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .i16, .kind = .mem }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .mov, .tmp1p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp3d, .tmp2w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp2b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2w, .tmp3w, ._, ._ }, + .{ .@"0:", .f_, .ld, .lea(.tmp0t), ._, ._, ._ }, + .{ ._, .fi_p, .st, .tmp5w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp3d, .tmp5b, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp1, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 16), ._, ._ }, + .{ ._, ._c, .in, .tmp1p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, .dst_constraints = .{ .{ .signed_or_exclusive_int = .word }, .any }, .patterns = &.{ @@ -104094,6 +104419,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, + .dst_constraints = .{ .{ .signed_or_exclusive_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, + .{ ._, .fi_p, .st, .dst0w, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, .patterns = &.{ @@ -104124,6 +104481,41 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .x87, null, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp0w, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .fi_p, .st, .memia(.dst0w, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any }, .patterns = &.{ .{ .src = .{ .to_mem, .none, .none } }, @@ -104154,6 +104546,43 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .i32, .kind = .mem }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .fi_p, .st, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .tmp4d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, .dst_constraints = .{ .{ .signed_or_exclusive_int = .dword }, .any }, .patterns = &.{ @@ -104180,6 +104609,38 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, + .dst_constraints = .{ .{ .signed_or_exclusive_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, + .{ ._, .fi_p, .st, .dst0d, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, .patterns = &.{ @@ -104210,6 +104671,41 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .x87, null, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp0w, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .fi_p, .st, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, .patterns = &.{ .{ .src = .{ .to_mem, .none, .none } }, @@ -104240,6 +104736,43 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .i64, .kind = .mem }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .fi_p, .st, .tmp4q, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .tmp4d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, .dst_constraints = .{ .{ .signed_or_exclusive_int = .qword }, .any }, .patterns = &.{ @@ -104265,7 +104798,39 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .fi_p, .stt, .dst0q, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .x87, null, null }, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, + .dst_constraints = .{ .{ .signed_or_exclusive_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp2w, ._, ._ }, + .{ ._, .fi_p, .st, .dst0q, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse3, .x87, null }, .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, .dst_constraints = .{ .{ .exact_unsigned_int = 64 }, .any }, .patterns = &.{ @@ -104301,7 +104866,49 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, + .required_features = .{ .@"64bit", .x87, null, null }, + .src_constraints = .{ .{ .float = .tbyte }, .any, .any }, + .dst_constraints = .{ .{ .exact_unsigned_int = 64 }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .f32, .kind = .{ .@"0x1p63_mem" = .{} } }, + .{ .type = .i64, .kind = .mem }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .tmp0t, ._, ._, ._ }, + .{ ._, .fn_cw, .st, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .tmp2w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp2b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2w, .dst0w, ._, ._ }, + .{ ._, ._, .lea, .dst0q, .mem(.tmp3), ._, ._ }, + .{ ._, .fi_p, .st, .tmp4q, ._, ._, ._ }, + .{ ._, .f_, .sub, .lea(.dst0d), ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .tmp4q, ._, ._ }, + .{ ._, .fi_p, .st, .tmp4q, ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp2w, ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .tmp5q, ._, ._ }, + .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ }, + .{ ._, ._, .@"and", .dst0q, .tmp4q, ._, ._ }, + .{ ._, ._, .@"or", .dst0q, .tmp5q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse3, .x87, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any }, .patterns = &.{ @@ -104329,6 +104936,41 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .mem }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .fn_cw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .tmp1w, ._, ._ }, + .{ ._, ._, .@"or", .memd(.tmp1b, 1), .ui(0b000_0_11_00), ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .tmp0w, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .fi_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_cw, .ld, .tmp1w, ._, ._, ._ }, + } }, }, .{ .required_features = .{ .@"64bit", .avx, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, @@ -116834,8 +117476,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { switch (reduce.operation) { .And, .Or, .Xor => {}, .Min, .Max => break :fallback try cg.airReduce(inst), - .Add => if (cg.floatBits(res_ty)) |_| break :fallback try cg.airReduce(inst), - .Mul => break :fallback try cg.airReduce(inst), + .Add, .Mul => if (cg.floatBits(res_ty)) |_| break :fallback try cg.airReduce(inst), } var ops = try cg.tempsFromOperands(inst, .{reduce.operand}); var res: [1]Temp = undefined; @@ -118473,12 +119114,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .vp_d, .srl, .tmp0x, .src0x, .ui(16), ._ }, - .{ ._, .vp_, mir_tag, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_w, .srl, .tmp0x, .src0x, .ui(8), ._ }, - .{ ._, .vp_, mir_tag, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_, mir_tag, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_w, .srl, .dst0x, .src0x, .ui(8), ._ }, + .{ ._, .vp_, mir_tag, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, @@ -119584,12 +120225,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, - .{ ._, .vp_, mir_tag, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_d, .srl, .tmp0x, .src0x, .ui(16), ._ }, - .{ ._, .vp_, mir_tag, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_, mir_tag, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .dst0x, .src0x, .ui(16), ._ }, + .{ ._, .vp_, mir_tag, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, @@ -120479,19 +121120,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, - .{ ._, .vp_, mir_tag, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, - .{ ._, .vp_, mir_tag, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_, mir_tag, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .dst0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_, mir_tag, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .dst_constraints = .{ .{ .int = .dword }, .any }, .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, @@ -120506,7 +121147,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .p_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, .{ ._, .p_, mir_tag, .tmp0x, .src0x, ._, ._ }, @@ -121203,12 +121844,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .v_i128, .extract, .tmp0x, .src0y, .ui(1), ._ }, - .{ ._, .vp_, mir_tag, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, - .{ ._, .vp_, mir_tag, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_, mir_tag, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .dst0x, .src0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_, mir_tag, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, @@ -121230,12 +121871,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .v_f128, .extract, .tmp0x, .src0y, .ui(1), ._ }, - .{ ._, .v_ps, mir_tag, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .v_ps, .movhl, .tmp0x, .src0x, .src0x, ._ }, - .{ ._, .v_ps, mir_tag, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .v_ps, mir_tag, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .v_ps, .movhl, .dst0x, .src0x, .src0x, ._ }, + .{ ._, .v_ps, mir_tag, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .avx512f, null, null, null }, @@ -122425,12 +123066,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .vp_d, .srl, .tmp0x, .src0x, .ui(16), ._ }, - .{ ._, .vp_b, .add, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_w, .srl, .tmp0x, .src0x, .ui(8), ._ }, - .{ ._, .vp_b, .add, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_b, .add, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_w, .srl, .dst0x, .src0x, .ui(8), ._ }, + .{ ._, .vp_b, .add, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, @@ -123125,7 +123766,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .avx, null, null, null }, .dst_constraints = .{ .{ .int = .byte }, .any }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, .patterns = &.{ .{ .src = .{ .to_mem, .none, .none } }, }, @@ -123171,7 +123812,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0 } } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0 } } }, .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, .unused, .unused, @@ -123405,12 +124046,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, - .{ ._, .vp_w, .add, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_d, .srl, .tmp0x, .src0x, .ui(16), ._ }, - .{ ._, .vp_w, .add, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_w, .add, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .dst0x, .src0x, .ui(16), ._ }, + .{ ._, .vp_w, .add, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, @@ -123947,7 +124588,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .avx, null, null, null }, .dst_constraints = .{ .{ .int = .word }, .any }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, .patterns = &.{ .{ .src = .{ .to_mem, .none, .none } }, }, @@ -124191,19 +124832,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, - .{ ._, .vp_d, .add, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, - .{ ._, .vp_d, .add, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .add, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .dst0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_d, .add, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .dst_constraints = .{ .{ .int = .dword }, .any }, .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, @@ -124218,7 +124859,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .p_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, .{ ._, .p_d, .add, .tmp0x, .src0x, ._, ._ }, @@ -124588,7 +125229,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .avx, null, null, null }, .dst_constraints = .{ .{ .int = .dword }, .any }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, .patterns = &.{ .{ .src = .{ .to_mem, .none, .none } }, }, @@ -124828,12 +125469,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .v_i128, .extract, .tmp0x, .src0y, .ui(1), ._ }, - .{ ._, .vp_q, .add, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, - .{ ._, .vp_q, .add, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_q, .add, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .dst0x, .src0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_q, .add, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, @@ -124855,12 +125496,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{ .{ .rc = .sse }, .unused }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, .each = .{ .once = &.{ .{ ._, .v_f128, .extract, .tmp0x, .src0y, .ui(1), ._ }, - .{ ._, .vp_q, .add, .dst0x, .src0x, .tmp0x, ._ }, - .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, - .{ ._, .vp_q, .add, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_q, .add, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .dst0x, .src0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_q, .add, .dst0x, .tmp0x, .dst0x, ._ }, } }, }, .{ .required_features = .{ .avx512f, null, null, null }, @@ -125091,7 +125732,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .avx, null, null, null }, .dst_constraints = .{ .{ .int = .qword }, .any }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } }, .any, .any }, .patterns = &.{ .{ .src = .{ .to_mem, .none, .none } }, }, @@ -125268,7 +125909,3013 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, } }, } }, - .Mul => unreachable, + .Mul => comptime &.{ .{ + .required_features = .{ .sse, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .mut_gpr, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_w, .srl, .tmp0x, .src0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp0x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_w, .srl, .tmp0x, .src0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp0x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .tmp0x, .src0x, ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_d, .srl, .dst0x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_d, .srl, .tmp0x, .src0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_w, .srl, .dst0x, .src0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .tmp0x, .dst0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp0x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_w, .srl, .dst0x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_w, .srl, .tmp0x, .src0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp0x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_d, .shuf, .dst0x, .tmp0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp0x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp0x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_q, .mov, .tmp2x, .lea(.tmp0q), ._, ._ }, + .{ ._, .vp_, .andn, .dst0x, .tmp2x, .src0x, ._ }, + .{ ._, .vp_b, .sub, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_w, .srl, .tmp2x, .dst0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._q, .mov, .tmp2x, .lea(.tmp0q), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .src0x, ._, ._ }, + .{ ._, .p_b, .sub, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp2x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp2x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_w, .srl, .tmp0x, .src0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp0x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_d, .shuf, .dst0x, .tmp0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp0x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp0x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, .vp_, .andn, .dst0x, .tmp2x, .src0x, ._ }, + .{ ._, .vp_b, .sub, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_w, .srl, .tmp2x, .dst0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .src0x, ._, ._ }, + .{ ._, .p_b, .sub, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp2x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp2x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_w, .srl, .tmp0y, .src0y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0y, .src0y, .tmp0y, ._ }, + .{ ._, .v_i128, .extract, .tmp0x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .v_f128, .extract, .tmp0x, .src0y, .ui(1), ._ }, + .{ ._, .vp_w, .srl, .tmp1x, .src0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp1x, ._ }, + .{ ._, .vp_w, .srl, .tmp1x, .tmp0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .tmp0x, .tmp0x, .tmp1x, ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, .vp_, .andn, .dst0y, .tmp2y, .src0y, ._ }, + .{ ._, .vp_b, .sub, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .vp_w, .srl, .tmp2y, .dst0y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_ps, .andn, .tmp3y, .tmp2y, .src0y, ._ }, + .{ ._, .vp_b, .sub, .dst0x, .tmp3x, .tmp2x, ._ }, + .{ ._, .v_f128, .extract, .tmp2x, .tmp2y, .ui(1), ._ }, + .{ ._, .v_f128, .extract, .tmp3x, .tmp3y, .ui(1), ._ }, + .{ ._, .vp_b, .sub, .tmp2x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_w, .srl, .tmp3x, .dst0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp3x, ._ }, + .{ ._, .vp_w, .srl, .tmp3x, .tmp2x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .tmp2x, .tmp2x, .tmp3x, ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .zword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .v_dqa, .mov, .dst0y, .mem(.src0y), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp0y, .memd(.src0y, 32), ._, ._ }, + .{ ._, .vp_w, .srl, .tmp1y, .dst0y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp1y, ._ }, + .{ ._, .vp_w, .srl, .tmp1y, .tmp0y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .tmp0y, .tmp0y, .tmp1y, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp0y, ._ }, + .{ ._, .v_i128, .extract, .tmp0x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .zword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_64_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lead(.tmp0y, 32), ._, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .tmp2y, .memd(.src0y, 32), ._ }, + .{ ._, .vp_b, .sub, .tmp2y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .dst0y, .mem(.src0y), ._ }, + .{ ._, .vp_b, .sub, .dst0y, .tmp3y, .dst0y, ._ }, + .{ ._, .vp_w, .srl, .tmp3y, .tmp2y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .tmp2y, .tmp2y, .tmp3y, ._ }, + .{ ._, .vp_w, .srl, .tmp3y, .dst0y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp3y, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-48, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .memad(.src0y, .add_unaligned_size, -32), ._, ._ }, + .{ ._, .vp_w, .srl, .tmp1y, .dst0y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp1y, ._ }, + .{ .@"0:", .vp_w, .movzxb, .tmp1y, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp1y, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_i128, .extract, .tmp1x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .srl, .tmp1x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-24, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0x, .memad(.src0x, .add_unaligned_size, -16), ._, ._ }, + .{ ._, .vp_w, .srl, .tmp1x, .dst0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ .@"0:", .vp_w, .movzxb, .tmp1x, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .srl, .tmp1x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-24, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .memad(.src0x, .add_unaligned_size, -16), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .dst0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp1x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ .@"0:", .p_w, .movzxb, .tmp1x, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp1x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-24, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .memad(.src0x, .add_unaligned_size, -16), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .dst0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp1x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ .@"0:", ._q, .mov, .tmp1x, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, .p_, .unpcklbw, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp1x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .zword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_64_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lead(.tmp0y, 32), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-96, .src0, .add_size), ._, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_b, .sub, .tmp2y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .dst0y, .memad(.src0y, .add_size, -64), ._ }, + .{ ._, .vp_b, .sub, .dst0y, .tmp3y, .dst0y, ._ }, + .{ ._, .vp_w, .srl, .tmp3y, .tmp2y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .tmp2y, .tmp2y, .tmp3y, ._ }, + .{ ._, .vp_w, .srl, .tmp3y, .dst0y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp3y, ._ }, + .{ .@"0:", .vp_w, .movzxb, .tmp3y, .memid(.src0x, .tmp0, 16), ._, ._ }, + .{ ._, .vp_w, .mull, .tmp2y, .tmp2y, .tmp3y, ._ }, + .{ ._, .vp_w, .movzxb, .tmp3y, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp3y, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(32), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-48, .src0, .add_size), ._, ._ }, + .{ ._, .vp_, .andn, .dst0y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_b, .sub, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .vp_w, .srl, .tmp2y, .dst0y, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ .@"0:", .vp_w, .movzxb, .tmp2y, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-40, .src0, .add_size), ._, ._ }, + .{ ._, .v_ps, .andn, .tmp3y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_b, .sub, .dst0x, .tmp3x, .tmp2x, ._ }, + .{ ._, .v_f128, .extract, .tmp2x, .tmp2y, .ui(1), ._ }, + .{ ._, .v_f128, .extract, .tmp3x, .tmp3y, .ui(1), ._ }, + .{ ._, .vp_b, .sub, .tmp2x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_w, .srl, .tmp3x, .dst0x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp3x, ._ }, + .{ ._, .vp_w, .srl, .tmp3x, .tmp2x, .ui(8), ._ }, + .{ ._, .vp_w, .mull, .tmp2x, .tmp2x, .tmp3x, ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ .@"0:", .vp_w, .movzxb, .tmp2x, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-24, .src0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .memad(.src0x, .add_size, -16), ._, ._ }, + .{ ._, .p_b, .sub, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp2x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ .@"0:", .p_w, .movzxb, .tmp2x, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp2x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-24, .src0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .memad(.src0x, .add_size, -16), ._, ._ }, + .{ ._, .p_b, .sub, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_w, .srl, .tmp2x, .ui(8), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ .@"0:", ._q, .mov, .tmp2x, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, .p_, .unpcklbw, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp2x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .slow_incdec, null, null, null }, + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .reg = .al }, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .memad(.src0b, .add_unaligned_size, -1), ._, ._ }, + .{ .@"0:", ._, .mul, .memi(.src0b, .tmp0), ._, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .dst_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .reg = .al }, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-2, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .memad(.src0b, .add_unaligned_size, -1), ._, ._ }, + .{ .@"0:", ._, .mul, .memi(.src0b, .tmp0), ._, ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .mut_gpr, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_d, .srl, .tmp0x, .src0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp0x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, .p_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp0x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp0x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .dst0x, .src0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .tmp0x, .dst0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, .p_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_d, .srl, .dst0x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, .p_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp0x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp0x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, .vp_, .andn, .dst0x, .tmp2x, .src0x, ._ }, + .{ ._, .vp_w, .sub, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .src0x, ._, ._ }, + .{ ._, .p_w, .sub, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp2x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .v_i128, .extract, .tmp0x, .src0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .v_f128, .extract, .tmp0x, .src0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, .vp_, .andn, .dst0y, .tmp2y, .src0y, ._ }, + .{ ._, .vp_w, .sub, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_ps, .andn, .tmp3y, .tmp2y, .src0y, ._ }, + .{ ._, .vp_w, .sub, .dst0x, .tmp3x, .tmp2x, ._ }, + .{ ._, .v_f128, .extract, .tmp2x, .tmp2y, .ui(1), ._ }, + .{ ._, .v_f128, .extract, .tmp3x, .tmp3y, .ui(1), ._ }, + .{ ._, .vp_w, .sub, .tmp2x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .zword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .v_dqa, .mov, .dst0y, .mem(.src0y), ._, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .memd(.src0y, 32), ._ }, + .{ ._, .v_i128, .extract, .tmp0x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .srl, .tmp0x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .zword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_64_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lead(.tmp0y, 32), ._, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .tmp2y, .memd(.src0y, 32), ._ }, + .{ ._, .vp_w, .sub, .tmp2y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .dst0y, .mem(.src0y), ._ }, + .{ ._, .vp_w, .sub, .dst0y, .tmp3y, .dst0y, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-64, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .memad(.src0y, .add_unaligned_size, -32), ._, ._ }, + .{ .@"0:", .vp_w, .mull, .dst0y, .dst0y, .memi(.src0y, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(32), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_i128, .extract, .tmp1x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .srl, .tmp1x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0x, .memad(.src0x, .add_unaligned_size, -16), ._, ._ }, + .{ .@"0:", .vp_w, .mull, .dst0x, .dst0x, .memi(.src0x, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .srl, .tmp1x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .memad(.src0x, .add_unaligned_size, -16), ._, ._ }, + .{ .@"0:", .p_w, .mull, .dst0x, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp1x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .zword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_64_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lead(.tmp0y, 32), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-128, .src0, .add_size), ._, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_w, .sub, .tmp2y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .dst0y, .memad(.src0y, .add_size, -64), ._ }, + .{ ._, .vp_w, .sub, .dst0y, .tmp3y, .dst0y, ._ }, + .{ .@"0:", .vp_w, .mull, .tmp2y, .tmp2y, .memid(.src0y, .tmp0, 32), ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .memi(.src0y, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(64), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_w, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-64, .src0, .add_size), ._, ._ }, + .{ ._, .vp_, .andn, .dst0y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_w, .sub, .dst0y, .dst0y, .tmp2y, ._ }, + .{ .@"0:", .vp_w, .mull, .dst0y, .dst0y, .memi(.src0y, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(32), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-48, .src0, .add_size), ._, ._ }, + .{ ._, .v_ps, .andn, .tmp3y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_w, .sub, .dst0x, .tmp3x, .tmp2x, ._ }, + .{ ._, .v_f128, .extract, .tmp2x, .tmp2y, .ui(1), ._ }, + .{ ._, .v_f128, .extract, .tmp3x, .tmp3y, .ui(1), ._ }, + .{ ._, .vp_w, .sub, .tmp2x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ .@"0:", .vp_w, .mull, .dst0x, .dst0x, .memi(.src0x, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .srl, .tmp2x, .dst0x, .ui(16), ._ }, + .{ ._, .vp_w, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .memad(.src0x, .add_size, -16), ._, ._ }, + .{ ._, .p_w, .sub, .dst0x, .tmp2x, ._, ._ }, + .{ .@"0:", .p_w, .mull, .dst0x, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_d, .srl, .tmp2x, .ui(16), ._, ._ }, + .{ ._, .p_w, .mull, .dst0x, .tmp2x, ._, ._ }, + } }, + }, .{ + .dst_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-4, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .memad(.src0w, .add_unaligned_size, -2), ._, ._ }, + .{ .@"0:", .i_, .mul, .dst0w, .memi(.src0w, .tmp0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(2), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .mut_gpr, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .src0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, .p_d, .shuf, .tmp0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, .p_d, .shuf, .tmp0x, .src0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .vp_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .tmp0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .dst0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .tmp0x, .dst0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .p_d, .shuf, .tmp0x, .src0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_udq, .mul, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_d, .shuf, .dst0x, .src0x, .ui(0b01_01_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .v_i128, .extract, .tmp0x, .src0y, .ui(1), ._ }, + .{ ._, .vp_d, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .v_f128, .extract, .tmp0x, .src0y, .ui(1), ._ }, + .{ ._, .vp_d, .mull, .dst0x, .src0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, .vp_, .andn, .dst0y, .tmp2y, .src0y, ._ }, + .{ ._, .vp_d, .sub, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_d, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_ps, .andn, .tmp3y, .tmp2y, .src0y, ._ }, + .{ ._, .vp_d, .sub, .dst0x, .tmp3x, .tmp2x, ._ }, + .{ ._, .v_f128, .extract, .tmp2x, .tmp2y, .ui(1), ._ }, + .{ ._, .v_f128, .extract, .tmp3x, .tmp3y, .ui(1), ._ }, + .{ ._, .vp_d, .sub, .tmp2x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_d, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .exact_scalar_int = .{ .of = .zword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, .v_dqa, .mov, .dst0y, .mem(.src0y), ._, ._ }, + .{ ._, .vp_d, .mull, .dst0y, .dst0y, .memd(.src0y, 32), ._ }, + .{ ._, .v_i128, .extract, .tmp0x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_d, .mull, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .vp_d, .shuf, .tmp0x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .zword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_64_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lead(.tmp0y, 32), ._, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .tmp2y, .memd(.src0y, 32), ._ }, + .{ ._, .vp_d, .sub, .tmp2y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .dst0y, .mem(.src0y), ._ }, + .{ ._, .vp_d, .sub, .dst0y, .tmp3y, .dst0y, ._ }, + .{ ._, .vp_d, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_d, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-64, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .memad(.src0y, .add_unaligned_size, -32), ._, ._ }, + .{ .@"0:", .vp_d, .mull, .dst0y, .dst0y, .memi(.src0y, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(32), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_i128, .extract, .tmp1x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_d, .mull, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp1x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0x, .memad(.src0x, .add_unaligned_size, -16), ._, ._ }, + .{ .@"0:", .vp_d, .mull, .dst0x, .dst0x, .memi(.src0x, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp1x, ._ }, + .{ ._, .vp_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .memad(.src0x, .add_unaligned_size, -16), ._, ._ }, + .{ .@"0:", .p_d, .mull, .dst0x, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp1x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .memad(.src0x, .add_unaligned_size, -16), ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp1x, ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp1x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .tmp1x, .ui(0b11_11_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp1x, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp1x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx512f, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .zword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_64_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .dst0y, .lea(.tmp0y), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lead(.tmp0y, 32), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-128, .src0, .add_size), ._, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_d, .sub, .tmp2y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .andn, .tmp3y, .dst0y, .memad(.src0y, .add_size, -64), ._ }, + .{ ._, .vp_d, .sub, .dst0y, .tmp3y, .dst0y, ._ }, + .{ .@"0:", .vp_d, .mull, .tmp2y, .tmp2y, .memid(.src0y, .tmp0, 32), ._ }, + .{ ._, .vp_d, .mull, .dst0y, .dst0y, .memi(.src0y, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(64), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_d, .mull, .dst0y, .dst0y, .tmp2y, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_d, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-64, .src0, .add_size), ._, ._ }, + .{ ._, .vp_, .andn, .dst0y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_d, .sub, .dst0y, .dst0y, .tmp2y, ._ }, + .{ .@"0:", .vp_d, .mull, .dst0y, .dst0y, .memi(.src0y, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(32), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_i128, .extract, .tmp2x, .dst0y, .ui(1), ._ }, + .{ ._, .vp_d, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-48, .src0, .add_size), ._, ._ }, + .{ ._, .v_ps, .andn, .tmp3y, .tmp2y, .memad(.src0y, .add_size, -32), ._ }, + .{ ._, .vp_d, .sub, .dst0x, .tmp3x, .tmp2x, ._ }, + .{ ._, .v_f128, .extract, .tmp2x, .tmp2y, .ui(1), ._ }, + .{ ._, .v_f128, .extract, .tmp3x, .tmp3y, .ui(1), ._ }, + .{ ._, .vp_d, .sub, .tmp2x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_d, .mull, .dst0x, .dst0x, .tmp2x, ._ }, + .{ .@"0:", .vp_d, .mull, .dst0x, .dst0x, .memi(.src0x, .tmp0), ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + .{ ._, .vp_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .vp_udq, .mul, .dst0x, .dst0x, .tmp2x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .memad(.src0x, .add_size, -16), ._, ._ }, + .{ ._, .p_d, .sub, .dst0x, .tmp2x, ._, ._ }, + .{ .@"0:", .p_d, .mull, .dst0x, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp2x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .pand_mask_mem = .{ .ref = .src0, .invert = true } } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .sse }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .memad(.src0x, .add_size, -16), ._, ._ }, + .{ ._, .p_d, .sub, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_11_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp2x, ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp2x, .memi(.src0x, .tmp0), ._, ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .tmp2x, .ui(0b11_11_01_01), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp2x, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .tmp2x, .dst0x, .ui(0b11_10_11_10), ._ }, + .{ ._, .p_udq, .mul, .dst0x, .tmp2x, ._, ._ }, + } }, + }, .{ + .dst_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .dst0d, .memad(.src0d, .add_unaligned_size, -4), ._, ._ }, + .{ .@"0:", .i_, .mul, .dst0d, .memi(.src0d, .tmp0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(4), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .dst_constraints = .{ .{ .int = .qword }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .mut_gpr, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{ .{ .int = .qword }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{ .{ .int = .qword }, .any }, + .src_constraints = .{ .{ .unaligned_multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .dst0q, .memad(.src0q, .add_unaligned_size, -8), ._, ._ }, + .{ .@"0:", .i_, .mul, .dst0q, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .dst_constraints = .{ .{ .int = .xword }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .mut_gpr, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .dst_constraints = .{ .{ .int = .xword }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_mem, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .dst_constraints = .{ .{ .int = .yword }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .mut_gpr, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .dst_constraints = .{ .{ .int = .yword }, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_mem, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .dst_constraints = .{ .any_int, .any }, + .src_constraints = .{ .{ .vec_len = 1 }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_mem, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .adx, null }, + .dst_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .isize, .kind = .{ .reg = .rcx } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_unaligned_size_sub_2_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mema(.src0, .add_unaligned_size_sub_elem_size), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp2p, .memi(.src0, .tmp0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-8, .dst0, .add_size), ._, ._ }, + .{ .@"1:", ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .leai(.tmp1q, .tmp3), ._, ._ }, + .{ ._, ._z, .j, .@"3f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .leaad(.tmp3, .sub_src0_elem_size, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp2q, .tmp5), ._ }, + .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_elem_size, -8), .tmp7q, ._, ._ }, + .{ ._, ._rcxz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ }, + .{ ._, ._mp, .j, .@"2b", ._, ._, ._ }, + .{ .@"3:", ._, .mov, .memi(.dst0q, .tmp3), .tmp4q, ._, ._ }, + .{ .@"2:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp3d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .sa(.dst0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, + .dst_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(8, .src0, .add_unaligned_size_sub_2_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mema(.src0, .add_unaligned_size_sub_elem_size), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp2p, .memi(.src0, .tmp0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ .@"1:", ._, .lea, .tmp4p, .leaa(.tmp3, .sub_src0_elem_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ ._, ._nz, .j, .@"3f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp3), .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"4f", ._, ._, ._ }, + .{ .@"2:", ._, .adc, .tmp9q, .memsia(.dst0q, .@"8", .tmp4, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp7q, .tmp9q, ._, ._ }, + .{ ._, ._l, .sh, .tmp6b, .ui(4), ._, ._ }, + .{ .@"3:", ._x, .mul, .tmp9q, .tmp8q, .leasi(.tmp2q, .@"8", .tmp4), ._ }, + .{ ._, ._, .adc, .tmp8q, .tmp7q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp4, .add_src0_elem_size), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp4p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"2b", ._, ._, ._ }, + .{ .@"4:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .sa(.dst0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .dst_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(8, .src0, .add_unaligned_size_sub_2_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mema(.src0, .add_unaligned_size_sub_elem_size), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp2p, .memi(.src0, .tmp0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ .@"1:", ._, .lea, .tmp4p, .leaa(.tmp3, .sub_src0_elem_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ ._, ._nz, .j, .@"3f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp3), .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"4f", ._, ._, ._ }, + .{ .@"2:", ._, .adc, .tmp9q, .memsia(.dst0q, .@"8", .tmp4, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp7q, .tmp9q, ._, ._ }, + .{ ._, ._l, .sh, .tmp6b, .ui(4), ._, ._ }, + .{ .@"3:", ._x, .mul, .tmp9q, .tmp8q, .leasi(.tmp2q, .@"8", .tmp4), ._ }, + .{ ._, ._, .adc, .tmp8q, .tmp7q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp4, .add_src0_elem_size), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp4p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"2b", ._, ._, ._ }, + .{ .@"4:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .sa(.dst0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .dst_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(8, .src0, .add_unaligned_size_sub_2_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mema(.src0, .add_unaligned_size_sub_elem_size), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp2p, .memi(.src0, .tmp0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ .@"1:", ._, .lea, .tmp4p, .leaa(.tmp3, .sub_src0_elem_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ ._, ._nz, .j, .@"3f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp3), .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"4f", ._, ._, ._ }, + .{ .@"2:", ._, .adc, .tmp9q, .memsia(.dst0q, .@"8", .tmp4, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp7q, .tmp9q, ._, ._ }, + .{ .@"3:", ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp2q, .@"8", .tmp4), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp6b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .tmp7q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp4, .add_src0_elem_size), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp4p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"2b", ._, ._, ._ }, + .{ .@"4:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .sa(.dst0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + }, + .dst_temps = .{ .mem, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(8, .src0, .add_unaligned_size_sub_2_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mema(.src0, .add_unaligned_size_sub_elem_size), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp2p, .memi(.src0, .tmp0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ .@"1:", ._, .lea, .tmp4p, .leaa(.tmp3, .sub_src0_elem_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ ._, ._nz, .j, .@"3f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp3), .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"4f", ._, ._, ._ }, + .{ .@"2:", ._, .adc, .tmp9q, .memsia(.dst0q, .@"8", .tmp4, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp7q, .tmp9q, ._, ._ }, + .{ .@"3:", ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp2q, .@"8", .tmp4), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp6b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .tmp7q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp4, .add_src0_elem_size), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp4p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"2b", ._, ._, ._ }, + .{ .@"4:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .sa(.dst0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"0b", ._, ._, ._ }, + } }, + } }, }) catch |err| switch (err) { error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ @tagName(air_tag), @@ -141408,14 +145055,14 @@ fn airRepeat(self: *CodeGen, inst: Air.Inst.Index) !void { } fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void { + @setEvalBranchQuota(1_100); const pt = self.pt; const zcu = pt.zcu; const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl; const extra = self.air.extraData(Air.Asm, ty_pl.payload); const clobbers_len: u31 = @truncate(extra.data.flags); var extra_i: usize = extra.end; - const outputs: []const Air.Inst.Ref = - @ptrCast(self.air.extra[extra_i..][0..extra.data.outputs_len]); + const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra[extra_i..][0..extra.data.outputs_len]); extra_i += outputs.len; const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra[extra_i..][0..extra.data.inputs_len]); extra_i += inputs.len; diff --git a/src/arch/x86_64/Encoding.zig b/src/arch/x86_64/Encoding.zig index 05ca39f6f0..a1dbedcaa1 100644 --- a/src/arch/x86_64/Encoding.zig +++ b/src/arch/x86_64/Encoding.zig @@ -336,7 +336,7 @@ pub const Mnemonic = enum { fcom, fcomi, fcomip, fcomp, fcompp, fcos, fdecstp, fdiv, fdivp, fdivr, fdivrp, ffree, fiadd, ficom, ficomp, fidiv, fidivr, fild, fimul, fincstp, finit, - fist, fistp, fisttp, fisub, fisubr, + fist, fistp, fisub, fisubr, fld, fld1, fldcw, fldenv, fldl2e, fldl2t, fldlg2, fldln2, fldpi, fldz, fmul, fmulp, fnclex, fninit, fnop, fnsave, fnstcw, fnstenv, fnstsw, @@ -349,19 +349,18 @@ pub const Mnemonic = enum { // MMX emms, movd, movq, packssdw, packsswb, packuswb, - paddb, paddd, paddq, paddsb, paddsw, paddusb, paddusw, paddw, + paddb, paddd, paddsb, paddsw, paddusb, paddusw, paddw, pand, pandn, por, pxor, pcmpeqb, pcmpeqd, pcmpeqw, pcmpgtb, pcmpgtd, pcmpgtw, - pmulhw, pmullw, + pmaddwd, pmulhw, pmullw, pslld, psllq, psllw, psrad, psraw, psrld, psrlq, psrlw, - psubb, psubd, psubq, psubsb, psubsw, psubusb, psubusw, psubw, + psubb, psubd, psubsb, psubsw, psubusb, psubusw, psubw, // SSE addps, addss, - andps, - andnps, + andnps, andps, cmpps, cmpss, comiss, cvtpi2ps, cvtps2pi, cvtsi2ss, cvtss2si, cvttps2pi, cvttss2si, divps, divss, @@ -374,9 +373,11 @@ pub const Mnemonic = enum { movss, movups, mulps, mulss, orps, + pavgb, pavgw, pextrw, pinsrw, - pmaxsw, pmaxub, pminsw, pminub, pmovmskb, + pmaxsw, pmaxub, pminsw, pminub, pmovmskb, pmulhuw, prefetchit0, prefetchit1, prefetchnta, prefetcht0, prefetcht1, prefetcht2, prefetchw, prefetchwt1, + psadbw, pshufw, shufps, sqrtps, sqrtss, stmxcsr, @@ -397,15 +398,16 @@ pub const Mnemonic = enum { maxpd, maxsd, minpd, minsd, movapd, - movdqa, movdqu, + movdq2q, movdqa, movdqu, movhpd, movlpd, - movmskpd, + movmskpd, movq2dq, //movsd, movupd, mulpd, mulsd, orpd, + paddq, pmuludq, pshufd, pshufhw, pshuflw, - pslldq, psrldq, + pslldq, psrldq, psubq, punpckhbw, punpckhdq, punpckhqdq, punpckhwd, punpcklbw, punpckldq, punpcklqdq, punpcklwd, shufpd, @@ -414,9 +416,17 @@ pub const Mnemonic = enum { ucomisd, unpckhpd, unpcklpd, xorpd, // SSE3 - addsubpd, addsubps, haddpd, haddps, lddqu, movddup, movshdup, movsldup, + addsubpd, addsubps, + fisttp, + haddpd, haddps, + hsubpd, hsubps, + lddqu, + movddup, movshdup, movsldup, // SSSE3 - pabsb, pabsd, pabsw, palignr, pshufb, + pabsb, pabsd, pabsw, palignr, + phaddw, phaddsw, phaddd, phsubw, phsubsw, phsubd, + pmaddubsw, pmulhrsw, pshufb, + psignb, psignd, psignw, // SSE4.1 blendpd, blendps, blendvpd, blendvps, dppd, dpps, @@ -430,7 +440,7 @@ pub const Mnemonic = enum { pmaxsb, pmaxsd, pmaxud, pmaxuw, pminsb, pminsd, pminud, pminuw, pmovsxbd, pmovsxbq, pmovsxbw, pmovsxdq, pmovsxwd, pmovsxwq, pmovzxbd, pmovzxbq, pmovzxbw, pmovzxdq, pmovzxwd, pmovzxwq, - pmulld, + pmuldq, pmulld, ptest, roundpd, roundps, roundsd, roundss, // SSE4.2 @@ -458,7 +468,7 @@ pub const Mnemonic = enum { vdppd, vdpps, vextractf128, vextractps, vgf2p8affineinvqb, vgf2p8affineqb, vgf2p8mulb, - vhaddpd, vhaddps, + vhaddpd, vhaddps, vhsubpd, vhsubps, vinsertf128, vinsertps, vlddqu, vldmxcsr, vmaskmovpd, vmaskmovps, @@ -480,21 +490,24 @@ pub const Mnemonic = enum { vpabsb, vpabsd, vpabsw, vpackssdw, vpacksswb, vpackusdw, vpackuswb, vpaddb, vpaddd, vpaddq, vpaddsb, vpaddsw, vpaddusb, vpaddusw, vpaddw, - vpalignr, vpand, vpandn, + vpalignr, vpand, vpandn, vpavgb, vpavgw, vpblendvb, vpblendw, vpclmulqdq, vpcmpeqb, vpcmpeqd, vpcmpeqq, vpcmpeqw, vpcmpgtb, vpcmpgtd, vpcmpgtq, vpcmpgtw, + vphaddw, vphaddsw, vphaddd, vphsubw, vphsubsw, vphsubd, vperm2f128, vpermilpd, vpermilps, vpextrb, vpextrd, vpextrq, vpextrw, vpinsrb, vpinsrd, vpinsrq, vpinsrw, vpmaxsb, vpmaxsd, vpmaxsw, vpmaxub, vpmaxud, vpmaxuw, vpminsb, vpminsd, vpminsw, vpminub, vpminud, vpminuw, + vpmaddubsw, vpmovmskb, vpmovsxbd, vpmovsxbq, vpmovsxbw, vpmovsxdq, vpmovsxwd, vpmovsxwq, vpmovzxbd, vpmovzxbq, vpmovzxbw, vpmovzxdq, vpmovzxwd, vpmovzxwq, - vpmulhw, vpmulld, vpmullw, + vpmuldq, vpmulhrsw, vpmulhw, vpmulld, vpmullw, vpmuludq, vpor, vpshufb, vpshufd, vpshufhw, vpshuflw, + vpsignb, vpsignd, vpsignw, vpslld, vpslldq, vpsllq, vpsllw, vpsrad, vpsraq, vpsraw, vpsrld, vpsrldq, vpsrlq, vpsrlw, @@ -779,7 +792,7 @@ pub const Op = enum { pub fn isImmediate(op: Op) bool { // zig fmt: off return switch (op) { - .imm8, .imm16, .imm32, .imm64, + .imm8, .imm16, .imm32, .imm64, .imm8s, .imm16s, .imm32s, .rel8, .rel16, .rel32, .unity, @@ -986,6 +999,7 @@ pub const Feature = enum { sse, sse2, sse3, + @"sse3 x87", sse4_1, sse4_2, ssse3, diff --git a/src/arch/x86_64/Lower.zig b/src/arch/x86_64/Lower.zig index dcf857e789..9e9793c7b0 100644 --- a/src/arch/x86_64/Lower.zig +++ b/src/arch/x86_64/Lower.zig @@ -567,7 +567,7 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand) } fn generic(lower: *Lower, inst: Mir.Inst) Error!void { - @setEvalBranchQuota(2_500); + @setEvalBranchQuota(2_600); const fixes = switch (inst.ops) { .none => inst.data.none.fixes, .inst => inst.data.inst.fixes, diff --git a/src/arch/x86_64/Mir.zig b/src/arch/x86_64/Mir.zig index f922923622..8ca610fdb4 100644 --- a/src/arch/x86_64/Mir.zig +++ b/src/arch/x86_64/Mir.zig @@ -386,7 +386,10 @@ pub const Inst = struct { /// Packed ___ Quadword p_q, /// Packed ___ Double Quadword + /// Packed ___ Doubleword to Quadword p_dq, + /// Packed ___ Unsigned Doubleword to Quadword + p_udq, /// ___ Aligned Packed Integer Values _dqa, /// ___ Unaligned Packed Integer Values @@ -446,7 +449,10 @@ pub const Inst = struct { /// VEX-Encoded Packed ___ Quadword vp_q, /// VEX-Encoded Packed ___ Double Quadword + /// VEX-Encoded Packed ___ Doubleword to Quadword vp_dq, + /// VEX-Encoded Packed ___ Unsigned Doubleword to Quadword + vp_udq, /// VEX-Encoded ___ Scalar Single-Precision Values v_ss, /// VEX-Encoded ___ Packed Single-Precision Values @@ -663,6 +669,8 @@ pub const Inst = struct { /// Multiply scalar single-precision floating-point values /// Multiply packed double-precision floating-point values /// Multiply scalar double-precision floating-point values + /// Multiply packed unsigned doubleword integers + /// Multiply packed doubleword integers mul, /// Two's complement negation neg, diff --git a/src/arch/x86_64/encodings.zon b/src/arch/x86_64/encodings.zon index af126a2792..53c6bcffe1 100644 --- a/src/arch/x86_64/encodings.zon +++ b/src/arch/x86_64/encodings.zon @@ -1160,10 +1160,6 @@ .{ .fistp, .m, .{ .m32 }, .{ 0xdb }, 3, .none, .x87 }, .{ .fistp, .m, .{ .m64 }, .{ 0xdf }, 7, .none, .x87 }, - .{ .fisttp, .m, .{ .m16 }, .{ 0xdf }, 1, .none, .x87 }, - .{ .fisttp, .m, .{ .m32 }, .{ 0xdb }, 1, .none, .x87 }, - .{ .fisttp, .m, .{ .m64 }, .{ 0xdd }, 1, .none, .x87 }, - .{ .fld, .m, .{ .m32 }, .{ 0xd9 }, 0, .none, .x87 }, .{ .fld, .m, .{ .m64 }, .{ 0xdd }, 0, .none, .x87 }, .{ .fld, .m, .{ .m80 }, .{ 0xdb }, 5, .none, .x87 }, @@ -1540,6 +1536,8 @@ .{ .pmullw, .rm, .{ .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0xd5 }, 0, .none, .sse2 }, + .{ .pmuludq, .rm, .{ .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0xf4 }, 0, .none, .sse2 }, + .{ .por, .rm, .{ .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0xeb }, 0, .none, .sse2 }, .{ .pshufd, .rmi, .{ .xmm, .xmm_m128, .imm8 }, .{ 0x66, 0x0f, 0x70 }, 0, .none, .sse2 }, @@ -1618,6 +1616,10 @@ .{ .addsubps, .rm, .{ .xmm, .xmm_m128 }, .{ 0xf2, 0x0f, 0xd0 }, 0, .none, .sse3 }, + .{ .fisttp, .m, .{ .m16 }, .{ 0xdf }, 1, .none, .@"sse3 x87" }, + .{ .fisttp, .m, .{ .m32 }, .{ 0xdb }, 1, .none, .@"sse3 x87" }, + .{ .fisttp, .m, .{ .m64 }, .{ 0xdd }, 1, .none, .@"sse3 x87" }, + .{ .haddpd, .rm, .{ .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0x7c }, 0, .none, .sse3 }, .{ .haddps, .rm, .{ .xmm, .xmm_m128 }, .{ 0xf2, 0x0f, 0x7c }, 0, .none, .sse3 }, @@ -1708,6 +1710,8 @@ .{ .pmovzxwq, .rm, .{ .xmm, .xmm_m32 }, .{ 0x66, 0x0f, 0x38, 0x34 }, 0, .none, .sse4_1 }, .{ .pmovzxdq, .rm, .{ .xmm, .xmm_m64 }, .{ 0x66, 0x0f, 0x38, 0x35 }, 0, .none, .sse4_1 }, + .{ .pmuldq, .rm, .{ .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0x38, 0x28 }, 0, .none, .sse4_1 }, + .{ .pmulld, .rm, .{ .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0x38, 0x40 }, 0, .none, .sse4_1 }, .{ .ptest, .rm, .{ .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0x38, 0x17 }, 0, .none, .sse4_1 }, @@ -2166,12 +2170,16 @@ .{ .vpmovzxwq, .rm, .{ .xmm, .xmm_m32 }, .{ 0x66, 0x0f, 0x38, 0x34 }, 0, .vex_128_wig, .avx }, .{ .vpmovzxdq, .rm, .{ .xmm, .xmm_m64 }, .{ 0x66, 0x0f, 0x38, 0x35 }, 0, .vex_128_wig, .avx }, + .{ .vpmuldq, .rvm, .{ .xmm, .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0x38, 0x28 }, 0, .vex_128_wig, .avx }, + .{ .vpmulhw, .rvm, .{ .xmm, .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0xe5 }, 0, .vex_128_wig, .avx }, .{ .vpmulld, .rvm, .{ .xmm, .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0x38, 0x40 }, 0, .vex_128_wig, .avx }, .{ .vpmullw, .rvm, .{ .xmm, .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0xd5 }, 0, .vex_128_wig, .avx }, + .{ .vpmuludq, .rvm, .{ .xmm, .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0xf4 }, 0, .vex_128_wig, .avx }, + .{ .vpor, .rvm, .{ .xmm, .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0xeb }, 0, .vex_128_wig, .avx }, .{ .vpshufb, .rvm, .{ .xmm, .xmm, .xmm_m128 }, .{ 0x66, 0x0f, 0x38, 0x00 }, 0, .vex_128_wig, .avx }, @@ -2493,12 +2501,16 @@ .{ .vpmovzxwq, .rm, .{ .ymm, .xmm_m64 }, .{ 0x66, 0x0f, 0x38, 0x34 }, 0, .vex_256_wig, .avx2 }, .{ .vpmovzxdq, .rm, .{ .ymm, .xmm_m128 }, .{ 0x66, 0x0f, 0x38, 0x35 }, 0, .vex_256_wig, .avx2 }, + .{ .vpmuldq, .rvm, .{ .ymm, .ymm, .ymm_m256 }, .{ 0x66, 0x0f, 0x38, 0x28 }, 0, .vex_256_wig, .avx2 }, + .{ .vpmulhw, .rvm, .{ .ymm, .ymm, .ymm_m256 }, .{ 0x66, 0x0f, 0xe5 }, 0, .vex_256_wig, .avx2 }, .{ .vpmulld, .rvm, .{ .ymm, .ymm, .ymm_m256 }, .{ 0x66, 0x0f, 0x38, 0x40 }, 0, .vex_256_wig, .avx2 }, .{ .vpmullw, .rvm, .{ .ymm, .ymm, .ymm_m256 }, .{ 0x66, 0x0f, 0xd5 }, 0, .vex_256_wig, .avx2 }, + .{ .vpmuludq, .rvm, .{ .ymm, .ymm, .ymm_m256 }, .{ 0x66, 0x0f, 0xf4 }, 0, .vex_256_wig, .avx2 }, + .{ .vpor, .rvm, .{ .ymm, .ymm, .ymm_m256 }, .{ 0x66, 0x0f, 0xeb }, 0, .vex_256_wig, .avx2 }, .{ .vpshufb, .rvm, .{ .ymm, .ymm, .ymm_m256 }, .{ 0x66, 0x0f, 0x38, 0x00 }, 0, .vex_256_wig, .avx2 }, diff --git a/test/behavior/x86_64/unary.zig b/test/behavior/x86_64/unary.zig index 332bc47be5..e492aad7f9 100644 --- a/test/behavior/x86_64/unary.zig +++ b/test/behavior/x86_64/unary.zig @@ -4889,6 +4889,14 @@ test reduceAdd { try test_reduce_add.testIntVectors(); } +inline fn reduceMul(comptime Type: type, rhs: Type) @typeInfo(Type).vector.child { + return @reduce(.Mul, rhs); +} +test reduceMul { + const test_reduce_mul = unary(reduceMul, .{}); + try test_reduce_mul.testIntVectors(); +} + inline fn splat(comptime Type: type, rhs: Type) Type { return @splat(rhs[0]); }