authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-25 07:30:45-08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2025-01-25 07:30:45-08:00
logd0d5ca2b6c8253c27e945ed8d973a90c28a3cbf5
treed89ef781d3e729f684fa4baf20452f037f66b772
parent8ba3812eeedec643dd045e0fecb8a6697f6253db
parentc7433212d1bf96adbfc6f3d706404436c0c98c20
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #22581 from jacobly0/x86_64-rewrite

x86_64: rewrite `@abs` on floats

21 files changed, 14909 insertions(+), 4705 deletions(-)

lib/std/zig/Zir.zig+23-1
...@@ -2128,7 +2128,7 @@ pub const Inst = struct {...@@ -2128,7 +2128,7 @@ pub const Inst = struct {
2128 ref_start_index = static_len,2128 ref_start_index = static_len,
2129 _,2129 _,
21302130
2131 pub const static_len = 70;2131 pub const static_len = 92;
21322132
2133 pub fn toRef(i: Index) Inst.Ref {2133 pub fn toRef(i: Index) Inst.Ref {
2134 return @enumFromInt(@intFromEnum(Index.ref_start_index) + @intFromEnum(i));2134 return @enumFromInt(@intFromEnum(Index.ref_start_index) + @intFromEnum(i));
...@@ -2211,6 +2211,28 @@ pub const Inst = struct {...@@ -2211,6 +2211,28 @@ pub const Inst = struct {
2211 single_const_pointer_to_comptime_int_type,2211 single_const_pointer_to_comptime_int_type,
2212 slice_const_u8_type,2212 slice_const_u8_type,
2213 slice_const_u8_sentinel_0_type,2213 slice_const_u8_sentinel_0_type,
2214 vector_16_i8_type,
2215 vector_32_i8_type,
2216 vector_16_u8_type,
2217 vector_32_u8_type,
2218 vector_8_i16_type,
2219 vector_16_i16_type,
2220 vector_8_u16_type,
2221 vector_16_u16_type,
2222 vector_4_i32_type,
2223 vector_8_i32_type,
2224 vector_4_u32_type,
2225 vector_8_u32_type,
2226 vector_2_i64_type,
2227 vector_4_i64_type,
2228 vector_2_u64_type,
2229 vector_4_u64_type,
2230 vector_4_f16_type,
2231 vector_8_f16_type,
2232 vector_4_f32_type,
2233 vector_8_f32_type,
2234 vector_2_f64_type,
2235 vector_4_f64_type,
2214 optional_noreturn_type,2236 optional_noreturn_type,
2215 anyerror_void_error_union_type,2237 anyerror_void_error_union_type,
2216 adhoc_inferred_error_set_type,2238 adhoc_inferred_error_set_type,
src/Air.zig+22
...@@ -984,6 +984,28 @@ pub const Inst = struct {...@@ -984,6 +984,28 @@ pub const Inst = struct {
984 single_const_pointer_to_comptime_int_type = @intFromEnum(InternPool.Index.single_const_pointer_to_comptime_int_type),984 single_const_pointer_to_comptime_int_type = @intFromEnum(InternPool.Index.single_const_pointer_to_comptime_int_type),
985 slice_const_u8_type = @intFromEnum(InternPool.Index.slice_const_u8_type),985 slice_const_u8_type = @intFromEnum(InternPool.Index.slice_const_u8_type),
986 slice_const_u8_sentinel_0_type = @intFromEnum(InternPool.Index.slice_const_u8_sentinel_0_type),986 slice_const_u8_sentinel_0_type = @intFromEnum(InternPool.Index.slice_const_u8_sentinel_0_type),
987 vector_16_i8_type = @intFromEnum(InternPool.Index.vector_16_i8_type),
988 vector_32_i8_type = @intFromEnum(InternPool.Index.vector_32_i8_type),
989 vector_16_u8_type = @intFromEnum(InternPool.Index.vector_16_u8_type),
990 vector_32_u8_type = @intFromEnum(InternPool.Index.vector_32_u8_type),
991 vector_8_i16_type = @intFromEnum(InternPool.Index.vector_8_i16_type),
992 vector_16_i16_type = @intFromEnum(InternPool.Index.vector_16_i16_type),
993 vector_8_u16_type = @intFromEnum(InternPool.Index.vector_8_u16_type),
994 vector_16_u16_type = @intFromEnum(InternPool.Index.vector_16_u16_type),
995 vector_4_i32_type = @intFromEnum(InternPool.Index.vector_4_i32_type),
996 vector_8_i32_type = @intFromEnum(InternPool.Index.vector_8_i32_type),
997 vector_4_u32_type = @intFromEnum(InternPool.Index.vector_4_u32_type),
998 vector_8_u32_type = @intFromEnum(InternPool.Index.vector_8_u32_type),
999 vector_2_i64_type = @intFromEnum(InternPool.Index.vector_2_i64_type),
1000 vector_4_i64_type = @intFromEnum(InternPool.Index.vector_4_i64_type),
1001 vector_2_u64_type = @intFromEnum(InternPool.Index.vector_2_u64_type),
1002 vector_4_u64_type = @intFromEnum(InternPool.Index.vector_4_u64_type),
1003 vector_4_f16_type = @intFromEnum(InternPool.Index.vector_4_f16_type),
1004 vector_8_f16_type = @intFromEnum(InternPool.Index.vector_8_f16_type),
1005 vector_4_f32_type = @intFromEnum(InternPool.Index.vector_4_f32_type),
1006 vector_8_f32_type = @intFromEnum(InternPool.Index.vector_8_f32_type),
1007 vector_2_f64_type = @intFromEnum(InternPool.Index.vector_2_f64_type),
1008 vector_4_f64_type = @intFromEnum(InternPool.Index.vector_4_f64_type),
987 optional_noreturn_type = @intFromEnum(InternPool.Index.optional_noreturn_type),1009 optional_noreturn_type = @intFromEnum(InternPool.Index.optional_noreturn_type),
988 anyerror_void_error_union_type = @intFromEnum(InternPool.Index.anyerror_void_error_union_type),1010 anyerror_void_error_union_type = @intFromEnum(InternPool.Index.anyerror_void_error_union_type),
989 adhoc_inferred_error_set_type = @intFromEnum(InternPool.Index.adhoc_inferred_error_set_type),1011 adhoc_inferred_error_set_type = @intFromEnum(InternPool.Index.adhoc_inferred_error_set_type),
src/InternPool.zig+116
...@@ -4559,12 +4559,37 @@ pub const Index = enum(u32) {...@@ -4559,12 +4559,37 @@ pub const Index = enum(u32) {
4559 null_type,4559 null_type,
4560 undefined_type,4560 undefined_type,
4561 enum_literal_type,4561 enum_literal_type,
4562
4562 manyptr_u8_type,4563 manyptr_u8_type,
4563 manyptr_const_u8_type,4564 manyptr_const_u8_type,
4564 manyptr_const_u8_sentinel_0_type,4565 manyptr_const_u8_sentinel_0_type,
4565 single_const_pointer_to_comptime_int_type,4566 single_const_pointer_to_comptime_int_type,
4566 slice_const_u8_type,4567 slice_const_u8_type,
4567 slice_const_u8_sentinel_0_type,4568 slice_const_u8_sentinel_0_type,
4569
4570 vector_16_i8_type,
4571 vector_32_i8_type,
4572 vector_16_u8_type,
4573 vector_32_u8_type,
4574 vector_8_i16_type,
4575 vector_16_i16_type,
4576 vector_8_u16_type,
4577 vector_16_u16_type,
4578 vector_4_i32_type,
4579 vector_8_i32_type,
4580 vector_4_u32_type,
4581 vector_8_u32_type,
4582 vector_2_i64_type,
4583 vector_4_i64_type,
4584 vector_2_u64_type,
4585 vector_4_u64_type,
4586 vector_4_f16_type,
4587 vector_8_f16_type,
4588 vector_4_f32_type,
4589 vector_8_f32_type,
4590 vector_2_f64_type,
4591 vector_4_f64_type,
4592
4568 optional_noreturn_type,4593 optional_noreturn_type,
4569 anyerror_void_error_union_type,4594 anyerror_void_error_union_type,
4570 /// Used for the inferred error set of inline/comptime function calls.4595 /// Used for the inferred error set of inline/comptime function calls.
...@@ -5055,6 +5080,51 @@ pub const static_keys = [_]Key{...@@ -5055,6 +5080,51 @@ pub const static_keys = [_]Key{
5055 },5080 },
5056 } },5081 } },
50575082
5083 // @Vector(16, i8)
5084 .{ .vector_type = .{ .len = 16, .child = .i8_type } },
5085 // @Vector(32, i8)
5086 .{ .vector_type = .{ .len = 32, .child = .i8_type } },
5087 // @Vector(16, u8)
5088 .{ .vector_type = .{ .len = 16, .child = .u8_type } },
5089 // @Vector(32, u8)
5090 .{ .vector_type = .{ .len = 32, .child = .u8_type } },
5091 // @Vector(8, i16)
5092 .{ .vector_type = .{ .len = 8, .child = .i16_type } },
5093 // @Vector(16, i16)
5094 .{ .vector_type = .{ .len = 16, .child = .i16_type } },
5095 // @Vector(8, u16)
5096 .{ .vector_type = .{ .len = 8, .child = .u16_type } },
5097 // @Vector(16, u16)
5098 .{ .vector_type = .{ .len = 16, .child = .u16_type } },
5099 // @Vector(4, i32)
5100 .{ .vector_type = .{ .len = 4, .child = .i32_type } },
5101 // @Vector(8, i32)
5102 .{ .vector_type = .{ .len = 8, .child = .i32_type } },
5103 // @Vector(4, u32)
5104 .{ .vector_type = .{ .len = 4, .child = .u32_type } },
5105 // @Vector(8, u32)
5106 .{ .vector_type = .{ .len = 8, .child = .u32_type } },
5107 // @Vector(2, i64)
5108 .{ .vector_type = .{ .len = 2, .child = .i64_type } },
5109 // @Vector(4, i64)
5110 .{ .vector_type = .{ .len = 4, .child = .i64_type } },
5111 // @Vector(2, u64)
5112 .{ .vector_type = .{ .len = 2, .child = .u64_type } },
5113 // @Vector(8, u64)
5114 .{ .vector_type = .{ .len = 4, .child = .u64_type } },
5115 // @Vector(4, f16)
5116 .{ .vector_type = .{ .len = 4, .child = .f16_type } },
5117 // @Vector(8, f16)
5118 .{ .vector_type = .{ .len = 8, .child = .f16_type } },
5119 // @Vector(4, f32)
5120 .{ .vector_type = .{ .len = 4, .child = .f32_type } },
5121 // @Vector(8, f32)
5122 .{ .vector_type = .{ .len = 8, .child = .f32_type } },
5123 // @Vector(2, f64)
5124 .{ .vector_type = .{ .len = 2, .child = .f64_type } },
5125 // @Vector(4, f64)
5126 .{ .vector_type = .{ .len = 4, .child = .f64_type } },
5127
5058 // ?noreturn5128 // ?noreturn
5059 .{ .opt_type = .noreturn_type },5129 .{ .opt_type = .noreturn_type },
50605130
...@@ -11681,6 +11751,28 @@ pub fn typeOf(ip: *const InternPool, index: Index) Index {...@@ -11681,6 +11751,28 @@ pub fn typeOf(ip: *const InternPool, index: Index) Index {
11681 .single_const_pointer_to_comptime_int_type,11751 .single_const_pointer_to_comptime_int_type,
11682 .slice_const_u8_type,11752 .slice_const_u8_type,
11683 .slice_const_u8_sentinel_0_type,11753 .slice_const_u8_sentinel_0_type,
11754 .vector_16_i8_type,
11755 .vector_32_i8_type,
11756 .vector_16_u8_type,
11757 .vector_32_u8_type,
11758 .vector_8_i16_type,
11759 .vector_16_i16_type,
11760 .vector_8_u16_type,
11761 .vector_16_u16_type,
11762 .vector_4_i32_type,
11763 .vector_8_i32_type,
11764 .vector_4_u32_type,
11765 .vector_8_u32_type,
11766 .vector_2_i64_type,
11767 .vector_4_i64_type,
11768 .vector_2_u64_type,
11769 .vector_4_u64_type,
11770 .vector_4_f16_type,
11771 .vector_8_f16_type,
11772 .vector_4_f32_type,
11773 .vector_8_f32_type,
11774 .vector_2_f64_type,
11775 .vector_4_f64_type,
11684 .optional_noreturn_type,11776 .optional_noreturn_type,
11685 .anyerror_void_error_union_type,11777 .anyerror_void_error_union_type,
11686 .adhoc_inferred_error_set_type,11778 .adhoc_inferred_error_set_type,
...@@ -11998,6 +12090,30 @@ pub fn zigTypeTag(ip: *const InternPool, index: Index) std.builtin.TypeId {...@@ -11998,6 +12090,30 @@ pub fn zigTypeTag(ip: *const InternPool, index: Index) std.builtin.TypeId {
11998 .slice_const_u8_sentinel_0_type,12090 .slice_const_u8_sentinel_0_type,
11999 => .pointer,12091 => .pointer,
1200012092
12093 .vector_16_i8_type,
12094 .vector_32_i8_type,
12095 .vector_16_u8_type,
12096 .vector_32_u8_type,
12097 .vector_8_i16_type,
12098 .vector_16_i16_type,
12099 .vector_8_u16_type,
12100 .vector_16_u16_type,
12101 .vector_4_i32_type,
12102 .vector_8_i32_type,
12103 .vector_4_u32_type,
12104 .vector_8_u32_type,
12105 .vector_2_i64_type,
12106 .vector_4_i64_type,
12107 .vector_2_u64_type,
12108 .vector_4_u64_type,
12109 .vector_4_f16_type,
12110 .vector_8_f16_type,
12111 .vector_4_f32_type,
12112 .vector_8_f32_type,
12113 .vector_2_f64_type,
12114 .vector_4_f64_type,
12115 => .vector,
12116
12001 .optional_noreturn_type => .optional,12117 .optional_noreturn_type => .optional,
12002 .anyerror_void_error_union_type => .error_union,12118 .anyerror_void_error_union_type => .error_union,
12003 .empty_tuple_type => .@"struct",12119 .empty_tuple_type => .@"struct",
src/Sema.zig+22
...@@ -36606,6 +36606,28 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {...@@ -36606,6 +36606,28 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
36606 .single_const_pointer_to_comptime_int_type,36606 .single_const_pointer_to_comptime_int_type,
36607 .slice_const_u8_type,36607 .slice_const_u8_type,
36608 .slice_const_u8_sentinel_0_type,36608 .slice_const_u8_sentinel_0_type,
36609 .vector_16_i8_type,
36610 .vector_32_i8_type,
36611 .vector_16_u8_type,
36612 .vector_32_u8_type,
36613 .vector_8_i16_type,
36614 .vector_16_i16_type,
36615 .vector_8_u16_type,
36616 .vector_16_u16_type,
36617 .vector_4_i32_type,
36618 .vector_8_i32_type,
36619 .vector_4_u32_type,
36620 .vector_8_u32_type,
36621 .vector_2_i64_type,
36622 .vector_4_i64_type,
36623 .vector_2_u64_type,
36624 .vector_4_u64_type,
36625 .vector_4_f16_type,
36626 .vector_8_f16_type,
36627 .vector_4_f32_type,
36628 .vector_8_f32_type,
36629 .vector_2_f64_type,
36630 .vector_4_f64_type,
36609 .anyerror_void_error_union_type,36631 .anyerror_void_error_union_type,
36610 => null,36632 => null,
36611 .void_type => Value.void,36633 .void_type => Value.void,
src/Type.zig+25-1
...@@ -4174,7 +4174,31 @@ pub const single_const_pointer_to_comptime_int: Type = .{...@@ -4174,7 +4174,31 @@ pub const single_const_pointer_to_comptime_int: Type = .{
4174 .ip_index = .single_const_pointer_to_comptime_int_type,4174 .ip_index = .single_const_pointer_to_comptime_int_type,
4175};4175};
4176pub const slice_const_u8_sentinel_0: Type = .{ .ip_index = .slice_const_u8_sentinel_0_type };4176pub const slice_const_u8_sentinel_0: Type = .{ .ip_index = .slice_const_u8_sentinel_0_type };
4177pub const empty_tuple_type: Type = .{ .ip_index = .empty_tuple_type };4177
4178pub const vector_16_i8: Type = .{ .ip_index = .vector_16_i8_type };
4179pub const vector_32_i8: Type = .{ .ip_index = .vector_32_i8_type };
4180pub const vector_16_u8: Type = .{ .ip_index = .vector_16_u8_type };
4181pub const vector_32_u8: Type = .{ .ip_index = .vector_32_u8_type };
4182pub const vector_8_i16: Type = .{ .ip_index = .vector_8_i16_type };
4183pub const vector_16_i16: Type = .{ .ip_index = .vector_16_i16_type };
4184pub const vector_8_u16: Type = .{ .ip_index = .vector_8_u16_type };
4185pub const vector_16_u16: Type = .{ .ip_index = .vector_16_u16_type };
4186pub const vector_4_i32: Type = .{ .ip_index = .vector_4_i32_type };
4187pub const vector_8_i32: Type = .{ .ip_index = .vector_8_i32_type };
4188pub const vector_4_u32: Type = .{ .ip_index = .vector_4_u32_type };
4189pub const vector_8_u32: Type = .{ .ip_index = .vector_8_u32_type };
4190pub const vector_2_i64: Type = .{ .ip_index = .vector_2_i64_type };
4191pub const vector_4_i64: Type = .{ .ip_index = .vector_4_i64_type };
4192pub const vector_2_u64: Type = .{ .ip_index = .vector_2_u64_type };
4193pub const vector_4_u64: Type = .{ .ip_index = .vector_4_u64_type };
4194pub const vector_4_f16: Type = .{ .ip_index = .vector_4_f16_type };
4195pub const vector_8_f16: Type = .{ .ip_index = .vector_8_f16_type };
4196pub const vector_4_f32: Type = .{ .ip_index = .vector_4_f32_type };
4197pub const vector_8_f32: Type = .{ .ip_index = .vector_8_f32_type };
4198pub const vector_2_f64: Type = .{ .ip_index = .vector_2_f64_type };
4199pub const vector_4_f64: Type = .{ .ip_index = .vector_4_f64_type };
4200
4201pub const empty_tuple: Type = .{ .ip_index = .empty_tuple_type };
41784202
4179pub const generic_poison: Type = .{ .ip_index = .generic_poison_type };4203pub const generic_poison: Type = .{ .ip_index = .generic_poison_type };
41804204
src/arch/x86_64/CodeGen.zig+13493-4385
...@@ -150,7 +150,7 @@ const Owner = union(enum) {...@@ -150,7 +150,7 @@ const Owner = union(enum) {
150};150};
151151
152const MaskKind = enum(u1) { sign, all };152const MaskKind = enum(u1) { sign, all };
153const MaskInfo = packed struct { kind: MaskKind, inverted: bool, scalar: Memory.Size };153const MaskInfo = packed struct { kind: MaskKind, inverted: bool = false, scalar: Memory.Size };
154154
155pub const MCValue = union(enum) {155pub const MCValue = union(enum) {
156 /// No runtime bits. `void` types, empty structs, u0, enums with 1 tag, etc.156 /// No runtime bits. `void` types, empty structs, u0, enums with 1 tag, etc.
...@@ -2393,7 +2393,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2393,7 +2393,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2393}2393}
23942394
2395fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {2395fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2396 @setEvalBranchQuota(1_800);2396 @setEvalBranchQuota(3_400);
2397 const pt = cg.pt;2397 const pt = cg.pt;
2398 const zcu = pt.zcu;2398 const zcu = pt.zcu;
2399 const ip = &zcu.intern_pool;2399 const ip = &zcu.intern_pool;
...@@ -2433,17 +2433,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2433,17 +2433,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2433 .add_wrap,2433 .add_wrap,
2434 .sub,2434 .sub,
2435 .sub_wrap,2435 .sub_wrap,
2436 .min,
2437 .max,
2438 => |air_tag| try cg.airBinOp(inst, air_tag),2436 => |air_tag| try cg.airBinOp(inst, air_tag),
24392437
2440 .shr, .shr_exact => try cg.airShlShrBinOp(inst),2438 .shr, .shr_exact => try cg.airShlShrBinOp(inst),
2441 .shl, .shl_exact => try cg.airShlShrBinOp(inst),2439 .shl, .shl_exact => try cg.airShlShrBinOp(inst),
24422440
2443 .mul => try cg.airMulDivBinOp(inst),2441 .mul,
2444 .mul_wrap => try cg.airMulDivBinOp(inst),2442 .mul_wrap,
2445 .rem => try cg.airMulDivBinOp(inst),2443 .rem,
2446 .mod => try cg.airMulDivBinOp(inst),2444 .mod,
2445 .div_float,
2446 .div_trunc,
2447 .div_floor,
2448 .div_exact,
2449 => |air_tag| try cg.airMulDivBinOp(inst, air_tag),
24472450
2448 .add_sat => try cg.airAddSat(inst),2451 .add_sat => try cg.airAddSat(inst),
2449 .sub_sat => try cg.airSubSat(inst),2452 .sub_sat => try cg.airSubSat(inst),
...@@ -2465,15 +2468,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2465,15 +2468,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2465 .ceil => try cg.airRound(inst, .{ .mode = .up, .precision = .inexact }),2468 .ceil => try cg.airRound(inst, .{ .mode = .up, .precision = .inexact }),
2466 .trunc_float => try cg.airRound(inst, .{ .mode = .zero, .precision = .inexact }),2469 .trunc_float => try cg.airRound(inst, .{ .mode = .zero, .precision = .inexact }),
2467 .sqrt => try cg.airSqrt(inst),2470 .sqrt => try cg.airSqrt(inst),
2468 .neg => try cg.airFloatSign(inst),2471 .neg => |air_tag| try cg.airFloatSign(inst, air_tag),
24692472
2470 .add_with_overflow => try cg.airAddSubWithOverflow(inst),2473 .add_with_overflow => try cg.airAddSubWithOverflow(inst),
2471 .sub_with_overflow => try cg.airAddSubWithOverflow(inst),2474 .sub_with_overflow => try cg.airAddSubWithOverflow(inst),
2472 .mul_with_overflow => try cg.airMulWithOverflow(inst),2475 .mul_with_overflow => try cg.airMulWithOverflow(inst),
2473 .shl_with_overflow => try cg.airShlWithOverflow(inst),2476 .shl_with_overflow => try cg.airShlWithOverflow(inst),
24742477
2475 .div_float, .div_trunc, .div_floor, .div_exact => try cg.airMulDivBinOp(inst),
2476
2477 .cmp_lt_errors_len => try cg.airCmpLtErrorsLen(inst),2478 .cmp_lt_errors_len => try cg.airCmpLtErrorsLen(inst),
24782479
2479 .bitcast => try cg.airBitCast(inst),2480 .bitcast => try cg.airBitCast(inst),
...@@ -2528,19 +2529,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2528,19 +2529,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2528 .sub_safe,2529 .sub_safe,
2529 .mul_safe,2530 .mul_safe,
2530 => return cg.fail("TODO implement safety_checked_instructions", .{}),2531 => return cg.fail("TODO implement safety_checked_instructions", .{}),
2531 .add_optimized,2532
2532 .sub_optimized,2533 .add_optimized => try cg.airBinOp(inst, .add),
2533 .mul_optimized,2534 .sub_optimized => try cg.airBinOp(inst, .sub),
2534 .div_float_optimized,2535 .mul_optimized => try cg.airBinOp(inst, .mul),
2535 .div_trunc_optimized,2536 .div_float_optimized => try cg.airMulDivBinOp(inst, .div_float),
2536 .div_floor_optimized,2537 .div_trunc_optimized => try cg.airMulDivBinOp(inst, .div_trunc),
2537 .div_exact_optimized,2538 .div_floor_optimized => try cg.airMulDivBinOp(inst, .div_floor),
2538 .rem_optimized,2539 .div_exact_optimized => try cg.airMulDivBinOp(inst, .div_exact),
2539 .mod_optimized,2540 .rem_optimized => try cg.airMulDivBinOp(inst, .rem),
2540 .neg_optimized,2541 .mod_optimized => try cg.airMulDivBinOp(inst, .mod),
2541 .reduce_optimized,2542 .neg_optimized => try cg.airFloatSign(inst, .neg),
2542 .int_from_float_optimized,2543 .reduce_optimized => try cg.airReduce(inst),
2543 => return cg.fail("TODO implement optimized float mode", .{}),2544 .int_from_float_optimized => try cg.airIntFromFloat(inst),
25442545
2545 .arg => try cg.airDbgArg(inst),2546 .arg => try cg.airDbgArg(inst),
2546 .ptr_add => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else {2547 .ptr_add => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else {
...@@ -2657,10 +2658,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2657,10 +2658,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2657 } else { // hack around Sema OPV bugs2658 } else { // hack around Sema OPV bugs
2658 res[0] = ops[0];2659 res[0] = ops[0];
2659 }2660 }
2660 for (ops) |op| for (res) |r| {2661 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
2661 if (op.index == r.index) break;
2662 } else try op.die(cg);
2663 try res[0].moveTo(inst, cg);
2664 },2662 },
2665 .ptr_sub => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else {2663 .ptr_sub => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else {
2666 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;2664 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
...@@ -2792,673 +2790,451 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2792,673 +2790,451 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2792 // hack around Sema OPV bugs2790 // hack around Sema OPV bugs
2793 res[0] = ops[0];2791 res[0] = ops[0];
2794 }2792 }
2795 for (ops) |op| for (res) |r| {2793 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
2796 if (op.index == r.index) break;
2797 } else try op.die(cg);
2798 try res[0].moveTo(inst, cg);
2799 },
2800 .alloc => if (use_old) try cg.airAlloc(inst) else {
2801 const ty = air_datas[@intFromEnum(inst)].ty;
2802 var slot = try cg.tempInit(ty, .{ .lea_frame = .{
2803 .index = try cg.allocMemPtr(inst),
2804 } });
2805 try slot.moveTo(inst, cg);
2806 },
2807 .inferred_alloc, .inferred_alloc_comptime => unreachable,
2808 .ret_ptr => if (use_old) try cg.airRetPtr(inst) else {
2809 const ty = air_datas[@intFromEnum(inst)].ty;
2810 var slot = switch (cg.ret_mcv.long) {
2811 else => unreachable,
2812 .none => try cg.tempInit(ty, .{ .lea_frame = .{
2813 .index = try cg.allocMemPtr(inst),
2814 } }),
2815 .load_frame => slot: {
2816 var slot = try cg.tempInit(ty, cg.ret_mcv.long);
2817 try slot.toOffset(cg.ret_mcv.short.indirect.off, cg);
2818 break :slot slot;
2819 },
2820 };
2821 try slot.moveTo(inst, cg);
2822 },2794 },
2823 .assembly => try cg.airAsm(inst),2795 .max => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else fallback: {
2824 .bit_and, .bit_or, .xor, .bool_and, .bool_or => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else {
2825 const bin_op = air_datas[@intFromEnum(inst)].bin_op;2796 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
2797 if (cg.typeOf(bin_op.lhs).scalarType(zcu).isRuntimeFloat()) break :fallback try cg.airBinOp(inst, air_tag);
2826 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });2798 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
2827 var res: [1]Temp = undefined;2799 var res: [1]Temp = undefined;
2828 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, switch (@as(Mir.Inst.Tag, switch (air_tag) {2800 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
2829 else => unreachable,2801 .required_features = .{ .cmov, null, null, null },
2830 .bit_and, .bool_and => .@"and",2802 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } },
2831 .bit_or, .bool_or => .@"or",2803 .patterns = &.{
2832 .xor => .xor,2804 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2833 })) {2805 },
2834 else => unreachable,2806 .dst_temps = .{.{ .ref = .src0 }},
2835 inline .@"and", .@"or", .xor => |mir_tag| comptime &.{ .{2807 .clobbers = .{ .eflags = true },
2836 .src_constraints = .{ .{ .size = .byte }, .{ .size = .byte } },2808 .each = .{ .once = &.{
2837 .patterns = &.{2809 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
2838 .{ .src = .{ .mut_mem, .imm8 } },2810 .{ ._, ._l, .cmov, .dst0d, .src1d, ._, ._ },
2839 .{ .src = .{ .imm8, .mut_mem }, .commute = .{ 0, 1 } },
2840 .{ .src = .{ .to_mut_gpr, .imm8 } },
2841 .{ .src = .{ .imm8, .to_mut_gpr }, .commute = .{ 0, 1 } },
2842 .{ .src = .{ .mut_mem, .to_gpr } },
2843 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
2844 .{ .src = .{ .to_mut_gpr, .mem } },
2845 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2846 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2847 },
2848 .dst_temps = .{.{ .ref = .src0 }},
2849 .clobbers = .{ .eflags = true },
2850 .each = .{ .once = &.{
2851 .{ ._, ._, mir_tag, .dst0b, .src1b, ._, ._ },
2852 } },
2853 }, .{
2854 .src_constraints = .{ .{ .size = .word }, .{ .size = .word } },
2855 .patterns = &.{
2856 .{ .src = .{ .mut_mem, .imm16 } },
2857 .{ .src = .{ .imm16, .mut_mem }, .commute = .{ 0, 1 } },
2858 .{ .src = .{ .to_mut_gpr, .imm16 } },
2859 .{ .src = .{ .imm16, .to_mut_gpr }, .commute = .{ 0, 1 } },
2860 .{ .src = .{ .mut_mem, .to_gpr } },
2861 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
2862 .{ .src = .{ .to_mut_gpr, .mem } },
2863 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2864 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2865 },
2866 .dst_temps = .{.{ .ref = .src0 }},
2867 .clobbers = .{ .eflags = true },
2868 .each = .{ .once = &.{
2869 .{ ._, ._, mir_tag, .dst0w, .src1w, ._, ._ },
2870 } },
2871 }, .{
2872 .src_constraints = .{ .{ .size = .dword }, .{ .size = .dword } },
2873 .patterns = &.{
2874 .{ .src = .{ .mut_mem, .imm32 } },
2875 .{ .src = .{ .imm32, .mut_mem }, .commute = .{ 0, 1 } },
2876 .{ .src = .{ .to_mut_gpr, .imm32 } },
2877 .{ .src = .{ .imm32, .to_mut_gpr }, .commute = .{ 0, 1 } },
2878 .{ .src = .{ .mut_mem, .to_gpr } },
2879 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
2880 .{ .src = .{ .to_mut_gpr, .mem } },
2881 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2882 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2883 },
2884 .dst_temps = .{.{ .ref = .src0 }},
2885 .clobbers = .{ .eflags = true },
2886 .each = .{ .once = &.{
2887 .{ ._, ._, mir_tag, .dst0d, .src1d, ._, ._ },
2888 } },
2889 }, .{
2890 .required_features = .{ .@"64bit", null, null, null },
2891 .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword } },
2892 .patterns = &.{
2893 .{ .src = .{ .mut_mem, .simm32 } },
2894 .{ .src = .{ .simm32, .mut_mem }, .commute = .{ 0, 1 } },
2895 .{ .src = .{ .to_mut_gpr, .simm32 } },
2896 .{ .src = .{ .simm32, .to_mut_gpr }, .commute = .{ 0, 1 } },
2897 .{ .src = .{ .mut_mem, .to_gpr } },
2898 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
2899 .{ .src = .{ .to_mut_gpr, .mem } },
2900 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2901 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2902 },
2903 .dst_temps = .{.{ .ref = .src0 }},
2904 .clobbers = .{ .eflags = true },
2905 .each = .{ .once = &.{
2906 .{ ._, ._, mir_tag, .dst0q, .src1q, ._, ._ },
2907 } },
2908 }, .{
2909 .required_features = .{ .mmx, null, null, null },
2910 .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword } },
2911 .patterns = &.{
2912 .{ .src = .{ .to_mut_mm, .mem } },
2913 .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } },
2914 .{ .src = .{ .to_mut_mm, .to_mm } },
2915 },
2916 .dst_temps = .{.{ .ref = .src0 }},
2917 .each = .{ .once = &.{
2918 .{ ._, .p_, mir_tag, .dst0q, .src1q, ._, ._ },
2919 } },
2920 }, .{
2921 .required_features = .{ .avx, null, null, null },
2922 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } },
2923 .patterns = &.{
2924 .{ .src = .{ .to_xmm, .mem } },
2925 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
2926 .{ .src = .{ .to_xmm, .to_xmm } },
2927 },
2928 .dst_temps = .{.{ .rc = .sse }},
2929 .each = .{ .once = &.{
2930 .{ ._, .vp_, mir_tag, .dst0x, .src0x, .src1x, ._ },
2931 } },
2932 }, .{
2933 .required_features = .{ .sse2, null, null, null },
2934 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } },
2935 .patterns = &.{
2936 .{ .src = .{ .to_mut_xmm, .mem } },
2937 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
2938 .{ .src = .{ .to_mut_xmm, .to_xmm } },
2939 },
2940 .dst_temps = .{.{ .ref = .src0 }},
2941 .each = .{ .once = &.{
2942 .{ ._, .p_, mir_tag, .dst0x, .src1x, ._, ._ },
2943 } },
2944 }, .{
2945 .required_features = .{ .sse, null, null, null },
2946 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } },
2947 .patterns = &.{
2948 .{ .src = .{ .to_mut_xmm, .mem } },
2949 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
2950 .{ .src = .{ .to_mut_xmm, .to_xmm } },
2951 },
2952 .dst_temps = .{.{ .ref = .src0 }},
2953 .each = .{ .once = &.{
2954 .{ ._, ._ps, mir_tag, .dst0x, .src1x, ._, ._ },
2955 } },
2956 }, .{
2957 .required_features = .{ .avx2, null, null, null },
2958 .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword } },
2959 .patterns = &.{
2960 .{ .src = .{ .to_ymm, .mem } },
2961 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
2962 .{ .src = .{ .to_ymm, .to_ymm } },
2963 },
2964 .dst_temps = .{.{ .rc = .sse }},
2965 .each = .{ .once = &.{
2966 .{ ._, .vp_, mir_tag, .dst0y, .src0y, .src1y, ._ },
2967 } },
2968 }, .{
2969 .required_features = .{ .avx, null, null, null },
2970 .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword } },
2971 .patterns = &.{
2972 .{ .src = .{ .to_ymm, .mem } },
2973 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
2974 .{ .src = .{ .to_ymm, .to_ymm } },
2975 },
2976 .dst_temps = .{.{ .rc = .sse }},
2977 .each = .{ .once = &.{
2978 .{ ._, .v_pd, mir_tag, .dst0y, .src0y, .src1y, ._ },
2979 } },
2980 }, .{
2981 .required_features = .{ .avx2, null, null, null },
2982 .src_constraints = .{ .{ .multiple_size = .yword }, .{ .multiple_size = .yword } },
2983 .patterns = &.{
2984 .{ .src = .{ .to_mem, .to_mem } },
2985 },
2986 .extra_temps = .{
2987 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2988 .{ .kind = .{ .rc = .sse } },
2989 .unused,
2990 .unused,
2991 .unused,
2992 .unused,
2993 },
2994 .dst_temps = .{.mem},
2995 .clobbers = .{ .eflags = true },
2996 .each = .{ .once = &.{
2997 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
2998 .{ .@"0:", .v_dqu, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
2999 .{ ._, .vp_, mir_tag, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
3000 .{ ._, .v_dqu, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
3001 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3002 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3003 } },
3004 }, .{
3005 .required_features = .{ .avx, null, null, null },
3006 .src_constraints = .{ .{ .multiple_size = .yword }, .{ .multiple_size = .yword } },
3007 .patterns = &.{
3008 .{ .src = .{ .to_mem, .to_mem } },
3009 },
3010 .extra_temps = .{
3011 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3012 .{ .kind = .{ .rc = .sse } },
3013 .unused,
3014 .unused,
3015 .unused,
3016 .unused,
3017 },
3018 .dst_temps = .{.mem},
3019 .clobbers = .{ .eflags = true },
3020 .each = .{ .once = &.{
3021 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3022 .{ .@"0:", .v_pd, .movu, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3023 .{ ._, .v_pd, mir_tag, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
3024 .{ ._, .v_pd, .movu, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
3025 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3026 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3027 } },
3028 }, .{
3029 .required_features = .{ .avx, null, null, null },
3030 .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } },
3031 .patterns = &.{
3032 .{ .src = .{ .to_mem, .to_mem } },
3033 },
3034 .extra_temps = .{
3035 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3036 .{ .kind = .{ .rc = .sse } },
3037 .unused,
3038 .unused,
3039 .unused,
3040 .unused,
3041 },
3042 .dst_temps = .{.mem},
3043 .clobbers = .{ .eflags = true },
3044 .each = .{ .once = &.{
3045 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3046 .{ .@"0:", .v_dqu, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3047 .{ ._, .vp_, mir_tag, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
3048 .{ ._, .v_dqu, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3049 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3050 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3051 } },
3052 }, .{
3053 .required_features = .{ .sse2, null, null, null },
3054 .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } },
3055 .patterns = &.{
3056 .{ .src = .{ .to_mem, .to_mem } },
3057 },
3058 .extra_temps = .{
3059 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3060 .{ .kind = .{ .rc = .sse } },
3061 .unused,
3062 .unused,
3063 .unused,
3064 .unused,
3065 },
3066 .dst_temps = .{.mem},
3067 .clobbers = .{ .eflags = true },
3068 .each = .{ .once = &.{
3069 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3070 .{ .@"0:", ._dqu, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3071 .{ ._, .p_, mir_tag, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3072 .{ ._, ._dqu, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3073 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3074 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3075 } },
3076 }, .{
3077 .required_features = .{ .sse, null, null, null },
3078 .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } },
3079 .patterns = &.{
3080 .{ .src = .{ .to_mem, .to_mem } },
3081 },
3082 .extra_temps = .{
3083 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3084 .{ .kind = .{ .rc = .sse } },
3085 .unused,
3086 .unused,
3087 .unused,
3088 .unused,
3089 },
3090 .dst_temps = .{.mem},
3091 .clobbers = .{ .eflags = true },
3092 .each = .{ .once = &.{
3093 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3094 .{ .@"0:", ._ps, .movu, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3095 .{ ._, ._ps, mir_tag, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3096 .{ ._, ._ps, .movu, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3097 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3098 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3099 } },
3100 }, .{
3101 .required_features = .{ .mmx, null, null, null },
3102 .src_constraints = .{ .{ .multiple_size = .qword }, .{ .multiple_size = .qword } },
3103 .patterns = &.{
3104 .{ .src = .{ .to_mem, .to_mem } },
3105 },
3106 .extra_temps = .{
3107 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3108 .{ .kind = .{ .rc = .mmx } },
3109 .unused,
3110 .unused,
3111 .unused,
3112 .unused,
3113 },
3114 .dst_temps = .{.mem},
3115 .clobbers = .{ .eflags = true },
3116 .each = .{ .once = &.{
3117 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3118 .{ .@"0:", ._q, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
3119 .{ ._, .p_, mir_tag, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
3120 .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
3121 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
3122 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3123 } },
3124 }, .{
3125 .src_constraints = .{ .{ .multiple_size = .qword }, .{ .multiple_size = .qword } },
3126 .patterns = &.{
3127 .{ .src = .{ .to_mem, .to_mem } },
3128 },
3129 .extra_temps = .{
3130 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3131 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3132 .unused,
3133 .unused,
3134 .unused,
3135 .unused,
3136 },
3137 .dst_temps = .{.mem},
3138 .clobbers = .{ .eflags = true },
3139 .each = .{ .once = &.{
3140 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3141 .{ .@"0:", ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
3142 .{ ._, ._, mir_tag, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
3143 .{ ._, ._, .mov, .memia(.dst0p, .tmp0, .add_size), .tmp1p, ._, ._ },
3144 .{ ._, ._, .add, .tmp0p, .sa(.tmp1, .add_size), ._, ._ },
3145 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3146 } },
3147 } },2811 } },
3148 }) catch |err| switch (err) {2812 }, .{
3149 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{2813 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } },
3150 @tagName(air_tag),
3151 cg.typeOf(bin_op.lhs).fmt(pt),
3152 ops[0].tracking(cg),
3153 ops[1].tracking(cg),
3154 }),
3155 else => |e| return e,
3156 };
3157 for (ops) |op| for (res) |r| {
3158 if (op.index == r.index) break;
3159 } else try op.die(cg);
3160 try res[0].moveTo(inst, cg);
3161 },
3162 .not => |air_tag| if (use_old) try cg.airUnOp(inst, air_tag) else {
3163 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
3164 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
3165 var res: [1]Temp = undefined;
3166 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{
3167 .src_constraints = .{ .{ .signed_or_exact_int = .byte }, .any },
3168 .patterns = &.{2814 .patterns = &.{
3169 .{ .src = .{ .mut_mem, .none } },2815 .{ .src = .{ .to_mut_gpr, .mem } },
3170 .{ .src = .{ .to_mut_gpr, .none } },2816 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2817 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3171 },2818 },
3172 .dst_temps = .{.{ .ref = .src0 }},2819 .dst_temps = .{.{ .ref = .src0 }},
2820 .clobbers = .{ .eflags = true },
3173 .each = .{ .once = &.{2821 .each = .{ .once = &.{
3174 .{ ._, ._, .not, .dst0b, ._, ._, ._ },2822 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
2823 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
2824 .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ },
3175 } },2825 } },
3176 }, .{2826 }, .{
3177 .src_constraints = .{ .{ .unsigned_int = .byte }, .any },2827 .required_features = .{ .cmov, null, null, null },
2828 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } },
3178 .patterns = &.{2829 .patterns = &.{
3179 .{ .src = .{ .mut_mem, .none } },2830 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3180 .{ .src = .{ .to_mut_gpr, .none } },
3181 },2831 },
3182 .dst_temps = .{.{ .ref = .src0 }},2832 .dst_temps = .{.{ .ref = .src0 }},
3183 .clobbers = .{ .eflags = true },2833 .clobbers = .{ .eflags = true },
3184 .each = .{ .once = &.{2834 .each = .{ .once = &.{
3185 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_umax), ._, ._ },2835 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
2836 .{ ._, ._b, .cmov, .dst0d, .src1d, ._, ._ },
3186 } },2837 } },
3187 }, .{2838 }, .{
3188 .src_constraints = .{ .{ .signed_or_exact_int = .word }, .any },2839 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } },
3189 .patterns = &.{2840 .patterns = &.{
3190 .{ .src = .{ .mut_mem, .none } },2841 .{ .src = .{ .to_mut_gpr, .mem } },
3191 .{ .src = .{ .to_mut_gpr, .none } },2842 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2843 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3192 },2844 },
3193 .dst_temps = .{.{ .ref = .src0 }},2845 .dst_temps = .{.{ .ref = .src0 }},
2846 .clobbers = .{ .eflags = true },
3194 .each = .{ .once = &.{2847 .each = .{ .once = &.{
3195 .{ ._, ._, .not, .dst0w, ._, ._, ._ },2848 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
2849 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
2850 .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ },
3196 } },2851 } },
3197 }, .{2852 }, .{
3198 .src_constraints = .{ .{ .unsigned_int = .word }, .any },2853 .required_features = .{ .cmov, null, null, null },
2854 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } },
3199 .patterns = &.{2855 .patterns = &.{
3200 .{ .src = .{ .mut_mem, .none } },2856 .{ .src = .{ .to_mut_gpr, .mem } },
3201 .{ .src = .{ .to_mut_gpr, .none } },2857 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2858 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3202 },2859 },
3203 .dst_temps = .{.{ .ref = .src0 }},2860 .dst_temps = .{.{ .ref = .src0 }},
3204 .clobbers = .{ .eflags = true },2861 .clobbers = .{ .eflags = true },
3205 .each = .{ .once = &.{2862 .each = .{ .once = &.{
3206 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_umax), ._, ._ },2863 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
2864 .{ ._, ._l, .cmov, .dst0w, .src1w, ._, ._ },
3207 } },2865 } },
3208 }, .{2866 }, .{
3209 .src_constraints = .{ .{ .signed_or_exact_int = .dword }, .any },2867 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } },
3210 .patterns = &.{2868 .patterns = &.{
3211 .{ .src = .{ .mut_mem, .none } },2869 .{ .src = .{ .to_mut_gpr, .mem } },
3212 .{ .src = .{ .to_mut_gpr, .none } },2870 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2871 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3213 },2872 },
3214 .dst_temps = .{.{ .ref = .src0 }},2873 .dst_temps = .{.{ .ref = .src0 }},
2874 .clobbers = .{ .eflags = true },
3215 .each = .{ .once = &.{2875 .each = .{ .once = &.{
3216 .{ ._, ._, .not, .dst0d, ._, ._, ._ },2876 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
2877 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
2878 .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ },
3217 } },2879 } },
3218 }, .{2880 }, .{
3219 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },2881 .required_features = .{ .cmov, null, null, null },
2882 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } },
3220 .patterns = &.{2883 .patterns = &.{
3221 .{ .src = .{ .mut_mem, .none } },2884 .{ .src = .{ .to_mut_gpr, .mem } },
3222 .{ .src = .{ .to_mut_gpr, .none } },2885 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2886 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3223 },2887 },
3224 .dst_temps = .{.{ .ref = .src0 }},2888 .dst_temps = .{.{ .ref = .src0 }},
3225 .clobbers = .{ .eflags = true },2889 .clobbers = .{ .eflags = true },
3226 .each = .{ .once = &.{2890 .each = .{ .once = &.{
3227 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_umax), ._, ._ },2891 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
2892 .{ ._, ._b, .cmov, .dst0w, .src1w, ._, ._ },
3228 } },2893 } },
3229 }, .{2894 }, .{
3230 .required_features = .{ .@"64bit", null, null, null },2895 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } },
3231 .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any },
3232 .patterns = &.{2896 .patterns = &.{
3233 .{ .src = .{ .mut_mem, .none } },2897 .{ .src = .{ .to_mut_gpr, .mem } },
3234 .{ .src = .{ .to_mut_gpr, .none } },2898 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2899 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3235 },2900 },
3236 .dst_temps = .{.{ .ref = .src0 }},2901 .dst_temps = .{.{ .ref = .src0 }},
2902 .clobbers = .{ .eflags = true },
3237 .each = .{ .once = &.{2903 .each = .{ .once = &.{
3238 .{ ._, ._, .not, .dst0q, ._, ._, ._ },2904 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
2905 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
2906 .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ },
3239 } },2907 } },
3240 }, .{2908 }, .{
3241 .required_features = .{ .@"64bit", null, null, null },2909 .required_features = .{ .cmov, null, null, null },
3242 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },2910 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } },
3243 .patterns = &.{2911 .patterns = &.{
3244 .{ .src = .{ .mem, .none } },2912 .{ .src = .{ .to_mut_gpr, .mem } },
3245 .{ .src = .{ .to_gpr, .none } },2913 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2914 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3246 },2915 },
3247 .dst_temps = .{.{ .rc = .general_purpose }},2916 .dst_temps = .{.{ .ref = .src0 }},
2917 .clobbers = .{ .eflags = true },
3248 .each = .{ .once = &.{2918 .each = .{ .once = &.{
3249 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },2919 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
3250 .{ ._, ._, .xor, .dst0q, .src0q, ._, ._ },2920 .{ ._, ._l, .cmov, .dst0d, .src1d, ._, ._ },
3251 } },2921 } },
3252 }, .{2922 }, .{
3253 .required_features = .{ .mmx, null, null, null },2923 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } },
3254 .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any },
3255 .patterns = &.{2924 .patterns = &.{
3256 .{ .src = .{ .mem, .none } },2925 .{ .src = .{ .to_mut_gpr, .mem } },
3257 .{ .src = .{ .to_mm, .none } },2926 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2927 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3258 },2928 },
3259 .dst_temps = .{.{ .rc = .mmx }},2929 .dst_temps = .{.{ .ref = .src0 }},
2930 .clobbers = .{ .eflags = true },
3260 .each = .{ .once = &.{2931 .each = .{ .once = &.{
3261 .{ ._, .p_d, .cmpeq, .dst0q, .dst0q, ._, ._ },2932 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
3262 .{ ._, .p_, .xor, .dst0q, .src0q, ._, ._ },2933 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
2934 .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ },
3263 } },2935 } },
3264 }, .{2936 }, .{
3265 .required_features = .{ .mmx, null, null, null },2937 .required_features = .{ .cmov, null, null, null },
3266 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },2938 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } },
3267 .patterns = &.{2939 .patterns = &.{
3268 .{ .src = .{ .to_mut_mm, .none } },2940 .{ .src = .{ .to_mut_gpr, .mem } },
2941 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2942 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3269 },2943 },
3270 .extra_temps = .{2944 .dst_temps = .{.{ .ref = .src0 }},
3271 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2945 .clobbers = .{ .eflags = true },
3272 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },2946 .each = .{ .once = &.{
3273 .unused,2947 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
3274 .unused,2948 .{ ._, ._b, .cmov, .dst0d, .src1d, ._, ._ },
3275 .unused,2949 } },
3276 .unused,2950 }, .{
2951 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } },
2952 .patterns = &.{
2953 .{ .src = .{ .to_mut_gpr, .mem } },
2954 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2955 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3277 },2956 },
3278 .dst_temps = .{.{ .ref = .src0 }},2957 .dst_temps = .{.{ .ref = .src0 }},
2958 .clobbers = .{ .eflags = true },
3279 .each = .{ .once = &.{2959 .each = .{ .once = &.{
3280 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },2960 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
3281 .{ ._, .p_, .xor, .dst0q, .lea(.qword, .tmp0), ._, ._ },2961 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
2962 .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ },
3282 } },2963 } },
3283 }, .{2964 }, .{
3284 .required_features = .{ .avx, null, null, null },2965 .required_features = .{ .@"64bit", .cmov, null, null },
3285 .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any },2966 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } },
3286 .patterns = &.{2967 .patterns = &.{
3287 .{ .src = .{ .mem, .none } },2968 .{ .src = .{ .to_mut_gpr, .mem } },
3288 .{ .src = .{ .to_xmm, .none } },2969 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2970 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3289 },2971 },
3290 .dst_temps = .{.{ .rc = .sse }},2972 .dst_temps = .{.{ .ref = .src0 }},
2973 .clobbers = .{ .eflags = true },
3291 .each = .{ .once = &.{2974 .each = .{ .once = &.{
3292 .{ ._, .vp_q, .cmpeq, .dst0x, .dst0x, .dst0x, ._ },2975 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
3293 .{ ._, .vp_, .xor, .dst0x, .dst0x, .src0x, ._ },2976 .{ ._, ._l, .cmov, .dst0q, .src1q, ._, ._ },
3294 } },2977 } },
3295 }, .{2978 }, .{
3296 .required_features = .{ .avx, null, null, null },2979 .required_features = .{ .@"64bit", null, null, null },
3297 .src_constraints = .{ .{ .unsigned_int = .xword }, .any },2980 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } },
3298 .patterns = &.{2981 .patterns = &.{
3299 .{ .src = .{ .to_xmm, .none } },2982 .{ .src = .{ .to_mut_gpr, .mem } },
2983 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2984 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3300 },2985 },
3301 .extra_temps = .{2986 .dst_temps = .{.{ .ref = .src0 }},
3302 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },2987 .clobbers = .{ .eflags = true },
3303 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },2988 .each = .{ .once = &.{
3304 .unused,2989 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
3305 .unused,2990 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
3306 .unused,2991 .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ },
3307 .unused,2992 } },
2993 }, .{
2994 .required_features = .{ .@"64bit", .cmov, null, null },
2995 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } },
2996 .patterns = &.{
2997 .{ .src = .{ .to_mut_gpr, .mem } },
2998 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2999 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3308 },3000 },
3309 .dst_temps = .{.{ .rc = .sse }},3001 .dst_temps = .{.{ .ref = .src0 }},
3002 .clobbers = .{ .eflags = true },
3310 .each = .{ .once = &.{3003 .each = .{ .once = &.{
3311 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },3004 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
3312 .{ ._, .vp_, .xor, .dst0x, .src0x, .lea(.xword, .tmp0), ._ },3005 .{ ._, ._b, .cmov, .dst0q, .src1q, ._, ._ },
3313 } },3006 } },
3314 }, .{3007 }, .{
3315 .required_features = .{ .sse2, null, null, null },3008 .required_features = .{ .@"64bit", null, null, null },
3316 .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any },3009 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } },
3317 .patterns = &.{3010 .patterns = &.{
3318 .{ .src = .{ .mem, .none } },3011 .{ .src = .{ .to_mut_gpr, .mem } },
3319 .{ .src = .{ .to_xmm, .none } },3012 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
3013 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3320 },3014 },
3321 .dst_temps = .{.{ .rc = .sse }},3015 .dst_temps = .{.{ .ref = .src0 }},
3016 .clobbers = .{ .eflags = true },
3322 .each = .{ .once = &.{3017 .each = .{ .once = &.{
3323 .{ ._, .p_d, .cmpeq, .dst0x, .dst0x, ._, ._ },3018 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
3324 .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ },3019 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
3020 .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ },
3325 } },3021 } },
3326 }, .{3022 }, .{
3327 .required_features = .{ .sse2, null, null, null },3023 .required_features = .{ .@"64bit", .cmov, null, null },
3328 .src_constraints = .{ .{ .unsigned_int = .xword }, .any },3024 .src_constraints = .{ .any_signed_int, .any_signed_int },
3329 .patterns = &.{3025 .patterns = &.{
3330 .{ .src = .{ .to_mut_xmm, .none } },3026 .{ .src = .{ .to_mem, .to_mem } },
3331 },3027 },
3332 .extra_temps = .{3028 .extra_temps = .{
3333 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3029 .{ .type = .isize, .kind = .{ .reg = .rsi } },
3334 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },3030 .{ .type = .u64, .kind = .{ .reg = .rdi } },
3031 .{ .type = .u64, .kind = .{ .reg = .rcx } },
3032 .unused,
3033 .unused,
3335 .unused,3034 .unused,
3336 .unused,3035 .unused,
3337 .unused,3036 .unused,
3338 .unused,3037 .unused,
3339 },3038 },
3340 .dst_temps = .{.{ .ref = .src0 }},3039 .dst_temps = .{.mem},
3040 .clobbers = .{ .eflags = true },
3341 .each = .{ .once = &.{3041 .each = .{ .once = &.{
3342 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },3042 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
3343 .{ ._, .p_, .xor, .dst0x, .lea(.xword, .tmp0), ._, ._ },3043 .{ ._, ._c, .cl, ._, ._, ._, ._ },
3044 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
3045 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
3046 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3047 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3048 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
3049 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
3050 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
3051 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
3052 .{ ._, ._l, .cmov, .tmp0p, .tmp1p, ._, ._ },
3053 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
3054 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
3055 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
3344 } },3056 } },
3345 }, .{3057 }, .{
3346 .required_features = .{ .sse, null, null, null },3058 .required_features = .{ .@"64bit", null, null, null },
3347 .src_constraints = .{ .{ .int = .xword }, .any },3059 .src_constraints = .{ .any_signed_int, .any_signed_int },
3348 .patterns = &.{3060 .patterns = &.{
3349 .{ .src = .{ .to_mut_xmm, .none } },3061 .{ .src = .{ .to_mem, .to_mem } },
3350 },3062 },
3351 .extra_temps = .{3063 .extra_temps = .{
3352 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3064 .{ .type = .isize, .kind = .{ .reg = .rsi } },
3353 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },3065 .{ .type = .u64, .kind = .{ .reg = .rdi } },
3066 .{ .type = .u64, .kind = .{ .reg = .rcx } },
3067 .unused,
3068 .unused,
3354 .unused,3069 .unused,
3355 .unused,3070 .unused,
3356 .unused,3071 .unused,
3357 .unused,3072 .unused,
3358 },3073 },
3359 .dst_temps = .{.{ .ref = .src0 }},3074 .dst_temps = .{.mem},
3075 .clobbers = .{ .eflags = true },
3360 .each = .{ .once = &.{3076 .each = .{ .once = &.{
3361 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },3077 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
3362 .{ ._, ._ps, .xor, .dst0x, .lea(.xword, .tmp0), ._, ._ },3078 .{ ._, ._c, .cl, ._, ._, ._, ._ },
3079 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
3080 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
3081 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3082 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3083 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
3084 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
3085 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
3086 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
3087 .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ },
3088 .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
3089 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
3090 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
3363 } },3091 } },
3364 }, .{3092 }, .{
3365 .required_features = .{ .avx2, null, null, null },3093 .required_features = .{ .@"64bit", .cmov, null, null },
3366 .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any },3094 .src_constraints = .{ .any_unsigned_int, .any_unsigned_int },
3367 .patterns = &.{3095 .patterns = &.{
3368 .{ .src = .{ .mem, .none } },3096 .{ .src = .{ .to_mem, .to_mem } },
3369 .{ .src = .{ .to_ymm, .none } },
3370 },3097 },
3371 .dst_temps = .{.{ .rc = .sse }},3098 .extra_temps = .{
3099 .{ .type = .isize, .kind = .{ .reg = .rsi } },
3100 .{ .type = .u64, .kind = .{ .reg = .rdi } },
3101 .{ .type = .u64, .kind = .{ .reg = .rcx } },
3102 .unused,
3103 .unused,
3104 .unused,
3105 .unused,
3106 .unused,
3107 .unused,
3108 },
3109 .dst_temps = .{.mem},
3110 .clobbers = .{ .eflags = true },
3372 .each = .{ .once = &.{3111 .each = .{ .once = &.{
3373 .{ ._, .vp_q, .cmpeq, .dst0y, .dst0y, .dst0y, ._ },3112 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
3374 .{ ._, .vp_, .xor, .dst0y, .dst0y, .src0y, ._ },3113 .{ ._, ._c, .cl, ._, ._, ._, ._ },
3114 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
3115 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
3116 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3117 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3118 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
3119 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
3120 .{ ._, ._b, .cmov, .tmp0p, .tmp1p, ._, ._ },
3121 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
3122 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
3123 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
3375 } },3124 } },
3376 }, .{3125 }, .{
3377 .required_features = .{ .avx2, null, null, null },3126 .required_features = .{ .@"64bit", null, null, null },
3378 .src_constraints = .{ .{ .unsigned_int = .yword }, .any },3127 .src_constraints = .{ .any_unsigned_int, .any_unsigned_int },
3379 .patterns = &.{3128 .patterns = &.{
3380 .{ .src = .{ .to_ymm, .none } },3129 .{ .src = .{ .to_mem, .to_mem } },
3381 },3130 },
3382 .extra_temps = .{3131 .extra_temps = .{
3383 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3132 .{ .type = .isize, .kind = .{ .reg = .rsi } },
3384 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },3133 .{ .type = .u64, .kind = .{ .reg = .rdi } },
3134 .{ .type = .u64, .kind = .{ .reg = .rcx } },
3135 .unused,
3136 .unused,
3385 .unused,3137 .unused,
3386 .unused,3138 .unused,
3387 .unused,3139 .unused,
3388 .unused,3140 .unused,
3389 },3141 },
3390 .dst_temps = .{.{ .rc = .sse }},3142 .dst_temps = .{.mem},
3143 .clobbers = .{ .eflags = true },
3391 .each = .{ .once = &.{3144 .each = .{ .once = &.{
3392 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },3145 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
3393 .{ ._, .vp_, .xor, .dst0y, .src0y, .lea(.yword, .tmp0), ._ },3146 .{ ._, ._c, .cl, ._, ._, ._, ._ },
3147 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
3148 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
3149 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3150 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3151 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
3152 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
3153 .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ },
3154 .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
3155 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
3156 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
3394 } },3157 } },
3395 }, .{3158 }, .{
3396 .required_features = .{ .avx, null, null, null },3159 .required_features = .{ .avx, null, null, null },
3397 .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any },3160 .src_constraints = .{
3161 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3162 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3163 },
3398 .patterns = &.{3164 .patterns = &.{
3399 .{ .src = .{ .mem, .none } },3165 .{ .src = .{ .to_sse, .mem } },
3400 .{ .src = .{ .to_ymm, .none } },3166 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3167 .{ .src = .{ .to_sse, .to_sse } },
3401 },3168 },
3402 .dst_temps = .{.{ .rc = .sse }},3169 .dst_temps = .{.{ .rc = .sse }},
3403 .each = .{ .once = &.{3170 .each = .{ .once = &.{
3404 .{ ._, .v_pd, .cmp, .dst0y, .dst0y, .dst0y, .si(0b01111) },3171 .{ ._, .vp_b, .maxs, .dst0x, .src0x, .src1x, ._ },
3405 .{ ._, .v_pd, .xor, .dst0y, .dst0y, .src0y, ._ },
3406 } },3172 } },
3407 }, .{3173 }, .{
3408 .required_features = .{ .avx, null, null, null },3174 .required_features = .{ .sse4_1, null, null, null },
3409 .src_constraints = .{ .{ .unsigned_int = .yword }, .any },3175 .src_constraints = .{
3176 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3177 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3178 },
3410 .patterns = &.{3179 .patterns = &.{
3411 .{ .src = .{ .to_ymm, .none } },3180 .{ .src = .{ .to_mut_sse, .mem } },
3181 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
3182 .{ .src = .{ .to_mut_sse, .to_sse } },
3412 },3183 },
3413 .extra_temps = .{3184 .dst_temps = .{.{ .ref = .src0 }},
3414 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3185 .each = .{ .once = &.{
3415 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },3186 .{ ._, .p_b, .maxs, .dst0x, .src1x, ._, ._ },
3416 .unused,3187 } },
3417 .unused,3188 }, .{
3418 .unused,3189 .required_features = .{ .sse2, null, null, null },
3419 .unused,3190 .src_constraints = .{
3191 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3192 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3193 },
3194 .patterns = &.{
3195 .{ .src = .{ .to_mut_sse, .mem } },
3196 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
3197 .{ .src = .{ .to_mut_sse, .to_sse } },
3420 },3198 },
3421 .dst_temps = .{.{ .rc = .sse }},3199 .dst_temps = .{.{ .rc = .sse }},
3422 .each = .{ .once = &.{3200 .each = .{ .once = &.{
3423 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },3201 .{ ._, ._dqa, .mov, .dst0x, .src0x, ._, ._ },
3424 .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.yword, .tmp0), ._ },3202 .{ ._, .p_b, .cmpgt, .dst0x, .src1x, ._, ._ },
3203 .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ },
3204 .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ },
3205 .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ },
3425 } },3206 } },
3426 }, .{3207 }, .{
3427 .required_features = .{ .avx2, null, null, null },3208 .required_features = .{ .avx2, null, null, null },
3428 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any },3209 .src_constraints = .{
3429 .patterns = &.{3210 .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } },
3430 .{ .src = .{ .to_mem, .none } },3211 .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } },
3431 },3212 },
3432 .extra_temps = .{3213 .patterns = &.{
3433 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3214 .{ .src = .{ .to_sse, .mem } },
3434 .{ .kind = .{ .rc = .sse } },3215 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3435 .{ .kind = .{ .rc = .sse } },3216 .{ .src = .{ .to_sse, .to_sse } },
3436 .unused,
3437 .unused,
3438 .unused,
3439 },3217 },
3440 .dst_temps = .{.mem},3218 .dst_temps = .{.{ .rc = .sse }},
3441 .clobbers = .{ .eflags = true },
3442 .each = .{ .once = &.{3219 .each = .{ .once = &.{
3443 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3220 .{ ._, .vp_b, .maxs, .dst0y, .src0y, .src1y, ._ },
3444 .{ ._, .vp_q, .cmpeq, .tmp1y, .tmp1y, .tmp1y, ._ },
3445 .{ .@"0:", .vp_, .xor, .tmp2y, .tmp1y, .memiad(.src0y, .tmp0, .add_size, -16), ._ },
3446 .{ ._, .v_dqu, .mov, .memiad(.dst0y, .tmp0, .add_size, -16), .tmp2y, ._, ._ },
3447 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3448 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3449 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
3450 .{ ._, .v_dqa, .mov, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
3451 } },3221 } },
3452 }, .{3222 }, .{
3453 .required_features = .{ .avx2, null, null, null },3223 .required_features = .{ .avx2, null, null, null },
3454 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any },3224 .src_constraints = .{
3225 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } },
3226 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } },
3227 },
3455 .patterns = &.{3228 .patterns = &.{
3456 .{ .src = .{ .to_mem, .none } },3229 .{ .src = .{ .to_mem, .to_mem } },
3457 },3230 },
3458 .extra_temps = .{3231 .extra_temps = .{
3459 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3232 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3460 .{ .kind = .{ .rc = .sse } },3233 .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } },
3461 .{ .kind = .{ .rc = .sse } },3234 .unused,
3235 .unused,
3236 .unused,
3237 .unused,
3462 .unused,3238 .unused,
3463 .unused,3239 .unused,
3464 .unused,3240 .unused,
...@@ -3467,22 +3243,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3467,22 +3243,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3467 .clobbers = .{ .eflags = true },3243 .clobbers = .{ .eflags = true },
3468 .each = .{ .once = &.{3244 .each = .{ .once = &.{
3469 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },3245 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3470 .{ ._, .vp_q, .cmpeq, .tmp1y, .tmp1y, .tmp1y, ._ },3246 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3471 .{ .@"0:", .vp_, .xor, .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._ },3247 .{ ._, .vp_b, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
3472 .{ ._, .v_dqu, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp2y, ._, ._ },3248 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
3473 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },3249 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3474 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3250 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3475 } },3251 } },
3476 }, .{3252 }, .{
3477 .required_features = .{ .avx, null, null, null },3253 .required_features = .{ .avx, null, null, null },
3478 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any },3254 .src_constraints = .{
3255 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3256 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3257 },
3479 .patterns = &.{3258 .patterns = &.{
3480 .{ .src = .{ .to_mem, .none } },3259 .{ .src = .{ .to_mem, .to_mem } },
3481 },3260 },
3482 .extra_temps = .{3261 .extra_temps = .{
3483 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3262 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3484 .{ .kind = .{ .rc = .sse } },3263 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
3485 .{ .kind = .{ .rc = .sse } },3264 .unused,
3265 .unused,
3266 .unused,
3267 .unused,
3486 .unused,3268 .unused,
3487 .unused,3269 .unused,
3488 .unused,3270 .unused,
...@@ -3490,25 +3272,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3490,25 +3272,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3490 .dst_temps = .{.mem},3272 .dst_temps = .{.mem},
3491 .clobbers = .{ .eflags = true },3273 .clobbers = .{ .eflags = true },
3492 .each = .{ .once = &.{3274 .each = .{ .once = &.{
3493 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3275 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3494 .{ ._, .v_pd, .cmp, .tmp1y, .tmp1y, .tmp1y, .si(0b01111) },3276 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3495 .{ .@"0:", .v_pd, .xor, .tmp2y, .tmp1y, .memiad(.src0y, .tmp0, .add_size, -16), ._ },3277 .{ ._, .vp_b, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
3496 .{ ._, .v_pd, .movu, .memiad(.dst0y, .tmp0, .add_size, -16), .tmp2y, ._, ._ },3278 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3497 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },3279 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3498 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3280 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3499 .{ .@"0:", .v_pd, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
3500 .{ ._, .v_pd, .mova, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
3501 } },3281 } },
3502 }, .{3282 }, .{
3503 .required_features = .{ .avx, null, null, null },3283 .required_features = .{ .sse4_1, null, null, null },
3504 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any },3284 .src_constraints = .{
3285 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3286 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3287 },
3505 .patterns = &.{3288 .patterns = &.{
3506 .{ .src = .{ .to_mem, .none } },3289 .{ .src = .{ .to_mem, .to_mem } },
3507 },3290 },
3508 .extra_temps = .{3291 .extra_temps = .{
3509 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3292 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3510 .{ .kind = .{ .rc = .sse } },3293 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
3511 .{ .kind = .{ .rc = .sse } },3294 .unused,
3295 .unused,
3296 .unused,
3297 .unused,
3512 .unused,3298 .unused,
3513 .unused,3299 .unused,
3514 .unused,3300 .unused,
...@@ -3517,22 +3303,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3517,22 +3303,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3517 .clobbers = .{ .eflags = true },3303 .clobbers = .{ .eflags = true },
3518 .each = .{ .once = &.{3304 .each = .{ .once = &.{
3519 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },3305 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3520 .{ ._, .v_pd, .cmp, .tmp1y, .tmp1y, .tmp1y, .si(0b01111) },3306 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3521 .{ .@"0:", .v_pd, .xor, .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._ },3307 .{ ._, .p_b, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3522 .{ ._, .v_pd, .movu, .memia(.dst0y, .tmp0, .add_size), .tmp2y, ._, ._ },3308 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3523 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },3309 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3524 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3310 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3525 } },3311 } },
3526 }, .{3312 }, .{
3527 .required_features = .{ .avx, null, null, null },3313 .required_features = .{ .sse2, null, null, null },
3528 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },3314 .src_constraints = .{
3315 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3316 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3317 },
3529 .patterns = &.{3318 .patterns = &.{
3530 .{ .src = .{ .to_mem, .none } },3319 .{ .src = .{ .to_mem, .to_mem } },
3531 },3320 },
3532 .extra_temps = .{3321 .extra_temps = .{
3533 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3322 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3534 .{ .kind = .{ .rc = .sse } },3323 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
3535 .{ .kind = .{ .rc = .sse } },3324 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
3325 .unused,
3326 .unused,
3327 .unused,
3536 .unused,3328 .unused,
3537 .unused,3329 .unused,
3538 .unused,3330 .unused,
...@@ -3541,22 +3333,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3541,22 +3333,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3541 .clobbers = .{ .eflags = true },3333 .clobbers = .{ .eflags = true },
3542 .each = .{ .once = &.{3334 .each = .{ .once = &.{
3543 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },3335 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3544 .{ ._, .vp_q, .cmpeq, .tmp1x, .tmp1x, .tmp1x, ._ },3336 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3545 .{ .@"0:", .v_, .xor, .tmp2x, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._ },3337 .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ },
3546 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },3338 .{ ._, .p_b, .cmpgt, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3339 .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ },
3340 .{ ._, .p_, .andn, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3341 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
3342 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3547 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },3343 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3548 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3344 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3549 } },3345 } },
3550 }, .{3346 }, .{
3551 .required_features = .{ .sse2, null, null, null },3347 .required_features = .{ .cmov, .slow_incdec, null, null },
3552 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },3348 .src_constraints = .{
3349 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3350 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3351 },
3553 .patterns = &.{3352 .patterns = &.{
3554 .{ .src = .{ .to_mem, .none } },3353 .{ .src = .{ .to_mem, .to_mem } },
3555 },3354 },
3556 .extra_temps = .{3355 .extra_temps = .{
3557 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3356 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3558 .{ .kind = .{ .rc = .sse } },3357 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3559 .{ .kind = .{ .rc = .sse } },3358 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3359 .unused,
3360 .unused,
3361 .unused,
3560 .unused,3362 .unused,
3561 .unused,3363 .unused,
3562 .unused,3364 .unused,
...@@ -3565,45 +3367,61 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3565,45 +3367,61 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3565 .clobbers = .{ .eflags = true },3367 .clobbers = .{ .eflags = true },
3566 .each = .{ .once = &.{3368 .each = .{ .once = &.{
3567 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },3369 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3568 .{ ._, .p_d, .cmpeq, .tmp1x, .tmp1x, ._, ._ },3370 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3569 .{ .@"0:", ._dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },3371 .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3570 .{ ._, .p_, .xor, .tmp2x, .tmp1x, ._, ._ },3372 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
3571 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },3373 .{ ._, ._l, .cmov, .tmp1d, .tmp2d, ._, ._ },
3572 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },3374 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3375 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
3573 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3376 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3574 } },3377 } },
3575 }, .{3378 }, .{
3576 .required_features = .{ .@"64bit", null, null, null },3379 .required_features = .{ .cmov, null, null, null },
3577 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },3380 .src_constraints = .{
3381 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3382 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3383 },
3578 .patterns = &.{3384 .patterns = &.{
3579 .{ .src = .{ .mut_mem, .none } },3385 .{ .src = .{ .to_mem, .to_mem } },
3580 },3386 },
3581 .extra_temps = .{3387 .extra_temps = .{
3582 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3388 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3389 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3390 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3391 .unused,
3583 .unused,3392 .unused,
3584 .unused,3393 .unused,
3585 .unused,3394 .unused,
3586 .unused,3395 .unused,
3587 .unused,3396 .unused,
3588 },3397 },
3589 .dst_temps = .{.{ .ref = .src0 }},3398 .dst_temps = .{.mem},
3590 .clobbers = .{ .eflags = true },3399 .clobbers = .{ .eflags = true },
3591 .each = .{ .once = &.{3400 .each = .{ .once = &.{
3592 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },3401 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3593 .{ .@"0:", ._, .not, .memia(.dst0q, .tmp0, .add_size), ._, ._, ._ },3402 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3594 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, 8), ._, ._, ._ },3403 .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3595 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },3404 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
3596 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3405 .{ ._, ._l, .cmov, .tmp1d, .tmp2d, ._, ._ },
3406 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3407 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3408 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3597 } },3409 } },
3598 }, .{3410 }, .{
3599 .required_features = .{ .@"64bit", null, null, null },3411 .required_features = .{ .slow_incdec, null, null, null },
3600 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },3412 .src_constraints = .{
3413 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3414 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3415 },
3601 .patterns = &.{3416 .patterns = &.{
3602 .{ .src = .{ .to_mem, .none } },3417 .{ .src = .{ .to_mem, .to_mem } },
3603 },3418 },
3604 .extra_temps = .{3419 .extra_temps = .{
3605 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3420 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3606 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },3421 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3422 .unused,
3423 .unused,
3424 .unused,
3607 .unused,3425 .unused,
3608 .unused,3426 .unused,
3609 .unused,3427 .unused,
...@@ -3613,45 +3431,120 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3613,45 +3431,120 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3613 .clobbers = .{ .eflags = true },3431 .clobbers = .{ .eflags = true },
3614 .each = .{ .once = &.{3432 .each = .{ .once = &.{
3615 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },3433 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3616 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },3434 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3617 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },3435 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3618 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },3436 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
3619 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3437 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3438 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3439 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
3620 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3440 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3621 } },3441 } },
3622 }, .{3442 }, .{
3623 .required_features = .{ .@"64bit", null, null, null },3443 .src_constraints = .{
3624 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .dword } }, .any },3444 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3445 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3446 },
3625 .patterns = &.{3447 .patterns = &.{
3626 .{ .src = .{ .mut_mem, .none } },3448 .{ .src = .{ .to_mem, .to_mem } },
3627 },3449 },
3628 .extra_temps = .{3450 .extra_temps = .{
3629 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3451 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3452 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3453 .unused,
3454 .unused,
3630 .unused,3455 .unused,
3631 .unused,3456 .unused,
3632 .unused,3457 .unused,
3633 .unused,3458 .unused,
3634 .unused,3459 .unused,
3635 },3460 },
3636 .dst_temps = .{.{ .ref = .src0 }},3461 .dst_temps = .{.mem},
3637 .clobbers = .{ .eflags = true },3462 .clobbers = .{ .eflags = true },
3638 .each = .{ .once = &.{3463 .each = .{ .once = &.{
3639 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3464 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3640 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16), ._, ._, ._ },3465 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3641 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16 + 8), ._, ._, ._ },3466 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3642 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },3467 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
3643 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3468 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3644 .{ ._, ._, .not, .memad(.dst0d, .add_size, -16), ._, ._, ._ },3469 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3470 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3471 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3645 } },3472 } },
3646 }, .{3473 }, .{
3647 .required_features = .{ .@"64bit", null, null, null },3474 .required_features = .{ .sse, .mmx, null, null },
3648 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .dword } }, .any },3475 .src_constraints = .{
3476 .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } },
3477 .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } },
3478 },
3649 .patterns = &.{3479 .patterns = &.{
3650 .{ .src = .{ .to_mem, .none } },3480 .{ .src = .{ .to_mut_mmx, .mem } },
3481 .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } },
3482 .{ .src = .{ .to_mut_mmx, .to_mmx } },
3483 },
3484 .dst_temps = .{.{ .ref = .src0 }},
3485 .each = .{ .once = &.{
3486 .{ ._, .p_b, .maxu, .dst0q, .src1q, ._, ._ },
3487 } },
3488 }, .{
3489 .required_features = .{ .avx, null, null, null },
3490 .src_constraints = .{
3491 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3492 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3493 },
3494 .patterns = &.{
3495 .{ .src = .{ .to_sse, .mem } },
3496 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3497 .{ .src = .{ .to_sse, .to_sse } },
3498 },
3499 .dst_temps = .{.{ .rc = .sse }},
3500 .each = .{ .once = &.{
3501 .{ ._, .vp_b, .maxu, .dst0x, .src0x, .src1x, ._ },
3502 } },
3503 }, .{
3504 .required_features = .{ .sse2, null, null, null },
3505 .src_constraints = .{
3506 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3507 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3508 },
3509 .patterns = &.{
3510 .{ .src = .{ .to_mut_sse, .mem } },
3511 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
3512 .{ .src = .{ .to_mut_sse, .to_sse } },
3513 },
3514 .dst_temps = .{.{ .ref = .src0 }},
3515 .each = .{ .once = &.{
3516 .{ ._, .p_b, .maxu, .dst0x, .src1x, ._, ._ },
3517 } },
3518 }, .{
3519 .required_features = .{ .avx2, null, null, null },
3520 .src_constraints = .{
3521 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } },
3522 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } },
3523 },
3524 .patterns = &.{
3525 .{ .src = .{ .to_sse, .mem } },
3526 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3527 .{ .src = .{ .to_sse, .to_sse } },
3528 },
3529 .dst_temps = .{.{ .rc = .sse }},
3530 .each = .{ .once = &.{
3531 .{ ._, .vp_b, .maxu, .dst0y, .src0y, .src1y, ._ },
3532 } },
3533 }, .{
3534 .required_features = .{ .avx2, null, null, null },
3535 .src_constraints = .{
3536 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } },
3537 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } },
3538 },
3539 .patterns = &.{
3540 .{ .src = .{ .to_mem, .to_mem } },
3651 },3541 },
3652 .extra_temps = .{3542 .extra_temps = .{
3653 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3543 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3654 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },3544 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
3545 .unused,
3546 .unused,
3547 .unused,
3655 .unused,3548 .unused,
3656 .unused,3549 .unused,
3657 .unused,3550 .unused,
...@@ -3660,51 +3553,58 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3660,51 +3553,58 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3660 .dst_temps = .{.mem},3553 .dst_temps = .{.mem},
3661 .clobbers = .{ .eflags = true },3554 .clobbers = .{ .eflags = true },
3662 .each = .{ .once = &.{3555 .each = .{ .once = &.{
3663 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3556 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3664 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -16), ._, ._ },3557 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3665 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },3558 .{ ._, .vp_b, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
3666 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -16), .tmp1q, ._, ._ },3559 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
3667 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3560 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3668 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3561 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3669 .{ ._, ._, .mov, .tmp0d, .memad(.src0d, .add_size, -16), ._, ._ },
3670 .{ ._, ._, .not, .tmp0d, ._, ._, ._ },
3671 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -16), .tmp0d, ._, ._ },
3672 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -16 + 4), .si(0), ._, ._ },
3673 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16 + 8), .si(0), ._, ._ },
3674 } },3562 } },
3675 }, .{3563 }, .{
3676 .required_features = .{ .@"64bit", null, null, null },3564 .required_features = .{ .avx, null, null, null },
3677 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any },3565 .src_constraints = .{
3566 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3567 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3568 },
3678 .patterns = &.{3569 .patterns = &.{
3679 .{ .src = .{ .mut_mem, .none } },3570 .{ .src = .{ .to_mem, .to_mem } },
3680 },3571 },
3681 .extra_temps = .{3572 .extra_temps = .{
3682 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3573 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3574 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
3575 .unused,
3576 .unused,
3683 .unused,3577 .unused,
3684 .unused,3578 .unused,
3685 .unused,3579 .unused,
3686 .unused,3580 .unused,
3687 .unused,3581 .unused,
3688 },3582 },
3689 .dst_temps = .{.{ .ref = .src0 }},3583 .dst_temps = .{.mem},
3690 .clobbers = .{ .eflags = true },3584 .clobbers = .{ .eflags = true },
3691 .each = .{ .once = &.{3585 .each = .{ .once = &.{
3692 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3586 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3693 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16), ._, ._, ._ },3587 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3694 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16 + 8), ._, ._, ._ },3588 .{ ._, .vp_b, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
3589 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3695 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },3590 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3696 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3591 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3697 .{ ._, ._, .not, .memad(.dst0q, .add_size, -16), ._, ._, ._ },
3698 } },3592 } },
3699 }, .{3593 }, .{
3700 .required_features = .{ .@"64bit", null, null, null },3594 .required_features = .{ .sse2, null, null, null },
3701 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any },3595 .src_constraints = .{
3596 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3597 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3598 },
3702 .patterns = &.{3599 .patterns = &.{
3703 .{ .src = .{ .to_mem, .none } },3600 .{ .src = .{ .to_mem, .to_mem } },
3704 },3601 },
3705 .extra_temps = .{3602 .extra_temps = .{
3706 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3603 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3707 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },3604 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
3605 .unused,
3606 .unused,
3607 .unused,
3708 .unused,3608 .unused,
3709 .unused,3609 .unused,
3710 .unused,3610 .unused,
...@@ -3713,46 +3613,60 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3713,46 +3613,60 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3713 .dst_temps = .{.mem},3613 .dst_temps = .{.mem},
3714 .clobbers = .{ .eflags = true },3614 .clobbers = .{ .eflags = true },
3715 .each = .{ .once = &.{3615 .each = .{ .once = &.{
3716 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },3616 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3717 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -8), ._, ._ },3617 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3718 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },3618 .{ ._, .p_b, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3719 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -8), .tmp1q, ._, ._ },3619 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3720 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3620 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3721 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3621 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3722 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
3723 } },3622 } },
3724 }, .{3623 }, .{
3725 .required_features = .{ .@"64bit", null, null, null },3624 .required_features = .{ .cmov, .slow_incdec, null, null },
3726 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any },3625 .src_constraints = .{
3626 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3627 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3628 },
3727 .patterns = &.{3629 .patterns = &.{
3728 .{ .src = .{ .mut_mem, .none } },3630 .{ .src = .{ .to_mem, .to_mem } },
3729 },3631 },
3730 .extra_temps = .{3632 .extra_temps = .{
3731 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3633 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3634 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3635 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3636 .unused,
3732 .unused,3637 .unused,
3733 .unused,3638 .unused,
3734 .unused,3639 .unused,
3735 .unused,3640 .unused,
3736 .unused,3641 .unused,
3737 },3642 },
3738 .dst_temps = .{.{ .ref = .src0 }},3643 .dst_temps = .{.mem},
3739 .clobbers = .{ .eflags = true },3644 .clobbers = .{ .eflags = true },
3740 .each = .{ .once = &.{3645 .each = .{ .once = &.{
3741 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },3646 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3742 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -8), ._, ._, ._ },3647 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3743 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3648 .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3649 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
3650 .{ ._, ._b, .cmov, .tmp1d, .tmp2d, ._, ._ },
3651 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3652 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
3744 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3653 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3745 .{ ._, ._, .not, .memad(.dst0d, .add_size, -8), ._, ._, ._ },
3746 } },3654 } },
3747 }, .{3655 }, .{
3748 .required_features = .{ .@"64bit", null, null, null },3656 .required_features = .{ .cmov, null, null, null },
3749 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any },3657 .src_constraints = .{
3658 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3659 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3660 },
3750 .patterns = &.{3661 .patterns = &.{
3751 .{ .src = .{ .to_mem, .none } },3662 .{ .src = .{ .to_mem, .to_mem } },
3752 },3663 },
3753 .extra_temps = .{3664 .extra_temps = .{
3754 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3665 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3755 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },3666 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3667 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3668 .unused,
3669 .unused,
3756 .unused,3670 .unused,
3757 .unused,3671 .unused,
3758 .unused,3672 .unused,
...@@ -3761,50 +3675,61 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3761,50 +3675,61 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3761 .dst_temps = .{.mem},3675 .dst_temps = .{.mem},
3762 .clobbers = .{ .eflags = true },3676 .clobbers = .{ .eflags = true },
3763 .each = .{ .once = &.{3677 .each = .{ .once = &.{
3764 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },3678 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3765 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -8), ._, ._ },3679 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3766 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },3680 .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3767 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -8), .tmp1q, ._, ._ },3681 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
3768 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3682 .{ ._, ._b, .cmov, .tmp1d, .tmp2d, ._, ._ },
3769 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3683 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3770 .{ ._, ._, .mov, .tmp0d, .memad(.src0d, .add_size, -8), ._, ._ },3684 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3771 .{ ._, ._, .not, .tmp0d, ._, ._, ._ },3685 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3772 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -8), .tmp0d, ._, ._ },
3773 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -8 + 4), .si(0), ._, ._ },
3774 } },3686 } },
3775 }, .{3687 }, .{
3776 .required_features = .{ .@"64bit", null, null, null },3688 .required_features = .{ .slow_incdec, null, null, null },
3777 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .dword } }, .any },3689 .src_constraints = .{
3690 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3691 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3692 },
3778 .patterns = &.{3693 .patterns = &.{
3779 .{ .src = .{ .mut_mem, .none } },3694 .{ .src = .{ .to_mem, .to_mem } },
3780 },3695 },
3781 .extra_temps = .{3696 .extra_temps = .{
3782 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3697 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3698 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3699 .unused,
3700 .unused,
3783 .unused,3701 .unused,
3784 .unused,3702 .unused,
3785 .unused,3703 .unused,
3786 .unused,3704 .unused,
3787 .unused,3705 .unused,
3788 },3706 },
3789 .dst_temps = .{.{ .ref = .src0 }},3707 .dst_temps = .{.mem},
3790 .clobbers = .{ .eflags = true },3708 .clobbers = .{ .eflags = true },
3791 .each = .{ .once = &.{3709 .each = .{ .once = &.{
3792 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3710 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3793 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16), ._, ._, ._ },3711 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3794 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16 + 8), ._, ._, ._ },3712 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3795 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },3713 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
3714 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3715 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3716 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
3796 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3717 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3797 .{ ._, ._, .xor, .memad(.dst0d, .add_size, -16), .sa(.src0, .add_umax), ._, ._ },
3798 } },3718 } },
3799 }, .{3719 }, .{
3800 .required_features = .{ .@"64bit", null, null, null },3720 .src_constraints = .{
3801 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .dword } }, .any },3721 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3722 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3723 },
3802 .patterns = &.{3724 .patterns = &.{
3803 .{ .src = .{ .to_mem, .none } },3725 .{ .src = .{ .to_mem, .to_mem } },
3804 },3726 },
3805 .extra_temps = .{3727 .extra_temps = .{
3806 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3728 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3807 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },3729 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3730 .unused,
3731 .unused,
3732 .unused,
3808 .unused,3733 .unused,
3809 .unused,3734 .unused,
3810 .unused,3735 .unused,
...@@ -3813,50 +3738,90 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3813,50 +3738,90 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3813 .dst_temps = .{.mem},3738 .dst_temps = .{.mem},
3814 .clobbers = .{ .eflags = true },3739 .clobbers = .{ .eflags = true },
3815 .each = .{ .once = &.{3740 .each = .{ .once = &.{
3816 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3741 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3817 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -16), ._, ._ },3742 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3818 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },3743 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3819 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -16), .tmp1q, ._, ._ },3744 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
3820 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3745 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3821 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3746 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3822 .{ ._, ._, .mov, .tmp0d, .memad(.src0d, .add_size, -16), ._, ._ },3747 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3823 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_umax), ._, ._ },3748 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3824 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -16), .tmp0d, ._, ._ },
3825 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -16 + 4), .si(0), ._, ._ },
3826 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16 + 8), .si(0), ._, ._ },
3827 } },3749 } },
3828 }, .{3750 }, .{
3829 .required_features = .{ .@"64bit", null, null, null },3751 .required_features = .{ .sse, .mmx, null, null },
3830 .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .dword } }, .any },3752 .src_constraints = .{
3753 .{ .scalar_signed_int = .{ .of = .qword, .is = .word } },
3754 .{ .scalar_signed_int = .{ .of = .qword, .is = .word } },
3755 },
3831 .patterns = &.{3756 .patterns = &.{
3832 .{ .src = .{ .mut_mem, .none } },3757 .{ .src = .{ .to_mut_mmx, .mem } },
3758 .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } },
3759 .{ .src = .{ .to_mut_mmx, .to_mmx } },
3833 },3760 },
3834 .extra_temps = .{3761 .dst_temps = .{.{ .ref = .src0 }},
3835 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3762 .each = .{ .once = &.{
3836 .unused,3763 .{ ._, .p_w, .maxs, .dst0q, .src1q, ._, ._ },
3837 .unused,3764 } },
3838 .unused,3765 }, .{
3839 .unused,3766 .required_features = .{ .avx, null, null, null },
3840 .unused,3767 .src_constraints = .{
3768 .{ .scalar_signed_int = .{ .of = .xword, .is = .word } },
3769 .{ .scalar_signed_int = .{ .of = .xword, .is = .word } },
3770 },
3771 .patterns = &.{
3772 .{ .src = .{ .to_sse, .mem } },
3773 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3774 .{ .src = .{ .to_sse, .to_sse } },
3775 },
3776 .dst_temps = .{.{ .rc = .sse }},
3777 .each = .{ .once = &.{
3778 .{ ._, .vp_w, .maxs, .dst0x, .src0x, .src1x, ._ },
3779 } },
3780 }, .{
3781 .required_features = .{ .sse2, null, null, null },
3782 .src_constraints = .{
3783 .{ .scalar_signed_int = .{ .of = .xword, .is = .word } },
3784 .{ .scalar_signed_int = .{ .of = .xword, .is = .word } },
3785 },
3786 .patterns = &.{
3787 .{ .src = .{ .to_mut_sse, .mem } },
3788 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
3789 .{ .src = .{ .to_mut_sse, .to_sse } },
3841 },3790 },
3842 .dst_temps = .{.{ .ref = .src0 }},3791 .dst_temps = .{.{ .ref = .src0 }},
3843 .clobbers = .{ .eflags = true },
3844 .each = .{ .once = &.{3792 .each = .{ .once = &.{
3845 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },3793 .{ ._, .p_w, .maxs, .dst0x, .src1x, ._, ._ },
3846 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -8), ._, ._, ._ },
3847 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
3848 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3849 .{ ._, ._, .xor, .memad(.dst0d, .add_size, -8), .sa(.src0, .add_umax), ._, ._ },
3850 } },3794 } },
3851 }, .{3795 }, .{
3852 .required_features = .{ .@"64bit", null, null, null },3796 .required_features = .{ .avx2, null, null, null },
3853 .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .dword } }, .any },3797 .src_constraints = .{
3798 .{ .scalar_signed_int = .{ .of = .yword, .is = .word } },
3799 .{ .scalar_signed_int = .{ .of = .yword, .is = .word } },
3800 },
3854 .patterns = &.{3801 .patterns = &.{
3855 .{ .src = .{ .to_mem, .none } },3802 .{ .src = .{ .to_sse, .mem } },
3803 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3804 .{ .src = .{ .to_sse, .to_sse } },
3805 },
3806 .dst_temps = .{.{ .rc = .sse }},
3807 .each = .{ .once = &.{
3808 .{ ._, .vp_w, .maxs, .dst0y, .src0y, .src1y, ._ },
3809 } },
3810 }, .{
3811 .required_features = .{ .avx2, null, null, null },
3812 .src_constraints = .{
3813 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } },
3814 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } },
3815 },
3816 .patterns = &.{
3817 .{ .src = .{ .to_mem, .to_mem } },
3856 },3818 },
3857 .extra_temps = .{3819 .extra_temps = .{
3858 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3820 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3859 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },3821 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
3822 .unused,
3823 .unused,
3824 .unused,
3860 .unused,3825 .unused,
3861 .unused,3826 .unused,
3862 .unused,3827 .unused,
...@@ -3865,51 +3830,58 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3865,51 +3830,58 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3865 .dst_temps = .{.mem},3830 .dst_temps = .{.mem},
3866 .clobbers = .{ .eflags = true },3831 .clobbers = .{ .eflags = true },
3867 .each = .{ .once = &.{3832 .each = .{ .once = &.{
3868 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },3833 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3869 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -8), ._, ._ },3834 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3870 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },3835 .{ ._, .vp_w, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
3871 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -8), .tmp1q, ._, ._ },3836 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
3872 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3837 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3873 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3838 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3874 .{ ._, ._, .mov, .tmp0d, .memad(.src0d, .add_size, -8), ._, ._ },
3875 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_umax), ._, ._ },
3876 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -8), .tmp0d, ._, ._ },
3877 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -8 + 4), .si(0), ._, ._ },
3878 } },3839 } },
3879 }, .{3840 }, .{
3880 .required_features = .{ .@"64bit", null, null, null },3841 .required_features = .{ .avx, null, null, null },
3881 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },3842 .src_constraints = .{
3843 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
3844 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
3845 },
3882 .patterns = &.{3846 .patterns = &.{
3883 .{ .src = .{ .mut_mem, .none } },3847 .{ .src = .{ .to_mem, .to_mem } },
3884 },3848 },
3885 .extra_temps = .{3849 .extra_temps = .{
3886 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3850 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3851 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
3852 .unused,
3853 .unused,
3887 .unused,3854 .unused,
3888 .unused,3855 .unused,
3889 .unused,3856 .unused,
3890 .unused,3857 .unused,
3891 .unused,3858 .unused,
3892 },3859 },
3893 .dst_temps = .{.{ .ref = .src0 }},3860 .dst_temps = .{.mem},
3894 .clobbers = .{ .eflags = true },3861 .clobbers = .{ .eflags = true },
3895 .each = .{ .once = &.{3862 .each = .{ .once = &.{
3896 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3863 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3897 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16), ._, ._, ._ },3864 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3898 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16 + 8), ._, ._, ._ },3865 .{ ._, .vp_w, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
3866 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3899 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },3867 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3900 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3868 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3901 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
3902 .{ ._, ._, .xor, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ },
3903 } },3869 } },
3904 }, .{3870 }, .{
3905 .required_features = .{ .@"64bit", null, null, null },3871 .required_features = .{ .sse2, null, null, null },
3906 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },3872 .src_constraints = .{
3873 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
3874 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
3875 },
3907 .patterns = &.{3876 .patterns = &.{
3908 .{ .src = .{ .to_mem, .none } },3877 .{ .src = .{ .to_mem, .to_mem } },
3909 },3878 },
3910 .extra_temps = .{3879 .extra_temps = .{
3911 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3880 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3912 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },3881 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
3882 .unused,
3883 .unused,
3884 .unused,
3913 .unused,3885 .unused,
3914 .unused,3886 .unused,
3915 .unused,3887 .unused,
...@@ -3918,1746 +3890,2329 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3918,1746 +3890,2329 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3918 .dst_temps = .{.mem},3890 .dst_temps = .{.mem},
3919 .clobbers = .{ .eflags = true },3891 .clobbers = .{ .eflags = true },
3920 .each = .{ .once = &.{3892 .each = .{ .once = &.{
3921 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },3893 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3922 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -16), ._, ._ },3894 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3923 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },3895 .{ ._, .p_w, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3924 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -16), .tmp1q, ._, ._ },3896 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3925 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3897 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3926 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3898 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3927 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
3928 .{ ._, ._, .xor, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ },
3929 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ },
3930 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
3931 } },3899 } },
3932 }, .{3900 }, .{
3933 .required_features = .{ .@"64bit", null, null, null },3901 .required_features = .{ .cmov, null, null, null },
3934 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },3902 .src_constraints = .{
3903 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
3904 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
3905 },
3935 .patterns = &.{3906 .patterns = &.{
3936 .{ .src = .{ .mut_mem, .none } },3907 .{ .src = .{ .to_mem, .to_mem } },
3937 },3908 },
3938 .extra_temps = .{3909 .extra_temps = .{
3939 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3910 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3911 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
3912 .unused,
3913 .unused,
3940 .unused,3914 .unused,
3941 .unused,3915 .unused,
3942 .unused,3916 .unused,
3943 .unused,3917 .unused,
3944 .unused,3918 .unused,
3945 },3919 },
3946 .dst_temps = .{.{ .ref = .src0 }},3920 .dst_temps = .{.mem},
3947 .clobbers = .{ .eflags = true },3921 .clobbers = .{ .eflags = true },
3948 .each = .{ .once = &.{3922 .each = .{ .once = &.{
3949 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },3923 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3950 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -8), ._, ._, ._ },3924 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
3951 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3925 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
3926 .{ ._, ._l, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
3927 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
3928 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
3952 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3929 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3953 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
3954 .{ ._, ._, .xor, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ },
3955 } },3930 } },
3956 }, .{3931 }, .{
3957 .required_features = .{ .@"64bit", null, null, null },3932 .src_constraints = .{
3958 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },3933 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
3934 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
3935 },
3959 .patterns = &.{3936 .patterns = &.{
3960 .{ .src = .{ .to_mem, .none } },3937 .{ .src = .{ .to_mem, .to_mem } },
3961 },3938 },
3962 .extra_temps = .{3939 .extra_temps = .{
3963 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },3940 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3964 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },3941 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
3965 .unused,3942 .unused,
3966 .unused,3943 .unused,
3967 .unused,3944 .unused,
3968 .unused,3945 .unused,
3969 },3946 .unused,
3947 .unused,
3948 .unused,
3949 },
3970 .dst_temps = .{.mem},3950 .dst_temps = .{.mem},
3971 .clobbers = .{ .eflags = true },3951 .clobbers = .{ .eflags = true },
3972 .each = .{ .once = &.{3952 .each = .{ .once = &.{
3973 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },3953 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3974 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -8), ._, ._ },3954 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
3975 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },3955 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
3976 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -8), .tmp1q, ._, ._ },3956 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
3977 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },3957 .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
3958 .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
3959 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
3978 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },3960 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3979 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
3980 .{ ._, ._, .xor, .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ },
3981 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ },
3982 } },3961 } },
3983 }, .{3962 }, .{
3984 .required_features = .{ .mmx, null, null, null },3963 .required_features = .{ .avx, null, null, null },
3985 .src_constraints = .{ .{ .signed_int_or_full_vec = .qword }, .any },3964 .src_constraints = .{
3965 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3966 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3967 },
3986 .patterns = &.{3968 .patterns = &.{
3987 .{ .src = .{ .mem, .none } },3969 .{ .src = .{ .to_sse, .mem } },
3988 .{ .src = .{ .to_mm, .none } },3970 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3971 .{ .src = .{ .to_sse, .to_sse } },
3989 },3972 },
3990 .dst_temps = .{.{ .rc = .mmx }},3973 .dst_temps = .{.{ .rc = .sse }},
3991 .each = .{ .once = &.{3974 .each = .{ .once = &.{
3992 .{ ._, .p_d, .cmpeq, .dst0q, .dst0q, ._, ._ },3975 .{ ._, .vp_w, .maxu, .dst0x, .src0x, .src1x, ._ },
3993 .{ ._, .p_, .xor, .dst0q, .src0q, ._, ._ },
3994 } },3976 } },
3995 }, .{3977 }, .{
3996 .required_features = .{ .mmx, null, null, null },3978 .required_features = .{ .sse4_1, null, null, null },
3997 .src_constraints = .{ .{ .unsigned_int_vec = .qword }, .any },3979 .src_constraints = .{
3998 .patterns = &.{3980 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3999 .{ .src = .{ .to_mut_mm, .none } },3981 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4000 },3982 },
4001 .extra_temps = .{3983 .patterns = &.{
4002 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },3984 .{ .src = .{ .to_mut_sse, .mem } },
4003 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },3985 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4004 .unused,3986 .{ .src = .{ .to_mut_sse, .to_sse } },
4005 .unused,
4006 .unused,
4007 .unused,
4008 },3987 },
4009 .dst_temps = .{.{ .ref = .src0 }},3988 .dst_temps = .{.{ .ref = .src0 }},
4010 .each = .{ .once = &.{3989 .each = .{ .once = &.{
4011 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },3990 .{ ._, .p_w, .maxu, .dst0x, .src1x, ._, ._ },
4012 .{ ._, .p_, .xor, .dst0q, .lea(.qword, .tmp0), ._, ._ },
4013 } },3991 } },
4014 }, .{3992 }, .{
4015 .required_features = .{ .avx, null, null, null },3993 .required_features = .{ .sse2, null, null, null },
4016 .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any },3994 .src_constraints = .{
4017 .patterns = &.{3995 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4018 .{ .src = .{ .mem, .none } },3996 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4019 .{ .src = .{ .to_xmm, .none } },
4020 },3997 },
4021 .dst_temps = .{.{ .rc = .sse }},
4022 .each = .{ .once = &.{
4023 .{ ._, .vp_q, .cmpeq, .dst0x, .dst0x, .dst0x, ._ },
4024 .{ ._, .vp_, .xor, .dst0x, .dst0x, .src0x, ._ },
4025 } },
4026 }, .{
4027 .required_features = .{ .avx, null, null, null },
4028 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any },
4029 .patterns = &.{3998 .patterns = &.{
4030 .{ .src = .{ .to_xmm, .none } },3999 .{ .src = .{ .to_mut_sse, .mem } },
4031 },4000 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4032 .extra_temps = .{4001 .{ .src = .{ .to_mut_sse, .to_sse } },
4033 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4034 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
4035 .unused,
4036 .unused,
4037 .unused,
4038 .unused,
4039 },4002 },
4040 .dst_temps = .{.{ .rc = .sse }},4003 .dst_temps = .{.{ .ref = .src0 }},
4041 .each = .{ .once = &.{4004 .each = .{ .once = &.{
4042 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },4005 .{ ._, .p_w, .subus, .dst0x, .src1x, ._, ._ },
4043 .{ ._, .vp_, .xor, .dst0x, .src0x, .lea(.xword, .tmp0), ._ },4006 .{ ._, .p_w, .add, .dst0x, .src1x, ._, ._ },
4044 } },4007 } },
4045 }, .{4008 }, .{
4046 .required_features = .{ .sse2, null, null, null },4009 .required_features = .{ .avx2, null, null, null },
4047 .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any },4010 .src_constraints = .{
4011 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } },
4012 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } },
4013 },
4048 .patterns = &.{4014 .patterns = &.{
4049 .{ .src = .{ .mem, .none } },4015 .{ .src = .{ .to_sse, .mem } },
4050 .{ .src = .{ .to_xmm, .none } },4016 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4017 .{ .src = .{ .to_sse, .to_sse } },
4051 },4018 },
4052 .dst_temps = .{.{ .rc = .sse }},4019 .dst_temps = .{.{ .rc = .sse }},
4053 .each = .{ .once = &.{4020 .each = .{ .once = &.{
4054 .{ ._, .p_d, .cmpeq, .dst0x, .dst0x, ._, ._ },4021 .{ ._, .vp_w, .maxu, .dst0y, .src0y, .src1y, ._ },
4055 .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ },
4056 } },4022 } },
4057 }, .{4023 }, .{
4058 .required_features = .{ .sse2, null, null, null },4024 .required_features = .{ .avx2, null, null, null },
4059 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any },4025 .src_constraints = .{
4026 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } },
4027 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } },
4028 },
4060 .patterns = &.{4029 .patterns = &.{
4061 .{ .src = .{ .to_mut_xmm, .none } },4030 .{ .src = .{ .to_mem, .to_mem } },
4062 },4031 },
4063 .extra_temps = .{4032 .extra_temps = .{
4064 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4033 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4065 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },4034 .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } },
4035 .unused,
4036 .unused,
4037 .unused,
4066 .unused,4038 .unused,
4067 .unused,4039 .unused,
4068 .unused,4040 .unused,
4069 .unused,4041 .unused,
4070 },4042 },
4071 .dst_temps = .{.{ .ref = .src0 }},4043 .dst_temps = .{.mem},
4044 .clobbers = .{ .eflags = true },
4072 .each = .{ .once = &.{4045 .each = .{ .once = &.{
4073 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },4046 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4074 .{ ._, .p_, .xor, .dst0x, .lea(.xword, .tmp0), ._, ._ },4047 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
4048 .{ ._, .vp_w, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
4049 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
4050 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
4051 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4075 } },4052 } },
4076 }, .{4053 }, .{
4077 .required_features = .{ .sse, null, null, null },4054 .required_features = .{ .avx, null, null, null },
4078 .src_constraints = .{ .{ .vec = .xword }, .any },4055 .src_constraints = .{
4056 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4057 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4058 },
4079 .patterns = &.{4059 .patterns = &.{
4080 .{ .src = .{ .to_mut_xmm, .none } },4060 .{ .src = .{ .to_mem, .to_mem } },
4081 },4061 },
4082 .extra_temps = .{4062 .extra_temps = .{
4083 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4063 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4084 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },4064 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
4065 .unused,
4066 .unused,
4067 .unused,
4085 .unused,4068 .unused,
4086 .unused,4069 .unused,
4087 .unused,4070 .unused,
4088 .unused,4071 .unused,
4089 },4072 },
4090 .dst_temps = .{.{ .ref = .src0 }},4073 .dst_temps = .{.mem},
4074 .clobbers = .{ .eflags = true },
4091 .each = .{ .once = &.{4075 .each = .{ .once = &.{
4092 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },4076 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4093 .{ ._, ._ps, .xor, .dst0x, .lea(.xword, .tmp0), ._, ._ },4077 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4078 .{ ._, .vp_w, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
4079 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4080 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4081 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4094 } },4082 } },
4095 }, .{4083 }, .{
4096 .required_features = .{ .avx2, null, null, null },4084 .required_features = .{ .sse4_1, null, null, null },
4097 .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any },4085 .src_constraints = .{
4098 .patterns = &.{4086 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4099 .{ .src = .{ .mem, .none } },4087 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4100 .{ .src = .{ .to_ymm, .none } },
4101 },4088 },
4102 .dst_temps = .{.{ .rc = .sse }},
4103 .each = .{ .once = &.{
4104 .{ ._, .vp_q, .cmpeq, .dst0y, .dst0y, .dst0y, ._ },
4105 .{ ._, .vp_, .xor, .dst0y, .dst0y, .src0y, ._ },
4106 } },
4107 }, .{
4108 .required_features = .{ .avx2, null, null, null },
4109 .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any },
4110 .patterns = &.{4089 .patterns = &.{
4111 .{ .src = .{ .to_ymm, .none } },4090 .{ .src = .{ .to_mem, .to_mem } },
4112 },4091 },
4113 .extra_temps = .{4092 .extra_temps = .{
4114 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4093 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4115 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },4094 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
4095 .unused,
4096 .unused,
4097 .unused,
4116 .unused,4098 .unused,
4117 .unused,4099 .unused,
4118 .unused,4100 .unused,
4119 .unused,4101 .unused,
4120 },4102 },
4121 .dst_temps = .{.{ .rc = .sse }},4103 .dst_temps = .{.mem},
4104 .clobbers = .{ .eflags = true },
4122 .each = .{ .once = &.{4105 .each = .{ .once = &.{
4123 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },4106 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4124 .{ ._, .vp_, .xor, .dst0y, .src0y, .lea(.yword, .tmp0), ._ },4107 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4108 .{ ._, .p_w, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4109 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4110 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4111 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4125 } },4112 } },
4126 }, .{4113 }, .{
4127 .required_features = .{ .avx, null, null, null },4114 .required_features = .{ .sse2, null, null, null },
4128 .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any },4115 .src_constraints = .{
4129 .patterns = &.{4116 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4130 .{ .src = .{ .mem, .none } },4117 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4131 .{ .src = .{ .to_ymm, .none } },
4132 },4118 },
4133 .dst_temps = .{.{ .rc = .sse }},
4134 .each = .{ .once = &.{
4135 .{ ._, .v_pd, .cmp, .dst0y, .dst0y, .dst0y, .si(0b01111) },
4136 .{ ._, .v_pd, .xor, .dst0y, .dst0y, .src0y, ._ },
4137 } },
4138 }, .{
4139 .required_features = .{ .avx, null, null, null },
4140 .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any },
4141 .patterns = &.{4119 .patterns = &.{
4142 .{ .src = .{ .to_ymm, .none } },4120 .{ .src = .{ .to_mem, .to_mem } },
4143 },4121 },
4144 .extra_temps = .{4122 .extra_temps = .{
4145 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4123 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4146 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },4124 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
4125 .unused,
4126 .unused,
4127 .unused,
4147 .unused,4128 .unused,
4148 .unused,4129 .unused,
4149 .unused,4130 .unused,
4150 .unused,4131 .unused,
4151 },4132 },
4152 .dst_temps = .{.{ .rc = .sse }},4133 .dst_temps = .{.mem},
4134 .clobbers = .{ .eflags = true },
4153 .each = .{ .once = &.{4135 .each = .{ .once = &.{
4154 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },4136 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4155 .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.yword, .tmp0), ._ },4137 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4138 .{ ._, .p_w, .subus, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4139 .{ ._, .p_w, .add, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4140 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4141 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4142 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4156 } },4143 } },
4157 }, .{4144 }, .{
4158 .required_features = .{ .@"64bit", null, null, null },4145 .required_features = .{ .cmov, null, null, null },
4146 .src_constraints = .{
4147 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
4148 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
4149 },
4159 .patterns = &.{4150 .patterns = &.{
4160 .{ .src = .{ .to_mem, .none } },4151 .{ .src = .{ .to_mem, .to_mem } },
4161 },4152 },
4162 .extra_temps = .{4153 .extra_temps = .{
4163 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4154 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4164 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4155 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
4165 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },4156 .unused,
4166 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },4157 .unused,
4158 .unused,
4159 .unused,
4160 .unused,
4167 .unused,4161 .unused,
4168 .unused,4162 .unused,
4169 },4163 },
4170 .dst_temps = .{.mem},4164 .dst_temps = .{.mem},
4165 .clobbers = .{ .eflags = true },
4171 .each = .{ .once = &.{4166 .each = .{ .once = &.{
4172 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_src0_unaligned_size), ._, ._ },4167 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4173 .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },4168 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
4174 .{ .@"0:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_src0_unaligned_size), ._, ._ },4169 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
4175 .{ ._, ._, .xor, .tmp2q, .leaia(.qword, .tmp1, .tmp0, .add_src0_unaligned_size), ._, ._ },4170 .{ ._, ._b, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
4176 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_src0_unaligned_size), .tmp2q, ._, ._ },4171 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
4177 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },4172 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
4178 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4173 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4179 } },4174 } },
4180 }, .{4175 }, .{
4176 .src_constraints = .{
4177 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
4178 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
4179 },
4181 .patterns = &.{4180 .patterns = &.{
4182 .{ .src = .{ .to_mem, .none } },4181 .{ .src = .{ .to_mem, .to_mem } },
4183 },4182 },
4184 .extra_temps = .{4183 .extra_temps = .{
4185 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4184 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4186 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },4185 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
4187 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4186 .unused,
4188 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },4187 .unused,
4188 .unused,
4189 .unused,
4190 .unused,
4189 .unused,4191 .unused,
4190 .unused,4192 .unused,
4191 },4193 },
4192 .dst_temps = .{.mem},4194 .dst_temps = .{.mem},
4195 .clobbers = .{ .eflags = true },
4193 .each = .{ .once = &.{4196 .each = .{ .once = &.{
4194 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_src0_unaligned_size), ._, ._ },4197 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4195 .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },4198 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
4196 .{ .@"0:", ._, .mov, .tmp2d, .memia(.src0d, .tmp0, .add_src0_unaligned_size), ._, ._ },4199 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
4197 .{ ._, ._, .xor, .tmp2d, .leaia(.dword, .tmp1, .tmp0, .add_src0_unaligned_size), ._, ._ },4200 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
4198 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_src0_unaligned_size), .tmp2d, ._, ._ },4201 .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
4199 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },4202 .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
4203 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
4200 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4204 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4201 } },4205 } },
4202 } }) catch |err| switch (err) {4206 }, .{
4203 error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{4207 .required_features = .{ .avx, null, null, null },
4204 @tagName(air_tag),4208 .src_constraints = .{
4205 cg.typeOf(ty_op.operand).fmt(pt),4209 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
4206 ops[0].tracking(cg),4210 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
4207 }),4211 },
4208 else => |e| return e,
4209 };
4210 for (ops) |op| for (res) |r| {
4211 if (op.index == r.index) break;
4212 } else try op.die(cg);
4213 try res[0].moveTo(inst, cg);
4214 },
4215
4216 .block => if (use_old) try cg.airBlock(inst) else {
4217 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
4218 const extra = cg.air.extraData(Air.Block, ty_pl.payload);
4219 try cg.asmPseudo(.pseudo_dbg_enter_block_none);
4220 try cg.lowerBlock(inst, @ptrCast(cg.air.extra[extra.end..][0..extra.data.body_len]));
4221 try cg.asmPseudo(.pseudo_dbg_leave_block_none);
4222 },
4223 .loop => if (use_old) try cg.airLoop(inst) else {
4224 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
4225 const extra = cg.air.extraData(Air.Block, ty_pl.payload);
4226 cg.scope_generation += 1;
4227 try cg.loops.putNoClobber(cg.gpa, inst, .{
4228 .state = try cg.saveState(),
4229 .target = @intCast(cg.mir_instructions.len),
4230 });
4231 defer assert(cg.loops.remove(inst));
4232 try cg.genBodyBlock(@ptrCast(cg.air.extra[extra.end..][0..extra.data.body_len]));
4233 },
4234 .repeat => if (use_old) try cg.airRepeat(inst) else {
4235 const repeat = air_datas[@intFromEnum(inst)].repeat;
4236 const loop = cg.loops.get(repeat.loop_inst).?;
4237 try cg.restoreState(loop.state, &.{}, .{
4238 .emit_instructions = true,
4239 .update_tracking = false,
4240 .resurrect = false,
4241 .close_scope = true,
4242 });
4243 _ = try cg.asmJmpReloc(loop.target);
4244 },
4245 .br => try cg.airBr(inst),
4246 .trap => try cg.asmOpOnly(.{ ._2, .ud }),
4247 .breakpoint => try cg.asmOpOnly(.{ ._3, .int }),
4248 .ret_addr => if (use_old) try cg.airRetAddr(inst) else {
4249 var slot = try cg.tempInit(.usize, .{ .load_frame = .{
4250 .index = .ret_addr,
4251 } });
4252 while (try slot.toRegClass(true, .general_purpose, cg)) {}
4253 try slot.moveTo(inst, cg);
4254 },
4255 .frame_addr => if (use_old) try cg.airFrameAddress(inst) else {
4256 var slot = try cg.tempInit(.usize, .{ .lea_frame = .{
4257 .index = .base_ptr,
4258 } });
4259 try slot.moveTo(inst, cg);
4260 },
4261 .call => try cg.airCall(inst, .auto, .{ .safety = true }),
4262 .call_always_tail => try cg.airCall(inst, .always_tail, .{ .safety = true }),
4263 .call_never_tail => try cg.airCall(inst, .never_tail, .{ .safety = true }),
4264 .call_never_inline => try cg.airCall(inst, .never_inline, .{ .safety = true }),
4265
4266 .clz => |air_tag| if (use_old) try cg.airClz(inst) else {
4267 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
4268 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
4269 var res: [1]Temp = undefined;
4270 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{
4271 .required_features = .{ .slow_incdec, null, null, null },
4272 .src_constraints = .{ .{ .exact_signed_int = 1 }, .any },
4273 .patterns = &.{4212 .patterns = &.{
4274 .{ .src = .{ .mut_mem, .none } },4213 .{ .src = .{ .to_sse, .mem } },
4275 .{ .src = .{ .to_mut_gpr, .none } },4214 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4215 .{ .src = .{ .to_sse, .to_sse } },
4276 },4216 },
4277 .dst_temps = .{.{ .ref = .src0 }},4217 .dst_temps = .{.{ .rc = .sse }},
4278 .clobbers = .{ .eflags = true },
4279 .each = .{ .once = &.{4218 .each = .{ .once = &.{
4280 .{ ._, ._, .add, .dst0b, .si(1), ._, ._ },4219 .{ ._, .vp_d, .maxs, .dst0x, .src0x, .src1x, ._ },
4281 } },4220 } },
4282 }, .{4221 }, .{
4283 .src_constraints = .{ .{ .exact_signed_int = 1 }, .any },4222 .required_features = .{ .sse4_1, null, null, null },
4223 .src_constraints = .{
4224 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
4225 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
4226 },
4284 .patterns = &.{4227 .patterns = &.{
4285 .{ .src = .{ .mut_mem, .none } },4228 .{ .src = .{ .to_mut_sse, .mem } },
4286 .{ .src = .{ .to_mut_gpr, .none } },4229 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4230 .{ .src = .{ .to_mut_sse, .to_sse } },
4287 },4231 },
4288 .dst_temps = .{.{ .ref = .src0 }},4232 .dst_temps = .{.{ .ref = .src0 }},
4289 .clobbers = .{ .eflags = true },
4290 .each = .{ .once = &.{4233 .each = .{ .once = &.{
4291 .{ ._, ._c, .in, .dst0b, ._, ._, ._ },4234 .{ ._, .p_d, .maxs, .dst0x, .src1x, ._, ._ },
4292 } },4235 } },
4293 }, .{4236 }, .{
4294 .src_constraints = .{ .{ .exact_unsigned_int = 1 }, .any },4237 .required_features = .{ .sse2, null, null, null },
4238 .src_constraints = .{
4239 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
4240 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
4241 },
4295 .patterns = &.{4242 .patterns = &.{
4296 .{ .src = .{ .mut_mem, .none } },4243 .{ .src = .{ .to_mut_sse, .mem } },
4297 .{ .src = .{ .to_mut_gpr, .none } },4244 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4245 .{ .src = .{ .to_mut_sse, .to_sse } },
4298 },4246 },
4299 .dst_temps = .{.{ .ref = .src0 }},4247 .dst_temps = .{.{ .rc = .sse }},
4300 .clobbers = .{ .eflags = true },
4301 .each = .{ .once = &.{4248 .each = .{ .once = &.{
4302 .{ ._, ._, .xor, .dst0b, .si(1), ._, ._ },4249 .{ ._, ._dqa, .mov, .dst0x, .src0x, ._, ._ },
4250 .{ ._, .p_d, .cmpgt, .dst0x, .src1x, ._, ._ },
4251 .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ },
4252 .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ },
4253 .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ },
4303 } },4254 } },
4304 }, .{4255 }, .{
4305 .required_features = .{ .lzcnt, null, null, null },4256 .required_features = .{ .avx2, null, null, null },
4306 .src_constraints = .{ .{ .unsigned_or_exact_int = .byte }, .any },4257 .src_constraints = .{
4258 .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } },
4259 .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } },
4260 },
4307 .patterns = &.{4261 .patterns = &.{
4308 .{ .src = .{ .mem, .none } },4262 .{ .src = .{ .to_sse, .mem } },
4309 .{ .src = .{ .to_gpr, .none } },4263 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4264 .{ .src = .{ .to_sse, .to_sse } },
4310 },4265 },
4311 .dst_temps = .{.{ .rc = .general_purpose }},4266 .dst_temps = .{.{ .rc = .sse }},
4312 .clobbers = .{ .eflags = true },
4313 .each = .{ .once = &.{4267 .each = .{ .once = &.{
4314 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },4268 .{ ._, .vp_d, .maxs, .dst0y, .src0y, .src1y, ._ },
4315 .{ ._, ._, .lzcnt, .dst0d, .dst0d, ._, ._ },
4316 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },
4317 } },4269 } },
4318 }, .{4270 }, .{
4319 .required_features = .{ .lzcnt, null, null, null },4271 .required_features = .{ .avx2, null, null, null },
4320 .src_constraints = .{ .{ .signed_int = .byte }, .any },4272 .src_constraints = .{
4273 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } },
4274 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } },
4275 },
4321 .patterns = &.{4276 .patterns = &.{
4322 .{ .src = .{ .mem, .none } },4277 .{ .src = .{ .to_mem, .to_mem } },
4323 .{ .src = .{ .to_gpr, .none } },
4324 },4278 },
4325 .dst_temps = .{.{ .rc = .general_purpose }},4279 .extra_temps = .{
4280 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4281 .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } },
4282 .unused,
4283 .unused,
4284 .unused,
4285 .unused,
4286 .unused,
4287 .unused,
4288 .unused,
4289 },
4290 .dst_temps = .{.mem},
4326 .clobbers = .{ .eflags = true },4291 .clobbers = .{ .eflags = true },
4327 .each = .{ .once = &.{4292 .each = .{ .once = &.{
4328 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },4293 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4329 .{ ._, ._, .@"and", .dst0d, .sa(.src0, .add_umax), ._, ._ },4294 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
4330 .{ ._, ._, .lzcnt, .dst0d, .dst0d, ._, ._ },4295 .{ ._, .vp_d, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
4331 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },4296 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
4297 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
4298 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4332 } },4299 } },
4333 }, .{4300 }, .{
4334 .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null },4301 .required_features = .{ .avx, null, null, null },
4335 .src_constraints = .{ .{ .exact_int = 16 }, .any },4302 .src_constraints = .{
4303 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4304 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4305 },
4336 .patterns = &.{4306 .patterns = &.{
4337 .{ .src = .{ .to_mut_gpr, .none } },4307 .{ .src = .{ .to_mem, .to_mem } },
4338 },4308 },
4339 .dst_temps = .{.{ .ref = .src0 }},4309 .extra_temps = .{
4310 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4311 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
4312 .unused,
4313 .unused,
4314 .unused,
4315 .unused,
4316 .unused,
4317 .unused,
4318 .unused,
4319 },
4320 .dst_temps = .{.mem},
4340 .clobbers = .{ .eflags = true },4321 .clobbers = .{ .eflags = true },
4341 .each = .{ .once = &.{4322 .each = .{ .once = &.{
4342 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },4323 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4324 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4325 .{ ._, .vp_d, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
4326 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4327 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4328 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4343 } },4329 } },
4344 }, .{4330 }, .{
4345 .required_features = .{ .lzcnt, null, null, null },4331 .required_features = .{ .sse4_1, null, null, null },
4346 .src_constraints = .{ .{ .exact_int = 16 }, .any },4332 .src_constraints = .{
4333 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4334 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4335 },
4347 .patterns = &.{4336 .patterns = &.{
4348 .{ .src = .{ .mem, .none } },4337 .{ .src = .{ .to_mem, .to_mem } },
4349 .{ .src = .{ .to_gpr, .none } },
4350 },4338 },
4351 .dst_temps = .{.{ .rc = .general_purpose }},4339 .extra_temps = .{
4340 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4341 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
4342 .unused,
4343 .unused,
4344 .unused,
4345 .unused,
4346 .unused,
4347 .unused,
4348 .unused,
4349 },
4350 .dst_temps = .{.mem},
4352 .clobbers = .{ .eflags = true },4351 .clobbers = .{ .eflags = true },
4353 .each = .{ .once = &.{4352 .each = .{ .once = &.{
4354 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },4353 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4354 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4355 .{ ._, .p_d, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4356 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4357 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4358 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4355 } },4359 } },
4356 }, .{4360 }, .{
4357 .required_features = .{ .lzcnt, null, null, null },4361 .required_features = .{ .sse2, null, null, null },
4358 .src_constraints = .{ .{ .signed_int = .word }, .any },4362 .src_constraints = .{
4363 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4364 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4365 },
4359 .patterns = &.{4366 .patterns = &.{
4360 .{ .src = .{ .to_mut_gpr, .none } },4367 .{ .src = .{ .to_mem, .to_mem } },
4361 },4368 },
4362 .dst_temps = .{.{ .ref = .src0 }},4369 .extra_temps = .{
4370 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4371 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
4372 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
4373 .unused,
4374 .unused,
4375 .unused,
4376 .unused,
4377 .unused,
4378 .unused,
4379 },
4380 .dst_temps = .{.mem},
4363 .clobbers = .{ .eflags = true },4381 .clobbers = .{ .eflags = true },
4364 .each = .{ .once = &.{4382 .each = .{ .once = &.{
4365 .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_umax), ._, ._ },4383 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4366 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },4384 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4367 .{ ._, ._, .sub, .dst0b, .sia(16, .src0, .sub_bit_size), ._, ._ },4385 .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ },
4386 .{ ._, .p_d, .cmpgt, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4387 .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ },
4388 .{ ._, .p_, .andn, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4389 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
4390 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4391 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4392 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4368 } },4393 } },
4369 }, .{4394 }, .{
4370 .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null },4395 .required_features = .{ .cmov, null, null, null },
4371 .src_constraints = .{ .{ .unsigned_int = .word }, .any },4396 .src_constraints = .{
4397 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
4398 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
4399 },
4372 .patterns = &.{4400 .patterns = &.{
4373 .{ .src = .{ .to_mut_gpr, .none } },4401 .{ .src = .{ .to_mem, .to_mem } },
4374 },4402 },
4375 .dst_temps = .{.{ .ref = .src0 }},4403 .extra_temps = .{
4404 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4405 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
4406 .unused,
4407 .unused,
4408 .unused,
4409 .unused,
4410 .unused,
4411 .unused,
4412 .unused,
4413 },
4414 .dst_temps = .{.mem},
4376 .clobbers = .{ .eflags = true },4415 .clobbers = .{ .eflags = true },
4377 .each = .{ .once = &.{4416 .each = .{ .once = &.{
4378 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },4417 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4379 .{ ._, ._, .sub, .dst0b, .sia(16, .src0, .sub_bit_size), ._, ._ },4418 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
4419 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4420 .{ ._, ._l, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4421 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
4422 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
4423 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4380 } },4424 } },
4381 }, .{4425 }, .{
4382 .required_features = .{ .lzcnt, null, null, null },4426 .src_constraints = .{
4383 .src_constraints = .{ .{ .unsigned_int = .word }, .any },4427 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
4428 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
4429 },
4384 .patterns = &.{4430 .patterns = &.{
4385 .{ .src = .{ .mem, .none } },4431 .{ .src = .{ .to_mem, .to_mem } },
4386 .{ .src = .{ .to_gpr, .none } },
4387 },4432 },
4388 .dst_temps = .{.{ .rc = .general_purpose }},4433 .extra_temps = .{
4434 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4435 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
4436 .unused,
4437 .unused,
4438 .unused,
4439 .unused,
4440 .unused,
4441 .unused,
4442 .unused,
4443 },
4444 .dst_temps = .{.mem},
4389 .clobbers = .{ .eflags = true },4445 .clobbers = .{ .eflags = true },
4390 .each = .{ .once = &.{4446 .each = .{ .once = &.{
4391 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },4447 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4392 .{ ._, ._, .sub, .dst0b, .sia(16, .src0, .sub_bit_size), ._, ._ },4448 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
4449 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4450 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
4451 .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4452 .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
4453 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
4454 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4393 } },4455 } },
4394 }, .{4456 }, .{
4395 .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null },4457 .required_features = .{ .avx, null, null, null },
4396 .src_constraints = .{ .{ .exact_int = 32 }, .any },4458 .src_constraints = .{
4459 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4460 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4461 },
4397 .patterns = &.{4462 .patterns = &.{
4398 .{ .src = .{ .to_mut_gpr, .none } },4463 .{ .src = .{ .to_sse, .mem } },
4464 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4465 .{ .src = .{ .to_sse, .to_sse } },
4399 },4466 },
4400 .dst_temps = .{.{ .ref = .src0 }},4467 .dst_temps = .{.{ .rc = .sse }},
4401 .clobbers = .{ .eflags = true },
4402 .each = .{ .once = &.{4468 .each = .{ .once = &.{
4403 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },4469 .{ ._, .vp_d, .maxu, .dst0x, .src0x, .src1x, ._ },
4404 } },4470 } },
4405 }, .{4471 }, .{
4406 .required_features = .{ .lzcnt, null, null, null },4472 .required_features = .{ .sse4_1, null, null, null },
4407 .src_constraints = .{ .{ .exact_int = 32 }, .any },4473 .src_constraints = .{
4474 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4475 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4476 },
4408 .patterns = &.{4477 .patterns = &.{
4409 .{ .src = .{ .mem, .none } },4478 .{ .src = .{ .to_mut_sse, .mem } },
4410 .{ .src = .{ .to_gpr, .none } },4479 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4480 .{ .src = .{ .to_mut_sse, .to_sse } },
4411 },4481 },
4412 .dst_temps = .{.{ .rc = .general_purpose }},4482 .dst_temps = .{.{ .ref = .src0 }},
4413 .clobbers = .{ .eflags = true },
4414 .each = .{ .once = &.{4483 .each = .{ .once = &.{
4415 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },4484 .{ ._, .p_d, .maxu, .dst0x, .src1x, ._, ._ },
4416 } },4485 } },
4417 }, .{4486 }, .{
4418 .required_features = .{ .lzcnt, null, null, null },4487 .required_features = .{ .sse2, null, null, null },
4419 .src_constraints = .{ .{ .signed_int = .dword }, .any },4488 .src_constraints = .{
4489 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4490 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4491 },
4420 .patterns = &.{4492 .patterns = &.{
4421 .{ .src = .{ .to_mut_gpr, .none } },4493 .{ .src = .{ .to_mut_sse, .mem } },
4494 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4495 .{ .src = .{ .to_mut_sse, .to_sse } },
4422 },4496 },
4423 .dst_temps = .{.{ .ref = .src0 }},4497 .extra_temps = .{
4424 .clobbers = .{ .eflags = true },4498 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4499 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
4500 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4501 .unused,
4502 .unused,
4503 .unused,
4504 .unused,
4505 .unused,
4506 .unused,
4507 },
4508 .dst_temps = .{.{ .rc = .sse }},
4425 .each = .{ .once = &.{4509 .each = .{ .once = &.{
4426 .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_umax), ._, ._ },4510 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4427 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },4511 .{ ._, ._dqa, .mov, .dst0x, .lea(.xword, .tmp0), ._, ._ },
4428 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },4512 .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ },
4513 .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ },
4514 .{ ._, .p_, .xor, .tmp2x, .src1x, ._, ._ },
4515 .{ ._, .p_d, .cmpgt, .dst0x, .tmp2x, ._, ._ },
4516 .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ },
4517 .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ },
4518 .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ },
4429 } },4519 } },
4430 }, .{4520 }, .{
4431 .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null },4521 .required_features = .{ .avx2, null, null, null },
4432 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },4522 .src_constraints = .{
4523 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
4524 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
4525 },
4433 .patterns = &.{4526 .patterns = &.{
4434 .{ .src = .{ .to_mut_gpr, .none } },4527 .{ .src = .{ .to_sse, .mem } },
4528 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4529 .{ .src = .{ .to_sse, .to_sse } },
4435 },4530 },
4436 .dst_temps = .{.{ .ref = .src0 }},4531 .dst_temps = .{.{ .rc = .sse }},
4437 .clobbers = .{ .eflags = true },
4438 .each = .{ .once = &.{4532 .each = .{ .once = &.{
4439 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },4533 .{ ._, .vp_d, .maxu, .dst0y, .src0y, .src1y, ._ },
4440 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },
4441 } },4534 } },
4442 }, .{4535 }, .{
4443 .required_features = .{ .lzcnt, null, null, null },4536 .required_features = .{ .avx2, null, null, null },
4444 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },4537 .src_constraints = .{
4538 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
4539 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
4540 },
4445 .patterns = &.{4541 .patterns = &.{
4446 .{ .src = .{ .mem, .none } },4542 .{ .src = .{ .to_mem, .to_mem } },
4447 .{ .src = .{ .to_gpr, .none } },
4448 },4543 },
4449 .dst_temps = .{.{ .rc = .general_purpose }},4544 .extra_temps = .{
4450 .clobbers = .{ .eflags = true },4545 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4451 .each = .{ .once = &.{4546 .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } },
4452 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },4547 .unused,
4453 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },4548 .unused,
4454 } },4549 .unused,
4455 }, .{4550 .unused,
4456 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },4551 .unused,
4457 .src_constraints = .{ .{ .exact_int = 64 }, .any },4552 .unused,
4458 .patterns = &.{4553 .unused,
4459 .{ .src = .{ .to_mut_gpr, .none } },
4460 },4554 },
4461 .dst_temps = .{.{ .ref = .src0 }},4555 .dst_temps = .{.mem},
4462 .clobbers = .{ .eflags = true },4556 .clobbers = .{ .eflags = true },
4463 .each = .{ .once = &.{4557 .each = .{ .once = &.{
4464 .{ ._, ._, .lzcnt, .dst0q, .src0q, ._, ._ },4558 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4559 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
4560 .{ ._, .vp_d, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
4561 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
4562 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
4563 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4465 } },4564 } },
4466 }, .{4565 }, .{
4467 .required_features = .{ .@"64bit", .lzcnt, null, null },4566 .required_features = .{ .avx, null, null, null },
4468 .src_constraints = .{ .{ .exact_int = 64 }, .any },4567 .src_constraints = .{
4469 .patterns = &.{4568 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4470 .{ .src = .{ .mem, .none } },4569 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4471 .{ .src = .{ .to_gpr, .none } },
4472 },4570 },
4473 .dst_temps = .{.{ .rc = .general_purpose }},
4474 .clobbers = .{ .eflags = true },
4475 .each = .{ .once = &.{
4476 .{ ._, ._, .lzcnt, .dst0q, .src0q, ._, ._ },
4477 } },
4478 }, .{
4479 .required_features = .{ .@"64bit", .lzcnt, null, null },
4480 .src_constraints = .{ .{ .signed_int = .qword }, .any },
4481 .patterns = &.{4571 .patterns = &.{
4482 .{ .src = .{ .mem, .none } },4572 .{ .src = .{ .to_mem, .to_mem } },
4483 .{ .src = .{ .to_gpr, .none } },
4484 },4573 },
4485 .dst_temps = .{.{ .rc = .general_purpose }},4574 .extra_temps = .{
4486 .clobbers = .{ .eflags = true },4575 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4487 .each = .{ .once = &.{4576 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4488 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },4577 .unused,
4489 .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ },4578 .unused,
4490 .{ ._, ._, .lzcnt, .dst0q, .dst0q, ._, ._ },4579 .unused,
4491 .{ ._, ._, .sub, .dst0b, .sia(64, .src0, .sub_bit_size), ._, ._ },4580 .unused,
4492 } },4581 .unused,
4493 }, .{4582 .unused,
4494 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },4583 .unused,
4495 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },
4496 .patterns = &.{
4497 .{ .src = .{ .to_mut_gpr, .none } },
4498 },4584 },
4499 .dst_temps = .{.{ .ref = .src0 }},4585 .dst_temps = .{.mem},
4500 .clobbers = .{ .eflags = true },4586 .clobbers = .{ .eflags = true },
4501 .each = .{ .once = &.{4587 .each = .{ .once = &.{
4502 .{ ._, ._, .lzcnt, .dst0q, .src0q, ._, ._ },4588 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4503 .{ ._, ._, .sub, .dst0b, .sia(64, .src0, .sub_bit_size), ._, ._ },4589 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4590 .{ ._, .vp_d, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
4591 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4592 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4593 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4504 } },4594 } },
4505 }, .{4595 }, .{
4506 .required_features = .{ .@"64bit", .lzcnt, null, null },4596 .required_features = .{ .sse4_1, null, null, null },
4507 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },4597 .src_constraints = .{
4508 .patterns = &.{4598 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4509 .{ .src = .{ .mem, .none } },4599 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4510 .{ .src = .{ .to_gpr, .none } },
4511 },4600 },
4512 .dst_temps = .{.{ .rc = .general_purpose }},
4513 .clobbers = .{ .eflags = true },
4514 .each = .{ .once = &.{
4515 .{ ._, ._, .lzcnt, .dst0q, .src0q, ._, ._ },
4516 .{ ._, ._, .sub, .dst0b, .sia(64, .src0, .sub_bit_size), ._, ._ },
4517 } },
4518 }, .{
4519 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
4520 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any },
4521 .patterns = &.{4601 .patterns = &.{
4522 .{ .src = .{ .mem, .none } },4602 .{ .src = .{ .to_mem, .to_mem } },
4523 .{ .src = .{ .to_gpr, .none } },
4524 },4603 },
4525 .extra_temps = .{4604 .extra_temps = .{
4526 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4605 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4606 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4607 .unused,
4608 .unused,
4527 .unused,4609 .unused,
4528 .unused,4610 .unused,
4529 .unused,4611 .unused,
4530 .unused,4612 .unused,
4531 .unused,4613 .unused,
4532 },4614 },
4533 .dst_temps = .{.{ .rc = .general_purpose }},4615 .dst_temps = .{.mem},
4534 .clobbers = .{ .eflags = true },4616 .clobbers = .{ .eflags = true },
4535 .each = .{ .once = &.{4617 .each = .{ .once = &.{
4536 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },4618 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4537 .{ ._, ._r, .bs, .dst0d, .dst0d, ._, ._ },4619 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4538 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },4620 .{ ._, .p_d, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4539 .{ ._, ._z, .cmov, .dst0d, .tmp0d, ._, ._ },4621 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4540 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4622 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4623 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4541 } },4624 } },
4542 }, .{4625 }, .{
4543 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },4626 .required_features = .{ .sse2, null, null, null },
4544 .src_constraints = .{ .{ .signed_po2_int = .byte }, .any },4627 .src_constraints = .{
4628 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4629 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4630 },
4545 .patterns = &.{4631 .patterns = &.{
4546 .{ .src = .{ .mem, .none } },4632 .{ .src = .{ .to_mem, .to_mem } },
4547 .{ .src = .{ .to_gpr, .none } },
4548 },4633 },
4549 .extra_temps = .{4634 .extra_temps = .{
4550 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4635 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4551 .unused,4636 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
4552 .unused,4637 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4553 .unused,4638 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4639 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4640 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4641 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4554 .unused,4642 .unused,
4555 .unused,4643 .unused,
4556 },4644 },
4557 .dst_temps = .{.{ .rc = .general_purpose }},4645 .dst_temps = .{.mem},
4558 .clobbers = .{ .eflags = true },4646 .clobbers = .{ .eflags = true },
4559 .each = .{ .once = &.{4647 .each = .{ .once = &.{
4560 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },4648 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4561 .{ ._, ._, .@"and", .dst0d, .sa(.src0, .add_umax), ._, ._ },4649 .{ ._, ._dqa, .mov, .tmp2x, .lea(.xword, .tmp0), ._, ._ },
4562 .{ ._, ._r, .bs, .dst0d, .dst0d, ._, ._ },4650 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4563 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },4651 .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4564 .{ ._, ._z, .cmov, .dst0d, .tmp0d, ._, ._ },4652 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4565 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4653 .{ ._, ._dqa, .mov, .tmp5x, .tmp3x, ._, ._ },
4654 .{ ._, ._dqa, .mov, .tmp6x, .tmp4x, ._, ._ },
4655 .{ ._, .p_, .xor, .tmp5x, .tmp2x, ._, ._ },
4656 .{ ._, .p_, .xor, .tmp6x, .tmp2x, ._, ._ },
4657 .{ ._, .p_d, .cmpgt, .tmp5x, .tmp6x, ._, ._ },
4658 .{ ._, .p_, .@"and", .tmp3x, .tmp5x, ._, ._ },
4659 .{ ._, .p_, .andn, .tmp5x, .tmp4x, ._, ._ },
4660 .{ ._, .p_, .@"or", .tmp3x, .tmp5x, ._, ._ },
4661 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
4662 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4663 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4566 } },4664 } },
4567 }, .{4665 }, .{
4568 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },4666 .required_features = .{ .cmov, null, null, null },
4569 .src_constraints = .{ .{ .signed_int = .byte }, .any },4667 .src_constraints = .{
4668 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
4669 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
4670 },
4570 .patterns = &.{4671 .patterns = &.{
4571 .{ .src = .{ .mem, .none } },4672 .{ .src = .{ .to_mem, .to_mem } },
4572 .{ .src = .{ .to_gpr, .none } },
4573 },4673 },
4574 .extra_temps = .{4674 .extra_temps = .{
4675 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4575 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4676 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4576 .unused,4677 .unused,
4577 .unused,4678 .unused,
4578 .unused,4679 .unused,
4579 .unused,4680 .unused,
4580 .unused,4681 .unused,
4682 .unused,
4683 .unused,
4581 },4684 },
4582 .dst_temps = .{.{ .rc = .general_purpose }},4685 .dst_temps = .{.mem},
4583 .clobbers = .{ .eflags = true },4686 .clobbers = .{ .eflags = true },
4584 .each = .{ .once = &.{4687 .each = .{ .once = &.{
4585 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },4688 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4586 .{ ._, ._, .@"and", .tmp0d, .sa(.src0, .add_umax), ._, ._ },4689 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
4587 .{ ._, ._r, .bs, .tmp0d, .tmp0d, ._, ._ },4690 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4588 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },4691 .{ ._, ._b, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4589 .{ ._, ._z, .cmov, .tmp0d, .dst0d, ._, ._ },4692 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
4590 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4693 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
4591 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },4694 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4592 } },4695 } },
4593 }, .{4696 }, .{
4594 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },4697 .src_constraints = .{
4595 .src_constraints = .{ .{ .unsigned_int = .byte }, .any },4698 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
4699 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
4700 },
4596 .patterns = &.{4701 .patterns = &.{
4597 .{ .src = .{ .mem, .none } },4702 .{ .src = .{ .to_mem, .to_mem } },
4598 .{ .src = .{ .to_gpr, .none } },
4599 },4703 },
4600 .extra_temps = .{4704 .extra_temps = .{
4705 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4601 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4706 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4602 .unused,4707 .unused,
4603 .unused,4708 .unused,
4604 .unused,4709 .unused,
4605 .unused,4710 .unused,
4606 .unused,4711 .unused,
4712 .unused,
4713 .unused,
4607 },4714 },
4608 .dst_temps = .{.{ .rc = .general_purpose }},4715 .dst_temps = .{.mem},
4609 .clobbers = .{ .eflags = true },4716 .clobbers = .{ .eflags = true },
4610 .each = .{ .once = &.{4717 .each = .{ .once = &.{
4611 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },4718 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4612 .{ ._, ._r, .bs, .tmp0d, .tmp0d, ._, ._ },4719 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
4613 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },4720 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4614 .{ ._, ._z, .cmov, .tmp0d, .dst0d, ._, ._ },4721 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
4615 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4722 .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4616 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },4723 .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
4724 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
4725 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4617 } },4726 } },
4618 }, .{4727 }, .{
4619 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },4728 .required_features = .{ .avx, null, null, null },
4620 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any },4729 .src_constraints = .{
4621 .patterns = &.{4730 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
4622 .{ .src = .{ .mem, .none } },4731 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
4623 .{ .src = .{ .to_gpr, .none } },
4624 },4732 },
4625 .dst_temps = .{.{ .rc = .general_purpose }},
4626 .clobbers = .{ .eflags = true },
4627 .each = .{ .once = &.{
4628 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
4629 .{ ._, ._r, .bs, .dst0d, .dst0d, ._, ._ },
4630 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
4631 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
4632 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
4633 } },
4634 }, .{
4635 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
4636 .src_constraints = .{ .{ .signed_po2_int = .byte }, .any },
4637 .patterns = &.{4733 .patterns = &.{
4638 .{ .src = .{ .mem, .none } },4734 .{ .src = .{ .to_sse, .to_sse } },
4639 .{ .src = .{ .to_gpr, .none } },
4640 },4735 },
4641 .dst_temps = .{.{ .rc = .general_purpose }},4736 .dst_temps = .{.{ .rc = .sse }},
4642 .clobbers = .{ .eflags = true },
4643 .each = .{ .once = &.{4737 .each = .{ .once = &.{
4644 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },4738 .{ ._, .vp_q, .cmpgt, .dst0x, .src1x, .src0x, ._ },
4645 .{ ._, ._, .@"and", .dst0d, .sa(.src0, .add_umax), ._, ._ },4739 .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x },
4646 .{ ._, ._r, .bs, .dst0d, .dst0d, ._, ._ },
4647 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
4648 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
4649 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
4650 } },4740 } },
4651 }, .{4741 }, .{
4652 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },4742 .required_features = .{ .sse4_2, null, null, null },
4653 .src_constraints = .{ .{ .signed_int = .byte }, .any },4743 .src_constraints = .{
4744 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
4745 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
4746 },
4654 .patterns = &.{4747 .patterns = &.{
4655 .{ .src = .{ .mem, .none } },4748 .{ .src = .{ .to_mut_sse, .mem } },
4656 .{ .src = .{ .to_gpr, .none } },4749 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4750 .{ .src = .{ .to_mut_sse, .to_sse } },
4657 },4751 },
4658 .extra_temps = .{4752 .extra_temps = .{
4659 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4753 .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } },
4754 .unused,
4755 .unused,
4756 .unused,
4660 .unused,4757 .unused,
4661 .unused,4758 .unused,
4662 .unused,4759 .unused,
4663 .unused,4760 .unused,
4664 .unused,4761 .unused,
4665 },4762 },
4666 .dst_temps = .{.{ .rc = .general_purpose }},4763 .dst_temps = .{.{ .ref = .src0 }},
4667 .clobbers = .{ .eflags = true },
4668 .each = .{ .once = &.{4764 .each = .{ .once = &.{
4669 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },4765 .{ ._, ._dqa, .mov, .tmp0x, .src1x, ._, ._ },
4670 .{ ._, ._, .@"and", .tmp0d, .sa(.src0, .add_umax), ._, ._ },4766 .{ ._, .p_q, .cmpgt, .tmp0x, .src0x, ._, ._ },
4671 .{ ._, ._r, .bs, .tmp0d, .tmp0d, ._, ._ },4767 .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp0x, ._ },
4672 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
4673 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
4674 .{ ._, ._c, .st, ._, ._, ._, ._ },
4675 .{ ._, ._, .sbb, .dst0b, .tmp0b, ._, ._ },
4676 } },4768 } },
4677 }, .{4769 }, .{
4678 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },4770 .required_features = .{ .avx2, null, null, null },
4679 .src_constraints = .{ .{ .unsigned_int = .byte }, .any },4771 .src_constraints = .{
4772 .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } },
4773 .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } },
4774 },
4680 .patterns = &.{4775 .patterns = &.{
4681 .{ .src = .{ .mem, .none } },4776 .{ .src = .{ .to_sse, .to_sse } },
4682 .{ .src = .{ .to_gpr, .none } },4777 },
4778 .dst_temps = .{.{ .rc = .sse }},
4779 .each = .{ .once = &.{
4780 .{ ._, .vp_q, .cmpgt, .dst0y, .src1y, .src0y, ._ },
4781 .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y },
4782 } },
4783 }, .{
4784 .required_features = .{ .avx2, null, null, null },
4785 .src_constraints = .{
4786 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } },
4787 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } },
4788 },
4789 .patterns = &.{
4790 .{ .src = .{ .to_mem, .to_mem } },
4683 },4791 },
4684 .extra_temps = .{4792 .extra_temps = .{
4685 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4793 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4794 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
4795 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
4796 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
4686 .unused,4797 .unused,
4687 .unused,4798 .unused,
4688 .unused,4799 .unused,
4689 .unused,4800 .unused,
4690 .unused,4801 .unused,
4691 },4802 },
4692 .dst_temps = .{.{ .rc = .general_purpose }},4803 .dst_temps = .{.mem},
4693 .clobbers = .{ .eflags = true },4804 .clobbers = .{ .eflags = true },
4694 .each = .{ .once = &.{4805 .each = .{ .once = &.{
4695 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },4806 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4696 .{ ._, ._r, .bs, .tmp0d, .tmp0d, ._, ._ },4807 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
4697 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },4808 .{ ._, .v_dqa, .mov, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
4698 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },4809 .{ ._, .vp_q, .cmpgt, .tmp3y, .tmp2y, .tmp1y, ._ },
4699 .{ ._, ._c, .st, ._, ._, ._, ._ },4810 .{ ._, .vp_b, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
4700 .{ ._, ._, .sbb, .dst0b, .tmp0b, ._, ._ },4811 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
4812 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
4813 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4701 } },4814 } },
4702 }, .{4815 }, .{
4703 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any },4816 .required_features = .{ .avx, null, null, null },
4817 .src_constraints = .{
4818 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
4819 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
4820 },
4704 .patterns = &.{4821 .patterns = &.{
4705 .{ .src = .{ .mem, .none } },4822 .{ .src = .{ .to_mem, .to_mem } },
4706 .{ .src = .{ .to_gpr, .none } },
4707 },4823 },
4708 .extra_temps = .{4824 .extra_temps = .{
4709 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4825 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4826 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
4827 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
4828 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
4710 .unused,4829 .unused,
4711 .unused,4830 .unused,
4712 .unused,4831 .unused,
4713 .unused,4832 .unused,
4714 .unused,4833 .unused,
4715 },4834 },
4716 .dst_temps = .{.{ .rc = .general_purpose }},4835 .dst_temps = .{.mem},
4717 .clobbers = .{ .eflags = true },4836 .clobbers = .{ .eflags = true },
4718 .each = .{ .once = &.{4837 .each = .{ .once = &.{
4719 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },4838 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4720 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },4839 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4721 .{ ._, ._r, .bs, .dst0d, .tmp0d, ._, ._ },4840 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4722 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4841 .{ ._, .vp_q, .cmpgt, .tmp3x, .tmp2x, .tmp1x, ._ },
4842 .{ ._, .vp_b, .blendv, .tmp1x, .tmp1x, .tmp2x, .tmp3x },
4843 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4844 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4845 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4723 } },4846 } },
4724 }, .{4847 }, .{
4725 .src_constraints = .{ .{ .signed_po2_int = .byte }, .any },4848 .required_features = .{ .sse4_2, null, null, null },
4849 .src_constraints = .{
4850 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
4851 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
4852 },
4726 .patterns = &.{4853 .patterns = &.{
4727 .{ .src = .{ .mem, .none } },4854 .{ .src = .{ .to_mem, .to_mem } },
4728 .{ .src = .{ .to_gpr, .none } },
4729 },4855 },
4730 .extra_temps = .{4856 .extra_temps = .{
4731 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4857 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4858 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
4859 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
4860 .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } },
4732 .unused,4861 .unused,
4733 .unused,4862 .unused,
4734 .unused,4863 .unused,
4735 .unused,4864 .unused,
4736 .unused,4865 .unused,
4737 },4866 },
4738 .dst_temps = .{.{ .rc = .general_purpose }},4867 .dst_temps = .{.mem},
4739 .clobbers = .{ .eflags = true },4868 .clobbers = .{ .eflags = true },
4740 .each = .{ .once = &.{4869 .each = .{ .once = &.{
4741 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },4870 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4742 .{ ._, ._, .@"and", .tmp0d, .sa(.src0, .add_umax), ._, ._ },4871 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4743 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },4872 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4744 .{ ._, ._r, .bs, .dst0d, .tmp0d, ._, ._ },4873 .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ },
4745 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4874 .{ ._, .p_q, .cmpgt, .tmp3x, .tmp1x, ._, ._ },
4875 .{ ._, .p_b, .blendv, .tmp1x, .tmp2x, .tmp3x, ._ },
4876 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4877 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4878 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4746 } },4879 } },
4747 }, .{4880 }, .{
4748 .src_constraints = .{ .{ .signed_int = .byte }, .any },4881 .required_features = .{ .@"64bit", .cmov, null, null },
4882 .src_constraints = .{
4883 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
4884 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
4885 },
4749 .patterns = &.{4886 .patterns = &.{
4750 .{ .src = .{ .mem, .none } },4887 .{ .src = .{ .to_mem, .to_mem } },
4751 .{ .src = .{ .to_gpr, .none } },
4752 },4888 },
4753 .extra_temps = .{4889 .extra_temps = .{
4754 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4890 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4891 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
4892 .unused,
4893 .unused,
4755 .unused,4894 .unused,
4756 .unused,4895 .unused,
4757 .unused,4896 .unused,
4758 .unused,4897 .unused,
4759 .unused,4898 .unused,
4760 },4899 },
4761 .dst_temps = .{.{ .rc = .general_purpose }},4900 .dst_temps = .{.mem},
4762 .clobbers = .{ .eflags = true },4901 .clobbers = .{ .eflags = true },
4763 .each = .{ .once = &.{4902 .each = .{ .once = &.{
4764 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },4903 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4765 .{ ._, ._, .@"and", .dst0d, .sa(.src0, .add_umax), ._, ._ },4904 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4766 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },4905 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4767 .{ ._, ._r, .bs, .tmp0d, .dst0d, ._, ._ },4906 .{ ._, ._l, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4768 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4907 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
4769 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },4908 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
4909 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4770 } },4910 } },
4771 }, .{4911 }, .{
4772 .src_constraints = .{ .{ .unsigned_int = .byte }, .any },4912 .required_features = .{ .@"64bit", null, null, null },
4913 .src_constraints = .{
4914 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
4915 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
4916 },
4773 .patterns = &.{4917 .patterns = &.{
4774 .{ .src = .{ .mem, .none } },4918 .{ .src = .{ .to_mem, .to_mem } },
4775 .{ .src = .{ .to_gpr, .none } },
4776 },4919 },
4777 .extra_temps = .{4920 .extra_temps = .{
4778 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },4921 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4922 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
4923 .unused,
4924 .unused,
4779 .unused,4925 .unused,
4780 .unused,4926 .unused,
4781 .unused,4927 .unused,
4782 .unused,4928 .unused,
4783 .unused,4929 .unused,
4784 },4930 },
4785 .dst_temps = .{.{ .rc = .general_purpose }},4931 .dst_temps = .{.mem},
4786 .clobbers = .{ .eflags = true },4932 .clobbers = .{ .eflags = true },
4787 .each = .{ .once = &.{4933 .each = .{ .once = &.{
4788 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },4934 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4789 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },4935 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4790 .{ ._, ._r, .bs, .tmp0d, .dst0d, ._, ._ },4936 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4791 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4937 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
4792 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },4938 .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4939 .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
4940 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
4941 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4793 } },4942 } },
4794 }, .{4943 }, .{
4795 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },4944 .required_features = .{ .avx, null, null, null },
4796 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any },4945 .src_constraints = .{
4946 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
4947 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
4948 },
4797 .patterns = &.{4949 .patterns = &.{
4798 .{ .src = .{ .to_mut_gpr, .none } },4950 .{ .src = .{ .to_sse, .mem } },
4951 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4952 .{ .src = .{ .to_sse, .to_sse } },
4799 },4953 },
4800 .dst_temps = .{.{ .rc = .general_purpose }},4954 .extra_temps = .{
4801 .clobbers = .{ .eflags = true },4955 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4956 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
4957 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
4958 .unused,
4959 .unused,
4960 .unused,
4961 .unused,
4962 .unused,
4963 .unused,
4964 },
4965 .dst_temps = .{.{ .rc = .sse }},
4802 .each = .{ .once = &.{4966 .each = .{ .once = &.{
4803 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },4967 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4804 .{ ._, ._, .mov, .dst0w, .sia(-1, .src0, .add_2_bit_size), ._, ._ },4968 .{ ._, .v_, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
4805 .{ ._, ._nz, .cmov, .dst0w, .src0w, ._, ._ },4969 .{ ._, .vp_, .xor, .dst0x, .tmp2x, .src0x, ._ },
4806 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },4970 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .src1x, ._ },
4971 .{ ._, .vp_q, .cmpgt, .dst0x, .tmp2x, .dst0x, ._ },
4972 .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x },
4807 } },4973 } },
4808 }, .{4974 }, .{
4809 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },4975 .required_features = .{ .sse4_2, null, null, null },
4810 .src_constraints = .{ .{ .signed_int = .word }, .any },4976 .src_constraints = .{
4977 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
4978 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
4979 },
4811 .patterns = &.{4980 .patterns = &.{
4812 .{ .src = .{ .to_mut_gpr, .none } },4981 .{ .src = .{ .to_mut_sse, .mem } },
4982 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4983 .{ .src = .{ .to_mut_sse, .to_sse } },
4813 },4984 },
4814 .dst_temps = .{.{ .rc = .general_purpose }},4985 .extra_temps = .{
4815 .clobbers = .{ .eflags = true },4986 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4987 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
4988 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
4989 .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } },
4990 .unused,
4991 .unused,
4992 .unused,
4993 .unused,
4994 .unused,
4995 },
4996 .dst_temps = .{.{ .ref = .src0 }},
4816 .each = .{ .once = &.{4997 .each = .{ .once = &.{
4817 .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_umax), ._, ._ },4998 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4818 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },4999 .{ ._, ._, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
4819 .{ ._, ._, .mov, .dst0w, .si(0xff), ._, ._ },5000 .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ },
4820 .{ ._, ._z, .cmov, .src0w, .dst0w, ._, ._ },5001 .{ ._, .p_, .xor, .tmp2x, .src0x, ._, ._ },
4821 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5002 .{ ._, .p_, .xor, .tmp3x, .src1x, ._, ._ },
4822 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },5003 .{ ._, .p_q, .cmpgt, .tmp3x, .tmp2x, ._, ._ },
5004 .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp3x, ._ },
4823 } },5005 } },
4824 }, .{5006 }, .{
4825 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },5007 .required_features = .{ .avx2, null, null, null },
4826 .src_constraints = .{ .{ .unsigned_int = .word }, .any },5008 .src_constraints = .{
5009 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
5010 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
5011 },
4827 .patterns = &.{5012 .patterns = &.{
4828 .{ .src = .{ .to_mut_gpr, .none } },5013 .{ .src = .{ .to_sse, .mem } },
5014 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
5015 .{ .src = .{ .to_sse, .to_sse } },
4829 },5016 },
4830 .dst_temps = .{.{ .rc = .general_purpose }},5017 .extra_temps = .{
4831 .clobbers = .{ .eflags = true },5018 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5019 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
5020 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
5021 .unused,
5022 .unused,
5023 .unused,
5024 .unused,
5025 .unused,
5026 .unused,
5027 },
5028 .dst_temps = .{.{ .rc = .sse }},
4832 .each = .{ .once = &.{5029 .each = .{ .once = &.{
4833 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },5030 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4834 .{ ._, ._, .mov, .dst0w, .si(0xff), ._, ._ },5031 .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.qword, .tmp0), ._, ._ },
4835 .{ ._, ._z, .cmov, .src0w, .dst0w, ._, ._ },5032 .{ ._, .vp_, .xor, .dst0y, .tmp2y, .src0y, ._ },
4836 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5033 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .src1y, ._ },
4837 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },5034 .{ ._, .vp_q, .cmpgt, .dst0y, .tmp2y, .dst0y, ._ },
5035 .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y },
4838 } },5036 } },
4839 }, .{5037 }, .{
4840 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },5038 .required_features = .{ .avx2, null, null, null },
4841 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any },5039 .src_constraints = .{
5040 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
5041 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
5042 },
4842 .patterns = &.{5043 .patterns = &.{
4843 .{ .src = .{ .to_mut_gpr, .none } },5044 .{ .src = .{ .to_mem, .to_mem } },
4844 },5045 },
4845 .dst_temps = .{.{ .ref = .src0 }},5046 .extra_temps = .{
5047 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5048 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
5049 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
5050 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
5051 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
5052 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
5053 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
5054 .unused,
5055 .unused,
5056 },
5057 .dst_temps = .{.mem},
4846 .clobbers = .{ .eflags = true },5058 .clobbers = .{ .eflags = true },
4847 .each = .{ .once = &.{5059 .each = .{ .once = &.{
4848 .{ ._, ._r, .bs, .dst0w, .src0w, ._, ._ },5060 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4849 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },5061 .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.qword, .tmp0), ._, ._ },
4850 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },5062 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4851 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5063 .{ .@"0:", .v_dqa, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5064 .{ ._, .v_dqa, .mov, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
5065 .{ ._, .vp_, .xor, .tmp5y, .tmp3y, .tmp2y, ._ },
5066 .{ ._, .vp_, .xor, .tmp6y, .tmp4y, .tmp2y, ._ },
5067 .{ ._, .vp_q, .cmpgt, .tmp5y, .tmp6y, .tmp5y, ._ },
5068 .{ ._, .vp_b, .blendv, .tmp3y, .tmp3y, .tmp4y, .tmp5y },
5069 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ },
5070 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
5071 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4852 } },5072 } },
4853 }, .{5073 }, .{
4854 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },5074 .required_features = .{ .avx, null, null, null },
4855 .src_constraints = .{ .{ .signed_int = .word }, .any },5075 .src_constraints = .{
5076 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
5077 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
5078 },
4856 .patterns = &.{5079 .patterns = &.{
4857 .{ .src = .{ .to_mut_gpr, .none } },5080 .{ .src = .{ .to_mem, .to_mem } },
4858 },5081 },
4859 .dst_temps = .{.{ .rc = .general_purpose }},5082 .extra_temps = .{
5083 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5084 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
5085 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5086 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5087 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5088 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5089 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5090 .unused,
5091 .unused,
5092 },
5093 .dst_temps = .{.mem},
4860 .clobbers = .{ .eflags = true },5094 .clobbers = .{ .eflags = true },
4861 .each = .{ .once = &.{5095 .each = .{ .once = &.{
4862 .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_umax), ._, ._ },5096 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4863 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },5097 .{ ._, .v_, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
4864 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },5098 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4865 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },5099 .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4866 .{ ._, ._c, .st, ._, ._, ._, ._ },5100 .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4867 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },5101 .{ ._, .vp_, .xor, .tmp5x, .tmp3x, .tmp2x, ._ },
5102 .{ ._, .vp_, .xor, .tmp6x, .tmp4x, .tmp2x, ._ },
5103 .{ ._, .vp_q, .cmpgt, .tmp5x, .tmp6x, .tmp5x, ._ },
5104 .{ ._, .vp_b, .blendv, .tmp3x, .tmp3x, .tmp4x, .tmp5x },
5105 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
5106 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5107 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4868 } },5108 } },
4869 }, .{5109 }, .{
4870 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },5110 .required_features = .{ .sse4_2, null, null, null },
4871 .src_constraints = .{ .{ .unsigned_int = .word }, .any },5111 .src_constraints = .{
5112 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
5113 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
5114 },
4872 .patterns = &.{5115 .patterns = &.{
4873 .{ .src = .{ .to_mut_gpr, .none } },5116 .{ .src = .{ .to_mem, .to_mem } },
4874 },5117 },
4875 .dst_temps = .{.{ .rc = .general_purpose }},5118 .extra_temps = .{
5119 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5120 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
5121 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5122 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5123 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5124 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5125 .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } },
5126 .unused,
5127 .unused,
5128 },
5129 .dst_temps = .{.mem},
4876 .clobbers = .{ .eflags = true },5130 .clobbers = .{ .eflags = true },
4877 .each = .{ .once = &.{5131 .each = .{ .once = &.{
4878 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },5132 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4879 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },5133 .{ ._, ._, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
4880 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },5134 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4881 .{ ._, ._c, .st, ._, ._, ._, ._ },5135 .{ .@"0:", ._dqa, .mov, .tmp5x, .tmp2x, ._, ._ },
4882 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },5136 .{ ._, ._dqa, .mov, .tmp6x, .tmp2x, ._, ._ },
5137 .{ ._, ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5138 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5139 .{ ._, .p_, .xor, .tmp5x, .tmp3x, ._, ._ },
5140 .{ ._, .p_, .xor, .tmp6x, .tmp4x, ._, ._ },
5141 .{ ._, .p_q, .cmpgt, .tmp6x, .tmp5x, ._, ._ },
5142 .{ ._, .p_b, .blendv, .tmp3x, .tmp4x, .tmp6x, ._ },
5143 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
5144 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5145 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4883 } },5146 } },
4884 }, .{5147 }, .{
4885 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any },5148 .required_features = .{ .@"64bit", .cmov, null, null },
5149 .src_constraints = .{
5150 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
5151 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
5152 },
4886 .patterns = &.{5153 .patterns = &.{
4887 .{ .src = .{ .mem, .none } },5154 .{ .src = .{ .to_mem, .to_mem } },
4888 .{ .src = .{ .to_gpr, .none } },
4889 },5155 },
4890 .dst_temps = .{.{ .rc = .general_purpose }},5156 .extra_temps = .{
5157 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5158 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5159 .unused,
5160 .unused,
5161 .unused,
5162 .unused,
5163 .unused,
5164 .unused,
5165 .unused,
5166 },
5167 .dst_temps = .{.mem},
4891 .clobbers = .{ .eflags = true },5168 .clobbers = .{ .eflags = true },
4892 .each = .{ .once = &.{5169 .each = .{ .once = &.{
4893 .{ ._, ._, .mov, .dst0w, .sia(-1, .src0, .add_2_bit_size), ._, ._ },5170 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4894 .{ ._, ._r, .bs, .dst0w, .src0w, ._, ._ },5171 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4895 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5172 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5173 .{ ._, ._b, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5174 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
5175 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
5176 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4896 } },5177 } },
4897 }, .{5178 }, .{
4898 .src_constraints = .{ .{ .signed_int = .word }, .any },5179 .required_features = .{ .@"64bit", null, null, null },
5180 .src_constraints = .{
5181 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
5182 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
5183 },
4899 .patterns = &.{5184 .patterns = &.{
4900 .{ .src = .{ .to_mut_gpr, .none } },5185 .{ .src = .{ .to_mem, .to_mem } },
4901 },5186 },
4902 .extra_temps = .{5187 .extra_temps = .{
4903 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },5188 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5189 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5190 .unused,
5191 .unused,
4904 .unused,5192 .unused,
4905 .unused,5193 .unused,
4906 .unused,5194 .unused,
4907 .unused,5195 .unused,
4908 .unused,5196 .unused,
4909 },5197 },
4910 .dst_temps = .{.{ .rc = .general_purpose }},5198 .dst_temps = .{.mem},
4911 .clobbers = .{ .eflags = true },5199 .clobbers = .{ .eflags = true },
4912 .each = .{ .once = &.{5200 .each = .{ .once = &.{
4913 .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_umax), ._, ._ },5201 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4914 .{ ._, ._, .mov, .tmp0w, .si(0xff), ._, ._ },5202 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4915 .{ ._, ._r, .bs, .tmp0w, .src0w, ._, ._ },5203 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4916 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5204 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
4917 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },5205 .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5206 .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
5207 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
5208 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4918 } },5209 } },
4919 }, .{5210 }, .{
4920 .src_constraints = .{ .{ .unsigned_int = .word }, .any },5211 .required_features = .{ .@"64bit", .cmov, null, null },
5212 .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int },
4921 .patterns = &.{5213 .patterns = &.{
4922 .{ .src = .{ .mem, .none } },5214 .{ .src = .{ .to_mem, .to_mem } },
4923 .{ .src = .{ .to_gpr, .none } },
4924 },5215 },
4925 .extra_temps = .{5216 .extra_temps = .{
4926 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },5217 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5218 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5219 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5220 .{ .type = .u64, .kind = .{ .reg = .rcx } },
4927 .unused,5221 .unused,
4928 .unused,5222 .unused,
4929 .unused,5223 .unused,
4930 .unused,5224 .unused,
4931 .unused,5225 .unused,
4932 },5226 },
4933 .dst_temps = .{.{ .rc = .general_purpose }},5227 .dst_temps = .{.mem},
4934 .clobbers = .{ .eflags = true },5228 .clobbers = .{ .eflags = true },
4935 .each = .{ .once = &.{5229 .each = .{ .once = &.{
4936 .{ ._, ._, .mov, .tmp0w, .si(0xff), ._, ._ },5230 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4937 .{ ._, ._r, .bs, .tmp0w, .src0w, ._, ._ },5231 .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ },
4938 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5232 .{ ._, ._c, .cl, ._, ._, ._, ._ },
4939 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },5233 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
5234 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5235 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
5236 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
5237 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
5238 .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
5239 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5240 .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
5241 .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
5242 .{ ._, ._l, .cmov, .tmp1p, .tmp2p, ._, ._ },
5243 .{ ._, ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
5244 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
5245 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5246 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
5247 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4940 } },5248 } },
4941 }, .{5249 }, .{
4942 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },5250 .required_features = .{ .@"64bit", null, null, null },
4943 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any },5251 .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int },
4944 .patterns = &.{5252 .patterns = &.{
4945 .{ .src = .{ .to_mut_gpr, .none } },5253 .{ .src = .{ .to_mem, .to_mem } },
4946 },5254 },
4947 .dst_temps = .{.{ .rc = .general_purpose }},5255 .extra_temps = .{
5256 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5257 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5258 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5259 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5260 .unused,
5261 .unused,
5262 .unused,
5263 .unused,
5264 .unused,
5265 },
5266 .dst_temps = .{.mem},
4948 .clobbers = .{ .eflags = true },5267 .clobbers = .{ .eflags = true },
4949 .each = .{ .once = &.{5268 .each = .{ .once = &.{
4950 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },5269 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4951 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },5270 .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ },
4952 .{ ._, ._nz, .cmov, .dst0d, .src0d, ._, ._ },5271 .{ ._, ._c, .cl, ._, ._, ._, ._ },
4953 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5272 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
5273 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5274 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
5275 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
5276 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
5277 .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
5278 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5279 .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
5280 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
5281 .{ ._, ._, .lea, .tmp1p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
5282 .{ .@"1:", ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
5283 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
5284 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5285 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
5286 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4954 } },5287 } },
4955 }, .{5288 }, .{
4956 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },5289 .required_features = .{ .@"64bit", .cmov, null, null },
4957 .src_constraints = .{ .{ .signed_int = .dword }, .any },5290 .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int },
4958 .patterns = &.{5291 .patterns = &.{
4959 .{ .src = .{ .to_mut_gpr, .none } },5292 .{ .src = .{ .to_mem, .to_mem } },
4960 },5293 },
4961 .dst_temps = .{.{ .rc = .general_purpose }},5294 .extra_temps = .{
5295 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5296 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5297 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5298 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5299 .unused,
5300 .unused,
5301 .unused,
5302 .unused,
5303 .unused,
5304 },
5305 .dst_temps = .{.mem},
4962 .clobbers = .{ .eflags = true },5306 .clobbers = .{ .eflags = true },
4963 .each = .{ .once = &.{5307 .each = .{ .once = &.{
4964 .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_umax), ._, ._ },5308 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4965 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },5309 .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
4966 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },5310 .{ ._, ._c, .cl, ._, ._, ._, ._ },
4967 .{ ._, ._z, .cmov, .src0d, .dst0d, ._, ._ },5311 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4968 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5312 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4969 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },5313 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
5314 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
5315 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
5316 .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ },
5317 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ },
5318 .{ ._, ._b, .cmov, .tmp1p, .tmp2p, ._, ._ },
5319 .{ ._, ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ },
5320 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
5321 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5322 .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ },
5323 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
4970 } },5324 } },
4971 }, .{5325 }, .{
4972 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },5326 .required_features = .{ .@"64bit", null, null, null },
4973 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },5327 .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int },
4974 .patterns = &.{5328 .patterns = &.{
4975 .{ .src = .{ .to_mut_gpr, .none } },5329 .{ .src = .{ .to_mem, .to_mem } },
4976 },5330 },
4977 .dst_temps = .{.{ .rc = .general_purpose }},5331 .extra_temps = .{
5332 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5333 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5334 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5335 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5336 .unused,
5337 .unused,
5338 .unused,
5339 .unused,
5340 .unused,
5341 },
5342 .dst_temps = .{.mem},
4978 .clobbers = .{ .eflags = true },5343 .clobbers = .{ .eflags = true },
4979 .each = .{ .once = &.{5344 .each = .{ .once = &.{
4980 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },5345 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4981 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },5346 .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
4982 .{ ._, ._z, .cmov, .src0d, .dst0d, ._, ._ },5347 .{ ._, ._c, .cl, ._, ._, ._, ._ },
4983 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5348 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4984 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },5349 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5350 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
5351 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
5352 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
5353 .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ },
5354 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
5355 .{ ._, ._, .lea, .tmp1p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ },
5356 .{ .@"1:", ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ },
5357 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
5358 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5359 .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ },
5360 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
4985 } },5361 } },
4986 }, .{5362 } }) catch |err| switch (err) {
4987 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },5363 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
4988 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any },5364 @tagName(air_tag),
5365 cg.typeOf(bin_op.lhs).fmt(pt),
5366 ops[0].tracking(cg),
5367 ops[1].tracking(cg),
5368 }),
5369 else => |e| return e,
5370 };
5371 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
5372 },
5373 .min => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else fallback: {
5374 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
5375 if (cg.typeOf(bin_op.lhs).scalarType(zcu).isRuntimeFloat()) break :fallback try cg.airBinOp(inst, air_tag);
5376 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
5377 var res: [1]Temp = undefined;
5378 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
5379 .required_features = .{ .cmov, null, null, null },
5380 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } },
4989 .patterns = &.{5381 .patterns = &.{
4990 .{ .src = .{ .to_mut_gpr, .none } },5382 .{ .src = .{ .to_mut_gpr, .to_gpr } },
4991 },5383 },
4992 .dst_temps = .{.{ .ref = .src0 }},5384 .dst_temps = .{.{ .ref = .src0 }},
4993 .clobbers = .{ .eflags = true },5385 .clobbers = .{ .eflags = true },
4994 .each = .{ .once = &.{5386 .each = .{ .once = &.{
4995 .{ ._, ._r, .bs, .dst0d, .src0d, ._, ._ },5387 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
4996 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },5388 .{ ._, ._ge, .cmov, .dst0d, .src1d, ._, ._ },
4997 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
4998 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
4999 } },5389 } },
5000 }, .{5390 }, .{
5001 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },5391 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } },
5002 .src_constraints = .{ .{ .signed_int = .dword }, .any },
5003 .patterns = &.{5392 .patterns = &.{
5004 .{ .src = .{ .to_mut_gpr, .none } },5393 .{ .src = .{ .to_mut_gpr, .mem } },
5394 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5395 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5005 },5396 },
5006 .dst_temps = .{.{ .rc = .general_purpose }},5397 .dst_temps = .{.{ .ref = .src0 }},
5007 .clobbers = .{ .eflags = true },5398 .clobbers = .{ .eflags = true },
5008 .each = .{ .once = &.{5399 .each = .{ .once = &.{
5009 .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_umax), ._, ._ },5400 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
5010 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },5401 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5011 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },5402 .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ },
5012 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
5013 .{ ._, ._c, .st, ._, ._, ._, ._ },
5014 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },
5015 } },5403 } },
5016 }, .{5404 }, .{
5017 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },5405 .required_features = .{ .cmov, null, null, null },
5018 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },5406 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } },
5019 .patterns = &.{5407 .patterns = &.{
5020 .{ .src = .{ .to_mut_gpr, .none } },5408 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5021 },5409 },
5022 .dst_temps = .{.{ .rc = .general_purpose }},5410 .dst_temps = .{.{ .ref = .src0 }},
5023 .clobbers = .{ .eflags = true },5411 .clobbers = .{ .eflags = true },
5024 .each = .{ .once = &.{5412 .each = .{ .once = &.{
5025 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },5413 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
5026 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },5414 .{ ._, ._ae, .cmov, .dst0d, .src1d, ._, ._ },
5027 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
5028 .{ ._, ._c, .st, ._, ._, ._, ._ },
5029 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },
5030 } },5415 } },
5031 }, .{5416 }, .{
5032 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any },5417 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } },
5033 .patterns = &.{5418 .patterns = &.{
5034 .{ .src = .{ .mem, .none } },5419 .{ .src = .{ .to_mut_gpr, .mem } },
5035 .{ .src = .{ .to_gpr, .none } },5420 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5421 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5036 },5422 },
5037 .dst_temps = .{.{ .rc = .general_purpose }},5423 .dst_temps = .{.{ .ref = .src0 }},
5038 .clobbers = .{ .eflags = true },5424 .clobbers = .{ .eflags = true },
5039 .each = .{ .once = &.{5425 .each = .{ .once = &.{
5040 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },5426 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
5041 .{ ._, ._r, .bs, .dst0d, .src0d, ._, ._ },5427 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5042 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5428 .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ },
5043 } },5429 } },
5044 }, .{5430 }, .{
5045 .src_constraints = .{ .{ .signed_int = .dword }, .any },5431 .required_features = .{ .cmov, null, null, null },
5432 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } },
5046 .patterns = &.{5433 .patterns = &.{
5047 .{ .src = .{ .to_mut_gpr, .none } },5434 .{ .src = .{ .to_mut_gpr, .mem } },
5048 },5435 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5049 .extra_temps = .{5436 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5050 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
5051 .unused,
5052 .unused,
5053 .unused,
5054 .unused,
5055 .unused,
5056 },5437 },
5057 .dst_temps = .{.{ .rc = .general_purpose }},5438 .dst_temps = .{.{ .ref = .src0 }},
5058 .clobbers = .{ .eflags = true },5439 .clobbers = .{ .eflags = true },
5059 .each = .{ .once = &.{5440 .each = .{ .once = &.{
5060 .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_umax), ._, ._ },5441 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
5061 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },5442 .{ ._, ._ge, .cmov, .dst0w, .src1w, ._, ._ },
5062 .{ ._, ._r, .bs, .tmp0d, .src0d, ._, ._ },
5063 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
5064 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
5065 } },5443 } },
5066 }, .{5444 }, .{
5067 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },5445 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } },
5068 .patterns = &.{5446 .patterns = &.{
5069 .{ .src = .{ .mem, .none } },5447 .{ .src = .{ .to_mut_gpr, .mem } },
5070 .{ .src = .{ .to_gpr, .none } },5448 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5449 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5071 },5450 },
5072 .extra_temps = .{5451 .dst_temps = .{.{ .ref = .src0 }},
5073 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5452 .clobbers = .{ .eflags = true },
5074 .unused,5453 .each = .{ .once = &.{
5075 .unused,5454 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
5076 .unused,5455 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5077 .unused,5456 .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ },
5078 .unused,5457 } },
5458 }, .{
5459 .required_features = .{ .cmov, null, null, null },
5460 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } },
5461 .patterns = &.{
5462 .{ .src = .{ .to_mut_gpr, .mem } },
5463 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5464 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5079 },5465 },
5080 .dst_temps = .{.{ .rc = .general_purpose }},5466 .dst_temps = .{.{ .ref = .src0 }},
5081 .clobbers = .{ .eflags = true },5467 .clobbers = .{ .eflags = true },
5082 .each = .{ .once = &.{5468 .each = .{ .once = &.{
5083 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },5469 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
5084 .{ ._, ._r, .bs, .tmp0d, .src0d, ._, ._ },5470 .{ ._, ._ae, .cmov, .dst0w, .src1w, ._, ._ },
5085 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
5086 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
5087 } },5471 } },
5088 }, .{5472 }, .{
5089 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null },5473 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } },
5090 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any },
5091 .patterns = &.{5474 .patterns = &.{
5092 .{ .src = .{ .to_mut_gpr, .none } },5475 .{ .src = .{ .to_mut_gpr, .mem } },
5476 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5477 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5093 },5478 },
5094 .dst_temps = .{.{ .rc = .general_purpose }},5479 .dst_temps = .{.{ .ref = .src0 }},
5095 .clobbers = .{ .eflags = true },5480 .clobbers = .{ .eflags = true },
5096 .each = .{ .once = &.{5481 .each = .{ .once = &.{
5097 .{ ._, ._r, .bs, .src0q, .src0q, ._, ._ },5482 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
5098 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },5483 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5099 .{ ._, ._nz, .cmov, .dst0d, .src0d, ._, ._ },5484 .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ },
5100 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
5101 } },5485 } },
5102 }, .{5486 }, .{
5103 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null },5487 .required_features = .{ .cmov, null, null, null },
5104 .src_constraints = .{ .{ .signed_int = .qword }, .any },5488 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } },
5105 .patterns = &.{5489 .patterns = &.{
5106 .{ .src = .{ .mem, .none } },5490 .{ .src = .{ .to_mut_gpr, .mem } },
5107 .{ .src = .{ .to_gpr, .none } },5491 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5492 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5108 },5493 },
5109 .extra_temps = .{5494 .dst_temps = .{.{ .ref = .src0 }},
5110 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },5495 .clobbers = .{ .eflags = true },
5111 .unused,5496 .each = .{ .once = &.{
5112 .unused,5497 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
5113 .unused,5498 .{ ._, ._ge, .cmov, .dst0d, .src1d, ._, ._ },
5114 .unused,5499 } },
5115 .unused,5500 }, .{
5501 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } },
5502 .patterns = &.{
5503 .{ .src = .{ .to_mut_gpr, .mem } },
5504 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5505 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5116 },5506 },
5117 .dst_temps = .{.{ .rc = .general_purpose }},5507 .dst_temps = .{.{ .ref = .src0 }},
5118 .clobbers = .{ .eflags = true },5508 .clobbers = .{ .eflags = true },
5119 .each = .{ .once = &.{5509 .each = .{ .once = &.{
5120 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },5510 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
5121 .{ ._, ._, .@"and", .tmp0q, .src0q, ._, ._ },5511 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5122 .{ ._, ._r, .bs, .tmp0q, .tmp0q, ._, ._ },5512 .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ },
5123 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },
5124 .{ ._, ._z, .cmov, .tmp0d, .dst0d, ._, ._ },
5125 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
5126 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
5127 } },5513 } },
5128 }, .{5514 }, .{
5129 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null },5515 .required_features = .{ .cmov, null, null, null },
5130 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },5516 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } },
5131 .patterns = &.{5517 .patterns = &.{
5132 .{ .src = .{ .to_mut_gpr, .none } },5518 .{ .src = .{ .to_mut_gpr, .mem } },
5519 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5520 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5133 },5521 },
5134 .dst_temps = .{.{ .rc = .general_purpose }},5522 .dst_temps = .{.{ .ref = .src0 }},
5135 .clobbers = .{ .eflags = true },5523 .clobbers = .{ .eflags = true },
5136 .each = .{ .once = &.{5524 .each = .{ .once = &.{
5137 .{ ._, ._r, .bs, .src0q, .src0q, ._, ._ },5525 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
5138 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },5526 .{ ._, ._ae, .cmov, .dst0d, .src1d, ._, ._ },
5139 .{ ._, ._z, .cmov, .src0d, .dst0d, ._, ._ },
5140 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
5141 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },
5142 } },5527 } },
5143 }, .{5528 }, .{
5144 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },5529 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } },
5145 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any },
5146 .patterns = &.{5530 .patterns = &.{
5147 .{ .src = .{ .to_mut_gpr, .none } },5531 .{ .src = .{ .to_mut_gpr, .mem } },
5532 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5533 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5148 },5534 },
5149 .dst_temps = .{.{ .ref = .src0 }},5535 .dst_temps = .{.{ .ref = .src0 }},
5150 .clobbers = .{ .eflags = true },5536 .clobbers = .{ .eflags = true },
5151 .each = .{ .once = &.{5537 .each = .{ .once = &.{
5152 .{ ._, ._r, .bs, .dst0q, .src0q, ._, ._ },5538 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
5153 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },5539 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5154 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },5540 .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ },
5155 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
5156 } },5541 } },
5157 }, .{5542 }, .{
5158 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },5543 .required_features = .{ .@"64bit", .cmov, null, null },
5159 .src_constraints = .{ .{ .signed_int = .qword }, .any },5544 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } },
5160 .patterns = &.{5545 .patterns = &.{
5161 .{ .src = .{ .mem, .none } },5546 .{ .src = .{ .to_mut_gpr, .mem } },
5162 .{ .src = .{ .to_gpr, .none } },5547 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5548 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5163 },5549 },
5164 .extra_temps = .{5550 .dst_temps = .{.{ .ref = .src0 }},
5165 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },5551 .clobbers = .{ .eflags = true },
5166 .unused,5552 .each = .{ .once = &.{
5167 .unused,5553 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
5168 .unused,5554 .{ ._, ._ge, .cmov, .dst0q, .src1q, ._, ._ },
5169 .unused,5555 } },
5170 .unused,5556 }, .{
5557 .required_features = .{ .@"64bit", null, null, null },
5558 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } },
5559 .patterns = &.{
5560 .{ .src = .{ .to_mut_gpr, .mem } },
5561 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5562 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5171 },5563 },
5172 .dst_temps = .{.{ .rc = .general_purpose }},5564 .dst_temps = .{.{ .ref = .src0 }},
5173 .clobbers = .{ .eflags = true },5565 .clobbers = .{ .eflags = true },
5174 .each = .{ .once = &.{5566 .each = .{ .once = &.{
5175 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },5567 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
5176 .{ ._, ._, .@"and", .tmp0q, .src0q, ._, ._ },5568 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5177 .{ ._, ._r, .bs, .tmp0q, .tmp0q, ._, ._ },5569 .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ },
5178 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
5179 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
5180 .{ ._, ._c, .st, ._, ._, ._, ._ },
5181 .{ ._, ._, .sbb, .dst0b, .tmp0b, ._, ._ },
5182 } },5570 } },
5183 }, .{5571 }, .{
5184 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },5572 .required_features = .{ .@"64bit", .cmov, null, null },
5185 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },5573 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } },
5186 .patterns = &.{5574 .patterns = &.{
5187 .{ .src = .{ .to_mut_gpr, .none } },5575 .{ .src = .{ .to_mut_gpr, .mem } },
5576 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5577 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5188 },5578 },
5189 .dst_temps = .{.{ .rc = .general_purpose }},5579 .dst_temps = .{.{ .ref = .src0 }},
5190 .clobbers = .{ .eflags = true },5580 .clobbers = .{ .eflags = true },
5191 .each = .{ .once = &.{5581 .each = .{ .once = &.{
5192 .{ ._, ._r, .bs, .src0q, .src0q, ._, ._ },5582 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
5193 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },5583 .{ ._, ._ae, .cmov, .dst0q, .src1q, ._, ._ },
5194 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
5195 .{ ._, ._c, .st, ._, ._, ._, ._ },
5196 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },
5197 } },5584 } },
5198 }, .{5585 }, .{
5199 .required_features = .{ .@"64bit", null, null, null },5586 .required_features = .{ .@"64bit", null, null, null },
5200 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any },5587 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } },
5201 .patterns = &.{5588 .patterns = &.{
5202 .{ .src = .{ .mem, .none } },5589 .{ .src = .{ .to_mut_gpr, .mem } },
5203 .{ .src = .{ .to_gpr, .none } },5590 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5591 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5204 },5592 },
5205 .dst_temps = .{.{ .rc = .general_purpose }},5593 .dst_temps = .{.{ .ref = .src0 }},
5206 .clobbers = .{ .eflags = true },5594 .clobbers = .{ .eflags = true },
5207 .each = .{ .once = &.{5595 .each = .{ .once = &.{
5208 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },5596 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
5209 .{ ._, ._r, .bs, .dst0q, .src0q, ._, ._ },5597 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5210 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5598 .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ },
5211 } },5599 } },
5212 }, .{5600 }, .{
5213 .required_features = .{ .@"64bit", null, null, null },5601 .required_features = .{ .@"64bit", .cmov, null, null },
5214 .src_constraints = .{ .{ .signed_int = .qword }, .any },5602 .src_constraints = .{ .any_signed_int, .any_signed_int },
5215 .patterns = &.{5603 .patterns = &.{
5216 .{ .src = .{ .mem, .none } },5604 .{ .src = .{ .to_mem, .to_mem } },
5217 .{ .src = .{ .to_gpr, .none } },
5218 },5605 },
5219 .extra_temps = .{5606 .extra_temps = .{
5220 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },5607 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5608 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5609 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5610 .unused,
5221 .unused,5611 .unused,
5222 .unused,5612 .unused,
5223 .unused,5613 .unused,
5224 .unused,5614 .unused,
5225 .unused,5615 .unused,
5226 },5616 },
5227 .dst_temps = .{.{ .rc = .general_purpose }},5617 .dst_temps = .{.mem},
5228 .clobbers = .{ .eflags = true },5618 .clobbers = .{ .eflags = true },
5229 .each = .{ .once = &.{5619 .each = .{ .once = &.{
5230 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },5620 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
5231 .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ },5621 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5232 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },5622 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
5233 .{ ._, ._r, .bs, .tmp0q, .dst0q, ._, ._ },5623 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
5234 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5624 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5235 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },5625 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5626 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
5627 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
5628 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
5629 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
5630 .{ ._, ._ge, .cmov, .tmp0p, .tmp1p, ._, ._ },
5631 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
5632 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
5633 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5236 } },5634 } },
5237 }, .{5635 }, .{
5238 .required_features = .{ .@"64bit", null, null, null },5636 .required_features = .{ .@"64bit", null, null, null },
5239 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },5637 .src_constraints = .{ .any_signed_int, .any_signed_int },
5240 .patterns = &.{5638 .patterns = &.{
5241 .{ .src = .{ .mem, .none } },5639 .{ .src = .{ .to_mem, .to_mem } },
5242 .{ .src = .{ .to_gpr, .none } },
5243 },5640 },
5244 .extra_temps = .{5641 .extra_temps = .{
5245 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },5642 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5643 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5644 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5645 .unused,
5246 .unused,5646 .unused,
5247 .unused,5647 .unused,
5248 .unused,5648 .unused,
5249 .unused,5649 .unused,
5250 .unused,5650 .unused,
5251 },5651 },
5252 .dst_temps = .{.{ .rc = .general_purpose }},5652 .dst_temps = .{.mem},
5253 .clobbers = .{ .eflags = true },5653 .clobbers = .{ .eflags = true },
5254 .each = .{ .once = &.{5654 .each = .{ .once = &.{
5255 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },5655 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
5256 .{ ._, ._r, .bs, .tmp0q, .src0q, ._, ._ },5656 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5257 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },5657 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
5258 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },5658 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
5659 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5660 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5661 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
5662 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
5663 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
5664 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5665 .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ },
5666 .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
5667 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
5668 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5259 } },5669 } },
5260 }, .{5670 }, .{
5261 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },5671 .required_features = .{ .@"64bit", .cmov, null, null },
5262 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any },5672 .src_constraints = .{ .any_unsigned_int, .any_unsigned_int },
5263 .patterns = &.{5673 .patterns = &.{
5264 .{ .src = .{ .to_mem, .none } },5674 .{ .src = .{ .to_mem, .to_mem } },
5265 },5675 },
5266 .extra_temps = .{5676 .extra_temps = .{
5267 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5677 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5678 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5679 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5680 .unused,
5268 .unused,5681 .unused,
5269 .unused,5682 .unused,
5270 .unused,5683 .unused,
5271 .unused,5684 .unused,
5272 .unused,5685 .unused,
5273 },5686 },
5274 .dst_temps = .{.{ .rc = .general_purpose }},5687 .dst_temps = .{.mem},
5275 .clobbers = .{ .eflags = true },5688 .clobbers = .{ .eflags = true },
5276 .each = .{ .once = &.{5689 .each = .{ .once = &.{
5277 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5690 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
5278 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },5691 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5279 .{ ._, ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5692 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
5280 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },5693 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
5281 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },5694 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5282 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5695 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5283 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },5696 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
5284 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },5697 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
5285 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },5698 .{ ._, ._ae, .cmov, .tmp0p, .tmp1p, ._, ._ },
5699 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
5700 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
5701 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5286 } },5702 } },
5287 }, .{5703 }, .{
5288 .required_features = .{ .@"64bit", .lzcnt, null, null },5704 .required_features = .{ .@"64bit", null, null, null },
5289 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any },5705 .src_constraints = .{ .any_unsigned_int, .any_unsigned_int },
5290 .patterns = &.{5706 .patterns = &.{
5291 .{ .src = .{ .to_mem, .none } },5707 .{ .src = .{ .to_mem, .to_mem } },
5292 },5708 },
5293 .extra_temps = .{5709 .extra_temps = .{
5294 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5710 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5711 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5712 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5713 .unused,
5295 .unused,5714 .unused,
5296 .unused,5715 .unused,
5297 .unused,5716 .unused,
5298 .unused,5717 .unused,
5299 .unused,5718 .unused,
5300 },5719 },
5301 .dst_temps = .{.{ .rc = .general_purpose }},5720 .dst_temps = .{.mem},
5302 .clobbers = .{ .eflags = true },5721 .clobbers = .{ .eflags = true },
5303 .each = .{ .once = &.{5722 .each = .{ .once = &.{
5304 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5723 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
5305 .{ .@"0:", ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5724 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5306 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },5725 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
5307 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },5726 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
5308 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5727 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5309 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },5728 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5310 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },5729 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
5311 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },5730 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5731 .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ },
5732 .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
5733 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
5734 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5312 } },5735 } },
5313 }, .{5736 }, .{
5314 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },5737 .required_features = .{ .avx, null, null, null },
5315 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any },5738 .src_constraints = .{
5739 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
5740 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
5741 },
5316 .patterns = &.{5742 .patterns = &.{
5317 .{ .src = .{ .to_mem, .none } },5743 .{ .src = .{ .to_sse, .mem } },
5744 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
5745 .{ .src = .{ .to_sse, .to_sse } },
5746 },
5747 .dst_temps = .{.{ .rc = .sse }},
5748 .each = .{ .once = &.{
5749 .{ ._, .vp_b, .mins, .dst0x, .src0x, .src1x, ._ },
5750 } },
5751 }, .{
5752 .required_features = .{ .sse4_1, null, null, null },
5753 .src_constraints = .{
5754 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
5755 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
5756 },
5757 .patterns = &.{
5758 .{ .src = .{ .to_mut_sse, .mem } },
5759 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
5760 .{ .src = .{ .to_mut_sse, .to_sse } },
5761 },
5762 .dst_temps = .{.{ .ref = .src0 }},
5763 .each = .{ .once = &.{
5764 .{ ._, .p_b, .mins, .dst0x, .src1x, ._, ._ },
5765 } },
5766 }, .{
5767 .required_features = .{ .sse2, null, null, null },
5768 .src_constraints = .{
5769 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
5770 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
5771 },
5772 .patterns = &.{
5773 .{ .src = .{ .to_mut_sse, .mem } },
5774 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
5775 .{ .src = .{ .to_mut_sse, .to_sse } },
5776 },
5777 .dst_temps = .{.{ .rc = .sse }},
5778 .each = .{ .once = &.{
5779 .{ ._, ._dqa, .mov, .dst0x, .src1x, ._, ._ },
5780 .{ ._, .p_b, .cmpgt, .dst0x, .src0x, ._, ._ },
5781 .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ },
5782 .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ },
5783 .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ },
5784 } },
5785 }, .{
5786 .required_features = .{ .avx2, null, null, null },
5787 .src_constraints = .{
5788 .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } },
5789 .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } },
5790 },
5791 .patterns = &.{
5792 .{ .src = .{ .to_sse, .mem } },
5793 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
5794 .{ .src = .{ .to_sse, .to_sse } },
5795 },
5796 .dst_temps = .{.{ .rc = .sse }},
5797 .each = .{ .once = &.{
5798 .{ ._, .vp_b, .mins, .dst0y, .src0y, .src1y, ._ },
5799 } },
5800 }, .{
5801 .required_features = .{ .avx2, null, null, null },
5802 .src_constraints = .{
5803 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } },
5804 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } },
5805 },
5806 .patterns = &.{
5807 .{ .src = .{ .to_mem, .to_mem } },
5318 },5808 },
5319 .extra_temps = .{5809 .extra_temps = .{
5320 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5810 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5811 .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } },
5812 .unused,
5813 .unused,
5321 .unused,5814 .unused,
5322 .unused,5815 .unused,
5323 .unused,5816 .unused,
5324 .unused,5817 .unused,
5325 .unused,5818 .unused,
5326 },5819 },
5327 .dst_temps = .{.{ .rc = .general_purpose }},5820 .dst_temps = .{.mem},
5328 .clobbers = .{ .eflags = true },5821 .clobbers = .{ .eflags = true },
5329 .each = .{ .once = &.{5822 .each = .{ .once = &.{
5330 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5823 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5331 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },5824 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5332 .{ ._, ._r, .bs, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5825 .{ ._, .vp_b, .mins, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
5333 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },5826 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
5334 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },5827 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
5335 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5828 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5336 .{ ._, ._, .mov, .dst0d, .si(-1), ._, ._ },
5337 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5338 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
5339 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
5340 } },5829 } },
5341 }, .{5830 }, .{
5342 .required_features = .{ .@"64bit", null, null, null },5831 .required_features = .{ .avx, null, null, null },
5343 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any },5832 .src_constraints = .{
5833 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5834 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5835 },
5344 .patterns = &.{5836 .patterns = &.{
5345 .{ .src = .{ .to_mem, .none } },5837 .{ .src = .{ .to_mem, .to_mem } },
5346 },5838 },
5347 .extra_temps = .{5839 .extra_temps = .{
5348 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5840 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5841 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
5842 .unused,
5843 .unused,
5349 .unused,5844 .unused,
5350 .unused,5845 .unused,
5351 .unused,5846 .unused,
5352 .unused,5847 .unused,
5353 .unused,5848 .unused,
5354 },5849 },
5355 .dst_temps = .{.{ .rc = .general_purpose }},5850 .dst_temps = .{.mem},
5356 .clobbers = .{ .eflags = true },5851 .clobbers = .{ .eflags = true },
5357 .each = .{ .once = &.{5852 .each = .{ .once = &.{
5358 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5853 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5359 .{ .@"0:", ._, .mov, .dst0d, .si(-1), ._, ._ },5854 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5360 .{ ._, ._r, .bs, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5855 .{ ._, .vp_b, .mins, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
5361 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },5856 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5362 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },5857 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5363 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5858 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5364 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5365 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
5366 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
5367 } },5859 } },
5368 }, .{5860 }, .{
5369 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },5861 .required_features = .{ .sse4_1, null, null, null },
5370 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },5862 .src_constraints = .{
5863 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5864 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5865 },
5371 .patterns = &.{5866 .patterns = &.{
5372 .{ .src = .{ .to_mem, .none } },5867 .{ .src = .{ .to_mem, .to_mem } },
5373 },5868 },
5374 .extra_temps = .{5869 .extra_temps = .{
5375 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5870 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5871 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
5872 .unused,
5873 .unused,
5376 .unused,5874 .unused,
5377 .unused,5875 .unused,
5378 .unused,5876 .unused,
5379 .unused,5877 .unused,
5380 .unused,5878 .unused,
5381 },5879 },
5382 .dst_temps = .{.{ .rc = .general_purpose }},5880 .dst_temps = .{.mem},
5383 .clobbers = .{ .eflags = true },5881 .clobbers = .{ .eflags = true },
5384 .each = .{ .once = &.{5882 .each = .{ .once = &.{
5385 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5883 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5386 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },5884 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5387 .{ ._, ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5885 .{ ._, .p_b, .mins, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5388 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },5886 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5389 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },5887 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5390 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5888 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5391 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5392 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
5393 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
5394 } },5889 } },
5395 }, .{5890 }, .{
5396 .required_features = .{ .@"64bit", .lzcnt, null, null },5891 .required_features = .{ .sse2, null, null, null },
5397 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },5892 .src_constraints = .{
5893 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5894 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5895 },
5398 .patterns = &.{5896 .patterns = &.{
5399 .{ .src = .{ .to_mem, .none } },5897 .{ .src = .{ .to_mem, .to_mem } },
5400 },5898 },
5401 .extra_temps = .{5899 .extra_temps = .{
5402 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5900 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5901 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
5902 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
5903 .unused,
5403 .unused,5904 .unused,
5404 .unused,5905 .unused,
5405 .unused,5906 .unused,
5406 .unused,5907 .unused,
5407 .unused,5908 .unused,
5408 },5909 },
5409 .dst_temps = .{.{ .rc = .general_purpose }},5910 .dst_temps = .{.mem},
5410 .clobbers = .{ .eflags = true },5911 .clobbers = .{ .eflags = true },
5411 .each = .{ .once = &.{5912 .each = .{ .once = &.{
5412 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5913 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5413 .{ .@"0:", ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5914 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5414 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },5915 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5415 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },5916 .{ ._, .p_b, .cmpgt, .tmp1x, .tmp2x, ._, ._ },
5917 .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ },
5918 .{ ._, .p_, .andn, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5919 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
5920 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5921 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5416 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5922 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5417 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5418 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
5419 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
5420 } },5923 } },
5421 }, .{5924 }, .{
5422 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },5925 .required_features = .{ .cmov, .slow_incdec, null, null },
5423 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },5926 .src_constraints = .{
5927 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5928 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5929 },
5424 .patterns = &.{5930 .patterns = &.{
5425 .{ .src = .{ .to_mem, .none } },5931 .{ .src = .{ .to_mem, .to_mem } },
5426 },5932 },
5427 .extra_temps = .{5933 .extra_temps = .{
5428 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5934 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5935 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
5936 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
5937 .unused,
5429 .unused,5938 .unused,
5430 .unused,5939 .unused,
5431 .unused,5940 .unused,
5432 .unused,5941 .unused,
5433 .unused,5942 .unused,
5434 },5943 },
5435 .dst_temps = .{.{ .rc = .general_purpose }},5944 .dst_temps = .{.mem},
5436 .clobbers = .{ .eflags = true },5945 .clobbers = .{ .eflags = true },
5437 .each = .{ .once = &.{5946 .each = .{ .once = &.{
5438 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5947 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5439 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },5948 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5440 .{ ._, ._r, .bs, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5949 .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5441 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },5950 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
5442 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },5951 .{ ._, ._ge, .cmov, .tmp1d, .tmp2d, ._, ._ },
5952 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5953 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5443 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5954 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5444 .{ ._, ._, .mov, .dst0d, .si(-1), ._, ._ },
5445 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5446 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
5447 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
5448 } },5955 } },
5449 }, .{5956 }, .{
5450 .required_features = .{ .@"64bit", null, null, null },5957 .required_features = .{ .cmov, null, null, null },
5451 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },5958 .src_constraints = .{
5959 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5960 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5961 },
5452 .patterns = &.{5962 .patterns = &.{
5453 .{ .src = .{ .to_mem, .none } },5963 .{ .src = .{ .to_mem, .to_mem } },
5454 },5964 },
5455 .extra_temps = .{5965 .extra_temps = .{
5456 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5966 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5967 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
5968 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
5969 .unused,
5457 .unused,5970 .unused,
5458 .unused,5971 .unused,
5459 .unused,5972 .unused,
5460 .unused,5973 .unused,
5461 .unused,5974 .unused,
5462 },5975 },
5463 .dst_temps = .{.{ .rc = .general_purpose }},5976 .dst_temps = .{.mem},
5464 .clobbers = .{ .eflags = true },5977 .clobbers = .{ .eflags = true },
5465 .each = .{ .once = &.{5978 .each = .{ .once = &.{
5466 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5979 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5467 .{ .@"0:", ._, .mov, .dst0d, .si(-1), ._, ._ },5980 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5468 .{ ._, ._r, .bs, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5981 .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5469 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },5982 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
5470 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },5983 .{ ._, ._ge, .cmov, .tmp1d, .tmp2d, ._, ._ },
5471 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5984 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5472 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },5985 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5473 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },5986 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5474 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
5475 } },5987 } },
5476 }, .{5988 }, .{
5477 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },5989 .required_features = .{ .slow_incdec, null, null, null },
5478 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },5990 .src_constraints = .{
5991 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5992 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5993 },
5479 .patterns = &.{5994 .patterns = &.{
5480 .{ .src = .{ .to_mem, .none } },5995 .{ .src = .{ .to_mem, .to_mem } },
5481 },5996 },
5482 .extra_temps = .{5997 .extra_temps = .{
5483 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },5998 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5484 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },5999 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
6000 .unused,
6001 .unused,
6002 .unused,
5485 .unused,6003 .unused,
5486 .unused,6004 .unused,
5487 .unused,6005 .unused,
5488 .unused,6006 .unused,
5489 },6007 },
5490 .dst_temps = .{.{ .rc = .general_purpose }},6008 .dst_temps = .{.mem},
5491 .clobbers = .{ .eflags = true },6009 .clobbers = .{ .eflags = true },
5492 .each = .{ .once = &.{6010 .each = .{ .once = &.{
5493 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },6011 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5494 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6012 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5495 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },6013 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5496 .{ ._, ._, .@"and", .tmp1q, .memi(.src0q, .tmp0), ._, ._ },6014 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
5497 .{ ._, ._, .lzcnt, .dst0q, .tmp1q, ._, ._ },6015 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5498 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },6016 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5499 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },6017 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5500 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5501 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6018 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5502 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5503 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
5504 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
5505 } },6019 } },
5506 }, .{6020 }, .{
5507 .required_features = .{ .@"64bit", .lzcnt, null, null },6021 .src_constraints = .{
5508 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },6022 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
6023 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
6024 },
5509 .patterns = &.{6025 .patterns = &.{
5510 .{ .src = .{ .to_mem, .none } },6026 .{ .src = .{ .to_mem, .to_mem } },
5511 },6027 },
5512 .extra_temps = .{6028 .extra_temps = .{
5513 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6029 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5514 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },6030 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
6031 .unused,
6032 .unused,
6033 .unused,
5515 .unused,6034 .unused,
5516 .unused,6035 .unused,
5517 .unused,6036 .unused,
5518 .unused,6037 .unused,
5519 },6038 },
5520 .dst_temps = .{.{ .rc = .general_purpose }},6039 .dst_temps = .{.mem},
5521 .clobbers = .{ .eflags = true },6040 .clobbers = .{ .eflags = true },
5522 .each = .{ .once = &.{6041 .each = .{ .once = &.{
5523 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },6042 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5524 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6043 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5525 .{ .@"0:", ._, .@"and", .tmp1q, .memi(.src0q, .tmp0), ._, ._ },6044 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5526 .{ ._, ._, .lzcnt, .dst0q, .tmp1q, ._, ._ },6045 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
5527 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },6046 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5528 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },6047 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5529 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },6048 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5530 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6049 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5531 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5532 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
5533 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
5534 } },6050 } },
5535 }, .{6051 }, .{
5536 .required_features = .{ .@"64bit", null, null, null },6052 .required_features = .{ .sse, .mmx, null, null },
5537 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },6053 .src_constraints = .{
6054 .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } },
6055 .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } },
6056 },
5538 .patterns = &.{6057 .patterns = &.{
5539 .{ .src = .{ .to_mem, .none } },6058 .{ .src = .{ .to_mut_mmx, .mem } },
6059 .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } },
6060 .{ .src = .{ .to_mut_mmx, .to_mmx } },
5540 },6061 },
5541 .extra_temps = .{6062 .dst_temps = .{.{ .ref = .src0 }},
5542 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6063 .each = .{ .once = &.{
5543 .unused,6064 .{ ._, .p_b, .minu, .dst0q, .src1q, ._, ._ },
5544 .unused,6065 } },
5545 .unused,6066 }, .{
5546 .unused,6067 .required_features = .{ .avx, null, null, null },
5547 .unused,6068 .src_constraints = .{
6069 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6070 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
5548 },6071 },
5549 .dst_temps = .{.{ .rc = .general_purpose }},6072 .patterns = &.{
5550 .clobbers = .{ .eflags = true },6073 .{ .src = .{ .to_sse, .mem } },
6074 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6075 .{ .src = .{ .to_sse, .to_sse } },
6076 },
6077 .dst_temps = .{.{ .rc = .sse }},
5551 .each = .{ .once = &.{6078 .each = .{ .once = &.{
5552 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },6079 .{ ._, .vp_b, .minu, .dst0x, .src0x, .src1x, ._ },
5553 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
5554 .{ .@"0:", ._, .@"and", .dst0q, .memi(.src0q, .tmp0), ._, ._ },
5555 .{ ._, ._r, .bs, .dst0q, .dst0q, ._, ._ },
5556 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
5557 .{ ._, ._, .mov, .dst0q, .si(-1), ._, ._ },
5558 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5559 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5560 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5561 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
5562 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
5563 } },6080 } },
5564 }, .{6081 }, .{
5565 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },6082 .required_features = .{ .sse2, null, null, null },
5566 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },6083 .src_constraints = .{
6084 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6085 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6086 },
5567 .patterns = &.{6087 .patterns = &.{
5568 .{ .src = .{ .to_mem, .none } },6088 .{ .src = .{ .to_mut_sse, .mem } },
6089 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
6090 .{ .src = .{ .to_mut_sse, .to_sse } },
6091 },
6092 .dst_temps = .{.{ .ref = .src0 }},
6093 .each = .{ .once = &.{
6094 .{ ._, .p_b, .minu, .dst0x, .src1x, ._, ._ },
6095 } },
6096 }, .{
6097 .required_features = .{ .avx2, null, null, null },
6098 .src_constraints = .{
6099 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } },
6100 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } },
6101 },
6102 .patterns = &.{
6103 .{ .src = .{ .to_sse, .mem } },
6104 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6105 .{ .src = .{ .to_sse, .to_sse } },
6106 },
6107 .dst_temps = .{.{ .rc = .sse }},
6108 .each = .{ .once = &.{
6109 .{ ._, .vp_b, .minu, .dst0y, .src0y, .src1y, ._ },
6110 } },
6111 }, .{
6112 .required_features = .{ .avx2, null, null, null },
6113 .src_constraints = .{
6114 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } },
6115 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } },
6116 },
6117 .patterns = &.{
6118 .{ .src = .{ .to_mem, .to_mem } },
5569 },6119 },
5570 .extra_temps = .{6120 .extra_temps = .{
5571 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6121 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5572 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },6122 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
6123 .unused,
6124 .unused,
6125 .unused,
5573 .unused,6126 .unused,
5574 .unused,6127 .unused,
5575 .unused,6128 .unused,
5576 .unused,6129 .unused,
5577 },6130 },
5578 .dst_temps = .{.{ .rc = .general_purpose }},6131 .dst_temps = .{.mem},
5579 .clobbers = .{ .eflags = true },6132 .clobbers = .{ .eflags = true },
5580 .each = .{ .once = &.{6133 .each = .{ .once = &.{
5581 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },6134 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5582 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6135 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5583 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },6136 .{ ._, .vp_b, .minu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
5584 .{ ._, ._, .@"and", .tmp1q, .memi(.src0q, .tmp0), ._, ._ },6137 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
5585 .{ ._, ._, .lzcnt, .dst0q, .tmp1q, ._, ._ },6138 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
5586 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
5587 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
5588 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5589 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6139 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5590 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5591 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
5592 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
5593 } },6140 } },
5594 }, .{6141 }, .{
5595 .required_features = .{ .@"64bit", .lzcnt, null, null },6142 .required_features = .{ .avx, null, null, null },
5596 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },6143 .src_constraints = .{
6144 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6145 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6146 },
5597 .patterns = &.{6147 .patterns = &.{
5598 .{ .src = .{ .to_mem, .none } },6148 .{ .src = .{ .to_mem, .to_mem } },
5599 },6149 },
5600 .extra_temps = .{6150 .extra_temps = .{
5601 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6151 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5602 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },6152 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6153 .unused,
6154 .unused,
6155 .unused,
5603 .unused,6156 .unused,
5604 .unused,6157 .unused,
5605 .unused,6158 .unused,
5606 .unused,6159 .unused,
5607 },6160 },
5608 .dst_temps = .{.{ .rc = .general_purpose }},6161 .dst_temps = .{.mem},
5609 .clobbers = .{ .eflags = true },6162 .clobbers = .{ .eflags = true },
5610 .each = .{ .once = &.{6163 .each = .{ .once = &.{
5611 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },6164 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5612 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6165 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5613 .{ .@"0:", ._, .@"and", .tmp1q, .memi(.src0q, .tmp0), ._, ._ },6166 .{ ._, .vp_b, .minu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
5614 .{ ._, ._, .lzcnt, .dst0q, .tmp1q, ._, ._ },6167 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5615 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },6168 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5616 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
5617 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5618 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6169 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5619 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5620 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
5621 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
5622 } },6170 } },
5623 }, .{6171 }, .{
5624 .required_features = .{ .@"64bit", null, null, null },6172 .required_features = .{ .sse2, null, null, null },
5625 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },6173 .src_constraints = .{
6174 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6175 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6176 },
5626 .patterns = &.{6177 .patterns = &.{
5627 .{ .src = .{ .to_mem, .none } },6178 .{ .src = .{ .to_mem, .to_mem } },
5628 },6179 },
5629 .extra_temps = .{6180 .extra_temps = .{
5630 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6181 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6182 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6183 .unused,
6184 .unused,
5631 .unused,6185 .unused,
5632 .unused,6186 .unused,
5633 .unused,6187 .unused,
5634 .unused,6188 .unused,
5635 .unused,6189 .unused,
5636 },6190 },
5637 .dst_temps = .{.{ .rc = .general_purpose }},6191 .dst_temps = .{.mem},
5638 .clobbers = .{ .eflags = true },6192 .clobbers = .{ .eflags = true },
5639 .each = .{ .once = &.{6193 .each = .{ .once = &.{
5640 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },6194 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5641 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },6195 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5642 .{ .@"0:", ._, .@"and", .dst0q, .memi(.src0q, .tmp0), ._, ._ },6196 .{ ._, .p_b, .minu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5643 .{ ._, ._r, .bs, .dst0q, .dst0q, ._, ._ },6197 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5644 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },6198 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5645 .{ ._, ._, .mov, .dst0q, .si(-1), ._, ._ },
5646 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5647 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6199 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5648 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
5649 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
5650 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
5651 } },6200 } },
5652 }, .{6201 }, .{
5653 .required_features = .{ .lzcnt, .slow_incdec, null, null },6202 .required_features = .{ .cmov, .slow_incdec, null, null },
5654 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },6203 .src_constraints = .{
6204 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6205 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6206 },
5655 .patterns = &.{6207 .patterns = &.{
5656 .{ .src = .{ .to_mem, .none } },6208 .{ .src = .{ .to_mem, .to_mem } },
5657 },6209 },
5658 .extra_temps = .{6210 .extra_temps = .{
5659 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6211 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5660 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6212 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6213 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6214 .unused,
6215 .unused,
5661 .unused,6216 .unused,
5662 .unused,6217 .unused,
5663 .unused,6218 .unused,
...@@ -5666,24 +6221,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5666,24 +6221,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5666 .dst_temps = .{.mem},6221 .dst_temps = .{.mem},
5667 .clobbers = .{ .eflags = true },6222 .clobbers = .{ .eflags = true },
5668 .each = .{ .once = &.{6223 .each = .{ .once = &.{
5669 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6224 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5670 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },6225 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5671 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6226 .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5672 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },6227 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
5673 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },6228 .{ ._, ._ae, .cmov, .tmp1d, .tmp2d, ._, ._ },
5674 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },6229 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5675 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },6230 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5676 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6231 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5677 } },6232 } },
5678 }, .{6233 }, .{
5679 .required_features = .{ .lzcnt, null, null, null },6234 .required_features = .{ .cmov, null, null, null },
5680 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },6235 .src_constraints = .{
6236 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6237 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6238 },
5681 .patterns = &.{6239 .patterns = &.{
5682 .{ .src = .{ .to_mem, .none } },6240 .{ .src = .{ .to_mem, .to_mem } },
5683 },6241 },
5684 .extra_temps = .{6242 .extra_temps = .{
5685 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6243 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5686 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6244 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6245 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6246 .unused,
6247 .unused,
5687 .unused,6248 .unused,
5688 .unused,6249 .unused,
5689 .unused,6250 .unused,
...@@ -5692,24 +6253,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5692,24 +6253,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5692 .dst_temps = .{.mem},6253 .dst_temps = .{.mem},
5693 .clobbers = .{ .eflags = true },6254 .clobbers = .{ .eflags = true },
5694 .each = .{ .once = &.{6255 .each = .{ .once = &.{
5695 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6256 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5696 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },6257 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5697 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6258 .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5698 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },6259 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
5699 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },6260 .{ ._, ._ae, .cmov, .tmp1d, .tmp2d, ._, ._ },
5700 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },6261 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5701 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },6262 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5702 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },6263 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5703 } },6264 } },
5704 }, .{6265 }, .{
5705 .required_features = .{ .lzcnt, .slow_incdec, null, null },6266 .required_features = .{ .slow_incdec, null, null, null },
5706 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },6267 .src_constraints = .{
6268 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6269 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6270 },
5707 .patterns = &.{6271 .patterns = &.{
5708 .{ .src = .{ .to_mem, .none } },6272 .{ .src = .{ .to_mem, .to_mem } },
5709 },6273 },
5710 .extra_temps = .{6274 .extra_temps = .{
5711 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6275 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5712 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6276 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6277 .unused,
6278 .unused,
6279 .unused,
5713 .unused,6280 .unused,
5714 .unused,6281 .unused,
5715 .unused,6282 .unused,
...@@ -5718,24 +6285,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5718,24 +6285,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5718 .dst_temps = .{.mem},6285 .dst_temps = .{.mem},
5719 .clobbers = .{ .eflags = true },6286 .clobbers = .{ .eflags = true },
5720 .each = .{ .once = &.{6287 .each = .{ .once = &.{
5721 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6288 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5722 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6289 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5723 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6290 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5724 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },6291 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
5725 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },6292 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5726 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },6293 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5727 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },6294 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5728 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6295 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5729 } },6296 } },
5730 }, .{6297 }, .{
5731 .required_features = .{ .lzcnt, null, null, null },6298 .src_constraints = .{
5732 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },6299 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6300 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6301 },
5733 .patterns = &.{6302 .patterns = &.{
5734 .{ .src = .{ .to_mem, .none } },6303 .{ .src = .{ .to_mem, .to_mem } },
5735 },6304 },
5736 .extra_temps = .{6305 .extra_temps = .{
5737 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6306 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5738 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6307 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6308 .unused,
6309 .unused,
6310 .unused,
5739 .unused,6311 .unused,
5740 .unused,6312 .unused,
5741 .unused,6313 .unused,
...@@ -5744,24 +6316,90 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5744,24 +6316,90 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5744 .dst_temps = .{.mem},6316 .dst_temps = .{.mem},
5745 .clobbers = .{ .eflags = true },6317 .clobbers = .{ .eflags = true },
5746 .each = .{ .once = &.{6318 .each = .{ .once = &.{
5747 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6319 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5748 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6320 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5749 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6321 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5750 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },6322 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
5751 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },6323 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5752 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },6324 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5753 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },6325 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5754 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },6326 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5755 } },6327 } },
5756 }, .{6328 }, .{
5757 .required_features = .{ .lzcnt, .slow_incdec, null, null },6329 .required_features = .{ .sse, .mmx, null, null },
5758 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },6330 .src_constraints = .{
6331 .{ .scalar_signed_int = .{ .of = .qword, .is = .word } },
6332 .{ .scalar_signed_int = .{ .of = .qword, .is = .word } },
6333 },
5759 .patterns = &.{6334 .patterns = &.{
5760 .{ .src = .{ .to_mem, .none } },6335 .{ .src = .{ .to_mut_mmx, .mem } },
6336 .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } },
6337 .{ .src = .{ .to_mut_mmx, .to_mmx } },
6338 },
6339 .dst_temps = .{.{ .ref = .src0 }},
6340 .each = .{ .once = &.{
6341 .{ ._, .p_w, .mins, .dst0q, .src1q, ._, ._ },
6342 } },
6343 }, .{
6344 .required_features = .{ .avx, null, null, null },
6345 .src_constraints = .{
6346 .{ .scalar_signed_int = .{ .of = .xword, .is = .word } },
6347 .{ .scalar_signed_int = .{ .of = .xword, .is = .word } },
6348 },
6349 .patterns = &.{
6350 .{ .src = .{ .to_sse, .mem } },
6351 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6352 .{ .src = .{ .to_sse, .to_sse } },
6353 },
6354 .dst_temps = .{.{ .rc = .sse }},
6355 .each = .{ .once = &.{
6356 .{ ._, .vp_w, .mins, .dst0x, .src0x, .src1x, ._ },
6357 } },
6358 }, .{
6359 .required_features = .{ .sse2, null, null, null },
6360 .src_constraints = .{
6361 .{ .scalar_signed_int = .{ .of = .xword, .is = .word } },
6362 .{ .scalar_signed_int = .{ .of = .xword, .is = .word } },
6363 },
6364 .patterns = &.{
6365 .{ .src = .{ .to_mut_sse, .mem } },
6366 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
6367 .{ .src = .{ .to_mut_sse, .to_sse } },
6368 },
6369 .dst_temps = .{.{ .ref = .src0 }},
6370 .each = .{ .once = &.{
6371 .{ ._, .p_w, .mins, .dst0x, .src1x, ._, ._ },
6372 } },
6373 }, .{
6374 .required_features = .{ .avx2, null, null, null },
6375 .src_constraints = .{
6376 .{ .scalar_signed_int = .{ .of = .yword, .is = .word } },
6377 .{ .scalar_signed_int = .{ .of = .yword, .is = .word } },
6378 },
6379 .patterns = &.{
6380 .{ .src = .{ .to_sse, .mem } },
6381 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6382 .{ .src = .{ .to_sse, .to_sse } },
6383 },
6384 .dst_temps = .{.{ .rc = .sse }},
6385 .each = .{ .once = &.{
6386 .{ ._, .vp_w, .mins, .dst0y, .src0y, .src1y, ._ },
6387 } },
6388 }, .{
6389 .required_features = .{ .avx2, null, null, null },
6390 .src_constraints = .{
6391 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } },
6392 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } },
6393 },
6394 .patterns = &.{
6395 .{ .src = .{ .to_mem, .to_mem } },
5761 },6396 },
5762 .extra_temps = .{6397 .extra_temps = .{
5763 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6398 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5764 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6399 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
6400 .unused,
6401 .unused,
6402 .unused,
5765 .unused,6403 .unused,
5766 .unused,6404 .unused,
5767 .unused,6405 .unused,
...@@ -5770,24 +6408,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5770,24 +6408,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5770 .dst_temps = .{.mem},6408 .dst_temps = .{.mem},
5771 .clobbers = .{ .eflags = true },6409 .clobbers = .{ .eflags = true },
5772 .each = .{ .once = &.{6410 .each = .{ .once = &.{
5773 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6411 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5774 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },6412 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5775 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6413 .{ ._, .vp_w, .mins, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
5776 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },6414 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
5777 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },6415 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
5778 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
5779 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5780 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6416 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5781 } },6417 } },
5782 }, .{6418 }, .{
5783 .required_features = .{ .lzcnt, null, null, null },6419 .required_features = .{ .avx, null, null, null },
5784 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },6420 .src_constraints = .{
6421 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
6422 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
6423 },
5785 .patterns = &.{6424 .patterns = &.{
5786 .{ .src = .{ .to_mem, .none } },6425 .{ .src = .{ .to_mem, .to_mem } },
5787 },6426 },
5788 .extra_temps = .{6427 .extra_temps = .{
5789 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6428 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5790 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6429 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
6430 .unused,
6431 .unused,
6432 .unused,
5791 .unused,6433 .unused,
5792 .unused,6434 .unused,
5793 .unused,6435 .unused,
...@@ -5796,24 +6438,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5796,24 +6438,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5796 .dst_temps = .{.mem},6438 .dst_temps = .{.mem},
5797 .clobbers = .{ .eflags = true },6439 .clobbers = .{ .eflags = true },
5798 .each = .{ .once = &.{6440 .each = .{ .once = &.{
5799 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6441 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5800 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },6442 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5801 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6443 .{ ._, .vp_w, .mins, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
5802 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },6444 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5803 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },6445 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5804 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },6446 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5805 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5806 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5807 } },6447 } },
5808 }, .{6448 }, .{
5809 .required_features = .{ .@"64bit", .lzcnt, .slow_incdec, null },6449 .required_features = .{ .sse2, null, null, null },
5810 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },6450 .src_constraints = .{
6451 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
6452 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
6453 },
5811 .patterns = &.{6454 .patterns = &.{
5812 .{ .src = .{ .to_mem, .none } },6455 .{ .src = .{ .to_mem, .to_mem } },
5813 },6456 },
5814 .extra_temps = .{6457 .extra_temps = .{
5815 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6458 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5816 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },6459 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
6460 .unused,
6461 .unused,
6462 .unused,
5817 .unused,6463 .unused,
5818 .unused,6464 .unused,
5819 .unused,6465 .unused,
...@@ -5822,24 +6468,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5822,24 +6468,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5822 .dst_temps = .{.mem},6468 .dst_temps = .{.mem},
5823 .clobbers = .{ .eflags = true },6469 .clobbers = .{ .eflags = true },
5824 .each = .{ .once = &.{6470 .each = .{ .once = &.{
5825 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6471 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5826 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6472 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5827 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },6473 .{ ._, .p_w, .mins, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5828 .{ ._, ._, .lzcnt, .tmp1q, .tmp1q, ._, ._ },6474 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5829 .{ ._, ._, .sub, .tmp1b, .sia(64, .src0, .sub_bit_size), ._, ._ },6475 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5830 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
5831 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5832 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6476 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5833 } },6477 } },
5834 }, .{6478 }, .{
5835 .required_features = .{ .@"64bit", .lzcnt, null, null },6479 .required_features = .{ .cmov, null, null, null },
5836 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },6480 .src_constraints = .{
6481 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
6482 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
6483 },
5837 .patterns = &.{6484 .patterns = &.{
5838 .{ .src = .{ .to_mem, .none } },6485 .{ .src = .{ .to_mem, .to_mem } },
5839 },6486 },
5840 .extra_temps = .{6487 .extra_temps = .{
5841 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6488 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5842 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },6489 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
6490 .unused,
6491 .unused,
6492 .unused,
5843 .unused,6493 .unused,
5844 .unused,6494 .unused,
5845 .unused,6495 .unused,
...@@ -5848,83 +6498,123 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5848,83 +6498,123 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5848 .dst_temps = .{.mem},6498 .dst_temps = .{.mem},
5849 .clobbers = .{ .eflags = true },6499 .clobbers = .{ .eflags = true },
5850 .each = .{ .once = &.{6500 .each = .{ .once = &.{
5851 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6501 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5852 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6502 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
5853 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },6503 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
5854 .{ ._, ._, .lzcnt, .tmp1q, .tmp1q, ._, ._ },6504 .{ ._, ._ge, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
5855 .{ ._, ._, .sub, .tmp1b, .sia(64, .src0, .sub_bit_size), ._, ._ },6505 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
5856 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },6506 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
5857 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },6507 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5858 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5859 } },6508 } },
5860 }, .{6509 }, .{
5861 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null },6510 .src_constraints = .{
5862 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },6511 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
6512 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
6513 },
5863 .patterns = &.{6514 .patterns = &.{
5864 .{ .src = .{ .to_mem, .none } },6515 .{ .src = .{ .to_mem, .to_mem } },
5865 },6516 },
5866 .extra_temps = .{6517 .extra_temps = .{
5867 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6518 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5868 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6519 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
5869 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6520 .unused,
5870 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },6521 .unused,
6522 .unused,
6523 .unused,
6524 .unused,
5871 .unused,6525 .unused,
5872 .unused,6526 .unused,
5873 },6527 },
5874 .dst_temps = .{.mem},6528 .dst_temps = .{.mem},
5875 .clobbers = .{ .eflags = true },6529 .clobbers = .{ .eflags = true },
5876 .each = .{ .once = &.{6530 .each = .{ .once = &.{
5877 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6531 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5878 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6532 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
5879 .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0b, .tmp0, .add_len), ._, ._ },6533 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
5880 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },6534 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
5881 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },6535 .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
5882 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },6536 .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
5883 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },6537 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
5884 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
5885 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
5886 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5887 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6538 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5888 } },6539 } },
5889 }, .{6540 }, .{
5890 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },6541 .required_features = .{ .avx, null, null, null },
5891 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },6542 .src_constraints = .{
6543 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6544 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6545 },
5892 .patterns = &.{6546 .patterns = &.{
5893 .{ .src = .{ .to_mem, .none } },6547 .{ .src = .{ .to_sse, .mem } },
6548 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6549 .{ .src = .{ .to_sse, .to_sse } },
5894 },6550 },
5895 .extra_temps = .{6551 .dst_temps = .{.{ .rc = .sse }},
5896 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6552 .each = .{ .once = &.{
5897 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6553 .{ ._, .vp_w, .minu, .dst0x, .src0x, .src1x, ._ },
5898 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6554 } },
5899 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },6555 }, .{
5900 .unused,6556 .required_features = .{ .sse4_1, null, null, null },
5901 .unused,6557 .src_constraints = .{
6558 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6559 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
5902 },6560 },
5903 .dst_temps = .{.mem},6561 .patterns = &.{
5904 .clobbers = .{ .eflags = true },6562 .{ .src = .{ .to_mut_sse, .mem } },
6563 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
6564 .{ .src = .{ .to_mut_sse, .to_sse } },
6565 },
6566 .dst_temps = .{.{ .ref = .src0 }},
5905 .each = .{ .once = &.{6567 .each = .{ .once = &.{
5906 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6568 .{ ._, .p_w, .minu, .dst0x, .src1x, ._, ._ },
5907 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
5908 .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
5909 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },
5910 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },
5911 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
5912 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
5913 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
5914 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
5915 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5916 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5917 } },6569 } },
5918 }, .{6570 }, .{
5919 .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null },6571 .required_features = .{ .sse2, null, null, null },
5920 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },6572 .src_constraints = .{
6573 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6574 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6575 },
5921 .patterns = &.{6576 .patterns = &.{
5922 .{ .src = .{ .to_mem, .none } },6577 .{ .src = .{ .to_mut_sse, .mem } },
6578 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
6579 .{ .src = .{ .to_mut_sse, .to_sse } },
6580 },
6581 .dst_temps = .{.{ .rc = .sse }},
6582 .each = .{ .once = &.{
6583 .{ ._, ._dqa, .mov, .dst0x, .src0x, ._, ._ },
6584 .{ ._, .p_w, .subus, .src0x, .src1x, ._, ._ },
6585 .{ ._, .p_w, .sub, .dst0x, .src0x, ._, ._ },
6586 } },
6587 }, .{
6588 .required_features = .{ .avx2, null, null, null },
6589 .src_constraints = .{
6590 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } },
6591 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } },
6592 },
6593 .patterns = &.{
6594 .{ .src = .{ .to_sse, .mem } },
6595 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6596 .{ .src = .{ .to_sse, .to_sse } },
6597 },
6598 .dst_temps = .{.{ .rc = .sse }},
6599 .each = .{ .once = &.{
6600 .{ ._, .vp_w, .minu, .dst0y, .src0y, .src1y, ._ },
6601 } },
6602 }, .{
6603 .required_features = .{ .avx2, null, null, null },
6604 .src_constraints = .{
6605 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } },
6606 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } },
6607 },
6608 .patterns = &.{
6609 .{ .src = .{ .to_mem, .to_mem } },
5923 },6610 },
5924 .extra_temps = .{6611 .extra_temps = .{
5925 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6612 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5926 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6613 .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } },
5927 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6614 .unused,
6615 .unused,
6616 .unused,
6617 .unused,
5928 .unused,6618 .unused,
5929 .unused,6619 .unused,
5930 .unused,6620 .unused,
...@@ -5932,28 +6622,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5932,28 +6622,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5932 .dst_temps = .{.mem},6622 .dst_temps = .{.mem},
5933 .clobbers = .{ .eflags = true },6623 .clobbers = .{ .eflags = true },
5934 .each = .{ .once = &.{6624 .each = .{ .once = &.{
5935 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6625 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5936 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },6626 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5937 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6627 .{ ._, .vp_w, .minu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
5938 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },6628 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
5939 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },6629 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
5940 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
5941 .{ ._, ._c, .st, ._, ._, ._, ._ },
5942 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
5943 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
5944 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5945 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6630 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5946 } },6631 } },
5947 }, .{6632 }, .{
5948 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },6633 .required_features = .{ .avx, null, null, null },
5949 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },6634 .src_constraints = .{
6635 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6636 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6637 },
5950 .patterns = &.{6638 .patterns = &.{
5951 .{ .src = .{ .to_mem, .none } },6639 .{ .src = .{ .to_mem, .to_mem } },
5952 },6640 },
5953 .extra_temps = .{6641 .extra_temps = .{
5954 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6642 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5955 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6643 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
5956 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6644 .unused,
6645 .unused,
6646 .unused,
6647 .unused,
5957 .unused,6648 .unused,
5958 .unused,6649 .unused,
5959 .unused,6650 .unused,
...@@ -5961,28 +6652,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5961,28 +6652,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5961 .dst_temps = .{.mem},6652 .dst_temps = .{.mem},
5962 .clobbers = .{ .eflags = true },6653 .clobbers = .{ .eflags = true },
5963 .each = .{ .once = &.{6654 .each = .{ .once = &.{
5964 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6655 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5965 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },6656 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5966 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6657 .{ ._, .vp_w, .minu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
5967 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },6658 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5968 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },6659 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5969 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },6660 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5970 .{ ._, ._c, .st, ._, ._, ._, ._ },
5971 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
5972 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
5973 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5974 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5975 } },6661 } },
5976 }, .{6662 }, .{
5977 .required_features = .{ .slow_incdec, null, null, null },6663 .required_features = .{ .sse4_1, null, null, null },
5978 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },6664 .src_constraints = .{
6665 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6666 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6667 },
5979 .patterns = &.{6668 .patterns = &.{
5980 .{ .src = .{ .to_mem, .none } },6669 .{ .src = .{ .to_mem, .to_mem } },
5981 },6670 },
5982 .extra_temps = .{6671 .extra_temps = .{
5983 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6672 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5984 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6673 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
5985 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6674 .unused,
6675 .unused,
6676 .unused,
6677 .unused,
5986 .unused,6678 .unused,
5987 .unused,6679 .unused,
5988 .unused,6680 .unused,
...@@ -5990,26 +6682,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5990,26 +6682,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5990 .dst_temps = .{.mem},6682 .dst_temps = .{.mem},
5991 .clobbers = .{ .eflags = true },6683 .clobbers = .{ .eflags = true },
5992 .each = .{ .once = &.{6684 .each = .{ .once = &.{
5993 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6685 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5994 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },6686 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5995 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6687 .{ ._, .p_w, .minu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5996 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },6688 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5997 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },6689 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5998 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
5999 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
6000 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
6001 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6002 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6690 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6003 } },6691 } },
6004 }, .{6692 }, .{
6005 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },6693 .required_features = .{ .sse2, null, null, null },
6694 .src_constraints = .{
6695 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6696 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6697 },
6006 .patterns = &.{6698 .patterns = &.{
6007 .{ .src = .{ .to_mem, .none } },6699 .{ .src = .{ .to_mem, .to_mem } },
6008 },6700 },
6009 .extra_temps = .{6701 .extra_temps = .{
6010 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6702 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6011 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6703 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
6012 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6704 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
6705 .unused,
6706 .unused,
6707 .unused,
6013 .unused,6708 .unused,
6014 .unused,6709 .unused,
6015 .unused,6710 .unused,
...@@ -6017,85 +6712,157 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6017,85 +6712,157 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6017 .dst_temps = .{.mem},6712 .dst_temps = .{.mem},
6018 .clobbers = .{ .eflags = true },6713 .clobbers = .{ .eflags = true },
6019 .each = .{ .once = &.{6714 .each = .{ .once = &.{
6020 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6715 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6021 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },6716 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6022 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6717 .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ },
6023 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },6718 .{ ._, .p_w, .subus, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6024 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },6719 .{ ._, .p_w, .sub, .tmp2x, .tmp1x, ._, ._ },
6025 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },6720 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },
6026 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },6721 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6027 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },6722 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6028 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6029 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6030 } },6723 } },
6031 }, .{6724 }, .{
6032 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null },6725 .required_features = .{ .cmov, null, null, null },
6033 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },6726 .src_constraints = .{
6727 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
6728 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
6729 },
6034 .patterns = &.{6730 .patterns = &.{
6035 .{ .src = .{ .to_mem, .none } },6731 .{ .src = .{ .to_mem, .to_mem } },
6036 },6732 },
6037 .extra_temps = .{6733 .extra_temps = .{
6038 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6734 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6039 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6735 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
6040 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6736 .unused,
6041 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },6737 .unused,
6738 .unused,
6739 .unused,
6740 .unused,
6042 .unused,6741 .unused,
6043 .unused,6742 .unused,
6044 },6743 },
6045 .dst_temps = .{.mem},6744 .dst_temps = .{.mem},
6046 .clobbers = .{ .eflags = true },6745 .clobbers = .{ .eflags = true },
6047 .each = .{ .once = &.{6746 .each = .{ .once = &.{
6048 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6747 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6049 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6748 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
6050 .{ .@"0:", ._, .movzx, .tmp2d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6749 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6051 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },6750 .{ ._, ._ae, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6052 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },6751 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
6053 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },6752 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
6054 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
6055 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
6056 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6057 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6058 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6753 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6059 } },6754 } },
6060 }, .{6755 }, .{
6061 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },6756 .src_constraints = .{
6062 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },6757 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
6758 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
6759 },
6063 .patterns = &.{6760 .patterns = &.{
6064 .{ .src = .{ .to_mem, .none } },6761 .{ .src = .{ .to_mem, .to_mem } },
6065 },6762 },
6066 .extra_temps = .{6763 .extra_temps = .{
6067 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6764 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6068 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6765 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
6069 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6766 .unused,
6070 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },6767 .unused,
6768 .unused,
6769 .unused,
6770 .unused,
6071 .unused,6771 .unused,
6072 .unused,6772 .unused,
6073 },6773 },
6074 .dst_temps = .{.mem},6774 .dst_temps = .{.mem},
6075 .clobbers = .{ .eflags = true },6775 .clobbers = .{ .eflags = true },
6076 .each = .{ .once = &.{6776 .each = .{ .once = &.{
6077 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6777 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6078 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6778 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
6079 .{ .@"0:", ._, .movzx, .tmp2d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6779 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6080 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },6780 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
6081 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },6781 .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6082 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },6782 .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
6083 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },6783 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
6084 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },6784 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6085 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6086 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6087 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6088 } },6785 } },
6089 }, .{6786 }, .{
6090 .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null },6787 .required_features = .{ .avx, null, null, null },
6091 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },6788 .src_constraints = .{
6789 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
6790 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
6791 },
6092 .patterns = &.{6792 .patterns = &.{
6093 .{ .src = .{ .to_mem, .none } },6793 .{ .src = .{ .to_sse, .mem } },
6794 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6795 .{ .src = .{ .to_sse, .to_sse } },
6796 },
6797 .dst_temps = .{.{ .rc = .sse }},
6798 .each = .{ .once = &.{
6799 .{ ._, .vp_d, .mins, .dst0x, .src0x, .src1x, ._ },
6800 } },
6801 }, .{
6802 .required_features = .{ .sse4_1, null, null, null },
6803 .src_constraints = .{
6804 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
6805 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
6806 },
6807 .patterns = &.{
6808 .{ .src = .{ .to_mut_sse, .mem } },
6809 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
6810 .{ .src = .{ .to_mut_sse, .to_sse } },
6811 },
6812 .dst_temps = .{.{ .ref = .src0 }},
6813 .each = .{ .once = &.{
6814 .{ ._, .p_d, .mins, .dst0x, .src1x, ._, ._ },
6815 } },
6816 }, .{
6817 .required_features = .{ .sse2, null, null, null },
6818 .src_constraints = .{
6819 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
6820 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
6821 },
6822 .patterns = &.{
6823 .{ .src = .{ .to_mut_sse, .mem } },
6824 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
6825 .{ .src = .{ .to_mut_sse, .to_sse } },
6826 },
6827 .dst_temps = .{.{ .rc = .sse }},
6828 .each = .{ .once = &.{
6829 .{ ._, ._dqa, .mov, .dst0x, .src1x, ._, ._ },
6830 .{ ._, .p_d, .cmpgt, .dst0x, .src0x, ._, ._ },
6831 .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ },
6832 .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ },
6833 .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ },
6834 } },
6835 }, .{
6836 .required_features = .{ .avx2, null, null, null },
6837 .src_constraints = .{
6838 .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } },
6839 .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } },
6840 },
6841 .patterns = &.{
6842 .{ .src = .{ .to_sse, .mem } },
6843 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6844 .{ .src = .{ .to_sse, .to_sse } },
6845 },
6846 .dst_temps = .{.{ .rc = .sse }},
6847 .each = .{ .once = &.{
6848 .{ ._, .vp_d, .mins, .dst0y, .src0y, .src1y, ._ },
6849 } },
6850 }, .{
6851 .required_features = .{ .avx2, null, null, null },
6852 .src_constraints = .{
6853 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } },
6854 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } },
6855 },
6856 .patterns = &.{
6857 .{ .src = .{ .to_mem, .to_mem } },
6094 },6858 },
6095 .extra_temps = .{6859 .extra_temps = .{
6096 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6860 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6097 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6861 .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } },
6098 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6862 .unused,
6863 .unused,
6864 .unused,
6865 .unused,
6099 .unused,6866 .unused,
6100 .unused,6867 .unused,
6101 .unused,6868 .unused,
...@@ -6103,28 +6870,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6103,28 +6870,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6103 .dst_temps = .{.mem},6870 .dst_temps = .{.mem},
6104 .clobbers = .{ .eflags = true },6871 .clobbers = .{ .eflags = true },
6105 .each = .{ .once = &.{6872 .each = .{ .once = &.{
6106 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6873 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6107 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6874 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6108 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6875 .{ ._, .vp_d, .mins, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
6109 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },6876 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
6110 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },6877 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
6111 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
6112 .{ ._, ._c, .st, ._, ._, ._, ._ },
6113 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
6114 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
6115 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6116 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6878 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6117 } },6879 } },
6118 }, .{6880 }, .{
6119 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },6881 .required_features = .{ .avx, null, null, null },
6120 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },6882 .src_constraints = .{
6883 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6884 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6885 },
6121 .patterns = &.{6886 .patterns = &.{
6122 .{ .src = .{ .to_mem, .none } },6887 .{ .src = .{ .to_mem, .to_mem } },
6123 },6888 },
6124 .extra_temps = .{6889 .extra_temps = .{
6125 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6890 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6126 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6891 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
6127 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6892 .unused,
6893 .unused,
6894 .unused,
6895 .unused,
6128 .unused,6896 .unused,
6129 .unused,6897 .unused,
6130 .unused,6898 .unused,
...@@ -6132,28 +6900,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6132,28 +6900,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6132 .dst_temps = .{.mem},6900 .dst_temps = .{.mem},
6133 .clobbers = .{ .eflags = true },6901 .clobbers = .{ .eflags = true },
6134 .each = .{ .once = &.{6902 .each = .{ .once = &.{
6135 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6903 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6136 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6904 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6137 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6905 .{ ._, .vp_d, .mins, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
6138 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },6906 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6139 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },6907 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6140 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },6908 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6141 .{ ._, ._c, .st, ._, ._, ._, ._ },
6142 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
6143 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
6144 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6145 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6146 } },6909 } },
6147 }, .{6910 }, .{
6148 .required_features = .{ .slow_incdec, null, null, null },6911 .required_features = .{ .sse4_1, null, null, null },
6149 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },6912 .src_constraints = .{
6913 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6914 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6915 },
6150 .patterns = &.{6916 .patterns = &.{
6151 .{ .src = .{ .to_mem, .none } },6917 .{ .src = .{ .to_mem, .to_mem } },
6152 },6918 },
6153 .extra_temps = .{6919 .extra_temps = .{
6154 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6920 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6155 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6921 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
6156 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6922 .unused,
6923 .unused,
6924 .unused,
6925 .unused,
6157 .unused,6926 .unused,
6158 .unused,6927 .unused,
6159 .unused,6928 .unused,
...@@ -6161,26 +6930,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6161,26 +6930,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6161 .dst_temps = .{.mem},6930 .dst_temps = .{.mem},
6162 .clobbers = .{ .eflags = true },6931 .clobbers = .{ .eflags = true },
6163 .each = .{ .once = &.{6932 .each = .{ .once = &.{
6164 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6933 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6165 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6934 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6166 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6935 .{ ._, .p_d, .mins, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6167 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },6936 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6168 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },6937 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6169 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
6170 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
6171 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
6172 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6173 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },6938 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6174 } },6939 } },
6175 }, .{6940 }, .{
6176 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },6941 .required_features = .{ .sse2, null, null, null },
6942 .src_constraints = .{
6943 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6944 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6945 },
6177 .patterns = &.{6946 .patterns = &.{
6178 .{ .src = .{ .to_mem, .none } },6947 .{ .src = .{ .to_mem, .to_mem } },
6179 },6948 },
6180 .extra_temps = .{6949 .extra_temps = .{
6181 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6950 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6182 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6951 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
6183 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6952 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
6953 .unused,
6954 .unused,
6955 .unused,
6184 .unused,6956 .unused,
6185 .unused,6957 .unused,
6186 .unused,6958 .unused,
...@@ -6188,114 +6960,174 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6188,114 +6960,174 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6188 .dst_temps = .{.mem},6960 .dst_temps = .{.mem},
6189 .clobbers = .{ .eflags = true },6961 .clobbers = .{ .eflags = true },
6190 .each = .{ .once = &.{6962 .each = .{ .once = &.{
6191 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6963 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6192 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6964 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6193 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },6965 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6194 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },6966 .{ ._, .p_d, .cmpgt, .tmp1x, .tmp2x, ._, ._ },
6195 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },6967 .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ },
6196 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },6968 .{ ._, .p_, .andn, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6197 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },6969 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
6198 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },6970 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6199 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },6971 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6200 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },6972 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6201 } },6973 } },
6202 }, .{6974 }, .{
6203 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null },6975 .required_features = .{ .cmov, null, null, null },
6204 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },6976 .src_constraints = .{
6977 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
6978 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
6979 },
6205 .patterns = &.{6980 .patterns = &.{
6206 .{ .src = .{ .to_mem, .none } },6981 .{ .src = .{ .to_mem, .to_mem } },
6207 },6982 },
6208 .extra_temps = .{6983 .extra_temps = .{
6209 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },6984 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6210 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6985 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
6211 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },6986 .unused,
6212 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },6987 .unused,
6988 .unused,
6989 .unused,
6990 .unused,
6213 .unused,6991 .unused,
6214 .unused,6992 .unused,
6215 },6993 },
6216 .dst_temps = .{.mem},6994 .dst_temps = .{.mem},
6217 .clobbers = .{ .eflags = true },6995 .clobbers = .{ .eflags = true },
6218 .each = .{ .once = &.{6996 .each = .{ .once = &.{
6219 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6997 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6220 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6998 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
6221 .{ .@"0:", ._, .mov, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },6999 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
6222 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },7000 .{ ._, ._ge, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
6223 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },7001 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
6224 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },7002 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
6225 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
6226 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
6227 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6228 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6229 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7003 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6230 } },7004 } },
6231 }, .{7005 }, .{
6232 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },7006 .src_constraints = .{
6233 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },7007 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
7008 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
7009 },
6234 .patterns = &.{7010 .patterns = &.{
6235 .{ .src = .{ .to_mem, .none } },7011 .{ .src = .{ .to_mem, .to_mem } },
6236 },7012 },
6237 .extra_temps = .{7013 .extra_temps = .{
6238 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7014 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6239 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7015 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
6240 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7016 .unused,
6241 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },7017 .unused,
7018 .unused,
7019 .unused,
7020 .unused,
6242 .unused,7021 .unused,
6243 .unused,7022 .unused,
6244 },7023 },
6245 .dst_temps = .{.mem},7024 .dst_temps = .{.mem},
6246 .clobbers = .{ .eflags = true },7025 .clobbers = .{ .eflags = true },
6247 .each = .{ .once = &.{7026 .each = .{ .once = &.{
6248 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7027 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6249 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },7028 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
6250 .{ .@"0:", ._, .mov, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },7029 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
6251 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },7030 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
6252 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },7031 .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
6253 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },7032 .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
6254 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },7033 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
6255 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },7034 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6256 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6257 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6258 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6259 } },7035 } },
6260 }, .{7036 }, .{
6261 .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null },7037 .required_features = .{ .avx, null, null, null },
6262 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },7038 .src_constraints = .{
7039 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7040 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7041 },
6263 .patterns = &.{7042 .patterns = &.{
6264 .{ .src = .{ .to_mem, .none } },7043 .{ .src = .{ .to_sse, .mem } },
7044 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7045 .{ .src = .{ .to_sse, .to_sse } },
7046 },
7047 .dst_temps = .{.{ .rc = .sse }},
7048 .each = .{ .once = &.{
7049 .{ ._, .vp_d, .minu, .dst0x, .src0x, .src1x, ._ },
7050 } },
7051 }, .{
7052 .required_features = .{ .sse4_1, null, null, null },
7053 .src_constraints = .{
7054 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7055 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7056 },
7057 .patterns = &.{
7058 .{ .src = .{ .to_mut_sse, .mem } },
7059 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7060 .{ .src = .{ .to_mut_sse, .to_sse } },
7061 },
7062 .dst_temps = .{.{ .ref = .src0 }},
7063 .each = .{ .once = &.{
7064 .{ ._, .p_d, .minu, .dst0x, .src1x, ._, ._ },
7065 } },
7066 }, .{
7067 .required_features = .{ .sse2, null, null, null },
7068 .src_constraints = .{
7069 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7070 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7071 },
7072 .patterns = &.{
7073 .{ .src = .{ .to_mut_sse, .mem } },
7074 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7075 .{ .src = .{ .to_mut_sse, .to_sse } },
6265 },7076 },
6266 .extra_temps = .{7077 .extra_temps = .{
6267 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7078 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
6268 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7079 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
6269 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7080 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
7081 .unused,
7082 .unused,
7083 .unused,
6270 .unused,7084 .unused,
6271 .unused,7085 .unused,
6272 .unused,7086 .unused,
6273 },7087 },
6274 .dst_temps = .{.mem},7088 .dst_temps = .{.{ .rc = .sse }},
6275 .clobbers = .{ .eflags = true },
6276 .each = .{ .once = &.{7089 .each = .{ .once = &.{
6277 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7090 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
6278 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },7091 .{ ._, ._dqa, .mov, .dst0x, .lea(.xword, .tmp0), ._, ._ },
6279 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },7092 .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ },
6280 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },7093 .{ ._, .p_, .xor, .dst0x, .src1x, ._, ._ },
6281 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },7094 .{ ._, .p_, .xor, .tmp2x, .src0x, ._, ._ },
6282 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },7095 .{ ._, .p_d, .cmpgt, .dst0x, .tmp2x, ._, ._ },
6283 .{ ._, ._c, .st, ._, ._, ._, ._ },7096 .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ },
6284 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },7097 .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ },
6285 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },7098 .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ },
6286 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6287 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6288 } },7099 } },
6289 }, .{7100 }, .{
6290 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },7101 .required_features = .{ .avx2, null, null, null },
6291 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },7102 .src_constraints = .{
7103 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
7104 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
7105 },
6292 .patterns = &.{7106 .patterns = &.{
6293 .{ .src = .{ .to_mem, .none } },7107 .{ .src = .{ .to_sse, .mem } },
7108 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7109 .{ .src = .{ .to_sse, .to_sse } },
7110 },
7111 .dst_temps = .{.{ .rc = .sse }},
7112 .each = .{ .once = &.{
7113 .{ ._, .vp_d, .minu, .dst0y, .src0y, .src1y, ._ },
7114 } },
7115 }, .{
7116 .required_features = .{ .avx2, null, null, null },
7117 .src_constraints = .{
7118 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
7119 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
7120 },
7121 .patterns = &.{
7122 .{ .src = .{ .to_mem, .to_mem } },
6294 },7123 },
6295 .extra_temps = .{7124 .extra_temps = .{
6296 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7125 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6297 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7126 .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } },
6298 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7127 .unused,
7128 .unused,
7129 .unused,
7130 .unused,
6299 .unused,7131 .unused,
6300 .unused,7132 .unused,
6301 .unused,7133 .unused,
...@@ -6303,28 +7135,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6303,28 +7135,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6303 .dst_temps = .{.mem},7135 .dst_temps = .{.mem},
6304 .clobbers = .{ .eflags = true },7136 .clobbers = .{ .eflags = true },
6305 .each = .{ .once = &.{7137 .each = .{ .once = &.{
6306 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7138 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6307 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },7139 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6308 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },7140 .{ ._, .vp_d, .minu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
6309 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },7141 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
6310 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },7142 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
6311 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },7143 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6312 .{ ._, ._c, .st, ._, ._, ._, ._ },
6313 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
6314 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
6315 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6316 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6317 } },7144 } },
6318 }, .{7145 }, .{
6319 .required_features = .{ .slow_incdec, null, null, null },7146 .required_features = .{ .avx, null, null, null },
6320 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },7147 .src_constraints = .{
7148 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7149 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7150 },
6321 .patterns = &.{7151 .patterns = &.{
6322 .{ .src = .{ .to_mem, .none } },7152 .{ .src = .{ .to_mem, .to_mem } },
6323 },7153 },
6324 .extra_temps = .{7154 .extra_temps = .{
6325 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7155 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6326 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7156 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
6327 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7157 .unused,
7158 .unused,
7159 .unused,
7160 .unused,
6328 .unused,7161 .unused,
6329 .unused,7162 .unused,
6330 .unused,7163 .unused,
...@@ -6332,26 +7165,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6332,26 +7165,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6332 .dst_temps = .{.mem},7165 .dst_temps = .{.mem},
6333 .clobbers = .{ .eflags = true },7166 .clobbers = .{ .eflags = true },
6334 .each = .{ .once = &.{7167 .each = .{ .once = &.{
6335 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7168 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6336 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },7169 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6337 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },7170 .{ ._, .vp_d, .minu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
6338 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },7171 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6339 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },7172 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6340 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
6341 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
6342 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
6343 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6344 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7173 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6345 } },7174 } },
6346 }, .{7175 }, .{
6347 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },7176 .required_features = .{ .sse4_1, null, null, null },
7177 .src_constraints = .{
7178 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7179 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7180 },
6348 .patterns = &.{7181 .patterns = &.{
6349 .{ .src = .{ .to_mem, .none } },7182 .{ .src = .{ .to_mem, .to_mem } },
6350 },7183 },
6351 .extra_temps = .{7184 .extra_temps = .{
6352 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7185 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6353 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7186 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
6354 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7187 .unused,
7188 .unused,
7189 .unused,
7190 .unused,
6355 .unused,7191 .unused,
6356 .unused,7192 .unused,
6357 .unused,7193 .unused,
...@@ -6359,85 +7195,99 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6359,85 +7195,99 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6359 .dst_temps = .{.mem},7195 .dst_temps = .{.mem},
6360 .clobbers = .{ .eflags = true },7196 .clobbers = .{ .eflags = true },
6361 .each = .{ .once = &.{7197 .each = .{ .once = &.{
6362 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7198 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6363 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },7199 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6364 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },7200 .{ ._, .p_d, .minu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6365 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },7201 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6366 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },7202 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6367 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },7203 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6368 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
6369 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
6370 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6371 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6372 } },7204 } },
6373 }, .{7205 }, .{
6374 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec },7206 .required_features = .{ .sse2, null, null, null },
6375 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },7207 .src_constraints = .{
7208 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7209 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7210 },
6376 .patterns = &.{7211 .patterns = &.{
6377 .{ .src = .{ .to_mem, .none } },7212 .{ .src = .{ .to_mem, .to_mem } },
6378 },7213 },
6379 .extra_temps = .{7214 .extra_temps = .{
6380 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7215 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6381 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7216 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
6382 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7217 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
6383 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },7218 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
7219 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
7220 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
7221 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
6384 .unused,7222 .unused,
6385 .unused,7223 .unused,
6386 },7224 },
6387 .dst_temps = .{.mem},7225 .dst_temps = .{.mem},
6388 .clobbers = .{ .eflags = true },7226 .clobbers = .{ .eflags = true },
6389 .each = .{ .once = &.{7227 .each = .{ .once = &.{
6390 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7228 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
6391 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },7229 .{ ._, ._dqa, .mov, .tmp2x, .lea(.xword, .tmp0), ._, ._ },
6392 .{ .@"0:", ._, .mov, .tmp2q, .ua(.src0, .add_umax), ._, ._ },7230 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6393 .{ ._, ._, .@"and", .tmp2q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },7231 .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6394 .{ ._, ._r, .bs, .tmp2q, .tmp2q, ._, ._ },7232 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6395 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },7233 .{ ._, ._dqa, .mov, .tmp5x, .tmp3x, ._, ._ },
6396 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },7234 .{ ._, ._dqa, .mov, .tmp6x, .tmp4x, ._, ._ },
6397 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },7235 .{ ._, .p_, .xor, .tmp5x, .tmp2x, ._, ._ },
6398 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },7236 .{ ._, .p_, .xor, .tmp6x, .tmp2x, ._, ._ },
6399 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },7237 .{ ._, .p_d, .cmpgt, .tmp5x, .tmp6x, ._, ._ },
7238 .{ ._, .p_, .@"and", .tmp4x, .tmp5x, ._, ._ },
7239 .{ ._, .p_, .andn, .tmp5x, .tmp3x, ._, ._ },
7240 .{ ._, .p_, .@"or", .tmp4x, .tmp5x, ._, ._ },
7241 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp4x, ._, ._ },
7242 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6400 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7243 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6401 } },7244 } },
6402 }, .{7245 }, .{
6403 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null },7246 .required_features = .{ .cmov, null, null, null },
6404 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },7247 .src_constraints = .{
7248 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
7249 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
7250 },
6405 .patterns = &.{7251 .patterns = &.{
6406 .{ .src = .{ .to_mem, .none } },7252 .{ .src = .{ .to_mem, .to_mem } },
6407 },7253 },
6408 .extra_temps = .{7254 .extra_temps = .{
6409 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7255 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6410 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7256 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
6411 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7257 .unused,
6412 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },7258 .unused,
7259 .unused,
7260 .unused,
7261 .unused,
6413 .unused,7262 .unused,
6414 .unused,7263 .unused,
6415 },7264 },
6416 .dst_temps = .{.mem},7265 .dst_temps = .{.mem},
6417 .clobbers = .{ .eflags = true },7266 .clobbers = .{ .eflags = true },
6418 .each = .{ .once = &.{7267 .each = .{ .once = &.{
6419 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7268 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6420 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },7269 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
6421 .{ .@"0:", ._, .mov, .tmp2q, .ua(.src0, .add_umax), ._, ._ },7270 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
6422 .{ ._, ._, .@"and", .tmp2q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },7271 .{ ._, ._ae, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
6423 .{ ._, ._r, .bs, .tmp2q, .tmp2q, ._, ._ },7272 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
6424 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },7273 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
6425 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },7274 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6426 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
6427 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6428 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6429 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6430 } },7275 } },
6431 }, .{7276 }, .{
6432 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, .slow_incdec, null },7277 .src_constraints = .{
6433 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },7278 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
7279 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
7280 },
6434 .patterns = &.{7281 .patterns = &.{
6435 .{ .src = .{ .to_mem, .none } },7282 .{ .src = .{ .to_mem, .to_mem } },
6436 },7283 },
6437 .extra_temps = .{7284 .extra_temps = .{
6438 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7285 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6439 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7286 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
6440 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7287 .unused,
7288 .unused,
7289 .unused,
7290 .unused,
6441 .unused,7291 .unused,
6442 .unused,7292 .unused,
6443 .unused,7293 .unused,
...@@ -6445,57 +7295,91 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6445,57 +7295,91 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6445 .dst_temps = .{.mem},7295 .dst_temps = .{.mem},
6446 .clobbers = .{ .eflags = true },7296 .clobbers = .{ .eflags = true },
6447 .each = .{ .once = &.{7297 .each = .{ .once = &.{
6448 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7298 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6449 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },7299 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
6450 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },7300 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
6451 .{ ._, ._r, .bs, .tmp1q, .tmp1q, ._, ._ },7301 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
6452 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },7302 .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
6453 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },7303 .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
6454 .{ ._, ._c, .st, ._, ._, ._, ._ },7304 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
6455 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
6456 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
6457 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6458 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7305 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6459 } },7306 } },
6460 }, .{7307 }, .{
6461 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },7308 .required_features = .{ .avx, null, null, null },
6462 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },7309 .src_constraints = .{
7310 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
7311 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
7312 },
6463 .patterns = &.{7313 .patterns = &.{
6464 .{ .src = .{ .to_mem, .none } },7314 .{ .src = .{ .to_sse, .mem } },
7315 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7316 .{ .src = .{ .to_sse, .to_sse } },
7317 },
7318 .dst_temps = .{.{ .rc = .sse }},
7319 .each = .{ .once = &.{
7320 .{ ._, .vp_q, .cmpgt, .dst0x, .src0x, .src1x, ._ },
7321 .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x },
7322 } },
7323 }, .{
7324 .required_features = .{ .sse4_2, null, null, null },
7325 .src_constraints = .{
7326 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
7327 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
7328 },
7329 .patterns = &.{
7330 .{ .src = .{ .to_mut_sse, .mem } },
7331 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7332 .{ .src = .{ .to_mut_sse, .to_sse } },
6465 },7333 },
6466 .extra_temps = .{7334 .extra_temps = .{
6467 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7335 .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } },
6468 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7336 .unused,
6469 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7337 .unused,
7338 .unused,
7339 .unused,
7340 .unused,
6470 .unused,7341 .unused,
6471 .unused,7342 .unused,
6472 .unused,7343 .unused,
6473 },7344 },
6474 .dst_temps = .{.mem},7345 .dst_temps = .{.{ .ref = .src0 }},
6475 .clobbers = .{ .eflags = true },
6476 .each = .{ .once = &.{7346 .each = .{ .once = &.{
6477 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7347 .{ ._, ._dqa, .mov, .tmp0x, .src0x, ._, ._ },
6478 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },7348 .{ ._, .p_q, .cmpgt, .tmp0x, .src1x, ._, ._ },
6479 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },7349 .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp0x, ._ },
6480 .{ ._, ._r, .bs, .tmp1q, .tmp1q, ._, ._ },
6481 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
6482 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
6483 .{ ._, ._c, .st, ._, ._, ._, ._ },
6484 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
6485 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
6486 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6487 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6488 } },7350 } },
6489 }, .{7351 }, .{
6490 .required_features = .{ .@"64bit", .slow_incdec, null, null },7352 .required_features = .{ .avx2, null, null, null },
6491 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },7353 .src_constraints = .{
7354 .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } },
7355 .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } },
7356 },
6492 .patterns = &.{7357 .patterns = &.{
6493 .{ .src = .{ .to_mem, .none } },7358 .{ .src = .{ .to_sse, .mem } },
7359 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7360 .{ .src = .{ .to_sse, .to_sse } },
7361 },
7362 .dst_temps = .{.{ .rc = .sse }},
7363 .each = .{ .once = &.{
7364 .{ ._, .vp_q, .cmpgt, .dst0y, .src0y, .src1y, ._ },
7365 .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y },
7366 } },
7367 }, .{
7368 .required_features = .{ .avx2, null, null, null },
7369 .src_constraints = .{
7370 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } },
7371 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } },
7372 },
7373 .patterns = &.{
7374 .{ .src = .{ .to_mem, .to_mem } },
6494 },7375 },
6495 .extra_temps = .{7376 .extra_temps = .{
6496 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7377 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6497 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7378 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
6498 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7379 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
7380 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
7381 .unused,
7382 .unused,
6499 .unused,7383 .unused,
6500 .unused,7384 .unused,
6501 .unused,7385 .unused,
...@@ -6503,27 +7387,31 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6503,27 +7387,31 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6503 .dst_temps = .{.mem},7387 .dst_temps = .{.mem},
6504 .clobbers = .{ .eflags = true },7388 .clobbers = .{ .eflags = true },
6505 .each = .{ .once = &.{7389 .each = .{ .once = &.{
6506 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7390 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6507 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },7391 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6508 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },7392 .{ ._, .v_dqa, .mov, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
6509 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },7393 .{ ._, .vp_q, .cmpgt, .tmp3y, .tmp1y, .tmp2y, ._ },
6510 .{ ._, ._r, .bs, .tmp2q, .tmp1q, ._, ._ },7394 .{ ._, .vp_b, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
6511 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },7395 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
6512 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },7396 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
6513 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
6514 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6515 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7397 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6516 } },7398 } },
6517 }, .{7399 }, .{
6518 .required_features = .{ .@"64bit", null, null, null },7400 .required_features = .{ .avx, null, null, null },
6519 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },7401 .src_constraints = .{
7402 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
7403 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
7404 },
6520 .patterns = &.{7405 .patterns = &.{
6521 .{ .src = .{ .to_mem, .none } },7406 .{ .src = .{ .to_mem, .to_mem } },
6522 },7407 },
6523 .extra_temps = .{7408 .extra_temps = .{
6524 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7409 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6525 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7410 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
6526 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7411 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
7412 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
7413 .unused,
7414 .unused,
6527 .unused,7415 .unused,
6528 .unused,7416 .unused,
6529 .unused,7417 .unused,
...@@ -6531,895 +7419,7323 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6531,895 +7419,7323 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6531 .dst_temps = .{.mem},7419 .dst_temps = .{.mem},
6532 .clobbers = .{ .eflags = true },7420 .clobbers = .{ .eflags = true },
6533 .each = .{ .once = &.{7421 .each = .{ .once = &.{
6534 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7422 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6535 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },7423 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6536 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },7424 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6537 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },7425 .{ ._, .vp_q, .cmpgt, .tmp3x, .tmp1x, .tmp2x, ._ },
6538 .{ ._, ._r, .bs, .tmp2q, .tmp1q, ._, ._ },7426 .{ ._, .vp_b, .blendv, .tmp1x, .tmp1x, .tmp2x, .tmp3x },
6539 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },7427 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6540 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },7428 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6541 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },7429 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6542 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6543 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6544 } },7430 } },
6545 }, .{7431 }, .{
6546 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },7432 .required_features = .{ .sse4_2, null, null, null },
6547 .dst_constraints = .{.{ .scalar_int_is = .byte }},7433 .src_constraints = .{
6548 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },7434 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
7435 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
7436 },
6549 .patterns = &.{7437 .patterns = &.{
6550 .{ .src = .{ .to_mem, .none } },7438 .{ .src = .{ .to_mem, .to_mem } },
6551 },7439 },
6552 .extra_temps = .{7440 .extra_temps = .{
6553 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7441 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6554 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7442 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
6555 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7443 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
6556 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7444 .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } },
6557 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7445 .unused,
7446 .unused,
7447 .unused,
7448 .unused,
6558 .unused,7449 .unused,
6559 },7450 },
6560 .dst_temps = .{.mem},7451 .dst_temps = .{.mem},
6561 .clobbers = .{ .eflags = true },7452 .clobbers = .{ .eflags = true },
6562 .each = .{ .once = &.{7453 .each = .{ .once = &.{
6563 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7454 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6564 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7455 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6565 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },7456 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6566 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7457 .{ ._, ._dqa, .mov, .tmp3x, .tmp1x, ._, ._ },
6567 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7458 .{ ._, .p_q, .cmpgt, .tmp3x, .tmp2x, ._, ._ },
6568 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },7459 .{ ._, .p_b, .blendv, .tmp1x, .tmp2x, .tmp3x, ._ },
6569 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },7460 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6570 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },7461 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6571 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
6572 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
6573 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
6574 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
6575 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
6576 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
6577 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6578 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
6579 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6580 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7462 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6581 } },7463 } },
6582 }, .{7464 }, .{
6583 .required_features = .{ .@"64bit", .lzcnt, null, null },7465 .required_features = .{ .@"64bit", .cmov, null, null },
6584 .dst_constraints = .{.{ .scalar_int_is = .byte }},7466 .src_constraints = .{
6585 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },7467 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
7468 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
7469 },
6586 .patterns = &.{7470 .patterns = &.{
6587 .{ .src = .{ .to_mem, .none } },7471 .{ .src = .{ .to_mem, .to_mem } },
6588 },7472 },
6589 .extra_temps = .{7473 .extra_temps = .{
6590 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7474 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6591 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7475 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
6592 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7476 .unused,
6593 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7477 .unused,
6594 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7478 .unused,
7479 .unused,
7480 .unused,
7481 .unused,
6595 .unused,7482 .unused,
6596 },7483 },
6597 .dst_temps = .{.mem},7484 .dst_temps = .{.mem},
6598 .clobbers = .{ .eflags = true },7485 .clobbers = .{ .eflags = true },
6599 .each = .{ .once = &.{7486 .each = .{ .once = &.{
6600 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7487 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6601 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7488 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6602 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },7489 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6603 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7490 .{ ._, ._ge, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6604 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7491 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
6605 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },7492 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
6606 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
6607 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
6608 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
6609 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
6610 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
6611 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
6612 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
6613 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6614 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
6615 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6616 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7493 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6617 } },7494 } },
6618 }, .{7495 }, .{
6619 .required_features = .{ .@"64bit", null, null, null },7496 .required_features = .{ .@"64bit", null, null, null },
6620 .dst_constraints = .{.{ .scalar_int_is = .byte }},7497 .src_constraints = .{
6621 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },7498 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
7499 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
7500 },
6622 .patterns = &.{7501 .patterns = &.{
6623 .{ .src = .{ .to_mem, .none } },7502 .{ .src = .{ .to_mem, .to_mem } },
6624 },7503 },
6625 .extra_temps = .{7504 .extra_temps = .{
6626 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7505 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6627 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7506 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
6628 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7507 .unused,
6629 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7508 .unused,
7509 .unused,
7510 .unused,
7511 .unused,
6630 .unused,7512 .unused,
6631 .unused,7513 .unused,
6632 },7514 },
6633 .dst_temps = .{.mem},7515 .dst_temps = .{.mem},
6634 .clobbers = .{ .eflags = true },7516 .clobbers = .{ .eflags = true },
6635 .each = .{ .once = &.{7517 .each = .{ .once = &.{
6636 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7518 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6637 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7519 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6638 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },7520 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6639 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7521 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
6640 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7522 .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6641 .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ },7523 .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
6642 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },7524 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
6643 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
6644 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
6645 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
6646 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
6647 .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.none, .tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ },
6648 .{ ._, ._, .neg, .tmp3b, ._, ._, ._ },
6649 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6650 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
6651 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6652 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7525 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6653 } },7526 } },
6654 }, .{7527 }, .{
6655 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },7528 .required_features = .{ .avx, null, null, null },
6656 .dst_constraints = .{.{ .scalar_int_is = .byte }},7529 .src_constraints = .{
6657 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },7530 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7531 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7532 },
6658 .patterns = &.{7533 .patterns = &.{
6659 .{ .src = .{ .to_mem, .none } },7534 .{ .src = .{ .to_sse, .mem } },
7535 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7536 .{ .src = .{ .to_sse, .to_sse } },
6660 },7537 },
6661 .extra_temps = .{7538 .extra_temps = .{
6662 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6663 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7539 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
6664 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7540 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
6665 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7541 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
6666 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7542 .unused,
7543 .unused,
7544 .unused,
7545 .unused,
7546 .unused,
7547 .unused,
7548 },
7549 .dst_temps = .{.{ .rc = .sse }},
7550 .each = .{ .once = &.{
7551 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
7552 .{ ._, .v_, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
7553 .{ ._, .vp_, .xor, .dst0x, .tmp2x, .src0x, ._ },
7554 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .src1x, ._ },
7555 .{ ._, .vp_q, .cmpgt, .dst0x, .dst0x, .tmp2x, ._ },
7556 .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x },
7557 } },
7558 }, .{
7559 .required_features = .{ .sse4_2, null, null, null },
7560 .src_constraints = .{
7561 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7562 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7563 },
7564 .patterns = &.{
7565 .{ .src = .{ .to_mut_sse, .mem } },
7566 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7567 .{ .src = .{ .to_mut_sse, .to_sse } },
7568 },
7569 .extra_temps = .{
7570 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7571 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
7572 .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } },
7573 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
7574 .unused,
7575 .unused,
7576 .unused,
7577 .unused,
7578 .unused,
7579 },
7580 .dst_temps = .{.{ .ref = .src0 }},
7581 .each = .{ .once = &.{
7582 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
7583 .{ ._, ._, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
7584 .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ },
7585 .{ ._, .p_, .xor, .tmp2x, .src0x, ._, ._ },
7586 .{ ._, .p_, .xor, .tmp3x, .src1x, ._, ._ },
7587 .{ ._, .p_q, .cmpgt, .tmp2x, .tmp3x, ._, ._ },
7588 .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp2x, ._ },
7589 } },
7590 }, .{
7591 .required_features = .{ .avx2, null, null, null },
7592 .src_constraints = .{
7593 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
7594 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
7595 },
7596 .patterns = &.{
7597 .{ .src = .{ .to_sse, .mem } },
7598 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7599 .{ .src = .{ .to_sse, .to_sse } },
7600 },
7601 .extra_temps = .{
7602 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7603 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
7604 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
7605 .unused,
7606 .unused,
7607 .unused,
7608 .unused,
7609 .unused,
7610 .unused,
7611 },
7612 .dst_temps = .{.{ .rc = .sse }},
7613 .each = .{ .once = &.{
7614 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
7615 .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.qword, .tmp0), ._, ._ },
7616 .{ ._, .vp_, .xor, .dst0y, .tmp2y, .src0y, ._ },
7617 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .src1y, ._ },
7618 .{ ._, .vp_q, .cmpgt, .dst0y, .dst0y, .tmp2y, ._ },
7619 .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y },
7620 } },
7621 }, .{
7622 .required_features = .{ .avx2, null, null, null },
7623 .src_constraints = .{
7624 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
7625 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
7626 },
7627 .patterns = &.{
7628 .{ .src = .{ .to_mem, .to_mem } },
7629 },
7630 .extra_temps = .{
7631 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7632 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
7633 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
7634 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
7635 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
7636 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
7637 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
7638 .unused,
6667 .unused,7639 .unused,
6668 },7640 },
6669 .dst_temps = .{.mem},7641 .dst_temps = .{.mem},
6670 .clobbers = .{ .eflags = true },7642 .clobbers = .{ .eflags = true },
6671 .each = .{ .once = &.{7643 .each = .{ .once = &.{
6672 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7644 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
6673 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7645 .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.qword, .tmp0), ._, ._ },
6674 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },7646 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6675 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7647 .{ .@"0:", .v_dqa, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6676 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7648 .{ ._, .v_dqa, .mov, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
6677 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },7649 .{ ._, .vp_, .xor, .tmp5y, .tmp3y, .tmp2y, ._ },
6678 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },7650 .{ ._, .vp_, .xor, .tmp6y, .tmp4y, .tmp2y, ._ },
6679 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },7651 .{ ._, .vp_q, .cmpgt, .tmp5y, .tmp5y, .tmp6y, ._ },
6680 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },7652 .{ ._, .vp_b, .blendv, .tmp3y, .tmp3y, .tmp4y, .tmp5y },
6681 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },7653 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ },
6682 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },7654 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
6683 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
6684 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
6685 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
6686 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6687 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
6688 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6689 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7655 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6690 } },7656 } },
6691 }, .{7657 }, .{
6692 .required_features = .{ .@"64bit", .lzcnt, null, null },7658 .required_features = .{ .avx, null, null, null },
6693 .dst_constraints = .{.{ .scalar_int_is = .byte }},7659 .src_constraints = .{
6694 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },7660 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7661 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7662 },
6695 .patterns = &.{7663 .patterns = &.{
6696 .{ .src = .{ .to_mem, .none } },7664 .{ .src = .{ .to_mem, .to_mem } },
6697 },7665 },
6698 .extra_temps = .{7666 .extra_temps = .{
6699 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7667 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6700 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7668 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
6701 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7669 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
6702 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7670 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
6703 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7671 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
7672 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
7673 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
7674 .unused,
6704 .unused,7675 .unused,
6705 },7676 },
6706 .dst_temps = .{.mem},7677 .dst_temps = .{.mem},
6707 .clobbers = .{ .eflags = true },7678 .clobbers = .{ .eflags = true },
6708 .each = .{ .once = &.{7679 .each = .{ .once = &.{
6709 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7680 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
6710 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7681 .{ ._, .v_, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
6711 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },7682 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6712 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7683 .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6713 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7684 .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6714 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },7685 .{ ._, .vp_, .xor, .tmp5x, .tmp3x, .tmp2x, ._ },
6715 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },7686 .{ ._, .vp_, .xor, .tmp6x, .tmp4x, .tmp2x, ._ },
6716 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },7687 .{ ._, .vp_q, .cmpgt, .tmp5x, .tmp5x, .tmp6x, ._ },
6717 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },7688 .{ ._, .vp_b, .blendv, .tmp3x, .tmp3x, .tmp4x, .tmp5x },
6718 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },7689 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
6719 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },7690 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6720 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
6721 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
6722 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6723 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
6724 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6725 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7691 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6726 } },7692 } },
6727 }, .{7693 }, .{
6728 .required_features = .{ .@"64bit", null, null, null },7694 .required_features = .{ .sse4_2, null, null, null },
6729 .dst_constraints = .{.{ .scalar_int_is = .byte }},7695 .src_constraints = .{
6730 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },7696 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7697 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7698 },
6731 .patterns = &.{7699 .patterns = &.{
6732 .{ .src = .{ .to_mem, .none } },7700 .{ .src = .{ .to_mem, .to_mem } },
6733 },7701 },
6734 .extra_temps = .{7702 .extra_temps = .{
6735 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7703 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6736 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7704 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
6737 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7705 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
6738 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7706 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
7707 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
7708 .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } },
7709 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
6739 .unused,7710 .unused,
6740 .unused,7711 .unused,
6741 },7712 },
6742 .dst_temps = .{.mem},7713 .dst_temps = .{.mem},
6743 .clobbers = .{ .eflags = true },7714 .clobbers = .{ .eflags = true },
6744 .each = .{ .once = &.{7715 .each = .{ .once = &.{
6745 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7716 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
6746 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7717 .{ ._, ._, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
6747 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },7718 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6748 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7719 .{ .@"0:", ._dqa, .mov, .tmp5x, .tmp2x, ._, ._ },
6749 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7720 .{ ._, ._dqa, .mov, .tmp6x, .tmp2x, ._, ._ },
6750 .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ },7721 .{ ._, ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6751 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },7722 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6752 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },7723 .{ ._, .p_, .xor, .tmp5x, .tmp3x, ._, ._ },
6753 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },7724 .{ ._, .p_, .xor, .tmp6x, .tmp4x, ._, ._ },
6754 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },7725 .{ ._, .p_q, .cmpgt, .tmp5x, .tmp6x, ._, ._ },
6755 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },7726 .{ ._, .p_b, .blendv, .tmp3x, .tmp4x, .tmp5x, ._ },
6756 .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.none, .tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ },7727 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
6757 .{ ._, ._, .neg, .tmp3b, ._, ._, ._ },7728 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6758 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
6759 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
6760 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6761 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7729 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6762 } },7730 } },
6763 }, .{7731 }, .{
6764 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },7732 .required_features = .{ .@"64bit", .cmov, null, null },
6765 .dst_constraints = .{.{ .scalar_int_is = .word }},7733 .src_constraints = .{
6766 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },7734 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
7735 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
7736 },
6767 .patterns = &.{7737 .patterns = &.{
6768 .{ .src = .{ .to_mem, .none } },7738 .{ .src = .{ .to_mem, .to_mem } },
6769 },7739 },
6770 .extra_temps = .{7740 .extra_temps = .{
6771 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7741 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6772 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
6773 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
6774 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
6775 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7742 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
6776 .unused,7743 .unused,
7744 .unused,
7745 .unused,
7746 .unused,
7747 .unused,
7748 .unused,
7749 .unused,
6777 },7750 },
6778 .dst_temps = .{.mem},7751 .dst_temps = .{.mem},
6779 .clobbers = .{ .eflags = true },7752 .clobbers = .{ .eflags = true },
6780 .each = .{ .once = &.{7753 .each = .{ .once = &.{
6781 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7754 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6782 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7755 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6783 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },7756 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6784 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7757 .{ ._, ._ae, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6785 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7758 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
6786 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },7759 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
6787 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
6788 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
6789 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
6790 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
6791 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
6792 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
6793 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
6794 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
6795 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },
6796 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
6797 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6798 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7760 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6799 } },7761 } },
6800 }, .{7762 }, .{
6801 .required_features = .{ .@"64bit", .lzcnt, null, null },7763 .required_features = .{ .@"64bit", null, null, null },
6802 .dst_constraints = .{.{ .scalar_int_is = .word }},7764 .src_constraints = .{
6803 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },7765 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
7766 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
7767 },
6804 .patterns = &.{7768 .patterns = &.{
6805 .{ .src = .{ .to_mem, .none } },7769 .{ .src = .{ .to_mem, .to_mem } },
6806 },7770 },
6807 .extra_temps = .{7771 .extra_temps = .{
6808 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7772 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6809 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
6810 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
6811 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
6812 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7773 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
6813 .unused,7774 .unused,
7775 .unused,
7776 .unused,
7777 .unused,
7778 .unused,
7779 .unused,
7780 .unused,
6814 },7781 },
6815 .dst_temps = .{.mem},7782 .dst_temps = .{.mem},
6816 .clobbers = .{ .eflags = true },7783 .clobbers = .{ .eflags = true },
6817 .each = .{ .once = &.{7784 .each = .{ .once = &.{
6818 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7785 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6819 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7786 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6820 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },7787 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6821 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7788 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
6822 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7789 .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6823 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },7790 .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
6824 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },7791 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
6825 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
6826 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
6827 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
6828 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
6829 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
6830 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
6831 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },
6832 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
6833 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6834 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7792 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6835 } },7793 } },
6836 }, .{7794 }, .{
6837 .required_features = .{ .@"64bit", null, null, null },7795 .required_features = .{ .@"64bit", .cmov, null, null },
6838 .dst_constraints = .{.{ .scalar_int_is = .word }},7796 .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int },
6839 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
6840 .patterns = &.{7797 .patterns = &.{
6841 .{ .src = .{ .to_mem, .none } },7798 .{ .src = .{ .to_mem, .to_mem } },
6842 },7799 },
6843 .extra_temps = .{7800 .extra_temps = .{
6844 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7801 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6845 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7802 .{ .type = .isize, .kind = .{ .reg = .rsi } },
6846 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7803 .{ .type = .u64, .kind = .{ .reg = .rdi } },
6847 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7804 .{ .type = .u64, .kind = .{ .reg = .rcx } },
7805 .unused,
7806 .unused,
7807 .unused,
6848 .unused,7808 .unused,
6849 .unused,7809 .unused,
6850 },7810 },
6851 .dst_temps = .{.mem},7811 .dst_temps = .{.mem},
6852 .clobbers = .{ .eflags = true },7812 .clobbers = .{ .eflags = true },
6853 .each = .{ .once = &.{7813 .each = .{ .once = &.{
6854 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7814 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6855 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7815 .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ },
6856 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },7816 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6857 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7817 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6858 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7818 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6859 .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ },7819 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
6860 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },7820 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
6861 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },7821 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
6862 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },7822 .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6863 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },7823 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6864 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },7824 .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
6865 .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.none, .tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ },7825 .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
6866 .{ ._, ._, .neg, .tmp3d, ._, ._, ._ },7826 .{ ._, ._ge, .cmov, .tmp1p, .tmp2p, ._, ._ },
6867 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },7827 .{ ._, ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
6868 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },7828 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
6869 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },7829 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
7830 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
6870 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7831 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6871 } },7832 } },
6872 }, .{7833 }, .{
6873 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },7834 .required_features = .{ .@"64bit", null, null, null },
6874 .dst_constraints = .{.{ .scalar_int_is = .word }},7835 .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int },
6875 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
6876 .patterns = &.{7836 .patterns = &.{
6877 .{ .src = .{ .to_mem, .none } },7837 .{ .src = .{ .to_mem, .to_mem } },
6878 },7838 },
6879 .extra_temps = .{7839 .extra_temps = .{
6880 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7840 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6881 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7841 .{ .type = .isize, .kind = .{ .reg = .rsi } },
6882 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7842 .{ .type = .u64, .kind = .{ .reg = .rdi } },
6883 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7843 .{ .type = .u64, .kind = .{ .reg = .rcx } },
6884 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7844 .unused,
7845 .unused,
7846 .unused,
7847 .unused,
6885 .unused,7848 .unused,
6886 },7849 },
6887 .dst_temps = .{.mem},7850 .dst_temps = .{.mem},
6888 .clobbers = .{ .eflags = true },7851 .clobbers = .{ .eflags = true },
6889 .each = .{ .once = &.{7852 .each = .{ .once = &.{
6890 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7853 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6891 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7854 .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ },
6892 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },7855 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6893 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7856 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6894 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7857 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6895 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },7858 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
6896 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },7859 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
6897 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },7860 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
6898 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },7861 .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6899 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },7862 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6900 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },7863 .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
6901 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },7864 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
6902 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },7865 .{ ._, ._, .lea, .tmp1p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
6903 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },7866 .{ .@"1:", ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
6904 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },7867 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
6905 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },7868 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
6906 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },7869 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
6907 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },7870 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6908 } },7871 } },
6909 }, .{7872 }, .{
6910 .required_features = .{ .@"64bit", .lzcnt, null, null },7873 .required_features = .{ .@"64bit", .cmov, null, null },
6911 .dst_constraints = .{.{ .scalar_int_is = .word }},7874 .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int },
6912 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
6913 .patterns = &.{7875 .patterns = &.{
6914 .{ .src = .{ .to_mem, .none } },7876 .{ .src = .{ .to_mem, .to_mem } },
6915 },7877 },
6916 .extra_temps = .{7878 .extra_temps = .{
6917 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7879 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6918 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7880 .{ .type = .isize, .kind = .{ .reg = .rsi } },
6919 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7881 .{ .type = .u64, .kind = .{ .reg = .rdi } },
6920 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7882 .{ .type = .u64, .kind = .{ .reg = .rcx } },
6921 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7883 .unused,
7884 .unused,
7885 .unused,
7886 .unused,
6922 .unused,7887 .unused,
6923 },7888 },
6924 .dst_temps = .{.mem},7889 .dst_temps = .{.mem},
6925 .clobbers = .{ .eflags = true },7890 .clobbers = .{ .eflags = true },
6926 .each = .{ .once = &.{7891 .each = .{ .once = &.{
6927 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7892 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6928 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7893 .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
6929 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },7894 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6930 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7895 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6931 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7896 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6932 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },7897 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
6933 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },7898 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
6934 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },7899 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
6935 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },7900 .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ },
6936 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },7901 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ },
6937 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },7902 .{ ._, ._ae, .cmov, .tmp1p, .tmp2p, ._, ._ },
6938 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },7903 .{ ._, ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ },
6939 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },7904 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
6940 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },7905 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
6941 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },7906 .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ },
6942 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },7907 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6943 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6944 } },7908 } },
6945 }, .{7909 }, .{
6946 .required_features = .{ .@"64bit", null, null, null },7910 .required_features = .{ .@"64bit", null, null, null },
6947 .dst_constraints = .{.{ .scalar_int_is = .word }},7911 .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int },
6948 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
6949 .patterns = &.{7912 .patterns = &.{
6950 .{ .src = .{ .to_mem, .none } },7913 .{ .src = .{ .to_mem, .to_mem } },
6951 },7914 },
6952 .extra_temps = .{7915 .extra_temps = .{
6953 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },7916 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6954 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },7917 .{ .type = .isize, .kind = .{ .reg = .rsi } },
6955 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },7918 .{ .type = .u64, .kind = .{ .reg = .rdi } },
6956 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },7919 .{ .type = .u64, .kind = .{ .reg = .rcx } },
7920 .unused,
7921 .unused,
7922 .unused,
6957 .unused,7923 .unused,
6958 .unused,7924 .unused,
6959 },7925 },
6960 .dst_temps = .{.mem},7926 .dst_temps = .{.mem},
6961 .clobbers = .{ .eflags = true },7927 .clobbers = .{ .eflags = true },
6962 .each = .{ .once = &.{7928 .each = .{ .once = &.{
6963 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },7929 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6964 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },7930 .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
6965 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },7931 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6966 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },7932 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6967 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },7933 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6968 .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ },7934 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
6969 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },7935 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
6970 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },7936 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
6971 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },7937 .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ },
6972 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },7938 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
6973 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },7939 .{ ._, ._, .lea, .tmp1p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ },
6974 .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.none, .tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ },7940 .{ .@"1:", ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ },
6975 .{ ._, ._, .neg, .tmp3d, ._, ._, ._ },7941 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
6976 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },7942 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
6977 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },7943 .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ },
6978 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },7944 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6979 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6980 } },7945 } },
6981 } }) catch |err| switch (err) {7946 } }) catch |err| switch (err) {
6982 error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{7947 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
6983 @tagName(air_tag),7948 @tagName(air_tag),
6984 cg.typeOf(ty_op.operand).fmt(pt),7949 cg.typeOf(bin_op.lhs).fmt(pt),
6985 ops[0].tracking(cg),7950 ops[0].tracking(cg),
7951 ops[1].tracking(cg),
6986 }),7952 }),
6987 else => |e| return e,7953 else => |e| return e,
6988 };7954 };
6989 for (ops) |op| for (res) |r| {7955 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
6990 if (op.index == r.index) break;
6991 } else try op.die(cg);
6992 try res[0].moveTo(inst, cg);
6993 },7956 },
69947957 .alloc => if (use_old) try cg.airAlloc(inst) else {
6995 .cmp_vector, .cmp_vector_optimized => |air_tag| if (use_old) try cg.airCmpVector(inst) else fallback: {7958 const ty = air_datas[@intFromEnum(inst)].ty;
6996 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;7959 const slot = try cg.tempInit(ty, .{ .lea_frame = .{
6997 const extra = cg.air.extraData(Air.VectorCmp, ty_pl.payload).data;7960 .index = try cg.allocMemPtr(inst),
6998 switch (extra.compareOperator()) {7961 } });
6999 .eq, .neq => if (cg.typeOf(extra.lhs).scalarType(zcu).isRuntimeFloat())7962 try slot.finish(inst, &.{}, &.{}, cg);
7000 break :fallback try cg.airCmpVector(inst),7963 },
7001 else => break :fallback try cg.airCmpVector(inst),7964 .inferred_alloc, .inferred_alloc_comptime => unreachable,
7002 }7965 .ret_ptr => if (use_old) try cg.airRetPtr(inst) else {
7003 var ops = try cg.tempsFromOperands(inst, .{ extra.lhs, extra.rhs });7966 const ty = air_datas[@intFromEnum(inst)].ty;
7967 var slot = switch (cg.ret_mcv.long) {
7968 else => unreachable,
7969 .none => try cg.tempInit(ty, .{ .lea_frame = .{
7970 .index = try cg.allocMemPtr(inst),
7971 } }),
7972 .load_frame => slot: {
7973 var slot = try cg.tempInit(ty, cg.ret_mcv.long);
7974 try slot.toOffset(cg.ret_mcv.short.indirect.off, cg);
7975 break :slot slot;
7976 },
7977 };
7978 try slot.finish(inst, &.{}, &.{}, cg);
7979 },
7980 .assembly => try cg.airAsm(inst),
7981 .bit_and, .bit_or, .xor, .bool_and, .bool_or => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else {
7982 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
7983 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
7004 var res: [1]Temp = undefined;7984 var res: [1]Temp = undefined;
7005 switch (extra.compareOperator()) {7985 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, switch (@as(Mir.Inst.Tag, switch (air_tag) {
7006 .lt => unreachable,7986 else => unreachable,
7007 .lte => unreachable,7987 .bit_and, .bool_and => .@"and",
7008 .eq, .neq => |cmp_op| cg.select(&res, &.{ty_pl.ty.toType()}, &ops, switch (@as(Condition, switch (cmp_op) {7988 .bit_or, .bool_or => .@"or",
7009 else => unreachable,7989 .xor => .xor,
7010 .eq => .e,7990 })) {
7011 .neq => .ne,7991 else => unreachable,
7012 })) {7992 inline .@"and", .@"or", .xor => |mir_tag| comptime &.{ .{
7013 else => unreachable,7993 .src_constraints = .{ .{ .size = .byte }, .{ .size = .byte } },
7014 inline .e, .ne => |cc| comptime &.{ .{7994 .patterns = &.{
7015 .required_features = .{ .avx2, null, null, null },7995 .{ .src = .{ .mut_mem, .imm8 } },
7016 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },7996 .{ .src = .{ .imm8, .mut_mem }, .commute = .{ 0, 1 } },
7017 .patterns = &.{7997 .{ .src = .{ .to_mut_gpr, .imm8 } },
7018 .{ .src = .{ .to_ymm, .mem } },7998 .{ .src = .{ .imm8, .to_mut_gpr }, .commute = .{ 0, 1 } },
7019 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },7999 .{ .src = .{ .mut_mem, .to_gpr } },
7020 .{ .src = .{ .to_ymm, .to_ymm } },8000 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
7021 },8001 .{ .src = .{ .to_mut_gpr, .mem } },
7022 .dst_temps = .{.{ .rc_mask = .{ .rc = .sse, .info = .{8002 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
7023 .kind = .all,8003 .{ .src = .{ .to_mut_gpr, .to_gpr } },
7024 .inverted = switch (cc) {8004 },
7025 else => unreachable,8005 .dst_temps = .{.{ .ref = .src0 }},
7026 .e => false,8006 .clobbers = .{ .eflags = true },
7027 .ne => true,8007 .each = .{ .once = &.{
7028 },8008 .{ ._, ._, mir_tag, .dst0b, .src1b, ._, ._ },
7029 .scalar = .byte,8009 } },
7030 } } }},8010 }, .{
7031 .each = .{ .once = &.{8011 .src_constraints = .{ .{ .size = .word }, .{ .size = .word } },
7032 .{ ._, .vp_b, .cmpeq, .dst0y, .src0y, .src1y, ._ },8012 .patterns = &.{
8013 .{ .src = .{ .mut_mem, .imm16 } },
8014 .{ .src = .{ .imm16, .mut_mem }, .commute = .{ 0, 1 } },
8015 .{ .src = .{ .to_mut_gpr, .imm16 } },
8016 .{ .src = .{ .imm16, .to_mut_gpr }, .commute = .{ 0, 1 } },
8017 .{ .src = .{ .mut_mem, .to_gpr } },
8018 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
8019 .{ .src = .{ .to_mut_gpr, .mem } },
8020 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
8021 .{ .src = .{ .to_mut_gpr, .to_gpr } },
8022 },
8023 .dst_temps = .{.{ .ref = .src0 }},
8024 .clobbers = .{ .eflags = true },
8025 .each = .{ .once = &.{
8026 .{ ._, ._, mir_tag, .dst0w, .src1w, ._, ._ },
8027 } },
8028 }, .{
8029 .src_constraints = .{ .{ .size = .dword }, .{ .size = .dword } },
8030 .patterns = &.{
8031 .{ .src = .{ .mut_mem, .imm32 } },
8032 .{ .src = .{ .imm32, .mut_mem }, .commute = .{ 0, 1 } },
8033 .{ .src = .{ .to_mut_gpr, .imm32 } },
8034 .{ .src = .{ .imm32, .to_mut_gpr }, .commute = .{ 0, 1 } },
8035 .{ .src = .{ .mut_mem, .to_gpr } },
8036 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
8037 .{ .src = .{ .to_mut_gpr, .mem } },
8038 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
8039 .{ .src = .{ .to_mut_gpr, .to_gpr } },
8040 },
8041 .dst_temps = .{.{ .ref = .src0 }},
8042 .clobbers = .{ .eflags = true },
8043 .each = .{ .once = &.{
8044 .{ ._, ._, mir_tag, .dst0d, .src1d, ._, ._ },
8045 } },
8046 }, .{
8047 .required_features = .{ .@"64bit", null, null, null },
8048 .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword } },
8049 .patterns = &.{
8050 .{ .src = .{ .mut_mem, .simm32 } },
8051 .{ .src = .{ .simm32, .mut_mem }, .commute = .{ 0, 1 } },
8052 .{ .src = .{ .to_mut_gpr, .simm32 } },
8053 .{ .src = .{ .simm32, .to_mut_gpr }, .commute = .{ 0, 1 } },
8054 .{ .src = .{ .mut_mem, .to_gpr } },
8055 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
8056 .{ .src = .{ .to_mut_gpr, .mem } },
8057 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
8058 .{ .src = .{ .to_mut_gpr, .to_gpr } },
8059 },
8060 .dst_temps = .{.{ .ref = .src0 }},
8061 .clobbers = .{ .eflags = true },
8062 .each = .{ .once = &.{
8063 .{ ._, ._, mir_tag, .dst0q, .src1q, ._, ._ },
8064 } },
8065 }, .{
8066 .required_features = .{ .mmx, null, null, null },
8067 .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword } },
8068 .patterns = &.{
8069 .{ .src = .{ .to_mut_mm, .mem } },
8070 .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } },
8071 .{ .src = .{ .to_mut_mm, .to_mm } },
8072 },
8073 .dst_temps = .{.{ .ref = .src0 }},
8074 .each = .{ .once = &.{
8075 .{ ._, .p_, mir_tag, .dst0q, .src1q, ._, ._ },
8076 } },
8077 }, .{
8078 .required_features = .{ .avx, null, null, null },
8079 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } },
8080 .patterns = &.{
8081 .{ .src = .{ .to_xmm, .mem } },
8082 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
8083 .{ .src = .{ .to_xmm, .to_xmm } },
8084 },
8085 .dst_temps = .{.{ .rc = .sse }},
8086 .each = .{ .once = &.{
8087 .{ ._, .vp_, mir_tag, .dst0x, .src0x, .src1x, ._ },
8088 } },
8089 }, .{
8090 .required_features = .{ .sse2, null, null, null },
8091 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } },
8092 .patterns = &.{
8093 .{ .src = .{ .to_mut_xmm, .mem } },
8094 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
8095 .{ .src = .{ .to_mut_xmm, .to_xmm } },
8096 },
8097 .dst_temps = .{.{ .ref = .src0 }},
8098 .each = .{ .once = &.{
8099 .{ ._, .p_, mir_tag, .dst0x, .src1x, ._, ._ },
8100 } },
8101 }, .{
8102 .required_features = .{ .sse, null, null, null },
8103 .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } },
8104 .patterns = &.{
8105 .{ .src = .{ .to_mut_xmm, .mem } },
8106 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
8107 .{ .src = .{ .to_mut_xmm, .to_xmm } },
8108 },
8109 .dst_temps = .{.{ .ref = .src0 }},
8110 .each = .{ .once = &.{
8111 .{ ._, ._ps, mir_tag, .dst0x, .src1x, ._, ._ },
8112 } },
8113 }, .{
8114 .required_features = .{ .avx2, null, null, null },
8115 .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword } },
8116 .patterns = &.{
8117 .{ .src = .{ .to_ymm, .mem } },
8118 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
8119 .{ .src = .{ .to_ymm, .to_ymm } },
8120 },
8121 .dst_temps = .{.{ .rc = .sse }},
8122 .each = .{ .once = &.{
8123 .{ ._, .vp_, mir_tag, .dst0y, .src0y, .src1y, ._ },
8124 } },
8125 }, .{
8126 .required_features = .{ .avx, null, null, null },
8127 .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword } },
8128 .patterns = &.{
8129 .{ .src = .{ .to_ymm, .mem } },
8130 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
8131 .{ .src = .{ .to_ymm, .to_ymm } },
8132 },
8133 .dst_temps = .{.{ .rc = .sse }},
8134 .each = .{ .once = &.{
8135 .{ ._, .v_pd, mir_tag, .dst0y, .src0y, .src1y, ._ },
8136 } },
8137 }, .{
8138 .required_features = .{ .avx2, null, null, null },
8139 .src_constraints = .{ .{ .multiple_size = .yword }, .{ .multiple_size = .yword } },
8140 .patterns = &.{
8141 .{ .src = .{ .to_mem, .to_mem } },
8142 },
8143 .extra_temps = .{
8144 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8145 .{ .kind = .{ .rc = .sse } },
8146 .unused,
8147 .unused,
8148 .unused,
8149 .unused,
8150 .unused,
8151 .unused,
8152 .unused,
8153 },
8154 .dst_temps = .{.mem},
8155 .clobbers = .{ .eflags = true },
8156 .each = .{ .once = &.{
8157 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8158 .{ .@"0:", .v_dqu, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
8159 .{ ._, .vp_, mir_tag, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
8160 .{ ._, .v_dqu, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
8161 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8162 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8163 } },
8164 }, .{
8165 .required_features = .{ .avx, null, null, null },
8166 .src_constraints = .{ .{ .multiple_size = .yword }, .{ .multiple_size = .yword } },
8167 .patterns = &.{
8168 .{ .src = .{ .to_mem, .to_mem } },
8169 },
8170 .extra_temps = .{
8171 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8172 .{ .kind = .{ .rc = .sse } },
8173 .unused,
8174 .unused,
8175 .unused,
8176 .unused,
8177 .unused,
8178 .unused,
8179 .unused,
8180 },
8181 .dst_temps = .{.mem},
8182 .clobbers = .{ .eflags = true },
8183 .each = .{ .once = &.{
8184 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8185 .{ .@"0:", .v_pd, .movu, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
8186 .{ ._, .v_pd, mir_tag, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
8187 .{ ._, .v_pd, .movu, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
8188 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8189 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8190 } },
8191 }, .{
8192 .required_features = .{ .avx, null, null, null },
8193 .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } },
8194 .patterns = &.{
8195 .{ .src = .{ .to_mem, .to_mem } },
8196 },
8197 .extra_temps = .{
8198 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8199 .{ .kind = .{ .rc = .sse } },
8200 .unused,
8201 .unused,
8202 .unused,
8203 .unused,
8204 .unused,
8205 .unused,
8206 .unused,
8207 },
8208 .dst_temps = .{.mem},
8209 .clobbers = .{ .eflags = true },
8210 .each = .{ .once = &.{
8211 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8212 .{ .@"0:", .v_dqu, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8213 .{ ._, .vp_, mir_tag, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
8214 .{ ._, .v_dqu, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
8215 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8216 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8217 } },
8218 }, .{
8219 .required_features = .{ .sse2, null, null, null },
8220 .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } },
8221 .patterns = &.{
8222 .{ .src = .{ .to_mem, .to_mem } },
8223 },
8224 .extra_temps = .{
8225 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8226 .{ .kind = .{ .rc = .sse } },
8227 .unused,
8228 .unused,
8229 .unused,
8230 .unused,
8231 .unused,
8232 .unused,
8233 .unused,
8234 },
8235 .dst_temps = .{.mem},
8236 .clobbers = .{ .eflags = true },
8237 .each = .{ .once = &.{
8238 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8239 .{ .@"0:", ._dqu, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8240 .{ ._, .p_, mir_tag, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8241 .{ ._, ._dqu, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
8242 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8243 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8244 } },
8245 }, .{
8246 .required_features = .{ .sse, null, null, null },
8247 .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } },
8248 .patterns = &.{
8249 .{ .src = .{ .to_mem, .to_mem } },
8250 },
8251 .extra_temps = .{
8252 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8253 .{ .kind = .{ .rc = .sse } },
8254 .unused,
8255 .unused,
8256 .unused,
8257 .unused,
8258 .unused,
8259 .unused,
8260 .unused,
8261 },
8262 .dst_temps = .{.mem},
8263 .clobbers = .{ .eflags = true },
8264 .each = .{ .once = &.{
8265 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8266 .{ .@"0:", ._ps, .movu, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8267 .{ ._, ._ps, mir_tag, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8268 .{ ._, ._ps, .movu, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
8269 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8270 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8271 } },
8272 }, .{
8273 .required_features = .{ .mmx, null, null, null },
8274 .src_constraints = .{ .{ .multiple_size = .qword }, .{ .multiple_size = .qword } },
8275 .patterns = &.{
8276 .{ .src = .{ .to_mem, .to_mem } },
8277 },
8278 .extra_temps = .{
8279 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8280 .{ .kind = .{ .rc = .mmx } },
8281 .unused,
8282 .unused,
8283 .unused,
8284 .unused,
8285 .unused,
8286 .unused,
8287 .unused,
8288 },
8289 .dst_temps = .{.mem},
8290 .clobbers = .{ .eflags = true },
8291 .each = .{ .once = &.{
8292 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8293 .{ .@"0:", ._q, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
8294 .{ ._, .p_, mir_tag, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
8295 .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
8296 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
8297 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8298 } },
8299 }, .{
8300 .src_constraints = .{ .{ .multiple_size = .qword }, .{ .multiple_size = .qword } },
8301 .patterns = &.{
8302 .{ .src = .{ .to_mem, .to_mem } },
8303 },
8304 .extra_temps = .{
8305 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8306 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8307 .unused,
8308 .unused,
8309 .unused,
8310 .unused,
8311 .unused,
8312 .unused,
8313 .unused,
8314 },
8315 .dst_temps = .{.mem},
8316 .clobbers = .{ .eflags = true },
8317 .each = .{ .once = &.{
8318 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8319 .{ .@"0:", ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
8320 .{ ._, ._, mir_tag, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
8321 .{ ._, ._, .mov, .memia(.dst0p, .tmp0, .add_size), .tmp1p, ._, ._ },
8322 .{ ._, ._, .add, .tmp0p, .sa(.tmp1, .add_size), ._, ._ },
8323 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8324 } },
8325 } },
8326 }) catch |err| switch (err) {
8327 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
8328 @tagName(air_tag),
8329 cg.typeOf(bin_op.lhs).fmt(pt),
8330 ops[0].tracking(cg),
8331 ops[1].tracking(cg),
8332 }),
8333 else => |e| return e,
8334 };
8335 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
8336 },
8337 .not => |air_tag| if (use_old) try cg.airUnOp(inst, air_tag) else {
8338 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
8339 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
8340 var res: [1]Temp = undefined;
8341 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{
8342 .src_constraints = .{ .{ .signed_or_exact_int = .byte }, .any },
8343 .patterns = &.{
8344 .{ .src = .{ .mut_mem, .none } },
8345 .{ .src = .{ .to_mut_gpr, .none } },
8346 },
8347 .dst_temps = .{.{ .ref = .src0 }},
8348 .each = .{ .once = &.{
8349 .{ ._, ._, .not, .dst0b, ._, ._, ._ },
8350 } },
8351 }, .{
8352 .src_constraints = .{ .{ .unsigned_int = .byte }, .any },
8353 .patterns = &.{
8354 .{ .src = .{ .mut_mem, .none } },
8355 .{ .src = .{ .to_mut_gpr, .none } },
8356 },
8357 .dst_temps = .{.{ .ref = .src0 }},
8358 .clobbers = .{ .eflags = true },
8359 .each = .{ .once = &.{
8360 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_umax), ._, ._ },
8361 } },
8362 }, .{
8363 .src_constraints = .{ .{ .signed_or_exact_int = .word }, .any },
8364 .patterns = &.{
8365 .{ .src = .{ .mut_mem, .none } },
8366 .{ .src = .{ .to_mut_gpr, .none } },
8367 },
8368 .dst_temps = .{.{ .ref = .src0 }},
8369 .each = .{ .once = &.{
8370 .{ ._, ._, .not, .dst0w, ._, ._, ._ },
8371 } },
8372 }, .{
8373 .src_constraints = .{ .{ .unsigned_int = .word }, .any },
8374 .patterns = &.{
8375 .{ .src = .{ .mut_mem, .none } },
8376 .{ .src = .{ .to_mut_gpr, .none } },
8377 },
8378 .dst_temps = .{.{ .ref = .src0 }},
8379 .clobbers = .{ .eflags = true },
8380 .each = .{ .once = &.{
8381 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_umax), ._, ._ },
8382 } },
8383 }, .{
8384 .src_constraints = .{ .{ .signed_or_exact_int = .dword }, .any },
8385 .patterns = &.{
8386 .{ .src = .{ .mut_mem, .none } },
8387 .{ .src = .{ .to_mut_gpr, .none } },
8388 },
8389 .dst_temps = .{.{ .ref = .src0 }},
8390 .each = .{ .once = &.{
8391 .{ ._, ._, .not, .dst0d, ._, ._, ._ },
8392 } },
8393 }, .{
8394 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },
8395 .patterns = &.{
8396 .{ .src = .{ .mut_mem, .none } },
8397 .{ .src = .{ .to_mut_gpr, .none } },
8398 },
8399 .dst_temps = .{.{ .ref = .src0 }},
8400 .clobbers = .{ .eflags = true },
8401 .each = .{ .once = &.{
8402 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_umax), ._, ._ },
8403 } },
8404 }, .{
8405 .required_features = .{ .@"64bit", null, null, null },
8406 .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any },
8407 .patterns = &.{
8408 .{ .src = .{ .mut_mem, .none } },
8409 .{ .src = .{ .to_mut_gpr, .none } },
8410 },
8411 .dst_temps = .{.{ .ref = .src0 }},
8412 .each = .{ .once = &.{
8413 .{ ._, ._, .not, .dst0q, ._, ._, ._ },
8414 } },
8415 }, .{
8416 .required_features = .{ .@"64bit", null, null, null },
8417 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },
8418 .patterns = &.{
8419 .{ .src = .{ .mem, .none } },
8420 .{ .src = .{ .to_gpr, .none } },
8421 },
8422 .dst_temps = .{.{ .rc = .general_purpose }},
8423 .each = .{ .once = &.{
8424 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
8425 .{ ._, ._, .xor, .dst0q, .src0q, ._, ._ },
8426 } },
8427 }, .{
8428 .required_features = .{ .mmx, null, null, null },
8429 .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any },
8430 .patterns = &.{
8431 .{ .src = .{ .mem, .none } },
8432 .{ .src = .{ .to_mm, .none } },
8433 },
8434 .dst_temps = .{.{ .rc = .mmx }},
8435 .each = .{ .once = &.{
8436 .{ ._, .p_d, .cmpeq, .dst0q, .dst0q, ._, ._ },
8437 .{ ._, .p_, .xor, .dst0q, .src0q, ._, ._ },
8438 } },
8439 }, .{
8440 .required_features = .{ .mmx, null, null, null },
8441 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },
8442 .patterns = &.{
8443 .{ .src = .{ .to_mut_mm, .none } },
8444 },
8445 .extra_temps = .{
8446 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8447 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
8448 .unused,
8449 .unused,
8450 .unused,
8451 .unused,
8452 .unused,
8453 .unused,
8454 .unused,
8455 },
8456 .dst_temps = .{.{ .ref = .src0 }},
8457 .each = .{ .once = &.{
8458 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
8459 .{ ._, .p_, .xor, .dst0q, .lea(.qword, .tmp0), ._, ._ },
8460 } },
8461 }, .{
8462 .required_features = .{ .avx, null, null, null },
8463 .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any },
8464 .patterns = &.{
8465 .{ .src = .{ .mem, .none } },
8466 .{ .src = .{ .to_xmm, .none } },
8467 },
8468 .dst_temps = .{.{ .rc = .sse }},
8469 .each = .{ .once = &.{
8470 .{ ._, .vp_q, .cmpeq, .dst0x, .dst0x, .dst0x, ._ },
8471 .{ ._, .vp_, .xor, .dst0x, .dst0x, .src0x, ._ },
8472 } },
8473 }, .{
8474 .required_features = .{ .avx, null, null, null },
8475 .src_constraints = .{ .{ .unsigned_int = .xword }, .any },
8476 .patterns = &.{
8477 .{ .src = .{ .to_xmm, .none } },
8478 },
8479 .extra_temps = .{
8480 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8481 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
8482 .unused,
8483 .unused,
8484 .unused,
8485 .unused,
8486 .unused,
8487 .unused,
8488 .unused,
8489 },
8490 .dst_temps = .{.{ .rc = .sse }},
8491 .each = .{ .once = &.{
8492 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
8493 .{ ._, .vp_, .xor, .dst0x, .src0x, .lea(.xword, .tmp0), ._ },
8494 } },
8495 }, .{
8496 .required_features = .{ .sse2, null, null, null },
8497 .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any },
8498 .patterns = &.{
8499 .{ .src = .{ .mem, .none } },
8500 .{ .src = .{ .to_xmm, .none } },
8501 },
8502 .dst_temps = .{.{ .rc = .sse }},
8503 .each = .{ .once = &.{
8504 .{ ._, .p_d, .cmpeq, .dst0x, .dst0x, ._, ._ },
8505 .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ },
8506 } },
8507 }, .{
8508 .required_features = .{ .sse2, null, null, null },
8509 .src_constraints = .{ .{ .unsigned_int = .xword }, .any },
8510 .patterns = &.{
8511 .{ .src = .{ .to_mut_xmm, .none } },
8512 },
8513 .extra_temps = .{
8514 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8515 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
8516 .unused,
8517 .unused,
8518 .unused,
8519 .unused,
8520 .unused,
8521 .unused,
8522 .unused,
8523 },
8524 .dst_temps = .{.{ .ref = .src0 }},
8525 .each = .{ .once = &.{
8526 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
8527 .{ ._, .p_, .xor, .dst0x, .lea(.xword, .tmp0), ._, ._ },
8528 } },
8529 }, .{
8530 .required_features = .{ .sse, null, null, null },
8531 .src_constraints = .{ .{ .int = .xword }, .any },
8532 .patterns = &.{
8533 .{ .src = .{ .to_mut_xmm, .none } },
8534 },
8535 .extra_temps = .{
8536 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8537 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
8538 .unused,
8539 .unused,
8540 .unused,
8541 .unused,
8542 .unused,
8543 .unused,
8544 .unused,
8545 },
8546 .dst_temps = .{.{ .ref = .src0 }},
8547 .each = .{ .once = &.{
8548 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
8549 .{ ._, ._ps, .xor, .dst0x, .lea(.xword, .tmp0), ._, ._ },
8550 } },
8551 }, .{
8552 .required_features = .{ .avx2, null, null, null },
8553 .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any },
8554 .patterns = &.{
8555 .{ .src = .{ .mem, .none } },
8556 .{ .src = .{ .to_ymm, .none } },
8557 },
8558 .dst_temps = .{.{ .rc = .sse }},
8559 .each = .{ .once = &.{
8560 .{ ._, .vp_q, .cmpeq, .dst0y, .dst0y, .dst0y, ._ },
8561 .{ ._, .vp_, .xor, .dst0y, .dst0y, .src0y, ._ },
8562 } },
8563 }, .{
8564 .required_features = .{ .avx2, null, null, null },
8565 .src_constraints = .{ .{ .unsigned_int = .yword }, .any },
8566 .patterns = &.{
8567 .{ .src = .{ .to_ymm, .none } },
8568 },
8569 .extra_temps = .{
8570 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8571 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
8572 .unused,
8573 .unused,
8574 .unused,
8575 .unused,
8576 .unused,
8577 .unused,
8578 .unused,
8579 },
8580 .dst_temps = .{.{ .rc = .sse }},
8581 .each = .{ .once = &.{
8582 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
8583 .{ ._, .vp_, .xor, .dst0y, .src0y, .lea(.yword, .tmp0), ._ },
8584 } },
8585 }, .{
8586 .required_features = .{ .avx, null, null, null },
8587 .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any },
8588 .patterns = &.{
8589 .{ .src = .{ .mem, .none } },
8590 .{ .src = .{ .to_ymm, .none } },
8591 },
8592 .dst_temps = .{.{ .rc = .sse }},
8593 .each = .{ .once = &.{
8594 .{ ._, .v_pd, .cmp, .dst0y, .dst0y, .dst0y, .ui(0b01111) },
8595 .{ ._, .v_pd, .xor, .dst0y, .dst0y, .src0y, ._ },
8596 } },
8597 }, .{
8598 .required_features = .{ .avx, null, null, null },
8599 .src_constraints = .{ .{ .unsigned_int = .yword }, .any },
8600 .patterns = &.{
8601 .{ .src = .{ .to_ymm, .none } },
8602 },
8603 .extra_temps = .{
8604 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8605 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
8606 .unused,
8607 .unused,
8608 .unused,
8609 .unused,
8610 .unused,
8611 .unused,
8612 .unused,
8613 },
8614 .dst_temps = .{.{ .rc = .sse }},
8615 .each = .{ .once = &.{
8616 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
8617 .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.yword, .tmp0), ._ },
8618 } },
8619 }, .{
8620 .required_features = .{ .avx2, null, null, null },
8621 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any },
8622 .patterns = &.{
8623 .{ .src = .{ .to_mem, .none } },
8624 },
8625 .extra_temps = .{
8626 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8627 .{ .kind = .{ .rc = .sse } },
8628 .{ .kind = .{ .rc = .sse } },
8629 .unused,
8630 .unused,
8631 .unused,
8632 .unused,
8633 .unused,
8634 .unused,
8635 },
8636 .dst_temps = .{.mem},
8637 .clobbers = .{ .eflags = true },
8638 .each = .{ .once = &.{
8639 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
8640 .{ ._, .vp_q, .cmpeq, .tmp1y, .tmp1y, .tmp1y, ._ },
8641 .{ .@"0:", .vp_, .xor, .tmp2y, .tmp1y, .memiad(.src0y, .tmp0, .add_size, -16), ._ },
8642 .{ ._, .v_dqu, .mov, .memiad(.dst0y, .tmp0, .add_size, -16), .tmp2y, ._, ._ },
8643 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8644 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8645 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
8646 .{ ._, .v_dqa, .mov, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
8647 } },
8648 }, .{
8649 .required_features = .{ .avx2, null, null, null },
8650 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any },
8651 .patterns = &.{
8652 .{ .src = .{ .to_mem, .none } },
8653 },
8654 .extra_temps = .{
8655 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8656 .{ .kind = .{ .rc = .sse } },
8657 .{ .kind = .{ .rc = .sse } },
8658 .unused,
8659 .unused,
8660 .unused,
8661 .unused,
8662 .unused,
8663 .unused,
8664 },
8665 .dst_temps = .{.mem},
8666 .clobbers = .{ .eflags = true },
8667 .each = .{ .once = &.{
8668 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8669 .{ ._, .vp_q, .cmpeq, .tmp1y, .tmp1y, .tmp1y, ._ },
8670 .{ .@"0:", .vp_, .xor, .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._ },
8671 .{ ._, .v_dqu, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp2y, ._, ._ },
8672 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8673 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8674 } },
8675 }, .{
8676 .required_features = .{ .avx, null, null, null },
8677 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any },
8678 .patterns = &.{
8679 .{ .src = .{ .to_mem, .none } },
8680 },
8681 .extra_temps = .{
8682 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8683 .{ .kind = .{ .rc = .sse } },
8684 .{ .kind = .{ .rc = .sse } },
8685 .unused,
8686 .unused,
8687 .unused,
8688 .unused,
8689 .unused,
8690 .unused,
8691 },
8692 .dst_temps = .{.mem},
8693 .clobbers = .{ .eflags = true },
8694 .each = .{ .once = &.{
8695 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
8696 .{ ._, .v_pd, .cmp, .tmp1y, .tmp1y, .tmp1y, .ui(0b01111) },
8697 .{ .@"0:", .v_pd, .xor, .tmp2y, .tmp1y, .memiad(.src0y, .tmp0, .add_size, -16), ._ },
8698 .{ ._, .v_pd, .movu, .memiad(.dst0y, .tmp0, .add_size, -16), .tmp2y, ._, ._ },
8699 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8700 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8701 .{ .@"0:", .v_pd, .xor, .tmp2x, .tmp1x, .memad(.src0x, .add_size, -16), ._ },
8702 .{ ._, .v_pd, .mova, .memad(.dst0x, .add_size, -16), .tmp2x, ._, ._ },
8703 } },
8704 }, .{
8705 .required_features = .{ .avx, null, null, null },
8706 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any },
8707 .patterns = &.{
8708 .{ .src = .{ .to_mem, .none } },
8709 },
8710 .extra_temps = .{
8711 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8712 .{ .kind = .{ .rc = .sse } },
8713 .{ .kind = .{ .rc = .sse } },
8714 .unused,
8715 .unused,
8716 .unused,
8717 .unused,
8718 .unused,
8719 .unused,
8720 },
8721 .dst_temps = .{.mem},
8722 .clobbers = .{ .eflags = true },
8723 .each = .{ .once = &.{
8724 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8725 .{ ._, .v_pd, .cmp, .tmp1y, .tmp1y, .tmp1y, .ui(0b01111) },
8726 .{ .@"0:", .v_pd, .xor, .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._ },
8727 .{ ._, .v_pd, .movu, .memia(.dst0y, .tmp0, .add_size), .tmp2y, ._, ._ },
8728 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8729 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8730 } },
8731 }, .{
8732 .required_features = .{ .avx, null, null, null },
8733 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
8734 .patterns = &.{
8735 .{ .src = .{ .to_mem, .none } },
8736 },
8737 .extra_temps = .{
8738 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8739 .{ .kind = .{ .rc = .sse } },
8740 .{ .kind = .{ .rc = .sse } },
8741 .unused,
8742 .unused,
8743 .unused,
8744 .unused,
8745 .unused,
8746 .unused,
8747 },
8748 .dst_temps = .{.mem},
8749 .clobbers = .{ .eflags = true },
8750 .each = .{ .once = &.{
8751 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8752 .{ ._, .vp_q, .cmpeq, .tmp1x, .tmp1x, .tmp1x, ._ },
8753 .{ .@"0:", .v_, .xor, .tmp2x, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._ },
8754 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },
8755 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8756 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8757 } },
8758 }, .{
8759 .required_features = .{ .sse2, null, null, null },
8760 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
8761 .patterns = &.{
8762 .{ .src = .{ .to_mem, .none } },
8763 },
8764 .extra_temps = .{
8765 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8766 .{ .kind = .{ .rc = .sse } },
8767 .{ .kind = .{ .rc = .sse } },
8768 .unused,
8769 .unused,
8770 .unused,
8771 .unused,
8772 .unused,
8773 .unused,
8774 },
8775 .dst_temps = .{.mem},
8776 .clobbers = .{ .eflags = true },
8777 .each = .{ .once = &.{
8778 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8779 .{ ._, .p_d, .cmpeq, .tmp1x, .tmp1x, ._, ._ },
8780 .{ .@"0:", ._dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8781 .{ ._, .p_, .xor, .tmp2x, .tmp1x, ._, ._ },
8782 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },
8783 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8784 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8785 } },
8786 }, .{
8787 .required_features = .{ .@"64bit", null, null, null },
8788 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
8789 .patterns = &.{
8790 .{ .src = .{ .mut_mem, .none } },
8791 },
8792 .extra_temps = .{
8793 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8794 .unused,
8795 .unused,
8796 .unused,
8797 .unused,
8798 .unused,
8799 .unused,
8800 .unused,
8801 .unused,
8802 },
8803 .dst_temps = .{.{ .ref = .src0 }},
8804 .clobbers = .{ .eflags = true },
8805 .each = .{ .once = &.{
8806 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8807 .{ .@"0:", ._, .not, .memia(.dst0q, .tmp0, .add_size), ._, ._, ._ },
8808 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, 8), ._, ._, ._ },
8809 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8810 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8811 } },
8812 }, .{
8813 .required_features = .{ .@"64bit", null, null, null },
8814 .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
8815 .patterns = &.{
8816 .{ .src = .{ .to_mem, .none } },
8817 },
8818 .extra_temps = .{
8819 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8820 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
8821 .unused,
8822 .unused,
8823 .unused,
8824 .unused,
8825 .unused,
8826 .unused,
8827 .unused,
8828 },
8829 .dst_temps = .{.mem},
8830 .clobbers = .{ .eflags = true },
8831 .each = .{ .once = &.{
8832 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8833 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
8834 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
8835 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
8836 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
8837 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8838 } },
8839 }, .{
8840 .required_features = .{ .@"64bit", null, null, null },
8841 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .dword } }, .any },
8842 .patterns = &.{
8843 .{ .src = .{ .mut_mem, .none } },
8844 },
8845 .extra_temps = .{
8846 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8847 .unused,
8848 .unused,
8849 .unused,
8850 .unused,
8851 .unused,
8852 .unused,
8853 .unused,
8854 .unused,
8855 },
8856 .dst_temps = .{.{ .ref = .src0 }},
8857 .clobbers = .{ .eflags = true },
8858 .each = .{ .once = &.{
8859 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
8860 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16), ._, ._, ._ },
8861 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16 + 8), ._, ._, ._ },
8862 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8863 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8864 .{ ._, ._, .not, .memad(.dst0d, .add_size, -16), ._, ._, ._ },
8865 } },
8866 }, .{
8867 .required_features = .{ .@"64bit", null, null, null },
8868 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .dword } }, .any },
8869 .patterns = &.{
8870 .{ .src = .{ .to_mem, .none } },
8871 },
8872 .extra_temps = .{
8873 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8874 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
8875 .unused,
8876 .unused,
8877 .unused,
8878 .unused,
8879 .unused,
8880 .unused,
8881 .unused,
8882 },
8883 .dst_temps = .{.mem},
8884 .clobbers = .{ .eflags = true },
8885 .each = .{ .once = &.{
8886 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
8887 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -16), ._, ._ },
8888 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
8889 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -16), .tmp1q, ._, ._ },
8890 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
8891 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8892 .{ ._, ._, .mov, .tmp0d, .memad(.src0d, .add_size, -16), ._, ._ },
8893 .{ ._, ._, .not, .tmp0d, ._, ._, ._ },
8894 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -16), .tmp0d, ._, ._ },
8895 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -16 + 4), .si(0), ._, ._ },
8896 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16 + 8), .si(0), ._, ._ },
8897 } },
8898 }, .{
8899 .required_features = .{ .@"64bit", null, null, null },
8900 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any },
8901 .patterns = &.{
8902 .{ .src = .{ .mut_mem, .none } },
8903 },
8904 .extra_temps = .{
8905 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8906 .unused,
8907 .unused,
8908 .unused,
8909 .unused,
8910 .unused,
8911 .unused,
8912 .unused,
8913 .unused,
8914 },
8915 .dst_temps = .{.{ .ref = .src0 }},
8916 .clobbers = .{ .eflags = true },
8917 .each = .{ .once = &.{
8918 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
8919 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16), ._, ._, ._ },
8920 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16 + 8), ._, ._, ._ },
8921 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8922 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8923 .{ ._, ._, .not, .memad(.dst0q, .add_size, -16), ._, ._, ._ },
8924 } },
8925 }, .{
8926 .required_features = .{ .@"64bit", null, null, null },
8927 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any },
8928 .patterns = &.{
8929 .{ .src = .{ .to_mem, .none } },
8930 },
8931 .extra_temps = .{
8932 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8933 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
8934 .unused,
8935 .unused,
8936 .unused,
8937 .unused,
8938 .unused,
8939 .unused,
8940 .unused,
8941 },
8942 .dst_temps = .{.mem},
8943 .clobbers = .{ .eflags = true },
8944 .each = .{ .once = &.{
8945 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },
8946 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -8), ._, ._ },
8947 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
8948 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -8), .tmp1q, ._, ._ },
8949 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
8950 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8951 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
8952 } },
8953 }, .{
8954 .required_features = .{ .@"64bit", null, null, null },
8955 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any },
8956 .patterns = &.{
8957 .{ .src = .{ .mut_mem, .none } },
8958 },
8959 .extra_temps = .{
8960 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8961 .unused,
8962 .unused,
8963 .unused,
8964 .unused,
8965 .unused,
8966 .unused,
8967 .unused,
8968 .unused,
8969 },
8970 .dst_temps = .{.{ .ref = .src0 }},
8971 .clobbers = .{ .eflags = true },
8972 .each = .{ .once = &.{
8973 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },
8974 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -8), ._, ._, ._ },
8975 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
8976 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8977 .{ ._, ._, .not, .memad(.dst0d, .add_size, -8), ._, ._, ._ },
8978 } },
8979 }, .{
8980 .required_features = .{ .@"64bit", null, null, null },
8981 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any },
8982 .patterns = &.{
8983 .{ .src = .{ .to_mem, .none } },
8984 },
8985 .extra_temps = .{
8986 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8987 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
8988 .unused,
8989 .unused,
8990 .unused,
8991 .unused,
8992 .unused,
8993 .unused,
8994 .unused,
8995 },
8996 .dst_temps = .{.mem},
8997 .clobbers = .{ .eflags = true },
8998 .each = .{ .once = &.{
8999 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },
9000 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -8), ._, ._ },
9001 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
9002 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -8), .tmp1q, ._, ._ },
9003 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
9004 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9005 .{ ._, ._, .mov, .tmp0d, .memad(.src0d, .add_size, -8), ._, ._ },
9006 .{ ._, ._, .not, .tmp0d, ._, ._, ._ },
9007 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -8), .tmp0d, ._, ._ },
9008 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -8 + 4), .si(0), ._, ._ },
9009 } },
9010 }, .{
9011 .required_features = .{ .@"64bit", null, null, null },
9012 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .dword } }, .any },
9013 .patterns = &.{
9014 .{ .src = .{ .mut_mem, .none } },
9015 },
9016 .extra_temps = .{
9017 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9018 .unused,
9019 .unused,
9020 .unused,
9021 .unused,
9022 .unused,
9023 .unused,
9024 .unused,
9025 .unused,
9026 },
9027 .dst_temps = .{.{ .ref = .src0 }},
9028 .clobbers = .{ .eflags = true },
9029 .each = .{ .once = &.{
9030 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
9031 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16), ._, ._, ._ },
9032 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16 + 8), ._, ._, ._ },
9033 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
9034 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9035 .{ ._, ._, .xor, .memad(.dst0d, .add_size, -16), .sa(.src0, .add_umax), ._, ._ },
9036 } },
9037 }, .{
9038 .required_features = .{ .@"64bit", null, null, null },
9039 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .dword } }, .any },
9040 .patterns = &.{
9041 .{ .src = .{ .to_mem, .none } },
9042 },
9043 .extra_temps = .{
9044 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9045 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
9046 .unused,
9047 .unused,
9048 .unused,
9049 .unused,
9050 .unused,
9051 .unused,
9052 .unused,
9053 },
9054 .dst_temps = .{.mem},
9055 .clobbers = .{ .eflags = true },
9056 .each = .{ .once = &.{
9057 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
9058 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -16), ._, ._ },
9059 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
9060 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -16), .tmp1q, ._, ._ },
9061 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
9062 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9063 .{ ._, ._, .mov, .tmp0d, .memad(.src0d, .add_size, -16), ._, ._ },
9064 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_umax), ._, ._ },
9065 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -16), .tmp0d, ._, ._ },
9066 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -16 + 4), .si(0), ._, ._ },
9067 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16 + 8), .si(0), ._, ._ },
9068 } },
9069 }, .{
9070 .required_features = .{ .@"64bit", null, null, null },
9071 .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .dword } }, .any },
9072 .patterns = &.{
9073 .{ .src = .{ .mut_mem, .none } },
9074 },
9075 .extra_temps = .{
9076 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9077 .unused,
9078 .unused,
9079 .unused,
9080 .unused,
9081 .unused,
9082 .unused,
9083 .unused,
9084 .unused,
9085 },
9086 .dst_temps = .{.{ .ref = .src0 }},
9087 .clobbers = .{ .eflags = true },
9088 .each = .{ .once = &.{
9089 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },
9090 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -8), ._, ._, ._ },
9091 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
9092 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9093 .{ ._, ._, .xor, .memad(.dst0d, .add_size, -8), .sa(.src0, .add_umax), ._, ._ },
9094 } },
9095 }, .{
9096 .required_features = .{ .@"64bit", null, null, null },
9097 .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .dword } }, .any },
9098 .patterns = &.{
9099 .{ .src = .{ .to_mem, .none } },
9100 },
9101 .extra_temps = .{
9102 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9103 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
9104 .unused,
9105 .unused,
9106 .unused,
9107 .unused,
9108 .unused,
9109 .unused,
9110 .unused,
9111 },
9112 .dst_temps = .{.mem},
9113 .clobbers = .{ .eflags = true },
9114 .each = .{ .once = &.{
9115 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },
9116 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -8), ._, ._ },
9117 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
9118 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -8), .tmp1q, ._, ._ },
9119 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
9120 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9121 .{ ._, ._, .mov, .tmp0d, .memad(.src0d, .add_size, -8), ._, ._ },
9122 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_umax), ._, ._ },
9123 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -8), .tmp0d, ._, ._ },
9124 .{ ._, ._, .mov, .memad(.dst0d, .add_size, -8 + 4), .si(0), ._, ._ },
9125 } },
9126 }, .{
9127 .required_features = .{ .@"64bit", null, null, null },
9128 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },
9129 .patterns = &.{
9130 .{ .src = .{ .mut_mem, .none } },
9131 },
9132 .extra_temps = .{
9133 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9134 .unused,
9135 .unused,
9136 .unused,
9137 .unused,
9138 .unused,
9139 .unused,
9140 .unused,
9141 .unused,
9142 },
9143 .dst_temps = .{.{ .ref = .src0 }},
9144 .clobbers = .{ .eflags = true },
9145 .each = .{ .once = &.{
9146 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
9147 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16), ._, ._, ._ },
9148 .{ ._, ._, .not, .memiad(.dst0q, .tmp0, .add_size, -16 + 8), ._, ._, ._ },
9149 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
9150 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9151 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
9152 .{ ._, ._, .xor, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ },
9153 } },
9154 }, .{
9155 .required_features = .{ .@"64bit", null, null, null },
9156 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },
9157 .patterns = &.{
9158 .{ .src = .{ .to_mem, .none } },
9159 },
9160 .extra_temps = .{
9161 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9162 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
9163 .unused,
9164 .unused,
9165 .unused,
9166 .unused,
9167 .unused,
9168 .unused,
9169 .unused,
9170 },
9171 .dst_temps = .{.mem},
9172 .clobbers = .{ .eflags = true },
9173 .each = .{ .once = &.{
9174 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
9175 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -16), ._, ._ },
9176 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
9177 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -16), .tmp1q, ._, ._ },
9178 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
9179 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9180 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
9181 .{ ._, ._, .xor, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ },
9182 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ },
9183 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
9184 } },
9185 }, .{
9186 .required_features = .{ .@"64bit", null, null, null },
9187 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },
9188 .patterns = &.{
9189 .{ .src = .{ .mut_mem, .none } },
9190 },
9191 .extra_temps = .{
9192 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9193 .unused,
9194 .unused,
9195 .unused,
9196 .unused,
9197 .unused,
9198 .unused,
9199 .unused,
9200 .unused,
9201 },
9202 .dst_temps = .{.{ .ref = .src0 }},
9203 .clobbers = .{ .eflags = true },
9204 .each = .{ .once = &.{
9205 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },
9206 .{ .@"0:", ._, .not, .memiad(.dst0q, .tmp0, .add_size, -8), ._, ._, ._ },
9207 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
9208 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9209 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
9210 .{ ._, ._, .xor, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ },
9211 } },
9212 }, .{
9213 .required_features = .{ .@"64bit", null, null, null },
9214 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },
9215 .patterns = &.{
9216 .{ .src = .{ .to_mem, .none } },
9217 },
9218 .extra_temps = .{
9219 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9220 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
9221 .unused,
9222 .unused,
9223 .unused,
9224 .unused,
9225 .unused,
9226 .unused,
9227 .unused,
9228 },
9229 .dst_temps = .{.mem},
9230 .clobbers = .{ .eflags = true },
9231 .each = .{ .once = &.{
9232 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_size), ._, ._ },
9233 .{ .@"0:", ._, .mov, .tmp1q, .memiad(.src0q, .tmp0, .add_size, -8), ._, ._ },
9234 .{ ._, ._, .not, .tmp1q, ._, ._, ._ },
9235 .{ ._, ._, .mov, .memiad(.dst0q, .tmp0, .add_size, -8), .tmp1q, ._, ._ },
9236 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
9237 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9238 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
9239 .{ ._, ._, .xor, .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ },
9240 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ },
9241 } },
9242 }, .{
9243 .required_features = .{ .mmx, null, null, null },
9244 .src_constraints = .{ .{ .signed_int_or_full_vec = .qword }, .any },
9245 .patterns = &.{
9246 .{ .src = .{ .mem, .none } },
9247 .{ .src = .{ .to_mm, .none } },
9248 },
9249 .dst_temps = .{.{ .rc = .mmx }},
9250 .each = .{ .once = &.{
9251 .{ ._, .p_d, .cmpeq, .dst0q, .dst0q, ._, ._ },
9252 .{ ._, .p_, .xor, .dst0q, .src0q, ._, ._ },
9253 } },
9254 }, .{
9255 .required_features = .{ .mmx, null, null, null },
9256 .src_constraints = .{ .{ .unsigned_int_vec = .qword }, .any },
9257 .patterns = &.{
9258 .{ .src = .{ .to_mut_mm, .none } },
9259 },
9260 .extra_temps = .{
9261 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9262 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
9263 .unused,
9264 .unused,
9265 .unused,
9266 .unused,
9267 .unused,
9268 .unused,
9269 .unused,
9270 },
9271 .dst_temps = .{.{ .ref = .src0 }},
9272 .each = .{ .once = &.{
9273 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9274 .{ ._, .p_, .xor, .dst0q, .lea(.qword, .tmp0), ._, ._ },
9275 } },
9276 }, .{
9277 .required_features = .{ .avx, null, null, null },
9278 .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any },
9279 .patterns = &.{
9280 .{ .src = .{ .mem, .none } },
9281 .{ .src = .{ .to_xmm, .none } },
9282 },
9283 .dst_temps = .{.{ .rc = .sse }},
9284 .each = .{ .once = &.{
9285 .{ ._, .vp_q, .cmpeq, .dst0x, .dst0x, .dst0x, ._ },
9286 .{ ._, .vp_, .xor, .dst0x, .dst0x, .src0x, ._ },
9287 } },
9288 }, .{
9289 .required_features = .{ .avx, null, null, null },
9290 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any },
9291 .patterns = &.{
9292 .{ .src = .{ .to_xmm, .none } },
9293 },
9294 .extra_temps = .{
9295 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9296 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
9297 .unused,
9298 .unused,
9299 .unused,
9300 .unused,
9301 .unused,
9302 .unused,
9303 .unused,
9304 },
9305 .dst_temps = .{.{ .rc = .sse }},
9306 .each = .{ .once = &.{
9307 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9308 .{ ._, .vp_, .xor, .dst0x, .src0x, .lea(.xword, .tmp0), ._ },
9309 } },
9310 }, .{
9311 .required_features = .{ .sse2, null, null, null },
9312 .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any },
9313 .patterns = &.{
9314 .{ .src = .{ .mem, .none } },
9315 .{ .src = .{ .to_xmm, .none } },
9316 },
9317 .dst_temps = .{.{ .rc = .sse }},
9318 .each = .{ .once = &.{
9319 .{ ._, .p_d, .cmpeq, .dst0x, .dst0x, ._, ._ },
9320 .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ },
9321 } },
9322 }, .{
9323 .required_features = .{ .sse2, null, null, null },
9324 .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any },
9325 .patterns = &.{
9326 .{ .src = .{ .to_mut_xmm, .none } },
9327 },
9328 .extra_temps = .{
9329 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9330 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
9331 .unused,
9332 .unused,
9333 .unused,
9334 .unused,
9335 .unused,
9336 .unused,
9337 .unused,
9338 },
9339 .dst_temps = .{.{ .ref = .src0 }},
9340 .each = .{ .once = &.{
9341 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9342 .{ ._, .p_, .xor, .dst0x, .lea(.xword, .tmp0), ._, ._ },
9343 } },
9344 }, .{
9345 .required_features = .{ .sse, null, null, null },
9346 .src_constraints = .{ .{ .vec = .xword }, .any },
9347 .patterns = &.{
9348 .{ .src = .{ .to_mut_xmm, .none } },
9349 },
9350 .extra_temps = .{
9351 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9352 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
9353 .unused,
9354 .unused,
9355 .unused,
9356 .unused,
9357 .unused,
9358 .unused,
9359 .unused,
9360 },
9361 .dst_temps = .{.{ .ref = .src0 }},
9362 .each = .{ .once = &.{
9363 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9364 .{ ._, ._ps, .xor, .dst0x, .lea(.xword, .tmp0), ._, ._ },
9365 } },
9366 }, .{
9367 .required_features = .{ .avx2, null, null, null },
9368 .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any },
9369 .patterns = &.{
9370 .{ .src = .{ .mem, .none } },
9371 .{ .src = .{ .to_ymm, .none } },
9372 },
9373 .dst_temps = .{.{ .rc = .sse }},
9374 .each = .{ .once = &.{
9375 .{ ._, .vp_q, .cmpeq, .dst0y, .dst0y, .dst0y, ._ },
9376 .{ ._, .vp_, .xor, .dst0y, .dst0y, .src0y, ._ },
9377 } },
9378 }, .{
9379 .required_features = .{ .avx2, null, null, null },
9380 .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any },
9381 .patterns = &.{
9382 .{ .src = .{ .to_ymm, .none } },
9383 },
9384 .extra_temps = .{
9385 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9386 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
9387 .unused,
9388 .unused,
9389 .unused,
9390 .unused,
9391 .unused,
9392 .unused,
9393 .unused,
9394 },
9395 .dst_temps = .{.{ .rc = .sse }},
9396 .each = .{ .once = &.{
9397 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9398 .{ ._, .vp_, .xor, .dst0y, .src0y, .lea(.yword, .tmp0), ._ },
9399 } },
9400 }, .{
9401 .required_features = .{ .avx, null, null, null },
9402 .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any },
9403 .patterns = &.{
9404 .{ .src = .{ .mem, .none } },
9405 .{ .src = .{ .to_ymm, .none } },
9406 },
9407 .dst_temps = .{.{ .rc = .sse }},
9408 .each = .{ .once = &.{
9409 .{ ._, .v_pd, .cmp, .dst0y, .dst0y, .dst0y, .ui(0b01111) },
9410 .{ ._, .v_pd, .xor, .dst0y, .dst0y, .src0y, ._ },
9411 } },
9412 }, .{
9413 .required_features = .{ .avx, null, null, null },
9414 .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any },
9415 .patterns = &.{
9416 .{ .src = .{ .to_ymm, .none } },
9417 },
9418 .extra_temps = .{
9419 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9420 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
9421 .unused,
9422 .unused,
9423 .unused,
9424 .unused,
9425 .unused,
9426 .unused,
9427 .unused,
9428 },
9429 .dst_temps = .{.{ .rc = .sse }},
9430 .each = .{ .once = &.{
9431 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9432 .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.yword, .tmp0), ._ },
9433 } },
9434 }, .{
9435 .required_features = .{ .@"64bit", null, null, null },
9436 .patterns = &.{
9437 .{ .src = .{ .to_mem, .none } },
9438 },
9439 .extra_temps = .{
9440 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9441 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9442 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
9443 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
9444 .unused,
9445 .unused,
9446 .unused,
9447 .unused,
9448 .unused,
9449 },
9450 .dst_temps = .{.mem},
9451 .each = .{ .once = &.{
9452 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_src0_unaligned_size), ._, ._ },
9453 .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },
9454 .{ .@"0:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_src0_unaligned_size), ._, ._ },
9455 .{ ._, ._, .xor, .tmp2q, .leaia(.qword, .tmp1, .tmp0, .add_src0_unaligned_size), ._, ._ },
9456 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_src0_unaligned_size), .tmp2q, ._, ._ },
9457 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
9458 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9459 } },
9460 }, .{
9461 .patterns = &.{
9462 .{ .src = .{ .to_mem, .none } },
9463 },
9464 .extra_temps = .{
9465 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9466 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9467 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
9468 .{ .kind = .{ .umax_mem = .{ .ref = .src0 } } },
9469 .unused,
9470 .unused,
9471 .unused,
9472 .unused,
9473 .unused,
9474 },
9475 .dst_temps = .{.mem},
9476 .each = .{ .once = &.{
9477 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_src0_unaligned_size), ._, ._ },
9478 .{ ._, ._, .lea, .tmp1p, .mem(.tmp3), ._, ._ },
9479 .{ .@"0:", ._, .mov, .tmp2d, .memia(.src0d, .tmp0, .add_src0_unaligned_size), ._, ._ },
9480 .{ ._, ._, .xor, .tmp2d, .leaia(.dword, .tmp1, .tmp0, .add_src0_unaligned_size), ._, ._ },
9481 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_src0_unaligned_size), .tmp2d, ._, ._ },
9482 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
9483 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9484 } },
9485 } }) catch |err| switch (err) {
9486 error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{
9487 @tagName(air_tag),
9488 cg.typeOf(ty_op.operand).fmt(pt),
9489 ops[0].tracking(cg),
9490 }),
9491 else => |e| return e,
9492 };
9493 try res[0].finish(inst, &.{ty_op.operand}, &ops, cg);
9494 },
9495
9496 .block => if (use_old) try cg.airBlock(inst) else {
9497 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
9498 const extra = cg.air.extraData(Air.Block, ty_pl.payload);
9499 try cg.asmPseudo(.pseudo_dbg_enter_block_none);
9500 try cg.lowerBlock(inst, @ptrCast(cg.air.extra[extra.end..][0..extra.data.body_len]));
9501 try cg.asmPseudo(.pseudo_dbg_leave_block_none);
9502 },
9503 .loop => if (use_old) try cg.airLoop(inst) else {
9504 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
9505 const extra = cg.air.extraData(Air.Block, ty_pl.payload);
9506 cg.scope_generation += 1;
9507 try cg.loops.putNoClobber(cg.gpa, inst, .{
9508 .state = try cg.saveState(),
9509 .target = @intCast(cg.mir_instructions.len),
9510 });
9511 defer assert(cg.loops.remove(inst));
9512 try cg.genBodyBlock(@ptrCast(cg.air.extra[extra.end..][0..extra.data.body_len]));
9513 },
9514 .repeat => if (use_old) try cg.airRepeat(inst) else {
9515 const repeat = air_datas[@intFromEnum(inst)].repeat;
9516 const loop = cg.loops.get(repeat.loop_inst).?;
9517 try cg.restoreState(loop.state, &.{}, .{
9518 .emit_instructions = true,
9519 .update_tracking = false,
9520 .resurrect = false,
9521 .close_scope = true,
9522 });
9523 _ = try cg.asmJmpReloc(loop.target);
9524 },
9525 .br => try cg.airBr(inst),
9526 .trap => try cg.asmOpOnly(.{ ._2, .ud }),
9527 .breakpoint => try cg.asmOpOnly(.{ ._3, .int }),
9528 .ret_addr => if (use_old) try cg.airRetAddr(inst) else {
9529 var slot = try cg.tempInit(.usize, .{ .load_frame = .{
9530 .index = .ret_addr,
9531 } });
9532 while (try slot.toRegClass(true, .general_purpose, cg)) {}
9533 try slot.finish(inst, &.{}, &.{}, cg);
9534 },
9535 .frame_addr => if (use_old) try cg.airFrameAddress(inst) else {
9536 const slot = try cg.tempInit(.usize, .{ .lea_frame = .{
9537 .index = .base_ptr,
9538 } });
9539 try slot.finish(inst, &.{}, &.{}, cg);
9540 },
9541 .call => try cg.airCall(inst, .auto, .{ .safety = true }),
9542 .call_always_tail => try cg.airCall(inst, .always_tail, .{ .safety = true }),
9543 .call_never_tail => try cg.airCall(inst, .never_tail, .{ .safety = true }),
9544 .call_never_inline => try cg.airCall(inst, .never_inline, .{ .safety = true }),
9545
9546 .clz => |air_tag| if (use_old) try cg.airClz(inst) else {
9547 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
9548 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
9549 var res: [1]Temp = undefined;
9550 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{
9551 .required_features = .{ .slow_incdec, null, null, null },
9552 .src_constraints = .{ .{ .exact_signed_int = 1 }, .any },
9553 .patterns = &.{
9554 .{ .src = .{ .mut_mem, .none } },
9555 .{ .src = .{ .to_mut_gpr, .none } },
9556 },
9557 .dst_temps = .{.{ .ref = .src0 }},
9558 .clobbers = .{ .eflags = true },
9559 .each = .{ .once = &.{
9560 .{ ._, ._, .add, .dst0b, .si(1), ._, ._ },
9561 } },
9562 }, .{
9563 .src_constraints = .{ .{ .exact_signed_int = 1 }, .any },
9564 .patterns = &.{
9565 .{ .src = .{ .mut_mem, .none } },
9566 .{ .src = .{ .to_mut_gpr, .none } },
9567 },
9568 .dst_temps = .{.{ .ref = .src0 }},
9569 .clobbers = .{ .eflags = true },
9570 .each = .{ .once = &.{
9571 .{ ._, ._c, .in, .dst0b, ._, ._, ._ },
9572 } },
9573 }, .{
9574 .src_constraints = .{ .{ .exact_unsigned_int = 1 }, .any },
9575 .patterns = &.{
9576 .{ .src = .{ .mut_mem, .none } },
9577 .{ .src = .{ .to_mut_gpr, .none } },
9578 },
9579 .dst_temps = .{.{ .ref = .src0 }},
9580 .clobbers = .{ .eflags = true },
9581 .each = .{ .once = &.{
9582 .{ ._, ._, .xor, .dst0b, .si(1), ._, ._ },
9583 } },
9584 }, .{
9585 .required_features = .{ .lzcnt, null, null, null },
9586 .src_constraints = .{ .{ .unsigned_or_exact_int = .byte }, .any },
9587 .patterns = &.{
9588 .{ .src = .{ .mem, .none } },
9589 .{ .src = .{ .to_gpr, .none } },
9590 },
9591 .dst_temps = .{.{ .rc = .general_purpose }},
9592 .clobbers = .{ .eflags = true },
9593 .each = .{ .once = &.{
9594 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
9595 .{ ._, ._, .lzcnt, .dst0d, .dst0d, ._, ._ },
9596 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },
9597 } },
9598 }, .{
9599 .required_features = .{ .lzcnt, null, null, null },
9600 .src_constraints = .{ .{ .signed_int = .byte }, .any },
9601 .patterns = &.{
9602 .{ .src = .{ .mem, .none } },
9603 .{ .src = .{ .to_gpr, .none } },
9604 },
9605 .dst_temps = .{.{ .rc = .general_purpose }},
9606 .clobbers = .{ .eflags = true },
9607 .each = .{ .once = &.{
9608 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
9609 .{ ._, ._, .@"and", .dst0d, .sa(.src0, .add_umax), ._, ._ },
9610 .{ ._, ._, .lzcnt, .dst0d, .dst0d, ._, ._ },
9611 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },
9612 } },
9613 }, .{
9614 .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null },
9615 .src_constraints = .{ .{ .exact_int = 16 }, .any },
9616 .patterns = &.{
9617 .{ .src = .{ .to_mut_gpr, .none } },
9618 },
9619 .dst_temps = .{.{ .ref = .src0 }},
9620 .clobbers = .{ .eflags = true },
9621 .each = .{ .once = &.{
9622 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },
9623 } },
9624 }, .{
9625 .required_features = .{ .lzcnt, null, null, null },
9626 .src_constraints = .{ .{ .exact_int = 16 }, .any },
9627 .patterns = &.{
9628 .{ .src = .{ .mem, .none } },
9629 .{ .src = .{ .to_gpr, .none } },
9630 },
9631 .dst_temps = .{.{ .rc = .general_purpose }},
9632 .clobbers = .{ .eflags = true },
9633 .each = .{ .once = &.{
9634 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },
9635 } },
9636 }, .{
9637 .required_features = .{ .lzcnt, null, null, null },
9638 .src_constraints = .{ .{ .signed_int = .word }, .any },
9639 .patterns = &.{
9640 .{ .src = .{ .to_mut_gpr, .none } },
9641 },
9642 .dst_temps = .{.{ .ref = .src0 }},
9643 .clobbers = .{ .eflags = true },
9644 .each = .{ .once = &.{
9645 .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_umax), ._, ._ },
9646 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },
9647 .{ ._, ._, .sub, .dst0b, .sia(16, .src0, .sub_bit_size), ._, ._ },
9648 } },
9649 }, .{
9650 .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null },
9651 .src_constraints = .{ .{ .unsigned_int = .word }, .any },
9652 .patterns = &.{
9653 .{ .src = .{ .to_mut_gpr, .none } },
9654 },
9655 .dst_temps = .{.{ .ref = .src0 }},
9656 .clobbers = .{ .eflags = true },
9657 .each = .{ .once = &.{
9658 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },
9659 .{ ._, ._, .sub, .dst0b, .sia(16, .src0, .sub_bit_size), ._, ._ },
9660 } },
9661 }, .{
9662 .required_features = .{ .lzcnt, null, null, null },
9663 .src_constraints = .{ .{ .unsigned_int = .word }, .any },
9664 .patterns = &.{
9665 .{ .src = .{ .mem, .none } },
9666 .{ .src = .{ .to_gpr, .none } },
9667 },
9668 .dst_temps = .{.{ .rc = .general_purpose }},
9669 .clobbers = .{ .eflags = true },
9670 .each = .{ .once = &.{
9671 .{ ._, ._, .lzcnt, .dst0w, .src0w, ._, ._ },
9672 .{ ._, ._, .sub, .dst0b, .sia(16, .src0, .sub_bit_size), ._, ._ },
9673 } },
9674 }, .{
9675 .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null },
9676 .src_constraints = .{ .{ .exact_int = 32 }, .any },
9677 .patterns = &.{
9678 .{ .src = .{ .to_mut_gpr, .none } },
9679 },
9680 .dst_temps = .{.{ .ref = .src0 }},
9681 .clobbers = .{ .eflags = true },
9682 .each = .{ .once = &.{
9683 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },
9684 } },
9685 }, .{
9686 .required_features = .{ .lzcnt, null, null, null },
9687 .src_constraints = .{ .{ .exact_int = 32 }, .any },
9688 .patterns = &.{
9689 .{ .src = .{ .mem, .none } },
9690 .{ .src = .{ .to_gpr, .none } },
9691 },
9692 .dst_temps = .{.{ .rc = .general_purpose }},
9693 .clobbers = .{ .eflags = true },
9694 .each = .{ .once = &.{
9695 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },
9696 } },
9697 }, .{
9698 .required_features = .{ .lzcnt, null, null, null },
9699 .src_constraints = .{ .{ .signed_int = .dword }, .any },
9700 .patterns = &.{
9701 .{ .src = .{ .to_mut_gpr, .none } },
9702 },
9703 .dst_temps = .{.{ .ref = .src0 }},
9704 .clobbers = .{ .eflags = true },
9705 .each = .{ .once = &.{
9706 .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_umax), ._, ._ },
9707 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },
9708 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },
9709 } },
9710 }, .{
9711 .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null },
9712 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },
9713 .patterns = &.{
9714 .{ .src = .{ .to_mut_gpr, .none } },
9715 },
9716 .dst_temps = .{.{ .ref = .src0 }},
9717 .clobbers = .{ .eflags = true },
9718 .each = .{ .once = &.{
9719 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },
9720 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },
9721 } },
9722 }, .{
9723 .required_features = .{ .lzcnt, null, null, null },
9724 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },
9725 .patterns = &.{
9726 .{ .src = .{ .mem, .none } },
9727 .{ .src = .{ .to_gpr, .none } },
9728 },
9729 .dst_temps = .{.{ .rc = .general_purpose }},
9730 .clobbers = .{ .eflags = true },
9731 .each = .{ .once = &.{
9732 .{ ._, ._, .lzcnt, .dst0d, .src0d, ._, ._ },
9733 .{ ._, ._, .sub, .dst0b, .sia(32, .src0, .sub_bit_size), ._, ._ },
9734 } },
9735 }, .{
9736 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
9737 .src_constraints = .{ .{ .exact_int = 64 }, .any },
9738 .patterns = &.{
9739 .{ .src = .{ .to_mut_gpr, .none } },
9740 },
9741 .dst_temps = .{.{ .ref = .src0 }},
9742 .clobbers = .{ .eflags = true },
9743 .each = .{ .once = &.{
9744 .{ ._, ._, .lzcnt, .dst0q, .src0q, ._, ._ },
9745 } },
9746 }, .{
9747 .required_features = .{ .@"64bit", .lzcnt, null, null },
9748 .src_constraints = .{ .{ .exact_int = 64 }, .any },
9749 .patterns = &.{
9750 .{ .src = .{ .mem, .none } },
9751 .{ .src = .{ .to_gpr, .none } },
9752 },
9753 .dst_temps = .{.{ .rc = .general_purpose }},
9754 .clobbers = .{ .eflags = true },
9755 .each = .{ .once = &.{
9756 .{ ._, ._, .lzcnt, .dst0q, .src0q, ._, ._ },
9757 } },
9758 }, .{
9759 .required_features = .{ .@"64bit", .lzcnt, null, null },
9760 .src_constraints = .{ .{ .signed_int = .qword }, .any },
9761 .patterns = &.{
9762 .{ .src = .{ .mem, .none } },
9763 .{ .src = .{ .to_gpr, .none } },
9764 },
9765 .dst_temps = .{.{ .rc = .general_purpose }},
9766 .clobbers = .{ .eflags = true },
9767 .each = .{ .once = &.{
9768 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
9769 .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ },
9770 .{ ._, ._, .lzcnt, .dst0q, .dst0q, ._, ._ },
9771 .{ ._, ._, .sub, .dst0b, .sia(64, .src0, .sub_bit_size), ._, ._ },
9772 } },
9773 }, .{
9774 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
9775 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },
9776 .patterns = &.{
9777 .{ .src = .{ .to_mut_gpr, .none } },
9778 },
9779 .dst_temps = .{.{ .ref = .src0 }},
9780 .clobbers = .{ .eflags = true },
9781 .each = .{ .once = &.{
9782 .{ ._, ._, .lzcnt, .dst0q, .src0q, ._, ._ },
9783 .{ ._, ._, .sub, .dst0b, .sia(64, .src0, .sub_bit_size), ._, ._ },
9784 } },
9785 }, .{
9786 .required_features = .{ .@"64bit", .lzcnt, null, null },
9787 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },
9788 .patterns = &.{
9789 .{ .src = .{ .mem, .none } },
9790 .{ .src = .{ .to_gpr, .none } },
9791 },
9792 .dst_temps = .{.{ .rc = .general_purpose }},
9793 .clobbers = .{ .eflags = true },
9794 .each = .{ .once = &.{
9795 .{ ._, ._, .lzcnt, .dst0q, .src0q, ._, ._ },
9796 .{ ._, ._, .sub, .dst0b, .sia(64, .src0, .sub_bit_size), ._, ._ },
9797 } },
9798 }, .{
9799 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
9800 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any },
9801 .patterns = &.{
9802 .{ .src = .{ .mem, .none } },
9803 .{ .src = .{ .to_gpr, .none } },
9804 },
9805 .extra_temps = .{
9806 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
9807 .unused,
9808 .unused,
9809 .unused,
9810 .unused,
9811 .unused,
9812 .unused,
9813 .unused,
9814 .unused,
9815 },
9816 .dst_temps = .{.{ .rc = .general_purpose }},
9817 .clobbers = .{ .eflags = true },
9818 .each = .{ .once = &.{
9819 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
9820 .{ ._, ._r, .bs, .dst0d, .dst0d, ._, ._ },
9821 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
9822 .{ ._, ._z, .cmov, .dst0d, .tmp0d, ._, ._ },
9823 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
9824 } },
9825 }, .{
9826 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
9827 .src_constraints = .{ .{ .signed_po2_int = .byte }, .any },
9828 .patterns = &.{
9829 .{ .src = .{ .mem, .none } },
9830 .{ .src = .{ .to_gpr, .none } },
9831 },
9832 .extra_temps = .{
9833 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
9834 .unused,
9835 .unused,
9836 .unused,
9837 .unused,
9838 .unused,
9839 .unused,
9840 .unused,
9841 .unused,
9842 },
9843 .dst_temps = .{.{ .rc = .general_purpose }},
9844 .clobbers = .{ .eflags = true },
9845 .each = .{ .once = &.{
9846 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
9847 .{ ._, ._, .@"and", .dst0d, .sa(.src0, .add_umax), ._, ._ },
9848 .{ ._, ._r, .bs, .dst0d, .dst0d, ._, ._ },
9849 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
9850 .{ ._, ._z, .cmov, .dst0d, .tmp0d, ._, ._ },
9851 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
9852 } },
9853 }, .{
9854 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
9855 .src_constraints = .{ .{ .signed_int = .byte }, .any },
9856 .patterns = &.{
9857 .{ .src = .{ .mem, .none } },
9858 .{ .src = .{ .to_gpr, .none } },
9859 },
9860 .extra_temps = .{
9861 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
9862 .unused,
9863 .unused,
9864 .unused,
9865 .unused,
9866 .unused,
9867 .unused,
9868 .unused,
9869 .unused,
9870 },
9871 .dst_temps = .{.{ .rc = .general_purpose }},
9872 .clobbers = .{ .eflags = true },
9873 .each = .{ .once = &.{
9874 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },
9875 .{ ._, ._, .@"and", .tmp0d, .sa(.src0, .add_umax), ._, ._ },
9876 .{ ._, ._r, .bs, .tmp0d, .tmp0d, ._, ._ },
9877 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },
9878 .{ ._, ._z, .cmov, .tmp0d, .dst0d, ._, ._ },
9879 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
9880 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
9881 } },
9882 }, .{
9883 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
9884 .src_constraints = .{ .{ .unsigned_int = .byte }, .any },
9885 .patterns = &.{
9886 .{ .src = .{ .mem, .none } },
9887 .{ .src = .{ .to_gpr, .none } },
9888 },
9889 .extra_temps = .{
9890 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
9891 .unused,
9892 .unused,
9893 .unused,
9894 .unused,
9895 .unused,
9896 .unused,
9897 .unused,
9898 .unused,
9899 },
9900 .dst_temps = .{.{ .rc = .general_purpose }},
9901 .clobbers = .{ .eflags = true },
9902 .each = .{ .once = &.{
9903 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },
9904 .{ ._, ._r, .bs, .tmp0d, .tmp0d, ._, ._ },
9905 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },
9906 .{ ._, ._z, .cmov, .tmp0d, .dst0d, ._, ._ },
9907 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
9908 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
9909 } },
9910 }, .{
9911 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
9912 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any },
9913 .patterns = &.{
9914 .{ .src = .{ .mem, .none } },
9915 .{ .src = .{ .to_gpr, .none } },
9916 },
9917 .dst_temps = .{.{ .rc = .general_purpose }},
9918 .clobbers = .{ .eflags = true },
9919 .each = .{ .once = &.{
9920 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
9921 .{ ._, ._r, .bs, .dst0d, .dst0d, ._, ._ },
9922 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
9923 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
9924 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
9925 } },
9926 }, .{
9927 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
9928 .src_constraints = .{ .{ .signed_po2_int = .byte }, .any },
9929 .patterns = &.{
9930 .{ .src = .{ .mem, .none } },
9931 .{ .src = .{ .to_gpr, .none } },
9932 },
9933 .dst_temps = .{.{ .rc = .general_purpose }},
9934 .clobbers = .{ .eflags = true },
9935 .each = .{ .once = &.{
9936 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
9937 .{ ._, ._, .@"and", .dst0d, .sa(.src0, .add_umax), ._, ._ },
9938 .{ ._, ._r, .bs, .dst0d, .dst0d, ._, ._ },
9939 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
9940 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
9941 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
9942 } },
9943 }, .{
9944 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
9945 .src_constraints = .{ .{ .signed_int = .byte }, .any },
9946 .patterns = &.{
9947 .{ .src = .{ .mem, .none } },
9948 .{ .src = .{ .to_gpr, .none } },
9949 },
9950 .extra_temps = .{
9951 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
9952 .unused,
9953 .unused,
9954 .unused,
9955 .unused,
9956 .unused,
9957 .unused,
9958 .unused,
9959 .unused,
9960 },
9961 .dst_temps = .{.{ .rc = .general_purpose }},
9962 .clobbers = .{ .eflags = true },
9963 .each = .{ .once = &.{
9964 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },
9965 .{ ._, ._, .@"and", .tmp0d, .sa(.src0, .add_umax), ._, ._ },
9966 .{ ._, ._r, .bs, .tmp0d, .tmp0d, ._, ._ },
9967 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
9968 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
9969 .{ ._, ._c, .st, ._, ._, ._, ._ },
9970 .{ ._, ._, .sbb, .dst0b, .tmp0b, ._, ._ },
9971 } },
9972 }, .{
9973 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
9974 .src_constraints = .{ .{ .unsigned_int = .byte }, .any },
9975 .patterns = &.{
9976 .{ .src = .{ .mem, .none } },
9977 .{ .src = .{ .to_gpr, .none } },
9978 },
9979 .extra_temps = .{
9980 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
9981 .unused,
9982 .unused,
9983 .unused,
9984 .unused,
9985 .unused,
9986 .unused,
9987 .unused,
9988 .unused,
9989 },
9990 .dst_temps = .{.{ .rc = .general_purpose }},
9991 .clobbers = .{ .eflags = true },
9992 .each = .{ .once = &.{
9993 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },
9994 .{ ._, ._r, .bs, .tmp0d, .tmp0d, ._, ._ },
9995 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
9996 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
9997 .{ ._, ._c, .st, ._, ._, ._, ._ },
9998 .{ ._, ._, .sbb, .dst0b, .tmp0b, ._, ._ },
9999 } },
10000 }, .{
10001 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any },
10002 .patterns = &.{
10003 .{ .src = .{ .mem, .none } },
10004 .{ .src = .{ .to_gpr, .none } },
10005 },
10006 .extra_temps = .{
10007 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10008 .unused,
10009 .unused,
10010 .unused,
10011 .unused,
10012 .unused,
10013 .unused,
10014 .unused,
10015 .unused,
10016 },
10017 .dst_temps = .{.{ .rc = .general_purpose }},
10018 .clobbers = .{ .eflags = true },
10019 .each = .{ .once = &.{
10020 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },
10021 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10022 .{ ._, ._r, .bs, .dst0d, .tmp0d, ._, ._ },
10023 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10024 } },
10025 }, .{
10026 .src_constraints = .{ .{ .signed_po2_int = .byte }, .any },
10027 .patterns = &.{
10028 .{ .src = .{ .mem, .none } },
10029 .{ .src = .{ .to_gpr, .none } },
10030 },
10031 .extra_temps = .{
10032 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10033 .unused,
10034 .unused,
10035 .unused,
10036 .unused,
10037 .unused,
10038 .unused,
10039 .unused,
10040 .unused,
10041 },
10042 .dst_temps = .{.{ .rc = .general_purpose }},
10043 .clobbers = .{ .eflags = true },
10044 .each = .{ .once = &.{
10045 .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ },
10046 .{ ._, ._, .@"and", .tmp0d, .sa(.src0, .add_umax), ._, ._ },
10047 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10048 .{ ._, ._r, .bs, .dst0d, .tmp0d, ._, ._ },
10049 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10050 } },
10051 }, .{
10052 .src_constraints = .{ .{ .signed_int = .byte }, .any },
10053 .patterns = &.{
10054 .{ .src = .{ .mem, .none } },
10055 .{ .src = .{ .to_gpr, .none } },
10056 },
10057 .extra_temps = .{
10058 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10059 .unused,
10060 .unused,
10061 .unused,
10062 .unused,
10063 .unused,
10064 .unused,
10065 .unused,
10066 .unused,
10067 },
10068 .dst_temps = .{.{ .rc = .general_purpose }},
10069 .clobbers = .{ .eflags = true },
10070 .each = .{ .once = &.{
10071 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
10072 .{ ._, ._, .@"and", .dst0d, .sa(.src0, .add_umax), ._, ._ },
10073 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },
10074 .{ ._, ._r, .bs, .tmp0d, .dst0d, ._, ._ },
10075 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10076 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10077 } },
10078 }, .{
10079 .src_constraints = .{ .{ .unsigned_int = .byte }, .any },
10080 .patterns = &.{
10081 .{ .src = .{ .mem, .none } },
10082 .{ .src = .{ .to_gpr, .none } },
10083 },
10084 .extra_temps = .{
10085 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10086 .unused,
10087 .unused,
10088 .unused,
10089 .unused,
10090 .unused,
10091 .unused,
10092 .unused,
10093 .unused,
10094 },
10095 .dst_temps = .{.{ .rc = .general_purpose }},
10096 .clobbers = .{ .eflags = true },
10097 .each = .{ .once = &.{
10098 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
10099 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },
10100 .{ ._, ._r, .bs, .tmp0d, .dst0d, ._, ._ },
10101 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10102 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10103 } },
10104 }, .{
10105 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
10106 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any },
10107 .patterns = &.{
10108 .{ .src = .{ .to_mut_gpr, .none } },
10109 },
10110 .dst_temps = .{.{ .rc = .general_purpose }},
10111 .clobbers = .{ .eflags = true },
10112 .each = .{ .once = &.{
10113 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },
10114 .{ ._, ._, .mov, .dst0w, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10115 .{ ._, ._nz, .cmov, .dst0w, .src0w, ._, ._ },
10116 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10117 } },
10118 }, .{
10119 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
10120 .src_constraints = .{ .{ .signed_int = .word }, .any },
10121 .patterns = &.{
10122 .{ .src = .{ .to_mut_gpr, .none } },
10123 },
10124 .dst_temps = .{.{ .rc = .general_purpose }},
10125 .clobbers = .{ .eflags = true },
10126 .each = .{ .once = &.{
10127 .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_umax), ._, ._ },
10128 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },
10129 .{ ._, ._, .mov, .dst0w, .si(0xff), ._, ._ },
10130 .{ ._, ._z, .cmov, .src0w, .dst0w, ._, ._ },
10131 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10132 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },
10133 } },
10134 }, .{
10135 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
10136 .src_constraints = .{ .{ .unsigned_int = .word }, .any },
10137 .patterns = &.{
10138 .{ .src = .{ .to_mut_gpr, .none } },
10139 },
10140 .dst_temps = .{.{ .rc = .general_purpose }},
10141 .clobbers = .{ .eflags = true },
10142 .each = .{ .once = &.{
10143 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },
10144 .{ ._, ._, .mov, .dst0w, .si(0xff), ._, ._ },
10145 .{ ._, ._z, .cmov, .src0w, .dst0w, ._, ._ },
10146 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10147 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },
10148 } },
10149 }, .{
10150 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
10151 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any },
10152 .patterns = &.{
10153 .{ .src = .{ .to_mut_gpr, .none } },
10154 },
10155 .dst_temps = .{.{ .ref = .src0 }},
10156 .clobbers = .{ .eflags = true },
10157 .each = .{ .once = &.{
10158 .{ ._, ._r, .bs, .dst0w, .src0w, ._, ._ },
10159 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
10160 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10161 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10162 } },
10163 }, .{
10164 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
10165 .src_constraints = .{ .{ .signed_int = .word }, .any },
10166 .patterns = &.{
10167 .{ .src = .{ .to_mut_gpr, .none } },
10168 },
10169 .dst_temps = .{.{ .rc = .general_purpose }},
10170 .clobbers = .{ .eflags = true },
10171 .each = .{ .once = &.{
10172 .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_umax), ._, ._ },
10173 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },
10174 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
10175 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
10176 .{ ._, ._c, .st, ._, ._, ._, ._ },
10177 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },
10178 } },
10179 }, .{
10180 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
10181 .src_constraints = .{ .{ .unsigned_int = .word }, .any },
10182 .patterns = &.{
10183 .{ .src = .{ .to_mut_gpr, .none } },
10184 },
10185 .dst_temps = .{.{ .rc = .general_purpose }},
10186 .clobbers = .{ .eflags = true },
10187 .each = .{ .once = &.{
10188 .{ ._, ._r, .bs, .src0w, .src0w, ._, ._ },
10189 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
10190 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
10191 .{ ._, ._c, .st, ._, ._, ._, ._ },
10192 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },
10193 } },
10194 }, .{
10195 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any },
10196 .patterns = &.{
10197 .{ .src = .{ .mem, .none } },
10198 .{ .src = .{ .to_gpr, .none } },
10199 },
10200 .dst_temps = .{.{ .rc = .general_purpose }},
10201 .clobbers = .{ .eflags = true },
10202 .each = .{ .once = &.{
10203 .{ ._, ._, .mov, .dst0w, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10204 .{ ._, ._r, .bs, .dst0w, .src0w, ._, ._ },
10205 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10206 } },
10207 }, .{
10208 .src_constraints = .{ .{ .signed_int = .word }, .any },
10209 .patterns = &.{
10210 .{ .src = .{ .to_mut_gpr, .none } },
10211 },
10212 .extra_temps = .{
10213 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
10214 .unused,
10215 .unused,
10216 .unused,
10217 .unused,
10218 .unused,
10219 .unused,
10220 .unused,
10221 .unused,
10222 },
10223 .dst_temps = .{.{ .rc = .general_purpose }},
10224 .clobbers = .{ .eflags = true },
10225 .each = .{ .once = &.{
10226 .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_umax), ._, ._ },
10227 .{ ._, ._, .mov, .tmp0w, .si(0xff), ._, ._ },
10228 .{ ._, ._r, .bs, .tmp0w, .src0w, ._, ._ },
10229 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10230 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10231 } },
10232 }, .{
10233 .src_constraints = .{ .{ .unsigned_int = .word }, .any },
10234 .patterns = &.{
10235 .{ .src = .{ .mem, .none } },
10236 .{ .src = .{ .to_gpr, .none } },
10237 },
10238 .extra_temps = .{
10239 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
10240 .unused,
10241 .unused,
10242 .unused,
10243 .unused,
10244 .unused,
10245 .unused,
10246 .unused,
10247 .unused,
10248 },
10249 .dst_temps = .{.{ .rc = .general_purpose }},
10250 .clobbers = .{ .eflags = true },
10251 .each = .{ .once = &.{
10252 .{ ._, ._, .mov, .tmp0w, .si(0xff), ._, ._ },
10253 .{ ._, ._r, .bs, .tmp0w, .src0w, ._, ._ },
10254 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10255 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10256 } },
10257 }, .{
10258 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
10259 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any },
10260 .patterns = &.{
10261 .{ .src = .{ .to_mut_gpr, .none } },
10262 },
10263 .dst_temps = .{.{ .rc = .general_purpose }},
10264 .clobbers = .{ .eflags = true },
10265 .each = .{ .once = &.{
10266 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },
10267 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10268 .{ ._, ._nz, .cmov, .dst0d, .src0d, ._, ._ },
10269 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10270 } },
10271 }, .{
10272 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
10273 .src_constraints = .{ .{ .signed_int = .dword }, .any },
10274 .patterns = &.{
10275 .{ .src = .{ .to_mut_gpr, .none } },
10276 },
10277 .dst_temps = .{.{ .rc = .general_purpose }},
10278 .clobbers = .{ .eflags = true },
10279 .each = .{ .once = &.{
10280 .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_umax), ._, ._ },
10281 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },
10282 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },
10283 .{ ._, ._z, .cmov, .src0d, .dst0d, ._, ._ },
10284 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10285 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },
10286 } },
10287 }, .{
10288 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
10289 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },
10290 .patterns = &.{
10291 .{ .src = .{ .to_mut_gpr, .none } },
10292 },
10293 .dst_temps = .{.{ .rc = .general_purpose }},
10294 .clobbers = .{ .eflags = true },
10295 .each = .{ .once = &.{
10296 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },
10297 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },
10298 .{ ._, ._z, .cmov, .src0d, .dst0d, ._, ._ },
10299 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10300 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },
10301 } },
10302 }, .{
10303 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
10304 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any },
10305 .patterns = &.{
10306 .{ .src = .{ .to_mut_gpr, .none } },
10307 },
10308 .dst_temps = .{.{ .ref = .src0 }},
10309 .clobbers = .{ .eflags = true },
10310 .each = .{ .once = &.{
10311 .{ ._, ._r, .bs, .dst0d, .src0d, ._, ._ },
10312 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
10313 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10314 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10315 } },
10316 }, .{
10317 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
10318 .src_constraints = .{ .{ .signed_int = .dword }, .any },
10319 .patterns = &.{
10320 .{ .src = .{ .to_mut_gpr, .none } },
10321 },
10322 .dst_temps = .{.{ .rc = .general_purpose }},
10323 .clobbers = .{ .eflags = true },
10324 .each = .{ .once = &.{
10325 .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_umax), ._, ._ },
10326 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },
10327 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
10328 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
10329 .{ ._, ._c, .st, ._, ._, ._, ._ },
10330 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },
10331 } },
10332 }, .{
10333 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
10334 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },
10335 .patterns = &.{
10336 .{ .src = .{ .to_mut_gpr, .none } },
10337 },
10338 .dst_temps = .{.{ .rc = .general_purpose }},
10339 .clobbers = .{ .eflags = true },
10340 .each = .{ .once = &.{
10341 .{ ._, ._r, .bs, .src0d, .src0d, ._, ._ },
10342 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
10343 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
10344 .{ ._, ._c, .st, ._, ._, ._, ._ },
10345 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },
10346 } },
10347 }, .{
10348 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any },
10349 .patterns = &.{
10350 .{ .src = .{ .mem, .none } },
10351 .{ .src = .{ .to_gpr, .none } },
10352 },
10353 .dst_temps = .{.{ .rc = .general_purpose }},
10354 .clobbers = .{ .eflags = true },
10355 .each = .{ .once = &.{
10356 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10357 .{ ._, ._r, .bs, .dst0d, .src0d, ._, ._ },
10358 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10359 } },
10360 }, .{
10361 .src_constraints = .{ .{ .signed_int = .dword }, .any },
10362 .patterns = &.{
10363 .{ .src = .{ .to_mut_gpr, .none } },
10364 },
10365 .extra_temps = .{
10366 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10367 .unused,
10368 .unused,
10369 .unused,
10370 .unused,
10371 .unused,
10372 .unused,
10373 .unused,
10374 .unused,
10375 },
10376 .dst_temps = .{.{ .rc = .general_purpose }},
10377 .clobbers = .{ .eflags = true },
10378 .each = .{ .once = &.{
10379 .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_umax), ._, ._ },
10380 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },
10381 .{ ._, ._r, .bs, .tmp0d, .src0d, ._, ._ },
10382 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10383 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10384 } },
10385 }, .{
10386 .src_constraints = .{ .{ .unsigned_int = .dword }, .any },
10387 .patterns = &.{
10388 .{ .src = .{ .mem, .none } },
10389 .{ .src = .{ .to_gpr, .none } },
10390 },
10391 .extra_temps = .{
10392 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10393 .unused,
10394 .unused,
10395 .unused,
10396 .unused,
10397 .unused,
10398 .unused,
10399 .unused,
10400 .unused,
10401 },
10402 .dst_temps = .{.{ .rc = .general_purpose }},
10403 .clobbers = .{ .eflags = true },
10404 .each = .{ .once = &.{
10405 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },
10406 .{ ._, ._r, .bs, .tmp0d, .src0d, ._, ._ },
10407 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10408 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10409 } },
10410 }, .{
10411 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null },
10412 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any },
10413 .patterns = &.{
10414 .{ .src = .{ .to_mut_gpr, .none } },
10415 },
10416 .dst_temps = .{.{ .rc = .general_purpose }},
10417 .clobbers = .{ .eflags = true },
10418 .each = .{ .once = &.{
10419 .{ ._, ._r, .bs, .src0q, .src0q, ._, ._ },
10420 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10421 .{ ._, ._nz, .cmov, .dst0d, .src0d, ._, ._ },
10422 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10423 } },
10424 }, .{
10425 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null },
10426 .src_constraints = .{ .{ .signed_int = .qword }, .any },
10427 .patterns = &.{
10428 .{ .src = .{ .mem, .none } },
10429 .{ .src = .{ .to_gpr, .none } },
10430 },
10431 .extra_temps = .{
10432 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
10433 .unused,
10434 .unused,
10435 .unused,
10436 .unused,
10437 .unused,
10438 .unused,
10439 .unused,
10440 .unused,
10441 },
10442 .dst_temps = .{.{ .rc = .general_purpose }},
10443 .clobbers = .{ .eflags = true },
10444 .each = .{ .once = &.{
10445 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
10446 .{ ._, ._, .@"and", .tmp0q, .src0q, ._, ._ },
10447 .{ ._, ._r, .bs, .tmp0q, .tmp0q, ._, ._ },
10448 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },
10449 .{ ._, ._z, .cmov, .tmp0d, .dst0d, ._, ._ },
10450 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10451 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10452 } },
10453 }, .{
10454 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null },
10455 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },
10456 .patterns = &.{
10457 .{ .src = .{ .to_mut_gpr, .none } },
10458 },
10459 .dst_temps = .{.{ .rc = .general_purpose }},
10460 .clobbers = .{ .eflags = true },
10461 .each = .{ .once = &.{
10462 .{ ._, ._r, .bs, .src0q, .src0q, ._, ._ },
10463 .{ ._, ._, .mov, .dst0d, .si(0xff), ._, ._ },
10464 .{ ._, ._z, .cmov, .src0d, .dst0d, ._, ._ },
10465 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10466 .{ ._, ._, .sub, .dst0b, .src0b, ._, ._ },
10467 } },
10468 }, .{
10469 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },
10470 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any },
10471 .patterns = &.{
10472 .{ .src = .{ .to_mut_gpr, .none } },
10473 },
10474 .dst_temps = .{.{ .ref = .src0 }},
10475 .clobbers = .{ .eflags = true },
10476 .each = .{ .once = &.{
10477 .{ ._, ._r, .bs, .dst0q, .src0q, ._, ._ },
10478 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
10479 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10480 .{ .@"0:", ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10481 } },
10482 }, .{
10483 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },
10484 .src_constraints = .{ .{ .signed_int = .qword }, .any },
10485 .patterns = &.{
10486 .{ .src = .{ .mem, .none } },
10487 .{ .src = .{ .to_gpr, .none } },
10488 },
10489 .extra_temps = .{
10490 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
10491 .unused,
10492 .unused,
10493 .unused,
10494 .unused,
10495 .unused,
10496 .unused,
10497 .unused,
10498 .unused,
10499 },
10500 .dst_temps = .{.{ .rc = .general_purpose }},
10501 .clobbers = .{ .eflags = true },
10502 .each = .{ .once = &.{
10503 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
10504 .{ ._, ._, .@"and", .tmp0q, .src0q, ._, ._ },
10505 .{ ._, ._r, .bs, .tmp0q, .tmp0q, ._, ._ },
10506 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
10507 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
10508 .{ ._, ._c, .st, ._, ._, ._, ._ },
10509 .{ ._, ._, .sbb, .dst0b, .tmp0b, ._, ._ },
10510 } },
10511 }, .{
10512 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },
10513 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },
10514 .patterns = &.{
10515 .{ .src = .{ .to_mut_gpr, .none } },
10516 },
10517 .dst_temps = .{.{ .rc = .general_purpose }},
10518 .clobbers = .{ .eflags = true },
10519 .each = .{ .once = &.{
10520 .{ ._, ._r, .bs, .src0q, .src0q, ._, ._ },
10521 .{ ._, ._, .mov, .dst0b, .sa(.src0, .add_bit_size), ._, ._ },
10522 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
10523 .{ ._, ._c, .st, ._, ._, ._, ._ },
10524 .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ },
10525 } },
10526 }, .{
10527 .required_features = .{ .@"64bit", null, null, null },
10528 .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any },
10529 .patterns = &.{
10530 .{ .src = .{ .mem, .none } },
10531 .{ .src = .{ .to_gpr, .none } },
10532 },
10533 .dst_temps = .{.{ .rc = .general_purpose }},
10534 .clobbers = .{ .eflags = true },
10535 .each = .{ .once = &.{
10536 .{ ._, ._, .mov, .dst0d, .sia(-1, .src0, .add_2_bit_size), ._, ._ },
10537 .{ ._, ._r, .bs, .dst0q, .src0q, ._, ._ },
10538 .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10539 } },
10540 }, .{
10541 .required_features = .{ .@"64bit", null, null, null },
10542 .src_constraints = .{ .{ .signed_int = .qword }, .any },
10543 .patterns = &.{
10544 .{ .src = .{ .mem, .none } },
10545 .{ .src = .{ .to_gpr, .none } },
10546 },
10547 .extra_temps = .{
10548 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
10549 .unused,
10550 .unused,
10551 .unused,
10552 .unused,
10553 .unused,
10554 .unused,
10555 .unused,
10556 .unused,
10557 },
10558 .dst_temps = .{.{ .rc = .general_purpose }},
10559 .clobbers = .{ .eflags = true },
10560 .each = .{ .once = &.{
10561 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
10562 .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ },
10563 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },
10564 .{ ._, ._r, .bs, .tmp0q, .dst0q, ._, ._ },
10565 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10566 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10567 } },
10568 }, .{
10569 .required_features = .{ .@"64bit", null, null, null },
10570 .src_constraints = .{ .{ .unsigned_int = .qword }, .any },
10571 .patterns = &.{
10572 .{ .src = .{ .mem, .none } },
10573 .{ .src = .{ .to_gpr, .none } },
10574 },
10575 .extra_temps = .{
10576 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
10577 .unused,
10578 .unused,
10579 .unused,
10580 .unused,
10581 .unused,
10582 .unused,
10583 .unused,
10584 .unused,
10585 },
10586 .dst_temps = .{.{ .rc = .general_purpose }},
10587 .clobbers = .{ .eflags = true },
10588 .each = .{ .once = &.{
10589 .{ ._, ._, .mov, .tmp0d, .si(0xff), ._, ._ },
10590 .{ ._, ._r, .bs, .tmp0q, .src0q, ._, ._ },
10591 .{ ._, ._, .mov, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ },
10592 .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ },
10593 } },
10594 }, .{
10595 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
10596 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
10597 .patterns = &.{
10598 .{ .src = .{ .to_mem, .none } },
10599 },
10600 .extra_temps = .{
10601 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10602 .unused,
10603 .unused,
10604 .unused,
10605 .unused,
10606 .unused,
10607 .unused,
10608 .unused,
10609 .unused,
10610 },
10611 .dst_temps = .{.{ .rc = .general_purpose }},
10612 .clobbers = .{ .eflags = true },
10613 .each = .{ .once = &.{
10614 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
10615 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
10616 .{ ._, ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10617 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
10618 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10619 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10620 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10621 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
10622 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
10623 } },
10624 }, .{
10625 .required_features = .{ .@"64bit", .lzcnt, null, null },
10626 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
10627 .patterns = &.{
10628 .{ .src = .{ .to_mem, .none } },
10629 },
10630 .extra_temps = .{
10631 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10632 .unused,
10633 .unused,
10634 .unused,
10635 .unused,
10636 .unused,
10637 .unused,
10638 .unused,
10639 .unused,
10640 },
10641 .dst_temps = .{.{ .rc = .general_purpose }},
10642 .clobbers = .{ .eflags = true },
10643 .each = .{ .once = &.{
10644 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
10645 .{ .@"0:", ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10646 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
10647 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10648 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10649 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10650 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
10651 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
10652 } },
10653 }, .{
10654 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },
10655 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
10656 .patterns = &.{
10657 .{ .src = .{ .to_mem, .none } },
10658 },
10659 .extra_temps = .{
10660 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10661 .unused,
10662 .unused,
10663 .unused,
10664 .unused,
10665 .unused,
10666 .unused,
10667 .unused,
10668 .unused,
10669 },
10670 .dst_temps = .{.{ .rc = .general_purpose }},
10671 .clobbers = .{ .eflags = true },
10672 .each = .{ .once = &.{
10673 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
10674 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
10675 .{ ._, ._r, .bs, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10676 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
10677 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10678 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10679 .{ ._, ._, .mov, .dst0d, .si(-1), ._, ._ },
10680 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10681 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
10682 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
10683 } },
10684 }, .{
10685 .required_features = .{ .@"64bit", null, null, null },
10686 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
10687 .patterns = &.{
10688 .{ .src = .{ .to_mem, .none } },
10689 },
10690 .extra_temps = .{
10691 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10692 .unused,
10693 .unused,
10694 .unused,
10695 .unused,
10696 .unused,
10697 .unused,
10698 .unused,
10699 .unused,
10700 },
10701 .dst_temps = .{.{ .rc = .general_purpose }},
10702 .clobbers = .{ .eflags = true },
10703 .each = .{ .once = &.{
10704 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
10705 .{ .@"0:", ._, .mov, .dst0d, .si(-1), ._, ._ },
10706 .{ ._, ._r, .bs, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10707 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
10708 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10709 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10710 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10711 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
10712 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
10713 } },
10714 }, .{
10715 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
10716 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
10717 .patterns = &.{
10718 .{ .src = .{ .to_mem, .none } },
10719 },
10720 .extra_temps = .{
10721 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10722 .unused,
10723 .unused,
10724 .unused,
10725 .unused,
10726 .unused,
10727 .unused,
10728 .unused,
10729 .unused,
10730 },
10731 .dst_temps = .{.{ .rc = .general_purpose }},
10732 .clobbers = .{ .eflags = true },
10733 .each = .{ .once = &.{
10734 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
10735 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
10736 .{ ._, ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10737 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
10738 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10739 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10740 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10741 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
10742 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
10743 } },
10744 }, .{
10745 .required_features = .{ .@"64bit", .lzcnt, null, null },
10746 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
10747 .patterns = &.{
10748 .{ .src = .{ .to_mem, .none } },
10749 },
10750 .extra_temps = .{
10751 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10752 .unused,
10753 .unused,
10754 .unused,
10755 .unused,
10756 .unused,
10757 .unused,
10758 .unused,
10759 .unused,
10760 },
10761 .dst_temps = .{.{ .rc = .general_purpose }},
10762 .clobbers = .{ .eflags = true },
10763 .each = .{ .once = &.{
10764 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
10765 .{ .@"0:", ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10766 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
10767 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10768 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10769 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10770 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
10771 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
10772 } },
10773 }, .{
10774 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },
10775 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
10776 .patterns = &.{
10777 .{ .src = .{ .to_mem, .none } },
10778 },
10779 .extra_temps = .{
10780 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10781 .unused,
10782 .unused,
10783 .unused,
10784 .unused,
10785 .unused,
10786 .unused,
10787 .unused,
10788 .unused,
10789 },
10790 .dst_temps = .{.{ .rc = .general_purpose }},
10791 .clobbers = .{ .eflags = true },
10792 .each = .{ .once = &.{
10793 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
10794 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
10795 .{ ._, ._r, .bs, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10796 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
10797 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10798 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10799 .{ ._, ._, .mov, .dst0d, .si(-1), ._, ._ },
10800 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10801 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
10802 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
10803 } },
10804 }, .{
10805 .required_features = .{ .@"64bit", null, null, null },
10806 .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
10807 .patterns = &.{
10808 .{ .src = .{ .to_mem, .none } },
10809 },
10810 .extra_temps = .{
10811 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10812 .unused,
10813 .unused,
10814 .unused,
10815 .unused,
10816 .unused,
10817 .unused,
10818 .unused,
10819 .unused,
10820 },
10821 .dst_temps = .{.{ .rc = .general_purpose }},
10822 .clobbers = .{ .eflags = true },
10823 .each = .{ .once = &.{
10824 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
10825 .{ .@"0:", ._, .mov, .dst0d, .si(-1), ._, ._ },
10826 .{ ._, ._r, .bs, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10827 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
10828 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10829 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10830 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10831 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
10832 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
10833 } },
10834 }, .{
10835 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
10836 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },
10837 .patterns = &.{
10838 .{ .src = .{ .to_mem, .none } },
10839 },
10840 .extra_temps = .{
10841 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10842 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
10843 .unused,
10844 .unused,
10845 .unused,
10846 .unused,
10847 .unused,
10848 .unused,
10849 .unused,
10850 },
10851 .dst_temps = .{.{ .rc = .general_purpose }},
10852 .clobbers = .{ .eflags = true },
10853 .each = .{ .once = &.{
10854 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
10855 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
10856 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
10857 .{ ._, ._, .@"and", .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
10858 .{ ._, ._, .lzcnt, .dst0q, .tmp1q, ._, ._ },
10859 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
10860 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
10861 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10862 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10863 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10864 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
10865 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
10866 } },
10867 }, .{
10868 .required_features = .{ .@"64bit", .lzcnt, null, null },
10869 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },
10870 .patterns = &.{
10871 .{ .src = .{ .to_mem, .none } },
10872 },
10873 .extra_temps = .{
10874 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10875 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
10876 .unused,
10877 .unused,
10878 .unused,
10879 .unused,
10880 .unused,
10881 .unused,
10882 .unused,
10883 },
10884 .dst_temps = .{.{ .rc = .general_purpose }},
10885 .clobbers = .{ .eflags = true },
10886 .each = .{ .once = &.{
10887 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
10888 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
10889 .{ .@"0:", ._, .@"and", .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
10890 .{ ._, ._, .lzcnt, .dst0q, .tmp1q, ._, ._ },
10891 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
10892 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
10893 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10894 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10895 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10896 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
10897 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
10898 } },
10899 }, .{
10900 .required_features = .{ .@"64bit", null, null, null },
10901 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any },
10902 .patterns = &.{
10903 .{ .src = .{ .to_mem, .none } },
10904 },
10905 .extra_temps = .{
10906 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10907 .unused,
10908 .unused,
10909 .unused,
10910 .unused,
10911 .unused,
10912 .unused,
10913 .unused,
10914 .unused,
10915 },
10916 .dst_temps = .{.{ .rc = .general_purpose }},
10917 .clobbers = .{ .eflags = true },
10918 .each = .{ .once = &.{
10919 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
10920 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
10921 .{ .@"0:", ._, .@"and", .dst0q, .memi(.src0q, .tmp0), ._, ._ },
10922 .{ ._, ._r, .bs, .dst0q, .dst0q, ._, ._ },
10923 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
10924 .{ ._, ._, .mov, .dst0q, .si(-1), ._, ._ },
10925 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10926 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10927 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10928 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
10929 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
10930 } },
10931 }, .{
10932 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
10933 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },
10934 .patterns = &.{
10935 .{ .src = .{ .to_mem, .none } },
10936 },
10937 .extra_temps = .{
10938 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10939 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
10940 .unused,
10941 .unused,
10942 .unused,
10943 .unused,
10944 .unused,
10945 .unused,
10946 .unused,
10947 },
10948 .dst_temps = .{.{ .rc = .general_purpose }},
10949 .clobbers = .{ .eflags = true },
10950 .each = .{ .once = &.{
10951 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
10952 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
10953 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
10954 .{ ._, ._, .@"and", .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
10955 .{ ._, ._, .lzcnt, .dst0q, .tmp1q, ._, ._ },
10956 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
10957 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
10958 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10959 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10960 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10961 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
10962 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
10963 } },
10964 }, .{
10965 .required_features = .{ .@"64bit", .lzcnt, null, null },
10966 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },
10967 .patterns = &.{
10968 .{ .src = .{ .to_mem, .none } },
10969 },
10970 .extra_temps = .{
10971 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
10972 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
10973 .unused,
10974 .unused,
10975 .unused,
10976 .unused,
10977 .unused,
10978 .unused,
10979 .unused,
10980 },
10981 .dst_temps = .{.{ .rc = .general_purpose }},
10982 .clobbers = .{ .eflags = true },
10983 .each = .{ .once = &.{
10984 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
10985 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
10986 .{ .@"0:", ._, .@"and", .tmp1q, .memi(.src0q, .tmp0), ._, ._ },
10987 .{ ._, ._, .lzcnt, .dst0q, .tmp1q, ._, ._ },
10988 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
10989 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
10990 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
10991 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10992 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
10993 .{ .@"0:", ._, .neg, .tmp0d, ._, ._, ._ },
10994 .{ ._, ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .add_src0_bit_size, -64), ._, ._ },
10995 } },
10996 }, .{
10997 .required_features = .{ .@"64bit", null, null, null },
10998 .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any },
10999 .patterns = &.{
11000 .{ .src = .{ .to_mem, .none } },
11001 },
11002 .extra_temps = .{
11003 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11004 .unused,
11005 .unused,
11006 .unused,
11007 .unused,
11008 .unused,
11009 .unused,
11010 .unused,
11011 .unused,
11012 },
11013 .dst_temps = .{.{ .rc = .general_purpose }},
11014 .clobbers = .{ .eflags = true },
11015 .each = .{ .once = &.{
11016 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
11017 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
11018 .{ .@"0:", ._, .@"and", .dst0q, .memi(.src0q, .tmp0), ._, ._ },
11019 .{ ._, ._r, .bs, .dst0q, .dst0q, ._, ._ },
11020 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
11021 .{ ._, ._, .mov, .dst0q, .si(-1), ._, ._ },
11022 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
11023 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11024 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
11025 .{ .@"0:", ._, .lea, .dst0d, .leasiad(.none, .dst0, .@"8", .tmp0, .sub_src0_bit_size, 1), ._, ._ },
11026 .{ ._, ._, .neg, .dst0d, ._, ._, ._ },
11027 } },
11028 }, .{
11029 .required_features = .{ .lzcnt, .slow_incdec, null, null },
11030 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },
11031 .patterns = &.{
11032 .{ .src = .{ .to_mem, .none } },
11033 },
11034 .extra_temps = .{
11035 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11036 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11037 .unused,
11038 .unused,
11039 .unused,
11040 .unused,
11041 .unused,
11042 .unused,
11043 .unused,
11044 },
11045 .dst_temps = .{.mem},
11046 .clobbers = .{ .eflags = true },
11047 .each = .{ .once = &.{
11048 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11049 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
11050 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11051 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },
11052 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },
11053 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11054 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11055 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11056 } },
11057 }, .{
11058 .required_features = .{ .lzcnt, null, null, null },
11059 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },
11060 .patterns = &.{
11061 .{ .src = .{ .to_mem, .none } },
11062 },
11063 .extra_temps = .{
11064 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11065 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11066 .unused,
11067 .unused,
11068 .unused,
11069 .unused,
11070 .unused,
11071 .unused,
11072 .unused,
11073 },
11074 .dst_temps = .{.mem},
11075 .clobbers = .{ .eflags = true },
11076 .each = .{ .once = &.{
11077 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11078 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
11079 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11080 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },
11081 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },
11082 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11083 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11084 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11085 } },
11086 }, .{
11087 .required_features = .{ .lzcnt, .slow_incdec, null, null },
11088 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },
11089 .patterns = &.{
11090 .{ .src = .{ .to_mem, .none } },
11091 },
11092 .extra_temps = .{
11093 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11094 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11095 .unused,
11096 .unused,
11097 .unused,
11098 .unused,
11099 .unused,
11100 .unused,
11101 .unused,
11102 },
11103 .dst_temps = .{.mem},
11104 .clobbers = .{ .eflags = true },
11105 .each = .{ .once = &.{
11106 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11107 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
11108 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11109 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },
11110 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },
11111 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11112 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11113 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11114 } },
11115 }, .{
11116 .required_features = .{ .lzcnt, null, null, null },
11117 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },
11118 .patterns = &.{
11119 .{ .src = .{ .to_mem, .none } },
11120 },
11121 .extra_temps = .{
11122 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11123 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11124 .unused,
11125 .unused,
11126 .unused,
11127 .unused,
11128 .unused,
11129 .unused,
11130 .unused,
11131 },
11132 .dst_temps = .{.mem},
11133 .clobbers = .{ .eflags = true },
11134 .each = .{ .once = &.{
11135 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11136 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
11137 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11138 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },
11139 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },
11140 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11141 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11142 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11143 } },
11144 }, .{
11145 .required_features = .{ .lzcnt, .slow_incdec, null, null },
11146 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },
11147 .patterns = &.{
11148 .{ .src = .{ .to_mem, .none } },
11149 },
11150 .extra_temps = .{
11151 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11152 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11153 .unused,
11154 .unused,
11155 .unused,
11156 .unused,
11157 .unused,
11158 .unused,
11159 .unused,
11160 },
11161 .dst_temps = .{.mem},
11162 .clobbers = .{ .eflags = true },
11163 .each = .{ .once = &.{
11164 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11165 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
11166 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11167 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },
11168 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },
11169 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11170 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11171 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11172 } },
11173 }, .{
11174 .required_features = .{ .lzcnt, null, null, null },
11175 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },
11176 .patterns = &.{
11177 .{ .src = .{ .to_mem, .none } },
11178 },
11179 .extra_temps = .{
11180 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11181 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11182 .unused,
11183 .unused,
11184 .unused,
11185 .unused,
11186 .unused,
11187 .unused,
11188 .unused,
11189 },
11190 .dst_temps = .{.mem},
11191 .clobbers = .{ .eflags = true },
11192 .each = .{ .once = &.{
11193 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11194 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
11195 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11196 .{ ._, ._, .lzcnt, .tmp1d, .tmp1d, ._, ._ },
11197 .{ ._, ._, .sub, .tmp1b, .sia(32, .src0, .sub_bit_size), ._, ._ },
11198 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11199 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11200 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11201 } },
11202 }, .{
11203 .required_features = .{ .@"64bit", .lzcnt, .slow_incdec, null },
11204 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },
11205 .patterns = &.{
11206 .{ .src = .{ .to_mem, .none } },
11207 },
11208 .extra_temps = .{
11209 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11210 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11211 .unused,
11212 .unused,
11213 .unused,
11214 .unused,
11215 .unused,
11216 .unused,
11217 .unused,
11218 },
11219 .dst_temps = .{.mem},
11220 .clobbers = .{ .eflags = true },
11221 .each = .{ .once = &.{
11222 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11223 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
11224 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },
11225 .{ ._, ._, .lzcnt, .tmp1q, .tmp1q, ._, ._ },
11226 .{ ._, ._, .sub, .tmp1b, .sia(64, .src0, .sub_bit_size), ._, ._ },
11227 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11228 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11229 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11230 } },
11231 }, .{
11232 .required_features = .{ .@"64bit", .lzcnt, null, null },
11233 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },
11234 .patterns = &.{
11235 .{ .src = .{ .to_mem, .none } },
11236 },
11237 .extra_temps = .{
11238 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11239 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11240 .unused,
11241 .unused,
11242 .unused,
11243 .unused,
11244 .unused,
11245 .unused,
11246 .unused,
11247 },
11248 .dst_temps = .{.mem},
11249 .clobbers = .{ .eflags = true },
11250 .each = .{ .once = &.{
11251 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11252 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
11253 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },
11254 .{ ._, ._, .lzcnt, .tmp1q, .tmp1q, ._, ._ },
11255 .{ ._, ._, .sub, .tmp1b, .sia(64, .src0, .sub_bit_size), ._, ._ },
11256 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11257 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11258 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11259 } },
11260 }, .{
11261 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null },
11262 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },
11263 .patterns = &.{
11264 .{ .src = .{ .to_mem, .none } },
11265 },
11266 .extra_temps = .{
11267 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11268 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11269 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11270 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
11271 .unused,
11272 .unused,
11273 .unused,
11274 .unused,
11275 .unused,
11276 },
11277 .dst_temps = .{.mem},
11278 .clobbers = .{ .eflags = true },
11279 .each = .{ .once = &.{
11280 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11281 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
11282 .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
11283 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },
11284 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },
11285 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
11286 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11287 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
11288 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
11289 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11290 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11291 } },
11292 }, .{
11293 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
11294 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },
11295 .patterns = &.{
11296 .{ .src = .{ .to_mem, .none } },
11297 },
11298 .extra_temps = .{
11299 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11300 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11301 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11302 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
11303 .unused,
11304 .unused,
11305 .unused,
11306 .unused,
11307 .unused,
11308 },
11309 .dst_temps = .{.mem},
11310 .clobbers = .{ .eflags = true },
11311 .each = .{ .once = &.{
11312 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11313 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
11314 .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
11315 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },
11316 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },
11317 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
11318 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11319 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
11320 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
11321 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11322 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11323 } },
11324 }, .{
11325 .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null },
11326 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },
11327 .patterns = &.{
11328 .{ .src = .{ .to_mem, .none } },
11329 },
11330 .extra_temps = .{
11331 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11332 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11333 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11334 .unused,
11335 .unused,
11336 .unused,
11337 .unused,
11338 .unused,
11339 .unused,
11340 },
11341 .dst_temps = .{.mem},
11342 .clobbers = .{ .eflags = true },
11343 .each = .{ .once = &.{
11344 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11345 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
11346 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11347 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },
11348 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
11349 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
11350 .{ ._, ._c, .st, ._, ._, ._, ._ },
11351 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
11352 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
11353 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11354 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11355 } },
11356 }, .{
11357 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
11358 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },
11359 .patterns = &.{
11360 .{ .src = .{ .to_mem, .none } },
11361 },
11362 .extra_temps = .{
11363 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11364 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11365 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11366 .unused,
11367 .unused,
11368 .unused,
11369 .unused,
11370 .unused,
11371 .unused,
11372 },
11373 .dst_temps = .{.mem},
11374 .clobbers = .{ .eflags = true },
11375 .each = .{ .once = &.{
11376 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11377 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
11378 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11379 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },
11380 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
11381 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
11382 .{ ._, ._c, .st, ._, ._, ._, ._ },
11383 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
11384 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
11385 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11386 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11387 } },
11388 }, .{
11389 .required_features = .{ .slow_incdec, null, null, null },
11390 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },
11391 .patterns = &.{
11392 .{ .src = .{ .to_mem, .none } },
11393 },
11394 .extra_temps = .{
11395 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11396 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11397 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11398 .unused,
11399 .unused,
11400 .unused,
11401 .unused,
11402 .unused,
11403 .unused,
11404 },
11405 .dst_temps = .{.mem},
11406 .clobbers = .{ .eflags = true },
11407 .each = .{ .once = &.{
11408 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11409 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
11410 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11411 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },
11412 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },
11413 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11414 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
11415 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11416 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11417 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11418 } },
11419 }, .{
11420 .src_constraints = .{ .{ .scalar_int_is = .byte }, .any },
11421 .patterns = &.{
11422 .{ .src = .{ .to_mem, .none } },
11423 },
11424 .extra_temps = .{
11425 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11426 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11427 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11428 .unused,
11429 .unused,
11430 .unused,
11431 .unused,
11432 .unused,
11433 .unused,
11434 },
11435 .dst_temps = .{.mem},
11436 .clobbers = .{ .eflags = true },
11437 .each = .{ .once = &.{
11438 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11439 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
11440 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11441 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },
11442 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },
11443 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11444 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
11445 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11446 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11447 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11448 } },
11449 }, .{
11450 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null },
11451 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },
11452 .patterns = &.{
11453 .{ .src = .{ .to_mem, .none } },
11454 },
11455 .extra_temps = .{
11456 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11457 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11458 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11459 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
11460 .unused,
11461 .unused,
11462 .unused,
11463 .unused,
11464 .unused,
11465 },
11466 .dst_temps = .{.mem},
11467 .clobbers = .{ .eflags = true },
11468 .each = .{ .once = &.{
11469 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11470 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
11471 .{ .@"0:", ._, .movzx, .tmp2d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
11472 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },
11473 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },
11474 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
11475 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11476 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
11477 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
11478 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11479 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11480 } },
11481 }, .{
11482 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
11483 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },
11484 .patterns = &.{
11485 .{ .src = .{ .to_mem, .none } },
11486 },
11487 .extra_temps = .{
11488 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11489 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11490 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11491 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
11492 .unused,
11493 .unused,
11494 .unused,
11495 .unused,
11496 .unused,
11497 },
11498 .dst_temps = .{.mem},
11499 .clobbers = .{ .eflags = true },
11500 .each = .{ .once = &.{
11501 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11502 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
11503 .{ .@"0:", ._, .movzx, .tmp2d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
11504 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },
11505 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },
11506 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
11507 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11508 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
11509 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
11510 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11511 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11512 } },
11513 }, .{
11514 .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null },
11515 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },
11516 .patterns = &.{
11517 .{ .src = .{ .to_mem, .none } },
11518 },
11519 .extra_temps = .{
11520 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11521 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11522 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11523 .unused,
11524 .unused,
11525 .unused,
11526 .unused,
11527 .unused,
11528 .unused,
11529 },
11530 .dst_temps = .{.mem},
11531 .clobbers = .{ .eflags = true },
11532 .each = .{ .once = &.{
11533 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11534 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
11535 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11536 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },
11537 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
11538 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
11539 .{ ._, ._c, .st, ._, ._, ._, ._ },
11540 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
11541 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
11542 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11543 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11544 } },
11545 }, .{
11546 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
11547 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },
11548 .patterns = &.{
11549 .{ .src = .{ .to_mem, .none } },
11550 },
11551 .extra_temps = .{
11552 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11553 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11554 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11555 .unused,
11556 .unused,
11557 .unused,
11558 .unused,
11559 .unused,
11560 .unused,
11561 },
11562 .dst_temps = .{.mem},
11563 .clobbers = .{ .eflags = true },
11564 .each = .{ .once = &.{
11565 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11566 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
11567 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11568 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },
11569 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
11570 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
11571 .{ ._, ._c, .st, ._, ._, ._, ._ },
11572 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
11573 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
11574 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11575 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11576 } },
11577 }, .{
11578 .required_features = .{ .slow_incdec, null, null, null },
11579 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },
11580 .patterns = &.{
11581 .{ .src = .{ .to_mem, .none } },
11582 },
11583 .extra_temps = .{
11584 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11585 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11586 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11587 .unused,
11588 .unused,
11589 .unused,
11590 .unused,
11591 .unused,
11592 .unused,
11593 },
11594 .dst_temps = .{.mem},
11595 .clobbers = .{ .eflags = true },
11596 .each = .{ .once = &.{
11597 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11598 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
11599 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11600 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },
11601 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },
11602 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11603 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
11604 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11605 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11606 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11607 } },
11608 }, .{
11609 .src_constraints = .{ .{ .scalar_int_is = .word }, .any },
11610 .patterns = &.{
11611 .{ .src = .{ .to_mem, .none } },
11612 },
11613 .extra_temps = .{
11614 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11615 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11616 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11617 .unused,
11618 .unused,
11619 .unused,
11620 .unused,
11621 .unused,
11622 .unused,
11623 },
11624 .dst_temps = .{.mem},
11625 .clobbers = .{ .eflags = true },
11626 .each = .{ .once = &.{
11627 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11628 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
11629 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11630 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },
11631 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },
11632 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11633 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
11634 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11635 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11636 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11637 } },
11638 }, .{
11639 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null },
11640 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },
11641 .patterns = &.{
11642 .{ .src = .{ .to_mem, .none } },
11643 },
11644 .extra_temps = .{
11645 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11646 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11647 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11648 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
11649 .unused,
11650 .unused,
11651 .unused,
11652 .unused,
11653 .unused,
11654 },
11655 .dst_temps = .{.mem},
11656 .clobbers = .{ .eflags = true },
11657 .each = .{ .once = &.{
11658 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11659 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
11660 .{ .@"0:", ._, .mov, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
11661 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },
11662 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },
11663 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
11664 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11665 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
11666 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
11667 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11668 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11669 } },
11670 }, .{
11671 .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null },
11672 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },
11673 .patterns = &.{
11674 .{ .src = .{ .to_mem, .none } },
11675 },
11676 .extra_temps = .{
11677 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11678 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11679 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11680 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
11681 .unused,
11682 .unused,
11683 .unused,
11684 .unused,
11685 .unused,
11686 },
11687 .dst_temps = .{.mem},
11688 .clobbers = .{ .eflags = true },
11689 .each = .{ .once = &.{
11690 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11691 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
11692 .{ .@"0:", ._, .mov, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
11693 .{ ._, ._, .@"and", .tmp2d, .sa(.src0, .add_umax), ._, ._ },
11694 .{ ._, ._r, .bs, .tmp2d, .tmp2d, ._, ._ },
11695 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
11696 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11697 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
11698 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
11699 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11700 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11701 } },
11702 }, .{
11703 .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null },
11704 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },
11705 .patterns = &.{
11706 .{ .src = .{ .to_mem, .none } },
11707 },
11708 .extra_temps = .{
11709 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11710 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11711 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11712 .unused,
11713 .unused,
11714 .unused,
11715 .unused,
11716 .unused,
11717 .unused,
11718 },
11719 .dst_temps = .{.mem},
11720 .clobbers = .{ .eflags = true },
11721 .each = .{ .once = &.{
11722 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11723 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
11724 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11725 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },
11726 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
11727 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
11728 .{ ._, ._c, .st, ._, ._, ._, ._ },
11729 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
11730 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
11731 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11732 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11733 } },
11734 }, .{
11735 .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null },
11736 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },
11737 .patterns = &.{
11738 .{ .src = .{ .to_mem, .none } },
11739 },
11740 .extra_temps = .{
11741 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11742 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11743 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11744 .unused,
11745 .unused,
11746 .unused,
11747 .unused,
11748 .unused,
11749 .unused,
11750 },
11751 .dst_temps = .{.mem},
11752 .clobbers = .{ .eflags = true },
11753 .each = .{ .once = &.{
11754 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11755 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
11756 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11757 .{ ._, ._r, .bs, .tmp1d, .tmp1d, ._, ._ },
11758 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
11759 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
11760 .{ ._, ._c, .st, ._, ._, ._, ._ },
11761 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
11762 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
11763 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11764 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11765 } },
11766 }, .{
11767 .required_features = .{ .slow_incdec, null, null, null },
11768 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },
11769 .patterns = &.{
11770 .{ .src = .{ .to_mem, .none } },
11771 },
11772 .extra_temps = .{
11773 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11774 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11775 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11776 .unused,
11777 .unused,
11778 .unused,
11779 .unused,
11780 .unused,
11781 .unused,
11782 },
11783 .dst_temps = .{.mem},
11784 .clobbers = .{ .eflags = true },
11785 .each = .{ .once = &.{
11786 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11787 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
11788 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11789 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },
11790 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },
11791 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11792 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
11793 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11794 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11795 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11796 } },
11797 }, .{
11798 .src_constraints = .{ .{ .scalar_int_is = .dword }, .any },
11799 .patterns = &.{
11800 .{ .src = .{ .to_mem, .none } },
11801 },
11802 .extra_temps = .{
11803 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11804 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11805 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11806 .unused,
11807 .unused,
11808 .unused,
11809 .unused,
11810 .unused,
11811 .unused,
11812 },
11813 .dst_temps = .{.mem},
11814 .clobbers = .{ .eflags = true },
11815 .each = .{ .once = &.{
11816 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11817 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
11818 .{ ._, ._, .@"and", .tmp1d, .sa(.src0, .add_umax), ._, ._ },
11819 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },
11820 .{ ._, ._r, .bs, .tmp2d, .tmp1d, ._, ._ },
11821 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11822 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
11823 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11824 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11825 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11826 } },
11827 }, .{
11828 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec },
11829 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },
11830 .patterns = &.{
11831 .{ .src = .{ .to_mem, .none } },
11832 },
11833 .extra_temps = .{
11834 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11835 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11836 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11837 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
11838 .unused,
11839 .unused,
11840 .unused,
11841 .unused,
11842 .unused,
11843 },
11844 .dst_temps = .{.mem},
11845 .clobbers = .{ .eflags = true },
11846 .each = .{ .once = &.{
11847 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11848 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
11849 .{ .@"0:", ._, .mov, .tmp2q, .ua(.src0, .add_umax), ._, ._ },
11850 .{ ._, ._, .@"and", .tmp2q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },
11851 .{ ._, ._r, .bs, .tmp2q, .tmp2q, ._, ._ },
11852 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
11853 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11854 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
11855 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
11856 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11857 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11858 } },
11859 }, .{
11860 .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null },
11861 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },
11862 .patterns = &.{
11863 .{ .src = .{ .to_mem, .none } },
11864 },
11865 .extra_temps = .{
11866 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11867 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11868 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11869 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
11870 .unused,
11871 .unused,
11872 .unused,
11873 .unused,
11874 .unused,
11875 },
11876 .dst_temps = .{.mem},
11877 .clobbers = .{ .eflags = true },
11878 .each = .{ .once = &.{
11879 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11880 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
11881 .{ .@"0:", ._, .mov, .tmp2q, .ua(.src0, .add_umax), ._, ._ },
11882 .{ ._, ._, .@"and", .tmp2q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },
11883 .{ ._, ._r, .bs, .tmp2q, .tmp2q, ._, ._ },
11884 .{ ._, ._z, .cmov, .tmp2d, .tmp1d, ._, ._ },
11885 .{ ._, ._, .mov, .tmp3b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11886 .{ ._, ._, .sub, .tmp3b, .tmp2b, ._, ._ },
11887 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
11888 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11889 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11890 } },
11891 }, .{
11892 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, .slow_incdec, null },
11893 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },
11894 .patterns = &.{
11895 .{ .src = .{ .to_mem, .none } },
11896 },
11897 .extra_temps = .{
11898 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11899 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11900 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11901 .unused,
11902 .unused,
11903 .unused,
11904 .unused,
11905 .unused,
11906 .unused,
11907 },
11908 .dst_temps = .{.mem},
11909 .clobbers = .{ .eflags = true },
11910 .each = .{ .once = &.{
11911 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11912 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
11913 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },
11914 .{ ._, ._r, .bs, .tmp1q, .tmp1q, ._, ._ },
11915 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
11916 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
11917 .{ ._, ._c, .st, ._, ._, ._, ._ },
11918 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
11919 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
11920 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11921 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11922 } },
11923 }, .{
11924 .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null },
11925 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },
11926 .patterns = &.{
11927 .{ .src = .{ .to_mem, .none } },
11928 },
11929 .extra_temps = .{
11930 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11931 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11932 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11933 .unused,
11934 .unused,
11935 .unused,
11936 .unused,
11937 .unused,
11938 .unused,
11939 },
11940 .dst_temps = .{.mem},
11941 .clobbers = .{ .eflags = true },
11942 .each = .{ .once = &.{
11943 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11944 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
11945 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },
11946 .{ ._, ._r, .bs, .tmp1q, .tmp1q, ._, ._ },
11947 .{ ._, ._, .mov, .tmp2b, .sa(.src0, .add_bit_size), ._, ._ },
11948 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
11949 .{ ._, ._c, .st, ._, ._, ._, ._ },
11950 .{ ._, ._, .sbb, .tmp2b, .tmp1b, ._, ._ },
11951 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp2b, ._, ._ },
11952 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
11953 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
11954 } },
11955 }, .{
11956 .required_features = .{ .@"64bit", .slow_incdec, null, null },
11957 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },
11958 .patterns = &.{
11959 .{ .src = .{ .to_mem, .none } },
11960 },
11961 .extra_temps = .{
11962 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11963 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11964 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
11965 .unused,
11966 .unused,
11967 .unused,
11968 .unused,
11969 .unused,
11970 .unused,
11971 },
11972 .dst_temps = .{.mem},
11973 .clobbers = .{ .eflags = true },
11974 .each = .{ .once = &.{
11975 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
11976 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
11977 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },
11978 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },
11979 .{ ._, ._r, .bs, .tmp2q, .tmp1q, ._, ._ },
11980 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
11981 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
11982 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
11983 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
11984 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
11985 } },
11986 }, .{
11987 .required_features = .{ .@"64bit", null, null, null },
11988 .src_constraints = .{ .{ .scalar_int_is = .qword }, .any },
11989 .patterns = &.{
11990 .{ .src = .{ .to_mem, .none } },
11991 },
11992 .extra_temps = .{
11993 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
11994 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11995 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
11996 .unused,
11997 .unused,
11998 .unused,
11999 .unused,
12000 .unused,
12001 .unused,
12002 },
12003 .dst_temps = .{.mem},
12004 .clobbers = .{ .eflags = true },
12005 .each = .{ .once = &.{
12006 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12007 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
12008 .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_8_len), ._, ._ },
12009 .{ ._, ._, .mov, .tmp2d, .si(0xff), ._, ._ },
12010 .{ ._, ._r, .bs, .tmp2q, .tmp1q, ._, ._ },
12011 .{ ._, ._, .mov, .tmp1b, .sia(-1, .src0, .add_bit_size), ._, ._ },
12012 .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ },
12013 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp1b, ._, ._ },
12014 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
12015 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
12016 } },
12017 }, .{
12018 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
12019 .dst_constraints = .{.{ .scalar_int_is = .byte }},
12020 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
12021 .patterns = &.{
12022 .{ .src = .{ .to_mem, .none } },
12023 },
12024 .extra_temps = .{
12025 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12026 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12027 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12028 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12029 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12030 .unused,
12031 .unused,
12032 .unused,
12033 .unused,
12034 },
12035 .dst_temps = .{.mem},
12036 .clobbers = .{ .eflags = true },
12037 .each = .{ .once = &.{
12038 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12039 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12040 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },
12041 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12042 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12043 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
12044 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
12045 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
12046 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12047 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12048 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12049 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12050 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
12051 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
12052 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
12053 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12054 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12055 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12056 } },
12057 }, .{
12058 .required_features = .{ .@"64bit", .lzcnt, null, null },
12059 .dst_constraints = .{.{ .scalar_int_is = .byte }},
12060 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
12061 .patterns = &.{
12062 .{ .src = .{ .to_mem, .none } },
12063 },
12064 .extra_temps = .{
12065 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12066 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12067 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12068 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12069 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12070 .unused,
12071 .unused,
12072 .unused,
12073 .unused,
12074 },
12075 .dst_temps = .{.mem},
12076 .clobbers = .{ .eflags = true },
12077 .each = .{ .once = &.{
12078 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12079 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12080 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },
12081 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12082 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12083 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
12084 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
12085 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12086 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12087 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12088 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12089 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
12090 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
12091 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
12092 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12093 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12094 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12095 } },
12096 }, .{
12097 .required_features = .{ .@"64bit", null, null, null },
12098 .dst_constraints = .{.{ .scalar_int_is = .byte }},
12099 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
12100 .patterns = &.{
12101 .{ .src = .{ .to_mem, .none } },
12102 },
12103 .extra_temps = .{
12104 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12105 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12106 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12107 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12108 .unused,
12109 .unused,
12110 .unused,
12111 .unused,
12112 .unused,
12113 },
12114 .dst_temps = .{.mem},
12115 .clobbers = .{ .eflags = true },
12116 .each = .{ .once = &.{
12117 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12118 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12119 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },
12120 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12121 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12122 .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ },
12123 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
12124 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12125 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12126 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12127 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12128 .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.none, .tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ },
12129 .{ ._, ._, .neg, .tmp3b, ._, ._, ._ },
12130 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
12131 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12132 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12133 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12134 } },
12135 }, .{
12136 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
12137 .dst_constraints = .{.{ .scalar_int_is = .byte }},
12138 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
12139 .patterns = &.{
12140 .{ .src = .{ .to_mem, .none } },
12141 },
12142 .extra_temps = .{
12143 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12144 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12145 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12146 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12147 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12148 .unused,
12149 .unused,
12150 .unused,
12151 .unused,
12152 },
12153 .dst_temps = .{.mem},
12154 .clobbers = .{ .eflags = true },
12155 .each = .{ .once = &.{
12156 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12157 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12158 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },
12159 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12160 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12161 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
12162 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
12163 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
12164 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12165 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12166 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12167 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12168 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
12169 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
12170 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
12171 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12172 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12173 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12174 } },
12175 }, .{
12176 .required_features = .{ .@"64bit", .lzcnt, null, null },
12177 .dst_constraints = .{.{ .scalar_int_is = .byte }},
12178 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
12179 .patterns = &.{
12180 .{ .src = .{ .to_mem, .none } },
12181 },
12182 .extra_temps = .{
12183 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12184 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12185 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12186 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12187 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12188 .unused,
12189 .unused,
12190 .unused,
12191 .unused,
12192 },
12193 .dst_temps = .{.mem},
12194 .clobbers = .{ .eflags = true },
12195 .each = .{ .once = &.{
12196 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12197 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12198 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },
12199 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12200 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12201 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
12202 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
12203 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12204 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12205 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12206 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12207 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
12208 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
12209 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
12210 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12211 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12212 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12213 } },
12214 }, .{
12215 .required_features = .{ .@"64bit", null, null, null },
12216 .dst_constraints = .{.{ .scalar_int_is = .byte }},
12217 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
12218 .patterns = &.{
12219 .{ .src = .{ .to_mem, .none } },
12220 },
12221 .extra_temps = .{
12222 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12223 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12224 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12225 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12226 .unused,
12227 .unused,
12228 .unused,
12229 .unused,
12230 .unused,
12231 },
12232 .dst_temps = .{.mem},
12233 .clobbers = .{ .eflags = true },
12234 .each = .{ .once = &.{
12235 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12236 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12237 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },
12238 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12239 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12240 .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ },
12241 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
12242 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12243 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12244 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12245 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12246 .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.none, .tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ },
12247 .{ ._, ._, .neg, .tmp3b, ._, ._, ._ },
12248 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_len), .tmp3b, ._, ._ },
12249 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12250 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12251 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12252 } },
12253 }, .{
12254 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
12255 .dst_constraints = .{.{ .scalar_int_is = .word }},
12256 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
12257 .patterns = &.{
12258 .{ .src = .{ .to_mem, .none } },
12259 },
12260 .extra_temps = .{
12261 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12262 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12263 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12264 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12265 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12266 .unused,
12267 .unused,
12268 .unused,
12269 .unused,
12270 },
12271 .dst_temps = .{.mem},
12272 .clobbers = .{ .eflags = true },
12273 .each = .{ .once = &.{
12274 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12275 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12276 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },
12277 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12278 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12279 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
12280 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
12281 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
12282 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12283 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12284 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12285 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12286 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
12287 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
12288 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },
12289 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12290 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12291 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12292 } },
12293 }, .{
12294 .required_features = .{ .@"64bit", .lzcnt, null, null },
12295 .dst_constraints = .{.{ .scalar_int_is = .word }},
12296 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
12297 .patterns = &.{
12298 .{ .src = .{ .to_mem, .none } },
12299 },
12300 .extra_temps = .{
12301 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12302 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12303 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12304 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12305 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12306 .unused,
12307 .unused,
12308 .unused,
12309 .unused,
12310 },
12311 .dst_temps = .{.mem},
12312 .clobbers = .{ .eflags = true },
12313 .each = .{ .once = &.{
12314 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12315 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12316 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },
12317 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12318 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12319 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
12320 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
12321 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12322 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12323 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12324 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12325 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
12326 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
12327 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },
12328 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12329 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12330 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12331 } },
12332 }, .{
12333 .required_features = .{ .@"64bit", null, null, null },
12334 .dst_constraints = .{.{ .scalar_int_is = .word }},
12335 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any },
12336 .patterns = &.{
12337 .{ .src = .{ .to_mem, .none } },
12338 },
12339 .extra_temps = .{
12340 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12341 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12342 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12343 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12344 .unused,
12345 .unused,
12346 .unused,
12347 .unused,
12348 .unused,
12349 },
12350 .dst_temps = .{.mem},
12351 .clobbers = .{ .eflags = true },
12352 .each = .{ .once = &.{
12353 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12354 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12355 .{ .@"0:", ._, .mov, .tmp2d, .sia(-16, .none, .add_src0_elem_size), ._, ._ },
12356 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12357 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12358 .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ },
12359 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
12360 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12361 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12362 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12363 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12364 .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.none, .tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ },
12365 .{ ._, ._, .neg, .tmp3d, ._, ._, ._ },
12366 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },
12367 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12368 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12369 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12370 } },
12371 }, .{
12372 .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null },
12373 .dst_constraints = .{.{ .scalar_int_is = .word }},
12374 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
12375 .patterns = &.{
12376 .{ .src = .{ .to_mem, .none } },
12377 },
12378 .extra_temps = .{
12379 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12380 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12381 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12382 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12383 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12384 .unused,
12385 .unused,
12386 .unused,
12387 .unused,
12388 },
12389 .dst_temps = .{.mem},
12390 .clobbers = .{ .eflags = true },
12391 .each = .{ .once = &.{
12392 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12393 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12394 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },
12395 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12396 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12397 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
12398 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
12399 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
12400 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12401 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12402 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12403 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12404 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
12405 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
12406 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },
12407 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12408 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12409 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12410 } },
12411 }, .{
12412 .required_features = .{ .@"64bit", .lzcnt, null, null },
12413 .dst_constraints = .{.{ .scalar_int_is = .word }},
12414 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
12415 .patterns = &.{
12416 .{ .src = .{ .to_mem, .none } },
12417 },
12418 .extra_temps = .{
12419 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12420 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12421 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12422 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12423 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12424 .unused,
12425 .unused,
12426 .unused,
12427 .unused,
12428 },
12429 .dst_temps = .{.mem},
12430 .clobbers = .{ .eflags = true },
12431 .each = .{ .once = &.{
12432 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12433 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12434 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },
12435 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12436 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12437 .{ ._, ._, .lzcnt, .tmp4q, .tmp3q, ._, ._ },
12438 .{ ._, ._nc, .j, .@"1f", ._, ._, ._ },
12439 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12440 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12441 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12442 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12443 .{ .@"1:", ._, .neg, .tmp2d, ._, ._, ._ },
12444 .{ ._, ._, .lea, .tmp3d, .leasiad(.none, .tmp4, .@"8", .tmp2, .add_src0_bit_size, -64), ._, ._ },
12445 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },
12446 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12447 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12448 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12449 } },
12450 }, .{
12451 .required_features = .{ .@"64bit", null, null, null },
12452 .dst_constraints = .{.{ .scalar_int_is = .word }},
12453 .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any },
12454 .patterns = &.{
12455 .{ .src = .{ .to_mem, .none } },
12456 },
12457 .extra_temps = .{
12458 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12459 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12460 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12461 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
12462 .unused,
12463 .unused,
12464 .unused,
12465 .unused,
12466 .unused,
12467 },
12468 .dst_temps = .{.mem},
12469 .clobbers = .{ .eflags = true },
12470 .each = .{ .once = &.{
12471 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
12472 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
12473 .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ },
12474 .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ },
12475 .{ .@"1:", ._, .@"and", .tmp3q, .leai(.qword, .tmp1, .tmp2), ._, ._ },
12476 .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ },
12477 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
12478 .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ },
12479 .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ },
12480 .{ ._, ._nc, .j, .@"1b", ._, ._, ._ },
12481 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
12482 .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.none, .tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ },
12483 .{ ._, ._, .neg, .tmp3d, ._, ._, ._ },
12484 .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ },
12485 .{ ._, ._, .lea, .tmp1q, .leaa(.none, .tmp1, .add_src0_elem_size), ._, ._ },
12486 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
12487 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12488 } },
12489 } }) catch |err| switch (err) {
12490 error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{
12491 @tagName(air_tag),
12492 cg.typeOf(ty_op.operand).fmt(pt),
12493 ops[0].tracking(cg),
12494 }),
12495 else => |e| return e,
12496 };
12497 try res[0].finish(inst, &.{ty_op.operand}, &ops, cg);
12498 },
12499
12500 .cmp_vector, .cmp_vector_optimized => |air_tag| if (use_old) try cg.airCmpVector(inst) else fallback: {
12501 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
12502 const extra = cg.air.extraData(Air.VectorCmp, ty_pl.payload).data;
12503 switch (extra.compareOperator()) {
12504 .eq, .neq => {},
12505 else => break :fallback try cg.airCmpVector(inst),
12506 }
12507 var ops = try cg.tempsFromOperands(inst, .{ extra.lhs, extra.rhs });
12508 var res: [1]Temp = undefined;
12509 switch (extra.compareOperator()) {
12510 .lt => unreachable,
12511 .lte => unreachable,
12512 .eq, .neq => |cmp_op| cg.select(&res, &.{ty_pl.ty.toType()}, &ops, switch (@as(Condition, switch (cmp_op) {
12513 else => unreachable,
12514 .eq => .e,
12515 .neq => .ne,
12516 })) {
12517 else => unreachable,
12518 inline .e, .ne => |cc| comptime &.{ .{
12519 .required_features = .{ .avx2, null, null, null },
12520 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
12521 .patterns = &.{
12522 .{ .src = .{ .to_ymm, .mem } },
12523 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
12524 .{ .src = .{ .to_ymm, .to_ymm } },
12525 },
12526 .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{
12527 .kind = .all,
12528 .inverted = switch (cc) {
12529 else => unreachable,
12530 .e => false,
12531 .ne => true,
12532 },
12533 .scalar = .byte,
12534 } } }},
12535 .each = .{ .once = &.{
12536 .{ ._, .vp_b, .cmpeq, .dst0y, .src0y, .src1y, ._ },
12537 } },
12538 }, .{
12539 .required_features = .{ .avx2, null, null, null },
12540 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
12541 .patterns = &.{
12542 .{ .src = .{ .to_ymm, .mem } },
12543 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
12544 .{ .src = .{ .to_ymm, .to_ymm } },
12545 },
12546 .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{
12547 .kind = .all,
12548 .inverted = switch (cc) {
12549 else => unreachable,
12550 .e => false,
12551 .ne => true,
12552 },
12553 .scalar = .word,
12554 } } }},
12555 .each = .{ .once = &.{
12556 .{ ._, .vp_w, .cmpeq, .dst0y, .src0y, .src1y, ._ },
12557 } },
12558 }, .{
12559 .required_features = .{ .avx2, null, null, null },
12560 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
12561 .patterns = &.{
12562 .{ .src = .{ .to_ymm, .mem } },
12563 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
12564 .{ .src = .{ .to_ymm, .to_ymm } },
12565 },
12566 .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{
12567 .kind = .all,
12568 .inverted = switch (cc) {
12569 else => unreachable,
12570 .e => false,
12571 .ne => true,
12572 },
12573 .scalar = .dword,
12574 } } }},
12575 .each = .{ .once = &.{
12576 .{ ._, .vp_d, .cmpeq, .dst0y, .src0y, .src1y, ._ },
12577 } },
12578 }, .{
12579 .required_features = .{ .avx2, null, null, null },
12580 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
12581 .patterns = &.{
12582 .{ .src = .{ .to_ymm, .mem } },
12583 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
12584 .{ .src = .{ .to_ymm, .to_ymm } },
12585 },
12586 .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{
12587 .kind = .all,
12588 .inverted = switch (cc) {
12589 else => unreachable,
12590 .e => false,
12591 .ne => true,
12592 },
12593 .scalar = .qword,
12594 } } }},
12595 .each = .{ .once = &.{
12596 .{ ._, .vp_q, .cmpeq, .dst0y, .src0y, .src1y, ._ },
12597 } },
12598 }, .{
12599 .required_features = .{ .avx, null, null, null },
12600 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
12601 .patterns = &.{
12602 .{ .src = .{ .to_xmm, .mem } },
12603 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
12604 .{ .src = .{ .to_xmm, .to_xmm } },
12605 },
12606 .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{
12607 .kind = .all,
12608 .inverted = switch (cc) {
12609 else => unreachable,
12610 .e => false,
12611 .ne => true,
12612 },
12613 .scalar = .byte,
12614 } } }},
12615 .each = .{ .once = &.{
12616 .{ ._, .vp_b, .cmpeq, .dst0x, .src0x, .src1x, ._ },
12617 } },
12618 }, .{
12619 .required_features = .{ .avx, null, null, null },
12620 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
12621 .patterns = &.{
12622 .{ .src = .{ .to_xmm, .mem } },
12623 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
12624 .{ .src = .{ .to_xmm, .to_xmm } },
12625 },
12626 .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{
12627 .kind = .all,
12628 .inverted = switch (cc) {
12629 else => unreachable,
12630 .e => false,
12631 .ne => true,
12632 },
12633 .scalar = .word,
12634 } } }},
12635 .each = .{ .once = &.{
12636 .{ ._, .vp_w, .cmpeq, .dst0x, .src0x, .src1x, ._ },
12637 } },
12638 }, .{
12639 .required_features = .{ .avx, null, null, null },
12640 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
12641 .patterns = &.{
12642 .{ .src = .{ .to_xmm, .mem } },
12643 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
12644 .{ .src = .{ .to_xmm, .to_xmm } },
12645 },
12646 .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{
12647 .kind = .all,
12648 .inverted = switch (cc) {
12649 else => unreachable,
12650 .e => false,
12651 .ne => true,
12652 },
12653 .scalar = .dword,
12654 } } }},
12655 .each = .{ .once = &.{
12656 .{ ._, .vp_d, .cmpeq, .dst0x, .src0x, .src1x, ._ },
12657 } },
12658 }, .{
12659 .required_features = .{ .avx, null, null, null },
12660 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
12661 .patterns = &.{
12662 .{ .src = .{ .to_xmm, .mem } },
12663 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
12664 .{ .src = .{ .to_xmm, .to_xmm } },
12665 },
12666 .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{
12667 .kind = .all,
12668 .inverted = switch (cc) {
12669 else => unreachable,
12670 .e => false,
12671 .ne => true,
12672 },
12673 .scalar = .qword,
12674 } } }},
12675 .each = .{ .once = &.{
12676 .{ ._, .vp_q, .cmpeq, .dst0x, .src0x, .src1x, ._ },
12677 } },
12678 }, .{
12679 .required_features = .{ .sse2, null, null, null },
12680 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
12681 .patterns = &.{
12682 .{ .src = .{ .to_mut_xmm, .mem } },
12683 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
12684 .{ .src = .{ .to_mut_xmm, .to_xmm } },
12685 },
12686 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{
12687 .kind = .all,
12688 .inverted = switch (cc) {
12689 else => unreachable,
12690 .e => false,
12691 .ne => true,
12692 },
12693 .scalar = .byte,
12694 } } }},
12695 .each = .{ .once = &.{
12696 .{ ._, .p_b, .cmpeq, .dst0x, .src1x, ._, ._ },
12697 } },
12698 }, .{
12699 .required_features = .{ .sse2, null, null, null },
12700 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
12701 .patterns = &.{
12702 .{ .src = .{ .to_mut_xmm, .mem } },
12703 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
12704 .{ .src = .{ .to_mut_xmm, .to_xmm } },
12705 },
12706 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{
12707 .kind = .all,
12708 .inverted = switch (cc) {
12709 else => unreachable,
12710 .e => false,
12711 .ne => true,
12712 },
12713 .scalar = .word,
12714 } } }},
12715 .each = .{ .once = &.{
12716 .{ ._, .p_w, .cmpeq, .dst0x, .src1x, ._, ._ },
12717 } },
12718 }, .{
12719 .required_features = .{ .sse2, null, null, null },
12720 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
12721 .patterns = &.{
12722 .{ .src = .{ .to_mut_xmm, .mem } },
12723 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
12724 .{ .src = .{ .to_mut_xmm, .to_xmm } },
12725 },
12726 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{
12727 .kind = .all,
12728 .inverted = switch (cc) {
12729 else => unreachable,
12730 .e => false,
12731 .ne => true,
12732 },
12733 .scalar = .dword,
12734 } } }},
12735 .each = .{ .once = &.{
12736 .{ ._, .p_d, .cmpeq, .dst0x, .src1x, ._, ._ },
12737 } },
12738 }, .{
12739 .required_features = .{ .sse4_1, null, null, null },
12740 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
12741 .patterns = &.{
12742 .{ .src = .{ .to_mut_xmm, .mem } },
12743 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
12744 .{ .src = .{ .to_mut_xmm, .to_xmm } },
12745 },
12746 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{
12747 .kind = .all,
12748 .inverted = switch (cc) {
12749 else => unreachable,
12750 .e => false,
12751 .ne => true,
12752 },
12753 .scalar = .qword,
12754 } } }},
12755 .each = .{ .once = &.{
12756 .{ ._, .p_q, .cmpeq, .dst0x, .src1x, ._, ._ },
12757 } },
12758 }, .{
12759 .required_features = .{ .mmx, null, null, null },
12760 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
12761 .patterns = &.{
12762 .{ .src = .{ .to_mut_mm, .mem } },
12763 .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } },
12764 .{ .src = .{ .to_mut_mm, .to_mm } },
12765 },
12766 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{
12767 .kind = .all,
12768 .inverted = switch (cc) {
12769 else => unreachable,
12770 .e => false,
12771 .ne => true,
12772 },
12773 .scalar = .byte,
12774 } } }},
12775 .each = .{ .once = &.{
12776 .{ ._, .p_b, .cmpeq, .dst0q, .src1q, ._, ._ },
12777 } },
12778 }, .{
12779 .required_features = .{ .mmx, null, null, null },
12780 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
12781 .patterns = &.{
12782 .{ .src = .{ .to_mut_mm, .mem } },
12783 .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } },
12784 .{ .src = .{ .to_mut_mm, .to_mm } },
12785 },
12786 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{
12787 .kind = .all,
12788 .inverted = switch (cc) {
12789 else => unreachable,
12790 .e => false,
12791 .ne => true,
12792 },
12793 .scalar = .word,
12794 } } }},
12795 .each = .{ .once = &.{
12796 .{ ._, .p_w, .cmpeq, .dst0q, .src1q, ._, ._ },
12797 } },
12798 }, .{
12799 .required_features = .{ .mmx, null, null, null },
12800 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
12801 .patterns = &.{
12802 .{ .src = .{ .to_mut_mm, .mem } },
12803 .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } },
12804 .{ .src = .{ .to_mut_mm, .to_mm } },
12805 },
12806 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{
12807 .kind = .all,
12808 .inverted = switch (cc) {
12809 else => unreachable,
12810 .e => false,
12811 .ne => true,
12812 },
12813 .scalar = .dword,
12814 } } }},
12815 .each = .{ .once = &.{
12816 .{ ._, .p_d, .cmpeq, .dst0q, .src1q, ._, ._ },
12817 } },
12818 }, .{
12819 .src_constraints = .{ .{ .bool_vec = .byte }, .{ .bool_vec = .byte } },
12820 .patterns = &.{
12821 .{ .src = .{ .mut_mem, .imm8 } },
12822 .{ .src = .{ .imm8, .mut_mem }, .commute = .{ 0, 1 } },
12823 .{ .src = .{ .to_mut_gpr, .imm8 } },
12824 .{ .src = .{ .imm8, .to_mut_gpr }, .commute = .{ 0, 1 } },
12825 .{ .src = .{ .mut_mem, .to_gpr } },
12826 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
12827 .{ .src = .{ .to_mut_gpr, .mem } },
12828 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
12829 .{ .src = .{ .to_mut_gpr, .to_gpr } },
12830 },
12831 .dst_temps = .{.{ .ref = .src0 }},
12832 .clobbers = .{ .eflags = true },
12833 .each = .{ .once = switch (cc) {
12834 else => unreachable,
12835 .e => &.{
12836 .{ ._, ._, .xor, .dst0b, .src1b, ._, ._ },
12837 .{ ._, ._, .not, .dst0b, ._, ._, ._ },
12838 },
12839 .ne => &.{
12840 .{ ._, ._, .xor, .dst0b, .src1b, ._, ._ },
12841 },
12842 } },
12843 }, .{
12844 .src_constraints = .{ .{ .bool_vec = .word }, .{ .bool_vec = .word } },
12845 .patterns = &.{
12846 .{ .src = .{ .mut_mem, .imm16 } },
12847 .{ .src = .{ .imm16, .mut_mem }, .commute = .{ 0, 1 } },
12848 .{ .src = .{ .to_mut_gpr, .imm16 } },
12849 .{ .src = .{ .imm16, .to_mut_gpr }, .commute = .{ 0, 1 } },
12850 .{ .src = .{ .mut_mem, .to_gpr } },
12851 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
12852 .{ .src = .{ .to_mut_gpr, .mem } },
12853 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
12854 .{ .src = .{ .to_mut_gpr, .to_gpr } },
12855 },
12856 .dst_temps = .{.{ .ref = .src0 }},
12857 .clobbers = .{ .eflags = true },
12858 .each = .{ .once = switch (cc) {
12859 else => unreachable,
12860 .e => &.{
12861 .{ ._, ._, .xor, .dst0w, .src1w, ._, ._ },
12862 .{ ._, ._, .not, .dst0w, ._, ._, ._ },
12863 },
12864 .ne => &.{
12865 .{ ._, ._, .xor, .dst0w, .src1w, ._, ._ },
12866 },
12867 } },
12868 }, .{
12869 .src_constraints = .{ .{ .bool_vec = .dword }, .{ .bool_vec = .dword } },
12870 .patterns = &.{
12871 .{ .src = .{ .mut_mem, .imm32 } },
12872 .{ .src = .{ .imm32, .mut_mem }, .commute = .{ 0, 1 } },
12873 .{ .src = .{ .to_mut_gpr, .imm32 } },
12874 .{ .src = .{ .imm32, .to_mut_gpr }, .commute = .{ 0, 1 } },
12875 .{ .src = .{ .mut_mem, .to_gpr } },
12876 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
12877 .{ .src = .{ .to_mut_gpr, .mem } },
12878 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
12879 .{ .src = .{ .to_mut_gpr, .to_gpr } },
12880 },
12881 .dst_temps = .{.{ .ref = .src0 }},
12882 .clobbers = .{ .eflags = true },
12883 .each = .{ .once = switch (cc) {
12884 else => unreachable,
12885 .e => &.{
12886 .{ ._, ._, .xor, .dst0d, .src1d, ._, ._ },
12887 .{ ._, ._, .not, .dst0d, ._, ._, ._ },
12888 },
12889 .ne => &.{
12890 .{ ._, ._, .xor, .dst0d, .src1d, ._, ._ },
12891 },
12892 } },
12893 }, .{
12894 .required_features = .{ .@"64bit", null, null, null },
12895 .src_constraints = .{ .{ .bool_vec = .qword }, .{ .bool_vec = .qword } },
12896 .patterns = &.{
12897 .{ .src = .{ .mut_mem, .simm32 } },
12898 .{ .src = .{ .simm32, .mut_mem }, .commute = .{ 0, 1 } },
12899 .{ .src = .{ .to_mut_gpr, .simm32 } },
12900 .{ .src = .{ .simm32, .to_mut_gpr }, .commute = .{ 0, 1 } },
12901 .{ .src = .{ .mut_mem, .to_gpr } },
12902 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
12903 .{ .src = .{ .to_mut_gpr, .mem } },
12904 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
12905 .{ .src = .{ .to_mut_gpr, .to_gpr } },
12906 },
12907 .dst_temps = .{.{ .ref = .src0 }},
12908 .clobbers = .{ .eflags = true },
12909 .each = .{ .once = switch (cc) {
12910 else => unreachable,
12911 .e => &.{
12912 .{ ._, ._, .xor, .dst0q, .src1q, ._, ._ },
12913 .{ ._, ._, .not, .dst0q, ._, ._, ._ },
12914 },
12915 .ne => &.{
12916 .{ ._, ._, .xor, .dst0q, .src1q, ._, ._ },
12917 },
12918 } },
12919 }, .{
12920 .src_constraints = .{ .any_bool_vec, .any_bool_vec },
12921 .patterns = &.{
12922 .{ .src = .{ .to_mem, .to_mem } },
12923 },
12924 .extra_temps = .{
12925 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12926 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
12927 .unused,
12928 .unused,
12929 .unused,
12930 .unused,
12931 .unused,
12932 .unused,
12933 .unused,
12934 },
12935 .dst_temps = .{.mem},
12936 .clobbers = .{ .eflags = true },
12937 .each = .{ .once = switch (cc) {
12938 else => unreachable,
12939 .e => &.{
12940 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
12941 .{ .@"0:", ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
12942 .{ ._, ._, .xor, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
12943 .{ ._, ._, .not, .tmp1p, ._, ._, ._ },
12944 .{ ._, ._, .mov, .memia(.dst0p, .tmp0, .add_size), .tmp1p, ._, ._ },
12945 .{ ._, ._, .add, .tmp0p, .sa(.tmp1, .add_size), ._, ._ },
12946 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12947 },
12948 .ne => &.{
12949 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
12950 .{ .@"0:", ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
12951 .{ ._, ._, .xor, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
12952 .{ ._, ._, .mov, .memia(.dst0p, .tmp0, .add_size), .tmp1p, ._, ._ },
12953 .{ ._, ._, .add, .tmp0p, .sa(.tmp1, .add_size), ._, ._ },
12954 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12955 },
12956 } },
12957 }, .{
12958 .required_features = .{ .avx2, null, null, null },
12959 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
12960 .patterns = &.{
12961 .{ .src = .{ .to_mem, .to_mem } },
12962 },
12963 .extra_temps = .{
12964 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
12965 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12966 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
12967 .{ .kind = .{ .rc = .sse } },
12968 .unused,
12969 .unused,
12970 .unused,
12971 .unused,
12972 .unused,
12973 },
12974 .dst_temps = .{.mem},
12975 .clobbers = .{ .eflags = true },
12976 .each = .{ .once = switch (cc) {
12977 else => unreachable,
12978 .e => &.{
12979 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
12980 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
12981 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
12982 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
12983 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
12984 .{ ._, ._, .mov, .memi(.dst0d, .tmp1), .tmp2d, ._, ._ },
12985 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
12986 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
12987 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
12988 },
12989 .ne => &.{
12990 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
12991 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
12992 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
12993 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
12994 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
12995 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
12996 .{ ._, ._, .mov, .memi(.dst0d, .tmp1), .tmp2d, ._, ._ },
12997 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
12998 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
12999 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13000 },
13001 } },
13002 }, .{
13003 .required_features = .{ .avx2, null, null, null },
13004 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
13005 .patterns = &.{
13006 .{ .src = .{ .to_mem, .to_mem } },
13007 },
13008 .extra_temps = .{
13009 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13010 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13011 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
13012 .{ .kind = .{ .rc = .sse } },
13013 .unused,
13014 .unused,
13015 .unused,
13016 .unused,
13017 .unused,
13018 },
13019 .dst_temps = .{.mem},
13020 .clobbers = .{ .eflags = true },
13021 .each = .{ .once = switch (cc) {
13022 else => unreachable,
13023 .e => &.{
13024 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13025 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13026 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
13027 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
13028 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },
13029 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
13030 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
13031 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13032 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
13033 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13034 },
13035 .ne => &.{
13036 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13037 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13038 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
13039 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
13040 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },
13041 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
13042 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
13043 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
13044 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13045 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
13046 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13047 },
13048 } },
13049 }, .{
13050 .required_features = .{ .avx2, null, null, null },
13051 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
13052 .patterns = &.{
13053 .{ .src = .{ .to_mem, .to_mem } },
13054 },
13055 .extra_temps = .{
13056 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13057 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13058 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13059 .{ .kind = .{ .rc = .sse } },
13060 .unused,
13061 .unused,
13062 .unused,
13063 .unused,
13064 .unused,
13065 },
13066 .dst_temps = .{.mem},
13067 .clobbers = .{ .eflags = true },
13068 .each = .{ .once = switch (cc) {
13069 else => unreachable,
13070 .e => &.{
13071 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13072 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13073 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
13074 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
13075 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },
13076 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
13077 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
13078 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
13079 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13080 },
13081 .ne => &.{
13082 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13083 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13084 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
13085 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
13086 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },
13087 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
13088 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
13089 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
13090 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
13091 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13092 },
13093 } },
13094 }, .{
13095 .required_features = .{ .avx2, null, null, null },
13096 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
13097 .patterns = &.{
13098 .{ .src = .{ .to_mem, .to_mem } },
13099 },
13100 .extra_temps = .{
13101 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13102 .{ .type = .u32, .kind = .{ .reg = .rcx } },
13103 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13104 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13105 .{ .kind = .{ .rc = .sse } },
13106 .unused,
13107 .unused,
13108 .unused,
13109 .unused,
13110 },
13111 .dst_temps = .{.mem},
13112 .clobbers = .{ .eflags = true },
13113 .each = .{ .once = switch (cc) {
13114 else => unreachable,
13115 .e => &.{
13116 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13117 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13118 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13119 .{ .@"0:", .v_dqu, .mov, .tmp4y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
13120 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._ },
13121 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },
13122 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13123 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13124 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
13125 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13126 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13127 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13128 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13129 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13130 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13131 .{ .@"1:", ._, .add, .tmp0p, .si(32), ._, ._ },
13132 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13133 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13134 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13135 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13136 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13137 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13138 },
13139 .ne => &.{
13140 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13141 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13142 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13143 .{ .@"0:", .v_dqu, .mov, .tmp4y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
13144 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._ },
13145 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },
13146 .{ ._, ._, .xor, .tmp3b, .si(0b1111), ._, ._ },
13147 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13148 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13149 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
13150 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13151 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13152 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13153 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13154 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13155 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13156 .{ .@"1:", ._, .add, .tmp0p, .si(32), ._, ._ },
13157 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13158 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13159 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13160 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13161 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13162 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13163 },
13164 } },
13165 }, .{
13166 .required_features = .{ .avx, null, null, null },
13167 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
13168 .patterns = &.{
13169 .{ .src = .{ .to_mem, .to_mem } },
13170 },
13171 .extra_temps = .{
13172 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13173 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13174 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
13175 .{ .kind = .{ .rc = .sse } },
13176 .unused,
13177 .unused,
13178 .unused,
13179 .unused,
13180 .unused,
13181 },
13182 .dst_temps = .{.mem},
13183 .clobbers = .{ .eflags = true },
13184 .each = .{ .once = switch (cc) {
13185 else => unreachable,
13186 .e => &.{
13187 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13188 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13189 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13190 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
13191 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
13192 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
13193 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13194 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
13195 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13196 },
13197 .ne => &.{
13198 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13199 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13200 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13201 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
13202 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
13203 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
13204 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
13205 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13206 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
13207 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13208 },
13209 } },
13210 }, .{
13211 .required_features = .{ .avx, null, null, null },
13212 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
13213 .patterns = &.{
13214 .{ .src = .{ .to_mem, .to_mem } },
13215 },
13216 .extra_temps = .{
13217 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13218 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13219 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13220 .{ .kind = .{ .rc = .sse } },
13221 .unused,
13222 .unused,
13223 .unused,
13224 .unused,
13225 .unused,
13226 },
13227 .dst_temps = .{.mem},
13228 .clobbers = .{ .eflags = true },
13229 .each = .{ .once = switch (cc) {
13230 else => unreachable,
13231 .e => &.{
13232 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13233 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13234 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13235 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
13236 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },
13237 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
13238 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
13239 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
13240 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
13241 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13242 },
13243 .ne => &.{
13244 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13245 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13246 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13247 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },
13248 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },
13249 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
13250 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
13251 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
13252 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
13253 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
13254 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13255 },
13256 } },
13257 }, .{
13258 .required_features = .{ .avx, null, null, null },
13259 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
13260 .patterns = &.{
13261 .{ .src = .{ .to_mem, .to_mem } },
13262 },
13263 .extra_temps = .{
13264 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13265 .{ .type = .u32, .kind = .{ .reg = .rcx } },
13266 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13267 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13268 .{ .kind = .{ .rc = .sse } },
13269 .unused,
13270 .unused,
13271 .unused,
13272 .unused,
13273 },
13274 .dst_temps = .{.mem},
13275 .clobbers = .{ .eflags = true },
13276 .each = .{ .once = switch (cc) {
13277 else => unreachable,
13278 .e => &.{
13279 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13280 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13281 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13282 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13283 .{ ._, .vp_d, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
13284 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
13285 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13286 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13287 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
13288 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13289 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13290 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13291 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13292 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13293 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13294 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
13295 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13296 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13297 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13298 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13299 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13300 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13301 },
13302 .ne => &.{
13303 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13304 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13305 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13306 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13307 .{ ._, .vp_d, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
13308 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
13309 .{ ._, ._, .xor, .tmp3b, .si(0b1111), ._, ._ },
13310 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13311 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13312 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
13313 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13314 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13315 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13316 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13317 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13318 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13319 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
13320 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13321 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13322 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13323 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13324 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13325 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13326 },
13327 } },
13328 }, .{
13329 .required_features = .{ .avx, null, null, null },
13330 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
13331 .patterns = &.{
13332 .{ .src = .{ .to_mem, .to_mem } },
13333 },
13334 .extra_temps = .{
13335 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13336 .{ .type = .u32, .kind = .{ .reg = .rcx } },
13337 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13338 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13339 .{ .kind = .{ .rc = .sse } },
13340 .unused,
13341 .unused,
13342 .unused,
13343 .unused,
13344 },
13345 .dst_temps = .{.mem},
13346 .clobbers = .{ .eflags = true },
13347 .each = .{ .once = switch (cc) {
13348 else => unreachable,
13349 .e => &.{
13350 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13351 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13352 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13353 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13354 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
13355 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
13356 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13357 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13358 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13359 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13360 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13361 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13362 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13363 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13364 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13365 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
13366 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13367 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13368 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13369 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13370 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13371 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13372 },
13373 .ne => &.{
13374 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13375 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13376 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13377 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13378 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
13379 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
13380 .{ ._, ._, .xor, .tmp3b, .si(0b11), ._, ._ },
13381 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13382 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13383 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13384 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13385 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13386 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13387 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13388 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13389 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13390 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
13391 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13392 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13393 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13394 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13395 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13396 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13397 },
13398 } },
13399 }, .{
13400 .required_features = .{ .sse2, null, null, null },
13401 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
13402 .patterns = &.{
13403 .{ .src = .{ .to_mem, .to_mem } },
13404 },
13405 .extra_temps = .{
13406 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13407 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13408 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
13409 .{ .kind = .{ .rc = .sse } },
13410 .unused,
13411 .unused,
13412 .unused,
13413 .unused,
13414 .unused,
13415 },
13416 .dst_temps = .{.mem},
13417 .clobbers = .{ .eflags = true },
13418 .each = .{ .once = switch (cc) {
13419 else => unreachable,
13420 .e => &.{
13421 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13422 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13423 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13424 .{ ._, .p_b, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
13425 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
13426 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
13427 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13428 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
13429 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13430 },
13431 .ne => &.{
13432 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13433 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13434 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13435 .{ ._, .p_b, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
13436 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
13437 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
13438 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
13439 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13440 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
13441 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13442 },
13443 } },
13444 }, .{
13445 .required_features = .{ .sse2, null, null, null },
13446 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
13447 .patterns = &.{
13448 .{ .src = .{ .to_mem, .to_mem } },
13449 },
13450 .extra_temps = .{
13451 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13452 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13453 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13454 .{ .kind = .{ .rc = .sse } },
13455 .unused,
13456 .unused,
13457 .unused,
13458 .unused,
13459 .unused,
13460 },
13461 .dst_temps = .{.mem},
13462 .clobbers = .{ .eflags = true },
13463 .each = .{ .once = switch (cc) {
13464 else => unreachable,
13465 .e => &.{
13466 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13467 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13468 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13469 .{ ._, .p_w, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
13470 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },
13471 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
13472 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
13473 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
13474 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
13475 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13476 },
13477 .ne => &.{
13478 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13479 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13480 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13481 .{ ._, .p_w, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
13482 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },
13483 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
13484 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
13485 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
13486 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
13487 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
13488 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13489 },
13490 } },
13491 }, .{
13492 .required_features = .{ .sse2, null, null, null },
13493 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
13494 .patterns = &.{
13495 .{ .src = .{ .to_mem, .to_mem } },
13496 },
13497 .extra_temps = .{
13498 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13499 .{ .type = .u32, .kind = .{ .reg = .rcx } },
13500 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13501 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13502 .{ .kind = .{ .rc = .sse } },
13503 .unused,
13504 .unused,
13505 .unused,
13506 .unused,
13507 },
13508 .dst_temps = .{.mem},
13509 .clobbers = .{ .eflags = true },
13510 .each = .{ .once = switch (cc) {
13511 else => unreachable,
13512 .e => &.{
13513 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13514 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13515 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13516 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13517 .{ ._, .p_d, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
13518 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
13519 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13520 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13521 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
13522 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13523 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13524 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13525 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13526 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13527 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13528 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
13529 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13530 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13531 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13532 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13533 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13534 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13535 },
13536 .ne => &.{
13537 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13538 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13539 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13540 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13541 .{ ._, .p_d, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
13542 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
13543 .{ ._, ._, .xor, .tmp3b, .si(0b1111), ._, ._ },
13544 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13545 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13546 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
13547 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13548 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13549 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13550 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13551 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13552 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13553 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
13554 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13555 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13556 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13557 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13558 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13559 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13560 },
13561 } },
13562 }, .{
13563 .required_features = .{ .sse4_1, null, null, null },
13564 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
13565 .patterns = &.{
13566 .{ .src = .{ .to_mem, .to_mem } },
13567 },
13568 .extra_temps = .{
13569 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13570 .{ .type = .u32, .kind = .{ .reg = .rcx } },
13571 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13572 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13573 .{ .kind = .{ .rc = .sse } },
13574 .unused,
13575 .unused,
13576 .unused,
13577 .unused,
13578 },
13579 .dst_temps = .{.mem},
13580 .clobbers = .{ .eflags = true },
13581 .each = .{ .once = switch (cc) {
13582 else => unreachable,
13583 .e => &.{
13584 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13585 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13586 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13587 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13588 .{ ._, .p_q, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
13589 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
13590 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13591 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13592 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13593 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13594 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13595 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13596 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13597 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13598 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13599 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
13600 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13601 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13602 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13603 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13604 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13605 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13606 },
13607 .ne => &.{
13608 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13609 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13610 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13611 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
13612 .{ ._, .p_q, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
13613 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
13614 .{ ._, ._, .xor, .tmp3b, .si(0b11), ._, ._ },
13615 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
13616 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
13617 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13618 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13619 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13620 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13621 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13622 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
13623 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13624 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
13625 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13626 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13627 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13628 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
13629 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
13630 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
13631 },
13632 } },
13633 }, .{
13634 .required_features = .{ .sse, .mmx, null, null },
13635 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
13636 .patterns = &.{
13637 .{ .src = .{ .to_mem, .to_mem } },
13638 },
13639 .extra_temps = .{
13640 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13641 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13642 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13643 .{ .kind = .{ .rc = .mmx } },
13644 .unused,
13645 .unused,
13646 .unused,
13647 .unused,
13648 .unused,
13649 },
13650 .dst_temps = .{.mem},
13651 .clobbers = .{ .eflags = true },
13652 .each = .{ .once = switch (cc) {
13653 else => unreachable,
13654 .e => &.{
13655 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13656 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13657 .{ .@"0:", ._q, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
13658 .{ ._, .p_b, .cmpeq, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
13659 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
13660 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
13661 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
13662 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
13663 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13664 },
13665 .ne => &.{
13666 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13667 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13668 .{ .@"0:", ._q, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
13669 .{ ._, .p_b, .cmpeq, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
13670 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },
13671 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
13672 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
13673 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
13674 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
13675 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13676 },
13677 } },
13678 }, .{
13679 .required_features = .{ .sse, .mmx, null, null },
13680 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
13681 .patterns = &.{
13682 .{ .src = .{ .to_mem, .to_mem } },
13683 },
13684 .extra_temps = .{
13685 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13686 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13687 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13688 .{ .kind = .{ .rc = .mmx } },
13689 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13690 .{ .kind = .{ .rc = .mmx } },
13691 .unused,
13692 .unused,
13693 .unused,
13694 },
13695 .dst_temps = .{.mem},
13696 .clobbers = .{ .eflags = true },
13697 .each = .{ .once = switch (cc) {
13698 else => unreachable,
13699 .e => &.{
13700 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13701 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13702 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13703 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
13704 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
13705 .{ ._, .p_w, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
13706 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
13707 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
13708 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
13709 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
13710 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
13711 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13712 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13713 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
13714 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
13715 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
13716 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13717 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
13718 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13719 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13720 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13721 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
13722 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
13723 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
13724 },
13725 .ne => &.{
13726 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13727 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13728 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13729 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
13730 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
13731 .{ ._, .p_w, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
13732 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
13733 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
13734 .{ ._, ._, .xor, .tmp4b, .si(0b1111), ._, ._ },
13735 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
13736 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
13737 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
13738 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13739 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13740 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
13741 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
13742 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
13743 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13744 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
13745 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13746 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13747 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13748 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
13749 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
13750 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
13751 },
13752 } },
13753 }, .{
13754 .required_features = .{ .sse, .mmx, null, null },
13755 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
13756 .patterns = &.{
13757 .{ .src = .{ .to_mem, .to_mem } },
13758 },
13759 .extra_temps = .{
13760 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13761 .{ .type = .u32, .kind = .{ .reg = .rcx } },
13762 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13763 .{ .kind = .{ .rc = .mmx } },
13764 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13765 .{ .kind = .{ .rc = .mmx } },
13766 .unused,
13767 .unused,
13768 .unused,
13769 },
13770 .dst_temps = .{.mem},
13771 .clobbers = .{ .eflags = true },
13772 .each = .{ .once = switch (cc) {
13773 else => unreachable,
13774 .e => &.{
13775 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13776 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13777 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13778 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
13779 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
13780 .{ ._, .p_d, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
13781 .{ ._, .p_w, .ackssd, .tmp5q, .tmp3q, ._, ._ },
13782 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
13783 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
13784 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
13785 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
13786 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13787 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13788 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13789 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
13790 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
13791 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
13792 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13793 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
13794 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13795 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13796 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13797 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
13798 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
13799 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
13800 },
13801 .ne => &.{
13802 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13803 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
13804 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13805 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
13806 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
13807 .{ ._, .p_d, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
13808 .{ ._, .p_w, .ackssd, .tmp5q, .tmp3q, ._, ._ },
13809 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
13810 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
13811 .{ ._, ._, .xor, .tmp4b, .si(0b11), ._, ._ },
13812 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
13813 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
13814 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
13815 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13816 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
13817 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
13818 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
13819 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
13820 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
13821 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
13822 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13823 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
13824 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
13825 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
13826 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
13827 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
13828 },
13829 } },
13830 }, .{
13831 .dst_constraints = .{.{ .bool_vec = .byte }},
13832 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
13833 .patterns = &.{
13834 .{ .src = .{ .to_mem, .to_mem } },
13835 },
13836 .extra_temps = .{
13837 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13838 .{ .type = .u8, .kind = .{ .reg = .cl } },
13839 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
13840 .unused,
13841 .unused,
13842 .unused,
13843 .unused,
13844 .unused,
13845 .unused,
13846 },
13847 .dst_temps = .{.{ .rc = .general_purpose }},
13848 .clobbers = .{ .eflags = true },
13849 .each = .{ .once = &.{
13850 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
13851 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13852 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
13853 .{ .@"0:", ._, .mov, .tmp2b, .memia(.src0b, .tmp0, .add_size), ._, ._ },
13854 .{ ._, ._, .cmp, .tmp2b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
13855 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
13856 .{ ._, ._l, .sh, .tmp2b, .tmp1b, ._, ._ },
13857 .{ ._, ._, .@"or", .dst0b, .tmp2b, ._, ._ },
13858 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
13859 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
13860 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13861 } },
13862 }, .{
13863 .dst_constraints = .{.{ .bool_vec = .byte }},
13864 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
13865 .patterns = &.{
13866 .{ .src = .{ .to_mem, .to_mem } },
13867 },
13868 .extra_temps = .{
13869 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13870 .{ .type = .u8, .kind = .{ .reg = .cl } },
13871 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
13872 .unused,
13873 .unused,
13874 .unused,
13875 .unused,
13876 .unused,
13877 .unused,
13878 },
13879 .dst_temps = .{.{ .rc = .general_purpose }},
13880 .clobbers = .{ .eflags = true },
13881 .each = .{ .once = &.{
13882 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
13883 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13884 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
13885 .{ .@"0:", ._, .mov, .tmp2w, .memia(.src0w, .tmp0, .add_size), ._, ._ },
13886 .{ ._, ._, .cmp, .tmp2w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
13887 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
13888 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },
13889 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },
13890 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
13891 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
13892 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13893 } },
13894 }, .{
13895 .dst_constraints = .{.{ .bool_vec = .byte }},
13896 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
13897 .patterns = &.{
13898 .{ .src = .{ .to_mem, .to_mem } },
13899 },
13900 .extra_temps = .{
13901 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13902 .{ .type = .u8, .kind = .{ .reg = .cl } },
13903 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13904 .unused,
13905 .unused,
13906 .unused,
13907 .unused,
13908 .unused,
13909 .unused,
13910 },
13911 .dst_temps = .{.{ .rc = .general_purpose }},
13912 .clobbers = .{ .eflags = true },
13913 .each = .{ .once = &.{
13914 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
13915 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13916 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
13917 .{ .@"0:", ._, .mov, .tmp2d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
13918 .{ ._, ._, .cmp, .tmp2d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
13919 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
13920 .{ ._, ._l, .sh, .tmp2b, .tmp1b, ._, ._ },
13921 .{ ._, ._, .@"or", .dst0b, .tmp2b, ._, ._ },
13922 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
13923 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
13924 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13925 } },
13926 }, .{
13927 .required_features = .{ .@"64bit", null, null, null },
13928 .dst_constraints = .{.{ .bool_vec = .byte }},
13929 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
13930 .patterns = &.{
13931 .{ .src = .{ .to_mem, .to_mem } },
13932 },
13933 .extra_temps = .{
13934 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
13935 .{ .type = .u8, .kind = .{ .reg = .cl } },
13936 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
13937 .unused,
13938 .unused,
13939 .unused,
13940 .unused,
13941 .unused,
13942 .unused,
13943 },
13944 .dst_temps = .{.{ .rc = .general_purpose }},
13945 .clobbers = .{ .eflags = true },
13946 .each = .{ .once = &.{
13947 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
13948 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
13949 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
13950 .{ .@"0:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
13951 .{ ._, ._, .cmp, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
13952 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
13953 .{ ._, ._l, .sh, .tmp2b, .tmp1b, ._, ._ },
13954 .{ ._, ._, .@"or", .dst0b, .tmp2b, ._, ._ },
13955 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
13956 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
13957 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
13958 } },
13959 }, .{
13960 .dst_constraints = .{.{ .bool_vec = .byte }},
13961 .src_constraints = .{ .any_scalar_int, .any_scalar_int },
13962 .patterns = &.{
13963 .{ .src = .{ .to_mem, .to_mem } },
13964 },
13965 .extra_temps = .{
13966 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
13967 .{ .type = .u8, .kind = .{ .reg = .cl } },
13968 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
13969 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
13970 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
13971 .unused,
13972 .unused,
13973 .unused,
13974 .unused,
13975 },
13976 .dst_temps = .{.{ .rc = .general_purpose }},
13977 .clobbers = .{ .eflags = true },
13978 .each = .{ .once = &.{
13979 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
13980 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
13981 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
13982 .{ .@"0:", ._, .mov, .tmp2d, .sa(.src0p, .add_elem_limbs), ._, ._ },
13983 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
13984 .{ .@"1:", ._, .mov, .tmp4p, .memi(.src0p, .tmp0), ._, ._ },
13985 .{ ._, ._, .xor, .tmp4p, .memi(.src1p, .tmp0), ._, ._ },
13986 .{ ._, ._, .@"or", .tmp3p, .tmp4p, ._, ._ },
13987 .{ ._, ._, .add, .tmp0p, .sa(.tmp4, .add_size), ._, ._ },
13988 .{ ._, ._, .sub, .tmp2d, .si(1), ._, ._ },
13989 .{ ._, ._b, .j, .@"1b", ._, ._, ._ },
13990 .{ ._, ._, .@"test", .tmp3p, .tmp3p, ._, ._ },
13991 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
13992 .{ ._, ._l, .sh, .tmp2b, .tmp1b, ._, ._ },
13993 .{ ._, ._, .@"or", .dst0b, .tmp2b, ._, ._ },
13994 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
13995 .{ ._, ._, .cmp, .tmp1b, .sa(.dst0, .add_len), ._, ._ },
13996 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
13997 } },
13998 }, .{
13999 .dst_constraints = .{.{ .bool_vec = .dword }},
14000 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
14001 .patterns = &.{
14002 .{ .src = .{ .to_mem, .to_mem } },
14003 },
14004 .extra_temps = .{
14005 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
14006 .{ .type = .u8, .kind = .{ .reg = .cl } },
14007 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
14008 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
14009 .unused,
14010 .unused,
14011 .unused,
14012 .unused,
14013 .unused,
14014 },
14015 .dst_temps = .{.{ .rc = .general_purpose }},
14016 .clobbers = .{ .eflags = true },
14017 .each = .{ .once = &.{
14018 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14019 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14020 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14021 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14022 .{ ._, ._, .mov, .tmp3b, .memia(.src0b, .tmp0, .add_size), ._, ._ },
14023 .{ ._, ._, .cmp, .tmp3b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
14024 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14025 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },
14026 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },
14027 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14028 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
14029 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
14030 } },
14031 }, .{
14032 .dst_constraints = .{.{ .bool_vec = .dword }},
14033 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
14034 .patterns = &.{
14035 .{ .src = .{ .to_mem, .to_mem } },
14036 },
14037 .extra_temps = .{
14038 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
14039 .{ .type = .u8, .kind = .{ .reg = .cl } },
14040 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
14041 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
14042 .unused,
14043 .unused,
14044 .unused,
14045 .unused,
14046 .unused,
14047 },
14048 .dst_temps = .{.{ .rc = .general_purpose }},
14049 .clobbers = .{ .eflags = true },
14050 .each = .{ .once = &.{
14051 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14052 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14053 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14054 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14055 .{ ._, ._, .mov, .tmp3w, .memia(.src0w, .tmp0, .add_size), ._, ._ },
14056 .{ ._, ._, .cmp, .tmp3w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
14057 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14058 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },
14059 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },
14060 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14061 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
14062 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
14063 } },
14064 }, .{
14065 .dst_constraints = .{.{ .bool_vec = .dword }},
14066 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
14067 .patterns = &.{
14068 .{ .src = .{ .to_mem, .to_mem } },
14069 },
14070 .extra_temps = .{
14071 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
14072 .{ .type = .u8, .kind = .{ .reg = .cl } },
14073 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
14074 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
14075 .unused,
14076 .unused,
14077 .unused,
14078 .unused,
14079 .unused,
14080 },
14081 .dst_temps = .{.{ .rc = .general_purpose }},
14082 .clobbers = .{ .eflags = true },
14083 .each = .{ .once = &.{
14084 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14085 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14086 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14087 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14088 .{ ._, ._, .mov, .tmp3d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
14089 .{ ._, ._, .cmp, .tmp3d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
14090 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14091 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },
14092 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },
14093 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14094 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
14095 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
14096 } },
14097 }, .{
14098 .required_features = .{ .@"64bit", null, null, null },
14099 .dst_constraints = .{.{ .bool_vec = .dword }},
14100 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
14101 .patterns = &.{
14102 .{ .src = .{ .to_mem, .to_mem } },
14103 },
14104 .extra_temps = .{
14105 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
14106 .{ .type = .u8, .kind = .{ .reg = .cl } },
14107 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
14108 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
14109 .unused,
14110 .unused,
14111 .unused,
14112 .unused,
14113 .unused,
14114 },
14115 .dst_temps = .{.{ .rc = .general_purpose }},
14116 .clobbers = .{ .eflags = true },
14117 .each = .{ .once = &.{
14118 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14119 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14120 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14121 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14122 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
14123 .{ ._, ._, .cmp, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
14124 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14125 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },
14126 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },
14127 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14128 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
14129 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
14130 } },
14131 }, .{
14132 .dst_constraints = .{.{ .bool_vec = .dword }},
14133 .src_constraints = .{ .any_scalar_int, .any_scalar_int },
14134 .patterns = &.{
14135 .{ .src = .{ .to_mem, .to_mem } },
14136 },
14137 .extra_temps = .{
14138 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
14139 .{ .type = .u8, .kind = .{ .reg = .cl } },
14140 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
14141 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
14142 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
14143 .unused,
14144 .unused,
14145 .unused,
14146 .unused,
14147 },
14148 .dst_temps = .{.{ .rc = .general_purpose }},
14149 .clobbers = .{ .eflags = true },
14150 .each = .{ .once = &.{
14151 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14152 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
14153 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14154 .{ .@"0:", ._, .mov, .tmp2d, .sa(.src0p, .add_elem_limbs), ._, ._ },
14155 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
14156 .{ .@"1:", ._, .mov, .tmp4p, .memi(.src0p, .tmp0), ._, ._ },
14157 .{ ._, ._, .xor, .tmp4p, .memi(.src1p, .tmp0), ._, ._ },
14158 .{ ._, ._, .@"or", .tmp3p, .tmp4p, ._, ._ },
14159 .{ ._, ._, .add, .tmp0p, .sa(.tmp4, .add_size), ._, ._ },
14160 .{ ._, ._, .sub, .tmp2d, .si(1), ._, ._ },
14161 .{ ._, ._b, .j, .@"1b", ._, ._, ._ },
14162 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14163 .{ ._, ._, .@"test", .tmp3p, .tmp3p, ._, ._ },
14164 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14165 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },
14166 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },
14167 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14168 .{ ._, ._, .cmp, .tmp1b, .sa(.dst0, .add_len), ._, ._ },
14169 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
7033 } },14170 } },
7034 }, .{14171 }, .{
7035 .required_features = .{ .avx2, null, null, null },14172 .required_features = .{ .@"64bit", null, null, null },
14173 .dst_constraints = .{.{ .bool_vec = .qword }},
14174 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
14175 .patterns = &.{
14176 .{ .src = .{ .to_mem, .to_mem } },
14177 },
14178 .extra_temps = .{
14179 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
14180 .{ .type = .u8, .kind = .{ .reg = .cl } },
14181 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
14182 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
14183 .unused,
14184 .unused,
14185 .unused,
14186 .unused,
14187 .unused,
14188 },
14189 .dst_temps = .{.{ .rc = .general_purpose }},
14190 .clobbers = .{ .eflags = true },
14191 .each = .{ .once = &.{
14192 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14193 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14194 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14195 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14196 .{ ._, ._, .mov, .tmp3b, .memia(.src0b, .tmp0, .add_size), ._, ._ },
14197 .{ ._, ._, .cmp, .tmp3b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
14198 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14199 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },
14200 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },
14201 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14202 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
14203 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
14204 } },
14205 }, .{
14206 .required_features = .{ .@"64bit", null, null, null },
14207 .dst_constraints = .{.{ .bool_vec = .qword }},
7036 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },14208 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
7037 .patterns = &.{14209 .patterns = &.{
7038 .{ .src = .{ .to_ymm, .mem } },14210 .{ .src = .{ .to_mem, .to_mem } },
7039 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
7040 .{ .src = .{ .to_ymm, .to_ymm } },
7041 },14211 },
7042 .dst_temps = .{.{ .rc_mask = .{ .rc = .sse, .info = .{14212 .extra_temps = .{
7043 .kind = .all,14213 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7044 .inverted = switch (cc) {14214 .{ .type = .u8, .kind = .{ .reg = .cl } },
7045 else => unreachable,14215 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7046 .e => false,14216 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
7047 .ne => true,14217 .unused,
7048 },14218 .unused,
7049 .scalar = .word,14219 .unused,
7050 } } }},14220 .unused,
14221 .unused,
14222 },
14223 .dst_temps = .{.{ .rc = .general_purpose }},
14224 .clobbers = .{ .eflags = true },
7051 .each = .{ .once = &.{14225 .each = .{ .once = &.{
7052 .{ ._, .vp_w, .cmpeq, .dst0y, .src0y, .src1y, ._ },14226 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14227 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14228 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14229 .{ ._, ._, .mov, .tmp3w, .memia(.src0w, .tmp0, .add_size), ._, ._ },
14230 .{ ._, ._, .cmp, .tmp3w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
14231 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14232 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },
14233 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },
14234 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14235 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
14236 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7053 } },14237 } },
7054 }, .{14238 }, .{
7055 .required_features = .{ .avx2, null, null, null },14239 .required_features = .{ .@"64bit", null, null, null },
14240 .dst_constraints = .{.{ .bool_vec = .qword }},
7056 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },14241 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },
7057 .patterns = &.{14242 .patterns = &.{
7058 .{ .src = .{ .to_ymm, .mem } },14243 .{ .src = .{ .to_mem, .to_mem } },
7059 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
7060 .{ .src = .{ .to_ymm, .to_ymm } },
7061 },14244 },
7062 .dst_temps = .{.{ .rc_mask = .{ .rc = .sse, .info = .{14245 .extra_temps = .{
7063 .kind = .all,14246 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7064 .inverted = switch (cc) {14247 .{ .type = .u8, .kind = .{ .reg = .cl } },
7065 else => unreachable,14248 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7066 .e => false,14249 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7067 .ne => true,14250 .unused,
7068 },14251 .unused,
7069 .scalar = .dword,14252 .unused,
7070 } } }},14253 .unused,
14254 .unused,
14255 },
14256 .dst_temps = .{.{ .rc = .general_purpose }},
14257 .clobbers = .{ .eflags = true },
7071 .each = .{ .once = &.{14258 .each = .{ .once = &.{
7072 .{ ._, .vp_d, .cmpeq, .dst0y, .src0y, .src1y, ._ },14259 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14260 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14261 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14262 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14263 .{ ._, ._, .mov, .tmp3d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
14264 .{ ._, ._, .cmp, .tmp3d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
14265 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14266 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },
14267 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },
14268 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14269 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
14270 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7073 } },14271 } },
7074 }, .{14272 }, .{
7075 .required_features = .{ .avx2, null, null, null },14273 .required_features = .{ .@"64bit", null, null, null },
14274 .dst_constraints = .{.{ .bool_vec = .qword }},
7076 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },14275 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },
7077 .patterns = &.{14276 .patterns = &.{
7078 .{ .src = .{ .to_ymm, .mem } },14277 .{ .src = .{ .to_mem, .to_mem } },
7079 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
7080 .{ .src = .{ .to_ymm, .to_ymm } },
7081 },14278 },
7082 .dst_temps = .{.{ .rc_mask = .{ .rc = .sse, .info = .{14279 .extra_temps = .{
7083 .kind = .all,14280 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7084 .inverted = switch (cc) {14281 .{ .type = .u8, .kind = .{ .reg = .cl } },
7085 else => unreachable,14282 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7086 .e => false,14283 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7087 .ne => true,14284 .unused,
7088 },14285 .unused,
7089 .scalar = .qword,14286 .unused,
7090 } } }},14287 .unused,
14288 .unused,
14289 },
14290 .dst_temps = .{.{ .rc = .general_purpose }},
14291 .clobbers = .{ .eflags = true },
7091 .each = .{ .once = &.{14292 .each = .{ .once = &.{
7092 .{ ._, .vp_q, .cmpeq, .dst0y, .src0y, .src1y, ._ },14293 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14294 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14295 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14296 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14297 .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
14298 .{ ._, ._, .cmp, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
14299 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14300 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },
14301 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },
14302 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14303 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
14304 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7093 } },14305 } },
7094 }, .{14306 }, .{
7095 .required_features = .{ .avx, null, null, null },14307 .required_features = .{ .@"64bit", null, null, null },
7096 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },14308 .dst_constraints = .{.{ .bool_vec = .qword }},
14309 .src_constraints = .{ .any_scalar_int, .any_scalar_int },
7097 .patterns = &.{14310 .patterns = &.{
7098 .{ .src = .{ .to_xmm, .mem } },14311 .{ .src = .{ .to_mem, .to_mem } },
7099 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
7100 .{ .src = .{ .to_xmm, .to_xmm } },
7101 },14312 },
7102 .dst_temps = .{.{ .rc_mask = .{ .rc = .sse, .info = .{14313 .extra_temps = .{
7103 .kind = .all,14314 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7104 .inverted = switch (cc) {14315 .{ .type = .u8, .kind = .{ .reg = .cl } },
7105 else => unreachable,14316 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7106 .e => false,14317 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7107 .ne => true,14318 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7108 },14319 .unused,
7109 .scalar = .byte,14320 .unused,
7110 } } }},14321 .unused,
14322 .unused,
14323 },
14324 .dst_temps = .{.{ .rc = .general_purpose }},
14325 .clobbers = .{ .eflags = true },
7111 .each = .{ .once = &.{14326 .each = .{ .once = &.{
7112 .{ ._, .vp_b, .cmpeq, .dst0x, .src0x, .src1x, ._ },14327 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14328 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
14329 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
14330 .{ .@"0:", ._, .mov, .tmp2d, .sa(.src0p, .add_elem_limbs), ._, ._ },
14331 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
14332 .{ .@"1:", ._, .mov, .tmp4p, .memi(.src0p, .tmp0), ._, ._ },
14333 .{ ._, ._, .xor, .tmp4p, .memi(.src1p, .tmp0), ._, ._ },
14334 .{ ._, ._, .@"or", .tmp3p, .tmp4p, ._, ._ },
14335 .{ ._, ._, .add, .tmp0p, .sa(.tmp4, .add_size), ._, ._ },
14336 .{ ._, ._, .sub, .tmp2d, .si(1), ._, ._ },
14337 .{ ._, ._b, .j, .@"1b", ._, ._, ._ },
14338 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14339 .{ ._, ._, .@"test", .tmp3p, .tmp3p, ._, ._ },
14340 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },
14341 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },
14342 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },
14343 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
14344 .{ ._, ._, .cmp, .tmp1b, .sa(.dst0, .add_len), ._, ._ },
14345 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
7113 } },14346 } },
7114 }, .{14347 }, .{
7115 .required_features = .{ .avx, null, null, null },14348 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },
7116 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },
7117 .patterns = &.{14349 .patterns = &.{
7118 .{ .src = .{ .to_xmm, .mem } },14350 .{ .src = .{ .to_mem, .to_mem } },
7119 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
7120 .{ .src = .{ .to_xmm, .to_xmm } },
7121 },14351 },
7122 .dst_temps = .{.{ .rc_mask = .{ .rc = .sse, .info = .{14352 .extra_temps = .{
7123 .kind = .all,14353 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7124 .inverted = switch (cc) {14354 .{ .type = .u32, .kind = .{ .reg = .ecx } },
7125 else => unreachable,14355 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7126 .e => false,14356 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7127 .ne => true,14357 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
7128 },14358 .unused,
7129 .scalar = .word,14359 .unused,
7130 } } }},14360 .unused,
14361 .unused,
14362 },
14363 .dst_temps = .{.mem},
14364 .clobbers = .{ .eflags = true },
7131 .each = .{ .once = &.{14365 .each = .{ .once = &.{
7132 .{ ._, .vp_w, .cmpeq, .dst0x, .src0x, .src1x, ._ },14366 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
14367 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
14368 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14369 .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ },
14370 .{ ._, ._, .mov, .tmp4b, .memia(.src0b, .tmp0, .add_size), ._, ._ },
14371 .{ ._, ._, .cmp, .tmp4b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
14372 .{ ._, .fromCondition(cc), .set, .tmp3b, ._, ._, ._ },
14373 .{ ._, ._l, .sh, .tmp3p, .tmp1b, ._, ._ },
14374 .{ ._, ._, .@"or", .tmp2p, .tmp3p, ._, ._ },
14375 .{ ._, ._, .add, .tmp1d, .si(1), ._, ._ },
14376 .{ ._, ._, .@"test", .tmp1d, .sia(-1, .none, .add_ptr_bit_size), ._, ._ },
14377 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
14378 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
14379 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
14380 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_ptr_size), .tmp2p, ._, ._ },
14381 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
14382 .{ .@"1:", ._, .add, .tmp0p, .si(1), ._, ._ },
14383 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
14384 .{ ._, ._, .@"test", .tmp1d, .sia(-1, .none, .add_ptr_bit_size), ._, ._ },
14385 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
14386 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
14387 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
14388 .{ ._, ._, .mov, .memi(.dst0p, .tmp3), .tmp2p, ._, ._ },
7133 } },14389 } },
7134 }, .{14390 }, .{
7135 .required_features = .{ .avx, null, null, null },14391 .required_features = .{ .f16c, null, null, null },
7136 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },14392 .src_constraints = .{
14393 .{ .scalar_float = .{ .of = .word, .is = .word } },
14394 .{ .scalar_float = .{ .of = .word, .is = .word } },
14395 },
7137 .patterns = &.{14396 .patterns = &.{
7138 .{ .src = .{ .to_xmm, .mem } },14397 .{ .src = .{ .to_sse, .to_sse } },
7139 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
7140 .{ .src = .{ .to_xmm, .to_xmm } },
7141 },14398 },
7142 .dst_temps = .{.{ .rc_mask = .{ .rc = .sse, .info = .{14399 .extra_temps = .{
7143 .kind = .all,14400 .{ .kind = .{ .rc = .sse } },
7144 .inverted = switch (cc) {14401 .unused,
7145 else => unreachable,14402 .unused,
7146 .e => false,14403 .unused,
7147 .ne => true,14404 .unused,
7148 },14405 .unused,
7149 .scalar = .dword,14406 .unused,
7150 } } }},14407 .unused,
14408 .unused,
14409 },
14410 .dst_temps = .{.{ .mut_rc_mask = .{
14411 .ref = .src0,
14412 .rc = .sse,
14413 .info = .{ .kind = .all, .scalar = .dword },
14414 } }},
7151 .each = .{ .once = &.{14415 .each = .{ .once = &.{
7152 .{ ._, .vp_d, .cmpeq, .dst0x, .src0x, .src1x, ._ },14416 .{ ._, .v_ps, .cvtph2, .dst0x, .src0x, ._, ._ },
14417 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1x, ._, ._ },
14418 .{ ._, .v_ss, .cmp, .dst0x, .dst0x, .tmp0x, .ui(switch (cc) {
14419 else => unreachable,
14420 .e => 0b00000,
14421 .ne => 0b00100,
14422 }) },
7153 } },14423 } },
7154 }, .{14424 }, .{
7155 .required_features = .{ .avx, null, null, null },14425 .required_features = .{ .f16c, null, null, null },
7156 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },14426 .src_constraints = .{
14427 .{ .scalar_float = .{ .of = .qword, .is = .word } },
14428 .{ .scalar_float = .{ .of = .qword, .is = .word } },
14429 },
7157 .patterns = &.{14430 .patterns = &.{
7158 .{ .src = .{ .to_xmm, .mem } },14431 .{ .src = .{ .mem, .mem } },
7159 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },14432 .{ .src = .{ .sse, .mem } },
7160 .{ .src = .{ .to_xmm, .to_xmm } },14433 .{ .src = .{ .mem, .sse } },
14434 .{ .src = .{ .to_sse, .to_sse } },
7161 },14435 },
7162 .dst_temps = .{.{ .rc_mask = .{ .rc = .sse, .info = .{14436 .extra_temps = .{
7163 .kind = .all,14437 .{ .kind = .{ .rc = .sse } },
7164 .inverted = switch (cc) {14438 .unused,
7165 else => unreachable,14439 .unused,
7166 .e => false,14440 .unused,
7167 .ne => true,14441 .unused,
7168 },14442 .unused,
7169 .scalar = .qword,14443 .unused,
7170 } } }},14444 .unused,
14445 .unused,
14446 },
14447 .dst_temps = .{.{ .mut_rc_mask = .{
14448 .ref = .src0,
14449 .rc = .sse,
14450 .info = .{ .kind = .all, .scalar = .dword },
14451 } }},
7171 .each = .{ .once = &.{14452 .each = .{ .once = &.{
7172 .{ ._, .vp_q, .cmpeq, .dst0x, .src0x, .src1x, ._ },14453 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
14454 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
14455 .{ ._, .v_ps, .cmp, .dst0x, .dst0x, .tmp0x, .ui(switch (cc) {
14456 else => unreachable,
14457 .e => 0b00000,
14458 .ne => 0b00100,
14459 }) },
7173 } },14460 } },
7174 }, .{14461 }, .{
7175 .required_features = .{ .sse2, null, null, null },14462 .required_features = .{ .f16c, null, null, null },
7176 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },14463 .src_constraints = .{
14464 .{ .scalar_float = .{ .of = .xword, .is = .word } },
14465 .{ .scalar_float = .{ .of = .xword, .is = .word } },
14466 },
7177 .patterns = &.{14467 .patterns = &.{
7178 .{ .src = .{ .to_mut_xmm, .mem } },14468 .{ .src = .{ .mem, .mem } },
7179 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },14469 .{ .src = .{ .to_sse, .mem } },
7180 .{ .src = .{ .to_mut_xmm, .to_xmm } },14470 .{ .src = .{ .mem, .to_sse } },
14471 .{ .src = .{ .to_sse, .to_sse } },
7181 },14472 },
7182 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{14473 .extra_temps = .{
7183 .kind = .all,14474 .{ .kind = .{ .rc = .sse } },
7184 .inverted = switch (cc) {14475 .unused,
7185 else => unreachable,14476 .unused,
7186 .e => false,14477 .unused,
7187 .ne => true,14478 .unused,
7188 },14479 .unused,
7189 .scalar = .byte,14480 .unused,
7190 } } }},14481 .unused,
14482 .unused,
14483 },
14484 .dst_temps = .{.{ .mut_rc_mask = .{
14485 .ref = .src0,
14486 .rc = .sse,
14487 .info = .{ .kind = .all, .scalar = .dword },
14488 } }},
7191 .each = .{ .once = &.{14489 .each = .{ .once = &.{
7192 .{ ._, .p_b, .cmpeq, .dst0x, .src1x, ._, ._ },14490 .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ },
14491 .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ },
14492 .{ ._, .v_ps, .cmp, .dst0y, .dst0y, .tmp0y, .ui(switch (cc) {
14493 else => unreachable,
14494 .e => 0b00000,
14495 .ne => 0b00100,
14496 }) },
7193 } },14497 } },
7194 }, .{14498 }, .{
7195 .required_features = .{ .sse2, null, null, null },14499 .required_features = .{ .avx, null, null, null },
7196 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },14500 .src_constraints = .{
14501 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
14502 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
14503 },
7197 .patterns = &.{14504 .patterns = &.{
7198 .{ .src = .{ .to_mut_xmm, .mem } },14505 .{ .src = .{ .to_sse, .mem } },
7199 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },14506 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7200 .{ .src = .{ .to_mut_xmm, .to_xmm } },14507 .{ .src = .{ .to_sse, .to_sse } },
7201 },14508 },
7202 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{14509 .dst_temps = .{.{ .mut_rc_mask = .{
7203 .kind = .all,14510 .ref = .src0,
7204 .inverted = switch (cc) {14511 .rc = .sse,
7205 else => unreachable,14512 .info = .{ .kind = .all, .scalar = .dword },
7206 .e => false,14513 } }},
7207 .ne => true,
7208 },
7209 .scalar = .word,
7210 } } }},
7211 .each = .{ .once = &.{14514 .each = .{ .once = &.{
7212 .{ ._, .p_w, .cmpeq, .dst0x, .src1x, ._, ._ },14515 .{ ._, .v_ss, .cmp, .dst0x, .src0x, .src1x, .ui(switch (cc) {
14516 else => unreachable,
14517 .e => 0b00000,
14518 .ne => 0b00100,
14519 }) },
7213 } },14520 } },
7214 }, .{14521 }, .{
7215 .required_features = .{ .sse2, null, null, null },14522 .required_features = .{ .sse, null, null, null },
7216 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },14523 .src_constraints = .{
14524 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
14525 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
14526 },
7217 .patterns = &.{14527 .patterns = &.{
7218 .{ .src = .{ .to_mut_xmm, .mem } },14528 .{ .src = .{ .to_mut_sse, .mem } },
7219 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },14529 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7220 .{ .src = .{ .to_mut_xmm, .to_xmm } },14530 .{ .src = .{ .to_mut_sse, .to_sse } },
7221 },14531 },
7222 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{14532 .dst_temps = .{.{ .ref_mask = .{
7223 .kind = .all,14533 .ref = .src0,
7224 .inverted = switch (cc) {14534 .info = .{ .kind = .all, .scalar = .dword },
7225 else => unreachable,14535 } }},
7226 .e => false,
7227 .ne => true,
7228 },
7229 .scalar = .dword,
7230 } } }},
7231 .each = .{ .once = &.{14536 .each = .{ .once = &.{
7232 .{ ._, .p_d, .cmpeq, .dst0x, .src1x, ._, ._ },14537 .{ ._, ._ss, .cmp, .dst0x, .src1x, .ui(switch (cc) {
14538 else => unreachable,
14539 .e => 0b00000,
14540 .ne => 0b00100,
14541 }), ._ },
7233 } },14542 } },
7234 }, .{14543 }, .{
7235 .required_features = .{ .sse4_1, null, null, null },14544 .required_features = .{ .avx, null, null, null },
7236 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },14545 .src_constraints = .{
14546 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
14547 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
14548 },
7237 .patterns = &.{14549 .patterns = &.{
7238 .{ .src = .{ .to_mut_xmm, .mem } },14550 .{ .src = .{ .to_sse, .mem } },
7239 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },14551 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7240 .{ .src = .{ .to_mut_xmm, .to_xmm } },14552 .{ .src = .{ .to_sse, .to_sse } },
7241 },14553 },
7242 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{14554 .dst_temps = .{.{ .mut_rc_mask = .{
7243 .kind = .all,14555 .ref = .src0,
7244 .inverted = switch (cc) {14556 .rc = .sse,
7245 else => unreachable,14557 .info = .{ .kind = .all, .scalar = .dword },
7246 .e => false,14558 } }},
7247 .ne => true,
7248 },
7249 .scalar = .qword,
7250 } } }},
7251 .each = .{ .once = &.{14559 .each = .{ .once = &.{
7252 .{ ._, .p_q, .cmpeq, .dst0x, .src1x, ._, ._ },14560 .{ ._, .v_ps, .cmp, .dst0x, .src0x, .src1x, .ui(switch (cc) {
14561 else => unreachable,
14562 .e => 0b00000,
14563 .ne => 0b00100,
14564 }) },
7253 } },14565 } },
7254 }, .{14566 }, .{
7255 .required_features = .{ .mmx, null, null, null },14567 .required_features = .{ .sse, null, null, null },
7256 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },14568 .src_constraints = .{
14569 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
14570 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
14571 },
7257 .patterns = &.{14572 .patterns = &.{
7258 .{ .src = .{ .to_mut_mm, .mem } },14573 .{ .src = .{ .to_mut_sse, .mem } },
7259 .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } },14574 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7260 .{ .src = .{ .to_mut_mm, .to_mm } },14575 .{ .src = .{ .to_mut_sse, .to_sse } },
7261 },14576 },
7262 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{14577 .dst_temps = .{.{ .ref_mask = .{
7263 .kind = .all,14578 .ref = .src0,
7264 .inverted = switch (cc) {14579 .info = .{ .kind = .all, .scalar = .dword },
7265 else => unreachable,14580 } }},
7266 .e => false,
7267 .ne => true,
7268 },
7269 .scalar = .byte,
7270 } } }},
7271 .each = .{ .once = &.{14581 .each = .{ .once = &.{
7272 .{ ._, .p_b, .cmpeq, .dst0q, .src1q, ._, ._ },14582 .{ ._, ._ps, .cmp, .dst0x, .src1x, .ui(switch (cc) {
14583 else => unreachable,
14584 .e => 0b00000,
14585 .ne => 0b00100,
14586 }), ._ },
7273 } },14587 } },
7274 }, .{14588 }, .{
7275 .required_features = .{ .mmx, null, null, null },14589 .required_features = .{ .avx, null, null, null },
7276 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },14590 .src_constraints = .{
14591 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
14592 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
14593 },
7277 .patterns = &.{14594 .patterns = &.{
7278 .{ .src = .{ .to_mut_mm, .mem } },14595 .{ .src = .{ .to_sse, .mem } },
7279 .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } },14596 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7280 .{ .src = .{ .to_mut_mm, .to_mm } },14597 .{ .src = .{ .to_sse, .to_sse } },
7281 },14598 },
7282 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{14599 .dst_temps = .{.{ .mut_rc_mask = .{
7283 .kind = .all,14600 .ref = .src0,
7284 .inverted = switch (cc) {14601 .rc = .sse,
7285 else => unreachable,14602 .info = .{ .kind = .all, .scalar = .dword },
7286 .e => false,14603 } }},
7287 .ne => true,
7288 },
7289 .scalar = .word,
7290 } } }},
7291 .each = .{ .once = &.{14604 .each = .{ .once = &.{
7292 .{ ._, .p_w, .cmpeq, .dst0q, .src1q, ._, ._ },14605 .{ ._, .v_ps, .cmp, .dst0y, .src0y, .src1y, .ui(switch (cc) {
14606 else => unreachable,
14607 .e => 0b00000,
14608 .ne => 0b00100,
14609 }) },
7293 } },14610 } },
7294 }, .{14611 }, .{
7295 .required_features = .{ .mmx, null, null, null },14612 .required_features = .{ .avx, null, null, null },
7296 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },14613 .src_constraints = .{
14614 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
14615 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
14616 },
7297 .patterns = &.{14617 .patterns = &.{
7298 .{ .src = .{ .to_mut_mm, .mem } },14618 .{ .src = .{ .to_sse, .mem } },
7299 .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } },14619 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7300 .{ .src = .{ .to_mut_mm, .to_mm } },14620 .{ .src = .{ .to_sse, .to_sse } },
7301 },14621 },
7302 .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{14622 .dst_temps = .{.{ .mut_rc_mask = .{
7303 .kind = .all,14623 .ref = .src0,
7304 .inverted = switch (cc) {14624 .rc = .sse,
7305 else => unreachable,14625 .info = .{ .kind = .all, .scalar = .qword },
7306 .e => false,14626 } }},
7307 .ne => true,
7308 },
7309 .scalar = .dword,
7310 } } }},
7311 .each = .{ .once = &.{14627 .each = .{ .once = &.{
7312 .{ ._, .p_d, .cmpeq, .dst0q, .src1q, ._, ._ },14628 .{ ._, .v_sd, .cmp, .dst0x, .src0x, .src1x, .ui(switch (cc) {
14629 else => unreachable,
14630 .e => 0b00000,
14631 .ne => 0b00100,
14632 }) },
7313 } },14633 } },
7314 }, .{14634 }, .{
7315 .src_constraints = .{ .{ .bool_vec = .byte }, .{ .bool_vec = .byte } },14635 .required_features = .{ .sse2, null, null, null },
14636 .src_constraints = .{
14637 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
14638 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
14639 },
7316 .patterns = &.{14640 .patterns = &.{
7317 .{ .src = .{ .mut_mem, .imm8 } },14641 .{ .src = .{ .to_mut_sse, .mem } },
7318 .{ .src = .{ .imm8, .mut_mem }, .commute = .{ 0, 1 } },14642 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7319 .{ .src = .{ .to_mut_gpr, .imm8 } },14643 .{ .src = .{ .to_mut_sse, .to_sse } },
7320 .{ .src = .{ .imm8, .to_mut_gpr }, .commute = .{ 0, 1 } },
7321 .{ .src = .{ .mut_mem, .to_gpr } },
7322 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
7323 .{ .src = .{ .to_mut_gpr, .mem } },
7324 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
7325 .{ .src = .{ .to_mut_gpr, .to_gpr } },
7326 },14644 },
7327 .dst_temps = .{.{ .ref = .src0 }},14645 .dst_temps = .{.{ .ref_mask = .{
7328 .clobbers = .{ .eflags = true },14646 .ref = .src0,
7329 .each = .{ .once = switch (cc) {14647 .info = .{ .kind = .all, .scalar = .qword },
7330 else => unreachable,14648 } }},
7331 .e => &.{14649 .each = .{ .once = &.{
7332 .{ ._, ._, .xor, .dst0b, .src1b, ._, ._ },14650 .{ ._, ._sd, .cmp, .dst0x, .src1x, .ui(switch (cc) {
7333 .{ ._, ._, .not, .dst0b, ._, ._, ._ },14651 else => unreachable,
7334 },14652 .e => 0b00000,
7335 .ne => &.{14653 .ne => 0b00100,
7336 .{ ._, ._, .xor, .dst0b, .src1b, ._, ._ },14654 }), ._ },
7337 },
7338 } },14655 } },
7339 }, .{14656 }, .{
7340 .src_constraints = .{ .{ .bool_vec = .word }, .{ .bool_vec = .word } },14657 .required_features = .{ .avx, null, null, null },
14658 .src_constraints = .{
14659 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
14660 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
14661 },
7341 .patterns = &.{14662 .patterns = &.{
7342 .{ .src = .{ .mut_mem, .imm16 } },14663 .{ .src = .{ .to_sse, .mem } },
7343 .{ .src = .{ .imm16, .mut_mem }, .commute = .{ 0, 1 } },14664 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7344 .{ .src = .{ .to_mut_gpr, .imm16 } },14665 .{ .src = .{ .to_sse, .to_sse } },
7345 .{ .src = .{ .imm16, .to_mut_gpr }, .commute = .{ 0, 1 } },
7346 .{ .src = .{ .mut_mem, .to_gpr } },
7347 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
7348 .{ .src = .{ .to_mut_gpr, .mem } },
7349 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
7350 .{ .src = .{ .to_mut_gpr, .to_gpr } },
7351 },14666 },
7352 .dst_temps = .{.{ .ref = .src0 }},14667 .dst_temps = .{.{ .mut_rc_mask = .{
7353 .clobbers = .{ .eflags = true },14668 .ref = .src0,
7354 .each = .{ .once = switch (cc) {14669 .rc = .sse,
7355 else => unreachable,14670 .info = .{ .kind = .all, .scalar = .qword },
7356 .e => &.{14671 } }},
7357 .{ ._, ._, .xor, .dst0w, .src1w, ._, ._ },14672 .each = .{ .once = &.{
7358 .{ ._, ._, .not, .dst0w, ._, ._, ._ },14673 .{ ._, .v_pd, .cmp, .dst0x, .src0x, .src1x, .ui(switch (cc) {
7359 },14674 else => unreachable,
7360 .ne => &.{14675 .e => 0b00000,
7361 .{ ._, ._, .xor, .dst0w, .src1w, ._, ._ },14676 .ne => 0b00100,
7362 },14677 }) },
7363 } },14678 } },
7364 }, .{14679 }, .{
7365 .src_constraints = .{ .{ .bool_vec = .dword }, .{ .bool_vec = .dword } },14680 .required_features = .{ .sse2, null, null, null },
14681 .src_constraints = .{
14682 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
14683 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
14684 },
7366 .patterns = &.{14685 .patterns = &.{
7367 .{ .src = .{ .mut_mem, .imm32 } },14686 .{ .src = .{ .to_mut_sse, .mem } },
7368 .{ .src = .{ .imm32, .mut_mem }, .commute = .{ 0, 1 } },14687 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7369 .{ .src = .{ .to_mut_gpr, .imm32 } },14688 .{ .src = .{ .to_mut_sse, .to_sse } },
7370 .{ .src = .{ .imm32, .to_mut_gpr }, .commute = .{ 0, 1 } },
7371 .{ .src = .{ .mut_mem, .to_gpr } },
7372 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
7373 .{ .src = .{ .to_mut_gpr, .mem } },
7374 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
7375 .{ .src = .{ .to_mut_gpr, .to_gpr } },
7376 },14689 },
7377 .dst_temps = .{.{ .ref = .src0 }},14690 .dst_temps = .{.{ .ref_mask = .{
7378 .clobbers = .{ .eflags = true },14691 .ref = .src0,
7379 .each = .{ .once = switch (cc) {14692 .info = .{ .kind = .all, .scalar = .qword },
7380 else => unreachable,14693 } }},
7381 .e => &.{14694 .each = .{ .once = &.{
7382 .{ ._, ._, .xor, .dst0d, .src1d, ._, ._ },14695 .{ ._, ._pd, .cmp, .dst0x, .src1x, .ui(switch (cc) {
7383 .{ ._, ._, .not, .dst0d, ._, ._, ._ },14696 else => unreachable,
7384 },14697 .e => 0b00000,
7385 .ne => &.{14698 .ne => 0b00100,
7386 .{ ._, ._, .xor, .dst0d, .src1d, ._, ._ },14699 }), ._ },
7387 },
7388 } },14700 } },
7389 }, .{14701 }, .{
7390 .required_features = .{ .@"64bit", null, null, null },14702 .required_features = .{ .avx, null, null, null },
7391 .src_constraints = .{ .{ .bool_vec = .qword }, .{ .bool_vec = .qword } },14703 .src_constraints = .{
14704 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
14705 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
14706 },
7392 .patterns = &.{14707 .patterns = &.{
7393 .{ .src = .{ .mut_mem, .simm32 } },14708 .{ .src = .{ .to_sse, .mem } },
7394 .{ .src = .{ .simm32, .mut_mem }, .commute = .{ 0, 1 } },14709 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7395 .{ .src = .{ .to_mut_gpr, .simm32 } },14710 .{ .src = .{ .to_sse, .to_sse } },
7396 .{ .src = .{ .simm32, .to_mut_gpr }, .commute = .{ 0, 1 } },
7397 .{ .src = .{ .mut_mem, .to_gpr } },
7398 .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } },
7399 .{ .src = .{ .to_mut_gpr, .mem } },
7400 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
7401 .{ .src = .{ .to_mut_gpr, .to_gpr } },
7402 },14711 },
7403 .dst_temps = .{.{ .ref = .src0 }},14712 .dst_temps = .{.{ .mut_rc_mask = .{
7404 .clobbers = .{ .eflags = true },14713 .ref = .src0,
7405 .each = .{ .once = switch (cc) {14714 .rc = .sse,
7406 else => unreachable,14715 .info = .{ .kind = .all, .scalar = .qword },
7407 .e => &.{14716 } }},
7408 .{ ._, ._, .xor, .dst0q, .src1q, ._, ._ },14717 .each = .{ .once = &.{
7409 .{ ._, ._, .not, .dst0q, ._, ._, ._ },14718 .{ ._, .v_pd, .cmp, .dst0y, .src0y, .src1y, .ui(switch (cc) {
7410 },14719 else => unreachable,
7411 .ne => &.{14720 .e => 0b00000,
7412 .{ ._, ._, .xor, .dst0q, .src1q, ._, ._ },14721 .ne => 0b00100,
7413 },14722 }) },
7414 } },14723 } },
7415 }, .{14724 }, .{
7416 .src_constraints = .{ .any_bool_vec, .any_bool_vec },14725 .required_features = .{ .f16c, .slow_incdec, null, null },
14726 .src_constraints = .{
14727 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
14728 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
14729 },
7417 .patterns = &.{14730 .patterns = &.{
7418 .{ .src = .{ .to_mem, .to_mem } },14731 .{ .src = .{ .to_mem, .to_mem } },
7419 },14732 },
7420 .extra_temps = .{14733 .extra_temps = .{
7421 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },14734 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7422 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },14735 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
14736 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
14737 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
14738 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
7423 .unused,14739 .unused,
7424 .unused,14740 .unused,
7425 .unused,14741 .unused,
...@@ -7427,1367 +14743,2028 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -7427,1367 +14743,2028 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
7427 },14743 },
7428 .dst_temps = .{.mem},14744 .dst_temps = .{.mem},
7429 .clobbers = .{ .eflags = true },14745 .clobbers = .{ .eflags = true },
7430 .each = .{ .once = switch (cc) {14746 .each = .{ .once = &.{
7431 else => unreachable,14747 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7432 .e => &.{14748 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
7433 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14749 .{ .@"0:", .v_ps, .cvtph2, .tmp2y, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7434 .{ .@"0:", ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },14750 .{ ._, .v_ps, .cvtph2, .tmp3y, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7435 .{ ._, ._, .xor, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },14751 .{ ._, .v_ps, .cmp, .tmp2y, .tmp2y, .tmp3y, .ui(switch (cc) {
7436 .{ ._, ._, .not, .tmp1p, ._, ._, ._ },14752 else => unreachable,
7437 .{ ._, ._, .mov, .memia(.dst0p, .tmp0, .add_size), .tmp1p, ._, ._ },14753 .e => 0b00000,
7438 .{ ._, ._, .add, .tmp0p, .sa(.tmp1, .add_size), ._, ._ },14754 .ne => 0b00100,
7439 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },14755 }) },
7440 },14756 .{ ._, .v_ps, .movmsk, .tmp4d, .tmp2y, ._, ._ },
7441 .ne => &.{14757 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp4b, ._, ._ },
7442 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14758 .{ ._, ._, .lea, .tmp1p, .lead(.none, .tmp1, 1), ._, ._ },
7443 .{ .@"0:", ._, .mov, .tmp1p, .memia(.src0p, .tmp0, .add_size), ._, ._ },14759 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7444 .{ ._, ._, .xor, .tmp1p, .memia(.src1p, .tmp0, .add_size), ._, ._ },14760 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7445 .{ ._, ._, .mov, .memia(.dst0p, .tmp0, .add_size), .tmp1p, ._, ._ },
7446 .{ ._, ._, .add, .tmp0p, .sa(.tmp1, .add_size), ._, ._ },
7447 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7448 },
7449 } },14761 } },
7450 }, .{14762 }, .{
7451 .required_features = .{ .avx2, null, null, null },14763 .required_features = .{ .f16c, null, null, null },
7452 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },14764 .src_constraints = .{
14765 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
14766 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
14767 },
7453 .patterns = &.{14768 .patterns = &.{
7454 .{ .src = .{ .to_mem, .to_mem } },14769 .{ .src = .{ .to_mem, .to_mem } },
7455 },14770 },
7456 .extra_temps = .{14771 .extra_temps = .{
7457 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },14772 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7458 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },14773 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7459 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },14774 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
7460 .{ .kind = .{ .rc = .sse } },14775 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
14776 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
14777 .unused,
14778 .unused,
7461 .unused,14779 .unused,
7462 .unused,14780 .unused,
7463 },14781 },
7464 .dst_temps = .{.mem},14782 .dst_temps = .{.mem},
7465 .clobbers = .{ .eflags = true },14783 .clobbers = .{ .eflags = true },
7466 .each = .{ .once = switch (cc) {14784 .each = .{ .once = &.{
7467 else => unreachable,14785 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7468 .e => &.{14786 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
7469 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14787 .{ .@"0:", .v_ps, .cvtph2, .tmp2y, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7470 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },14788 .{ ._, .v_ps, .cvtph2, .tmp3y, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7471 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },14789 .{ ._, .v_ps, .cmp, .tmp2y, .tmp2y, .tmp3y, .ui(switch (cc) {
7472 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },14790 else => unreachable,
7473 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },14791 .e => 0b00000,
7474 .{ ._, ._, .mov, .memi(.dst0d, .tmp1), .tmp2d, ._, ._ },14792 .ne => 0b00100,
7475 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },14793 }) },
7476 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },14794 .{ ._, .v_ps, .movmsk, .tmp4d, .tmp2y, ._, ._ },
7477 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },14795 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp4b, ._, ._ },
7478 },14796 .{ ._, ._c, .in, .tmp1p, ._, ._, ._ },
7479 .ne => &.{14797 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7480 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14798 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7481 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7482 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7483 .{ ._, .vp_b, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
7484 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
7485 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
7486 .{ ._, ._, .mov, .memi(.dst0d, .tmp1), .tmp2d, ._, ._ },
7487 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
7488 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7489 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7490 },
7491 } },14799 } },
7492 }, .{14800 }, .{
7493 .required_features = .{ .avx2, null, null, null },14801 .required_features = .{ .avx, .slow_incdec, null, null },
7494 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },14802 .dst_constraints = .{.{ .bool_vec = .dword }},
14803 .src_constraints = .{
14804 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14805 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14806 },
7495 .patterns = &.{14807 .patterns = &.{
7496 .{ .src = .{ .to_mem, .to_mem } },14808 .{ .src = .{ .to_mem, .to_mem } },
7497 },14809 },
14810 .call_frame = .{ .alignment = .@"16" },
7498 .extra_temps = .{14811 .extra_temps = .{
7499 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7500 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },14812 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7501 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },14813 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
7502 .{ .kind = .{ .rc = .sse } },14814 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
14815 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
14816 else => unreachable,
14817 .e => "__eqhf2",
14818 .ne => "__nehf2",
14819 } } } },
14820 .{ .type = .i32, .kind = .{ .reg = .eax } },
14821 .{ .type = .u8, .kind = .{ .reg = .cl } },
14822 .{ .type = .u32, .kind = .{ .reg = .edx } },
7503 .unused,14823 .unused,
7504 .unused,14824 .unused,
7505 },14825 },
7506 .dst_temps = .{.mem},14826 .dst_temps = .{.{ .rc = .general_purpose }},
7507 .clobbers = .{ .eflags = true },14827 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
7508 .each = .{ .once = switch (cc) {14828 .each = .{ .once = &.{
7509 else => unreachable,14829 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
7510 .e => &.{14830 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
7511 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14831 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
7512 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },14832 .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memsi(.src0w, .@"2", .tmp0), .ui(0) },
7513 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },14833 .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memsi(.src1w, .@"2", .tmp0), .ui(0) },
7514 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },14834 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
7515 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },14835 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
7516 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },14836 .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ },
7517 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },14837 .{ ._, .fromCondition(cc), .set, .tmp6b, ._, ._, ._ },
7518 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },14838 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
7519 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },14839 .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ },
7520 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },14840 .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ },
7521 },14841 .{ ._, ._, .add, .tmp0d, .si(1), ._, ._ },
7522 .ne => &.{14842 .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
7523 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14843 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
7524 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7525 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7526 .{ ._, .vp_w, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
7527 .{ ._, .vp_b, .ackssw, .tmp3y, .tmp3y, .tmp3y, ._ },
7528 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3y, ._, ._ },
7529 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
7530 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
7531 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
7532 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7533 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7534 },
7535 } },14844 } },
7536 }, .{14845 }, .{
7537 .required_features = .{ .avx2, null, null, null },14846 .required_features = .{ .avx, null, null, null },
7538 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },14847 .dst_constraints = .{.{ .bool_vec = .dword }},
14848 .src_constraints = .{
14849 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14850 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14851 },
7539 .patterns = &.{14852 .patterns = &.{
7540 .{ .src = .{ .to_mem, .to_mem } },14853 .{ .src = .{ .to_mem, .to_mem } },
7541 },14854 },
14855 .call_frame = .{ .alignment = .@"16" },
7542 .extra_temps = .{14856 .extra_temps = .{
7543 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7544 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },14857 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7545 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },14858 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
7546 .{ .kind = .{ .rc = .sse } },14859 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
14860 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
14861 else => unreachable,
14862 .e => "__eqhf2",
14863 .ne => "__nehf2",
14864 } } } },
14865 .{ .type = .i32, .kind = .{ .reg = .eax } },
14866 .{ .type = .u8, .kind = .{ .reg = .cl } },
14867 .{ .type = .u32, .kind = .{ .reg = .edx } },
7547 .unused,14868 .unused,
7548 .unused,14869 .unused,
7549 },14870 },
7550 .dst_temps = .{.mem},14871 .dst_temps = .{.{ .rc = .general_purpose }},
7551 .clobbers = .{ .eflags = true },14872 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
7552 .each = .{ .once = switch (cc) {14873 .each = .{ .once = &.{
7553 else => unreachable,14874 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
7554 .e => &.{14875 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
7555 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14876 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
7556 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },14877 .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memsi(.src0w, .@"2", .tmp0), .ui(0) },
7557 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },14878 .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memsi(.src1w, .@"2", .tmp0), .ui(0) },
7558 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },14879 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
7559 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },14880 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
7560 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },14881 .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ },
7561 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },14882 .{ ._, .fromCondition(cc), .set, .tmp6b, ._, ._, ._ },
7562 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },14883 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
7563 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },14884 .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ },
7564 },14885 .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ },
7565 .ne => &.{14886 .{ ._, ._c, .in, .tmp0d, ._, ._, ._ },
7566 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14887 .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
7567 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },14888 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
7568 .{ .@"0:", .v_dqu, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7569 .{ ._, .vp_d, .cmpeq, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), ._ },
7570 .{ ._, .v_ps, .movmsk, .tmp2d, .tmp3y, ._, ._ },
7571 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },
7572 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
7573 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
7574 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7575 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7576 },
7577 } },14889 } },
7578 }, .{14890 }, .{
7579 .required_features = .{ .avx2, null, null, null },14891 .required_features = .{ .sse2, .slow_incdec, null, null },
7580 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },14892 .dst_constraints = .{.{ .bool_vec = .dword }},
14893 .src_constraints = .{
14894 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14895 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14896 },
7581 .patterns = &.{14897 .patterns = &.{
7582 .{ .src = .{ .to_mem, .to_mem } },14898 .{ .src = .{ .to_mem, .to_mem } },
7583 },14899 },
14900 .call_frame = .{ .alignment = .@"16" },
7584 .extra_temps = .{14901 .extra_temps = .{
7585 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },14902 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7586 .{ .type = .u32, .kind = .{ .reg = .rcx } },14903 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
7587 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },14904 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
7588 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },14905 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
7589 .{ .kind = .{ .rc = .sse } },14906 else => unreachable,
14907 .e => "__eqhf2",
14908 .ne => "__nehf2",
14909 } } } },
14910 .{ .type = .i32, .kind = .{ .reg = .eax } },
14911 .{ .type = .u8, .kind = .{ .reg = .cl } },
14912 .{ .type = .u32, .kind = .{ .reg = .edx } },
14913 .unused,
7590 .unused,14914 .unused,
7591 },14915 },
7592 .dst_temps = .{.mem},14916 .dst_temps = .{.{ .rc = .general_purpose }},
7593 .clobbers = .{ .eflags = true },14917 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
7594 .each = .{ .once = switch (cc) {14918 .each = .{ .once = &.{
7595 else => unreachable,14919 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
7596 .e => &.{14920 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
7597 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },14921 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
7598 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },14922 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
7599 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },14923 .{ ._, .p_w, .insr, .tmp1x, .memsi(.src0w, .@"2", .tmp0), .ui(0), ._ },
7600 .{ .@"0:", .v_dqu, .mov, .tmp4y, .memia(.src0y, .tmp0, .add_size), ._, ._ },14924 .{ ._, .p_w, .insr, .tmp2x, .memsi(.src1w, .@"2", .tmp0), .ui(0), ._ },
7601 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._ },14925 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
7602 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },14926 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
7603 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },14927 .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ },
7604 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },14928 .{ ._, .fromCondition(cc), .set, .tmp6b, ._, ._, ._ },
7605 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },14929 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
7606 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },14930 .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ },
7607 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },14931 .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ },
7608 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },14932 .{ ._, ._, .add, .tmp0d, .si(1), ._, ._ },
7609 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },14933 .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
7610 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },14934 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
7611 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
7612 .{ .@"1:", ._, .add, .tmp0p, .si(32), ._, ._ },
7613 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7614 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
7615 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
7616 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
7617 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
7618 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
7619 },
7620 .ne => &.{
7621 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7622 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7623 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
7624 .{ .@"0:", .v_dqu, .mov, .tmp4y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7625 .{ ._, .vp_q, .cmpeq, .tmp4y, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._ },
7626 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4y, ._, ._ },
7627 .{ ._, ._, .xor, .tmp3b, .si(0b1111), ._, ._ },
7628 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
7629 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
7630 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
7631 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
7632 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
7633 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
7634 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
7635 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
7636 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
7637 .{ .@"1:", ._, .add, .tmp0p, .si(32), ._, ._ },
7638 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7639 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
7640 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
7641 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
7642 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
7643 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
7644 },
7645 } },14935 } },
7646 }, .{14936 }, .{
7647 .required_features = .{ .avx, null, null, null },14937 .required_features = .{ .sse2, null, null, null },
7648 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },14938 .dst_constraints = .{.{ .bool_vec = .dword }},
14939 .src_constraints = .{
14940 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14941 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14942 },
7649 .patterns = &.{14943 .patterns = &.{
7650 .{ .src = .{ .to_mem, .to_mem } },14944 .{ .src = .{ .to_mem, .to_mem } },
7651 },14945 },
14946 .call_frame = .{ .alignment = .@"16" },
7652 .extra_temps = .{14947 .extra_temps = .{
7653 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7654 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },14948 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7655 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },14949 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
7656 .{ .kind = .{ .rc = .sse } },14950 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
14951 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
14952 else => unreachable,
14953 .e => "__eqhf2",
14954 .ne => "__nehf2",
14955 } } } },
14956 .{ .type = .i32, .kind = .{ .reg = .eax } },
14957 .{ .type = .u8, .kind = .{ .reg = .cl } },
14958 .{ .type = .u32, .kind = .{ .reg = .edx } },
14959 .unused,
14960 .unused,
14961 },
14962 .dst_temps = .{.{ .rc = .general_purpose }},
14963 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
14964 .each = .{ .once = &.{
14965 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
14966 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
14967 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
14968 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
14969 .{ ._, .p_w, .insr, .tmp1x, .memsi(.src0w, .@"2", .tmp0), .ui(0), ._ },
14970 .{ ._, .p_w, .insr, .tmp2x, .memsi(.src1w, .@"2", .tmp0), .ui(0), ._ },
14971 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
14972 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
14973 .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ },
14974 .{ ._, .fromCondition(cc), .set, .tmp6b, ._, ._, ._ },
14975 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
14976 .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ },
14977 .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ },
14978 .{ ._, ._c, .in, .tmp0d, ._, ._, ._ },
14979 .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
14980 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
14981 } },
14982 }, .{
14983 .required_features = .{ .sse, .slow_incdec, null, null },
14984 .dst_constraints = .{.{ .bool_vec = .dword }},
14985 .src_constraints = .{
14986 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14987 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
14988 },
14989 .patterns = &.{
14990 .{ .src = .{ .to_mem, .to_mem } },
14991 },
14992 .call_frame = .{ .alignment = .@"16" },
14993 .extra_temps = .{
14994 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
14995 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
14996 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
14997 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
14998 else => unreachable,
14999 .e => "__eqhf2",
15000 .ne => "__nehf2",
15001 } } } },
15002 .{ .type = .i32, .kind = .{ .reg = .eax } },
15003 .{ .type = .u8, .kind = .{ .reg = .cl } },
15004 .{ .type = .u32, .kind = .{ .reg = .edx } },
15005 .{ .type = .vector_8_f16, .kind = .mem },
15006 .unused,
15007 },
15008 .dst_temps = .{.{ .rc = .general_purpose }},
15009 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
15010 .each = .{ .once = &.{
15011 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
15012 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
15013 .{ .@"0:", ._, .movzx, .tmp4d, .memsi(.src0w, .@"2", .tmp0), ._, ._ },
15014 .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ },
15015 .{ ._, ._ps, .mova, .tmp1x, .mem(.tmp7x), ._, ._ },
15016 .{ ._, ._, .movzx, .tmp4d, .memsi(.src1w, .@"2", .tmp0), ._, ._ },
15017 .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ },
15018 .{ ._, ._ps, .mova, .tmp2x, .mem(.tmp7x), ._, ._ },
15019 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
15020 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
15021 .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ },
15022 .{ ._, .fromCondition(cc), .set, .tmp6b, ._, ._, ._ },
15023 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15024 .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ },
15025 .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ },
15026 .{ ._, ._, .add, .tmp0d, .si(1), ._, ._ },
15027 .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
15028 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
15029 } },
15030 }, .{
15031 .required_features = .{ .sse, null, null, null },
15032 .dst_constraints = .{.{ .bool_vec = .dword }},
15033 .src_constraints = .{
15034 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15035 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15036 },
15037 .patterns = &.{
15038 .{ .src = .{ .to_mem, .to_mem } },
15039 },
15040 .call_frame = .{ .alignment = .@"16" },
15041 .extra_temps = .{
15042 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
15043 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
15044 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
15045 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
15046 else => unreachable,
15047 .e => "__eqhf2",
15048 .ne => "__nehf2",
15049 } } } },
15050 .{ .type = .i32, .kind = .{ .reg = .eax } },
15051 .{ .type = .u8, .kind = .{ .reg = .cl } },
15052 .{ .type = .u32, .kind = .{ .reg = .edx } },
15053 .{ .type = .vector_8_f16, .kind = .mem },
7657 .unused,15054 .unused,
15055 },
15056 .dst_temps = .{.{ .rc = .general_purpose }},
15057 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
15058 .each = .{ .once = &.{
15059 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
15060 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
15061 .{ .@"0:", ._, .movzx, .tmp4d, .memsi(.src0w, .@"2", .tmp0), ._, ._ },
15062 .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ },
15063 .{ ._, ._ps, .mova, .tmp1x, .mem(.tmp7x), ._, ._ },
15064 .{ ._, ._, .movzx, .tmp4d, .memsi(.src1w, .@"2", .tmp0), ._, ._ },
15065 .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ },
15066 .{ ._, ._ps, .mova, .tmp2x, .mem(.tmp7x), ._, ._ },
15067 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
15068 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
15069 .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ },
15070 .{ ._, .fromCondition(cc), .set, .tmp6b, ._, ._, ._ },
15071 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15072 .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ },
15073 .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ },
15074 .{ ._, ._c, .in, .tmp0d, ._, ._, ._ },
15075 .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
15076 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
15077 } },
15078 }, .{
15079 .required_features = .{ .@"64bit", .avx, .slow_incdec, null },
15080 .src_constraints = .{
15081 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15082 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15083 },
15084 .patterns = &.{
15085 .{ .src = .{ .to_mem, .to_mem } },
15086 },
15087 .call_frame = .{ .alignment = .@"16" },
15088 .extra_temps = .{
15089 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
15090 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
15091 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
15092 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
15093 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
15094 else => unreachable,
15095 .e => "__eqhf2",
15096 .ne => "__nehf2",
15097 } } } },
15098 .{ .type = .i32, .kind = .{ .reg = .eax } },
15099 .{ .type = .u8, .kind = .{ .reg = .cl } },
15100 .{ .type = .u64, .kind = .{ .reg = .rdx } },
7658 .unused,15101 .unused,
7659 },15102 },
7660 .dst_temps = .{.mem},15103 .dst_temps = .{.mem},
7661 .clobbers = .{ .eflags = true },15104 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
7662 .each = .{ .once = switch (cc) {15105 .each = .{ .once = &.{
7663 else => unreachable,15106 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
7664 .e => &.{15107 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7665 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15108 .{ .@"0:", .vp_, .xor, .tmp3x, .tmp3x, .tmp3x, ._ },
7666 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15109 .{ ._, .vp_w, .insr, .tmp2x, .tmp3x, .memsi(.src0w, .@"2", .tmp0), .ui(0) },
7667 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15110 .{ ._, .vp_w, .insr, .tmp3x, .tmp3x, .memsi(.src1w, .@"2", .tmp0), .ui(0) },
7668 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },15111 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
7669 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },15112 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
7670 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },15113 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
7671 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },15114 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
7672 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },15115 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
7673 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15116 .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ },
7674 },15117 .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ },
7675 .ne => &.{15118 .{ ._, ._, .lea, .tmp0d, .lead(.none, .tmp0, 1), ._, ._ },
7676 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15119 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
7677 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15120 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
7678 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15121 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
7679 .{ ._, .vp_b, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },15122 .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ },
7680 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },15123 .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ },
7681 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },15124 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7682 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },15125 .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
7683 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },15126 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
7684 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },15127 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
7685 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15128 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
7686 },15129 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15130 .{ ._, ._r, .sh, .tmp5d, .si(9), ._, ._ },
15131 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp5), .tmp1q, ._, ._ },
7687 } },15132 } },
7688 }, .{15133 }, .{
7689 .required_features = .{ .avx, null, null, null },15134 .required_features = .{ .@"64bit", .avx, null, null },
7690 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },15135 .src_constraints = .{
15136 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15137 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15138 },
7691 .patterns = &.{15139 .patterns = &.{
7692 .{ .src = .{ .to_mem, .to_mem } },15140 .{ .src = .{ .to_mem, .to_mem } },
7693 },15141 },
15142 .call_frame = .{ .alignment = .@"16" },
7694 .extra_temps = .{15143 .extra_temps = .{
7695 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7696 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },15144 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7697 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15145 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7698 .{ .kind = .{ .rc = .sse } },15146 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
15147 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
15148 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
15149 else => unreachable,
15150 .e => "__eqhf2",
15151 .ne => "__nehf2",
15152 } } } },
15153 .{ .type = .i32, .kind = .{ .reg = .eax } },
15154 .{ .type = .u8, .kind = .{ .reg = .cl } },
15155 .{ .type = .u64, .kind = .{ .reg = .rdx } },
7699 .unused,15156 .unused,
15157 },
15158 .dst_temps = .{.mem},
15159 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
15160 .each = .{ .once = &.{
15161 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
15162 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
15163 .{ .@"0:", .vp_, .xor, .tmp3x, .tmp3x, .tmp3x, ._ },
15164 .{ ._, .vp_w, .insr, .tmp2x, .tmp3x, .memsi(.src0w, .@"2", .tmp0), .ui(0) },
15165 .{ ._, .vp_w, .insr, .tmp3x, .tmp3x, .memsi(.src1w, .@"2", .tmp0), .ui(0) },
15166 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
15167 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
15168 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
15169 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
15170 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
15171 .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ },
15172 .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ },
15173 .{ ._, ._c, .in, .tmp0d, ._, ._, ._ },
15174 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
15175 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
15176 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15177 .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ },
15178 .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ },
15179 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
15180 .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
15181 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
15182 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
15183 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
15184 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15185 .{ ._, ._r, .sh, .tmp5d, .si(9), ._, ._ },
15186 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp5), .tmp1q, ._, ._ },
15187 } },
15188 }, .{
15189 .required_features = .{ .@"64bit", .sse2, .slow_incdec, null },
15190 .src_constraints = .{
15191 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15192 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15193 },
15194 .patterns = &.{
15195 .{ .src = .{ .to_mem, .to_mem } },
15196 },
15197 .call_frame = .{ .alignment = .@"16" },
15198 .extra_temps = .{
15199 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
15200 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
15201 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
15202 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
15203 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
15204 else => unreachable,
15205 .e => "__eqhf2",
15206 .ne => "__nehf2",
15207 } } } },
15208 .{ .type = .i32, .kind = .{ .reg = .eax } },
15209 .{ .type = .u8, .kind = .{ .reg = .cl } },
15210 .{ .type = .u64, .kind = .{ .reg = .rdx } },
7700 .unused,15211 .unused,
7701 },15212 },
7702 .dst_temps = .{.mem},15213 .dst_temps = .{.mem},
7703 .clobbers = .{ .eflags = true },15214 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
7704 .each = .{ .once = switch (cc) {15215 .each = .{ .once = &.{
7705 else => unreachable,15216 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
7706 .e => &.{15217 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7707 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15218 .{ .@"0:", .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
7708 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15219 .{ ._, .p_w, .insr, .tmp2x, .memsi(.src0w, .@"2", .tmp0), .ui(0), ._ },
7709 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15220 .{ ._, .p_, .xor, .tmp3x, .tmp3x, ._, ._ },
7710 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },15221 .{ ._, .p_w, .insr, .tmp3x, .memsi(.src1w, .@"2", .tmp0), .ui(0), ._ },
7711 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },15222 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
7712 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },15223 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
7713 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },15224 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
7714 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },15225 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
7715 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },15226 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
7716 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15227 .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ },
7717 },15228 .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ },
7718 .ne => &.{15229 .{ ._, ._, .lea, .tmp0d, .lead(.none, .tmp0, 1), ._, ._ },
7719 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15230 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
7720 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15231 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
7721 .{ .@"0:", .v_dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15232 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
7722 .{ ._, .vp_w, .cmpeq, .tmp3x, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._ },15233 .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ },
7723 .{ ._, .vp_b, .ackssw, .tmp3x, .tmp3x, .tmp3x, ._ },15234 .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ },
7724 .{ ._, .vp_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },15235 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7725 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },15236 .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
7726 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },15237 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
7727 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },15238 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
7728 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },15239 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
7729 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15240 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
7730 },15241 .{ ._, ._r, .sh, .tmp5d, .si(9), ._, ._ },
15242 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp5), .tmp1q, ._, ._ },
7731 } },15243 } },
7732 }, .{15244 }, .{
7733 .required_features = .{ .avx, null, null, null },15245 .required_features = .{ .@"64bit", .sse2, null, null },
7734 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },15246 .src_constraints = .{
15247 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15248 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15249 },
7735 .patterns = &.{15250 .patterns = &.{
7736 .{ .src = .{ .to_mem, .to_mem } },15251 .{ .src = .{ .to_mem, .to_mem } },
7737 },15252 },
15253 .call_frame = .{ .alignment = .@"16" },
7738 .extra_temps = .{15254 .extra_temps = .{
7739 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15255 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7740 .{ .type = .u32, .kind = .{ .reg = .rcx } },15256 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7741 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15257 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
7742 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15258 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
7743 .{ .kind = .{ .rc = .sse } },15259 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
15260 else => unreachable,
15261 .e => "__eqhf2",
15262 .ne => "__nehf2",
15263 } } } },
15264 .{ .type = .i32, .kind = .{ .reg = .eax } },
15265 .{ .type = .u8, .kind = .{ .reg = .cl } },
15266 .{ .type = .u64, .kind = .{ .reg = .rdx } },
7744 .unused,15267 .unused,
7745 },15268 },
7746 .dst_temps = .{.mem},15269 .dst_temps = .{.mem},
7747 .clobbers = .{ .eflags = true },15270 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
7748 .each = .{ .once = switch (cc) {15271 .each = .{ .once = &.{
7749 else => unreachable,15272 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
7750 .e => &.{15273 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7751 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15274 .{ .@"0:", .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
7752 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15275 .{ ._, .p_w, .insr, .tmp2x, .memsi(.src0w, .@"2", .tmp0), .ui(0), ._ },
7753 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15276 .{ ._, .p_, .xor, .tmp3x, .tmp3x, ._, ._ },
7754 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15277 .{ ._, .p_w, .insr, .tmp3x, .memsi(.src1w, .@"2", .tmp0), .ui(0), ._ },
7755 .{ ._, .vp_d, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },15278 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
7756 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },15279 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
7757 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },15280 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
7758 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },15281 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
7759 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },15282 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
7760 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15283 .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ },
7761 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },15284 .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ },
7762 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },15285 .{ ._, ._c, .in, .tmp0d, ._, ._, ._ },
7763 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },15286 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
7764 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },15287 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
7765 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15288 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
7766 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },15289 .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ },
7767 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15290 .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ },
7768 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15291 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7769 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },15292 .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
7770 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },15293 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
7771 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },15294 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
7772 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },15295 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
7773 },15296 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
7774 .ne => &.{15297 .{ ._, ._r, .sh, .tmp5d, .si(9), ._, ._ },
7775 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15298 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp5), .tmp1q, ._, ._ },
7776 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15299 } },
7777 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15300 }, .{
7778 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15301 .required_features = .{ .@"64bit", .sse, .slow_incdec, null },
7779 .{ ._, .vp_d, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },15302 .src_constraints = .{
7780 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },15303 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
7781 .{ ._, ._, .xor, .tmp3b, .si(0b1111), ._, ._ },15304 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
7782 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },15305 },
7783 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },15306 .patterns = &.{
7784 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },15307 .{ .src = .{ .to_mem, .to_mem } },
7785 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15308 },
7786 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },15309 .call_frame = .{ .alignment = .@"16" },
7787 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },15310 .extra_temps = .{
7788 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },15311 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7789 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },15312 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7790 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15313 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
7791 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },15314 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
7792 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15315 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
7793 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15316 else => unreachable,
7794 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },15317 .e => "__eqhf2",
7795 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },15318 .ne => "__nehf2",
7796 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },15319 } } } },
7797 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },15320 .{ .type = .i32, .kind = .{ .reg = .eax } },
7798 },15321 .{ .type = .u8, .kind = .{ .reg = .cl } },
15322 .{ .type = .u64, .kind = .{ .reg = .rdx } },
15323 .{ .type = .vector_8_f16, .kind = .mem },
15324 },
15325 .dst_temps = .{.mem},
15326 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
15327 .each = .{ .once = &.{
15328 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
15329 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
15330 .{ .@"0:", ._, .movzx, .tmp5d, .memsi(.src0w, .@"2", .tmp0), ._, ._ },
15331 .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ },
15332 .{ ._, ._ps, .mova, .tmp2x, .mem(.tmp8x), ._, ._ },
15333 .{ ._, ._, .movzx, .tmp5d, .memsi(.src1w, .@"2", .tmp0), ._, ._ },
15334 .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ },
15335 .{ ._, ._ps, .mova, .tmp3x, .mem(.tmp8x), ._, ._ },
15336 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
15337 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
15338 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
15339 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
15340 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
15341 .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ },
15342 .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ },
15343 .{ ._, ._, .lea, .tmp0d, .lead(.none, .tmp0, 1), ._, ._ },
15344 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
15345 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
15346 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15347 .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ },
15348 .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ },
15349 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
15350 .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
15351 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
15352 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
15353 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
15354 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15355 .{ ._, ._r, .sh, .tmp5d, .si(9), ._, ._ },
15356 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp5), .tmp1q, ._, ._ },
7799 } },15357 } },
7800 }, .{15358 }, .{
7801 .required_features = .{ .avx, null, null, null },15359 .required_features = .{ .@"64bit", .sse, null, null },
7802 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },15360 .src_constraints = .{
15361 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15362 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
15363 },
15364 .patterns = &.{
15365 .{ .src = .{ .to_mem, .to_mem } },
15366 },
15367 .call_frame = .{ .alignment = .@"16" },
15368 .extra_temps = .{
15369 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
15370 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
15371 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
15372 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
15373 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
15374 else => unreachable,
15375 .e => "__eqhf2",
15376 .ne => "__nehf2",
15377 } } } },
15378 .{ .type = .i32, .kind = .{ .reg = .eax } },
15379 .{ .type = .u8, .kind = .{ .reg = .cl } },
15380 .{ .type = .u64, .kind = .{ .reg = .rdx } },
15381 .{ .type = .vector_8_f16, .kind = .mem },
15382 },
15383 .dst_temps = .{.mem},
15384 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
15385 .each = .{ .once = &.{
15386 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
15387 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
15388 .{ .@"0:", ._, .movzx, .tmp5d, .memsi(.src0w, .@"2", .tmp0), ._, ._ },
15389 .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ },
15390 .{ ._, ._ps, .mova, .tmp2x, .mem(.tmp8x), ._, ._ },
15391 .{ ._, ._, .movzx, .tmp5d, .memsi(.src1w, .@"2", .tmp0), ._, ._ },
15392 .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ },
15393 .{ ._, ._ps, .mova, .tmp3x, .mem(.tmp8x), ._, ._ },
15394 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
15395 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
15396 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
15397 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
15398 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
15399 .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ },
15400 .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ },
15401 .{ ._, ._c, .in, .tmp0d, ._, ._, ._ },
15402 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
15403 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
15404 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15405 .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ },
15406 .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ },
15407 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
15408 .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ },
15409 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
15410 .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ },
15411 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
15412 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
15413 .{ ._, ._r, .sh, .tmp5d, .si(9), ._, ._ },
15414 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp5), .tmp1q, ._, ._ },
15415 } },
15416 }, .{
15417 .required_features = .{ .avx, .slow_incdec, null, null },
15418 .src_constraints = .{
15419 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
15420 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
15421 },
7803 .patterns = &.{15422 .patterns = &.{
7804 .{ .src = .{ .to_mem, .to_mem } },15423 .{ .src = .{ .to_mem, .to_mem } },
7805 },15424 },
7806 .extra_temps = .{15425 .extra_temps = .{
7807 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15426 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7808 .{ .type = .u32, .kind = .{ .reg = .rcx } },15427 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7809 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15428 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
7810 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15429 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
7811 .{ .kind = .{ .rc = .sse } },15430 .unused,
15431 .unused,
15432 .unused,
15433 .unused,
7812 .unused,15434 .unused,
7813 },15435 },
7814 .dst_temps = .{.mem},15436 .dst_temps = .{.mem},
7815 .clobbers = .{ .eflags = true },15437 .clobbers = .{ .eflags = true },
7816 .each = .{ .once = switch (cc) {15438 .each = .{ .once = &.{
7817 else => unreachable,15439 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7818 .e => &.{15440 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
7819 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15441 .{ .@"0:", .v_ps, .mova, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7820 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15442 .{ ._, .v_ps, .cmp, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), .ui(switch (cc) {
7821 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15443 else => unreachable,
7822 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15444 .e => 0b00000,
7823 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },15445 .ne => 0b00100,
7824 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },15446 }) },
7825 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },15447 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp2y, ._, ._ },
7826 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },15448 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp3b, ._, ._ },
7827 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },15449 .{ ._, ._, .lea, .tmp1p, .lead(.none, .tmp1, 1), ._, ._ },
7828 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15450 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7829 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },15451 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7830 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
7831 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
7832 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
7833 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
7834 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
7835 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7836 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
7837 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
7838 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
7839 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
7840 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
7841 },
7842 .ne => &.{
7843 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7844 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7845 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
7846 .{ .@"0:", .v_dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7847 .{ ._, .vp_q, .cmpeq, .tmp4x, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._ },
7848 .{ ._, .v_pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
7849 .{ ._, ._, .xor, .tmp3b, .si(0b11), ._, ._ },
7850 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
7851 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
7852 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
7853 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
7854 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
7855 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
7856 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
7857 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
7858 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
7859 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
7860 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7861 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
7862 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
7863 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
7864 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
7865 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
7866 },
7867 } },15452 } },
7868 }, .{15453 }, .{
7869 .required_features = .{ .sse2, null, null, null },15454 .required_features = .{ .avx, null, null, null },
7870 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },15455 .src_constraints = .{
15456 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
15457 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
15458 },
7871 .patterns = &.{15459 .patterns = &.{
7872 .{ .src = .{ .to_mem, .to_mem } },15460 .{ .src = .{ .to_mem, .to_mem } },
7873 },15461 },
7874 .extra_temps = .{15462 .extra_temps = .{
7875 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15463 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7876 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },15464 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7877 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },15465 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
7878 .{ .kind = .{ .rc = .sse } },15466 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
15467 .unused,
15468 .unused,
15469 .unused,
7879 .unused,15470 .unused,
7880 .unused,15471 .unused,
7881 },15472 },
7882 .dst_temps = .{.mem},15473 .dst_temps = .{.mem},
7883 .clobbers = .{ .eflags = true },15474 .clobbers = .{ .eflags = true },
7884 .each = .{ .once = switch (cc) {15475 .each = .{ .once = &.{
7885 else => unreachable,15476 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7886 .e => &.{15477 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
7887 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15478 .{ .@"0:", .v_ps, .mova, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7888 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15479 .{ ._, .v_ps, .cmp, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), .ui(switch (cc) {
7889 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15480 else => unreachable,
7890 .{ ._, .p_b, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },15481 .e => 0b00000,
7891 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },15482 .ne => 0b00100,
7892 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },15483 }) },
7893 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },15484 .{ ._, .v_ps, .movmsk, .tmp3d, .tmp2y, ._, ._ },
7894 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },15485 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp3b, ._, ._ },
7895 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15486 .{ ._, ._c, .in, .tmp1q, ._, ._, ._ },
7896 },15487 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7897 .ne => &.{15488 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7898 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7899 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7900 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7901 .{ ._, .p_b, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7902 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },
7903 .{ ._, ._, .not, .tmp2d, ._, ._, ._ },
7904 .{ ._, ._, .mov, .memi(.dst0w, .tmp1), .tmp2w, ._, ._ },
7905 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
7906 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7907 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7908 },
7909 } },15489 } },
7910 }, .{15490 }, .{
7911 .required_features = .{ .sse2, null, null, null },15491 .required_features = .{ .sse2, null, null, null },
7912 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },15492 .src_constraints = .{
15493 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
15494 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
15495 },
7913 .patterns = &.{15496 .patterns = &.{
7914 .{ .src = .{ .to_mem, .to_mem } },15497 .{ .src = .{ .to_mem, .to_mem } },
7915 },15498 },
7916 .extra_temps = .{15499 .extra_temps = .{
7917 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15500 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7918 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },15501 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
15502 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
15503 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
7919 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15504 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
7920 .{ .kind = .{ .rc = .sse } },15505 .unused,
15506 .unused,
7921 .unused,15507 .unused,
7922 .unused,15508 .unused,
7923 },15509 },
7924 .dst_temps = .{.mem},15510 .dst_temps = .{.mem},
7925 .clobbers = .{ .eflags = true },15511 .clobbers = .{ .eflags = true },
7926 .each = .{ .once = switch (cc) {15512 .each = .{ .once = &.{
7927 else => unreachable,15513 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7928 .e => &.{15514 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
7929 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15515 .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7930 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15516 .{ ._, ._ps, .mova, .tmp3x, .memiad(.src0x, .tmp0, .add_size, 16), ._, ._ },
7931 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15517 .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .ui(switch (cc) {
7932 .{ ._, .p_w, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },15518 else => unreachable,
7933 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },15519 .e => 0b00000,
7934 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },15520 .ne => 0b00100,
7935 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },15521 }), ._ },
7936 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },15522 .{ ._, ._ps, .cmp, .tmp3x, .memiad(.src1x, .tmp0, .add_size, 16), .ui(switch (cc) {
7937 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },15523 else => unreachable,
7938 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15524 .e => 0b00000,
7939 },15525 .ne => 0b00100,
7940 .ne => &.{15526 }), ._ },
7941 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15527 .{ ._, .p_w, .ackssd, .tmp2x, .tmp3x, ._, ._ },
7942 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15528 .{ ._, .p_b, .ackssw, .tmp2x, .tmp2x, ._, ._ },
7943 .{ .@"0:", ._dqu, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15529 .{ ._, .p_b, .movmsk, .tmp4d, .tmp2x, ._, ._ },
7944 .{ ._, .p_w, .cmpeq, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },15530 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp4b, ._, ._ },
7945 .{ ._, .p_b, .ackssw, .tmp3x, .tmp3x, ._, ._ },15531 .{ ._, ._, .lea, .tmp1p, .lead(.none, .tmp1, 1), ._, ._ },
7946 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3x, ._, ._ },15532 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7947 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },15533 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7948 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },
7949 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
7950 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7951 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7952 },
7953 } },15534 } },
7954 }, .{15535 }, .{
7955 .required_features = .{ .sse2, null, null, null },15536 .required_features = .{ .sse, null, null, null },
7956 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },15537 .src_constraints = .{
15538 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
15539 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
15540 },
7957 .patterns = &.{15541 .patterns = &.{
7958 .{ .src = .{ .to_mem, .to_mem } },15542 .{ .src = .{ .to_mem, .to_mem } },
7959 },15543 },
7960 .extra_temps = .{15544 .extra_temps = .{
7961 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15545 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7962 .{ .type = .u32, .kind = .{ .reg = .rcx } },15546 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
15547 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
7963 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15548 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
7964 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15549 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
7965 .{ .kind = .{ .rc = .sse } },15550 .unused,
15551 .unused,
15552 .unused,
7966 .unused,15553 .unused,
7967 },15554 },
7968 .dst_temps = .{.mem},15555 .dst_temps = .{.mem},
7969 .clobbers = .{ .eflags = true },15556 .clobbers = .{ .eflags = true },
7970 .each = .{ .once = switch (cc) {15557 .each = .{ .once = &.{
7971 else => unreachable,15558 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7972 .e => &.{15559 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
7973 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15560 .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7974 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15561 .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .ui(switch (cc) {
7975 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15562 else => unreachable,
7976 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15563 .e => 0b00000,
7977 .{ ._, .p_d, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },15564 .ne => 0b00100,
7978 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },15565 }), ._ },
7979 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },15566 .{ ._, ._ps, .movmsk, .tmp3d, .tmp2x, ._, ._ },
7980 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },15567 .{ ._, ._ps, .mova, .tmp2x, .memiad(.src0x, .tmp0, .add_size, 16), ._, ._ },
7981 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },15568 .{ ._, ._ps, .cmp, .tmp2x, .memiad(.src1x, .tmp0, .add_size, 16), .ui(switch (cc) {
7982 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15569 else => unreachable,
7983 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },15570 .e => 0b00000,
7984 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },15571 .ne => 0b00100,
7985 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },15572 }), ._ },
7986 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },15573 .{ ._, ._ps, .movmsk, .tmp4d, .tmp2x, ._, ._ },
7987 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15574 .{ ._, ._l, .sh, .tmp4b, .ui(4), ._, ._ },
7988 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },15575 .{ ._, ._, .@"or", .tmp3b, .tmp4b, ._, ._ },
7989 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15576 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp3b, ._, ._ },
7990 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15577 .{ ._, ._, .lea, .tmp1p, .lead(.none, .tmp1, 1), ._, ._ },
7991 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },15578 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7992 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },15579 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7993 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
7994 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
7995 },
7996 .ne => &.{
7997 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7998 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
7999 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
8000 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8001 .{ ._, .p_d, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8002 .{ ._, ._ps, .movmsk, .tmp3d, .tmp4x, ._, ._ },
8003 .{ ._, ._, .xor, .tmp3b, .si(0b1111), ._, ._ },
8004 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
8005 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
8006 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
8007 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8008 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
8009 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
8010 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
8011 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
8012 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
8013 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
8014 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8015 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8016 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
8017 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
8018 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
8019 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
8020 },
8021 } },15580 } },
8022 }, .{15581 }, .{
8023 .required_features = .{ .sse4_1, null, null, null },15582 .required_features = .{ .sse, null, null, null },
8024 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },15583 .src_constraints = .{
15584 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
15585 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
15586 },
8025 .patterns = &.{15587 .patterns = &.{
8026 .{ .src = .{ .to_mem, .to_mem } },15588 .{ .src = .{ .to_mem, .to_mem } },
8027 },15589 },
8028 .extra_temps = .{15590 .extra_temps = .{
8029 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15591 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8030 .{ .type = .u32, .kind = .{ .reg = .rcx } },15592 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
15593 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
8031 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15594 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8032 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15595 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8033 .{ .kind = .{ .rc = .sse } },15596 .unused,
15597 .unused,
15598 .unused,
8034 .unused,15599 .unused,
8035 },15600 },
8036 .dst_temps = .{.mem},15601 .dst_temps = .{.mem},
8037 .clobbers = .{ .eflags = true },15602 .clobbers = .{ .eflags = true },
8038 .each = .{ .once = switch (cc) {15603 .each = .{ .once = &.{
8039 else => unreachable,15604 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8040 .e => &.{15605 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
8041 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15606 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
8042 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15607 .{ .@"0:", ._ps, .mova, .tmp2x, .memiad(.src0x, .tmp0, .add_size, -16), ._, ._ },
8043 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15608 .{ ._, ._ps, .cmp, .tmp2x, .memiad(.src1x, .tmp0, .add_size, -16), .ui(switch (cc) {
8044 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },15609 else => unreachable,
8045 .{ ._, .p_q, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },15610 .e => 0b00000,
8046 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },15611 .ne => 0b00100,
8047 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },15612 }), ._ },
8048 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },15613 .{ ._, ._ps, .movmsk, .tmp4d, .tmp2x, ._, ._ },
8049 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },15614 .{ ._, ._l, .sh, .tmp4b, .ui(4), ._, ._ },
8050 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15615 .{ ._, ._, .@"or", .tmp3b, .tmp4b, ._, ._ },
8051 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },15616 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp3b, ._, ._ },
8052 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },15617 .{ ._, ._, .lea, .tmp1p, .lead(.none, .tmp1, 1), ._, ._ },
8053 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },15618 .{ .@"1:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8054 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },15619 .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .ui(switch (cc) {
8055 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15620 else => unreachable,
8056 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },15621 .e => 0b00000,
8057 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15622 .ne => 0b00100,
8058 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15623 }), ._ },
8059 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },15624 .{ ._, ._ps, .movmsk, .tmp3d, .tmp2x, ._, ._ },
8060 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },15625 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8061 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },15626 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8062 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },15627 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp3b, ._, ._ },
8063 },
8064 .ne => &.{
8065 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8066 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8067 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
8068 .{ .@"0:", ._dqu, .mov, .tmp4x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8069 .{ ._, .p_q, .cmpeq, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8070 .{ ._, ._pd, .movmsk, .tmp3d, .tmp4x, ._, ._ },
8071 .{ ._, ._, .xor, .tmp3b, .si(0b11), ._, ._ },
8072 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
8073 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
8074 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
8075 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8076 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
8077 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
8078 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
8079 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
8080 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
8081 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
8082 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8083 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8084 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
8085 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
8086 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },
8087 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
8088 },
8089 } },15628 } },
8090 }, .{15629 }, .{
8091 .required_features = .{ .sse, .mmx, null, null },15630 .required_features = .{ .avx, .slow_incdec, null, null },
8092 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },15631 .src_constraints = .{
15632 .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } },
15633 .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } },
15634 },
8093 .patterns = &.{15635 .patterns = &.{
8094 .{ .src = .{ .to_mem, .to_mem } },15636 .{ .src = .{ .to_mem, .to_mem } },
8095 },15637 },
8096 .extra_temps = .{15638 .extra_temps = .{
8097 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15639 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8098 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },15640 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
15641 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
15642 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
8099 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15643 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8100 .{ .kind = .{ .rc = .mmx } },15644 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
15645 .unused,
8101 .unused,15646 .unused,
8102 .unused,15647 .unused,
8103 },15648 },
8104 .dst_temps = .{.mem},15649 .dst_temps = .{.mem},
8105 .clobbers = .{ .eflags = true },15650 .clobbers = .{ .eflags = true },
8106 .each = .{ .once = switch (cc) {15651 .each = .{ .once = &.{
8107 else => unreachable,15652 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8108 .e => &.{15653 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
8109 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15654 .{ .@"0:", .v_pd, .mova, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
8110 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15655 .{ ._, .v_pd, .mova, .tmp3y, .memiad(.src0y, .tmp0, .add_size, 32), ._, ._ },
8111 .{ .@"0:", ._q, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },15656 .{ ._, .v_pd, .cmp, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), .ui(switch (cc) {
8112 .{ ._, .p_b, .cmpeq, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },15657 else => unreachable,
8113 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },15658 .e => 0b00000,
8114 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },15659 .ne => 0b00100,
8115 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },15660 }) },
8116 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },15661 .{ ._, .v_pd, .cmp, .tmp3y, .tmp3y, .memiad(.src1y, .tmp0, .add_size, 32), .ui(switch (cc) {
8117 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15662 else => unreachable,
8118 },15663 .e => 0b00000,
8119 .ne => &.{15664 .ne => 0b00100,
8120 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15665 }) },
8121 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15666 .{ ._, .v_pd, .movmsk, .tmp4d, .tmp2y, ._, ._ },
8122 .{ .@"0:", ._q, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },15667 .{ ._, .v_pd, .movmsk, .tmp5d, .tmp3y, ._, ._ },
8123 .{ ._, .p_b, .cmpeq, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },15668 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
8124 .{ ._, .p_b, .movmsk, .tmp2d, .tmp3q, ._, ._ },15669 .{ ._, ._, .@"or", .tmp4b, .tmp5b, ._, ._ },
8125 .{ ._, ._, .not, .tmp2b, ._, ._, ._ },15670 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp4b, ._, ._ },
8126 .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ },15671 .{ ._, ._, .lea, .tmp1p, .lead(.none, .tmp1, 1), ._, ._ },
8127 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },15672 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8128 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },15673 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8129 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8130 },
8131 } },15674 } },
8132 }, .{15675 }, .{
8133 .required_features = .{ .sse, .mmx, null, null },15676 .required_features = .{ .avx, null, null, null },
8134 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },15677 .src_constraints = .{
15678 .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } },
15679 .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } },
15680 },
8135 .patterns = &.{15681 .patterns = &.{
8136 .{ .src = .{ .to_mem, .to_mem } },15682 .{ .src = .{ .to_mem, .to_mem } },
8137 },15683 },
8138 .extra_temps = .{15684 .extra_temps = .{
8139 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15685 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8140 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },15686 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
15687 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
15688 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
8141 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15689 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8142 .{ .kind = .{ .rc = .mmx } },
8143 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15690 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8144 .{ .kind = .{ .rc = .mmx } },15691 .unused,
15692 .unused,
15693 .unused,
8145 },15694 },
8146 .dst_temps = .{.mem},15695 .dst_temps = .{.mem},
8147 .clobbers = .{ .eflags = true },15696 .clobbers = .{ .eflags = true },
8148 .each = .{ .once = switch (cc) {15697 .each = .{ .once = &.{
8149 else => unreachable,15698 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8150 .e => &.{15699 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
8151 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15700 .{ .@"0:", .v_pd, .mova, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
8152 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15701 .{ ._, .v_pd, .mova, .tmp3y, .memiad(.src0y, .tmp0, .add_size, 32), ._, ._ },
8153 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15702 .{ ._, .v_pd, .cmp, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), .ui(switch (cc) {
8154 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },15703 else => unreachable,
8155 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },15704 .e => 0b00000,
8156 .{ ._, .p_w, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },15705 .ne => 0b00100,
8157 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },15706 }) },
8158 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },15707 .{ ._, .v_pd, .cmp, .tmp3y, .tmp3y, .memiad(.src1y, .tmp0, .add_size, 32), .ui(switch (cc) {
8159 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },15708 else => unreachable,
8160 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },15709 .e => 0b00000,
8161 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },15710 .ne => 0b00100,
8162 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15711 }) },
8163 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },15712 .{ ._, .v_pd, .movmsk, .tmp4d, .tmp2y, ._, ._ },
8164 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },15713 .{ ._, .v_pd, .movmsk, .tmp5d, .tmp3y, ._, ._ },
8165 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },15714 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
8166 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },15715 .{ ._, ._, .@"or", .tmp4b, .tmp5b, ._, ._ },
8167 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15716 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp4b, ._, ._ },
8168 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },15717 .{ ._, ._c, .in, .tmp1q, ._, ._, ._ },
8169 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15718 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
8170 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15719 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8171 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
8172 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
8173 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
8174 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
8175 },
8176 .ne => &.{
8177 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8178 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8179 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
8180 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
8181 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
8182 .{ ._, .p_w, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
8183 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
8184 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
8185 .{ ._, ._, .xor, .tmp4b, .si(0b1111), ._, ._ },
8186 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
8187 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
8188 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
8189 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8190 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
8191 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
8192 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
8193 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
8194 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
8195 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
8196 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8197 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8198 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
8199 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
8200 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
8201 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
8202 },
8203 } },15720 } },
8204 }, .{15721 }, .{
8205 .required_features = .{ .sse, .mmx, null, null },15722 .required_features = .{ .avx, null, null, null },
8206 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },15723 .src_constraints = .{
15724 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
15725 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
15726 },
8207 .patterns = &.{15727 .patterns = &.{
8208 .{ .src = .{ .to_mem, .to_mem } },15728 .{ .src = .{ .to_mem, .to_mem } },
8209 },15729 },
8210 .extra_temps = .{15730 .extra_temps = .{
8211 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15731 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8212 .{ .type = .u32, .kind = .{ .reg = .rcx } },15732 .{ .type = .u32, .kind = .{ .reg = .rcx } },
15733 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
15734 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
8213 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15735 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8214 .{ .kind = .{ .rc = .mmx } },15736 .unused,
8215 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15737 .unused,
8216 .{ .kind = .{ .rc = .mmx } },15738 .unused,
15739 .unused,
8217 },15740 },
8218 .dst_temps = .{.mem},15741 .dst_temps = .{.mem},
8219 .clobbers = .{ .eflags = true },15742 .clobbers = .{ .eflags = true },
8220 .each = .{ .once = switch (cc) {15743 .each = .{ .once = &.{
8221 else => unreachable,15744 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8222 .e => &.{15745 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8223 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15746 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8224 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },15747 .{ .@"0:", .v_pd, .mova, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
8225 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15748 .{ ._, .v_pd, .cmp, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), .ui(switch (cc) {
8226 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },15749 else => unreachable,
8227 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },15750 .e => 0b00000,
8228 .{ ._, .p_d, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },15751 .ne => 0b00100,
8229 .{ ._, .p_w, .ackssd, .tmp5q, .tmp3q, ._, ._ },15752 }) },
8230 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },15753 .{ ._, .v_pd, .movmsk, .tmp4d, .tmp3y, ._, ._ },
8231 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },15754 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
8232 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },15755 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
8233 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },15756 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 4), ._, ._ },
8234 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },15757 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8235 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15758 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
8236 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },15759 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
8237 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },15760 .{ ._, ._r, .sh, .tmp4d, .ui(3), ._, ._ },
8238 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },15761 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
8239 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },15762 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8240 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },15763 .{ .@"1:", ._, .add, .tmp0p, .si(32), ._, ._ },
8241 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },15764 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8242 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15765 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8243 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },15766 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
8244 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },15767 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
8245 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },15768 .{ ._, ._r, .sh, .tmp4d, .ui(3), ._, ._ },
8246 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },15769 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
8247 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
8248 },
8249 .ne => &.{
8250 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8251 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8252 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
8253 .{ ._, .p_, .xor, .tmp3q, .tmp3q, ._, ._ },
8254 .{ .@"0:", ._q, .mov, .tmp5q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
8255 .{ ._, .p_d, .cmpeq, .tmp5q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
8256 .{ ._, .p_w, .ackssd, .tmp5q, .tmp3q, ._, ._ },
8257 .{ ._, .p_b, .ackssw, .tmp5q, .tmp3q, ._, ._ },
8258 .{ ._, .p_b, .movmsk, .tmp4d, .tmp5q, ._, ._ },
8259 .{ ._, ._, .xor, .tmp4b, .si(0b11), ._, ._ },
8260 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
8261 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
8262 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
8263 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8264 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
8265 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
8266 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
8267 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
8268 .{ ._, ._, .xor, .tmp2b, .tmp2b, ._, ._ },
8269 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
8270 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8271 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
8272 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
8273 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
8274 .{ ._, ._r, .sh, .tmp4d, .si(3), ._, ._ },
8275 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
8276 },
8277 } },15770 } },
8278 }, .{15771 }, .{
8279 .dst_constraints = .{.{ .bool_vec = .byte }},15772 .required_features = .{ .sse2, null, null, null },
8280 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },15773 .src_constraints = .{
15774 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
15775 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
15776 },
15777 .patterns = &.{
15778 .{ .src = .{ .to_mem, .to_mem } },
15779 },
15780 .extra_temps = .{
15781 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
15782 .{ .type = .u32, .kind = .{ .reg = .rcx } },
15783 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
15784 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
15785 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
15786 .unused,
15787 .unused,
15788 .unused,
15789 .unused,
15790 },
15791 .dst_temps = .{.mem},
15792 .clobbers = .{ .eflags = true },
15793 .each = .{ .once = &.{
15794 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
15795 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
15796 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
15797 .{ .@"0:", ._pd, .mova, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
15798 .{ ._, ._pd, .cmp, .tmp3x, .memia(.src1x, .tmp0, .add_size), .ui(switch (cc) {
15799 else => unreachable,
15800 .e => 0b00000,
15801 .ne => 0b00100,
15802 }), ._ },
15803 .{ ._, ._pd, .movmsk, .tmp4d, .tmp3x, ._, ._ },
15804 .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ },
15805 .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ },
15806 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 2), ._, ._ },
15807 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
15808 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
15809 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
15810 .{ ._, ._r, .sh, .tmp4d, .ui(3), ._, ._ },
15811 .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ },
15812 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
15813 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
15814 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
15815 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
15816 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
15817 .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ },
15818 .{ ._, ._r, .sh, .tmp4d, .ui(3), ._, ._ },
15819 .{ ._, ._, .mov, .memi(.dst0b, .tmp4), .tmp2b, ._, ._ },
15820 } },
15821 }, .{
15822 .required_features = .{ .x87, .cmov, .slow_incdec, null },
15823 .src_constraints = .{
15824 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
15825 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
15826 },
8281 .patterns = &.{15827 .patterns = &.{
8282 .{ .src = .{ .to_mem, .to_mem } },15828 .{ .src = .{ .to_mem, .to_mem } },
8283 },15829 },
8284 .extra_temps = .{15830 .extra_temps = .{
8285 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15831 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8286 .{ .type = .u8, .kind = .{ .reg = .cl } },15832 .{ .type = .u32, .kind = .{ .reg = .rcx } },
15833 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8287 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },15834 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8288 .unused,15835 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
15836 .{ .type = .f80, .kind = .{ .reg = .st6 } },
15837 .{ .type = .f80, .kind = .{ .reg = .st7 } },
8289 .unused,15838 .unused,
8290 .unused,15839 .unused,
8291 },15840 },
8292 .dst_temps = .{.{ .rc = .general_purpose }},15841 .dst_temps = .{.mem},
8293 .clobbers = .{ .eflags = true },15842 .clobbers = .{ .eflags = true },
8294 .each = .{ .once = &.{15843 .each = .{ .once = &.{
8295 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
8296 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15844 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8297 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },15845 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8298 .{ .@"0:", ._, .mov, .tmp2b, .memia(.src0b, .tmp0, .add_size), ._, ._ },15846 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8299 .{ ._, ._, .cmp, .tmp2b, .memia(.src1b, .tmp0, .add_size), ._, ._ },15847 .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ },
8300 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },15848 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
8301 .{ ._, ._l, .sh, .tmp2b, .tmp1b, ._, ._ },15849 .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_size), ._, ._, ._ },
8302 .{ ._, ._, .@"or", .dst0b, .tmp2b, ._, ._ },15850 .{ ._, .f_, .ld, .memia(.src0q, .tmp0, .add_size), ._, ._, ._ },
8303 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },15851 .{ ._, .f_p, .ucomi, .tmp5t, .tmp6t, ._, ._ },
8304 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },15852 .{ ._, .f_p, .st, .tmp6t, ._, ._, ._ },
15853 .{ ._, .fromCondition(cc), .set, .tmp3b, ._, ._, ._ },
15854 .{ ._, switch (cc) {
15855 else => unreachable,
15856 .e => ._np,
15857 .ne => ._p,
15858 }, .set, .tmp4b, ._, ._, ._ },
15859 .{ ._, ._, switch (cc) {
15860 else => unreachable,
15861 .e => .@"and",
15862 .ne => .@"or",
15863 }, .tmp3b, .tmp4b, ._, ._ },
15864 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
15865 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
15866 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
15867 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
15868 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
15869 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
15870 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
15871 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
15872 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
15873 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
8305 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15874 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
15875 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
15876 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
15877 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
15878 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
15879 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
8306 } },15880 } },
8307 }, .{15881 }, .{
8308 .dst_constraints = .{.{ .bool_vec = .byte }},15882 .required_features = .{ .x87, .cmov, null, null },
8309 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },15883 .src_constraints = .{
15884 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
15885 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
15886 },
8310 .patterns = &.{15887 .patterns = &.{
8311 .{ .src = .{ .to_mem, .to_mem } },15888 .{ .src = .{ .to_mem, .to_mem } },
8312 },15889 },
8313 .extra_temps = .{15890 .extra_temps = .{
8314 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15891 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8315 .{ .type = .u8, .kind = .{ .reg = .cl } },15892 .{ .type = .u32, .kind = .{ .reg = .rcx } },
8316 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },15893 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8317 .unused,15894 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
15895 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
15896 .{ .type = .f80, .kind = .{ .reg = .st6 } },
15897 .{ .type = .f80, .kind = .{ .reg = .st7 } },
8318 .unused,15898 .unused,
8319 .unused,15899 .unused,
8320 },15900 },
8321 .dst_temps = .{.{ .rc = .general_purpose }},15901 .dst_temps = .{.mem},
8322 .clobbers = .{ .eflags = true },15902 .clobbers = .{ .eflags = true },
8323 .each = .{ .once = &.{15903 .each = .{ .once = &.{
8324 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
8325 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15904 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8326 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },15905 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8327 .{ .@"0:", ._, .mov, .tmp2w, .memia(.src0w, .tmp0, .add_size), ._, ._ },15906 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8328 .{ ._, ._, .cmp, .tmp2w, .memia(.src1w, .tmp0, .add_size), ._, ._ },15907 .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ },
8329 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },15908 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
8330 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },15909 .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_size), ._, ._, ._ },
8331 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },15910 .{ ._, .f_, .ld, .memia(.src0q, .tmp0, .add_size), ._, ._, ._ },
8332 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },15911 .{ ._, .f_p, .ucomi, .tmp5t, .tmp6t, ._, ._ },
8333 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },15912 .{ ._, .f_p, .st, .tmp6t, ._, ._, ._ },
15913 .{ ._, .fromCondition(cc), .set, .tmp3b, ._, ._, ._ },
15914 .{ ._, switch (cc) {
15915 else => unreachable,
15916 .e => ._np,
15917 .ne => ._p,
15918 }, .set, .tmp4b, ._, ._, ._ },
15919 .{ ._, ._, switch (cc) {
15920 else => unreachable,
15921 .e => .@"and",
15922 .ne => .@"or",
15923 }, .tmp3b, .tmp4b, ._, ._ },
15924 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
15925 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
15926 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
15927 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
15928 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
15929 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
15930 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
15931 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
15932 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
15933 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
8334 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15934 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
15935 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
15936 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
15937 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
15938 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
15939 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
8335 } },15940 } },
8336 }, .{15941 }, .{
8337 .dst_constraints = .{.{ .bool_vec = .byte }},15942 .required_features = .{ .x87, null, null, null },
8338 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },15943 .src_constraints = .{
15944 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
15945 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
15946 },
8339 .patterns = &.{15947 .patterns = &.{
8340 .{ .src = .{ .to_mem, .to_mem } },15948 .{ .src = .{ .to_mem, .to_mem } },
8341 },15949 },
8342 .extra_temps = .{15950 .extra_temps = .{
8343 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },15951 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8344 .{ .type = .u8, .kind = .{ .reg = .cl } },15952 .{ .type = .u32, .kind = .{ .reg = .rcx } },
8345 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },15953 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8346 .unused,15954 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
15955 .{ .type = .f80, .kind = .{ .reg = .st6 } },
15956 .{ .type = .f80, .kind = .{ .reg = .st7 } },
15957 .{ .type = .u8, .kind = .{ .reg = .ah } },
8347 .unused,15958 .unused,
8348 .unused,15959 .unused,
8349 },15960 },
8350 .dst_temps = .{.{ .rc = .general_purpose }},15961 .dst_temps = .{.mem},
8351 .clobbers = .{ .eflags = true },15962 .clobbers = .{ .eflags = true },
8352 .each = .{ .once = &.{15963 .each = .{ .once = &.{
8353 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
8354 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },15964 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8355 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },15965 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8356 .{ .@"0:", ._, .mov, .tmp2d, .memia(.src0d, .tmp0, .add_size), ._, ._ },15966 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8357 .{ ._, ._, .cmp, .tmp2d, .memia(.src1d, .tmp0, .add_size), ._, ._ },15967 .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ },
8358 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },15968 .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_size), ._, ._, ._ },
8359 .{ ._, ._l, .sh, .tmp2b, .tmp1b, ._, ._ },15969 .{ ._, .f_, .ld, .memia(.src0q, .tmp0, .add_size), ._, ._, ._ },
8360 .{ ._, ._, .@"or", .dst0b, .tmp2b, ._, ._ },15970 .{ ._, .f_pp, .ucom, ._, ._, ._, ._ },
8361 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },15971 .{ ._, .fn_sw, .st, .tmp6w, ._, ._, ._ },
8362 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },15972 .{ ._, ._, .xor, .tmp6b, .si(0b0_1_000_000), ._, ._ },
15973 .{ ._, ._, .@"test", .tmp6b, .si(0b0_1_000_100), ._, ._ },
15974 .{ ._, .fromCondition(cc), .set, .tmp3b, ._, ._, ._ },
15975 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
15976 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
15977 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
15978 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
15979 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
15980 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
15981 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
15982 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
15983 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
15984 .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ },
8363 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },15985 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
15986 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
15987 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
15988 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
15989 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
15990 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
8364 } },15991 } },
8365 }, .{15992 }, .{
8366 .required_features = .{ .@"64bit", null, null, null },15993 .required_features = .{ .x87, .cmov, .slow_incdec, null },
8367 .dst_constraints = .{.{ .bool_vec = .byte }},15994 .src_constraints = .{
8368 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },15995 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
15996 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
15997 },
8369 .patterns = &.{15998 .patterns = &.{
8370 .{ .src = .{ .to_mem, .to_mem } },15999 .{ .src = .{ .to_mem, .to_mem } },
8371 },16000 },
8372 .extra_temps = .{16001 .extra_temps = .{
8373 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16002 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8374 .{ .type = .u8, .kind = .{ .reg = .cl } },16003 .{ .type = .u32, .kind = .{ .reg = .rcx } },
8375 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },16004 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8376 .unused,16005 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
16006 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
16007 .{ .type = .f80, .kind = .{ .reg = .st6 } },
16008 .{ .type = .f80, .kind = .{ .reg = .st7 } },
8377 .unused,16009 .unused,
8378 .unused,16010 .unused,
8379 },16011 },
8380 .dst_temps = .{.{ .rc = .general_purpose }},16012 .dst_temps = .{.mem},
8381 .clobbers = .{ .eflags = true },16013 .clobbers = .{ .eflags = true },
8382 .each = .{ .once = &.{16014 .each = .{ .once = &.{
8383 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },
8384 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16015 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8385 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16016 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8386 .{ .@"0:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },16017 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8387 .{ ._, ._, .cmp, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },16018 .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ },
8388 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16019 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
8389 .{ ._, ._l, .sh, .tmp2b, .tmp1b, ._, ._ },16020 .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
8390 .{ ._, ._, .@"or", .dst0b, .tmp2b, ._, ._ },16021 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
8391 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16022 .{ ._, .f_p, .ucomi, .tmp5t, .tmp6t, ._, ._ },
8392 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },16023 .{ ._, .f_p, .st, .tmp6t, ._, ._, ._ },
16024 .{ ._, .fromCondition(cc), .set, .tmp3b, ._, ._, ._ },
16025 .{ ._, switch (cc) {
16026 else => unreachable,
16027 .e => ._np,
16028 .ne => ._p,
16029 }, .set, .tmp4b, ._, ._, ._ },
16030 .{ ._, ._, switch (cc) {
16031 else => unreachable,
16032 .e => .@"and",
16033 .ne => .@"or",
16034 }, .tmp3b, .tmp4b, ._, ._ },
16035 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
16036 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
16037 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
16038 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
16039 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
16040 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
16041 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
16042 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
16043 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16044 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
8393 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16045 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
16046 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
16047 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
16048 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
16049 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
16050 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
8394 } },16051 } },
8395 }, .{16052 }, .{
8396 .dst_constraints = .{.{ .bool_vec = .byte }},16053 .required_features = .{ .x87, .cmov, null, null },
16054 .src_constraints = .{
16055 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
16056 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
16057 },
8397 .patterns = &.{16058 .patterns = &.{
8398 .{ .src = .{ .to_mem, .to_mem } },16059 .{ .src = .{ .to_mem, .to_mem } },
8399 },16060 },
8400 .extra_temps = .{16061 .extra_temps = .{
8401 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16062 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8402 .{ .type = .u8, .kind = .{ .reg = .cl } },16063 .{ .type = .u32, .kind = .{ .reg = .rcx } },
8403 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },16064 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8404 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16065 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8405 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16066 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
16067 .{ .type = .f80, .kind = .{ .reg = .st6 } },
16068 .{ .type = .f80, .kind = .{ .reg = .st7 } },
16069 .unused,
8406 .unused,16070 .unused,
8407 },16071 },
8408 .dst_temps = .{.{ .rc = .general_purpose }},16072 .dst_temps = .{.mem},
8409 .clobbers = .{ .eflags = true },16073 .clobbers = .{ .eflags = true },
8410 .each = .{ .once = &.{16074 .each = .{ .once = &.{
8411 .{ ._, ._, .xor, .dst0b, .dst0b, ._, ._ },16075 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8412 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },16076 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8413 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16077 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8414 .{ .@"0:", ._, .mov, .tmp2d, .sa(.src0p, .add_elem_limbs), ._, ._ },16078 .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ },
8415 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },16079 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
8416 .{ .@"1:", ._, .mov, .tmp4p, .memi(.src0p, .tmp0), ._, ._ },16080 .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
8417 .{ ._, ._, .xor, .tmp4p, .memi(.src1p, .tmp0), ._, ._ },16081 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
8418 .{ ._, ._, .@"or", .tmp3p, .tmp4p, ._, ._ },16082 .{ ._, .f_p, .ucomi, .tmp5t, .tmp6t, ._, ._ },
8419 .{ ._, ._, .add, .tmp0p, .sa(.tmp4, .add_size), ._, ._ },16083 .{ ._, .f_p, .st, .tmp6t, ._, ._, ._ },
8420 .{ ._, ._, .sub, .tmp2d, .si(1), ._, ._ },16084 .{ ._, .fromCondition(cc), .set, .tmp3b, ._, ._, ._ },
8421 .{ ._, ._b, .j, .@"1b", ._, ._, ._ },16085 .{ ._, switch (cc) {
8422 .{ ._, ._, .@"test", .tmp3p, .tmp3p, ._, ._ },16086 else => unreachable,
8423 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16087 .e => ._np,
8424 .{ ._, ._l, .sh, .tmp2b, .tmp1b, ._, ._ },16088 .ne => ._p,
8425 .{ ._, ._, .@"or", .dst0b, .tmp2b, ._, ._ },16089 }, .set, .tmp4b, ._, ._, ._ },
8426 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16090 .{ ._, ._, switch (cc) {
8427 .{ ._, ._, .cmp, .tmp1b, .sa(.dst0, .add_len), ._, ._ },16091 else => unreachable,
8428 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },16092 .e => .@"and",
16093 .ne => .@"or",
16094 }, .tmp3b, .tmp4b, ._, ._ },
16095 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
16096 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
16097 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
16098 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
16099 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
16100 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
16101 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
16102 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
16103 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16104 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
16105 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
16106 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
16107 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
16108 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
16109 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
16110 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
8429 } },16111 } },
8430 }, .{16112 }, .{
8431 .dst_constraints = .{.{ .bool_vec = .dword }},16113 .required_features = .{ .x87, null, null, null },
8432 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },16114 .src_constraints = .{
16115 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
16116 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
16117 },
8433 .patterns = &.{16118 .patterns = &.{
8434 .{ .src = .{ .to_mem, .to_mem } },16119 .{ .src = .{ .to_mem, .to_mem } },
8435 },16120 },
8436 .extra_temps = .{16121 .extra_temps = .{
8437 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16122 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8438 .{ .type = .u8, .kind = .{ .reg = .cl } },16123 .{ .type = .u32, .kind = .{ .reg = .rcx } },
8439 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },16124 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8440 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },16125 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
16126 .{ .type = .f80, .kind = .{ .reg = .st6 } },
16127 .{ .type = .f80, .kind = .{ .reg = .st7 } },
16128 .{ .type = .u8, .kind = .{ .reg = .ah } },
8441 .unused,16129 .unused,
8442 .unused,16130 .unused,
8443 },16131 },
8444 .dst_temps = .{.{ .rc = .general_purpose }},16132 .dst_temps = .{.mem},
8445 .clobbers = .{ .eflags = true },16133 .clobbers = .{ .eflags = true },
8446 .each = .{ .once = &.{16134 .each = .{ .once = &.{
8447 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8448 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16135 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8449 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16136 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8450 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },16137 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8451 .{ ._, ._, .mov, .tmp3b, .memia(.src0b, .tmp0, .add_size), ._, ._ },16138 .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ },
8452 .{ ._, ._, .cmp, .tmp3b, .memia(.src1b, .tmp0, .add_size), ._, ._ },16139 .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
8453 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16140 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
8454 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },16141 .{ ._, .f_pp, .ucom, ._, ._, ._, ._ },
8455 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },16142 .{ ._, .fn_sw, .st, .tmp6w, ._, ._, ._ },
8456 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16143 .{ ._, ._, .xor, .tmp6b, .si(0b0_1_000_000), ._, ._ },
8457 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },16144 .{ ._, ._, .@"test", .tmp6b, .si(0b0_1_000_100), ._, ._ },
16145 .{ ._, .fromCondition(cc), .set, .tmp3b, ._, ._, ._ },
16146 .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ },
16147 .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ },
16148 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
16149 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
16150 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
16151 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
16152 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
16153 .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ },
16154 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16155 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
8458 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16156 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
16157 .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ },
16158 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
16159 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },
16160 .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ },
16161 .{ ._, ._, .mov, .memi(.dst0b, .tmp3), .tmp2b, ._, ._ },
8459 } },16162 } },
8460 }, .{16163 }, .{
16164 .required_features = .{ .avx, .slow_incdec, null, null },
8461 .dst_constraints = .{.{ .bool_vec = .dword }},16165 .dst_constraints = .{.{ .bool_vec = .dword }},
8462 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },16166 .src_constraints = .{
16167 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16168 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16169 },
8463 .patterns = &.{16170 .patterns = &.{
8464 .{ .src = .{ .to_mem, .to_mem } },16171 .{ .src = .{ .to_mem, .to_mem } },
8465 },16172 },
16173 .call_frame = .{ .alignment = .@"16" },
8466 .extra_temps = .{16174 .extra_temps = .{
8467 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16175 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8468 .{ .type = .u8, .kind = .{ .reg = .cl } },
8469 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },16176 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8470 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },16177 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
8471 .unused,16178 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16179 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16180 else => unreachable,
16181 .e => "__eqtf2",
16182 .ne => "__netf2",
16183 } } } },
16184 .{ .type = .i32, .kind = .{ .reg = .eax } },
16185 .{ .type = .u8, .kind = .{ .reg = .cl } },
16186 .{ .type = .u32, .kind = .{ .reg = .edx } },
8472 .unused,16187 .unused,
8473 },16188 },
8474 .dst_temps = .{.{ .rc = .general_purpose }},16189 .dst_temps = .{.{ .rc = .general_purpose }},
8475 .clobbers = .{ .eflags = true },16190 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8476 .each = .{ .once = &.{16191 .each = .{ .once = &.{
8477 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },16192 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8478 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16193 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8479 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16194 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8480 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },16195 .{ .@"0:", .v_dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8481 .{ ._, ._, .mov, .tmp3w, .memia(.src0w, .tmp0, .add_size), ._, ._ },16196 .{ ._, .v_dqa, .mov, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8482 .{ ._, ._, .cmp, .tmp3w, .memia(.src1w, .tmp0, .add_size), ._, ._ },16197 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
8483 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16198 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
8484 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },16199 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
8485 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },16200 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
8486 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16201 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
8487 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },16202 .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ },
16203 .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ },
16204 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
16205 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8488 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16206 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8489 } },16207 } },
8490 }, .{16208 }, .{
16209 .required_features = .{ .avx, .slow_incdec, null, null },
8491 .dst_constraints = .{.{ .bool_vec = .dword }},16210 .dst_constraints = .{.{ .bool_vec = .dword }},
8492 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },16211 .src_constraints = .{
16212 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16213 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16214 },
8493 .patterns = &.{16215 .patterns = &.{
8494 .{ .src = .{ .to_mem, .to_mem } },16216 .{ .src = .{ .to_mem, .to_mem } },
8495 },16217 },
16218 .call_frame = .{ .alignment = .@"16" },
8496 .extra_temps = .{16219 .extra_temps = .{
8497 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16220 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8498 .{ .type = .u8, .kind = .{ .reg = .cl } },
8499 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },16221 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8500 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },16222 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
8501 .unused,16223 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16224 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16225 else => unreachable,
16226 .e => "__eqtf2",
16227 .ne => "__netf2",
16228 } } } },
16229 .{ .type = .i32, .kind = .{ .reg = .eax } },
16230 .{ .type = .u8, .kind = .{ .reg = .cl } },
16231 .{ .type = .u32, .kind = .{ .reg = .edx } },
8502 .unused,16232 .unused,
8503 },16233 },
8504 .dst_temps = .{.{ .rc = .general_purpose }},16234 .dst_temps = .{.{ .rc = .general_purpose }},
8505 .clobbers = .{ .eflags = true },16235 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8506 .each = .{ .once = &.{16236 .each = .{ .once = &.{
8507 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },16237 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8508 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16238 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8509 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16239 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8510 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },16240 .{ .@"0:", .v_dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8511 .{ ._, ._, .mov, .tmp3d, .memia(.src0d, .tmp0, .add_size), ._, ._ },16241 .{ ._, .v_dqa, .mov, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8512 .{ ._, ._, .cmp, .tmp3d, .memia(.src1d, .tmp0, .add_size), ._, ._ },16242 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
8513 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16243 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
8514 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },16244 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
8515 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },16245 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
8516 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16246 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
8517 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },16247 .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ },
16248 .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ },
16249 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
16250 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8518 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16251 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8519 } },16252 } },
8520 }, .{16253 }, .{
8521 .required_features = .{ .@"64bit", null, null, null },16254 .required_features = .{ .sse2, .slow_incdec, null, null },
8522 .dst_constraints = .{.{ .bool_vec = .dword }},16255 .dst_constraints = .{.{ .bool_vec = .dword }},
8523 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },16256 .src_constraints = .{
16257 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16258 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16259 },
8524 .patterns = &.{16260 .patterns = &.{
8525 .{ .src = .{ .to_mem, .to_mem } },16261 .{ .src = .{ .to_mem, .to_mem } },
8526 },16262 },
16263 .call_frame = .{ .alignment = .@"16" },
8527 .extra_temps = .{16264 .extra_temps = .{
8528 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16265 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8529 .{ .type = .u8, .kind = .{ .reg = .cl } },
8530 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },16266 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8531 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },16267 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
8532 .unused,16268 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16269 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16270 else => unreachable,
16271 .e => "__eqtf2",
16272 .ne => "__netf2",
16273 } } } },
16274 .{ .type = .i32, .kind = .{ .reg = .eax } },
16275 .{ .type = .u8, .kind = .{ .reg = .cl } },
16276 .{ .type = .u32, .kind = .{ .reg = .edx } },
8533 .unused,16277 .unused,
8534 },16278 },
8535 .dst_temps = .{.{ .rc = .general_purpose }},16279 .dst_temps = .{.{ .rc = .general_purpose }},
8536 .clobbers = .{ .eflags = true },16280 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8537 .each = .{ .once = &.{16281 .each = .{ .once = &.{
8538 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },16282 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8539 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16283 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8540 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16284 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8541 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },16285 .{ .@"0:", ._dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8542 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp0, .add_size), ._, ._ },16286 .{ ._, ._dqa, .mov, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8543 .{ ._, ._, .cmp, .tmp3q, .memia(.src1q, .tmp0, .add_size), ._, ._ },16287 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
8544 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16288 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
8545 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },16289 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
8546 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },16290 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
8547 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16291 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
8548 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },16292 .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ },
16293 .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ },
16294 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
16295 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8549 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16296 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8550 } },16297 } },
8551 }, .{16298 }, .{
16299 .required_features = .{ .sse2, .slow_incdec, null, null },
8552 .dst_constraints = .{.{ .bool_vec = .dword }},16300 .dst_constraints = .{.{ .bool_vec = .dword }},
16301 .src_constraints = .{
16302 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16303 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16304 },
8553 .patterns = &.{16305 .patterns = &.{
8554 .{ .src = .{ .to_mem, .to_mem } },16306 .{ .src = .{ .to_mem, .to_mem } },
8555 },16307 },
16308 .call_frame = .{ .alignment = .@"16" },
8556 .extra_temps = .{16309 .extra_temps = .{
8557 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16310 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8558 .{ .type = .u8, .kind = .{ .reg = .cl } },
8559 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },16311 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8560 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16312 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
8561 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16313 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16314 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16315 else => unreachable,
16316 .e => "__eqtf2",
16317 .ne => "__netf2",
16318 } } } },
16319 .{ .type = .i32, .kind = .{ .reg = .eax } },
16320 .{ .type = .u8, .kind = .{ .reg = .cl } },
16321 .{ .type = .u32, .kind = .{ .reg = .edx } },
8562 .unused,16322 .unused,
8563 },16323 },
8564 .dst_temps = .{.{ .rc = .general_purpose }},16324 .dst_temps = .{.{ .rc = .general_purpose }},
8565 .clobbers = .{ .eflags = true },16325 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8566 .each = .{ .once = &.{16326 .each = .{ .once = &.{
8567 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },16327 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8568 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },16328 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8569 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16329 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8570 .{ .@"0:", ._, .mov, .tmp2d, .sa(.src0p, .add_elem_limbs), ._, ._ },16330 .{ .@"0:", ._dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8571 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },16331 .{ ._, ._dqa, .mov, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8572 .{ .@"1:", ._, .mov, .tmp4p, .memi(.src0p, .tmp0), ._, ._ },16332 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
8573 .{ ._, ._, .xor, .tmp4p, .memi(.src1p, .tmp0), ._, ._ },16333 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
8574 .{ ._, ._, .@"or", .tmp3p, .tmp4p, ._, ._ },16334 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
8575 .{ ._, ._, .add, .tmp0p, .sa(.tmp4, .add_size), ._, ._ },16335 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
8576 .{ ._, ._, .sub, .tmp2d, .si(1), ._, ._ },16336 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
8577 .{ ._, ._b, .j, .@"1b", ._, ._, ._ },16337 .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ },
8578 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },16338 .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ },
8579 .{ ._, ._, .@"test", .tmp3p, .tmp3p, ._, ._ },16339 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
8580 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16340 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8581 .{ ._, ._l, .sh, .tmp2d, .tmp1b, ._, ._ },16341 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8582 .{ ._, ._, .@"or", .dst0d, .tmp2d, ._, ._ },
8583 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },
8584 .{ ._, ._, .cmp, .tmp1b, .sa(.dst0, .add_len), ._, ._ },
8585 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
8586 } },16342 } },
8587 }, .{16343 }, .{
8588 .required_features = .{ .@"64bit", null, null, null },16344 .required_features = .{ .sse, .slow_incdec, null, null },
8589 .dst_constraints = .{.{ .bool_vec = .qword }},16345 .dst_constraints = .{.{ .bool_vec = .dword }},
8590 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },16346 .src_constraints = .{
16347 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16348 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16349 },
8591 .patterns = &.{16350 .patterns = &.{
8592 .{ .src = .{ .to_mem, .to_mem } },16351 .{ .src = .{ .to_mem, .to_mem } },
8593 },16352 },
16353 .call_frame = .{ .alignment = .@"16" },
8594 .extra_temps = .{16354 .extra_temps = .{
8595 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16355 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
16356 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
16357 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
16358 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16359 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16360 else => unreachable,
16361 .e => "__eqtf2",
16362 .ne => "__netf2",
16363 } } } },
16364 .{ .type = .i32, .kind = .{ .reg = .eax } },
8596 .{ .type = .u8, .kind = .{ .reg = .cl } },16365 .{ .type = .u8, .kind = .{ .reg = .cl } },
8597 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },16366 .{ .type = .u32, .kind = .{ .reg = .edx } },
8598 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
8599 .unused,
8600 .unused,16367 .unused,
8601 },16368 },
8602 .dst_temps = .{.{ .rc = .general_purpose }},16369 .dst_temps = .{.{ .rc = .general_purpose }},
8603 .clobbers = .{ .eflags = true },16370 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8604 .each = .{ .once = &.{16371 .each = .{ .once = &.{
8605 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },16372 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8606 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16373 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8607 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16374 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8608 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },16375 .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8609 .{ ._, ._, .mov, .tmp3b, .memia(.src0b, .tmp0, .add_size), ._, ._ },16376 .{ ._, ._ps, .mova, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8610 .{ ._, ._, .cmp, .tmp3b, .memia(.src1b, .tmp0, .add_size), ._, ._ },16377 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
8611 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16378 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
8612 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },16379 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
8613 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },16380 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
8614 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16381 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
8615 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },16382 .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ },
16383 .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ },
16384 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
16385 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8616 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16386 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8617 } },16387 } },
8618 }, .{16388 }, .{
8619 .required_features = .{ .@"64bit", null, null, null },16389 .required_features = .{ .sse2, .slow_incdec, null, null },
8620 .dst_constraints = .{.{ .bool_vec = .qword }},16390 .dst_constraints = .{.{ .bool_vec = .dword }},
8621 .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } },16391 .src_constraints = .{
16392 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16393 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16394 },
8622 .patterns = &.{16395 .patterns = &.{
8623 .{ .src = .{ .to_mem, .to_mem } },16396 .{ .src = .{ .to_mem, .to_mem } },
8624 },16397 },
16398 .call_frame = .{ .alignment = .@"16" },
8625 .extra_temps = .{16399 .extra_temps = .{
8626 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16400 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
16401 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
16402 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
16403 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16404 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16405 else => unreachable,
16406 .e => "__eqtf2",
16407 .ne => "__netf2",
16408 } } } },
16409 .{ .type = .i32, .kind = .{ .reg = .eax } },
8627 .{ .type = .u8, .kind = .{ .reg = .cl } },16410 .{ .type = .u8, .kind = .{ .reg = .cl } },
8628 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },16411 .{ .type = .u32, .kind = .{ .reg = .edx } },
8629 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
8630 .unused,
8631 .unused,16412 .unused,
8632 },16413 },
8633 .dst_temps = .{.{ .rc = .general_purpose }},16414 .dst_temps = .{.{ .rc = .general_purpose }},
8634 .clobbers = .{ .eflags = true },16415 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8635 .each = .{ .once = &.{16416 .each = .{ .once = &.{
8636 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },16417 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8637 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16418 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8638 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },16419 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8639 .{ ._, ._, .mov, .tmp3w, .memia(.src0w, .tmp0, .add_size), ._, ._ },16420 .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8640 .{ ._, ._, .cmp, .tmp3w, .memia(.src1w, .tmp0, .add_size), ._, ._ },16421 .{ ._, ._ps, .mova, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8641 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16422 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
8642 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },16423 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
8643 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },16424 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
8644 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16425 .{ ._, .fromCondition(cc), .set, .tmp7b, ._, ._, ._ },
8645 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },16426 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16427 .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ },
16428 .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ },
16429 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
16430 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
8646 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16431 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8647 } },16432 } },
8648 }, .{16433 }, .{
8649 .required_features = .{ .@"64bit", null, null, null },16434 .required_features = .{ .@"64bit", .avx, .slow_incdec, null },
8650 .dst_constraints = .{.{ .bool_vec = .qword }},16435 .src_constraints = .{
8651 .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } },16436 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16437 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16438 },
8652 .patterns = &.{16439 .patterns = &.{
8653 .{ .src = .{ .to_mem, .to_mem } },16440 .{ .src = .{ .to_mem, .to_mem } },
8654 },16441 },
16442 .call_frame = .{ .alignment = .@"16" },
8655 .extra_temps = .{16443 .extra_temps = .{
8656 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16444 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8657 .{ .type = .u8, .kind = .{ .reg = .cl } },
8658 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
8659 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },16445 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8660 .unused,16446 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
8661 .unused,16447 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
16448 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16449 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16450 else => unreachable,
16451 .e => "__eqtf2",
16452 .ne => "__netf2",
16453 } } } },
16454 .{ .type = .i32, .kind = .{ .reg = .eax } },
16455 .{ .type = .u8, .kind = .{ .reg = .cl } },
16456 .{ .type = .u64, .kind = .{ .reg = .rdx } },
8662 },16457 },
8663 .dst_temps = .{.{ .rc = .general_purpose }},16458 .dst_temps = .{.mem},
8664 .clobbers = .{ .eflags = true },16459 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8665 .each = .{ .once = &.{16460 .each = .{ .once = &.{
8666 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8667 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16461 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8668 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16462 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8669 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },16463 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8670 .{ ._, ._, .mov, .tmp3d, .memia(.src0d, .tmp0, .add_size), ._, ._ },16464 .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8671 .{ ._, ._, .cmp, .tmp3d, .memia(.src1d, .tmp0, .add_size), ._, ._ },16465 .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8672 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16466 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
8673 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },16467 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
8674 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },16468 .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ },
8675 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16469 .{ ._, .fromCondition(cc), .set, .tmp8b, ._, ._, ._ },
8676 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },16470 .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ },
16471 .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ },
16472 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
16473 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
16474 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16475 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
16476 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16477 .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ },
16478 .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ },
16479 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16480 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
8677 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16481 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
16482 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16483 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
16484 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16485 .{ ._, ._r, .sh, .tmp6d, .si(9), ._, ._ },
16486 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp6), .tmp2q, ._, ._ },
8678 } },16487 } },
8679 }, .{16488 }, .{
8680 .required_features = .{ .@"64bit", null, null, null },16489 .required_features = .{ .@"64bit", .avx, null, null },
8681 .dst_constraints = .{.{ .bool_vec = .qword }},16490 .src_constraints = .{
8682 .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } },16491 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16492 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16493 },
8683 .patterns = &.{16494 .patterns = &.{
8684 .{ .src = .{ .to_mem, .to_mem } },16495 .{ .src = .{ .to_mem, .to_mem } },
8685 },16496 },
16497 .call_frame = .{ .alignment = .@"16" },
8686 .extra_temps = .{16498 .extra_temps = .{
8687 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16499 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
16500 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
16501 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
16502 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
16503 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16504 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16505 else => unreachable,
16506 .e => "__eqtf2",
16507 .ne => "__netf2",
16508 } } } },
16509 .{ .type = .i32, .kind = .{ .reg = .eax } },
8688 .{ .type = .u8, .kind = .{ .reg = .cl } },16510 .{ .type = .u8, .kind = .{ .reg = .cl } },
16511 .{ .type = .u64, .kind = .{ .reg = .rdx } },
16512 },
16513 .dst_temps = .{.mem},
16514 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
16515 .each = .{ .once = &.{
16516 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
16517 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
16518 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16519 .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
16520 .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
16521 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
16522 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
16523 .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ },
16524 .{ ._, .fromCondition(cc), .set, .tmp8b, ._, ._, ._ },
16525 .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ },
16526 .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ },
16527 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
16528 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
16529 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16530 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
16531 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16532 .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ },
16533 .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ },
16534 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16535 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
16536 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
16537 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16538 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
16539 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16540 .{ ._, ._r, .sh, .tmp6d, .si(9), ._, ._ },
16541 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp6), .tmp2q, ._, ._ },
16542 } },
16543 }, .{
16544 .required_features = .{ .@"64bit", .sse2, .slow_incdec, null },
16545 .src_constraints = .{
16546 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16547 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16548 },
16549 .patterns = &.{
16550 .{ .src = .{ .to_mem, .to_mem } },
16551 },
16552 .call_frame = .{ .alignment = .@"16" },
16553 .extra_temps = .{
16554 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
16555 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8689 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },16556 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
16557 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
16558 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16559 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16560 else => unreachable,
16561 .e => "__eqtf2",
16562 .ne => "__netf2",
16563 } } } },
16564 .{ .type = .i32, .kind = .{ .reg = .eax } },
16565 .{ .type = .u8, .kind = .{ .reg = .cl } },
16566 .{ .type = .u64, .kind = .{ .reg = .rdx } },
16567 },
16568 .dst_temps = .{.mem},
16569 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
16570 .each = .{ .once = &.{
16571 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
16572 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
16573 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16574 .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
16575 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
16576 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
16577 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
16578 .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ },
16579 .{ ._, .fromCondition(cc), .set, .tmp8b, ._, ._, ._ },
16580 .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ },
16581 .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ },
16582 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
16583 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
16584 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16585 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
16586 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16587 .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ },
16588 .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ },
16589 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16590 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
16591 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
16592 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16593 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
16594 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16595 .{ ._, ._r, .sh, .tmp6d, .si(9), ._, ._ },
16596 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp6), .tmp2q, ._, ._ },
16597 } },
16598 }, .{
16599 .required_features = .{ .@"64bit", .sse2, null, null },
16600 .src_constraints = .{
16601 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16602 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16603 },
16604 .patterns = &.{
16605 .{ .src = .{ .to_mem, .to_mem } },
16606 },
16607 .call_frame = .{ .alignment = .@"16" },
16608 .extra_temps = .{
16609 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
16610 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8690 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },16611 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
8691 .unused,16612 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
8692 .unused,16613 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16614 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16615 else => unreachable,
16616 .e => "__eqtf2",
16617 .ne => "__netf2",
16618 } } } },
16619 .{ .type = .i32, .kind = .{ .reg = .eax } },
16620 .{ .type = .u8, .kind = .{ .reg = .cl } },
16621 .{ .type = .u64, .kind = .{ .reg = .rdx } },
8693 },16622 },
8694 .dst_temps = .{.{ .rc = .general_purpose }},16623 .dst_temps = .{.mem},
8695 .clobbers = .{ .eflags = true },16624 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8696 .each = .{ .once = &.{16625 .each = .{ .once = &.{
8697 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
8698 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16626 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8699 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },16627 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8700 .{ .@"0:", ._, .xor, .tmp2d, .tmp2d, ._, ._ },16628 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8701 .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },16629 .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8702 .{ ._, ._, .cmp, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },16630 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8703 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16631 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
8704 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },16632 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
8705 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },16633 .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ },
8706 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16634 .{ ._, .fromCondition(cc), .set, .tmp8b, ._, ._, ._ },
8707 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },16635 .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ },
16636 .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ },
16637 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
16638 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
16639 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16640 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
16641 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16642 .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ },
16643 .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ },
16644 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16645 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
8708 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16646 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
16647 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16648 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
16649 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16650 .{ ._, ._r, .sh, .tmp6d, .si(9), ._, ._ },
16651 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp6), .tmp2q, ._, ._ },
8709 } },16652 } },
8710 }, .{16653 }, .{
8711 .required_features = .{ .@"64bit", null, null, null },16654 .required_features = .{ .@"64bit", .sse, .slow_incdec, null },
8712 .dst_constraints = .{.{ .bool_vec = .qword }},16655 .src_constraints = .{
16656 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16657 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16658 },
8713 .patterns = &.{16659 .patterns = &.{
8714 .{ .src = .{ .to_mem, .to_mem } },16660 .{ .src = .{ .to_mem, .to_mem } },
8715 },16661 },
16662 .call_frame = .{ .alignment = .@"16" },
8716 .extra_temps = .{16663 .extra_temps = .{
8717 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16664 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
16665 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
16666 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
16667 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
16668 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
16669 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16670 else => unreachable,
16671 .e => "__eqtf2",
16672 .ne => "__netf2",
16673 } } } },
16674 .{ .type = .i32, .kind = .{ .reg = .eax } },
8718 .{ .type = .u8, .kind = .{ .reg = .cl } },16675 .{ .type = .u8, .kind = .{ .reg = .cl } },
8719 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16676 .{ .type = .u64, .kind = .{ .reg = .rdx } },
8720 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8721 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8722 .unused,
8723 },16677 },
8724 .dst_temps = .{.{ .rc = .general_purpose }},16678 .dst_temps = .{.mem},
8725 .clobbers = .{ .eflags = true },16679 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8726 .each = .{ .once = &.{16680 .each = .{ .once = &.{
8727 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },16681 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8728 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },16682 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8729 .{ ._, ._, .xor, .tmp1b, .tmp1b, ._, ._ },
8730 .{ .@"0:", ._, .mov, .tmp2d, .sa(.src0p, .add_elem_limbs), ._, ._ },
8731 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
8732 .{ .@"1:", ._, .mov, .tmp4p, .memi(.src0p, .tmp0), ._, ._ },
8733 .{ ._, ._, .xor, .tmp4p, .memi(.src1p, .tmp0), ._, ._ },
8734 .{ ._, ._, .@"or", .tmp3p, .tmp4p, ._, ._ },
8735 .{ ._, ._, .add, .tmp0p, .sa(.tmp4, .add_size), ._, ._ },
8736 .{ ._, ._, .sub, .tmp2d, .si(1), ._, ._ },
8737 .{ ._, ._b, .j, .@"1b", ._, ._, ._ },
8738 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },16683 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8739 .{ ._, ._, .@"test", .tmp3p, .tmp3p, ._, ._ },16684 .{ .@"0:", ._ps, .mova, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8740 .{ ._, .fromCondition(cc), .set, .tmp2b, ._, ._, ._ },16685 .{ ._, ._ps, .mova, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8741 .{ ._, ._l, .sh, .tmp2q, .tmp1b, ._, ._ },16686 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
8742 .{ ._, ._, .@"or", .dst0q, .tmp2q, ._, ._ },16687 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
8743 .{ ._, ._, .add, .tmp1b, .si(1), ._, ._ },16688 .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ },
8744 .{ ._, ._, .cmp, .tmp1b, .sa(.dst0, .add_len), ._, ._ },16689 .{ ._, .fromCondition(cc), .set, .tmp8b, ._, ._, ._ },
8745 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },16690 .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ },
16691 .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ },
16692 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
16693 .{ ._, ._, .lea, .tmp1d, .lead(.none, .tmp1, 1), ._, ._ },
16694 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16695 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
16696 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16697 .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ },
16698 .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ },
16699 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
16700 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
16701 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
16702 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
16703 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
16704 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
16705 .{ ._, ._r, .sh, .tmp6d, .si(9), ._, ._ },
16706 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp6), .tmp2q, ._, ._ },
8746 } },16707 } },
8747 }, .{16708 }, .{
8748 .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } },16709 .required_features = .{ .@"64bit", .sse, null, null },
16710 .src_constraints = .{
16711 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16712 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
16713 },
8749 .patterns = &.{16714 .patterns = &.{
8750 .{ .src = .{ .to_mem, .to_mem } },16715 .{ .src = .{ .to_mem, .to_mem } },
8751 },16716 },
16717 .call_frame = .{ .alignment = .@"16" },
8752 .extra_temps = .{16718 .extra_temps = .{
8753 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },16719 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8754 .{ .type = .u32, .kind = .{ .reg = .ecx } },16720 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
8755 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16721 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
8756 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },16722 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
8757 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },16723 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
8758 .unused,16724 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
16725 else => unreachable,
16726 .e => "__eqtf2",
16727 .ne => "__netf2",
16728 } } } },
16729 .{ .type = .i32, .kind = .{ .reg = .eax } },
16730 .{ .type = .u8, .kind = .{ .reg = .cl } },
16731 .{ .type = .u64, .kind = .{ .reg = .rdx } },
8759 },16732 },
8760 .dst_temps = .{.mem},16733 .dst_temps = .{.mem},
8761 .clobbers = .{ .eflags = true },16734 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
8762 .each = .{ .once = &.{16735 .each = .{ .once = &.{
8763 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },16736 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
8764 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },16737 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
8765 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },16738 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8766 .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ },16739 .{ .@"0:", ._ps, .mova, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
8767 .{ ._, ._, .mov, .tmp4b, .memia(.src0b, .tmp0, .add_size), ._, ._ },16740 .{ ._, ._ps, .mova, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
8768 .{ ._, ._, .cmp, .tmp4b, .memia(.src1b, .tmp0, .add_size), ._, ._ },16741 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
8769 .{ ._, .fromCondition(cc), .set, .tmp3b, ._, ._, ._ },16742 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
8770 .{ ._, ._l, .sh, .tmp3p, .tmp1b, ._, ._ },16743 .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ },
8771 .{ ._, ._, .@"or", .tmp2p, .tmp3p, ._, ._ },16744 .{ ._, .fromCondition(cc), .set, .tmp8b, ._, ._, ._ },
8772 .{ ._, ._, .add, .tmp1d, .si(1), ._, ._ },16745 .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ },
8773 .{ ._, ._, .@"test", .tmp1d, .sia(-1, .none, .add_ptr_bit_size), ._, ._ },16746 .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ },
16747 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
16748 .{ ._, ._c, .in, .tmp1d, ._, ._, ._ },
16749 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
8774 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },16750 .{ ._, ._nz, .j, .@"1f", ._, ._, ._ },
8775 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },16751 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
8776 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },16752 .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ },
8777 .{ ._, ._, .mov, .memia(.dst0p, .tmp3, .sub_ptr_size), .tmp2p, ._, ._ },16753 .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ },
8778 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },16754 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
8779 .{ .@"1:", ._, .add, .tmp0p, .si(1), ._, ._ },16755 .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ },
8780 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },16756 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
8781 .{ ._, ._, .@"test", .tmp1d, .sia(-1, .none, .add_ptr_bit_size), ._, ._ },16757 .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ },
8782 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },16758 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
8783 .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ },16759 .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ },
8784 .{ ._, ._r, .sh, .tmp3d, .si(3), ._, ._ },16760 .{ ._, ._r, .sh, .tmp6d, .si(9), ._, ._ },
8785 .{ ._, ._, .mov, .memi(.dst0p, .tmp3), .tmp2p, ._, ._ },16761 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp6), .tmp2q, ._, ._ },
8786 } },16762 } },
8787 } },16763 } },
8788 }) catch |err| switch (err) {16764 }) catch |err| switch (err) {
8789 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{16765 error.SelectFailed => return cg.fail("failed to select {s} {s} {} {} {}", .{
8790 @tagName(air_tag),16766 @tagName(air_tag),
16767 @tagName(extra.compareOperator()),
8791 cg.typeOf(extra.lhs).fmt(pt),16768 cg.typeOf(extra.lhs).fmt(pt),
8792 ops[0].tracking(cg),16769 ops[0].tracking(cg),
8793 ops[1].tracking(cg),16770 ops[1].tracking(cg),
...@@ -8797,15 +16774,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -8797,15 +16774,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
8797 .gte => unreachable,16774 .gte => unreachable,
8798 .gt => unreachable,16775 .gt => unreachable,
8799 }16776 }
8800 for (ops) |op| for (res) |r| {16777 try res[0].finish(inst, &.{ extra.lhs, extra.rhs }, &ops, cg);
8801 if (op.index == r.index) break;
8802 } else try op.die(cg);
8803 try res[0].moveTo(inst, cg);
8804 },16778 },
880516779
8806 .abs => |air_tag| if (use_old) try cg.airAbs(inst) else fallback: {16780 .abs => |air_tag| if (use_old) try cg.airAbs(inst) else {
8807 const ty_op = air_datas[@intFromEnum(inst)].ty_op;16781 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
8808 if (ty_op.ty.toType().isVector(zcu) and ty_op.ty.toType().childType(zcu).isRuntimeFloat()) break :fallback try cg.airAbs(inst);
8809 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});16782 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
8810 var res: [1]Temp = undefined;16783 var res: [1]Temp = undefined;
8811 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{16784 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{
...@@ -8986,6 +16959,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -8986,6 +16959,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
8986 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },16959 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
8987 .unused,16960 .unused,
8988 .unused,16961 .unused,
16962 .unused,
16963 .unused,
16964 .unused,
8989 },16965 },
8990 .dst_temps = .{.mem},16966 .dst_temps = .{.mem},
8991 .clobbers = .{ .eflags = true },16967 .clobbers = .{ .eflags = true },
...@@ -9010,7 +16986,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9010,7 +16986,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9010 .{ .src = .{ .mem, .none } },16986 .{ .src = .{ .mem, .none } },
9011 .{ .src = .{ .to_mm, .none } },16987 .{ .src = .{ .to_mm, .none } },
9012 },16988 },
9013 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .mmx } }},16989 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }},
9014 .each = .{ .once = &.{16990 .each = .{ .once = &.{
9015 .{ ._, .p_b, .abs, .dst0q, .src0q, ._, ._ },16991 .{ ._, .p_b, .abs, .dst0q, .src0q, ._, ._ },
9016 } },16992 } },
...@@ -9021,7 +16997,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9021,7 +16997,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9021 .{ .src = .{ .mem, .none } },16997 .{ .src = .{ .mem, .none } },
9022 .{ .src = .{ .to_mm, .none } },16998 .{ .src = .{ .to_mm, .none } },
9023 },16999 },
9024 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .mmx } }},17000 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }},
9025 .each = .{ .once = &.{17001 .each = .{ .once = &.{
9026 .{ ._, .p_w, .abs, .dst0q, .src0q, ._, ._ },17002 .{ ._, .p_w, .abs, .dst0q, .src0q, ._, ._ },
9027 } },17003 } },
...@@ -9032,7 +17008,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9032,7 +17008,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9032 .{ .src = .{ .mem, .none } },17008 .{ .src = .{ .mem, .none } },
9033 .{ .src = .{ .to_mm, .none } },17009 .{ .src = .{ .to_mm, .none } },
9034 },17010 },
9035 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .mmx } }},17011 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }},
9036 .each = .{ .once = &.{17012 .each = .{ .once = &.{
9037 .{ ._, .p_d, .abs, .dst0q, .src0q, ._, ._ },17013 .{ ._, .p_d, .abs, .dst0q, .src0q, ._, ._ },
9038 } },17014 } },
...@@ -9043,7 +17019,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9043,7 +17019,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9043 .{ .src = .{ .mem, .none } },17019 .{ .src = .{ .mem, .none } },
9044 .{ .src = .{ .to_sse, .none } },17020 .{ .src = .{ .to_sse, .none } },
9045 },17021 },
9046 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17022 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9047 .each = .{ .once = &.{17023 .each = .{ .once = &.{
9048 .{ ._, .p_b, .abs, .dst0x, .src0x, ._, ._ },17024 .{ ._, .p_b, .abs, .dst0x, .src0x, ._, ._ },
9049 } },17025 } },
...@@ -9054,7 +17030,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9054,7 +17030,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9054 .{ .src = .{ .mem, .none } },17030 .{ .src = .{ .mem, .none } },
9055 .{ .src = .{ .to_sse, .none } },17031 .{ .src = .{ .to_sse, .none } },
9056 },17032 },
9057 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17033 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9058 .each = .{ .once = &.{17034 .each = .{ .once = &.{
9059 .{ ._, .p_w, .abs, .dst0x, .src0x, ._, ._ },17035 .{ ._, .p_w, .abs, .dst0x, .src0x, ._, ._ },
9060 } },17036 } },
...@@ -9065,7 +17041,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9065,7 +17041,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9065 .{ .src = .{ .mem, .none } },17041 .{ .src = .{ .mem, .none } },
9066 .{ .src = .{ .to_sse, .none } },17042 .{ .src = .{ .to_sse, .none } },
9067 },17043 },
9068 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17044 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9069 .each = .{ .once = &.{17045 .each = .{ .once = &.{
9070 .{ ._, .p_d, .abs, .dst0x, .src0x, ._, ._ },17046 .{ ._, .p_d, .abs, .dst0x, .src0x, ._, ._ },
9071 } },17047 } },
...@@ -9076,7 +17052,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9076,7 +17052,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9076 .{ .src = .{ .mem, .none } },17052 .{ .src = .{ .mem, .none } },
9077 .{ .src = .{ .to_sse, .none } },17053 .{ .src = .{ .to_sse, .none } },
9078 },17054 },
9079 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17055 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9080 .each = .{ .once = &.{17056 .each = .{ .once = &.{
9081 .{ ._, .vp_b, .abs, .dst0x, .src0x, ._, ._ },17057 .{ ._, .vp_b, .abs, .dst0x, .src0x, ._, ._ },
9082 } },17058 } },
...@@ -9087,7 +17063,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9087,7 +17063,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9087 .{ .src = .{ .mem, .none } },17063 .{ .src = .{ .mem, .none } },
9088 .{ .src = .{ .to_sse, .none } },17064 .{ .src = .{ .to_sse, .none } },
9089 },17065 },
9090 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17066 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9091 .each = .{ .once = &.{17067 .each = .{ .once = &.{
9092 .{ ._, .vp_w, .abs, .dst0x, .src0x, ._, ._ },17068 .{ ._, .vp_w, .abs, .dst0x, .src0x, ._, ._ },
9093 } },17069 } },
...@@ -9098,7 +17074,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9098,7 +17074,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9098 .{ .src = .{ .mem, .none } },17074 .{ .src = .{ .mem, .none } },
9099 .{ .src = .{ .to_sse, .none } },17075 .{ .src = .{ .to_sse, .none } },
9100 },17076 },
9101 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17077 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9102 .each = .{ .once = &.{17078 .each = .{ .once = &.{
9103 .{ ._, .vp_d, .abs, .dst0x, .src0x, ._, ._ },17079 .{ ._, .vp_d, .abs, .dst0x, .src0x, ._, ._ },
9104 } },17080 } },
...@@ -9109,7 +17085,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9109,7 +17085,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9109 .{ .src = .{ .mem, .none } },17085 .{ .src = .{ .mem, .none } },
9110 .{ .src = .{ .to_sse, .none } },17086 .{ .src = .{ .to_sse, .none } },
9111 },17087 },
9112 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17088 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9113 .each = .{ .once = &.{17089 .each = .{ .once = &.{
9114 .{ ._, .vp_b, .abs, .dst0y, .src0y, ._, ._ },17090 .{ ._, .vp_b, .abs, .dst0y, .src0y, ._, ._ },
9115 } },17091 } },
...@@ -9120,7 +17096,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9120,7 +17096,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9120 .{ .src = .{ .mem, .none } },17096 .{ .src = .{ .mem, .none } },
9121 .{ .src = .{ .to_sse, .none } },17097 .{ .src = .{ .to_sse, .none } },
9122 },17098 },
9123 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17099 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9124 .each = .{ .once = &.{17100 .each = .{ .once = &.{
9125 .{ ._, .vp_w, .abs, .dst0y, .src0y, ._, ._ },17101 .{ ._, .vp_w, .abs, .dst0y, .src0y, ._, ._ },
9126 } },17102 } },
...@@ -9131,7 +17107,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9131,7 +17107,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9131 .{ .src = .{ .mem, .none } },17107 .{ .src = .{ .mem, .none } },
9132 .{ .src = .{ .to_sse, .none } },17108 .{ .src = .{ .to_sse, .none } },
9133 },17109 },
9134 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17110 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9135 .each = .{ .once = &.{17111 .each = .{ .once = &.{
9136 .{ ._, .vp_d, .abs, .dst0y, .src0y, ._, ._ },17112 .{ ._, .vp_d, .abs, .dst0y, .src0y, ._, ._ },
9137 } },17113 } },
...@@ -9148,6 +17124,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9148,6 +17124,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9148 .unused,17124 .unused,
9149 .unused,17125 .unused,
9150 .unused,17126 .unused,
17127 .unused,
17128 .unused,
17129 .unused,
9151 },17130 },
9152 .dst_temps = .{.mem},17131 .dst_temps = .{.mem},
9153 .clobbers = .{ .eflags = true },17132 .clobbers = .{ .eflags = true },
...@@ -9171,6 +17150,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9171,6 +17150,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9171 .unused,17150 .unused,
9172 .unused,17151 .unused,
9173 .unused,17152 .unused,
17153 .unused,
17154 .unused,
17155 .unused,
9174 },17156 },
9175 .dst_temps = .{.mem},17157 .dst_temps = .{.mem},
9176 .clobbers = .{ .eflags = true },17158 .clobbers = .{ .eflags = true },
...@@ -9194,6 +17176,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9194,6 +17176,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9194 .unused,17176 .unused,
9195 .unused,17177 .unused,
9196 .unused,17178 .unused,
17179 .unused,
17180 .unused,
17181 .unused,
9197 },17182 },
9198 .dst_temps = .{.mem},17183 .dst_temps = .{.mem},
9199 .clobbers = .{ .eflags = true },17184 .clobbers = .{ .eflags = true },
...@@ -9217,6 +17202,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9217,6 +17202,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9217 .unused,17202 .unused,
9218 .unused,17203 .unused,
9219 .unused,17204 .unused,
17205 .unused,
17206 .unused,
17207 .unused,
9220 },17208 },
9221 .dst_temps = .{.mem},17209 .dst_temps = .{.mem},
9222 .clobbers = .{ .eflags = true },17210 .clobbers = .{ .eflags = true },
...@@ -9240,6 +17228,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9240,6 +17228,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9240 .unused,17228 .unused,
9241 .unused,17229 .unused,
9242 .unused,17230 .unused,
17231 .unused,
17232 .unused,
17233 .unused,
9243 },17234 },
9244 .dst_temps = .{.mem},17235 .dst_temps = .{.mem},
9245 .clobbers = .{ .eflags = true },17236 .clobbers = .{ .eflags = true },
...@@ -9263,6 +17254,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9263,6 +17254,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9263 .unused,17254 .unused,
9264 .unused,17255 .unused,
9265 .unused,17256 .unused,
17257 .unused,
17258 .unused,
17259 .unused,
9266 },17260 },
9267 .dst_temps = .{.mem},17261 .dst_temps = .{.mem},
9268 .clobbers = .{ .eflags = true },17262 .clobbers = .{ .eflags = true },
...@@ -9286,6 +17280,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9286,6 +17280,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9286 .unused,17280 .unused,
9287 .unused,17281 .unused,
9288 .unused,17282 .unused,
17283 .unused,
17284 .unused,
17285 .unused,
9289 },17286 },
9290 .dst_temps = .{.mem},17287 .dst_temps = .{.mem},
9291 .clobbers = .{ .eflags = true },17288 .clobbers = .{ .eflags = true },
...@@ -9309,6 +17306,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9309,6 +17306,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9309 .unused,17306 .unused,
9310 .unused,17307 .unused,
9311 .unused,17308 .unused,
17309 .unused,
17310 .unused,
17311 .unused,
9312 },17312 },
9313 .dst_temps = .{.mem},17313 .dst_temps = .{.mem},
9314 .clobbers = .{ .eflags = true },17314 .clobbers = .{ .eflags = true },
...@@ -9332,6 +17332,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9332,6 +17332,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9332 .unused,17332 .unused,
9333 .unused,17333 .unused,
9334 .unused,17334 .unused,
17335 .unused,
17336 .unused,
17337 .unused,
9335 },17338 },
9336 .dst_temps = .{.mem},17339 .dst_temps = .{.mem},
9337 .clobbers = .{ .eflags = true },17340 .clobbers = .{ .eflags = true },
...@@ -9355,6 +17358,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9355,6 +17358,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9355 .unused,17358 .unused,
9356 .unused,17359 .unused,
9357 .unused,17360 .unused,
17361 .unused,
17362 .unused,
17363 .unused,
9358 },17364 },
9359 .dst_temps = .{.mem},17365 .dst_temps = .{.mem},
9360 .clobbers = .{ .eflags = true },17366 .clobbers = .{ .eflags = true },
...@@ -9378,6 +17384,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9378,6 +17384,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9378 .unused,17384 .unused,
9379 .unused,17385 .unused,
9380 .unused,17386 .unused,
17387 .unused,
17388 .unused,
17389 .unused,
9381 },17390 },
9382 .dst_temps = .{.mem},17391 .dst_temps = .{.mem},
9383 .clobbers = .{ .eflags = true },17392 .clobbers = .{ .eflags = true },
...@@ -9401,6 +17410,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9401,6 +17410,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9401 .unused,17410 .unused,
9402 .unused,17411 .unused,
9403 .unused,17412 .unused,
17413 .unused,
17414 .unused,
17415 .unused,
9404 },17416 },
9405 .dst_temps = .{.mem},17417 .dst_temps = .{.mem},
9406 .clobbers = .{ .eflags = true },17418 .clobbers = .{ .eflags = true },
...@@ -9424,6 +17436,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9424,6 +17436,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9424 .unused,17436 .unused,
9425 .unused,17437 .unused,
9426 .unused,17438 .unused,
17439 .unused,
17440 .unused,
17441 .unused,
9427 },17442 },
9428 .dst_temps = .{.mem},17443 .dst_temps = .{.mem},
9429 .clobbers = .{ .eflags = true },17444 .clobbers = .{ .eflags = true },
...@@ -9450,6 +17465,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9450,6 +17465,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9450 .unused,17465 .unused,
9451 .unused,17466 .unused,
9452 .unused,17467 .unused,
17468 .unused,
17469 .unused,
17470 .unused,
9453 },17471 },
9454 .dst_temps = .{.mem},17472 .dst_temps = .{.mem},
9455 .clobbers = .{ .eflags = true },17473 .clobbers = .{ .eflags = true },
...@@ -9476,6 +17494,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9476,6 +17494,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9476 .unused,17494 .unused,
9477 .unused,17495 .unused,
9478 .unused,17496 .unused,
17497 .unused,
17498 .unused,
17499 .unused,
9479 },17500 },
9480 .dst_temps = .{.mem},17501 .dst_temps = .{.mem},
9481 .clobbers = .{ .eflags = true },17502 .clobbers = .{ .eflags = true },
...@@ -9501,6 +17522,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9501,6 +17522,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9501 .unused,17522 .unused,
9502 .unused,17523 .unused,
9503 .unused,17524 .unused,
17525 .unused,
17526 .unused,
17527 .unused,
9504 },17528 },
9505 .dst_temps = .{.mem},17529 .dst_temps = .{.mem},
9506 .clobbers = .{ .eflags = true },17530 .clobbers = .{ .eflags = true },
...@@ -9527,6 +17551,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9527,6 +17551,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9527 .unused,17551 .unused,
9528 .unused,17552 .unused,
9529 .unused,17553 .unused,
17554 .unused,
17555 .unused,
17556 .unused,
9530 },17557 },
9531 .dst_temps = .{.mem},17558 .dst_temps = .{.mem},
9532 .clobbers = .{ .eflags = true },17559 .clobbers = .{ .eflags = true },
...@@ -9551,6 +17578,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9551,6 +17578,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9551 .unused,17578 .unused,
9552 .unused,17579 .unused,
9553 .unused,17580 .unused,
17581 .unused,
17582 .unused,
17583 .unused,
9554 },17584 },
9555 .dst_temps = .{.mem},17585 .dst_temps = .{.mem},
9556 .clobbers = .{ .eflags = true },17586 .clobbers = .{ .eflags = true },
...@@ -9577,6 +17607,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9577,6 +17607,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9577 .unused,17607 .unused,
9578 .unused,17608 .unused,
9579 .unused,17609 .unused,
17610 .unused,
17611 .unused,
17612 .unused,
9580 },17613 },
9581 .dst_temps = .{.mem},17614 .dst_temps = .{.mem},
9582 .clobbers = .{ .eflags = true },17615 .clobbers = .{ .eflags = true },
...@@ -9601,6 +17634,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9601,6 +17634,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9601 .unused,17634 .unused,
9602 .unused,17635 .unused,
9603 .unused,17636 .unused,
17637 .unused,
17638 .unused,
17639 .unused,
9604 },17640 },
9605 .dst_temps = .{.mem},17641 .dst_temps = .{.mem},
9606 .clobbers = .{ .eflags = true },17642 .clobbers = .{ .eflags = true },
...@@ -9627,6 +17663,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9627,6 +17663,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9627 .unused,17663 .unused,
9628 .unused,17664 .unused,
9629 .unused,17665 .unused,
17666 .unused,
17667 .unused,
17668 .unused,
9630 },17669 },
9631 .dst_temps = .{.mem},17670 .dst_temps = .{.mem},
9632 .clobbers = .{ .eflags = true },17671 .clobbers = .{ .eflags = true },
...@@ -9652,6 +17691,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9652,6 +17691,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9652 .unused,17691 .unused,
9653 .unused,17692 .unused,
9654 .unused,17693 .unused,
17694 .unused,
17695 .unused,
17696 .unused,
9655 },17697 },
9656 .dst_temps = .{.mem},17698 .dst_temps = .{.mem},
9657 .clobbers = .{ .eflags = true },17699 .clobbers = .{ .eflags = true },
...@@ -9678,6 +17720,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9678,6 +17720,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9678 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },17720 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
9679 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },17721 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
9680 .unused,17722 .unused,
17723 .unused,
17724 .unused,
17725 .unused,
9681 },17726 },
9682 .dst_temps = .{.mem},17727 .dst_temps = .{.mem},
9683 .clobbers = .{ .eflags = true },17728 .clobbers = .{ .eflags = true },
...@@ -9699,15 +17744,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9699,15 +17744,40 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9699 .{ ._, ._, .cmp, .tmp0d, .sa(.none, .add_src0_unaligned_size), ._, ._ },17744 .{ ._, ._, .cmp, .tmp0d, .sa(.none, .add_src0_unaligned_size), ._, ._ },
9700 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },17745 .{ ._, ._b, .j, .@"0b", ._, ._, ._ },
9701 } },17746 } },
17747 }, .{
17748 .required_features = .{ .avx, null, null, null },
17749 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any },
17750 .patterns = &.{
17751 .{ .src = .{ .to_sse, .none } },
17752 },
17753 .extra_temps = .{
17754 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
17755 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
17756 .unused,
17757 .unused,
17758 .unused,
17759 .unused,
17760 .unused,
17761 .unused,
17762 .unused,
17763 },
17764 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
17765 .each = .{ .once = &.{
17766 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
17767 .{ ._, .v_ps, .@"and", .dst0x, .src0x, .lea(.xword, .tmp0), ._ },
17768 } },
9702 }, .{17769 }, .{
9703 .required_features = .{ .sse, null, null, null },17770 .required_features = .{ .sse, null, null, null },
9704 .src_constraints = .{ .{ .scalar_exact_float = .{ .of = .xword, .is = .dword } }, .any },17771 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any },
9705 .patterns = &.{17772 .patterns = &.{
9706 .{ .src = .{ .to_mut_sse, .none } },17773 .{ .src = .{ .to_mut_sse, .none } },
9707 },17774 },
9708 .extra_temps = .{17775 .extra_temps = .{
9709 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },17776 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9710 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },17777 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
17778 .unused,
17779 .unused,
17780 .unused,
9711 .unused,17781 .unused,
9712 .unused,17782 .unused,
9713 .unused,17783 .unused,
...@@ -9719,33 +17789,61 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9719,33 +17789,61 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9719 .{ ._, ._ps, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },17789 .{ ._, ._ps, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },
9720 } },17790 } },
9721 }, .{17791 }, .{
9722 .required_features = .{ .sse2, null, null, null },17792 .required_features = .{ .avx, null, null, null },
9723 .src_constraints = .{ .{ .scalar_exact_float = .{ .of = .xword, .is = .qword } }, .any },17793 .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .any },
9724 .patterns = &.{17794 .patterns = &.{
9725 .{ .src = .{ .to_mut_sse, .none } },17795 .{ .src = .{ .to_sse, .none } },
17796 },
17797 .extra_temps = .{
17798 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
17799 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } },
17800 .unused,
17801 .unused,
17802 .unused,
17803 .unused,
17804 .unused,
17805 .unused,
17806 .unused,
17807 },
17808 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
17809 .each = .{ .once = &.{
17810 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
17811 .{ ._, .v_ps, .@"and", .dst0y, .src0y, .lea(.yword, .tmp0), ._ },
17812 } },
17813 }, .{
17814 .required_features = .{ .avx, null, null, null },
17815 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any },
17816 .patterns = &.{
17817 .{ .src = .{ .to_sse, .none } },
9726 },17818 },
9727 .extra_temps = .{17819 .extra_temps = .{
9728 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },17820 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9729 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },17821 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
17822 .unused,
17823 .unused,
17824 .unused,
9730 .unused,17825 .unused,
9731 .unused,17826 .unused,
9732 .unused,17827 .unused,
9733 .unused,17828 .unused,
9734 },17829 },
9735 .dst_temps = .{.{ .ref = .src0 }},17830 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9736 .each = .{ .once = &.{17831 .each = .{ .once = &.{
9737 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },17832 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9738 .{ ._, ._pd, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },17833 .{ ._, .v_pd, .@"and", .dst0x, .src0x, .lea(.xword, .tmp0), ._ },
9739 } },17834 } },
9740 }, .{17835 }, .{
9741 .required_features = .{ .sse, null, null, null },17836 .required_features = .{ .sse2, null, null, null },
9742 .src_constraints = .{ .{ .scalar_exact_float = .{ .of = .xword, .is = .qword } }, .any },17837 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any },
9743 .patterns = &.{17838 .patterns = &.{
9744 .{ .src = .{ .to_mut_sse, .none } },17839 .{ .src = .{ .to_mut_sse, .none } },
9745 },17840 },
9746 .extra_temps = .{17841 .extra_temps = .{
9747 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },17842 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9748 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },17843 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
17844 .unused,
17845 .unused,
17846 .unused,
9749 .unused,17847 .unused,
9750 .unused,17848 .unused,
9751 .unused,17849 .unused,
...@@ -9754,210 +17852,383 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9754,210 +17852,383 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9754 .dst_temps = .{.{ .ref = .src0 }},17852 .dst_temps = .{.{ .ref = .src0 }},
9755 .each = .{ .once = &.{17853 .each = .{ .once = &.{
9756 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },17854 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9757 .{ ._, ._ps, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },17855 .{ ._, ._pd, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },
9758 } },17856 } },
9759 }, .{17857 }, .{
9760 .required_features = .{ .avx, null, null, null },17858 .required_features = .{ .avx, null, null, null },
9761 .src_constraints = .{ .{ .scalar_exact_float = .{ .of = .xword, .is = .dword } }, .any },17859 .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .any },
9762 .patterns = &.{17860 .patterns = &.{
9763 .{ .src = .{ .to_sse, .none } },17861 .{ .src = .{ .to_sse, .none } },
9764 },17862 },
9765 .extra_temps = .{17863 .extra_temps = .{
9766 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },17864 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9767 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },17865 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } },
17866 .unused,
17867 .unused,
17868 .unused,
9768 .unused,17869 .unused,
9769 .unused,17870 .unused,
9770 .unused,17871 .unused,
9771 .unused,17872 .unused,
9772 },17873 },
9773 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17874 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9774 .each = .{ .once = &.{17875 .each = .{ .once = &.{
9775 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },17876 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9776 .{ ._, .v_ps, .@"and", .dst0x, .src0x, .lea(.xword, .tmp0), ._ },17877 .{ ._, .v_pd, .@"and", .dst0y, .src0y, .lea(.yword, .tmp0), ._ },
17878 } },
17879 }, .{
17880 .required_features = .{ .x87, null, null, null },
17881 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any },
17882 .patterns = &.{
17883 .{ .src = .{ .mem, .none } },
17884 .{ .src = .{ .to_x87, .none } },
17885 },
17886 .extra_temps = .{
17887 .{ .type = .f80, .kind = .{ .reg = .st7 } },
17888 .unused,
17889 .unused,
17890 .unused,
17891 .unused,
17892 .unused,
17893 .unused,
17894 .unused,
17895 .unused,
17896 },
17897 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .x87 } }},
17898 .each = .{ .once = &.{
17899 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
17900 .{ ._, .f_, .abs, ._, ._, ._, ._ },
17901 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
9777 } },17902 } },
9778 }, .{17903 }, .{
9779 .required_features = .{ .avx, null, null, null },17904 .required_features = .{ .avx, null, null, null },
9780 .src_constraints = .{ .{ .scalar_exact_float = .{ .of = .xword, .is = .qword } }, .any },17905 .src_constraints = .{ .{ .scalar_any_float = .xword }, .any },
9781 .patterns = &.{17906 .patterns = &.{
9782 .{ .src = .{ .to_sse, .none } },17907 .{ .src = .{ .to_sse, .none } },
9783 },17908 },
9784 .extra_temps = .{17909 .extra_temps = .{
9785 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },17910 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9786 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },17911 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
17912 .unused,
17913 .unused,
17914 .unused,
9787 .unused,17915 .unused,
9788 .unused,17916 .unused,
9789 .unused,17917 .unused,
9790 .unused,17918 .unused,
9791 },17919 },
9792 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17920 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9793 .each = .{ .once = &.{17921 .each = .{ .once = &.{
9794 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },17922 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9795 .{ ._, .v_pd, .@"and", .dst0x, .src0x, .lea(.xword, .tmp0), ._ },17923 .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.xword, .tmp0), ._ },
9796 } },17924 } },
9797 }, .{17925 }, .{
9798 .required_features = .{ .avx, null, null, null },17926 .required_features = .{ .sse2, null, null, null },
9799 .src_constraints = .{ .{ .scalar_exact_float = .{ .of = .yword, .is = .dword } }, .any },17927 .src_constraints = .{ .{ .scalar_any_float = .xword }, .any },
17928 .patterns = &.{
17929 .{ .src = .{ .to_mut_sse, .none } },
17930 },
17931 .extra_temps = .{
17932 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
17933 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
17934 .unused,
17935 .unused,
17936 .unused,
17937 .unused,
17938 .unused,
17939 .unused,
17940 .unused,
17941 },
17942 .dst_temps = .{.{ .ref = .src0 }},
17943 .each = .{ .once = &.{
17944 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
17945 .{ ._, .p_, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },
17946 } },
17947 }, .{
17948 .required_features = .{ .sse, null, null, null },
17949 .src_constraints = .{ .{ .scalar_any_float = .xword }, .any },
17950 .patterns = &.{
17951 .{ .src = .{ .to_mut_sse, .none } },
17952 },
17953 .extra_temps = .{
17954 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
17955 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
17956 .unused,
17957 .unused,
17958 .unused,
17959 .unused,
17960 .unused,
17961 .unused,
17962 .unused,
17963 },
17964 .dst_temps = .{.{ .ref = .src0 }},
17965 .each = .{ .once = &.{
17966 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
17967 .{ ._, ._ps, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },
17968 } },
17969 }, .{
17970 .required_features = .{ .avx2, null, null, null },
17971 .src_constraints = .{ .{ .scalar_any_float = .yword }, .any },
9800 .patterns = &.{17972 .patterns = &.{
9801 .{ .src = .{ .to_sse, .none } },17973 .{ .src = .{ .to_sse, .none } },
9802 },17974 },
9803 .extra_temps = .{17975 .extra_temps = .{
9804 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },17976 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9805 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },17977 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } },
17978 .unused,
17979 .unused,
17980 .unused,
9806 .unused,17981 .unused,
9807 .unused,17982 .unused,
9808 .unused,17983 .unused,
9809 .unused,17984 .unused,
9810 },17985 },
9811 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},17986 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9812 .each = .{ .once = &.{17987 .each = .{ .once = &.{
9813 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },17988 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9814 .{ ._, .v_ps, .@"and", .dst0y, .src0y, .lea(.yword, .tmp0), ._ },17989 .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.yword, .tmp0), ._ },
9815 } },17990 } },
9816 }, .{17991 }, .{
9817 .required_features = .{ .avx, null, null, null },17992 .required_features = .{ .avx, null, null, null },
9818 .src_constraints = .{ .{ .scalar_exact_float = .{ .of = .yword, .is = .qword } }, .any },17993 .src_constraints = .{ .{ .scalar_any_float = .yword }, .any },
9819 .patterns = &.{17994 .patterns = &.{
9820 .{ .src = .{ .to_sse, .none } },17995 .{ .src = .{ .to_sse, .none } },
9821 },17996 },
9822 .extra_temps = .{17997 .extra_temps = .{
9823 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },17998 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
9824 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },17999 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } },
18000 .unused,
18001 .unused,
18002 .unused,
9825 .unused,18003 .unused,
9826 .unused,18004 .unused,
9827 .unused,18005 .unused,
9828 .unused,18006 .unused,
9829 },18007 },
9830 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},18008 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9831 .each = .{ .once = &.{18009 .each = .{ .once = &.{
9832 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },18010 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9833 .{ ._, .v_pd, .@"and", .dst0y, .src0y, .lea(.yword, .tmp0), ._ },18011 .{ ._, .v_pd, .@"and", .dst0y, .src0y, .lea(.yword, .tmp0), ._ },
9834 } },18012 } },
9835 }, .{18013 }, .{
9836 .required_features = .{ .x87, null, null, null },18014 .required_features = .{ .avx, null, null, null },
9837 .src_constraints = .{ .{ .scalar_exact_float = .{ .of = .xword, .is = .tbyte } }, .any },18015 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any },
9838 .patterns = &.{18016 .patterns = &.{
9839 .{ .src = .{ .to_x87, .none } },18017 .{ .src = .{ .to_mem, .none } },
18018 },
18019 .extra_temps = .{
18020 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18021 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } },
18022 .{ .kind = .{ .rc = .sse } },
18023 .{ .kind = .{ .rc = .sse } },
18024 .unused,
18025 .unused,
18026 .unused,
18027 .unused,
18028 .unused,
9840 },18029 },
9841 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .x87 } }},18030 .dst_temps = .{.mem},
9842 .clobbers = .{ .st = 1 },
9843 .each = .{ .once = &.{18031 .each = .{ .once = &.{
9844 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },18032 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9845 .{ ._, .f_, .abs, ._, ._, ._, ._ },18033 .{ ._, .v_ps, .mova, .tmp2y, .lea(.yword, .tmp0), ._, ._ },
9846 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },18034 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18035 .{ .@"0:", .v_ps, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ },
18036 .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ },
18037 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18038 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9847 } },18039 } },
9848 }, .{18040 }, .{
9849 .required_features = .{ .avx2, null, null, null },18041 .required_features = .{ .sse, null, null, null },
9850 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any },18042 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any },
9851 .patterns = &.{18043 .patterns = &.{
9852 .{ .src = .{ .to_sse, .none } },18044 .{ .src = .{ .to_mem, .none } },
9853 },18045 },
9854 .extra_temps = .{18046 .extra_temps = .{
9855 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },18047 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9856 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },18048 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
18049 .{ .kind = .{ .rc = .sse } },
18050 .{ .kind = .{ .rc = .sse } },
18051 .unused,
9857 .unused,18052 .unused,
9858 .unused,18053 .unused,
9859 .unused,18054 .unused,
9860 .unused,18055 .unused,
9861 },18056 },
9862 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},18057 .dst_temps = .{.mem},
9863 .each = .{ .once = &.{18058 .each = .{ .once = &.{
9864 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },18059 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9865 .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.xword, .tmp0), ._ },18060 .{ ._, ._ps, .mova, .tmp2x, .lea(.xword, .tmp0), ._, ._ },
18061 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18062 .{ .@"0:", ._ps, .mova, .tmp3x, .tmp2x, ._, ._ },
18063 .{ ._, ._ps, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
18064 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
18065 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
18066 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9866 } },18067 } },
9867 }, .{18068 }, .{
9868 .required_features = .{ .avx, null, null, null },18069 .required_features = .{ .avx, null, null, null },
9869 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any },18070 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any },
9870 .patterns = &.{18071 .patterns = &.{
9871 .{ .src = .{ .to_sse, .none } },18072 .{ .src = .{ .to_mem, .none } },
9872 },18073 },
9873 .extra_temps = .{18074 .extra_temps = .{
9874 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },18075 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9875 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },18076 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } },
18077 .{ .kind = .{ .rc = .sse } },
18078 .{ .kind = .{ .rc = .sse } },
18079 .unused,
9876 .unused,18080 .unused,
9877 .unused,18081 .unused,
9878 .unused,18082 .unused,
9879 .unused,18083 .unused,
9880 },18084 },
9881 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},18085 .dst_temps = .{.mem},
9882 .each = .{ .once = &.{18086 .each = .{ .once = &.{
9883 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },18087 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9884 .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.xword, .tmp0), ._ },18088 .{ ._, .v_pd, .mova, .tmp2y, .lea(.yword, .tmp0), ._, ._ },
18089 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18090 .{ .@"0:", .v_pd, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ },
18091 .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ },
18092 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18093 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9885 } },18094 } },
9886 }, .{18095 }, .{
9887 .required_features = .{ .sse2, null, null, null },18096 .required_features = .{ .sse2, null, null, null },
9888 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any },18097 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .any },
9889 .patterns = &.{18098 .patterns = &.{
9890 .{ .src = .{ .to_mut_sse, .none } },18099 .{ .src = .{ .to_mem, .none } },
9891 },18100 },
9892 .extra_temps = .{18101 .extra_temps = .{
9893 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },18102 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9894 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },18103 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
18104 .{ .kind = .{ .rc = .sse } },
18105 .{ .kind = .{ .rc = .sse } },
18106 .unused,
9895 .unused,18107 .unused,
9896 .unused,18108 .unused,
9897 .unused,18109 .unused,
9898 .unused,18110 .unused,
9899 },18111 },
9900 .dst_temps = .{.{ .ref = .src0 }},18112 .dst_temps = .{.mem},
9901 .each = .{ .once = &.{18113 .each = .{ .once = &.{
9902 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },18114 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9903 .{ ._, .p_, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },18115 .{ ._, ._pd, .mova, .tmp2x, .lea(.xword, .tmp0), ._, ._ },
18116 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18117 .{ .@"0:", ._pd, .mova, .tmp3x, .tmp2x, ._, ._ },
18118 .{ ._, ._pd, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
18119 .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
18120 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
18121 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9904 } },18122 } },
9905 }, .{18123 }, .{
9906 .required_features = .{ .sse, null, null, null },18124 .required_features = .{ .avx2, null, null, null },
9907 .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any },18125 .src_constraints = .{ .{ .multiple_scalar_any_float = .yword }, .any },
9908 .patterns = &.{18126 .patterns = &.{
9909 .{ .src = .{ .to_mut_sse, .none } },18127 .{ .src = .{ .to_mem, .none } },
9910 },18128 },
9911 .extra_temps = .{18129 .extra_temps = .{
9912 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },18130 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9913 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },18131 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } },
18132 .{ .kind = .{ .rc = .sse } },
18133 .{ .kind = .{ .rc = .sse } },
18134 .unused,
9914 .unused,18135 .unused,
9915 .unused,18136 .unused,
9916 .unused,18137 .unused,
9917 .unused,18138 .unused,
9918 },18139 },
9919 .dst_temps = .{.{ .ref = .src0 }},18140 .dst_temps = .{.mem},
18141 .each = .{ .once = &.{
18142 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
18143 .{ ._, .v_dqa, .mov, .tmp2y, .lea(.yword, .tmp0), ._, ._ },
18144 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18145 .{ .@"0:", .vp_, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ },
18146 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ },
18147 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18148 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18149 } },
18150 }, .{
18151 .required_features = .{ .avx, null, null, null },
18152 .src_constraints = .{ .{ .multiple_scalar_any_float = .yword }, .any },
18153 .patterns = &.{
18154 .{ .src = .{ .to_mem, .none } },
18155 },
18156 .extra_temps = .{
18157 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18158 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } },
18159 .{ .kind = .{ .rc = .sse } },
18160 .{ .kind = .{ .rc = .sse } },
18161 .unused,
18162 .unused,
18163 .unused,
18164 .unused,
18165 .unused,
18166 },
18167 .dst_temps = .{.mem},
9920 .each = .{ .once = &.{18168 .each = .{ .once = &.{
9921 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },18169 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9922 .{ ._, ._ps, .@"and", .dst0x, .lea(.xword, .tmp0), ._, ._ },18170 .{ ._, .v_pd, .mova, .tmp2y, .lea(.yword, .tmp0), ._, ._ },
18171 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18172 .{ .@"0:", .v_pd, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ },
18173 .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ },
18174 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18175 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9923 } },18176 } },
9924 }, .{18177 }, .{
9925 .required_features = .{ .avx2, null, null, null },18178 .required_features = .{ .sse2, null, null, null },
9926 .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .xword } }, .any },18179 .src_constraints = .{ .{ .multiple_scalar_any_float = .xword }, .any },
9927 .patterns = &.{18180 .patterns = &.{
9928 .{ .src = .{ .to_sse, .none } },18181 .{ .src = .{ .to_mem, .none } },
9929 },18182 },
9930 .extra_temps = .{18183 .extra_temps = .{
9931 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },18184 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9932 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },18185 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
18186 .{ .kind = .{ .rc = .sse } },
18187 .{ .kind = .{ .rc = .sse } },
18188 .unused,
9933 .unused,18189 .unused,
9934 .unused,18190 .unused,
9935 .unused,18191 .unused,
9936 .unused,18192 .unused,
9937 },18193 },
9938 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},18194 .dst_temps = .{.mem},
9939 .each = .{ .once = &.{18195 .each = .{ .once = &.{
9940 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },18196 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9941 .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.yword, .tmp0), ._ },18197 .{ ._, ._dqa, .mov, .tmp2x, .lea(.xword, .tmp0), ._, ._ },
18198 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18199 .{ .@"0:", ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ },
18200 .{ ._, .p_, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
18201 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
18202 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
18203 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9942 } },18204 } },
9943 }, .{18205 }, .{
9944 .required_features = .{ .avx, null, null, null },18206 .required_features = .{ .sse, null, null, null },
9945 .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .xword } }, .any },18207 .src_constraints = .{ .{ .multiple_scalar_any_float = .xword }, .any },
9946 .patterns = &.{18208 .patterns = &.{
9947 .{ .src = .{ .to_sse, .none } },18209 .{ .src = .{ .to_mem, .none } },
9948 },18210 },
9949 .extra_temps = .{18211 .extra_temps = .{
9950 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },18212 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9951 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize = true } } },18213 .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
18214 .{ .kind = .{ .rc = .sse } },
18215 .{ .kind = .{ .rc = .sse } },
18216 .unused,
9952 .unused,18217 .unused,
9953 .unused,18218 .unused,
9954 .unused,18219 .unused,
9955 .unused,18220 .unused,
9956 },18221 },
9957 .dst_temps = .{.{ .mut_reg = .{ .ref = .src0, .rc = .sse } }},18222 .dst_temps = .{.mem},
9958 .each = .{ .once = &.{18223 .each = .{ .once = &.{
9959 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },18224 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
9960 .{ ._, .v_pd, .@"and", .dst0y, .src0y, .lea(.yword, .tmp0), ._ },18225 .{ ._, ._ps, .mova, .tmp2x, .lea(.xword, .tmp0), ._, ._ },
18226 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18227 .{ .@"0:", ._ps, .mova, .tmp3x, .tmp2x, ._, ._ },
18228 .{ ._, ._ps, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
18229 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
18230 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
18231 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9961 } },18232 } },
9962 } }) catch |err| switch (err) {18233 } }) catch |err| switch (err) {
9963 error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{18234 error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{
...@@ -9967,10 +18238,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9967,10 +18238,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9967 }),18238 }),
9968 else => |e| return e,18239 else => |e| return e,
9969 };18240 };
9970 for (ops) |op| for (res) |r| {18241 try res[0].finish(inst, &.{ty_op.operand}, &ops, cg);
9971 if (op.index == r.index) break;
9972 } else try op.die(cg);
9973 try res[0].moveTo(inst, cg);
9974 },18242 },
997518243
9976 .cmp_lt,18244 .cmp_lt,
...@@ -10138,6 +18406,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10138,6 +18406,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10138 .unused,18406 .unused,
10139 .unused,18407 .unused,
10140 .unused,18408 .unused,
18409 .unused,
18410 .unused,
18411 .unused,
10141 },18412 },
10142 .dst_temps = .{.{ .rc = .general_purpose }},18413 .dst_temps = .{.{ .rc = .general_purpose }},
10143 .clobbers = .{ .eflags = true },18414 .clobbers = .{ .eflags = true },
...@@ -10166,10 +18437,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10166,10 +18437,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10166 }),18437 }),
10167 else => |e| return e,18438 else => |e| return e,
10168 };18439 };
10169 for (ops) |op| for (res) |r| {18440 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
10170 if (op.index == r.index) break;
10171 } else try op.die(cg);
10172 try res[0].moveTo(inst, cg);
10173 },18441 },
10174 .cmp_eq,18442 .cmp_eq,
10175 .cmp_eq_optimized,18443 .cmp_eq_optimized,
...@@ -10182,7 +18450,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10182,7 +18450,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10182 }) else fallback: {18450 }) else fallback: {
10183 const bin_op = air_datas[@intFromEnum(inst)].bin_op;18451 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
10184 const scalar_ty = cg.typeOf(bin_op.lhs).scalarType(zcu);18452 const scalar_ty = cg.typeOf(bin_op.lhs).scalarType(zcu);
10185 if (cg.intInfo(scalar_ty) == null) break :fallback try cg.airCmp(inst, switch (air_tag) {18453 if (cg.intInfo(scalar_ty) == null and cg.floatBits(scalar_ty) == null) break :fallback try cg.airCmp(inst, switch (air_tag) {
10186 else => unreachable,18454 else => unreachable,
10187 .cmp_eq, .cmp_eq_optimized => .eq,18455 .cmp_eq, .cmp_eq_optimized => .eq,
10188 .cmp_neq, .cmp_neq_optimized => .neq,18456 .cmp_neq, .cmp_neq_optimized => .neq,
...@@ -10275,26 +18543,564 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10275,26 +18543,564 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10275 .unused,18543 .unused,
10276 .unused,18544 .unused,
10277 .unused,18545 .unused,
18546 .unused,
18547 .unused,
18548 .unused,
18549 },
18550 .dst_temps = .{.{ .cc = cc }},
18551 .clobbers = .{ .eflags = true },
18552 .each = .{ .once = &.{
18553 .{ ._, .p_, .xor, .tmp1q, .tmp1q, ._, ._ },
18554 .{ ._, .p_, .xor, .src0q, .src1q, ._, ._ },
18555 .{ ._, .p_b, .cmpeq, .tmp1q, .src0q, ._, ._ },
18556 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1q, ._, ._ },
18557 .{ ._, ._, .xor, .tmp0d, .si(0xff), ._, ._ },
18558 } },
18559 }, .{
18560 .required_features = .{ .avx, null, null, null },
18561 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } },
18562 .patterns = &.{
18563 .{ .src = .{ .to_xmm, .mem } },
18564 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
18565 .{ .src = .{ .to_xmm, .to_xmm } },
18566 },
18567 .extra_temps = .{
18568 .{ .kind = .{ .rc = .sse } },
18569 .unused,
18570 .unused,
18571 .unused,
18572 .unused,
18573 .unused,
18574 .unused,
18575 .unused,
18576 .unused,
18577 },
18578 .dst_temps = .{.{ .cc = cc }},
18579 .clobbers = .{ .eflags = true },
18580 .each = .{ .once = &.{
18581 .{ ._, .vp_, .xor, .tmp0x, .src0x, .src1x, ._ },
18582 .{ ._, .vp_, .@"test", .tmp0x, .tmp0x, ._, ._ },
18583 } },
18584 }, .{
18585 .required_features = .{ .sse4_1, null, null, null },
18586 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } },
18587 .patterns = &.{
18588 .{ .src = .{ .to_mut_xmm, .mem } },
18589 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
18590 .{ .src = .{ .to_mut_xmm, .to_xmm } },
18591 },
18592 .dst_temps = .{.{ .cc = cc }},
18593 .clobbers = .{ .eflags = true },
18594 .each = .{ .once = &.{
18595 .{ ._, .p_, .xor, .src0x, .src1x, ._, ._ },
18596 .{ ._, .p_, .@"test", .src0x, .src0x, ._, ._ },
18597 } },
18598 }, .{
18599 .required_features = .{ .sse2, null, null, null },
18600 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } },
18601 .patterns = &.{
18602 .{ .src = .{ .to_mut_xmm, .mem } },
18603 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
18604 .{ .src = .{ .to_mut_xmm, .to_xmm } },
18605 },
18606 .extra_temps = .{
18607 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
18608 .{ .kind = .{ .rc = .sse } },
18609 .unused,
18610 .unused,
18611 .unused,
18612 .unused,
18613 .unused,
18614 .unused,
18615 .unused,
18616 },
18617 .dst_temps = .{.{ .cc = cc }},
18618 .clobbers = .{ .eflags = true },
18619 .each = .{ .once = &.{
18620 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
18621 .{ ._, .p_, .xor, .src0x, .src1x, ._, ._ },
18622 .{ ._, .p_b, .cmpeq, .tmp1x, .src0x, ._, ._ },
18623 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1x, ._, ._ },
18624 .{ ._, ._, .xor, .tmp0d, .si(0xffff), ._, ._ },
18625 } },
18626 }, .{
18627 .required_features = .{ .avx2, null, null, null },
18628 .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword } },
18629 .patterns = &.{
18630 .{ .src = .{ .to_ymm, .mem } },
18631 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
18632 .{ .src = .{ .to_ymm, .to_ymm } },
18633 },
18634 .extra_temps = .{
18635 .{ .kind = .{ .rc = .sse } },
18636 .unused,
18637 .unused,
18638 .unused,
18639 .unused,
18640 .unused,
18641 .unused,
18642 .unused,
18643 .unused,
18644 },
18645 .dst_temps = .{.{ .cc = cc }},
18646 .clobbers = .{ .eflags = true },
18647 .each = .{ .once = &.{
18648 .{ ._, .vp_, .xor, .tmp0y, .src0y, .src1y, ._ },
18649 .{ ._, .vp_, .@"test", .tmp0y, .tmp0y, ._, ._ },
18650 } },
18651 }, .{
18652 .required_features = .{ .avx, null, null, null },
18653 .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword } },
18654 .patterns = &.{
18655 .{ .src = .{ .to_ymm, .mem } },
18656 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
18657 .{ .src = .{ .to_ymm, .to_ymm } },
18658 },
18659 .extra_temps = .{
18660 .{ .kind = .{ .rc = .sse } },
18661 .unused,
18662 .unused,
18663 .unused,
18664 .unused,
18665 .unused,
18666 .unused,
18667 .unused,
18668 .unused,
18669 },
18670 .dst_temps = .{.{ .cc = cc }},
18671 .clobbers = .{ .eflags = true },
18672 .each = .{ .once = &.{
18673 .{ ._, .v_pd, .xor, .tmp0y, .src0y, .src1y, ._ },
18674 .{ ._, .vp_, .@"test", .tmp0y, .tmp0y, ._, ._ },
18675 } },
18676 }, .{
18677 .required_features = .{ .avx2, null, null, null },
18678 .src_constraints = .{
18679 .{ .remainder_int = .{ .of = .yword, .is = .xword } },
18680 .{ .remainder_int = .{ .of = .yword, .is = .xword } },
18681 },
18682 .patterns = &.{
18683 .{ .src = .{ .to_mem, .to_mem } },
18684 },
18685 .extra_temps = .{
18686 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18687 .{ .kind = .{ .rc = .sse } },
18688 .{ .kind = .{ .rc = .sse } },
18689 .unused,
18690 .unused,
18691 .unused,
18692 .unused,
18693 .unused,
18694 .unused,
18695 },
18696 .dst_temps = .{.{ .cc = cc }},
18697 .clobbers = .{ .eflags = true },
18698 .each = .{ .once = &.{
18699 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
18700 .{ ._, .vp_, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },
18701 .{ .@"0:", .v_dqu, .mov, .tmp2y, .memiad(.src0y, .tmp0, .add_size, -16), ._, ._ },
18702 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .memiad(.src1y, .tmp0, .add_size, -16), ._ },
18703 .{ ._, .vp_, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
18704 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18705 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18706 .{ ._, .v_dqa, .mov, .tmp2x, .memad(.src0x, .add_size, -16), ._, ._ },
18707 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .memad(.src1x, .add_size, -16), ._ },
18708 .{ ._, .vp_, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
18709 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
18710 } },
18711 }, .{
18712 .required_features = .{ .avx2, null, null, null },
18713 .src_constraints = .{
18714 .{ .remainder_int = .{ .of = .yword, .is = .yword } },
18715 .{ .remainder_int = .{ .of = .yword, .is = .yword } },
18716 },
18717 .patterns = &.{
18718 .{ .src = .{ .to_mem, .to_mem } },
18719 },
18720 .extra_temps = .{
18721 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18722 .{ .kind = .{ .rc = .sse } },
18723 .{ .kind = .{ .rc = .sse } },
18724 .unused,
18725 .unused,
18726 .unused,
18727 .unused,
18728 .unused,
18729 .unused,
18730 },
18731 .dst_temps = .{.{ .cc = cc }},
18732 .clobbers = .{ .eflags = true },
18733 .each = .{ .once = &.{
18734 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18735 .{ ._, .vp_, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },
18736 .{ .@"0:", .v_dqu, .mov, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
18737 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._ },
18738 .{ ._, .vp_, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
18739 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18740 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18741 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
18742 } },
18743 }, .{
18744 .required_features = .{ .avx, null, null, null },
18745 .src_constraints = .{
18746 .{ .remainder_int = .{ .of = .yword, .is = .xword } },
18747 .{ .remainder_int = .{ .of = .yword, .is = .xword } },
18748 },
18749 .patterns = &.{
18750 .{ .src = .{ .to_mem, .to_mem } },
18751 },
18752 .extra_temps = .{
18753 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18754 .{ .kind = .{ .rc = .sse } },
18755 .{ .kind = .{ .rc = .sse } },
18756 .unused,
18757 .unused,
18758 .unused,
18759 .unused,
18760 .unused,
18761 .unused,
18762 },
18763 .dst_temps = .{.{ .cc = cc }},
18764 .clobbers = .{ .eflags = true },
18765 .each = .{ .once = &.{
18766 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },
18767 .{ ._, .v_pd, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },
18768 .{ .@"0:", .v_pd, .movu, .tmp2y, .memiad(.src0y, .tmp0, .add_size, -16), ._, ._ },
18769 .{ ._, .v_pd, .xor, .tmp2y, .tmp2y, .memiad(.src1y, .tmp0, .add_size, -16), ._ },
18770 .{ ._, .v_pd, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
18771 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18772 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18773 .{ ._, .v_pd, .mova, .tmp2x, .memad(.src0x, .add_size, -16), ._, ._ },
18774 .{ ._, .v_pd, .xor, .tmp2x, .tmp2x, .memad(.src1x, .add_size, -16), ._ },
18775 .{ ._, .v_pd, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
18776 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
18777 } },
18778 }, .{
18779 .required_features = .{ .avx, null, null, null },
18780 .src_constraints = .{
18781 .{ .remainder_int = .{ .of = .yword, .is = .yword } },
18782 .{ .remainder_int = .{ .of = .yword, .is = .yword } },
18783 },
18784 .patterns = &.{
18785 .{ .src = .{ .to_mem, .to_mem } },
18786 },
18787 .extra_temps = .{
18788 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18789 .{ .kind = .{ .rc = .sse } },
18790 .{ .kind = .{ .rc = .sse } },
18791 .unused,
18792 .unused,
18793 .unused,
18794 .unused,
18795 .unused,
18796 .unused,
18797 },
18798 .dst_temps = .{.{ .cc = cc }},
18799 .clobbers = .{ .eflags = true },
18800 .each = .{ .once = &.{
18801 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18802 .{ ._, .v_pd, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },
18803 .{ .@"0:", .v_pd, .movu, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
18804 .{ ._, .v_pd, .xor, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._ },
18805 .{ ._, .v_pd, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
18806 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18807 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18808 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
18809 } },
18810 }, .{
18811 .required_features = .{ .avx, null, null, null },
18812 .src_constraints = .{
18813 .{ .remainder_int = .{ .of = .xword, .is = .xword } },
18814 .{ .remainder_int = .{ .of = .xword, .is = .xword } },
18815 },
18816 .patterns = &.{
18817 .{ .src = .{ .to_mem, .to_mem } },
18818 },
18819 .extra_temps = .{
18820 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18821 .{ .kind = .{ .rc = .sse } },
18822 .{ .kind = .{ .rc = .sse } },
18823 .unused,
18824 .unused,
18825 .unused,
18826 .unused,
18827 .unused,
18828 .unused,
18829 },
18830 .dst_temps = .{.{ .cc = cc }},
18831 .clobbers = .{ .eflags = true },
18832 .each = .{ .once = &.{
18833 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18834 .{ ._, .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ },
18835 .{ .@"0:", .v_dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
18836 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._ },
18837 .{ ._, .vp_, .@"or", .tmp1x, .tmp1x, .tmp2x, ._ },
18838 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
18839 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18840 .{ ._, .vp_, .@"test", .tmp1x, .tmp1x, ._, ._ },
18841 } },
18842 }, .{
18843 .required_features = .{ .sse4_1, null, null, null },
18844 .src_constraints = .{
18845 .{ .remainder_int = .{ .of = .xword, .is = .xword } },
18846 .{ .remainder_int = .{ .of = .xword, .is = .xword } },
18847 },
18848 .patterns = &.{
18849 .{ .src = .{ .to_mem, .to_mem } },
18850 },
18851 .extra_temps = .{
18852 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18853 .{ .kind = .{ .rc = .sse } },
18854 .{ .kind = .{ .rc = .sse } },
18855 .unused,
18856 .unused,
18857 .unused,
18858 .unused,
18859 .unused,
18860 .unused,
18861 },
18862 .dst_temps = .{.{ .cc = cc }},
18863 .clobbers = .{ .eflags = true },
18864 .each = .{ .once = &.{
18865 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18866 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
18867 .{ .@"0:", ._dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
18868 .{ ._, .p_, .xor, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
18869 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
18870 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
18871 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18872 .{ ._, .p_, .@"test", .tmp1x, .tmp1x, ._, ._ },
18873 } },
18874 }, .{
18875 .required_features = .{ .sse2, null, null, null },
18876 .src_constraints = .{
18877 .{ .remainder_int = .{ .of = .xword, .is = .xword } },
18878 .{ .remainder_int = .{ .of = .xword, .is = .xword } },
18879 },
18880 .patterns = &.{
18881 .{ .src = .{ .to_mem, .to_mem } },
18882 },
18883 .extra_temps = .{
18884 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18885 .{ .kind = .{ .rc = .sse } },
18886 .{ .kind = .{ .rc = .sse } },
18887 .unused,
18888 .unused,
18889 .unused,
18890 .unused,
18891 .unused,
18892 .unused,
18893 },
18894 .dst_temps = .{.{ .cc = cc }},
18895 .clobbers = .{ .eflags = true },
18896 .each = .{ .once = &.{
18897 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18898 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
18899 .{ .@"0:", ._dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
18900 .{ ._, .p_, .xor, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
18901 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
18902 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
18903 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18904 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
18905 .{ ._, .p_b, .cmpeq, .tmp1x, .tmp2x, ._, ._ },
18906 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1x, ._, ._ },
18907 .{ ._, ._, .cmp, .tmp0d, .si(0xffff), ._, ._ },
18908 } },
18909 }, .{
18910 .required_features = .{ .sse, .mmx, null, null },
18911 .src_constraints = .{
18912 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
18913 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
18914 },
18915 .patterns = &.{
18916 .{ .src = .{ .to_mem, .to_mem } },
18917 },
18918 .extra_temps = .{
18919 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18920 .{ .kind = .{ .rc = .mmx } },
18921 .{ .kind = .{ .rc = .mmx } },
18922 .unused,
18923 .unused,
18924 .unused,
18925 .unused,
18926 .unused,
18927 .unused,
18928 },
18929 .dst_temps = .{.{ .cc = cc }},
18930 .clobbers = .{ .eflags = true },
18931 .each = .{ .once = &.{
18932 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18933 .{ ._, .p_, .xor, .tmp1q, .tmp1q, ._, ._ },
18934 .{ .@"0:", ._q, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
18935 .{ ._, .p_, .xor, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
18936 .{ ._, .p_, .@"or", .tmp1q, .tmp2q, ._, ._ },
18937 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
18938 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18939 .{ ._, .p_, .xor, .tmp2q, .tmp2q, ._, ._ },
18940 .{ ._, .p_b, .cmpeq, .tmp1q, .tmp2q, ._, ._ },
18941 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1q, ._, ._ },
18942 .{ ._, ._, .cmp, .tmp0d, .si(0xff), ._, ._ },
18943 } },
18944 }, .{
18945 .src_constraints = .{
18946 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
18947 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
18948 },
18949 .patterns = &.{
18950 .{ .src = .{ .to_mem, .to_mem } },
18951 },
18952 .extra_temps = .{
18953 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
18954 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
18955 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
18956 .unused,
18957 .unused,
18958 .unused,
18959 .unused,
18960 .unused,
18961 .unused,
18962 },
18963 .dst_temps = .{.{ .cc = cc }},
18964 .clobbers = .{ .eflags = true },
18965 .each = .{ .once = &.{
18966 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
18967 .{ ._, ._, .xor, .tmp1p, .tmp1p, ._, ._ },
18968 .{ .@"0:", ._, .mov, .tmp2p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
18969 .{ ._, ._, .xor, .tmp2p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
18970 .{ ._, ._, .@"or", .tmp1p, .tmp2p, ._, ._ },
18971 .{ ._, ._, .add, .tmp0p, .sa(.tmp2, .add_size), ._, ._ },
18972 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
18973 .{ ._, ._, .@"test", .tmp1p, .tmp1p, ._, ._ },
18974 } },
18975 }, .{
18976 .required_features = .{ .f16c, null, null, null },
18977 .src_constraints = .{ .{ .float = .word }, .{ .float = .word } },
18978 .patterns = &.{
18979 .{ .src = .{ .to_sse, .to_sse } },
18980 },
18981 .extra_temps = .{
18982 .{ .kind = .{ .rc = .sse } },
18983 .{ .kind = .{ .rc = .sse } },
18984 .unused,
18985 .unused,
18986 .unused,
18987 .unused,
18988 .unused,
18989 .unused,
18990 .unused,
18991 },
18992 .dst_temps = .{.{ .cc = switch (cc) {
18993 else => unreachable,
18994 .e => .z_and_np,
18995 .ne => .nz_or_p,
18996 } }},
18997 .clobbers = .{ .eflags = true },
18998 .each = .{ .once = &.{
18999 .{ ._, .vp_, .unpcklwd, .tmp0x, .src0x, .src1x, ._ },
19000 .{ ._, .v_ps, .cvtph2, .tmp0x, .tmp0x, ._, ._ },
19001 .{ ._, .v_, .movshdup, .tmp1x, .tmp0x, ._, ._ },
19002 .{ ._, .v_ss, .ucomi, .tmp0x, .tmp1x, ._, ._ },
19003 } },
19004 }, .{
19005 .required_features = .{ .sse, null, null, null },
19006 .src_constraints = .{ .{ .float = .word }, .{ .float = .word } },
19007 .patterns = &.{
19008 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } },
19009 },
19010 .call_frame = .{ .alignment = .@"16" },
19011 .extra_temps = .{
19012 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
19013 else => unreachable,
19014 .e => "__eqhf2",
19015 .ne => "__nehf2",
19016 } } } },
19017 .{ .type = .i32, .kind = .{ .reg = .eax } },
19018 .unused,
19019 .unused,
19020 .unused,
19021 .unused,
19022 .unused,
19023 .unused,
19024 .unused,
19025 },
19026 .dst_temps = .{.{ .cc = cc }},
19027 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
19028 .each = .{ .once = &.{
19029 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
19030 .{ ._, ._, .@"test", .tmp1d, .tmp1d, ._, ._ },
19031 } },
19032 }, .{
19033 .required_features = .{ .avx, null, null, null },
19034 .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword } },
19035 .patterns = &.{
19036 .{ .src = .{ .to_sse, .mem } },
19037 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
19038 .{ .src = .{ .to_sse, .to_sse } },
19039 },
19040 .extra_temps = .{
19041 .{ .type = .f16, .kind = .{ .rc = .sse } },
19042 .{ .type = .f16, .kind = .{ .rc = .sse } },
19043 .unused,
19044 .unused,
19045 .unused,
19046 .unused,
19047 .unused,
19048 .unused,
19049 .unused,
19050 },
19051 .dst_temps = .{.{ .cc = switch (cc) {
19052 else => unreachable,
19053 .e => .z_and_np,
19054 .ne => .nz_or_p,
19055 } }},
19056 .clobbers = .{ .eflags = true },
19057 .each = .{ .once = &.{
19058 .{ ._, .v_ss, .ucomi, .src0x, .src1d, ._, ._ },
19059 } },
19060 }, .{
19061 .required_features = .{ .sse, null, null, null },
19062 .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword } },
19063 .patterns = &.{
19064 .{ .src = .{ .to_sse, .mem } },
19065 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
19066 .{ .src = .{ .to_sse, .to_sse } },
19067 },
19068 .extra_temps = .{
19069 .{ .type = .f16, .kind = .{ .rc = .sse } },
19070 .{ .type = .f16, .kind = .{ .rc = .sse } },
19071 .unused,
19072 .unused,
19073 .unused,
19074 .unused,
19075 .unused,
19076 .unused,
19077 .unused,
10278 },19078 },
10279 .dst_temps = .{.{ .cc = cc }},19079 .dst_temps = .{.{ .cc = switch (cc) {
19080 else => unreachable,
19081 .e => .z_and_np,
19082 .ne => .nz_or_p,
19083 } }},
10280 .clobbers = .{ .eflags = true },19084 .clobbers = .{ .eflags = true },
10281 .each = .{ .once = &.{19085 .each = .{ .once = &.{
10282 .{ ._, .p_, .xor, .tmp1q, .tmp1q, ._, ._ },19086 .{ ._, ._ss, .ucomi, .src0x, .src1d, ._, ._ },
10283 .{ ._, .p_, .xor, .src0q, .src1q, ._, ._ },
10284 .{ ._, .p_b, .cmpeq, .tmp1q, .src0q, ._, ._ },
10285 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1q, ._, ._ },
10286 .{ ._, ._, .xor, .tmp0d, .si(0xff), ._, ._ },
10287 } },19087 } },
10288 }, .{19088 }, .{
10289 .required_features = .{ .avx, null, null, null },19089 .required_features = .{ .sse, null, null, null },
10290 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } },19090 .src_constraints = .{ .{ .float = .dword }, .{ .float = .word } },
10291 .patterns = &.{19091 .patterns = &.{
10292 .{ .src = .{ .to_xmm, .mem } },19092 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } },
10293 .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } },
10294 .{ .src = .{ .to_xmm, .to_xmm } },
10295 },19093 },
19094 .call_frame = .{ .alignment = .@"16" },
10296 .extra_temps = .{19095 .extra_temps = .{
10297 .{ .kind = .{ .rc = .sse } },19096 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
19097 else => unreachable,
19098 .e => "__eqsf2",
19099 .ne => "__nesf2",
19100 } } } },
19101 .{ .type = .i32, .kind = .{ .reg = .eax } },
19102 .unused,
19103 .unused,
10298 .unused,19104 .unused,
10299 .unused,19105 .unused,
10300 .unused,19106 .unused,
...@@ -10302,82 +19108,83 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10302,82 +19108,83 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10302 .unused,19108 .unused,
10303 },19109 },
10304 .dst_temps = .{.{ .cc = cc }},19110 .dst_temps = .{.{ .cc = cc }},
10305 .clobbers = .{ .eflags = true },19111 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
10306 .each = .{ .once = &.{
10307 .{ ._, .vp_, .xor, .tmp0x, .src0x, .src1x, ._ },
10308 .{ ._, .vp_, .@"test", .tmp0x, .tmp0x, ._, ._ },
10309 } },
10310 }, .{
10311 .required_features = .{ .sse4_1, null, null, null },
10312 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } },
10313 .patterns = &.{
10314 .{ .src = .{ .to_mut_xmm, .mem } },
10315 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },
10316 .{ .src = .{ .to_mut_xmm, .to_xmm } },
10317 },
10318 .dst_temps = .{.{ .cc = cc }},
10319 .clobbers = .{ .eflags = true },
10320 .each = .{ .once = &.{19112 .each = .{ .once = &.{
10321 .{ ._, .p_, .xor, .src0x, .src1x, ._, ._ },19113 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
10322 .{ ._, .p_, .@"test", .src0x, .src0x, ._, ._ },19114 .{ ._, ._, .@"test", .tmp1d, .tmp1d, ._, ._ },
10323 } },19115 } },
10324 }, .{19116 }, .{
10325 .required_features = .{ .sse2, null, null, null },19117 .required_features = .{ .avx, null, null, null },
10326 .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } },19118 .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } },
10327 .patterns = &.{19119 .patterns = &.{
10328 .{ .src = .{ .to_mut_xmm, .mem } },19120 .{ .src = .{ .to_sse, .mem } },
10329 .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } },19121 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
10330 .{ .src = .{ .to_mut_xmm, .to_xmm } },19122 .{ .src = .{ .to_sse, .to_sse } },
10331 },19123 },
10332 .extra_temps = .{19124 .extra_temps = .{
10333 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },19125 .{ .type = .f16, .kind = .{ .rc = .sse } },
10334 .{ .kind = .{ .rc = .sse } },19126 .{ .type = .f16, .kind = .{ .rc = .sse } },
19127 .unused,
19128 .unused,
19129 .unused,
10335 .unused,19130 .unused,
10336 .unused,19131 .unused,
10337 .unused,19132 .unused,
10338 .unused,19133 .unused,
10339 },19134 },
10340 .dst_temps = .{.{ .cc = cc }},19135 .dst_temps = .{.{ .cc = switch (cc) {
19136 else => unreachable,
19137 .e => .z_and_np,
19138 .ne => .nz_or_p,
19139 } }},
10341 .clobbers = .{ .eflags = true },19140 .clobbers = .{ .eflags = true },
10342 .each = .{ .once = &.{19141 .each = .{ .once = &.{
10343 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },19142 .{ ._, .v_sd, .ucomi, .src0x, .src1q, ._, ._ },
10344 .{ ._, .p_, .xor, .src0x, .src1x, ._, ._ },
10345 .{ ._, .p_b, .cmpeq, .tmp1x, .src0x, ._, ._ },
10346 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1x, ._, ._ },
10347 .{ ._, ._, .xor, .tmp0d, .si(0xffff), ._, ._ },
10348 } },19143 } },
10349 }, .{19144 }, .{
10350 .required_features = .{ .avx2, null, null, null },19145 .required_features = .{ .sse2, null, null, null },
10351 .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword } },19146 .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } },
10352 .patterns = &.{19147 .patterns = &.{
10353 .{ .src = .{ .to_ymm, .mem } },19148 .{ .src = .{ .to_sse, .mem } },
10354 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },19149 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
10355 .{ .src = .{ .to_ymm, .to_ymm } },19150 .{ .src = .{ .to_sse, .to_sse } },
10356 },19151 },
10357 .extra_temps = .{19152 .extra_temps = .{
10358 .{ .kind = .{ .rc = .sse } },19153 .{ .type = .f16, .kind = .{ .rc = .sse } },
19154 .{ .type = .f16, .kind = .{ .rc = .sse } },
19155 .unused,
19156 .unused,
10359 .unused,19157 .unused,
10360 .unused,19158 .unused,
10361 .unused,19159 .unused,
10362 .unused,19160 .unused,
10363 .unused,19161 .unused,
10364 },19162 },
10365 .dst_temps = .{.{ .cc = cc }},19163 .dst_temps = .{.{ .cc = switch (cc) {
19164 else => unreachable,
19165 .e => .z_and_np,
19166 .ne => .nz_or_p,
19167 } }},
10366 .clobbers = .{ .eflags = true },19168 .clobbers = .{ .eflags = true },
10367 .each = .{ .once = &.{19169 .each = .{ .once = &.{
10368 .{ ._, .vp_, .xor, .tmp0y, .src0y, .src1y, ._ },19170 .{ ._, ._sd, .ucomi, .src0x, .src1q, ._, ._ },
10369 .{ ._, .vp_, .@"test", .tmp0y, .tmp0y, ._, ._ },
10370 } },19171 } },
10371 }, .{19172 }, .{
10372 .required_features = .{ .avx, null, null, null },19173 .required_features = .{ .sse, null, null, null },
10373 .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword } },19174 .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } },
10374 .patterns = &.{19175 .patterns = &.{
10375 .{ .src = .{ .to_ymm, .mem } },19176 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } },
10376 .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } },
10377 .{ .src = .{ .to_ymm, .to_ymm } },
10378 },19177 },
19178 .call_frame = .{ .alignment = .@"16" },
10379 .extra_temps = .{19179 .extra_temps = .{
10380 .{ .kind = .{ .rc = .sse } },19180 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
19181 else => unreachable,
19182 .e => "__eqdf2",
19183 .ne => "__nedf2",
19184 } } } },
19185 .{ .type = .i32, .kind = .{ .reg = .eax } },
19186 .unused,
19187 .unused,
10381 .unused,19188 .unused,
10382 .unused,19189 .unused,
10383 .unused,19190 .unused,
...@@ -10385,109 +19192,112 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10385,109 +19192,112 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10385 .unused,19192 .unused,
10386 },19193 },
10387 .dst_temps = .{.{ .cc = cc }},19194 .dst_temps = .{.{ .cc = cc }},
10388 .clobbers = .{ .eflags = true },19195 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
10389 .each = .{ .once = &.{19196 .each = .{ .once = &.{
10390 .{ ._, .v_pd, .xor, .tmp0y, .src0y, .src1y, ._ },19197 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
10391 .{ ._, .vp_, .@"test", .tmp0y, .tmp0y, ._, ._ },19198 .{ ._, ._, .@"test", .tmp1d, .tmp1d, ._, ._ },
10392 } },19199 } },
10393 }, .{19200 }, .{
10394 .required_features = .{ .avx2, null, null, null },19201 .required_features = .{ .x87, .cmov, null, null },
10395 .src_constraints = .{19202 .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } },
10396 .{ .remainder_int = .{ .of = .yword, .is = .xword } },
10397 .{ .remainder_int = .{ .of = .yword, .is = .xword } },
10398 },
10399 .patterns = &.{19203 .patterns = &.{
10400 .{ .src = .{ .to_mem, .to_mem } },19204 .{ .src = .{ .mem, .mem } },
10401 },19205 },
10402 .extra_temps = .{19206 .extra_temps = .{
10403 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19207 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10404 .{ .kind = .{ .rc = .sse } },19208 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10405 .{ .kind = .{ .rc = .sse } },19209 .unused,
19210 .unused,
19211 .unused,
19212 .unused,
10406 .unused,19213 .unused,
10407 .unused,19214 .unused,
10408 .unused,19215 .unused,
10409 },19216 },
10410 .dst_temps = .{.{ .cc = cc }},19217 .dst_temps = .{.{ .cc = switch (cc) {
19218 else => unreachable,
19219 .e => .z_and_np,
19220 .ne => .nz_or_p,
19221 } }},
10411 .clobbers = .{ .eflags = true },19222 .clobbers = .{ .eflags = true },
10412 .each = .{ .once = &.{19223 .each = .{ .once = &.{
10413 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },19224 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },
10414 .{ ._, .vp_, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },19225 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
10415 .{ .@"0:", .v_dqu, .mov, .tmp2y, .memiad(.src0y, .tmp0, .add_size, -16), ._, ._ },19226 .{ ._, .f_p, .ucomi, .tmp0t, .tmp1t, ._, ._ },
10416 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .memiad(.src1y, .tmp0, .add_size, -16), ._ },19227 .{ ._, .f_p, .st, .tmp1t, ._, ._, ._ },
10417 .{ ._, .vp_, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
10418 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
10419 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10420 .{ ._, .v_dqa, .mov, .tmp2x, .memad(.src0x, .add_size, -16), ._, ._ },
10421 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .memad(.src1x, .add_size, -16), ._ },
10422 .{ ._, .vp_, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
10423 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
10424 } },19228 } },
10425 }, .{19229 }, .{
10426 .required_features = .{ .avx2, null, null, null },19230 .required_features = .{ .x87, .cmov, null, null },
19231 .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } },
10427 .patterns = &.{19232 .patterns = &.{
10428 .{ .src = .{ .to_mem, .to_mem } },19233 .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } },
19234 .{ .src = .{ .mem, .to_x87 } },
19235 .{ .src = .{ .to_x87, .to_x87 } },
10429 },19236 },
10430 .extra_temps = .{19237 .extra_temps = .{
10431 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19238 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10432 .{ .kind = .{ .rc = .sse } },19239 .unused,
10433 .{ .kind = .{ .rc = .sse } },19240 .unused,
19241 .unused,
19242 .unused,
19243 .unused,
10434 .unused,19244 .unused,
10435 .unused,19245 .unused,
10436 .unused,19246 .unused,
10437 },19247 },
10438 .dst_temps = .{.{ .cc = cc }},19248 .dst_temps = .{.{ .cc = switch (cc) {
19249 else => unreachable,
19250 .e => .z_and_np,
19251 .ne => .nz_or_p,
19252 } }},
10439 .clobbers = .{ .eflags = true },19253 .clobbers = .{ .eflags = true },
10440 .each = .{ .once = &.{19254 .each = .{ .once = &.{
10441 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },19255 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
10442 .{ ._, .vp_, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },19256 .{ ._, .f_p, .ucomi, .tmp0t, .src1t, ._, ._ },
10443 .{ .@"0:", .v_dqu, .mov, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
10444 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._ },
10445 .{ ._, .vp_, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
10446 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
10447 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10448 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
10449 } },19257 } },
10450 }, .{19258 }, .{
10451 .required_features = .{ .avx, null, null, null },19259 .required_features = .{ .sahf, .x87, null, null },
10452 .src_constraints = .{19260 .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } },
10453 .{ .remainder_int = .{ .of = .yword, .is = .xword } },
10454 .{ .remainder_int = .{ .of = .yword, .is = .xword } },
10455 },
10456 .patterns = &.{19261 .patterns = &.{
10457 .{ .src = .{ .to_mem, .to_mem } },19262 .{ .src = .{ .mem, .mem } },
10458 },19263 },
10459 .extra_temps = .{19264 .extra_temps = .{
10460 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19265 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10461 .{ .kind = .{ .rc = .sse } },19266 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10462 .{ .kind = .{ .rc = .sse } },19267 .{ .type = .u8, .kind = .{ .reg = .ah } },
19268 .unused,
19269 .unused,
19270 .unused,
10463 .unused,19271 .unused,
10464 .unused,19272 .unused,
10465 .unused,19273 .unused,
10466 },19274 },
10467 .dst_temps = .{.{ .cc = cc }},19275 .dst_temps = .{.{ .cc = switch (cc) {
19276 else => unreachable,
19277 .e => .z_and_np,
19278 .ne => .nz_or_p,
19279 } }},
10468 .clobbers = .{ .eflags = true },19280 .clobbers = .{ .eflags = true },
10469 .each = .{ .once = &.{19281 .each = .{ .once = &.{
10470 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_size), ._, ._ },19282 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },
10471 .{ ._, .v_pd, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },19283 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
10472 .{ .@"0:", .v_pd, .movu, .tmp2y, .memiad(.src0y, .tmp0, .add_size, -16), ._, ._ },19284 .{ ._, .f_pp, .ucom, ._, ._, ._, ._ },
10473 .{ ._, .v_pd, .xor, .tmp2y, .tmp2y, .memiad(.src1y, .tmp0, .add_size, -16), ._ },19285 .{ ._, .fn_sw, .st, .tmp2w, ._, ._, ._ },
10474 .{ ._, .v_pd, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },19286 .{ ._, ._, .sahf, ._, ._, ._, ._ },
10475 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
10476 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10477 .{ ._, .v_pd, .mova, .tmp2x, .memad(.src0x, .add_size, -16), ._, ._ },
10478 .{ ._, .v_pd, .xor, .tmp2x, .tmp2x, .memad(.src1x, .add_size, -16), ._ },
10479 .{ ._, .v_pd, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },
10480 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
10481 } },19287 } },
10482 }, .{19288 }, .{
10483 .required_features = .{ .avx, null, null, null },19289 .required_features = .{ .@"64bit", .x87, null, null },
19290 .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } },
10484 .patterns = &.{19291 .patterns = &.{
10485 .{ .src = .{ .to_mem, .to_mem } },19292 .{ .src = .{ .mem, .mem } },
10486 },19293 },
10487 .extra_temps = .{19294 .extra_temps = .{
10488 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19295 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10489 .{ .kind = .{ .rc = .sse } },19296 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10490 .{ .kind = .{ .rc = .sse } },19297 .{ .type = .u8, .kind = .{ .reg = .ah } },
19298 .unused,
19299 .unused,
19300 .unused,
10491 .unused,19301 .unused,
10492 .unused,19302 .unused,
10493 .unused,19303 .unused,
...@@ -10495,74 +19305,89 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10495,74 +19305,89 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10495 .dst_temps = .{.{ .cc = cc }},19305 .dst_temps = .{.{ .cc = cc }},
10496 .clobbers = .{ .eflags = true },19306 .clobbers = .{ .eflags = true },
10497 .each = .{ .once = &.{19307 .each = .{ .once = &.{
10498 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },19308 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },
10499 .{ ._, .v_pd, .xor, .tmp1y, .tmp1y, .tmp1y, ._ },19309 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
10500 .{ .@"0:", .v_pd, .movu, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ },19310 .{ ._, .f_pp, .ucom, ._, ._, ._, ._ },
10501 .{ ._, .v_pd, .xor, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._ },19311 .{ ._, .fn_sw, .st, .tmp2w, ._, ._, ._ },
10502 .{ ._, .v_pd, .@"or", .tmp1y, .tmp1y, .tmp2y, ._ },19312 .{ ._, ._, .xor, .tmp2b, .si(0b0_1_000_000), ._, ._ },
10503 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },19313 .{ ._, ._, .@"test", .tmp2b, .si(0b0_1_000_100), ._, ._ },
10504 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10505 .{ ._, .vp_, .@"test", .tmp1y, .tmp1y, ._, ._ },
10506 } },19314 } },
10507 }, .{19315 }, .{
10508 .required_features = .{ .avx, null, null, null },19316 .required_features = .{ .x87, null, null, null },
19317 .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } },
10509 .patterns = &.{19318 .patterns = &.{
10510 .{ .src = .{ .to_mem, .to_mem } },19319 .{ .src = .{ .mem, .mem } },
10511 },19320 },
10512 .extra_temps = .{19321 .extra_temps = .{
10513 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19322 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10514 .{ .kind = .{ .rc = .sse } },19323 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10515 .{ .kind = .{ .rc = .sse } },19324 .{ .type = .u8, .kind = .{ .reg = .ah } },
19325 .unused,
19326 .unused,
19327 .unused,
10516 .unused,19328 .unused,
10517 .unused,19329 .unused,
10518 .unused,19330 .unused,
10519 },19331 },
10520 .dst_temps = .{.{ .cc = cc }},19332 .dst_temps = .{.{ .cc = switch (cc) {
19333 else => unreachable,
19334 .e => .z_and_np,
19335 .ne => .nz_or_p,
19336 } }},
10521 .clobbers = .{ .eflags = true },19337 .clobbers = .{ .eflags = true },
10522 .each = .{ .once = &.{19338 .each = .{ .once = &.{
10523 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },19339 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },
10524 .{ ._, .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ },19340 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
10525 .{ .@"0:", .v_dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },19341 .{ ._, .f_pp, .ucom, ._, ._, ._, ._ },
10526 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._ },19342 .{ ._, .fn_sw, .st, .tmp2w, ._, ._, ._ },
10527 .{ ._, .vp_, .@"or", .tmp1x, .tmp1x, .tmp2x, ._ },19343 .{ ._, ._, .sahf, ._, ._, ._, ._ },
10528 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
10529 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10530 .{ ._, .vp_, .@"test", .tmp1x, .tmp1x, ._, ._ },
10531 } },19344 } },
10532 }, .{19345 }, .{
10533 .required_features = .{ .sse4_1, null, null, null },19346 .required_features = .{ .sahf, .x87, null, null },
19347 .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } },
10534 .patterns = &.{19348 .patterns = &.{
10535 .{ .src = .{ .to_mem, .to_mem } },19349 .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } },
19350 .{ .src = .{ .mem, .to_x87 } },
19351 .{ .src = .{ .to_x87, .to_x87 } },
10536 },19352 },
10537 .extra_temps = .{19353 .extra_temps = .{
10538 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19354 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10539 .{ .kind = .{ .rc = .sse } },19355 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10540 .{ .kind = .{ .rc = .sse } },19356 .{ .type = .u16, .kind = .{ .reg = .ah } },
19357 .unused,
19358 .unused,
19359 .unused,
10541 .unused,19360 .unused,
10542 .unused,19361 .unused,
10543 .unused,19362 .unused,
10544 },19363 },
10545 .dst_temps = .{.{ .cc = cc }},19364 .dst_temps = .{.{ .cc = switch (cc) {
19365 else => unreachable,
19366 .e => .z_and_np,
19367 .ne => .nz_or_p,
19368 } }},
10546 .clobbers = .{ .eflags = true },19369 .clobbers = .{ .eflags = true },
10547 .each = .{ .once = &.{19370 .each = .{ .once = &.{
10548 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },19371 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
10549 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },19372 .{ ._, .f_p, .ucom, .src1t, ._, ._, ._ },
10550 .{ .@"0:", ._dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },19373 .{ ._, .fn_sw, .st, .tmp2w, ._, ._, ._ },
10551 .{ ._, .p_, .xor, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },19374 .{ ._, ._, .sahf, ._, ._, ._, ._ },
10552 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
10553 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
10554 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10555 .{ ._, .p_, .@"test", .tmp1x, .tmp1x, ._, ._ },
10556 } },19375 } },
10557 }, .{19376 }, .{
10558 .required_features = .{ .sse2, null, null, null },19377 .required_features = .{ .@"64bit", .x87, null, null },
19378 .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } },
10559 .patterns = &.{19379 .patterns = &.{
10560 .{ .src = .{ .to_mem, .to_mem } },19380 .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } },
19381 .{ .src = .{ .mem, .to_x87 } },
19382 .{ .src = .{ .to_x87, .to_x87 } },
10561 },19383 },
10562 .extra_temps = .{19384 .extra_temps = .{
10563 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19385 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10564 .{ .kind = .{ .rc = .sse } },19386 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10565 .{ .kind = .{ .rc = .sse } },19387 .{ .type = .u8, .kind = .{ .reg = .ah } },
19388 .unused,
19389 .unused,
19390 .unused,
10566 .unused,19391 .unused,
10567 .unused,19392 .unused,
10568 .unused,19393 .unused,
...@@ -10570,69 +19395,70 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10570,69 +19395,70 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10570 .dst_temps = .{.{ .cc = cc }},19395 .dst_temps = .{.{ .cc = cc }},
10571 .clobbers = .{ .eflags = true },19396 .clobbers = .{ .eflags = true },
10572 .each = .{ .once = &.{19397 .each = .{ .once = &.{
10573 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },19398 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
10574 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },19399 .{ ._, .f_p, .ucom, .src1t, ._, ._, ._ },
10575 .{ .@"0:", ._dqu, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ },19400 .{ ._, .fn_sw, .st, .tmp2w, ._, ._, ._ },
10576 .{ ._, .p_, .xor, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },19401 .{ ._, ._, .xor, .tmp2b, .si(0b0_1_000_000), ._, ._ },
10577 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },19402 .{ ._, ._, .@"test", .tmp2b, .si(0b0_1_000_100), ._, ._ },
10578 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
10579 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10580 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
10581 .{ ._, .p_b, .cmpeq, .tmp1x, .tmp2x, ._, ._ },
10582 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1x, ._, ._ },
10583 .{ ._, ._, .cmp, .tmp0d, .si(0xffff), ._, ._ },
10584 } },19403 } },
10585 }, .{19404 }, .{
10586 .required_features = .{ .sse, .mmx, null, null },19405 .required_features = .{ .x87, null, null, null },
19406 .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } },
10587 .patterns = &.{19407 .patterns = &.{
10588 .{ .src = .{ .to_mem, .to_mem } },19408 .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } },
19409 .{ .src = .{ .mem, .to_x87 } },
19410 .{ .src = .{ .to_x87, .to_x87 } },
10589 },19411 },
10590 .extra_temps = .{19412 .extra_temps = .{
10591 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19413 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10592 .{ .kind = .{ .rc = .mmx } },19414 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10593 .{ .kind = .{ .rc = .mmx } },19415 .{ .type = .u16, .kind = .{ .reg = .ah } },
19416 .unused,
19417 .unused,
19418 .unused,
10594 .unused,19419 .unused,
10595 .unused,19420 .unused,
10596 .unused,19421 .unused,
10597 },19422 },
10598 .dst_temps = .{.{ .cc = cc }},19423 .dst_temps = .{.{ .cc = switch (cc) {
19424 else => unreachable,
19425 .e => .z_and_np,
19426 .ne => .nz_or_p,
19427 } }},
10599 .clobbers = .{ .eflags = true },19428 .clobbers = .{ .eflags = true },
10600 .each = .{ .once = &.{19429 .each = .{ .once = &.{
10601 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },19430 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
10602 .{ ._, .p_, .xor, .tmp1q, .tmp1q, ._, ._ },19431 .{ ._, .f_p, .ucom, .src1t, ._, ._, ._ },
10603 .{ .@"0:", ._q, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },19432 .{ ._, .fn_sw, .st, .tmp2w, ._, ._, ._ },
10604 .{ ._, .p_, .xor, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },19433 .{ ._, ._, .sahf, ._, ._, ._, ._ },
10605 .{ ._, .p_, .@"or", .tmp1q, .tmp2q, ._, ._ },
10606 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
10607 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10608 .{ ._, .p_, .xor, .tmp2q, .tmp2q, ._, ._ },
10609 .{ ._, .p_b, .cmpeq, .tmp1q, .tmp2q, ._, ._ },
10610 .{ ._, .p_b, .movmsk, .tmp0d, .tmp1q, ._, ._ },
10611 .{ ._, ._, .cmp, .tmp0d, .si(0xff), ._, ._ },
10612 } },19434 } },
10613 }, .{19435 }, .{
19436 .required_features = .{ .sse, null, null, null },
19437 .src_constraints = .{ .{ .float = .xword }, .{ .float = .xword } },
10614 .patterns = &.{19438 .patterns = &.{
10615 .{ .src = .{ .to_mem, .to_mem } },19439 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } },
10616 },19440 },
19441 .call_frame = .{ .alignment = .@"16" },
10617 .extra_temps = .{19442 .extra_temps = .{
10618 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },19443 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) {
10619 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },19444 else => unreachable,
10620 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },19445 .e => "__eqtf2",
19446 .ne => "__netf2",
19447 } } } },
19448 .{ .type = .i32, .kind = .{ .reg = .eax } },
19449 .unused,
19450 .unused,
19451 .unused,
19452 .unused,
10621 .unused,19453 .unused,
10622 .unused,19454 .unused,
10623 .unused,19455 .unused,
10624 },19456 },
10625 .dst_temps = .{.{ .cc = cc }},19457 .dst_temps = .{.{ .cc = cc }},
10626 .clobbers = .{ .eflags = true },19458 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
10627 .each = .{ .once = &.{19459 .each = .{ .once = &.{
10628 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },19460 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
10629 .{ ._, ._, .xor, .tmp1p, .tmp1p, ._, ._ },19461 .{ ._, ._, .@"test", .tmp1d, .tmp1d, ._, ._ },
10630 .{ .@"0:", ._, .mov, .tmp2p, .memia(.src0p, .tmp0, .add_size), ._, ._ },
10631 .{ ._, ._, .xor, .tmp2p, .memia(.src1p, .tmp0, .add_size), ._, ._ },
10632 .{ ._, ._, .@"or", .tmp1p, .tmp2p, ._, ._ },
10633 .{ ._, ._, .add, .tmp0p, .sa(.tmp2, .add_size), ._, ._ },
10634 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10635 .{ ._, ._, .@"test", .tmp1p, .tmp1p, ._, ._ },
10636 } },19462 } },
10637 } },19463 } },
10638 }) catch |err| switch (err) {19464 }) catch |err| switch (err) {
...@@ -10644,10 +19470,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10644,10 +19470,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10644 }),19470 }),
10645 else => |e| return e,19471 else => |e| return e,
10646 };19472 };
10647 for (ops) |op| for (res) |r| {19473 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
10648 if (op.index == r.index) break;
10649 } else try op.die(cg);
10650 try res[0].moveTo(inst, cg);
10651 },19474 },
1065219475
10653 .cond_br => try cg.airCondBr(inst),19476 .cond_br => try cg.airCondBr(inst),
...@@ -10718,9 +19541,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10718,9 +19541,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10718 .fromSize(opt_child_abi_size) }),19541 .fromSize(opt_child_abi_size) }),
10719 .u(0),19542 .u(0),
10720 );19543 );
10721 var is_null = try cg.tempInit(.bool, .{ .eflags = .e });19544 const is_null = try cg.tempInit(.bool, .{ .eflags = .e });
10722 try ops[0].die(cg);19545 try is_null.finish(inst, &.{un_op}, &ops, cg);
10723 try is_null.moveTo(inst, cg);
10724 },19546 },
10725 .is_non_null_ptr => if (use_old) try cg.airIsNonNullPtr(inst) else {19547 .is_non_null_ptr => if (use_old) try cg.airIsNonNullPtr(inst) else {
10726 const un_op = air_datas[@intFromEnum(inst)].un_op;19548 const un_op = air_datas[@intFromEnum(inst)].un_op;
...@@ -10741,9 +19563,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10741,9 +19563,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10741 .fromSize(opt_child_abi_size) }),19563 .fromSize(opt_child_abi_size) }),
10742 .u(0),19564 .u(0),
10743 );19565 );
10744 var is_non_null = try cg.tempInit(.bool, .{ .eflags = .ne });19566 const is_non_null = try cg.tempInit(.bool, .{ .eflags = .ne });
10745 try ops[0].die(cg);19567 try is_non_null.finish(inst, &.{un_op}, &ops, cg);
10746 try is_non_null.moveTo(inst, cg);
10747 },19568 },
10748 .is_err_ptr => if (use_old) try cg.airIsErrPtr(inst) else {19569 .is_err_ptr => if (use_old) try cg.airIsErrPtr(inst) else {
10749 const un_op = air_datas[@intFromEnum(inst)].un_op;19570 const un_op = air_datas[@intFromEnum(inst)].un_op;
...@@ -10759,9 +19580,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10759,9 +19580,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10759 try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = cg.memSize(eu_err_ty) }),19580 try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = cg.memSize(eu_err_ty) }),
10760 .u(0),19581 .u(0),
10761 );19582 );
10762 var is_err = try cg.tempInit(.bool, .{ .eflags = .ne });19583 const is_err = try cg.tempInit(.bool, .{ .eflags = .ne });
10763 try ops[0].die(cg);19584 try is_err.finish(inst, &.{un_op}, &ops, cg);
10764 try is_err.moveTo(inst, cg);
10765 },19585 },
10766 .is_non_err_ptr => if (use_old) try cg.airIsNonErrPtr(inst) else {19586 .is_non_err_ptr => if (use_old) try cg.airIsNonErrPtr(inst) else {
10767 const un_op = air_datas[@intFromEnum(inst)].un_op;19587 const un_op = air_datas[@intFromEnum(inst)].un_op;
...@@ -10777,9 +19597,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10777,9 +19597,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10777 try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = cg.memSize(eu_err_ty) }),19597 try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = cg.memSize(eu_err_ty) }),
10778 .u(0),19598 .u(0),
10779 );19599 );
10780 var is_non_err = try cg.tempInit(.bool, .{ .eflags = .e });19600 const is_non_err = try cg.tempInit(.bool, .{ .eflags = .e });
10781 try ops[0].die(cg);19601 try is_non_err.finish(inst, &.{un_op}, &ops, cg);
10782 try is_non_err.moveTo(inst, cg);
10783 },19602 },
10784 .load => if (use_old) try cg.airLoad(inst) else fallback: {19603 .load => if (use_old) try cg.airLoad(inst) else fallback: {
10785 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19604 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
...@@ -10790,26 +19609,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10790,26 +19609,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10790 (ptr_info.flags.vector_index == .none or val_ty.toIntern() == .bool_type))19609 (ptr_info.flags.vector_index == .none or val_ty.toIntern() == .bool_type))
10791 break :fallback try cg.airLoad(inst);19610 break :fallback try cg.airLoad(inst);
10792 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19611 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
10793 var res = try ops[0].load(val_ty, .{19612 const res = try ops[0].load(val_ty, .{
10794 .disp = switch (ptr_info.flags.vector_index) {19613 .disp = switch (ptr_info.flags.vector_index) {
10795 .none => 0,19614 .none => 0,
10796 .runtime => unreachable,19615 .runtime => unreachable,
10797 else => |vector_index| @intCast(val_ty.abiSize(zcu) * @intFromEnum(vector_index)),19616 else => |vector_index| @intCast(val_ty.abiSize(zcu) * @intFromEnum(vector_index)),
10798 },19617 },
10799 }, cg);19618 }, cg);
10800 for (ops) |op| if (op.index != res.index) try op.die(cg);19619 try res.finish(inst, &.{ty_op.operand}, &ops, cg);
10801 try res.moveTo(inst, cg);
10802 },19620 },
10803 .int_from_ptr => if (use_old) try cg.airIntFromPtr(inst) else {19621 .int_from_ptr => if (use_old) try cg.airIntFromPtr(inst) else {
10804 const un_op = air_datas[@intFromEnum(inst)].un_op;19622 const un_op = air_datas[@intFromEnum(inst)].un_op;
10805 var ops = try cg.tempsFromOperands(inst, .{un_op});19623 var ops = try cg.tempsFromOperands(inst, .{un_op});
10806 try ops[0].toSlicePtr(cg);19624 try ops[0].toSlicePtr(cg);
10807 try ops[0].moveTo(inst, cg);19625 try ops[0].finish(inst, &.{un_op}, &ops, cg);
10808 },19626 },
10809 .int_from_bool => if (use_old) try cg.airIntFromBool(inst) else {19627 .int_from_bool => if (use_old) try cg.airIntFromBool(inst) else {
10810 const un_op = air_datas[@intFromEnum(inst)].un_op;19628 const un_op = air_datas[@intFromEnum(inst)].un_op;
10811 var ops = try cg.tempsFromOperands(inst, .{un_op});19629 const ops = try cg.tempsFromOperands(inst, .{un_op});
10812 try ops[0].moveTo(inst, cg);19630 try ops[0].finish(inst, &.{un_op}, &ops, cg);
10813 },19631 },
10814 .ret => try cg.airRet(inst, false),19632 .ret => try cg.airRet(inst, false),
10815 .ret_safe => try cg.airRet(inst, true),19633 .ret_safe => try cg.airRet(inst, true),
...@@ -10848,8 +19666,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10848,8 +19666,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10848 .unreach => {},19666 .unreach => {},
10849 .optional_payload_ptr => if (use_old) try cg.airOptionalPayloadPtr(inst) else {19667 .optional_payload_ptr => if (use_old) try cg.airOptionalPayloadPtr(inst) else {
10850 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19668 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
10851 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19669 const ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
10852 try ops[0].moveTo(inst, cg);19670 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
10853 },19671 },
10854 .optional_payload_ptr_set => if (use_old) try cg.airOptionalPayloadPtrSet(inst) else {19672 .optional_payload_ptr_set => if (use_old) try cg.airOptionalPayloadPtrSet(inst) else {
10855 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19673 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
...@@ -10864,7 +19682,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10864,7 +19682,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10864 try has_value.die(cg);19682 try has_value.die(cg);
10865 try ops[0].toOffset(-opt_child_abi_size, cg);19683 try ops[0].toOffset(-opt_child_abi_size, cg);
10866 }19684 }
10867 try ops[0].moveTo(inst, cg);19685 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
10868 },19686 },
10869 .unwrap_errunion_payload_ptr => if (use_old) try cg.airUnwrapErrUnionPayloadPtr(inst) else {19687 .unwrap_errunion_payload_ptr => if (use_old) try cg.airUnwrapErrUnionPayloadPtr(inst) else {
10870 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19688 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
...@@ -10873,7 +19691,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10873,7 +19691,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10873 const eu_pl_off: i32 = @intCast(codegen.errUnionPayloadOffset(eu_pl_ty, zcu));19691 const eu_pl_off: i32 = @intCast(codegen.errUnionPayloadOffset(eu_pl_ty, zcu));
10874 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19692 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
10875 try ops[0].toOffset(eu_pl_off, cg);19693 try ops[0].toOffset(eu_pl_off, cg);
10876 try ops[0].moveTo(inst, cg);19694 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
10877 },19695 },
10878 .unwrap_errunion_err_ptr => if (use_old) try cg.airUnwrapErrUnionErrPtr(inst) else {19696 .unwrap_errunion_err_ptr => if (use_old) try cg.airUnwrapErrUnionErrPtr(inst) else {
10879 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19697 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
...@@ -10882,9 +19700,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10882,9 +19700,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10882 const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu));19700 const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu));
10883 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19701 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
10884 try ops[0].toOffset(eu_err_off, cg);19702 try ops[0].toOffset(eu_err_off, cg);
10885 var err = try ops[0].load(eu_ty.errorUnionSet(zcu), .{}, cg);19703 const err = try ops[0].load(eu_ty.errorUnionSet(zcu), .{}, cg);
10886 try ops[0].die(cg);19704 try err.finish(inst, &.{ty_op.operand}, &ops, cg);
10887 try err.moveTo(inst, cg);
10888 },19705 },
10889 .errunion_payload_ptr_set => if (use_old) try cg.airErrUnionPayloadPtrSet(inst) else {19706 .errunion_payload_ptr_set => if (use_old) try cg.airErrUnionPayloadPtrSet(inst) else {
10890 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19707 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
...@@ -10899,7 +19716,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10899,7 +19716,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10899 try ops[0].store(&no_err, .{}, cg);19716 try ops[0].store(&no_err, .{}, cg);
10900 try no_err.die(cg);19717 try no_err.die(cg);
10901 try ops[0].toOffset(eu_pl_off - eu_err_off, cg);19718 try ops[0].toOffset(eu_pl_off - eu_err_off, cg);
10902 try ops[0].moveTo(inst, cg);19719 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
10903 },19720 },
10904 .struct_field_ptr => if (use_old) try cg.airStructFieldPtr(inst) else {19721 .struct_field_ptr => if (use_old) try cg.airStructFieldPtr(inst) else {
10905 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;19722 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
...@@ -10910,7 +19727,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10910,7 +19727,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10910 ty_pl.ty.toType(),19727 ty_pl.ty.toType(),
10911 extra.field_index,19728 extra.field_index,
10912 ), cg);19729 ), cg);
10913 try ops[0].moveTo(inst, cg);19730 try ops[0].finish(inst, &.{extra.struct_operand}, &ops, cg);
10914 },19731 },
10915 .struct_field_ptr_index_0,19732 .struct_field_ptr_index_0,
10916 .struct_field_ptr_index_1,19733 .struct_field_ptr_index_1,
...@@ -10936,7 +19753,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10936,7 +19753,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10936 .struct_field_ptr_index_3 => 3,19753 .struct_field_ptr_index_3 => 3,
10937 },19754 },
10938 ), cg);19755 ), cg);
10939 try ops[0].moveTo(inst, cg);19756 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
10940 },19757 },
10941 .struct_field_val => if (use_old) try cg.airStructFieldVal(inst) else fallback: {19758 .struct_field_val => if (use_old) try cg.airStructFieldVal(inst) else fallback: {
10942 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;19759 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
...@@ -10953,8 +19770,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10953,8 +19770,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10953 try ops[0].read(field_ty, .{ .disp = field_off }, cg)19770 try ops[0].read(field_ty, .{ .disp = field_off }, cg)
10954 else19771 else
10955 try cg.tempInit(field_ty, .none);19772 try cg.tempInit(field_ty, .none);
10956 for (ops) |op| if (op.index != res.index) try op.die(cg);19773 try res.finish(inst, &.{extra.struct_operand}, &ops, cg);
10957 try res.moveTo(inst, cg);
10958 },19774 },
10959 .set_union_tag => if (use_old) try cg.airSetUnionTag(inst) else {19775 .set_union_tag => if (use_old) try cg.airSetUnionTag(inst) else {
10960 const bin_op = air_datas[@intFromEnum(inst)].bin_op;19776 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
...@@ -10965,7 +19781,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10965,7 +19781,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10965 if (union_layout.tag_size > 0) try ops[0].store(&ops[1], .{19781 if (union_layout.tag_size > 0) try ops[0].store(&ops[1], .{
10966 .disp = @intCast(union_layout.tagOffset()),19782 .disp = @intCast(union_layout.tagOffset()),
10967 }, cg);19783 }, cg);
10968 for (ops) |op| try op.die(cg);19784 const res = try cg.tempInit(.void, .none);
19785 try res.finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
10969 },19786 },
10970 .get_union_tag => if (use_old) try cg.airGetUnionTag(inst) else {19787 .get_union_tag => if (use_old) try cg.airGetUnionTag(inst) else {
10971 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19788 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
...@@ -10973,42 +19790,41 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -10973,42 +19790,41 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
10973 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19790 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
10974 const union_layout = union_ty.unionGetLayout(zcu);19791 const union_layout = union_ty.unionGetLayout(zcu);
10975 assert(union_layout.tag_size > 0);19792 assert(union_layout.tag_size > 0);
10976 var res = try ops[0].read(ty_op.ty.toType(), .{19793 const res = try ops[0].read(ty_op.ty.toType(), .{
10977 .disp = @intCast(union_layout.tagOffset()),19794 .disp = @intCast(union_layout.tagOffset()),
10978 }, cg);19795 }, cg);
10979 for (ops) |op| if (op.index != res.index) try op.die(cg);19796 try res.finish(inst, &.{ty_op.operand}, &ops, cg);
10980 try res.moveTo(inst, cg);
10981 },19797 },
10982 .slice => if (use_old) try cg.airSlice(inst) else {19798 .slice => if (use_old) try cg.airSlice(inst) else {
10983 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;19799 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
10984 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;19800 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
10985 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });19801 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
10986 try ops[0].toPair(&ops[1], cg);19802 try ops[0].toPair(&ops[1], cg);
10987 try ops[0].moveTo(inst, cg);19803 try ops[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
10988 },19804 },
10989 .slice_len => if (use_old) try cg.airSliceLen(inst) else {19805 .slice_len => if (use_old) try cg.airSliceLen(inst) else {
10990 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19806 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
10991 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19807 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
10992 try ops[0].toSliceLen(cg);19808 try ops[0].toSliceLen(cg);
10993 try ops[0].moveTo(inst, cg);19809 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
10994 },19810 },
10995 .slice_ptr => if (use_old) try cg.airSlicePtr(inst) else {19811 .slice_ptr => if (use_old) try cg.airSlicePtr(inst) else {
10996 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19812 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
10997 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19813 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
10998 try ops[0].toSlicePtr(cg);19814 try ops[0].toSlicePtr(cg);
10999 try ops[0].moveTo(inst, cg);19815 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
11000 },19816 },
11001 .ptr_slice_len_ptr => if (use_old) try cg.airPtrSliceLenPtr(inst) else {19817 .ptr_slice_len_ptr => if (use_old) try cg.airPtrSliceLenPtr(inst) else {
11002 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19818 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
11003 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19819 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
11004 try ops[0].toOffset(8, cg);19820 try ops[0].toOffset(8, cg);
11005 try ops[0].moveTo(inst, cg);19821 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
11006 },19822 },
11007 .ptr_slice_ptr_ptr => if (use_old) try cg.airPtrSlicePtrPtr(inst) else {19823 .ptr_slice_ptr_ptr => if (use_old) try cg.airPtrSlicePtrPtr(inst) else {
11008 const ty_op = air_datas[@intFromEnum(inst)].ty_op;19824 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
11009 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});19825 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
11010 try ops[0].toOffset(0, cg);19826 try ops[0].toOffset(0, cg);
11011 try ops[0].moveTo(inst, cg);19827 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
11012 },19828 },
11013 .slice_elem_val, .ptr_elem_val => |air_tag| if (use_old) switch (air_tag) {19829 .slice_elem_val, .ptr_elem_val => |air_tag| if (use_old) switch (air_tag) {
11014 else => unreachable,19830 else => unreachable,
...@@ -11139,10 +19955,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -11139,10 +19955,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
11139 // hack around Sema OPV bugs19955 // hack around Sema OPV bugs
11140 res[0] = try cg.tempInit(res_ty, .none);19956 res[0] = try cg.tempInit(res_ty, .none);
11141 }19957 }
11142 for (ops) |op| for (res) |r| {19958 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
11143 if (op.index == r.index) break;
11144 } else try op.die(cg);
11145 try res[0].moveTo(inst, cg);
11146 },19959 },
11147 .slice_elem_ptr, .ptr_elem_ptr => |air_tag| if (use_old) switch (air_tag) {19960 .slice_elem_ptr, .ptr_elem_ptr => |air_tag| if (use_old) switch (air_tag) {
11148 else => unreachable,19961 else => unreachable,
...@@ -11195,8 +20008,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -11195,8 +20008,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
11195 } },20008 } },
11196 });20009 });
11197 }20010 }
11198 try ops[1].die(cg);20011 try ops[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
11199 try ops[0].moveTo(inst, cg);
11200 },20012 },
11201 .array_to_slice => if (use_old) try cg.airArrayToSlice(inst) else {20013 .array_to_slice => if (use_old) try cg.airArrayToSlice(inst) else {
11202 const ty_op = air_datas[@intFromEnum(inst)].ty_op;20014 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
...@@ -11205,7 +20017,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -11205,7 +20017,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
11205 .immediate = cg.typeOf(ty_op.operand).childType(zcu).arrayLen(zcu),20017 .immediate = cg.typeOf(ty_op.operand).childType(zcu).arrayLen(zcu),
11206 });20018 });
11207 try ops[0].toPair(&len, cg);20019 try ops[0].toPair(&len, cg);
11208 try ops[0].moveTo(inst, cg);20020 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
11209 },20021 },
11210 .error_set_has_value => return cg.fail("TODO implement error_set_has_value", .{}),20022 .error_set_has_value => return cg.fail("TODO implement error_set_has_value", .{}),
11211 .union_init => if (use_old) try cg.airUnionInit(inst) else {20023 .union_init => if (use_old) try cg.airUnionInit(inst) else {
...@@ -11228,8 +20040,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -11228,8 +20040,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
11228 try res.write(&ops[0], .{20040 try res.write(&ops[0], .{
11229 .disp = @intCast(union_layout.payloadOffset()),20041 .disp = @intCast(union_layout.payloadOffset()),
11230 }, cg);20042 }, cg);
11231 try ops[0].die(cg);20043 try res.finish(inst, &.{extra.init}, &ops, cg);
11232 try res.moveTo(inst, cg);
11233 },20044 },
11234 .field_parent_ptr => if (use_old) try cg.airFieldParentPtr(inst) else {20045 .field_parent_ptr => if (use_old) try cg.airFieldParentPtr(inst) else {
11235 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;20046 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
...@@ -11240,7 +20051,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -11240,7 +20051,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
11240 cg.typeOf(extra.field_ptr),20051 cg.typeOf(extra.field_ptr),
11241 extra.field_index,20052 extra.field_index,
11242 ), cg);20053 ), cg);
11243 try ops[0].moveTo(inst, cg);20054 try ops[0].finish(inst, &.{extra.field_ptr}, &ops, cg);
11244 },20055 },
1124520056
11246 .is_named_enum_value => return cg.fail("TODO implement is_named_enum_value", .{}),20057 .is_named_enum_value => return cg.fail("TODO implement is_named_enum_value", .{}),
...@@ -11250,7 +20061,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -11250,7 +20061,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1125020061
11251 .err_return_trace => {20062 .err_return_trace => {
11252 const ert: Temp = .{ .index = err_ret_trace_index };20063 const ert: Temp = .{ .index = err_ret_trace_index };
11253 try ert.moveTo(inst, cg);20064 try ert.finish(inst, &.{}, &.{}, cg);
11254 },20065 },
11255 .set_err_return_trace => {20066 .set_err_return_trace => {
11256 const un_op = air_datas[@intFromEnum(inst)].un_op;20067 const un_op = air_datas[@intFromEnum(inst)].un_op;
...@@ -11274,8 +20085,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -11274,8 +20085,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1127420085
11275 .addrspace_cast => {20086 .addrspace_cast => {
11276 const ty_op = air_datas[@intFromEnum(inst)].ty_op;20087 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
11277 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});20088 const ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
11278 try ops[0].moveTo(inst, cg);20089 try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg);
11279 },20090 },
1128020091
11281 .save_err_return_trace_index => {20092 .save_err_return_trace_index => {
...@@ -11285,7 +20096,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -11285,7 +20096,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
11285 var ert: Temp = .{ .index = err_ret_trace_index };20096 var ert: Temp = .{ .index = err_ret_trace_index };
11286 var res = try ert.load(.usize, .{ .disp = @intCast(agg_ty.structFieldOffset(ty_pl.payload, zcu)) }, cg);20097 var res = try ert.load(.usize, .{ .disp = @intCast(agg_ty.structFieldOffset(ty_pl.payload, zcu)) }, cg);
11287 try ert.die(cg);20098 try ert.die(cg);
11288 try res.moveTo(inst, cg);20099 try res.finish(inst, &.{}, &.{}, cg);
11289 },20100 },
1129020101
11291 .vector_store_elem => return cg.fail("TODO implement vector_store_elem", .{}),20102 .vector_store_elem => return cg.fail("TODO implement vector_store_elem", .{}),
...@@ -12109,13 +20920,13 @@ fn airIntCast(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -12109,13 +20920,13 @@ fn airIntCast(self: *CodeGen, inst: Air.Inst.Index) !void {
12109 const src_mcv = try self.resolveInst(ty_op.operand);20920 const src_mcv = try self.resolveInst(ty_op.operand);
12110 if (dst_ty.isVector(zcu)) {20921 if (dst_ty.isVector(zcu)) {
12111 const max_abi_size = @max(dst_abi_size, src_abi_size);20922 const max_abi_size = @max(dst_abi_size, src_abi_size);
12112 if (max_abi_size > self.vectorSize(.int)) break :result null;
12113 const has_avx = self.hasFeature(.avx);20923 const has_avx = self.hasFeature(.avx);
1211420924
12115 const dst_elem_abi_size = dst_ty.childType(zcu).abiSize(zcu);20925 const dst_elem_abi_size = dst_ty.childType(zcu).abiSize(zcu);
12116 const src_elem_abi_size = src_ty.childType(zcu).abiSize(zcu);20926 const src_elem_abi_size = src_ty.childType(zcu).abiSize(zcu);
12117 switch (std.math.order(dst_elem_abi_size, src_elem_abi_size)) {20927 switch (std.math.order(dst_elem_abi_size, src_elem_abi_size)) {
12118 .lt => {20928 .lt => {
20929 if (max_abi_size > self.vectorSize(.int)) break :result null;
12119 const mir_tag: Mir.Inst.FixedTag = switch (dst_elem_abi_size) {20930 const mir_tag: Mir.Inst.FixedTag = switch (dst_elem_abi_size) {
12120 else => break :result null,20931 else => break :result null,
12121 1 => switch (src_elem_abi_size) {20932 1 => switch (src_elem_abi_size) {
...@@ -12172,6 +20983,7 @@ fn airIntCast(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -12172,6 +20983,7 @@ fn airIntCast(self: *CodeGen, inst: Air.Inst.Index) !void {
12172 break :result dst_mcv;20983 break :result dst_mcv;
12173 },20984 },
12174 .gt => if (self.hasFeature(.sse4_1)) {20985 .gt => if (self.hasFeature(.sse4_1)) {
20986 if (max_abi_size > self.vectorSize(.int)) break :result null;
12175 const mir_tag: Mir.Inst.FixedTag = .{ switch (dst_elem_abi_size) {20987 const mir_tag: Mir.Inst.FixedTag = .{ switch (dst_elem_abi_size) {
12176 else => break :result null,20988 else => break :result null,
12177 2 => if (has_avx) .vp_w else .p_w,20989 2 => if (has_avx) .vp_w else .p_w,
...@@ -12609,12 +21421,11 @@ fn activeIntBits(self: *CodeGen, dst_air: Air.Inst.Ref) u16 {...@@ -12609,12 +21421,11 @@ fn activeIntBits(self: *CodeGen, dst_air: Air.Inst.Ref) u16 {
12609 return dst_info.bits;21421 return dst_info.bits;
12610}21422}
1261121423
12612fn airMulDivBinOp(self: *CodeGen, inst: Air.Inst.Index) !void {21424fn airMulDivBinOp(self: *CodeGen, inst: Air.Inst.Index, tag: Air.Inst.Tag) !void {
12613 const pt = self.pt;21425 const pt = self.pt;
12614 const zcu = pt.zcu;21426 const zcu = pt.zcu;
12615 const bin_op = self.air.instructions.items(.data)[@intFromEnum(inst)].bin_op;21427 const bin_op = self.air.instructions.items(.data)[@intFromEnum(inst)].bin_op;
12616 const result = result: {21428 const result = result: {
12617 const tag = self.air.instructions.items(.tag)[@intFromEnum(inst)];
12618 const dst_ty = self.typeOfIndex(inst);21429 const dst_ty = self.typeOfIndex(inst);
12619 switch (dst_ty.zigTypeTag(zcu)) {21430 switch (dst_ty.zigTypeTag(zcu)) {
12620 .float, .vector => break :result try self.genBinOp(inst, tag, bin_op.lhs, bin_op.rhs),21431 .float, .vector => break :result try self.genBinOp(inst, tag, bin_op.lhs, bin_op.rhs),
...@@ -15952,10 +24763,9 @@ fn airBitReverse(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -15952,10 +24763,9 @@ fn airBitReverse(self: *CodeGen, inst: Air.Inst.Index) !void {
15952 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });24763 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });
15953}24764}
1595424765
15955fn floatSign(self: *CodeGen, inst: Air.Inst.Index, operand: Air.Inst.Ref, ty: Type) !void {24766fn floatSign(self: *CodeGen, inst: Air.Inst.Index, tag: Air.Inst.Tag, operand: Air.Inst.Ref, ty: Type) !void {
15956 const pt = self.pt;24767 const pt = self.pt;
15957 const zcu = pt.zcu;24768 const zcu = pt.zcu;
15958 const tag = self.air.instructions.items(.tag)[@intFromEnum(inst)];
1595924769
15960 const result = result: {24770 const result = result: {
15961 const scalar_bits = ty.scalarType(zcu).floatBits(self.target.*);24771 const scalar_bits = ty.scalarType(zcu).floatBits(self.target.*);
...@@ -16080,10 +24890,10 @@ fn floatSign(self: *CodeGen, inst: Air.Inst.Index, operand: Air.Inst.Ref, ty: Ty...@@ -16080,10 +24890,10 @@ fn floatSign(self: *CodeGen, inst: Air.Inst.Index, operand: Air.Inst.Ref, ty: Ty
16080 return self.finishAir(inst, result, .{ operand, .none, .none });24890 return self.finishAir(inst, result, .{ operand, .none, .none });
16081}24891}
1608224892
16083fn airFloatSign(self: *CodeGen, inst: Air.Inst.Index) !void {24893fn airFloatSign(self: *CodeGen, inst: Air.Inst.Index, tag: Air.Inst.Tag) !void {
16084 const un_op = self.air.instructions.items(.data)[@intFromEnum(inst)].un_op;24894 const un_op = self.air.instructions.items(.data)[@intFromEnum(inst)].un_op;
16085 const ty = self.typeOf(un_op);24895 const ty = self.typeOf(un_op);
16086 return self.floatSign(inst, un_op, ty);24896 return self.floatSign(inst, tag, un_op, ty);
16087}24897}
1608824898
16089const RoundMode = packed struct(u5) {24899const RoundMode = packed struct(u5) {
...@@ -16366,7 +25176,7 @@ fn airAbs(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -16366,7 +25176,7 @@ fn airAbs(self: *CodeGen, inst: Air.Inst.Index) !void {
16366 break :result dst_mcv;25176 break :result dst_mcv;
16367 },25177 },
16368 },25178 },
16369 .float => return self.floatSign(inst, ty_op.operand, ty),25179 .float => return self.floatSign(inst, .abs, ty_op.operand, ty),
16370 .vector => switch (ty.childType(zcu).zigTypeTag(zcu)) {25180 .vector => switch (ty.childType(zcu).zigTypeTag(zcu)) {
16371 else => null,25181 else => null,
16372 .int => switch (ty.childType(zcu).intInfo(zcu).bits) {25182 .int => switch (ty.childType(zcu).intInfo(zcu).bits) {
...@@ -16402,7 +25212,7 @@ fn airAbs(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -16402,7 +25212,7 @@ fn airAbs(self: *CodeGen, inst: Air.Inst.Index) !void {
16402 5...8 => if (self.hasFeature(.avx2)) .{ .vp_d, .abs } else null,25212 5...8 => if (self.hasFeature(.avx2)) .{ .vp_d, .abs } else null,
16403 },25213 },
16404 },25214 },
16405 .float => return self.floatSign(inst, ty_op.operand, ty),25215 .float => return self.floatSign(inst, .abs, ty_op.operand, ty),
16406 },25216 },
16407 }) orelse return self.fail("TODO implement airAbs for {}", .{ty.fmt(pt)});25217 }) orelse return self.fail("TODO implement airAbs for {}", .{ty.fmt(pt)});
1640825218
...@@ -19263,7 +28073,7 @@ fn genBinOp(...@@ -19263,7 +28073,7 @@ fn genBinOp(
19263 .mul => .{ .v_ss, .mul },28073 .mul => .{ .v_ss, .mul },
19264 .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_ss, .div },28074 .div_float, .div_trunc, .div_floor, .div_exact => .{ .v_ss, .div },
19265 .max => .{ .v_ss, .max },28075 .max => .{ .v_ss, .max },
19266 .min => .{ .v_ss, .max },28076 .min => .{ .v_ss, .min },
19267 else => unreachable,28077 else => unreachable,
19268 },28078 },
19269 dst_reg,28079 dst_reg,
...@@ -21474,11 +30284,16 @@ fn airRet(self: *CodeGen, inst: Air.Inst.Index, safety: bool) !void {...@@ -21474,11 +30284,16 @@ fn airRet(self: *CodeGen, inst: Air.Inst.Index, safety: bool) !void {
21474 const ret_ty = self.fn_type.fnReturnType(zcu);30284 const ret_ty = self.fn_type.fnReturnType(zcu);
21475 switch (self.ret_mcv.short) {30285 switch (self.ret_mcv.short) {
21476 .none => {},30286 .none => {},
21477 .register,30287 .register => |reg| {
21478 .register_pair,30288 const reg_lock = self.register_manager.lockRegAssumeUnused(reg);
21479 .register_triple,30289 defer self.register_manager.unlockReg(reg_lock);
21480 .register_quadruple,30290 try self.genCopy(ret_ty, self.ret_mcv.short, .{ .air_ref = un_op }, .{ .safety = safety });
21481 => try self.genCopy(ret_ty, self.ret_mcv.short, .{ .air_ref = un_op }, .{ .safety = safety }),30291 },
30292 inline .register_pair, .register_triple, .register_quadruple => |regs| {
30293 const reg_locks = self.register_manager.lockRegsAssumeUnused(regs.len, regs);
30294 defer for (reg_locks) |reg_lock| self.register_manager.unlockReg(reg_lock);
30295 try self.genCopy(ret_ty, self.ret_mcv.short, .{ .air_ref = un_op }, .{ .safety = safety });
30296 },
21482 .indirect => |reg_off| {30297 .indirect => |reg_off| {
21483 try self.register_manager.getReg(reg_off.reg, null);30298 try self.register_manager.getReg(reg_off.reg, null);
21484 const lock = self.register_manager.lockRegAssumeUnused(reg_off.reg);30299 const lock = self.register_manager.lockRegAssumeUnused(reg_off.reg);
...@@ -22605,7 +31420,11 @@ fn lowerBlock(self: *CodeGen, inst: Air.Inst.Index, body: []const Air.Inst.Index...@@ -22605,7 +31420,11 @@ fn lowerBlock(self: *CodeGen, inst: Air.Inst.Index, body: []const Air.Inst.Index
22605 .resurrect = true,31420 .resurrect = true,
22606 .close_scope = true,31421 .close_scope = true,
22607 });31422 });
22608 for (block_data.value.relocs.items) |reloc| self.performReloc(reloc);31423 const block_relocs_last_index = block_data.value.relocs.items.len - 1;
31424 for (if (block_data.value.relocs.items[block_relocs_last_index] == self.mir_instructions.len - 1) block_relocs: {
31425 _ = self.mir_instructions.pop();
31426 break :block_relocs block_data.value.relocs.items[0..block_relocs_last_index];
31427 } else block_data.value.relocs.items) |block_reloc| self.performReloc(block_reloc);
22609 }31428 }
2261031429
22611 if (std.debug.runtime_safety) assert(self.inst_tracking.getIndex(inst).? == inst_tracking_i);31430 if (std.debug.runtime_safety) assert(self.inst_tracking.getIndex(inst).? == inst_tracking_i);
...@@ -22938,6 +31757,9 @@ fn airLoopSwitchBr(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -22938,6 +31757,9 @@ fn airLoopSwitchBr(self: *CodeGen, inst: Air.Inst.Index) !void {
22938 if (switch_br.operand.toIndex()) |op_inst| try self.processDeath(op_inst);31757 if (switch_br.operand.toIndex()) |op_inst| try self.processDeath(op_inst);
22939 }31758 }
2294031759
31760 // Ensure a register is available for dispatch.
31761 if (!mat_cond.isRegister()) _ = try self.register_manager.allocReg(null, abi.RegisterClass.gp);
31762
22941 self.scope_generation += 1;31763 self.scope_generation += 1;
22942 const state = try self.saveState();31764 const state = try self.saveState();
2294331765
...@@ -22960,47 +31782,63 @@ fn airSwitchDispatch(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -22960,47 +31782,63 @@ fn airSwitchDispatch(self: *CodeGen, inst: Air.Inst.Index) !void {
2296031782
22961 const block_ty = self.typeOfIndex(br.block_inst);31783 const block_ty = self.typeOfIndex(br.block_inst);
22962 const loop_data = self.loops.getPtr(br.block_inst).?;31784 const loop_data = self.loops.getPtr(br.block_inst).?;
22963 if (self.loop_switches.getPtr(br.block_inst)) |table| {31785 const block_tracking = self.inst_tracking.getPtr(br.block_inst).?;
22964 // Process operand death so that it is properly accounted for in the State below.31786 {
22965 const condition_dies = self.liveness.operandDies(inst, 0);31787 try self.getValue(block_tracking.short, null);
2296631788 const src_mcv = try self.resolveInst(br.operand);
22967 try self.restoreState(loop_data.state, &.{}, .{31789
22968 .emit_instructions = true,31790 if (self.reuseOperandAdvanced(inst, br.operand, 0, src_mcv, br.block_inst)) {
22969 .update_tracking = false,31791 try self.getValue(block_tracking.short, br.block_inst);
22970 .resurrect = false,31792 // .long = .none to avoid merging operand and block result stack frames.
22971 .close_scope = false,31793 const current_tracking: InstTracking = .{ .long = .none, .short = src_mcv };
22972 });31794 try current_tracking.materializeUnsafe(self, br.block_inst, block_tracking.*);
31795 for (current_tracking.getRegs()) |src_reg| self.register_manager.freeReg(src_reg);
31796 } else {
31797 try self.getValue(block_tracking.short, br.block_inst);
31798 try self.genCopy(block_ty, block_tracking.short, try self.resolveInst(br.operand), .{});
31799 }
31800 }
31801
31802 // Process operand death so that it is properly accounted for in the State below.
31803 if (self.liveness.operandDies(inst, 0)) {
31804 if (br.operand.toIndex()) |op_inst| try self.processDeath(op_inst);
31805 }
31806
31807 try self.restoreState(loop_data.state, &.{}, .{
31808 .emit_instructions = true,
31809 .update_tracking = false,
31810 .resurrect = false,
31811 .close_scope = false,
31812 });
2297331813
31814 if (self.loop_switches.getPtr(br.block_inst)) |table| {
22974 const condition_ty = self.typeOf(br.operand);31815 const condition_ty = self.typeOf(br.operand);
22975 const condition = try self.resolveInst(br.operand);31816 const condition_mcv = block_tracking.short;
22976 const condition_index = if (condition_dies and condition.isModifiable()) condition else condition_index: {
22977 const condition_index = try self.allocTempRegOrMem(condition_ty, true);
22978 try self.genCopy(condition_ty, condition_index, condition, .{});
22979 break :condition_index condition_index;
22980 };
22981 try self.spillEflagsIfOccupied();31817 try self.spillEflagsIfOccupied();
22982 if (table.min.orderAgainstZero(self.pt.zcu).compare(.neq)) try self.genBinOpMir(31818 if (table.min.orderAgainstZero(self.pt.zcu).compare(.neq)) try self.genBinOpMir(
22983 .{ ._, .sub },31819 .{ ._, .sub },
22984 condition_ty,31820 condition_ty,
22985 condition_index,31821 condition_mcv,
22986 .{ .air_ref = Air.internedToRef(table.min.toIntern()) },31822 .{ .air_ref = Air.internedToRef(table.min.toIntern()) },
22987 );31823 );
22988 switch (table.else_relocs) {31824 switch (table.else_relocs) {
22989 .@"unreachable" => {},31825 .@"unreachable" => {},
22990 .forward => |*else_relocs| {31826 .forward => |*else_relocs| {
22991 try self.genBinOpMir(.{ ._, .cmp }, condition_ty, condition_index, .{ .immediate = table.len - 1 });31827 try self.genBinOpMir(.{ ._, .cmp }, condition_ty, condition_mcv, .{ .immediate = table.len - 1 });
22992 try else_relocs.append(self.gpa, try self.asmJccReloc(.a, undefined));31828 try else_relocs.append(self.gpa, try self.asmJccReloc(.a, undefined));
22993 },31829 },
22994 .backward => |else_reloc| {31830 .backward => |else_reloc| {
22995 try self.genBinOpMir(.{ ._, .cmp }, condition_ty, condition_index, .{ .immediate = table.len - 1 });31831 try self.genBinOpMir(.{ ._, .cmp }, condition_ty, condition_mcv, .{ .immediate = table.len - 1 });
22996 _ = try self.asmJccReloc(.a, else_reloc);31832 _ = try self.asmJccReloc(.a, else_reloc);
22997 },31833 },
22998 }31834 }
22999 {31835 {
23000 const condition_index_reg = if (condition_index.isRegister())31836 const condition_index_reg = if (condition_mcv.isRegister()) condition_mcv.getReg().? else cond: {
23001 condition_index.getReg().?31837 const condition_index_reg =
23002 else31838 RegisterManager.regAtTrackedIndex(@intCast(loop_data.state.free_registers.findFirstSet().?));
23003 try self.copyToTmpRegister(.usize, condition_index);31839 try self.genSetReg(condition_index_reg, condition_ty, condition_mcv, .{});
31840 break :cond condition_index_reg;
31841 };
23004 const condition_index_lock = self.register_manager.lockReg(condition_index_reg);31842 const condition_index_lock = self.register_manager.lockReg(condition_index_reg);
23005 defer if (condition_index_lock) |lock| self.register_manager.unlockReg(lock);31843 defer if (condition_index_lock) |lock| self.register_manager.unlockReg(lock);
23006 try self.truncateRegister(condition_ty, condition_index_reg);31844 try self.truncateRegister(condition_ty, condition_index_reg);
...@@ -23019,38 +31857,6 @@ fn airSwitchDispatch(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -23019,38 +31857,6 @@ fn airSwitchDispatch(self: *CodeGen, inst: Air.Inst.Index) !void {
23019 return self.finishAir(inst, .none, .{ br.operand, .none, .none });31857 return self.finishAir(inst, .none, .{ br.operand, .none, .none });
23020 }31858 }
2302131859
23022 const block_tracking = self.inst_tracking.getPtr(br.block_inst).?;
23023 done: {
23024 try self.getValue(block_tracking.short, null);
23025 const src_mcv = try self.resolveInst(br.operand);
23026
23027 if (self.reuseOperandAdvanced(inst, br.operand, 0, src_mcv, br.block_inst)) {
23028 try self.getValue(block_tracking.short, br.block_inst);
23029 // .long = .none to avoid merging operand and block result stack frames.
23030 const current_tracking: InstTracking = .{ .long = .none, .short = src_mcv };
23031 try current_tracking.materializeUnsafe(self, br.block_inst, block_tracking.*);
23032 for (current_tracking.getRegs()) |src_reg| self.register_manager.freeReg(src_reg);
23033 break :done;
23034 }
23035
23036 try self.getValue(block_tracking.short, br.block_inst);
23037 const dst_mcv = block_tracking.short;
23038 try self.genCopy(block_ty, dst_mcv, try self.resolveInst(br.operand), .{});
23039 break :done;
23040 }
23041
23042 // Process operand death so that it is properly accounted for in the State below.
23043 if (self.liveness.operandDies(inst, 0)) {
23044 if (br.operand.toIndex()) |op_inst| try self.processDeath(op_inst);
23045 }
23046
23047 try self.restoreState(loop_data.state, &.{}, .{
23048 .emit_instructions = true,
23049 .update_tracking = false,
23050 .resurrect = false,
23051 .close_scope = false,
23052 });
23053
23054 // Emit a jump with a relocation. It will be patched up after the block ends.31860 // Emit a jump with a relocation. It will be patched up after the block ends.
23055 // Leave the jump offset undefined31861 // Leave the jump offset undefined
23056 _ = try self.asmJmpReloc(loop_data.target);31862 _ = try self.asmJmpReloc(loop_data.target);
...@@ -24115,13 +32921,15 @@ fn moveStrategy(self: *CodeGen, ty: Type, class: Register.Class, aligned: bool)...@@ -24115,13 +32921,15 @@ fn moveStrategy(self: *CodeGen, ty: Type, class: Register.Class, aligned: bool)
24115 64 => switch (ty.vectorLen(zcu)) {32921 64 => switch (ty.vectorLen(zcu)) {
24116 1...2 => return .{ .move = if (self.hasFeature(.avx))32922 1...2 => return .{ .move = if (self.hasFeature(.avx))
24117 .{ .v_pd, if (aligned) .mova else .movu }32923 .{ .v_pd, if (aligned) .mova else .movu }
32924 else if (self.hasFeature(.sse2))
32925 .{ ._pd, if (aligned) .mova else .movu }
24118 else32926 else
24119 .{ ._pd, if (aligned) .mova else .movu } },32927 .{ ._ps, if (aligned) .mova else .movu } },
24120 3...4 => if (self.hasFeature(.avx))32928 3...4 => if (self.hasFeature(.avx))
24121 return .{ .move = .{ .v_pd, if (aligned) .mova else .movu } },32929 return .{ .move = .{ .v_pd, if (aligned) .mova else .movu } },
24122 else => {},32930 else => {},
24123 },32931 },
24124 128 => switch (ty.vectorLen(zcu)) {32932 80, 128 => switch (ty.vectorLen(zcu)) {
24125 1 => return .{ .move = if (self.hasFeature(.avx))32933 1 => return .{ .move = if (self.hasFeature(.avx))
24126 .{ if (aligned) .v_dqa else .v_dqu, .mov }32934 .{ if (aligned) .v_dqa else .v_dqu, .mov }
24127 else if (self.hasFeature(.sse2))32935 else if (self.hasFeature(.sse2))
...@@ -24450,7 +33258,7 @@ fn genSetReg(...@@ -24450,7 +33258,7 @@ fn genSetReg(
24450 },33258 },
24451 .mmx => unreachable,33259 .mmx => unreachable,
24452 .sse => switch (src_reg.class()) {33260 .sse => switch (src_reg.class()) {
24453 .general_purpose => try self.asmRegisterRegister(33261 .general_purpose => if (self.hasFeature(.sse2)) try self.asmRegisterRegister(
24454 switch (abi_size) {33262 switch (abi_size) {
24455 1...4 => if (self.hasFeature(.avx)) .{ .v_d, .mov } else .{ ._d, .mov },33263 1...4 => if (self.hasFeature(.avx)) .{ .v_d, .mov } else .{ ._d, .mov },
24456 5...8 => if (self.hasFeature(.avx)) .{ .v_q, .mov } else .{ ._q, .mov },33264 5...8 => if (self.hasFeature(.avx)) .{ .v_q, .mov } else .{ ._q, .mov },
...@@ -24458,7 +33266,26 @@ fn genSetReg(...@@ -24458,7 +33266,26 @@ fn genSetReg(
24458 },33266 },
24459 dst_reg.to128(),33267 dst_reg.to128(),
24460 registerAlias(src_reg, @max(abi_size, 4)),33268 registerAlias(src_reg, @max(abi_size, 4)),
24461 ),33269 ) else {
33270 const frame_size = std.math.ceilPowerOfTwoAssert(u32, @max(abi_size, 4));
33271 const frame_index = try self.allocFrameIndex(.init(.{
33272 .size = frame_size,
33273 .alignment = .fromNonzeroByteUnits(frame_size),
33274 }));
33275 try self.asmMemoryRegister(.{ ._, .mov }, .{
33276 .base = .{ .frame = frame_index },
33277 .mod = .{ .rm = .{ .size = .fromSize(abi_size) } },
33278 }, registerAlias(src_reg, abi_size));
33279 try self.asmRegisterMemory(switch (frame_size) {
33280 4 => .{ ._ss, .mov },
33281 8 => .{ ._ps, .movl },
33282 16 => .{ ._ps, .mov },
33283 else => unreachable,
33284 }, dst_reg.to128(), .{
33285 .base = .{ .frame = frame_index },
33286 .mod = .{ .rm = .{ .size = .fromSize(frame_size) } },
33287 });
33288 },
24462 .segment => try self.genSetReg(33289 .segment => try self.genSetReg(
24463 dst_reg,33290 dst_reg,
24464 ty,33291 ty,
...@@ -24469,7 +33296,12 @@ fn genSetReg(...@@ -24469,7 +33296,12 @@ fn genSetReg(
24469 .sse => try self.asmRegisterRegister(33296 .sse => try self.asmRegisterRegister(
24470 @as(?Mir.Inst.FixedTag, switch (ty.scalarType(zcu).zigTypeTag(zcu)) {33297 @as(?Mir.Inst.FixedTag, switch (ty.scalarType(zcu).zigTypeTag(zcu)) {
24471 else => switch (abi_size) {33298 else => switch (abi_size) {
24472 1...16 => if (self.hasFeature(.avx)) .{ .v_dqa, .mov } else .{ ._dqa, .mov },33299 1...16 => if (self.hasFeature(.avx))
33300 .{ .v_dqa, .mov }
33301 else if (self.hasFeature(.sse2))
33302 .{ ._dqa, .mov }
33303 else
33304 .{ ._ps, .mova },
24473 17...32 => if (self.hasFeature(.avx)) .{ .v_dqa, .mov } else null,33305 17...32 => if (self.hasFeature(.avx)) .{ .v_dqa, .mov } else null,
24474 else => null,33306 else => null,
24475 },33307 },
...@@ -24477,13 +33309,20 @@ fn genSetReg(...@@ -24477,13 +33309,20 @@ fn genSetReg(
24477 16, 128 => switch (abi_size) {33309 16, 128 => switch (abi_size) {
24478 2...16 => if (self.hasFeature(.avx))33310 2...16 => if (self.hasFeature(.avx))
24479 .{ .v_dqa, .mov }33311 .{ .v_dqa, .mov }
33312 else if (self.hasFeature(.sse2))
33313 .{ ._dqa, .mov }
24480 else33314 else
24481 .{ ._dqa, .mov },33315 .{ ._ps, .mova },
24482 17...32 => if (self.hasFeature(.avx)) .{ .v_dqa, .mov } else null,33316 17...32 => if (self.hasFeature(.avx)) .{ .v_dqa, .mov } else null,
24483 else => null,33317 else => null,
24484 },33318 },
24485 32 => if (self.hasFeature(.avx)) .{ .v_ps, .mova } else .{ ._ps, .mova },33319 32 => if (self.hasFeature(.avx)) .{ .v_ps, .mova } else .{ ._ps, .mova },
24486 64 => if (self.hasFeature(.avx)) .{ .v_pd, .mova } else .{ ._pd, .mova },33320 64 => if (self.hasFeature(.avx))
33321 .{ .v_pd, .mova }
33322 else if (self.hasFeature(.sse2))
33323 .{ ._pd, .mova }
33324 else
33325 .{ ._ps, .mova },
24487 80 => null,33326 80 => null,
24488 else => unreachable,33327 else => unreachable,
24489 },33328 },
...@@ -25180,15 +34019,19 @@ fn airBitCast(self: *CodeGen, inst: Air.Inst.Index) !void {...@@ -25180,15 +34019,19 @@ fn airBitCast(self: *CodeGen, inst: Air.Inst.Index) !void {
25180 const src_lock = if (src_mcv.getReg()) |src_reg| self.register_manager.lockReg(src_reg) else null;34019 const src_lock = if (src_mcv.getReg()) |src_reg| self.register_manager.lockReg(src_reg) else null;
25181 defer if (src_lock) |lock| self.register_manager.unlockReg(lock);34020 defer if (src_lock) |lock| self.register_manager.unlockReg(lock);
2518234021
25183 const dst_mcv = if ((if (src_mcv.getReg()) |src_reg| src_reg.class() == .general_purpose else true) and34022 const dst_mcv = if (src_mcv != .register_mask and
34023 (if (src_mcv.getReg()) |src_reg| src_reg.class() == .general_purpose else true) and
25184 dst_rc.supersetOf(src_rc) and dst_ty.abiSize(zcu) <= src_ty.abiSize(zcu) and34024 dst_rc.supersetOf(src_rc) and dst_ty.abiSize(zcu) <= src_ty.abiSize(zcu) and
25185 dst_ty.abiAlignment(zcu).order(src_ty.abiAlignment(zcu)).compare(.lte) and34025 dst_ty.abiAlignment(zcu).order(src_ty.abiAlignment(zcu)).compare(.lte) and
25186 self.reuseOperand(inst, ty_op.operand, 0, src_mcv)) src_mcv else dst: {34026 self.reuseOperand(inst, ty_op.operand, 0, src_mcv)) src_mcv else dst: {
25187 const dst_mcv = try self.allocRegOrMem(inst, true);34027 const dst_mcv = try self.allocRegOrMem(inst, true);
25188 try self.genCopy(switch (std.math.order(dst_ty.abiSize(zcu), src_ty.abiSize(zcu))) {34028 try self.genCopy(switch (src_mcv) {
25189 .lt => dst_ty,34029 else => switch (std.math.order(dst_ty.abiSize(zcu), src_ty.abiSize(zcu))) {
25190 .eq => if (!dst_mcv.isBase() or src_mcv.isBase()) dst_ty else src_ty,34030 .lt => dst_ty,
25191 .gt => src_ty,34031 .eq => if (!dst_mcv.isBase() or src_mcv.isBase()) dst_ty else src_ty,
34032 .gt => src_ty,
34033 },
34034 .register_mask => src_ty,
25192 }, dst_mcv, src_mcv, .{});34035 }, dst_mcv, src_mcv, .{});
25193 break :dst dst_mcv;34036 break :dst dst_mcv;
25194 };34037 };
...@@ -28614,9 +37457,8 @@ fn limitImmediateType(self: *CodeGen, operand: Air.Inst.Ref, comptime T: type) !...@@ -28614,9 +37457,8 @@ fn limitImmediateType(self: *CodeGen, operand: Air.Inst.Ref, comptime T: type) !
28614 return mcv;37457 return mcv;
28615}37458}
2861637459
28617fn genTypedValue(self: *CodeGen, val: Value) InnerError!MCValue {37460fn genResult(self: *CodeGen, res: codegen.GenResult) InnerError!MCValue {
28618 const pt = self.pt;37461 return switch (res) {
28619 return switch (try codegen.genTypedValue(self.bin_file, pt, self.src_loc, val, self.target.*)) {
28620 .mcv => |mcv| switch (mcv) {37462 .mcv => |mcv| switch (mcv) {
28621 .none => .none,37463 .none => .none,
28622 .undef => .undef,37464 .undef => .undef,
...@@ -28633,6 +37475,14 @@ fn genTypedValue(self: *CodeGen, val: Value) InnerError!MCValue {...@@ -28633,6 +37475,14 @@ fn genTypedValue(self: *CodeGen, val: Value) InnerError!MCValue {
28633 };37475 };
28634}37476}
2863537477
37478fn genTypedValue(self: *CodeGen, val: Value) InnerError!MCValue {
37479 return self.genResult(try codegen.genTypedValue(self.bin_file, self.pt, self.src_loc, val, self.target.*));
37480}
37481
37482fn lowerUav(self: *CodeGen, val: Value) InnerError!MCValue {
37483 return self.genResult(try self.bin_file.lowerUav(self.pt, val.toIntern(), .none, self.src_loc));
37484}
37485
28636const CallMCValues = struct {37486const CallMCValues = struct {
28637 args: []MCValue,37487 args: []MCValue,
28638 return_value: InstTracking,37488 return_value: InstTracking,
...@@ -29772,6 +38622,7 @@ const Temp = struct {...@@ -29772,6 +38622,7 @@ const Temp = struct {
29772 cg.temp_type[@intFromEnum(result_temp_index)] = .slice_const_u8;38622 cg.temp_type[@intFromEnum(result_temp_index)] = .slice_const_u8;
29773 result_temp_index.tracking(cg).* = .init(result);38623 result_temp_index.tracking(cg).* = .init(result);
29774 first_temp.* = result_temp;38624 first_temp.* = result_temp;
38625 second_temp.* = result_temp;
29775 }38626 }
2977638627
29777 fn asMask(temp: Temp, info: MaskInfo, cg: *CodeGen) void {38628 fn asMask(temp: Temp, info: MaskInfo, cg: *CodeGen) void {
...@@ -30248,7 +39099,20 @@ const Temp = struct {...@@ -30248,7 +39099,20 @@ const Temp = struct {
30248 try cg.asmOpOnly(.{ .@"rep _sb", .sto });39099 try cg.asmOpOnly(.{ .@"rep _sb", .sto });
30249 }39100 }
3025039101
30251 fn moveTo(temp: Temp, inst: Air.Inst.Index, cg: *CodeGen) !void {39102 fn finish(
39103 temp: Temp,
39104 inst: Air.Inst.Index,
39105 op_refs: []const Air.Inst.Ref,
39106 op_temps: []const Temp,
39107 cg: *CodeGen,
39108 ) !void {
39109 const tomb_bits = cg.liveness.getTombBits(inst);
39110 for (0.., op_refs, op_temps) |op_index, op_ref, op_temp| {
39111 if (op_temp.index != temp.index) try op_temp.die(cg);
39112 if (tomb_bits & @as(Liveness.Bpi, 1) << @intCast(op_index) == 0) continue;
39113 if (cg.reused_operands.isSet(op_index)) continue;
39114 try cg.processDeath(op_ref.toIndexAllowNone() orelse continue);
39115 }
30252 if (cg.liveness.isUnused(inst)) try temp.die(cg) else switch (temp.unwrap(cg)) {39116 if (cg.liveness.isUnused(inst)) try temp.die(cg) else switch (temp.unwrap(cg)) {
30253 .ref, .err_ret_trace => {39117 .ref, .err_ret_trace => {
30254 const result = try cg.allocRegOrMem(inst, true);39118 const result = try cg.allocRegOrMem(inst, true);
...@@ -30410,6 +39274,10 @@ fn tempFromValue(cg: *CodeGen, value: Value) !Temp {...@@ -30410,6 +39274,10 @@ fn tempFromValue(cg: *CodeGen, value: Value) !Temp {
30410 return cg.tempInit(value.typeOf(cg.pt.zcu), try cg.genTypedValue(value));39274 return cg.tempInit(value.typeOf(cg.pt.zcu), try cg.genTypedValue(value));
30411}39275}
3041239276
39277fn tempMemFromValue(cg: *CodeGen, value: Value) !Temp {
39278 return cg.tempInit(value.typeOf(cg.pt.zcu), try cg.lowerUav(value));
39279}
39280
30413fn tempFromOperand(39281fn tempFromOperand(
30414 cg: *CodeGen,39282 cg: *CodeGen,
30415 inst: Air.Inst.Index,39283 inst: Air.Inst.Index,
...@@ -30529,35 +39397,94 @@ const Select = struct {...@@ -30529,35 +39397,94 @@ const Select = struct {
30529 };39397 };
30530 switch (mir_tag[0]) {39398 switch (mir_tag[0]) {
30531 .f_ => switch (mir_tag[1]) {39399 .f_ => switch (mir_tag[1]) {
30532 .abs, .st => {},39400 .@"2xm1",
39401 .abs,
39402 .add,
39403 .chs,
39404 .clex,
39405 .com,
39406 .comi,
39407 .cos,
39408 .div,
39409 .divr,
39410 .free,
39411 .mul,
39412 .nop,
39413 .prem,
39414 .rndint,
39415 .scale,
39416 .sin,
39417 .sqrt,
39418 .st,
39419 .sub,
39420 .subr,
39421 .tst,
39422 .ucom,
39423 .ucomi,
39424 .wait,
39425 .xam,
39426 .xch,
39427 => {},
39428 .init, .save => s.top = 0,
39429 .ld, .ptan, .sincos, .xtract => s.top -%= 1,
39430 .patan, .yl2x => s.top +%= 1,
39431 .rstor => unreachable,
39432 else => unreachable,
39433 },
39434 .f_1 => switch (mir_tag[1]) {
30533 .ld => s.top -%= 1,39435 .ld => s.top -%= 1,
30534 else => {39436 .prem => {},
30535 const fixes = @tagName(mir_tag[0]);39437 else => unreachable,
30536 const fixes_blank = std.mem.indexOfScalar(u8, fixes, '_').?;
30537 std.debug.panic("{s}: {s}{s}{s}\n", .{
30538 @src().fn_name,
30539 fixes[0..fixes_blank],
30540 @tagName(mir_tag[1]),
30541 fixes[fixes_blank + 1 ..],
30542 });
30543 },
30544 },39438 },
30545 .f_p => switch (mir_tag[1]) {39439 .f_b, .f_be, .f_e, .f_nb, .f_nbe, .f_ne, .f_nu, .f_u => switch (mir_tag[1]) {
39440 .cmov => {},
39441 else => unreachable,
39442 },
39443 .f_cw, .f_env, .f_sw => switch (mir_tag[1]) {
39444 .ld, .st => {},
39445 else => unreachable,
39446 },
39447 .f_p1 => switch (mir_tag[1]) {
39448 .yl2x => s.top +%= 1,
39449 else => unreachable,
39450 },
39451 .fb_ => switch (mir_tag[1]) {
39452 .ld => s.top -%= 1,
39453 else => unreachable,
39454 },
39455 .fb_p => switch (mir_tag[1]) {
30546 .st => s.top +%= 1,39456 .st => s.top +%= 1,
30547 else => {39457 else => unreachable,
30548 const fixes = @tagName(mir_tag[0]);39458 },
30549 const fixes_blank = std.mem.indexOfScalar(u8, fixes, '_').?;39459 .fi_ => switch (mir_tag[1]) {
30550 std.debug.panic("{s}: {s}{s}{s}\n", .{39460 .add, .com, .div, .divr, .mul, .st, .stt, .sub, .subr => {},
30551 @src().fn_name,39461 .ld => s.top -%= 1,
30552 fixes[0..fixes_blank],39462 else => unreachable,
30553 @tagName(mir_tag[1]),39463 },
30554 fixes[fixes_blank + 1 ..],39464 .fi_p => switch (mir_tag[1]) {
30555 });39465 .com, .st => s.top +%= 1,
30556 },39466 else => unreachable,
39467 },
39468 .fn_ => switch (mir_tag[1]) {
39469 .clex => {},
39470 .init, .save => s.top = 0,
39471 else => unreachable,
39472 },
39473 .fn_cw, .fn_env, .fn_sw => switch (mir_tag[1]) {
39474 .st => {},
39475 else => unreachable,
39476 },
39477 .f_cstp => switch (mir_tag[1]) {
39478 .de => s.top -%= 1,
39479 .in => s.top +%= 1,
39480 else => unreachable,
30557 },39481 },
30558 .f_1,39482 .f_l2e, .f_l2t, .f_lg2, .f_ln2, .f_pi, .f_z => switch (mir_tag[1]) {
30559 => switch (mir_tag[1]) {
30560 .ld => s.top -%= 1,39483 .ld => s.top -%= 1,
39484 else => unreachable,
39485 },
39486 .f_p => switch (mir_tag[1]) {
39487 .add, .com, .comi, .div, .divr, .mul, .st, .sub, .subr, .ucom, .ucomi => s.top +%= 1,
30561 else => {39488 else => {
30562 const fixes = @tagName(mir_tag[0]);39489 const fixes = @tagName(mir_tag[0]);
30563 const fixes_blank = std.mem.indexOfScalar(u8, fixes, '_').?;39490 const fixes_blank = std.mem.indexOfScalar(u8, fixes, '_').?;
...@@ -30569,41 +39496,13 @@ const Select = struct {...@@ -30569,41 +39496,13 @@ const Select = struct {
30569 });39496 });
30570 },39497 },
30571 },39498 },
30572 .f_l2e,39499 .f_pp => switch (mir_tag[1]) {
30573 .f_l2t,39500 .com, .ucom => s.top +%= 2,
30574 .f_lg2,
30575 .f_ln2,
30576 .f_pi,
30577 .f_z,
30578 => switch (mir_tag[1]) {
30579 .ld => s.top -%= 1,
30580 else => unreachable,39501 else => unreachable,
30581 },39502 },
30582 .f_b,39503 .fx_ => switch (mir_tag[1]) {
30583 .f_be,39504 .rstor => unreachable,
30584 .f_cw,39505 .save => {},
30585 .f_e,
30586 .f_env,
30587 .f_nb,
30588 .f_nbe,
30589 .f_ne,
30590 .f_nu,
30591 .f_p1,
30592 .f_pp,
30593 .f_sw,
30594 .f_u,
30595 .fb_,
30596 .fb_p,
30597 .fi_,
30598 .fi_p,
30599 .fn_,
30600 .fn_cw,
30601 .fn_env,
30602 .fn_sw,
30603 => {},
30604 .f_cstp => switch (mir_tag[1]) {
30605 .de => s.top -%= 1,
30606 .in => s.top +%= 1,
30607 else => unreachable,39506 else => unreachable,
30608 },39507 },
30609 else => {},39508 else => {},
...@@ -30620,9 +39519,13 @@ const Select = struct {...@@ -30620,9 +39519,13 @@ const Select = struct {
30620 dst_constraints: [@intFromEnum(Select.Operand.Ref.src0) - @intFromEnum(Select.Operand.Ref.dst0)]Constraint = @splat(.any),39519 dst_constraints: [@intFromEnum(Select.Operand.Ref.src0) - @intFromEnum(Select.Operand.Ref.dst0)]Constraint = @splat(.any),
30621 src_constraints: [@intFromEnum(Select.Operand.Ref.none) - @intFromEnum(Select.Operand.Ref.src0)]Constraint = @splat(.any),39520 src_constraints: [@intFromEnum(Select.Operand.Ref.none) - @intFromEnum(Select.Operand.Ref.src0)]Constraint = @splat(.any),
30622 patterns: []const Select.Pattern,39521 patterns: []const Select.Pattern,
39522 call_frame: packed struct(u16) { size: u10 = 0, alignment: InternPool.Alignment } = .{ .size = 0, .alignment = .none },
30623 extra_temps: [@intFromEnum(Select.Operand.Ref.dst0) - @intFromEnum(Select.Operand.Ref.tmp0)]TempSpec = @splat(.unused),39523 extra_temps: [@intFromEnum(Select.Operand.Ref.dst0) - @intFromEnum(Select.Operand.Ref.tmp0)]TempSpec = @splat(.unused),
30624 dst_temps: [@intFromEnum(Select.Operand.Ref.src0) - @intFromEnum(Select.Operand.Ref.dst0)]TempSpec.Kind = @splat(.unused),39524 dst_temps: [@intFromEnum(Select.Operand.Ref.src0) - @intFromEnum(Select.Operand.Ref.dst0)]TempSpec.Kind = @splat(.unused),
30625 clobbers: struct { eflags: bool = false, st: u3 = 0 } = .{},39525 clobbers: packed struct {
39526 eflags: bool = false,
39527 caller_preserved: enum(u2) { none, ccc, zigcc } = .none,
39528 } = .{},
30626 each: union(enum) {39529 each: union(enum) {
30627 once: []const Instruction,39530 once: []const Instruction,
30628 },39531 },
...@@ -30633,7 +39536,10 @@ const Select = struct {...@@ -30633,7 +39536,10 @@ const Select = struct {
30633 any_bool_vec,39536 any_bool_vec,
30634 any_int,39537 any_int,
30635 any_signed_int,39538 any_signed_int,
39539 any_unsigned_int,
30636 any_scalar_int,39540 any_scalar_int,
39541 any_scalar_signed_int,
39542 any_scalar_unsigned_int,
30637 any_float,39543 any_float,
30638 po2_any,39544 po2_any,
30639 bool_vec: Memory.Size,39545 bool_vec: Memory.Size,
...@@ -30645,13 +39551,20 @@ const Select = struct {...@@ -30645,13 +39551,20 @@ const Select = struct {
30645 multiple_size: Memory.Size,39551 multiple_size: Memory.Size,
30646 int: Memory.Size,39552 int: Memory.Size,
30647 scalar_int_is: Memory.Size,39553 scalar_int_is: Memory.Size,
30648 scalar_int: struct { of: Memory.Size, is: Memory.Size },39554 scalar_signed_int_is: Memory.Size,
30649 scalar_signed_int: Memory.Size,39555 scalar_unsigned_int_is: Memory.Size,
30650 scalar_unsigned_int: Memory.Size,39556 scalar_int: OfIsSizes,
30651 scalar_remainder_int: struct { of: Memory.Size, is: Memory.Size },39557 scalar_signed_int: OfIsSizes,
30652 scalar_float: struct { of: Memory.Size, is: Memory.Size },39558 scalar_unsigned_int: OfIsSizes,
30653 scalar_exact_float: struct { of: Memory.Size, is: Memory.Size },39559 multiple_scalar_int: OfIsSizes,
30654 multiple_scalar_int: struct { of: Memory.Size, is: Memory.Size },39560 multiple_scalar_signed_int: OfIsSizes,
39561 multiple_scalar_unsigned_int: OfIsSizes,
39562 scalar_remainder_int: OfIsSizes,
39563 float: Memory.Size,
39564 scalar_any_float: Memory.Size,
39565 scalar_float: OfIsSizes,
39566 multiple_scalar_any_float: Memory.Size,
39567 multiple_scalar_float: OfIsSizes,
30655 exact_int: u16,39568 exact_int: u16,
30656 exact_signed_int: u16,39569 exact_signed_int: u16,
30657 exact_unsigned_int: u16,39570 exact_unsigned_int: u16,
...@@ -30660,16 +39573,18 @@ const Select = struct {...@@ -30660,16 +39573,18 @@ const Select = struct {
30660 po2_int: Memory.Size,39573 po2_int: Memory.Size,
30661 signed_po2_int: Memory.Size,39574 signed_po2_int: Memory.Size,
30662 unsigned_po2_or_exact_int: Memory.Size,39575 unsigned_po2_or_exact_int: Memory.Size,
30663 remainder_int: struct { of: Memory.Size, is: Memory.Size },39576 remainder_int: OfIsSizes,
30664 exact_remainder_int: struct { of: Memory.Size, is: Memory.Size },39577 exact_remainder_int: OfIsSizes,
30665 signed_or_exact_remainder_int: struct { of: Memory.Size, is: Memory.Size },39578 signed_or_exact_remainder_int: OfIsSizes,
30666 unsigned_or_exact_remainder_int: struct { of: Memory.Size, is: Memory.Size },39579 unsigned_or_exact_remainder_int: OfIsSizes,
30667 signed_int: Memory.Size,39580 signed_int: Memory.Size,
30668 unsigned_int: Memory.Size,39581 unsigned_int: Memory.Size,
30669 elem_size_is: u8,39582 elem_size_is: u8,
30670 po2_elem_size,39583 po2_elem_size,
30671 elem_int: Memory.Size,39584 elem_int: Memory.Size,
3067239585
39586 const OfIsSizes = struct { of: Memory.Size, is: Memory.Size };
39587
30673 fn accepts(constraint: Constraint, ty: Type, cg: *CodeGen) bool {39588 fn accepts(constraint: Constraint, ty: Type, cg: *CodeGen) bool {
30674 const zcu = cg.pt.zcu;39589 const zcu = cg.pt.zcu;
30675 return switch (constraint) {39590 return switch (constraint) {
...@@ -30677,7 +39592,10 @@ const Select = struct {...@@ -30677,7 +39592,10 @@ const Select = struct {
30677 .any_bool_vec => ty.isVector(zcu) and ty.childType(zcu).toIntern() == .bool_type,39592 .any_bool_vec => ty.isVector(zcu) and ty.childType(zcu).toIntern() == .bool_type,
30678 .any_int => cg.intInfo(ty) != null,39593 .any_int => cg.intInfo(ty) != null,
30679 .any_signed_int => if (cg.intInfo(ty)) |int_info| int_info.signedness == .signed else false,39594 .any_signed_int => if (cg.intInfo(ty)) |int_info| int_info.signedness == .signed else false,
39595 .any_unsigned_int => if (cg.intInfo(ty)) |int_info| int_info.signedness == .unsigned else false,
30680 .any_scalar_int => cg.intInfo(ty.scalarType(zcu)) != null,39596 .any_scalar_int => cg.intInfo(ty.scalarType(zcu)) != null,
39597 .any_scalar_signed_int => if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .signed else false,
39598 .any_scalar_unsigned_int => if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .unsigned else false,
30681 .any_float => ty.isRuntimeFloat(),39599 .any_float => ty.isRuntimeFloat(),
30682 .po2_any => std.math.isPowerOfTwo(ty.abiSize(zcu)),39600 .po2_any => std.math.isPowerOfTwo(ty.abiSize(zcu)),
30683 .bool_vec => |size| ty.isVector(zcu) and ty.scalarType(zcu).toIntern() == .bool_type and39601 .bool_vec => |size| ty.isVector(zcu) and ty.scalarType(zcu).toIntern() == .bool_type and
...@@ -30700,25 +39618,42 @@ const Select = struct {...@@ -30700,25 +39618,42 @@ const Select = struct {
30700 size.bitSize(cg.target) >= int_info.bits39618 size.bitSize(cg.target) >= int_info.bits
30701 else39619 else
30702 false,39620 false,
30703 .scalar_int => |of_is| @divExact(of_is.of.bitSize(cg.target), 8) >= ty.abiSize(zcu) and39621 .scalar_signed_int_is => |size| if (cg.intInfo(ty.scalarType(zcu))) |int_info| switch (int_info.signedness) {
30704 if (cg.intInfo(ty.scalarType(zcu))) |int_info| of_is.is.bitSize(cg.target) >= int_info.bits else false,
30705 .scalar_signed_int => |size| if (cg.intInfo(ty.scalarType(zcu))) |int_info| switch (int_info.signedness) {
30706 .signed => size.bitSize(cg.target) >= int_info.bits,39622 .signed => size.bitSize(cg.target) >= int_info.bits,
30707 .unsigned => false,39623 .unsigned => false,
30708 } else false,39624 } else false,
30709 .scalar_unsigned_int => |size| if (cg.intInfo(ty.scalarType(zcu))) |int_info| switch (int_info.signedness) {39625 .scalar_unsigned_int_is => |size| if (cg.intInfo(ty.scalarType(zcu))) |int_info| switch (int_info.signedness) {
30710 .signed => false,39626 .signed => false,
30711 .unsigned => size.bitSize(cg.target) >= int_info.bits,39627 .unsigned => size.bitSize(cg.target) >= int_info.bits,
30712 } else false,39628 } else false,
39629 .scalar_int => |of_is| @divExact(of_is.of.bitSize(cg.target), 8) >= cg.unalignedSize(ty) and
39630 if (cg.intInfo(ty.scalarType(zcu))) |int_info| of_is.is.bitSize(cg.target) >= int_info.bits else false,
39631 .scalar_signed_int => |of_is| @divExact(of_is.of.bitSize(cg.target), 8) >= cg.unalignedSize(ty) and
39632 if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .signed and
39633 of_is.is.bitSize(cg.target) >= int_info.bits else false,
39634 .scalar_unsigned_int => |of_is| @divExact(of_is.of.bitSize(cg.target), 8) >= cg.unalignedSize(ty) and
39635 if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .unsigned and
39636 of_is.is.bitSize(cg.target) >= int_info.bits else false,
30713 .multiple_scalar_int => |of_is| ty.abiSize(zcu) % @divExact(of_is.of.bitSize(cg.target), 8) == 0 and39637 .multiple_scalar_int => |of_is| ty.abiSize(zcu) % @divExact(of_is.of.bitSize(cg.target), 8) == 0 and
30714 if (cg.intInfo(ty.scalarType(zcu))) |int_info| of_is.is.bitSize(cg.target) >= int_info.bits else false,39638 if (cg.intInfo(ty.scalarType(zcu))) |int_info| of_is.is.bitSize(cg.target) >= int_info.bits else false,
39639 .multiple_scalar_signed_int => |of_is| ty.abiSize(zcu) % @divExact(of_is.of.bitSize(cg.target), 8) == 0 and
39640 if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .signed and
39641 of_is.is.bitSize(cg.target) >= int_info.bits else false,
39642 .multiple_scalar_unsigned_int => |of_is| ty.abiSize(zcu) % @divExact(of_is.of.bitSize(cg.target), 8) == 0 and
39643 if (cg.intInfo(ty.scalarType(zcu))) |int_info| int_info.signedness == .unsigned and
39644 of_is.is.bitSize(cg.target) >= int_info.bits else false,
30715 .scalar_remainder_int => |of_is| if (cg.intInfo(ty.scalarType(zcu))) |int_info|39645 .scalar_remainder_int => |of_is| if (cg.intInfo(ty.scalarType(zcu))) |int_info|
30716 of_is.is.bitSize(cg.target) >= (int_info.bits - 1) % of_is.of.bitSize(cg.target) + 139646 of_is.is.bitSize(cg.target) >= (int_info.bits - 1) % of_is.of.bitSize(cg.target) + 1
30717 else39647 else
30718 false,39648 false,
30719 .scalar_float => |of_is| @divExact(of_is.of.bitSize(cg.target), 8) >= ty.abiSize(zcu) and39649 .float => |size| if (cg.floatBits(ty)) |float_bits| size.bitSize(cg.target) == float_bits else false,
30720 if (cg.floatBits(ty.scalarType(zcu))) |float_bits| of_is.is.bitSize(cg.target) >= float_bits else false,39650 .scalar_any_float => |size| @divExact(size.bitSize(cg.target), 8) >= ty.abiSize(zcu) and
30721 .scalar_exact_float => |of_is| @divExact(of_is.of.bitSize(cg.target), 8) >= ty.abiSize(zcu) and39651 cg.floatBits(ty.scalarType(zcu)) != null,
39652 .scalar_float => |of_is| @divExact(of_is.of.bitSize(cg.target), 8) >= cg.unalignedSize(ty) and
39653 if (cg.floatBits(ty.scalarType(zcu))) |float_bits| of_is.is.bitSize(cg.target) == float_bits else false,
39654 .multiple_scalar_any_float => |size| ty.abiSize(zcu) % @divExact(size.bitSize(cg.target), 8) == 0 and
39655 cg.floatBits(ty.scalarType(zcu)) != null,
39656 .multiple_scalar_float => |of_is| ty.abiSize(zcu) % @divExact(of_is.of.bitSize(cg.target), 8) == 0 and
30722 if (cg.floatBits(ty.scalarType(zcu))) |float_bits| of_is.is.bitSize(cg.target) == float_bits else false,39657 if (cg.floatBits(ty.scalarType(zcu))) |float_bits| of_is.is.bitSize(cg.target) == float_bits else false,
30723 .exact_int => |bit_size| if (cg.intInfo(ty)) |int_info| bit_size == int_info.bits else false,39658 .exact_int => |bit_size| if (cg.intInfo(ty)) |int_info| bit_size == int_info.bits else false,
30724 .exact_signed_int => |bit_size| if (cg.intInfo(ty)) |int_info| switch (int_info.signedness) {39659 .exact_signed_int => |bit_size| if (cg.intInfo(ty)) |int_info| switch (int_info.signedness) {
...@@ -30787,13 +39722,14 @@ const Select = struct {...@@ -30787,13 +39722,14 @@ const Select = struct {
30787 src: [2]Src,39722 src: [2]Src,
30788 commute: struct { u8, u8 } = .{ 0, 0 },39723 commute: struct { u8, u8 } = .{ 0, 0 },
3078939724
30790 const Src = enum {39725 const Src = union(enum) {
30791 none,39726 none,
30792 any,39727 any,
30793 imm8,39728 imm8,
30794 imm16,39729 imm16,
30795 imm32,39730 imm32,
30796 simm32,39731 simm32,
39732 to_reg: Register,
30797 mem,39733 mem,
30798 to_mem,39734 to_mem,
30799 mut_mem,39735 mut_mem,
...@@ -30806,6 +39742,10 @@ const Select = struct {...@@ -30806,6 +39742,10 @@ const Select = struct {
30806 to_x87,39742 to_x87,
30807 mut_x87,39743 mut_x87,
30808 to_mut_x87,39744 to_mut_x87,
39745 mmx,
39746 to_mmx,
39747 mut_mmx,
39748 to_mut_mmx,
30809 mm,39749 mm,
30810 to_mm,39750 to_mm,
30811 mut_mm,39751 mut_mm,
...@@ -30846,6 +39786,7 @@ const Select = struct {...@@ -30846,6 +39786,7 @@ const Select = struct {
30846 .mem => temp.tracking(cg).short.isMemory(),39786 .mem => temp.tracking(cg).short.isMemory(),
30847 .to_mem, .to_mut_mem => true,39787 .to_mem, .to_mut_mem => true,
30848 .mut_mem => temp.isMut(cg) and temp.tracking(cg).short.isMemory(),39788 .mut_mem => temp.isMut(cg) and temp.tracking(cg).short.isMemory(),
39789 .to_reg => true,
30849 .gpr => temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) {39790 .gpr => temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) {
30850 .register => |reg| reg.class() == .general_purpose,39791 .register => |reg| reg.class() == .general_purpose,
30851 .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0,39792 .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0,
...@@ -30868,6 +39809,17 @@ const Select = struct {...@@ -30868,6 +39809,17 @@ const Select = struct {
30868 else => false,39809 else => false,
30869 },39810 },
30870 .to_x87, .to_mut_x87 => true,39811 .to_x87, .to_mut_x87 => true,
39812 .mmx => switch (temp.tracking(cg).short) {
39813 .register => |reg| reg.class() == .mmx,
39814 .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0,
39815 else => false,
39816 },
39817 .mut_mmx => temp.isMut(cg) and switch (temp.tracking(cg).short) {
39818 .register => |reg| reg.class() == .mmx,
39819 .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0,
39820 else => false,
39821 },
39822 .to_mmx, .to_mut_mmx => true,
30871 .mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) {39823 .mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) {
30872 .register => |reg| reg.class() == .mmx,39824 .register => |reg| reg.class() == .mmx,
30873 .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0,39825 .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0,
...@@ -30920,12 +39872,13 @@ const Select = struct {...@@ -30920,12 +39872,13 @@ const Select = struct {
30920 .none => unreachable,39872 .none => unreachable,
30921 .any, .imm8, .imm16, .imm32, .simm32 => false,39873 .any, .imm8, .imm16, .imm32, .simm32 => false,
30922 .mem, .to_mem, .mut_mem, .to_mut_mem => try temp.toBase(cg),39874 .mem, .to_mem, .mut_mem, .to_mut_mem => try temp.toBase(cg),
39875 .to_reg => |reg| try temp.toReg(reg, cg),
30923 .gpr, .to_gpr => try temp.toRegClass(false, .general_purpose, cg),39876 .gpr, .to_gpr => try temp.toRegClass(false, .general_purpose, cg),
30924 .mut_gpr, .to_mut_gpr => try temp.toRegClass(true, .general_purpose, cg),39877 .mut_gpr, .to_mut_gpr => try temp.toRegClass(true, .general_purpose, cg),
30925 .x87, .to_x87 => try temp.toRegClass(false, .x87, cg),39878 .x87, .to_x87 => try temp.toRegClass(false, .x87, cg),
30926 .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg),39879 .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg),
30927 .mm, .to_mm => try temp.toRegClass(false, .mmx, cg),39880 .mmx, .to_mmx, .mm, .to_mm => try temp.toRegClass(false, .mmx, cg),
30928 .mut_mm, .to_mut_mm => try temp.toRegClass(true, .mmx, cg),39881 .mut_mmx, .to_mut_mmx, .mut_mm, .to_mut_mm => try temp.toRegClass(true, .mmx, cg),
30929 .sse, .to_sse, .xmm, .to_xmm, .ymm, .to_ymm => try temp.toRegClass(false, .sse, cg),39882 .sse, .to_sse, .xmm, .to_xmm, .ymm, .to_ymm => try temp.toRegClass(false, .sse, cg),
30930 .mut_sse, .to_mut_sse, .mut_xmm, .to_mut_xmm, .mut_ymm, .to_mut_ymm => try temp.toRegClass(true, .sse, cg),39883 .mut_sse, .to_mut_sse, .mut_xmm, .to_mut_xmm, .mut_ymm, .to_mut_ymm => try temp.toRegClass(true, .sse, cg),
30931 };39884 };
...@@ -30943,47 +39896,81 @@ const Select = struct {...@@ -30943,47 +39896,81 @@ const Select = struct {
30943 unused,39896 unused,
30944 any,39897 any,
30945 cc: Condition,39898 cc: Condition,
39899 ref: Select.Operand.Ref,
30946 reg: Register,39900 reg: Register,
30947 rc: Register.Class,39901 rc: Register.Class,
39902 mut_rc: struct { ref: Select.Operand.Ref, rc: Register.Class },
39903 ref_mask: struct { ref: Select.Operand.Ref, info: MaskInfo },
30948 rc_mask: struct { rc: Register.Class, info: MaskInfo },39904 rc_mask: struct { rc: Register.Class, info: MaskInfo },
39905 mut_rc_mask: struct { ref: Select.Operand.Ref, rc: Register.Class, info: MaskInfo },
30949 mem,39906 mem,
30950 smin_mem: ConstInfo,39907 smin_mem: ConstInfo,
30951 smax_mem: ConstInfo,39908 smax_mem: ConstInfo,
30952 umin_mem: ConstInfo,39909 umin_mem: ConstInfo,
30953 umax_mem: ConstInfo,39910 umax_mem: ConstInfo,
30954 ref: Select.Operand.Ref,39911 symbol: *const struct { lib: ?[]const u8 = null, name: []const u8 },
30955 ref_mask: struct { ref: Select.Operand.Ref, info: MaskInfo },
30956 mut_reg: struct { ref: Select.Operand.Ref, rc: Register.Class },
3095739912
30958 const ConstInfo = struct { ref: Select.Operand.Ref, vectorize: bool = false };39913 const ConstInfo = struct { ref: Select.Operand.Ref, vectorize_to: ?Memory.Size = null };
3095939914
30960 fn finish(kind: Kind, temp: Temp, s: *const Select) void {39915 fn finish(kind: Kind, temp: Temp, s: *const Select) void {
30961 switch (kind) {39916 switch (kind) {
30962 else => {},39917 else => {},
30963 inline .rc_mask, .ref_mask => |mask| temp.asMask(mask.info, s.cg),39918 inline .rc_mask, .mut_rc_mask, .ref_mask => |mask| temp.asMask(mask.info, s.cg),
30964 }39919 }
30965 }39920 }
30966 };39921 };
3096739922
30968 fn create(spec: TempSpec, s: *Select) !?Temp {39923 fn pass(spec: TempSpec) u2 {
39924 return switch (spec.kind) {
39925 .unused => 0,
39926 .reg => 1,
39927 else => 2,
39928 };
39929 }
39930
39931 fn create(spec: TempSpec, s: *Select) !Temp {
30969 const cg = s.cg;39932 const cg = s.cg;
30970 return switch (spec.kind) {39933 return switch (spec.kind) {
30971 .unused => null,39934 .unused => unreachable,
30972 .any => try cg.tempAlloc(spec.type),39935 .any => try cg.tempAlloc(spec.type),
30973 .cc => |cc| try cg.tempInit(spec.type, .{ .eflags = cc }),39936 .cc => |cc| try cg.tempInit(spec.type, .{ .eflags = cc }),
39937 .ref => |ref| ref.deref(s),
30974 .reg => |reg| try cg.tempInit(spec.type, .{ .register = reg }),39938 .reg => |reg| try cg.tempInit(spec.type, .{ .register = reg }),
30975 .rc => |rc| try cg.tempAllocReg(spec.type, regSetForRegClass(rc)),39939 .rc => |rc| try cg.tempAllocReg(spec.type, regSetForRegClass(rc)),
39940 .mut_rc => |ref_rc| {
39941 const temp = ref_rc.ref.deref(s);
39942 if (temp.isMut(cg)) switch (temp.tracking(cg).short) {
39943 .register => |reg| if (reg.class() == ref_rc.rc) return temp,
39944 .register_offset => |reg_off| if (reg_off.off == 0 and reg_off.reg.class() == ref_rc.rc) return temp,
39945 else => {},
39946 };
39947 return try cg.tempAllocReg(spec.type, regSetForRegClass(ref_rc.rc));
39948 },
39949 .ref_mask => |ref_mask| ref_mask.ref.deref(s),
30976 .rc_mask => |rc_mask| try cg.tempAllocReg(spec.type, regSetForRegClass(rc_mask.rc)),39950 .rc_mask => |rc_mask| try cg.tempAllocReg(spec.type, regSetForRegClass(rc_mask.rc)),
39951 .mut_rc_mask => |ref_rc_mask| {
39952 const temp = ref_rc_mask.ref.deref(s);
39953 if (temp.isMut(cg)) switch (temp.tracking(cg).short) {
39954 .register => |reg| if (reg.class() == ref_rc_mask.rc) return temp,
39955 .register_offset => |reg_off| if (reg_off.off == 0 and reg_off.reg.class() == ref_rc_mask.rc) return temp,
39956 else => {},
39957 };
39958 return try cg.tempAllocReg(spec.type, regSetForRegClass(ref_rc_mask.rc));
39959 },
30977 .mem => try cg.tempAllocMem(spec.type),39960 .mem => try cg.tempAllocMem(spec.type),
30978 .smin_mem, .smax_mem, .umin_mem, .umax_mem => |const_info| {39961 .smin_mem, .smax_mem, .umin_mem, .umax_mem => |const_info| {
30979 const pt = cg.pt;39962 const pt = cg.pt;
30980 const zcu = pt.zcu;39963 const zcu = pt.zcu;
30981 const ip = &zcu.intern_pool;39964 const ip = &zcu.intern_pool;
30982 const ty = const_info.ref.deref(s).typeOf(s.cg);39965 const ty = const_info.ref.deref(s).typeOf(cg);
30983 const vector_len: ?u32, const scalar_ty: Type = switch (ip.indexToKey(ty.toIntern())) {39966 const vector_len, const scalar_ty: Type = switch (ip.indexToKey(ty.toIntern())) {
30984 else => .{ if (const_info.vectorize) 1 else null, ty },39967 else => .{ null, ty },
30985 .vector_type => |vector_type| .{ vector_type.len, .fromInterned(vector_type.child) },39968 .vector_type => |vector_type| .{ vector_type.len, .fromInterned(vector_type.child) },
30986 };39969 };
39970 const res_vector_len: ?u32 = if (const_info.vectorize_to) |vectorize_to| switch (vectorize_to) {
39971 .none => null,
39972 else => @intCast(@divExact(@divExact(vectorize_to.bitSize(cg.target), 8), scalar_ty.abiSize(pt.zcu))),
39973 } else vector_len;
30987 const res_scalar_ty, const res_scalar_val: Value = res_scalar: switch (scalar_ty.toIntern()) {39974 const res_scalar_ty, const res_scalar_val: Value = res_scalar: switch (scalar_ty.toIntern()) {
30988 .bool_type => .{39975 .bool_type => .{
30989 scalar_ty,39976 scalar_ty,
...@@ -31028,26 +40015,20 @@ const Select = struct {...@@ -31028,26 +40015,20 @@ const Select = struct {
31028 break :res_scalar .{ scalar_int_ty, try pt.intValue_big(scalar_int_ty, big_int.toConst()) };40015 break :res_scalar .{ scalar_int_ty, try pt.intValue_big(scalar_int_ty, big_int.toConst()) };
31029 },40016 },
31030 };40017 };
31031 const res_val: Value = if (vector_len) |len| .fromInterned(try pt.intern(.{ .aggregate = .{40018 const res_val: Value = if (res_vector_len) |len| .fromInterned(try pt.intern(.{ .aggregate = .{
31032 .ty = (try pt.vectorType(.{40019 .ty = (try pt.vectorType(.{
31033 .len = len,40020 .len = len,
31034 .child = res_scalar_ty.toIntern(),40021 .child = res_scalar_ty.toIntern(),
31035 })).toIntern(),40022 })).toIntern(),
31036 .storage = .{ .repeated_elem = res_scalar_val.toIntern() },40023 .storage = .{ .repeated_elem = res_scalar_val.toIntern() },
31037 } })) else res_scalar_val;40024 } })) else res_scalar_val;
31038 return try cg.tempFromValue(res_val);40025 return try cg.tempMemFromValue(res_val);
31039 },
31040 .ref => |ref| ref.deref(s),
31041 .ref_mask => |ref_mask| ref_mask.ref.deref(s),
31042 .mut_reg => |ref_rc| {
31043 const temp = ref_rc.ref.deref(s);
31044 if (temp.isMut(cg)) switch (temp.tracking(cg).short) {
31045 .register => |reg| if (reg.class() == ref_rc.rc) return temp,
31046 .register_offset => |reg_off| if (reg_off.off == 0 and reg_off.reg.class() == ref_rc.rc) return temp,
31047 else => {},
31048 };
31049 return try cg.tempAllocReg(spec.type, regSetForRegClass(ref_rc.rc));
31050 },40026 },
40027 .symbol => |symbol| if (cg.bin_file.cast(.elf)) |elf_file| try cg.tempInit(spec.type, .{ .lea_symbol = .{
40028 .sym_index = try elf_file.getGlobalSymbol(symbol.name, symbol.lib),
40029 } }) else if (cg.bin_file.cast(.macho)) |macho_file| try cg.tempInit(spec.type, .{ .lea_symbol = .{
40030 .sym_index = try macho_file.getGlobalSymbol(symbol.name, symbol.lib),
40031 } }) else cg.fail("external symbols unimplemented for {s}", .{@tagName(cg.bin_file.tag)}),
31051 };40032 };
31052 }40033 }
31053 };40034 };
...@@ -31083,13 +40064,13 @@ const Select = struct {...@@ -31083,13 +40064,13 @@ const Select = struct {
31083 mem,40064 mem,
31084 };40065 };
31085 const Adjust = packed struct(u8) {40066 const Adjust = packed struct(u8) {
31086 factor: i2,40067 sign: enum(u1) { neg, pos },
31087 scale: Memory.Scale,40068 lhs: enum(u4) {
31088 amount: enum(u4) {
31089 none,40069 none,
31090 ptr_size,40070 ptr_size,
31091 ptr_bit_size,40071 ptr_bit_size,
31092 size,40072 size,
40073 size_sub_elem_size,
31093 src0_unaligned_size,40074 src0_unaligned_size,
31094 bit_size,40075 bit_size,
31095 src0_bit_size,40076 src0_bit_size,
...@@ -31102,35 +40083,41 @@ const Select = struct {...@@ -31102,35 +40083,41 @@ const Select = struct {
31102 smax,40083 smax,
31103 umax,40084 umax,
31104 },40085 },
3110540086 op: enum(u1) { mul, div },
31106 const none: Adjust = .{ .factor = 0, .scale = .@"1", .amount = .none };40087 rhs: Memory.Scale,
31107 const sub_ptr_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .ptr_size };40088
31108 const add_ptr_bit_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .ptr_bit_size };40089 const none: Adjust = .{ .sign = .pos, .lhs = .none, .op = .mul, .rhs = .@"1" };
31109 const add_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .size };40090 const sub_ptr_size: Adjust = .{ .sign = .neg, .lhs = .ptr_size, .op = .mul, .rhs = .@"1" };
31110 const sub_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .size };40091 const add_ptr_bit_size: Adjust = .{ .sign = .pos, .lhs = .ptr_bit_size, .op = .mul, .rhs = .@"1" };
31111 const add_src0_unaligned_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_unaligned_size };40092 const add_size: Adjust = .{ .sign = .pos, .lhs = .size, .op = .mul, .rhs = .@"1" };
31112 const sub_src0_unaligned_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_unaligned_size };40093 const add_size_div_8: Adjust = .{ .sign = .pos, .lhs = .size, .op = .div, .rhs = .@"8" };
31113 const add_2_bit_size: Adjust = .{ .factor = 1, .scale = .@"2", .amount = .bit_size };40094 const sub_size_div_8: Adjust = .{ .sign = .neg, .lhs = .size, .op = .div, .rhs = .@"8" };
31114 const add_bit_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .bit_size };40095 const sub_size: Adjust = .{ .sign = .neg, .lhs = .size, .op = .mul, .rhs = .@"1" };
31115 const sub_bit_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .bit_size };40096 const add_size_sub_elem_size: Adjust = .{ .sign = .pos, .lhs = .size_sub_elem_size, .op = .mul, .rhs = .@"1" };
31116 const add_src0_bit_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_bit_size };40097 const add_src0_unaligned_size: Adjust = .{ .sign = .pos, .lhs = .src0_unaligned_size, .op = .mul, .rhs = .@"1" };
31117 const sub_src0_bit_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_bit_size };40098 const sub_src0_unaligned_size: Adjust = .{ .sign = .neg, .lhs = .src0_unaligned_size, .op = .mul, .rhs = .@"1" };
31118 const add_8_len: Adjust = .{ .factor = 1, .scale = .@"8", .amount = .len };40099 const add_2_bit_size: Adjust = .{ .sign = .pos, .lhs = .bit_size, .op = .mul, .rhs = .@"2" };
31119 const add_4_len: Adjust = .{ .factor = 1, .scale = .@"4", .amount = .len };40100 const add_bit_size: Adjust = .{ .sign = .pos, .lhs = .bit_size, .op = .mul, .rhs = .@"1" };
31120 const add_3_len: Adjust = .{ .factor = 1, .scale = .@"3", .amount = .len };40101 const sub_bit_size: Adjust = .{ .sign = .neg, .lhs = .bit_size, .op = .mul, .rhs = .@"1" };
31121 const add_2_len: Adjust = .{ .factor = 1, .scale = .@"2", .amount = .len };40102 const add_src0_bit_size: Adjust = .{ .sign = .pos, .lhs = .src0_bit_size, .op = .mul, .rhs = .@"1" };
31122 const add_len: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .len };40103 const sub_src0_bit_size: Adjust = .{ .sign = .neg, .lhs = .src0_bit_size, .op = .mul, .rhs = .@"1" };
31123 const sub_len: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .len };40104 const add_8_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"8" };
31124 const add_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_elem_size };40105 const add_4_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"4" };
31125 const add_2_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"2", .amount = .src0_elem_size };40106 const add_3_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"3" };
31126 const add_4_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"4", .amount = .src0_elem_size };40107 const add_2_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"2" };
31127 const add_8_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"8", .amount = .src0_elem_size };40108 const add_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"1" };
31128 const sub_src0_elem_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_elem_size };40109 const sub_len: Adjust = .{ .sign = .neg, .lhs = .len, .op = .mul, .rhs = .@"1" };
31129 const add_src0_elem_size_times_src1: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_elem_size_times_src1 };40110 const add_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"1" };
31130 const sub_src0_elem_size_times_src1: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_elem_size_times_src1 };40111 const add_2_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"2" };
31131 const add_log2_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .log2_src0_elem_size };40112 const add_4_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"4" };
31132 const add_elem_limbs: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .elem_limbs };40113 const add_8_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"8" };
31133 const add_umax: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .umax };40114 const add_src0_elem_size_div_8: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .div, .rhs = .@"8" };
40115 const sub_src0_elem_size: Adjust = .{ .sign = .neg, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"1" };
40116 const add_src0_elem_size_times_src1: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size_times_src1, .op = .mul, .rhs = .@"1" };
40117 const sub_src0_elem_size_times_src1: Adjust = .{ .sign = .neg, .lhs = .src0_elem_size_times_src1, .op = .mul, .rhs = .@"1" };
40118 const add_log2_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .log2_src0_elem_size, .op = .mul, .rhs = .@"1" };
40119 const add_elem_limbs: Adjust = .{ .sign = .pos, .lhs = .elem_limbs, .op = .mul, .rhs = .@"1" };
40120 const add_umax: Adjust = .{ .sign = .pos, .lhs = .umax, .op = .mul, .rhs = .@"1" };
31134 };40121 };
31135 const Ref = enum(u4) {40122 const Ref = enum(u4) {
31136 tmp0,40123 tmp0,
...@@ -31139,6 +40126,9 @@ const Select = struct {...@@ -31139,6 +40126,9 @@ const Select = struct {
31139 tmp3,40126 tmp3,
31140 tmp4,40127 tmp4,
31141 tmp5,40128 tmp5,
40129 tmp6,
40130 tmp7,
40131 tmp8,
31142 dst0,40132 dst0,
31143 src0,40133 src0,
31144 src1,40134 src1,
...@@ -31210,6 +40200,36 @@ const Select = struct {...@@ -31210,6 +40200,36 @@ const Select = struct {
31210 const tmp5x: Sized = .{ .ref = .tmp5, .size = .xword };40200 const tmp5x: Sized = .{ .ref = .tmp5, .size = .xword };
31211 const tmp5y: Sized = .{ .ref = .tmp5, .size = .yword };40201 const tmp5y: Sized = .{ .ref = .tmp5, .size = .yword };
3121240202
40203 const tmp6: Sized = .{ .ref = .tmp6, .size = .none };
40204 const tmp6b: Sized = .{ .ref = .tmp6, .size = .byte };
40205 const tmp6w: Sized = .{ .ref = .tmp6, .size = .word };
40206 const tmp6d: Sized = .{ .ref = .tmp6, .size = .dword };
40207 const tmp6p: Sized = .{ .ref = .tmp6, .size = .ptr };
40208 const tmp6q: Sized = .{ .ref = .tmp6, .size = .qword };
40209 const tmp6t: Sized = .{ .ref = .tmp6, .size = .tbyte };
40210 const tmp6x: Sized = .{ .ref = .tmp6, .size = .xword };
40211 const tmp6y: Sized = .{ .ref = .tmp6, .size = .yword };
40212
40213 const tmp7: Sized = .{ .ref = .tmp7, .size = .none };
40214 const tmp7b: Sized = .{ .ref = .tmp7, .size = .byte };
40215 const tmp7w: Sized = .{ .ref = .tmp7, .size = .word };
40216 const tmp7d: Sized = .{ .ref = .tmp7, .size = .dword };
40217 const tmp7p: Sized = .{ .ref = .tmp7, .size = .ptr };
40218 const tmp7q: Sized = .{ .ref = .tmp7, .size = .qword };
40219 const tmp7t: Sized = .{ .ref = .tmp7, .size = .tbyte };
40220 const tmp7x: Sized = .{ .ref = .tmp7, .size = .xword };
40221 const tmp7y: Sized = .{ .ref = .tmp7, .size = .yword };
40222
40223 const tmp8: Sized = .{ .ref = .tmp8, .size = .none };
40224 const tmp8b: Sized = .{ .ref = .tmp8, .size = .byte };
40225 const tmp8w: Sized = .{ .ref = .tmp8, .size = .word };
40226 const tmp8d: Sized = .{ .ref = .tmp8, .size = .dword };
40227 const tmp8p: Sized = .{ .ref = .tmp8, .size = .ptr };
40228 const tmp8q: Sized = .{ .ref = .tmp8, .size = .qword };
40229 const tmp8t: Sized = .{ .ref = .tmp8, .size = .tbyte };
40230 const tmp8x: Sized = .{ .ref = .tmp8, .size = .xword };
40231 const tmp8y: Sized = .{ .ref = .tmp8, .size = .yword };
40232
31213 const dst0: Sized = .{ .ref = .dst0, .size = .none };40233 const dst0: Sized = .{ .ref = .dst0, .size = .none };
31214 const dst0b: Sized = .{ .ref = .dst0, .size = .byte };40234 const dst0b: Sized = .{ .ref = .dst0, .size = .byte };
31215 const dst0w: Sized = .{ .ref = .dst0, .size = .word };40235 const dst0w: Sized = .{ .ref = .dst0, .size = .word };
...@@ -31307,6 +40327,33 @@ const Select = struct {...@@ -31307,6 +40327,33 @@ const Select = struct {
31307 const tmp5x: Select.Operand = .{ .tag = .ref, .base = .tmp5x };40327 const tmp5x: Select.Operand = .{ .tag = .ref, .base = .tmp5x };
31308 const tmp5y: Select.Operand = .{ .tag = .ref, .base = .tmp5y };40328 const tmp5y: Select.Operand = .{ .tag = .ref, .base = .tmp5y };
3130940329
40330 const tmp6b: Select.Operand = .{ .tag = .ref, .base = .tmp6b };
40331 const tmp6w: Select.Operand = .{ .tag = .ref, .base = .tmp6w };
40332 const tmp6d: Select.Operand = .{ .tag = .ref, .base = .tmp6d };
40333 const tmp6p: Select.Operand = .{ .tag = .ref, .base = .tmp6p };
40334 const tmp6q: Select.Operand = .{ .tag = .ref, .base = .tmp6q };
40335 const tmp6t: Select.Operand = .{ .tag = .ref, .base = .tmp6t };
40336 const tmp6x: Select.Operand = .{ .tag = .ref, .base = .tmp6x };
40337 const tmp6y: Select.Operand = .{ .tag = .ref, .base = .tmp6y };
40338
40339 const tmp7b: Select.Operand = .{ .tag = .ref, .base = .tmp7b };
40340 const tmp7w: Select.Operand = .{ .tag = .ref, .base = .tmp7w };
40341 const tmp7d: Select.Operand = .{ .tag = .ref, .base = .tmp7d };
40342 const tmp7p: Select.Operand = .{ .tag = .ref, .base = .tmp7p };
40343 const tmp7q: Select.Operand = .{ .tag = .ref, .base = .tmp7q };
40344 const tmp7t: Select.Operand = .{ .tag = .ref, .base = .tmp7t };
40345 const tmp7x: Select.Operand = .{ .tag = .ref, .base = .tmp7x };
40346 const tmp7y: Select.Operand = .{ .tag = .ref, .base = .tmp7y };
40347
40348 const tmp8b: Select.Operand = .{ .tag = .ref, .base = .tmp8b };
40349 const tmp8w: Select.Operand = .{ .tag = .ref, .base = .tmp8w };
40350 const tmp8d: Select.Operand = .{ .tag = .ref, .base = .tmp8d };
40351 const tmp8p: Select.Operand = .{ .tag = .ref, .base = .tmp8p };
40352 const tmp8q: Select.Operand = .{ .tag = .ref, .base = .tmp8q };
40353 const tmp8t: Select.Operand = .{ .tag = .ref, .base = .tmp8t };
40354 const tmp8x: Select.Operand = .{ .tag = .ref, .base = .tmp8x };
40355 const tmp8y: Select.Operand = .{ .tag = .ref, .base = .tmp8y };
40356
31310 const dst0b: Select.Operand = .{ .tag = .ref, .base = .dst0b };40357 const dst0b: Select.Operand = .{ .tag = .ref, .base = .dst0b };
31311 const dst0w: Select.Operand = .{ .tag = .ref, .base = .dst0w };40358 const dst0w: Select.Operand = .{ .tag = .ref, .base = .dst0w };
31312 const dst0d: Select.Operand = .{ .tag = .ref, .base = .dst0d };40359 const dst0d: Select.Operand = .{ .tag = .ref, .base = .dst0d };
...@@ -31518,11 +40565,15 @@ const Select = struct {...@@ -31518,11 +40565,15 @@ const Select = struct {
31518 const UnsignedImm = @Type(.{40565 const UnsignedImm = @Type(.{
31519 .int = .{ .signedness = .unsigned, .bits = @typeInfo(SignedImm).int.bits },40566 .int = .{ .signedness = .unsigned, .bits = @typeInfo(SignedImm).int.bits },
31520 });40567 });
31521 return @as(i5, op.adjust.factor) * op.adjust.scale.toFactor() * @as(SignedImm, switch (op.adjust.amount) {40568 const lhs: SignedImm = lhs: switch (op.adjust.lhs) {
31522 .none => 0,40569 .none => 0,
31523 .ptr_size => @divExact(s.cg.target.ptrBitWidth(), 8),40570 .ptr_size => @divExact(s.cg.target.ptrBitWidth(), 8),
31524 .ptr_bit_size => s.cg.target.ptrBitWidth(),40571 .ptr_bit_size => s.cg.target.ptrBitWidth(),
31525 .size => @intCast(op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu)),40572 .size => @intCast(op.base.ref.deref(s).typeOf(s.cg).abiSize(s.cg.pt.zcu)),
40573 .size_sub_elem_size => {
40574 const ty = op.base.ref.deref(s).typeOf(s.cg);
40575 break :lhs @intCast(ty.abiSize(s.cg.pt.zcu) - ty.elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu));
40576 },
31526 .src0_unaligned_size => @intCast(s.cg.unalignedSize(Select.Operand.Ref.src0.deref(s).typeOf(s.cg))),40577 .src0_unaligned_size => @intCast(s.cg.unalignedSize(Select.Operand.Ref.src0.deref(s).typeOf(s.cg))),
31527 .bit_size => @intCast(op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu)),40578 .bit_size => @intCast(op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu)),
31528 .src0_bit_size => @intCast(Select.Operand.Ref.src0.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu)),40579 .src0_bit_size => @intCast(Select.Operand.Ref.src0.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu)),
...@@ -31544,7 +40595,20 @@ const Select = struct {...@@ -31544,7 +40595,20 @@ const Select = struct {
31544 .umax => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(40595 .umax => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(
31545 -%op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),40596 -%op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
31546 )),40597 )),
31547 }) + op.imm;40598 };
40599 const rhs = op.adjust.rhs.toLog2();
40600 const res = res: switch (op.adjust.op) {
40601 .mul => {
40602 const res = @shlWithOverflow(lhs, rhs);
40603 assert(res[1] == 0);
40604 break :res res[0];
40605 },
40606 .div => @shrExact(lhs, rhs),
40607 };
40608 return switch (op.adjust.sign) {
40609 .neg => op.imm - res,
40610 .pos => op.imm + res,
40611 };
31548 }40612 }
3154940613
31550 fn lower(op: Select.Operand, s: *Select) !CodeGen.Operand {40614 fn lower(op: Select.Operand, s: *Select) !CodeGen.Operand {
...@@ -31566,6 +40630,7 @@ const Select = struct {...@@ -31566,6 +40630,7 @@ const Select = struct {
31566 } },40630 } },
31567 else => |mcv| .{ .mem = try mcv.mem(s.cg, .{ .size = op.base.size }) },40631 else => |mcv| .{ .mem = try mcv.mem(s.cg, .{ .size = op.base.size }) },
31568 .register => |reg| .{ .reg = s.lowerReg(registerAlias(reg, @intCast(@divExact(op.base.size.bitSize(s.cg.target), 8)))) },40632 .register => |reg| .{ .reg = s.lowerReg(registerAlias(reg, @intCast(@divExact(op.base.size.bitSize(s.cg.target), 8)))) },
40633 .lea_symbol => |sym_off| .{ .imm = .rel(sym_off) },
31569 },40634 },
31570 .simm => .{ .imm = .s(op.adjustedImm(i32, s)) },40635 .simm => .{ .imm = .s(op.adjustedImm(i32, s)) },
31571 .uimm => .{ .imm = .u(@bitCast(op.adjustedImm(i64, s))) },40636 .uimm => .{ .imm = .u(@bitCast(op.adjustedImm(i64, s))) },
...@@ -31601,6 +40666,7 @@ fn select(...@@ -31601,6 +40666,7 @@ fn select(
31601 src_temps: []Temp,40666 src_temps: []Temp,
31602 cases: []const Select.Case,40667 cases: []const Select.Case,
31603) !void {40668) !void {
40669 @setEvalBranchQuota(33_600);
31604 cases: for (cases) |case| {40670 cases: for (cases) |case| {
31605 for (case.required_features) |required_feature| if (required_feature) |feature| if (!cg.hasFeature(feature)) continue :cases;40671 for (case.required_features) |required_feature| if (required_feature) |feature| if (!cg.hasFeature(feature)) continue :cases;
31606 for (case.dst_constraints[0..dst_temps.len], dst_tys) |dst_constraint, dst_ty| if (!dst_constraint.accepts(dst_ty, cg)) continue :cases;40672 for (case.dst_constraints[0..dst_temps.len], dst_tys) |dst_constraint, dst_ty| if (!dst_constraint.accepts(dst_ty, cg)) continue :cases;
...@@ -31613,6 +40679,16 @@ fn select(...@@ -31613,6 +40679,16 @@ fn select(
31613 for (pattern.src[0..src_temps.len], src_temps) |src_pattern, src_temp| if (!src_pattern.matches(src_temp, cg)) continue :patterns;40679 for (pattern.src[0..src_temps.len], src_temps) |src_pattern, src_temp| if (!src_pattern.matches(src_temp, cg)) continue :patterns;
31614 if (std.debug.runtime_safety) for (pattern.src[src_temps.len..]) |src_pattern| assert(src_pattern == .none);40680 if (std.debug.runtime_safety) for (pattern.src[src_temps.len..]) |src_pattern| assert(src_pattern == .none);
3161540681
40682 if (case.call_frame.alignment != .none) {
40683 const frame_allocs_slice = cg.frame_allocs.slice();
40684 const stack_frame_size =
40685 &frame_allocs_slice.items(.abi_size)[@intFromEnum(FrameIndex.call_frame)];
40686 stack_frame_size.* = @max(stack_frame_size.*, case.call_frame.size);
40687 const stack_frame_align =
40688 &frame_allocs_slice.items(.abi_align)[@intFromEnum(FrameIndex.call_frame)];
40689 stack_frame_align.* = stack_frame_align.max(case.call_frame.alignment);
40690 }
40691
31616 var s: Select = .{40692 var s: Select = .{
31617 .cg = cg,40693 .cg = cg,
31618 .temps = undefined,40694 .temps = undefined,
...@@ -31623,15 +40699,32 @@ fn select(...@@ -31623,15 +40699,32 @@ fn select(
31623 const dst_slots = s.temps[@intFromEnum(Select.Operand.Ref.dst0)..@intFromEnum(Select.Operand.Ref.src0)];40699 const dst_slots = s.temps[@intFromEnum(Select.Operand.Ref.dst0)..@intFromEnum(Select.Operand.Ref.src0)];
31624 const src_slots = s.temps[@intFromEnum(Select.Operand.Ref.src0)..@intFromEnum(Select.Operand.Ref.none)];40700 const src_slots = s.temps[@intFromEnum(Select.Operand.Ref.src0)..@intFromEnum(Select.Operand.Ref.none)];
3162540701
31626 for (0..case.clobbers.st -| 1) |i| {40702 caller_preserved: {
31627 const tracked_index: RegisterManager.TrackedIndex = @intCast(RegisterManager.indexOfKnownRegIntoTracked(.st6).? - i);40703 const cc = switch (case.clobbers.caller_preserved) {
31628 try cg.register_manager.getRegIndex(tracked_index, null);40704 .none => break :caller_preserved,
31629 _ = cg.register_manager.lockRegIndexAssumeUnused(tracked_index);40705 .ccc => cg.target.cCallingConvention().?,
40706 .zigcc => .auto,
40707 };
40708 const err_ret_trace_reg = if (cc == .auto and cg.pt.zcu.comp.config.any_error_tracing) err_ret_trace_reg: {
40709 const param_gpr = abi.getCAbiIntParamRegs(.auto);
40710 break :err_ret_trace_reg param_gpr[param_gpr.len - 1];
40711 } else .none;
40712 switch (cc) {
40713 else => unreachable,
40714 inline .x86_64_sysv, .x86_64_win, .auto => |_, tag| inline for (comptime abi.getCallerPreservedRegs(tag)) |reg| skip: {
40715 if (reg == err_ret_trace_reg) break :skip;
40716 const tracked_index = RegisterManager.indexOfKnownRegIntoTracked(reg) orelse break :skip;
40717 try cg.register_manager.getRegIndex(tracked_index, null);
40718 assert(cg.register_manager.lockRegIndexAssumeUnused(tracked_index).tracked_index == tracked_index);
40719 },
40720 }
31630 }40721 }
3163140722
31632 @memcpy(src_slots[0..src_temps.len], src_temps);40723 @memcpy(src_slots[0..src_temps.len], src_temps);
31633 std.mem.swap(Temp, &src_slots[pattern.commute[0]], &src_slots[pattern.commute[1]]);40724 std.mem.swap(Temp, &src_slots[pattern.commute[0]], &src_slots[pattern.commute[1]]);
31634 for (tmp_slots, case.extra_temps) |*slot, spec| slot.* = try spec.create(&s) orelse continue;40725 for (1..3) |pass| for (tmp_slots, case.extra_temps) |*slot, spec| if (pass == spec.pass()) {
40726 slot.* = try spec.create(&s);
40727 };
3163540728
31636 while (true) for (pattern.src[0..src_temps.len], src_temps) |src_pattern, *src_temp| {40729 while (true) for (pattern.src[0..src_temps.len], src_temps) |src_pattern, *src_temp| {
31637 if (try src_pattern.convert(src_temp, cg)) break;40730 if (try src_pattern.convert(src_temp, cg)) break;
...@@ -31642,7 +40735,7 @@ fn select(...@@ -31642,7 +40735,7 @@ fn select(
31642 if (case.clobbers.eflags) try cg.spillEflagsIfOccupied();40735 if (case.clobbers.eflags) try cg.spillEflagsIfOccupied();
3164340736
31644 for (dst_temps, dst_tys, case.dst_temps[0..dst_temps.len]) |*dst_temp, dst_ty, dst_kind|40737 for (dst_temps, dst_tys, case.dst_temps[0..dst_temps.len]) |*dst_temp, dst_ty, dst_kind|
31645 dst_temp.* = (try Select.TempSpec.create(.{ .type = dst_ty, .kind = dst_kind }, &s)).?;40738 dst_temp.* = (try Select.TempSpec.create(.{ .type = dst_ty, .kind = dst_kind }, &s));
31646 @memcpy(dst_slots[0..dst_temps.len], dst_temps);40739 @memcpy(dst_slots[0..dst_temps.len], dst_temps);
3164740740
31648 switch (case.each) {40741 switch (case.each) {
...@@ -31653,9 +40746,24 @@ fn select(...@@ -31653,9 +40746,24 @@ fn select(
31653 }40746 }
31654 assert(s.top == 0);40747 assert(s.top == 0);
3165540748
31656 for (0..case.clobbers.st -| 1) |i| cg.register_manager.unlockReg(.{40749 caller_preserved: {
31657 .tracked_index = @intCast(RegisterManager.indexOfKnownRegIntoTracked(.st6).? - i),40750 const cc = switch (case.clobbers.caller_preserved) {
31658 });40751 .none => break :caller_preserved,
40752 .ccc => cg.target.cCallingConvention().?,
40753 .zigcc => .auto,
40754 };
40755 const err_ret_trace_reg = if (cc == .auto and cg.pt.zcu.comp.config.any_error_tracing) err_ret_trace_reg: {
40756 const param_gpr = abi.getCAbiIntParamRegs(.auto);
40757 break :err_ret_trace_reg param_gpr[param_gpr.len - 1];
40758 } else .none;
40759 switch (cc) {
40760 else => unreachable,
40761 inline .x86_64_sysv, .x86_64_win, .auto => |_, tag| inline for (comptime abi.getCallerPreservedRegs(tag)) |reg| skip: {
40762 if (reg == err_ret_trace_reg) break :skip;
40763 cg.register_manager.unlockReg(.{ .tracked_index = RegisterManager.indexOfKnownRegIntoTracked(reg) orelse break :skip });
40764 },
40765 }
40766 }
31659 for (dst_temps, case.dst_temps[0..dst_temps.len]) |dst_temp, dst_kind| dst_kind.finish(dst_temp, &s);40767 for (dst_temps, case.dst_temps[0..dst_temps.len]) |dst_temp, dst_kind| dst_kind.finish(dst_temp, &s);
31660 for (case.extra_temps, tmp_slots) |spec, temp| if (spec.kind != .unused) try temp.die(cg);40768 for (case.extra_temps, tmp_slots) |spec, temp| if (spec.kind != .unused) try temp.die(cg);
31661 return;40769 return;
src/arch/x86_64/Encoding.zig+3-2
...@@ -361,7 +361,7 @@ pub const Mnemonic = enum {...@@ -361,7 +361,7 @@ pub const Mnemonic = enum {
361 addps, addss,361 addps, addss,
362 andps,362 andps,
363 andnps,363 andnps,
364 cmpps, cmpss,364 cmpps, cmpss, comiss,
365 cvtpi2ps, cvtps2pi, cvtsi2ss, cvtss2si, cvttps2pi, cvttss2si,365 cvtpi2ps, cvtps2pi, cvtsi2ss, cvtss2si, cvttps2pi, cvttss2si,
366 divps, divss,366 divps, divss,
367 fxrstor, fxrstor64, fxsave, fxsave64,367 fxrstor, fxrstor64, fxsave, fxsave64,
...@@ -386,7 +386,7 @@ pub const Mnemonic = enum {...@@ -386,7 +386,7 @@ pub const Mnemonic = enum {
386 andpd,386 andpd,
387 andnpd,387 andnpd,
388 cmppd, //cmpsd,388 cmppd, //cmpsd,
389 comisd, comiss,389 comisd,
390 cvtdq2pd, cvtdq2ps, cvtpd2dq, cvtpd2pi, cvtpd2ps, cvtpi2pd,390 cvtdq2pd, cvtdq2ps, cvtpd2dq, cvtpd2pi, cvtpd2ps, cvtpi2pd,
391 cvtps2dq, cvtps2pd, cvtsd2si, cvtsd2ss, cvtsi2sd, cvtss2sd,391 cvtps2dq, cvtps2pd, cvtsd2si, cvtsd2ss, cvtsi2sd, cvtss2sd,
392 cvttpd2dq, cvttpd2pi, cvttps2dq, cvttsd2si,392 cvttpd2dq, cvttpd2pi, cvttps2dq, cvttsd2si,
...@@ -504,6 +504,7 @@ pub const Mnemonic = enum {...@@ -504,6 +504,7 @@ pub const Mnemonic = enum {
504 vstmxcsr,504 vstmxcsr,
505 vsubpd, vsubps, vsubsd, vsubss,505 vsubpd, vsubps, vsubsd, vsubss,
506 vtestpd, vtestps,506 vtestpd, vtestps,
507 vucomisd, vucomiss,
507 vxorpd, vxorps,508 vxorpd, vxorps,
508 // F16C509 // F16C
509 vcvtph2ps, vcvtps2ph,510 vcvtph2ps, vcvtps2ph,
src/arch/x86_64/Mir.zig+4-4
...@@ -354,6 +354,8 @@ pub const Inst = struct {...@@ -354,6 +354,8 @@ pub const Inst = struct {
354 fn_env,354 fn_env,
355 /// Float No Wait ___ status word355 /// Float No Wait ___ status word
356 fn_sw,356 fn_sw,
357 /// Float Extended ___
358 fx_,
357359
358 /// ___ in 32-bit and Compatibility Mode360 /// ___ in 32-bit and Compatibility Mode
359 _32,361 _32,
...@@ -817,8 +819,10 @@ pub const Inst = struct {...@@ -817,8 +819,10 @@ pub const Inst = struct {
817 /// Round to integer819 /// Round to integer
818 rndint,820 rndint,
819 /// Restore x87 FPU state821 /// Restore x87 FPU state
822 /// Restore x87 FPU, MMX, XMM, and MXCSR state
820 rstor,823 rstor,
821 /// Store x87 FPU state824 /// Store x87 FPU state
825 /// Save x87 FPU, MMX technology, and MXCSR state
822 save,826 save,
823 /// Scale827 /// Scale
824 scale,828 scale,
...@@ -923,10 +927,6 @@ pub const Inst = struct {...@@ -923,10 +927,6 @@ pub const Inst = struct {
923 /// Extract doubleword927 /// Extract doubleword
924 /// Extract quadword928 /// Extract quadword
925 extr,929 extr,
926 /// Restore x87 FPU, MMX, XMM, and MXCSR state
927 fxrstor,
928 /// Save x87 FPU, MMX technology, and MXCSR state
929 fxsave,
930 /// Insert byte930 /// Insert byte
931 /// Insert word931 /// Insert word
932 /// Insert doubleword932 /// Insert doubleword
src/arch/x86_64/bits.zig+5-2
...@@ -366,7 +366,7 @@ pub const Register = enum(u8) {...@@ -366,7 +366,7 @@ pub const Register = enum(u8) {
366 @intFromEnum(Register.eax) ... @intFromEnum(Register.r15d) => @intFromEnum(Register.eax),366 @intFromEnum(Register.eax) ... @intFromEnum(Register.r15d) => @intFromEnum(Register.eax),
367 @intFromEnum(Register.ax) ... @intFromEnum(Register.r15w) => @intFromEnum(Register.ax),367 @intFromEnum(Register.ax) ... @intFromEnum(Register.r15w) => @intFromEnum(Register.ax),
368 @intFromEnum(Register.al) ... @intFromEnum(Register.r15b) => @intFromEnum(Register.al),368 @intFromEnum(Register.al) ... @intFromEnum(Register.r15b) => @intFromEnum(Register.al),
369 @intFromEnum(Register.ah) ... @intFromEnum(Register.bh) => @intFromEnum(Register.ah) - 4,369 @intFromEnum(Register.ah) ... @intFromEnum(Register.bh) => @intFromEnum(Register.ah),
370 else => unreachable,370 else => unreachable,
371 // zig fmt: on371 // zig fmt: on
372 };372 };
...@@ -385,7 +385,10 @@ pub const Register = enum(u8) {...@@ -385,7 +385,10 @@ pub const Register = enum(u8) {
385 }385 }
386386
387 pub fn to8(reg: Register) Register {387 pub fn to8(reg: Register) Register {
388 return @enumFromInt(@intFromEnum(reg) - reg.gpBase() + @intFromEnum(Register.al));388 return switch (@intFromEnum(reg)) {
389 else => @enumFromInt(@intFromEnum(reg) - reg.gpBase() + @intFromEnum(Register.al)),
390 @intFromEnum(Register.ah)...@intFromEnum(Register.bh) => reg,
391 };
389 }392 }
390393
391 fn sseBase(reg: Register) u7 {394 fn sseBase(reg: Register) u7 {
src/arch/x86_64/encodings.zig+6
...@@ -437,6 +437,7 @@ pub const table = [_]Entry{...@@ -437,6 +437,7 @@ pub const table = [_]Entry{
437 .{ .jmp, .d, &.{ .rel32 }, &.{ 0xe9 }, 0, .none, .none },437 .{ .jmp, .d, &.{ .rel32 }, &.{ 0xe9 }, 0, .none, .none },
438 .{ .jmp, .m, &.{ .rm64 }, &.{ 0xff }, 4, .none, .none },438 .{ .jmp, .m, &.{ .rm64 }, &.{ 0xff }, 4, .none, .none },
439439
440 .{ .lahf, .z, &.{}, &.{ 0x9f }, 0, .none, .@"32bit" },
440 .{ .lahf, .z, &.{}, &.{ 0x9f }, 0, .none, .sahf },441 .{ .lahf, .z, &.{}, &.{ 0x9f }, 0, .none, .sahf },
441442
442 .{ .lar, .rm, &.{ .r16, .rm16 }, &.{ 0x0f, 0x02 }, 0, .none, .none },443 .{ .lar, .rm, &.{ .r16, .rm16 }, &.{ 0x0f, 0x02 }, 0, .none, .none },
...@@ -744,6 +745,7 @@ pub const table = [_]Entry{...@@ -744,6 +745,7 @@ pub const table = [_]Entry{
744745
745 .{ .rsm, .z, &.{}, &.{ 0x0f, 0xaa }, 0, .none, .none },746 .{ .rsm, .z, &.{}, &.{ 0x0f, 0xaa }, 0, .none, .none },
746747
748 .{ .sahf, .z, &.{}, &.{ 0x9e }, 0, .none, .@"32bit" },
747 .{ .sahf, .z, &.{}, &.{ 0x9e }, 0, .none, .sahf },749 .{ .sahf, .z, &.{}, &.{ 0x9e }, 0, .none, .sahf },
748750
749 .{ .sal, .m1, &.{ .rm8, .unity }, &.{ 0xd0 }, 4, .none, .none },751 .{ .sal, .m1, &.{ .rm8, .unity }, &.{ 0xd0 }, 4, .none, .none },
...@@ -2275,6 +2277,10 @@ pub const table = [_]Entry{...@@ -2275,6 +2277,10 @@ pub const table = [_]Entry{
2275 .{ .vtestpd, .rm, &.{ .xmm, .xmm_m128 }, &.{ 0x66, 0x0f, 0x38, 0x0f }, 0, .vex_128_w0, .avx },2277 .{ .vtestpd, .rm, &.{ .xmm, .xmm_m128 }, &.{ 0x66, 0x0f, 0x38, 0x0f }, 0, .vex_128_w0, .avx },
2276 .{ .vtestpd, .rm, &.{ .ymm, .ymm_m256 }, &.{ 0x66, 0x0f, 0x38, 0x0f }, 0, .vex_256_w0, .avx },2278 .{ .vtestpd, .rm, &.{ .ymm, .ymm_m256 }, &.{ 0x66, 0x0f, 0x38, 0x0f }, 0, .vex_256_w0, .avx },
22772279
2280 .{ .vucomisd, .rm, &.{ .xmm, .xmm_m64 }, &.{ 0x66, 0x0f, 0x2e }, 0, .vex_lig_wig, .avx },
2281
2282 .{ .vucomiss, .rm, &.{ .xmm, .xmm_m32 }, &.{ 0x0f, 0x2e }, 0, .vex_lig_wig, .avx },
2283
2278 .{ .vxorpd, .rvm, &.{ .xmm, .xmm, .xmm_m128 }, &.{ 0x66, 0x0f, 0x57 }, 0, .vex_128_wig, .avx },2284 .{ .vxorpd, .rvm, &.{ .xmm, .xmm, .xmm_m128 }, &.{ 0x66, 0x0f, 0x57 }, 0, .vex_128_wig, .avx },
2279 .{ .vxorpd, .rvm, &.{ .ymm, .ymm, .ymm_m256 }, &.{ 0x66, 0x0f, 0x57 }, 0, .vex_256_wig, .avx },2285 .{ .vxorpd, .rvm, &.{ .ymm, .ymm, .ymm_m256 }, &.{ 0x66, 0x0f, 0x57 }, 0, .vex_256_wig, .avx },
22802286
src/codegen/c.zig+98-98
...@@ -706,7 +706,7 @@ pub const DeclGen = struct {...@@ -706,7 +706,7 @@ pub const DeclGen = struct {
706 const uav_ty = uav_val.typeOf(zcu);706 const uav_ty = uav_val.typeOf(zcu);
707707
708 // Render an undefined pointer if we have a pointer to a zero-bit or comptime type.708 // Render an undefined pointer if we have a pointer to a zero-bit or comptime type.
709 const ptr_ty = Type.fromInterned(uav.orig_ty);709 const ptr_ty: Type = .fromInterned(uav.orig_ty);
710 if (ptr_ty.isPtrAtRuntime(zcu) and !uav_ty.isFnOrHasRuntimeBits(zcu)) {710 if (ptr_ty.isPtrAtRuntime(zcu) and !uav_ty.isFnOrHasRuntimeBits(zcu)) {
711 return dg.writeCValue(writer, .{ .undef = ptr_ty });711 return dg.writeCValue(writer, .{ .undef = ptr_ty });
712 }712 }
...@@ -782,7 +782,7 @@ pub const DeclGen = struct {...@@ -782,7 +782,7 @@ pub const DeclGen = struct {
782 };782 };
783783
784 // Render an undefined pointer if we have a pointer to a zero-bit or comptime type.784 // Render an undefined pointer if we have a pointer to a zero-bit or comptime type.
785 const nav_ty = Type.fromInterned(ip.getNav(owner_nav).typeOf(ip));785 const nav_ty: Type = .fromInterned(ip.getNav(owner_nav).typeOf(ip));
786 const ptr_ty = try pt.navPtrType(owner_nav);786 const ptr_ty = try pt.navPtrType(owner_nav);
787 if (!nav_ty.isFnOrHasRuntimeBits(zcu)) {787 if (!nav_ty.isFnOrHasRuntimeBits(zcu)) {
788 return dg.writeCValue(writer, .{ .undef = ptr_ty });788 return dg.writeCValue(writer, .{ .undef = ptr_ty });
...@@ -819,7 +819,7 @@ pub const DeclGen = struct {...@@ -819,7 +819,7 @@ pub const DeclGen = struct {
819 .comptime_alloc_ptr, .comptime_field_ptr => unreachable,819 .comptime_alloc_ptr, .comptime_field_ptr => unreachable,
820 .int => |int| {820 .int => |int| {
821 const ptr_ctype = try dg.ctypeFromType(int.ptr_ty, .complete);821 const ptr_ctype = try dg.ctypeFromType(int.ptr_ty, .complete);
822 const addr_val = try pt.intValue(Type.usize, int.addr);822 const addr_val = try pt.intValue(.usize, int.addr);
823 try writer.writeByte('(');823 try writer.writeByte('(');
824 try dg.renderCType(writer, ptr_ctype);824 try dg.renderCType(writer, ptr_ctype);
825 try writer.print("){x}", .{try dg.fmtIntLiteral(addr_val, .Other)});825 try writer.print("){x}", .{try dg.fmtIntLiteral(addr_val, .Other)});
...@@ -859,7 +859,7 @@ pub const DeclGen = struct {...@@ -859,7 +859,7 @@ pub const DeclGen = struct {
859 try writer.writeByte('(');859 try writer.writeByte('(');
860 try dg.renderCType(writer, ptr_ctype);860 try dg.renderCType(writer, ptr_ctype);
861 try writer.writeByte(')');861 try writer.writeByte(')');
862 const offset_val = try pt.intValue(Type.usize, byte_offset);862 const offset_val = try pt.intValue(.usize, byte_offset);
863 try writer.writeAll("((char *)");863 try writer.writeAll("((char *)");
864 try dg.renderPointer(writer, field.parent.*, location);864 try dg.renderPointer(writer, field.parent.*, location);
865 try writer.print(" + {})", .{try dg.fmtIntLiteral(offset_val, .Other)});865 try writer.print(" + {})", .{try dg.fmtIntLiteral(offset_val, .Other)});
...@@ -875,7 +875,7 @@ pub const DeclGen = struct {...@@ -875,7 +875,7 @@ pub const DeclGen = struct {
875 try writer.writeByte(')');875 try writer.writeByte(')');
876 try dg.renderPointer(writer, elem.parent.*, location);876 try dg.renderPointer(writer, elem.parent.*, location);
877 } else {877 } else {
878 const index_val = try pt.intValue(Type.usize, elem.elem_idx);878 const index_val = try pt.intValue(.usize, elem.elem_idx);
879 // We want to do pointer arithmetic on a pointer to the element type.879 // We want to do pointer arithmetic on a pointer to the element type.
880 // We might have a pointer-to-array. In this case, we must cast first.880 // We might have a pointer-to-array. In this case, we must cast first.
881 const result_ctype = try dg.ctypeFromType(elem.result_ptr_ty, .complete);881 const result_ctype = try dg.ctypeFromType(elem.result_ptr_ty, .complete);
...@@ -904,7 +904,7 @@ pub const DeclGen = struct {...@@ -904,7 +904,7 @@ pub const DeclGen = struct {
904 if (oac.byte_offset == 0) {904 if (oac.byte_offset == 0) {
905 try dg.renderPointer(writer, oac.parent.*, location);905 try dg.renderPointer(writer, oac.parent.*, location);
906 } else {906 } else {
907 const offset_val = try pt.intValue(Type.usize, oac.byte_offset);907 const offset_val = try pt.intValue(.usize, oac.byte_offset);
908 try writer.writeAll("((char *)");908 try writer.writeAll("((char *)");
909 try dg.renderPointer(writer, oac.parent.*, location);909 try dg.renderPointer(writer, oac.parent.*, location);
910 try writer.print(" + {})", .{try dg.fmtIntLiteral(offset_val, .Other)});910 try writer.print(" + {})", .{try dg.fmtIntLiteral(offset_val, .Other)});
...@@ -984,7 +984,7 @@ pub const DeclGen = struct {...@@ -984,7 +984,7 @@ pub const DeclGen = struct {
984 try writer.writeAll("((");984 try writer.writeAll("((");
985 try dg.renderCType(writer, ctype);985 try dg.renderCType(writer, ctype);
986 try writer.print("){x})", .{try dg.fmtIntLiteral(986 try writer.print("){x})", .{try dg.fmtIntLiteral(
987 try pt.intValue(Type.usize, val.toUnsignedInt(zcu)),987 try pt.intValue(.usize, val.toUnsignedInt(zcu)),
988 .Other,988 .Other,
989 )});989 )});
990 },990 },
...@@ -1153,7 +1153,7 @@ pub const DeclGen = struct {...@@ -1153,7 +1153,7 @@ pub const DeclGen = struct {
1153 else => |payload| switch (ip.indexToKey(payload)) {1153 else => |payload| switch (ip.indexToKey(payload)) {
1154 .undef => |err_ty| try dg.renderUndefValue(1154 .undef => |err_ty| try dg.renderUndefValue(
1155 writer,1155 writer,
1156 Type.fromInterned(err_ty),1156 .fromInterned(err_ty),
1157 location,1157 location,
1158 ),1158 ),
1159 .err => |err| try dg.renderErrorName(writer, err.name),1159 .err => |err| try dg.renderErrorName(writer, err.name),
...@@ -1204,7 +1204,7 @@ pub const DeclGen = struct {...@@ -1204,7 +1204,7 @@ pub const DeclGen = struct {
1204 ),1204 ),
1205 },1205 },
1206 .ptr => try writer.writeAll("NULL"),1206 .ptr => try writer.writeAll("NULL"),
1207 .len => try dg.renderUndefValue(writer, Type.usize, initializer_type),1207 .len => try dg.renderUndefValue(writer, .usize, initializer_type),
1208 else => unreachable,1208 else => unreachable,
1209 }1209 }
1210 }1210 }
...@@ -1219,7 +1219,7 @@ pub const DeclGen = struct {...@@ -1219,7 +1219,7 @@ pub const DeclGen = struct {
1219 try writer.writeByte(')');1219 try writer.writeByte(')');
1220 }1220 }
1221 const ai = ty.arrayInfo(zcu);1221 const ai = ty.arrayInfo(zcu);
1222 if (ai.elem_type.eql(Type.u8, zcu)) {1222 if (ai.elem_type.eql(.u8, zcu)) {
1223 var literal = stringLiteral(writer, ty.arrayLenIncludingSentinel(zcu));1223 var literal = stringLiteral(writer, ty.arrayLenIncludingSentinel(zcu));
1224 try literal.start();1224 try literal.start();
1225 var index: usize = 0;1225 var index: usize = 0;
...@@ -1263,7 +1263,7 @@ pub const DeclGen = struct {...@@ -1263,7 +1263,7 @@ pub const DeclGen = struct {
1263 for (0..tuple.types.len) |field_index| {1263 for (0..tuple.types.len) |field_index| {
1264 const comptime_val = tuple.values.get(ip)[field_index];1264 const comptime_val = tuple.values.get(ip)[field_index];
1265 if (comptime_val != .none) continue;1265 if (comptime_val != .none) continue;
1266 const field_ty = Type.fromInterned(tuple.types.get(ip)[field_index]);1266 const field_ty: Type = .fromInterned(tuple.types.get(ip)[field_index]);
1267 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;1267 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
12681268
1269 if (!empty) try writer.writeByte(',');1269 if (!empty) try writer.writeByte(',');
...@@ -1298,7 +1298,7 @@ pub const DeclGen = struct {...@@ -1298,7 +1298,7 @@ pub const DeclGen = struct {
1298 var field_it = loaded_struct.iterateRuntimeOrder(ip);1298 var field_it = loaded_struct.iterateRuntimeOrder(ip);
1299 var need_comma = false;1299 var need_comma = false;
1300 while (field_it.next()) |field_index| {1300 while (field_it.next()) |field_index| {
1301 const field_ty = Type.fromInterned(loaded_struct.field_types.get(ip)[field_index]);1301 const field_ty: Type = .fromInterned(loaded_struct.field_types.get(ip)[field_index]);
1302 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;1302 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
13031303
1304 if (need_comma) try writer.writeByte(',');1304 if (need_comma) try writer.writeByte(',');
...@@ -1325,7 +1325,7 @@ pub const DeclGen = struct {...@@ -1325,7 +1325,7 @@ pub const DeclGen = struct {
1325 var eff_num_fields: usize = 0;1325 var eff_num_fields: usize = 0;
13261326
1327 for (0..loaded_struct.field_types.len) |field_index| {1327 for (0..loaded_struct.field_types.len) |field_index| {
1328 const field_ty = Type.fromInterned(loaded_struct.field_types.get(ip)[field_index]);1328 const field_ty: Type = .fromInterned(loaded_struct.field_types.get(ip)[field_index]);
1329 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;1329 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
1330 eff_num_fields += 1;1330 eff_num_fields += 1;
1331 }1331 }
...@@ -1346,7 +1346,7 @@ pub const DeclGen = struct {...@@ -1346,7 +1346,7 @@ pub const DeclGen = struct {
1346 var eff_index: usize = 0;1346 var eff_index: usize = 0;
1347 var needs_closing_paren = false;1347 var needs_closing_paren = false;
1348 for (0..loaded_struct.field_types.len) |field_index| {1348 for (0..loaded_struct.field_types.len) |field_index| {
1349 const field_ty = Type.fromInterned(loaded_struct.field_types.get(ip)[field_index]);1349 const field_ty: Type = .fromInterned(loaded_struct.field_types.get(ip)[field_index]);
1350 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;1350 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
13511351
1352 const field_val = switch (ip.indexToKey(val.toIntern()).aggregate.storage) {1352 const field_val = switch (ip.indexToKey(val.toIntern()).aggregate.storage) {
...@@ -1382,7 +1382,7 @@ pub const DeclGen = struct {...@@ -1382,7 +1382,7 @@ pub const DeclGen = struct {
1382 // a << a_off | b << b_off | c << c_off1382 // a << a_off | b << b_off | c << c_off
1383 var empty = true;1383 var empty = true;
1384 for (0..loaded_struct.field_types.len) |field_index| {1384 for (0..loaded_struct.field_types.len) |field_index| {
1385 const field_ty = Type.fromInterned(loaded_struct.field_types.get(ip)[field_index]);1385 const field_ty: Type = .fromInterned(loaded_struct.field_types.get(ip)[field_index]);
1386 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;1386 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
13871387
1388 if (!empty) try writer.writeAll(" | ");1388 if (!empty) try writer.writeAll(" | ");
...@@ -1466,7 +1466,7 @@ pub const DeclGen = struct {...@@ -1466,7 +1466,7 @@ pub const DeclGen = struct {
1466 }1466 }
14671467
1468 const field_index = zcu.unionTagFieldIndex(loaded_union, Value.fromInterned(un.tag)).?;1468 const field_index = zcu.unionTagFieldIndex(loaded_union, Value.fromInterned(un.tag)).?;
1469 const field_ty = Type.fromInterned(loaded_union.field_types.get(ip)[field_index]);1469 const field_ty: Type = .fromInterned(loaded_union.field_types.get(ip)[field_index]);
1470 const field_name = loaded_union.loadTagType(ip).names.get(ip)[field_index];1470 const field_name = loaded_union.loadTagType(ip).names.get(ip)[field_index];
1471 if (loaded_union.flagsUnordered(ip).layout == .@"packed") {1471 if (loaded_union.flagsUnordered(ip).layout == .@"packed") {
1472 if (field_ty.hasRuntimeBits(zcu)) {1472 if (field_ty.hasRuntimeBits(zcu)) {
...@@ -1509,7 +1509,7 @@ pub const DeclGen = struct {...@@ -1509,7 +1509,7 @@ pub const DeclGen = struct {
1509 );1509 );
1510 try writer.writeByte(' ');1510 try writer.writeByte(' ');
1511 } else for (0..loaded_union.field_types.len) |inner_field_index| {1511 } else for (0..loaded_union.field_types.len) |inner_field_index| {
1512 const inner_field_ty = Type.fromInterned(1512 const inner_field_ty: Type = .fromInterned(
1513 loaded_union.field_types.get(ip)[inner_field_index],1513 loaded_union.field_types.get(ip)[inner_field_index],
1514 );1514 );
1515 if (!inner_field_ty.hasRuntimeBits(zcu)) continue;1515 if (!inner_field_ty.hasRuntimeBits(zcu)) continue;
...@@ -1592,7 +1592,7 @@ pub const DeclGen = struct {...@@ -1592,7 +1592,7 @@ pub const DeclGen = struct {
1592 try writer.writeAll("((");1592 try writer.writeAll("((");
1593 try dg.renderCType(writer, ctype);1593 try dg.renderCType(writer, ctype);
1594 return writer.print("){x})", .{1594 return writer.print("){x})", .{
1595 try dg.fmtIntLiteral(try pt.undefValue(Type.usize), .Other),1595 try dg.fmtIntLiteral(try pt.undefValue(.usize), .Other),
1596 });1596 });
1597 },1597 },
1598 .slice => {1598 .slice => {
...@@ -1606,14 +1606,14 @@ pub const DeclGen = struct {...@@ -1606,14 +1606,14 @@ pub const DeclGen = struct {
1606 const ptr_ty = ty.slicePtrFieldType(zcu);1606 const ptr_ty = ty.slicePtrFieldType(zcu);
1607 try dg.renderType(writer, ptr_ty);1607 try dg.renderType(writer, ptr_ty);
1608 return writer.print("){x}, {0x}}}", .{1608 return writer.print("){x}, {0x}}}", .{
1609 try dg.fmtIntLiteral(try dg.pt.undefValue(Type.usize), .Other),1609 try dg.fmtIntLiteral(try dg.pt.undefValue(.usize), .Other),
1610 });1610 });
1611 },1611 },
1612 },1612 },
1613 .opt_type => |child_type| switch (ctype.info(ctype_pool)) {1613 .opt_type => |child_type| switch (ctype.info(ctype_pool)) {
1614 .basic, .pointer => try dg.renderUndefValue(1614 .basic, .pointer => try dg.renderUndefValue(
1615 writer,1615 writer,
1616 Type.fromInterned(if (ctype.isBool()) .bool_type else child_type),1616 .fromInterned(if (ctype.isBool()) .bool_type else child_type),
1617 location,1617 location,
1618 ),1618 ),
1619 .aligned, .array, .vector, .fwd_decl, .function => unreachable,1619 .aligned, .array, .vector, .fwd_decl, .function => unreachable,
...@@ -1622,7 +1622,7 @@ pub const DeclGen = struct {...@@ -1622,7 +1622,7 @@ pub const DeclGen = struct {
1622 .is_null, .payload => {},1622 .is_null, .payload => {},
1623 .ptr, .len => return dg.renderUndefValue(1623 .ptr, .len => return dg.renderUndefValue(
1624 writer,1624 writer,
1625 Type.fromInterned(child_type),1625 .fromInterned(child_type),
1626 location,1626 location,
1627 ),1627 ),
1628 else => unreachable,1628 else => unreachable,
...@@ -1635,7 +1635,7 @@ pub const DeclGen = struct {...@@ -1635,7 +1635,7 @@ pub const DeclGen = struct {
1635 try writer.writeByte('{');1635 try writer.writeByte('{');
1636 for (0..aggregate.fields.len) |field_index| {1636 for (0..aggregate.fields.len) |field_index| {
1637 if (field_index > 0) try writer.writeByte(',');1637 if (field_index > 0) try writer.writeByte(',');
1638 try dg.renderUndefValue(writer, Type.fromInterned(1638 try dg.renderUndefValue(writer, .fromInterned(
1639 switch (aggregate.fields.at(field_index, ctype_pool).name.index) {1639 switch (aggregate.fields.at(field_index, ctype_pool).name.index) {
1640 .is_null => .bool_type,1640 .is_null => .bool_type,
1641 .payload => child_type,1641 .payload => child_type,
...@@ -1660,7 +1660,7 @@ pub const DeclGen = struct {...@@ -1660,7 +1660,7 @@ pub const DeclGen = struct {
1660 var field_it = loaded_struct.iterateRuntimeOrder(ip);1660 var field_it = loaded_struct.iterateRuntimeOrder(ip);
1661 var need_comma = false;1661 var need_comma = false;
1662 while (field_it.next()) |field_index| {1662 while (field_it.next()) |field_index| {
1663 const field_ty = Type.fromInterned(loaded_struct.field_types.get(ip)[field_index]);1663 const field_ty: Type = .fromInterned(loaded_struct.field_types.get(ip)[field_index]);
1664 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;1664 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
16651665
1666 if (need_comma) try writer.writeByte(',');1666 if (need_comma) try writer.writeByte(',');
...@@ -1685,7 +1685,7 @@ pub const DeclGen = struct {...@@ -1685,7 +1685,7 @@ pub const DeclGen = struct {
1685 var need_comma = false;1685 var need_comma = false;
1686 for (0..tuple_info.types.len) |field_index| {1686 for (0..tuple_info.types.len) |field_index| {
1687 if (tuple_info.values.get(ip)[field_index] != .none) continue;1687 if (tuple_info.values.get(ip)[field_index] != .none) continue;
1688 const field_ty = Type.fromInterned(tuple_info.types.get(ip)[field_index]);1688 const field_ty: Type = .fromInterned(tuple_info.types.get(ip)[field_index]);
1689 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;1689 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
16901690
1691 if (need_comma) try writer.writeByte(',');1691 if (need_comma) try writer.writeByte(',');
...@@ -1715,13 +1715,13 @@ pub const DeclGen = struct {...@@ -1715,13 +1715,13 @@ pub const DeclGen = struct {
1715 .payload) {1715 .payload) {
1716 .tag => try dg.renderUndefValue(1716 .tag => try dg.renderUndefValue(
1717 writer,1717 writer,
1718 Type.fromInterned(loaded_union.enum_tag_ty),1718 .fromInterned(loaded_union.enum_tag_ty),
1719 initializer_type,1719 initializer_type,
1720 ),1720 ),
1721 .payload => {1721 .payload => {
1722 try writer.writeByte('{');1722 try writer.writeByte('{');
1723 for (0..loaded_union.field_types.len) |inner_field_index| {1723 for (0..loaded_union.field_types.len) |inner_field_index| {
1724 const inner_field_ty = Type.fromInterned(1724 const inner_field_ty: Type = .fromInterned(
1725 loaded_union.field_types.get(ip)[inner_field_index],1725 loaded_union.field_types.get(ip)[inner_field_index],
1726 );1726 );
1727 if (!inner_field_ty.hasRuntimeBits(pt.zcu)) continue;1727 if (!inner_field_ty.hasRuntimeBits(pt.zcu)) continue;
...@@ -1747,7 +1747,7 @@ pub const DeclGen = struct {...@@ -1747,7 +1747,7 @@ pub const DeclGen = struct {
1747 .error_union_type => |error_union_type| switch (ctype.info(ctype_pool)) {1747 .error_union_type => |error_union_type| switch (ctype.info(ctype_pool)) {
1748 .basic => try dg.renderUndefValue(1748 .basic => try dg.renderUndefValue(
1749 writer,1749 writer,
1750 Type.fromInterned(error_union_type.error_set_type),1750 .fromInterned(error_union_type.error_set_type),
1751 location,1751 location,
1752 ),1752 ),
1753 .pointer, .aligned, .array, .vector, .fwd_decl, .function => unreachable,1753 .pointer, .aligned, .array, .vector, .fwd_decl, .function => unreachable,
...@@ -1762,7 +1762,7 @@ pub const DeclGen = struct {...@@ -1762,7 +1762,7 @@ pub const DeclGen = struct {
1762 if (field_index > 0) try writer.writeByte(',');1762 if (field_index > 0) try writer.writeByte(',');
1763 try dg.renderUndefValue(1763 try dg.renderUndefValue(
1764 writer,1764 writer,
1765 Type.fromInterned(1765 .fromInterned(
1766 switch (aggregate.fields.at(field_index, ctype_pool).name.index) {1766 switch (aggregate.fields.at(field_index, ctype_pool).name.index) {
1767 .@"error" => error_union_type.error_set_type,1767 .@"error" => error_union_type.error_set_type,
1768 .payload => error_union_type.payload_type,1768 .payload => error_union_type.payload_type,
...@@ -1777,7 +1777,7 @@ pub const DeclGen = struct {...@@ -1777,7 +1777,7 @@ pub const DeclGen = struct {
1777 },1777 },
1778 .array_type, .vector_type => {1778 .array_type, .vector_type => {
1779 const ai = ty.arrayInfo(zcu);1779 const ai = ty.arrayInfo(zcu);
1780 if (ai.elem_type.eql(Type.u8, zcu)) {1780 if (ai.elem_type.eql(.u8, zcu)) {
1781 const c_len = ty.arrayLenIncludingSentinel(zcu);1781 const c_len = ty.arrayLenIncludingSentinel(zcu);
1782 var literal = stringLiteral(writer, c_len);1782 var literal = stringLiteral(writer, c_len);
1783 try literal.start();1783 try literal.start();
...@@ -1981,8 +1981,8 @@ pub const DeclGen = struct {...@@ -1981,8 +1981,8 @@ pub const DeclGen = struct {
19811981
1982 const src_is_ptr = src_ty.isPtrAtRuntime(pt.zcu);1982 const src_is_ptr = src_ty.isPtrAtRuntime(pt.zcu);
1983 const src_eff_ty: Type = if (src_is_ptr) switch (dest_int_info.signedness) {1983 const src_eff_ty: Type = if (src_is_ptr) switch (dest_int_info.signedness) {
1984 .unsigned => Type.usize,1984 .unsigned => .usize,
1985 .signed => Type.isize,1985 .signed => .isize,
1986 } else src_ty;1986 } else src_ty;
19871987
1988 const src_bits = src_eff_ty.bitSize(zcu);1988 const src_bits = src_eff_ty.bitSize(zcu);
...@@ -2022,8 +2022,8 @@ pub const DeclGen = struct {...@@ -2022,8 +2022,8 @@ pub const DeclGen = struct {
20222022
2023 const src_is_ptr = src_ty.isPtrAtRuntime(zcu);2023 const src_is_ptr = src_ty.isPtrAtRuntime(zcu);
2024 const src_eff_ty: Type = if (src_is_ptr) switch (dest_int_info.signedness) {2024 const src_eff_ty: Type = if (src_is_ptr) switch (dest_int_info.signedness) {
2025 .unsigned => Type.usize,2025 .unsigned => .usize,
2026 .signed => Type.isize,2026 .signed => .isize,
2027 } else src_ty;2027 } else src_ty;
20282028
2029 const src_bits = src_eff_ty.bitSize(zcu);2029 const src_bits = src_eff_ty.bitSize(zcu);
...@@ -2249,7 +2249,7 @@ pub const DeclGen = struct {...@@ -2249,7 +2249,7 @@ pub const DeclGen = struct {
2249 if (flags.is_threadlocal and !dg.mod.single_threaded) try fwd.writeAll("zig_threadlocal ");2249 if (flags.is_threadlocal and !dg.mod.single_threaded) try fwd.writeAll("zig_threadlocal ");
2250 try dg.renderTypeAndName(2250 try dg.renderTypeAndName(
2251 fwd,2251 fwd,
2252 Type.fromInterned(nav.typeOf(ip)),2252 .fromInterned(nav.typeOf(ip)),
2253 .{ .nav = nav_index },2253 .{ .nav = nav_index },
2254 CQualifiers.init(.{ .@"const" = flags.is_const }),2254 CQualifiers.init(.{ .@"const" = flags.is_const }),
2255 nav.getAlignment(),2255 nav.getAlignment(),
...@@ -2321,7 +2321,7 @@ pub const DeclGen = struct {...@@ -2321,7 +2321,7 @@ pub const DeclGen = struct {
23212321
2322 if (is_big) try writer.print(", {}", .{int_info.signedness == .signed});2322 if (is_big) try writer.print(", {}", .{int_info.signedness == .signed});
2323 try writer.print(", {}", .{try dg.fmtIntLiteral(2323 try writer.print(", {}", .{try dg.fmtIntLiteral(
2324 try pt.intValue(if (is_big) Type.u16 else Type.u8, int_info.bits),2324 try pt.intValue(if (is_big) .u16 else .u8, int_info.bits),
2325 .FunctionArgument,2325 .FunctionArgument,
2326 )});2326 )});
2327 }2327 }
...@@ -2657,7 +2657,7 @@ pub fn genTypeDecl(...@@ -2657,7 +2657,7 @@ pub fn genTypeDecl(
2657 },2657 },
2658 .index => |index| if (!found_existing) {2658 .index => |index| if (!found_existing) {
2659 const ip = &zcu.intern_pool;2659 const ip = &zcu.intern_pool;
2660 const ty = Type.fromInterned(index);2660 const ty: Type = .fromInterned(index);
2661 _ = try renderTypePrefix(.flush, global_ctype_pool, zcu, writer, global_ctype, .suffix, .{});2661 _ = try renderTypePrefix(.flush, global_ctype_pool, zcu, writer, global_ctype, .suffix, .{});
2662 try writer.writeByte(';');2662 try writer.writeByte(';');
2663 const file_scope = ty.typeDeclInstAllowGeneratedTag(zcu).?.resolveFile(ip);2663 const file_scope = ty.typeDeclInstAllowGeneratedTag(zcu).?.resolveFile(ip);
...@@ -2772,7 +2772,7 @@ pub fn genErrDecls(o: *Object) !void {...@@ -2772,7 +2772,7 @@ pub fn genErrDecls(o: *Object) !void {
2772 if (val > 1) try writer.writeAll(", ");2772 if (val > 1) try writer.writeAll(", ");
2773 try writer.print("{{" ++ name_prefix ++ "{}, {}}}", .{2773 try writer.print("{{" ++ name_prefix ++ "{}, {}}}", .{
2774 fmtIdent(name),2774 fmtIdent(name),
2775 try o.dg.fmtIntLiteral(try pt.intValue(Type.usize, name.len), .StaticInitializer),2775 try o.dg.fmtIntLiteral(try pt.intValue(.usize, name.len), .StaticInitializer),
2776 });2776 });
2777 }2777 }
2778 try writer.writeAll("};\n");2778 try writer.writeAll("};\n");
...@@ -2788,8 +2788,8 @@ pub fn genLazyFn(o: *Object, lazy_ctype_pool: *const CType.Pool, lazy_fn: LazyFn...@@ -2788,8 +2788,8 @@ pub fn genLazyFn(o: *Object, lazy_ctype_pool: *const CType.Pool, lazy_fn: LazyFn
2788 const val = lazy_fn.value_ptr;2788 const val = lazy_fn.value_ptr;
2789 switch (key) {2789 switch (key) {
2790 .tag_name => |enum_ty_ip| {2790 .tag_name => |enum_ty_ip| {
2791 const enum_ty = Type.fromInterned(enum_ty_ip);2791 const enum_ty: Type = .fromInterned(enum_ty_ip);
2792 const name_slice_ty = Type.slice_const_u8_sentinel_0;2792 const name_slice_ty: Type = .slice_const_u8_sentinel_0;
27932793
2794 try w.writeAll("static ");2794 try w.writeAll("static ");
2795 try o.dg.renderType(w, name_slice_ty);2795 try o.dg.renderType(w, name_slice_ty);
...@@ -2822,7 +2822,7 @@ pub fn genLazyFn(o: *Object, lazy_ctype_pool: *const CType.Pool, lazy_fn: LazyFn...@@ -2822,7 +2822,7 @@ pub fn genLazyFn(o: *Object, lazy_ctype_pool: *const CType.Pool, lazy_fn: LazyFn
2822 try o.dg.renderType(w, name_slice_ty);2822 try o.dg.renderType(w, name_slice_ty);
2823 try w.print("){{{}, {}}};\n", .{2823 try w.print("){{{}, {}}};\n", .{
2824 fmtIdent("name"),2824 fmtIdent("name"),
2825 try o.dg.fmtIntLiteral(try pt.intValue(Type.usize, tag_name_len), .Other),2825 try o.dg.fmtIntLiteral(try pt.intValue(.usize, tag_name_len), .Other),
2826 });2826 });
28272827
2828 try w.writeAll(" }\n");2828 try w.writeAll(" }\n");
...@@ -2966,7 +2966,7 @@ pub fn genDecl(o: *Object) !void {...@@ -2966,7 +2966,7 @@ pub fn genDecl(o: *Object) !void {
2966 const zcu = pt.zcu;2966 const zcu = pt.zcu;
2967 const ip = &zcu.intern_pool;2967 const ip = &zcu.intern_pool;
2968 const nav = ip.getNav(o.dg.pass.nav);2968 const nav = ip.getNav(o.dg.pass.nav);
2969 const nav_ty = Type.fromInterned(nav.typeOf(ip));2969 const nav_ty: Type = .fromInterned(nav.typeOf(ip));
29702970
2971 if (!nav_ty.isFnOrHasRuntimeBitsIgnoreComptime(zcu)) return;2971 if (!nav_ty.isFnOrHasRuntimeBitsIgnoreComptime(zcu)) return;
2972 switch (ip.indexToKey(nav.status.fully_resolved.val)) {2972 switch (ip.indexToKey(nav.status.fully_resolved.val)) {
...@@ -3717,7 +3717,7 @@ fn airArg(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -3717,7 +3717,7 @@ fn airArg(f: *Function, inst: Air.Inst.Index) !CValue {
3717 if (f.liveness.isUnused(inst)) {3717 if (f.liveness.isUnused(inst)) {
3718 const writer = f.object.writer();3718 const writer = f.object.writer();
3719 try writer.writeByte('(');3719 try writer.writeByte('(');
3720 try f.renderType(writer, Type.void);3720 try f.renderType(writer, .void);
3721 try writer.writeByte(')');3721 try writer.writeByte(')');
3722 try f.writeCValue(writer, result, .Other);3722 try f.writeCValue(writer, result, .Other);
3723 try writer.writeAll(";\n");3723 try writer.writeAll(";\n");
...@@ -3735,7 +3735,7 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -3735,7 +3735,7 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue {
3735 const ptr_ty = f.typeOf(ty_op.operand);3735 const ptr_ty = f.typeOf(ty_op.operand);
3736 const ptr_scalar_ty = ptr_ty.scalarType(zcu);3736 const ptr_scalar_ty = ptr_ty.scalarType(zcu);
3737 const ptr_info = ptr_scalar_ty.ptrInfo(zcu);3737 const ptr_info = ptr_scalar_ty.ptrInfo(zcu);
3738 const src_ty = Type.fromInterned(ptr_info.child);3738 const src_ty: Type = .fromInterned(ptr_info.child);
37393739
3740 if (!src_ty.hasRuntimeBitsIgnoreComptime(zcu)) {3740 if (!src_ty.hasRuntimeBitsIgnoreComptime(zcu)) {
3741 try reap(f, inst, &.{ty_op.operand});3741 try reap(f, inst, &.{ty_op.operand});
...@@ -3953,7 +3953,7 @@ fn airTrunc(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -3953,7 +3953,7 @@ fn airTrunc(f: *Function, inst: Air.Inst.Index) !CValue {
3953 .signed => {3953 .signed => {
3954 const c_bits = toCIntBits(scalar_int_info.bits) orelse3954 const c_bits = toCIntBits(scalar_int_info.bits) orelse
3955 return f.fail("TODO: C backend: implement integer types larger than 128 bits", .{});3955 return f.fail("TODO: C backend: implement integer types larger than 128 bits", .{});
3956 const shift_val = try pt.intValue(Type.u8, c_bits - dest_bits);3956 const shift_val = try pt.intValue(.u8, c_bits - dest_bits);
39573957
3958 try writer.writeAll("zig_shr_");3958 try writer.writeAll("zig_shr_");
3959 try f.object.dg.renderTypeForBuiltinFnName(writer, scalar_ty);3959 try f.object.dg.renderTypeForBuiltinFnName(writer, scalar_ty);
...@@ -4019,7 +4019,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {...@@ -4019,7 +4019,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {
4019 try writer.writeAll("memset(");4019 try writer.writeAll("memset(");
4020 try f.writeCValue(writer, ptr_val, .FunctionArgument);4020 try f.writeCValue(writer, ptr_val, .FunctionArgument);
4021 try writer.writeAll(", 0xaa, sizeof(");4021 try writer.writeAll(", 0xaa, sizeof(");
4022 try f.renderType(writer, Type.fromInterned(ptr_info.child));4022 try f.renderType(writer, .fromInterned(ptr_info.child));
4023 try writer.writeAll("));\n");4023 try writer.writeAll("));\n");
4024 }4024 }
4025 return .none;4025 return .none;
...@@ -4029,7 +4029,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {...@@ -4029,7 +4029,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {
4029 ptr_info.flags.alignment.order(src_ty.abiAlignment(zcu)).compare(.gte)4029 ptr_info.flags.alignment.order(src_ty.abiAlignment(zcu)).compare(.gte)
4030 else4030 else
4031 true;4031 true;
4032 const is_array = lowersToArray(Type.fromInterned(ptr_info.child), pt);4032 const is_array = lowersToArray(.fromInterned(ptr_info.child), pt);
4033 const need_memcpy = !is_aligned or is_array;4033 const need_memcpy = !is_aligned or is_array;
40344034
4035 const src_val = try f.resolveInst(bin_op.rhs);4035 const src_val = try f.resolveInst(bin_op.rhs);
...@@ -4040,7 +4040,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {...@@ -4040,7 +4040,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {
4040 if (need_memcpy) {4040 if (need_memcpy) {
4041 // For this memcpy to safely work we need the rhs to have the same4041 // For this memcpy to safely work we need the rhs to have the same
4042 // underlying type as the lhs (i.e. they must both be arrays of the same underlying type).4042 // underlying type as the lhs (i.e. they must both be arrays of the same underlying type).
4043 assert(src_ty.eql(Type.fromInterned(ptr_info.child), zcu));4043 assert(src_ty.eql(.fromInterned(ptr_info.child), zcu));
40444044
4045 // If the source is a constant, writeCValue will emit a brace initialization4045 // If the source is a constant, writeCValue will emit a brace initialization
4046 // so work around this by initializing into new local.4046 // so work around this by initializing into new local.
...@@ -4120,7 +4120,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {...@@ -4120,7 +4120,7 @@ fn airStore(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {
41204120
4121 if (src_ty.isPtrAtRuntime(zcu)) {4121 if (src_ty.isPtrAtRuntime(zcu)) {
4122 try writer.writeByte('(');4122 try writer.writeByte('(');
4123 try f.renderType(writer, Type.usize);4123 try f.renderType(writer, .usize);
4124 try writer.writeByte(')');4124 try writer.writeByte(')');
4125 }4125 }
4126 try f.writeCValue(writer, src_val, .Other);4126 try f.writeCValue(writer, src_val, .Other);
...@@ -4343,8 +4343,8 @@ fn airEquality(...@@ -4343,8 +4343,8 @@ fn airEquality(
4343 try reap(f, inst, &.{ bin_op.lhs, bin_op.rhs });4343 try reap(f, inst, &.{ bin_op.lhs, bin_op.rhs });
43444344
4345 const writer = f.object.writer();4345 const writer = f.object.writer();
4346 const local = try f.allocLocal(inst, Type.bool);4346 const local = try f.allocLocal(inst, .bool);
4347 const a = try Assignment.start(f, writer, CType.bool);4347 const a = try Assignment.start(f, writer, .bool);
4348 try f.writeCValue(writer, local, .Other);4348 try f.writeCValue(writer, local, .Other);
4349 try a.assign(f, writer);4349 try a.assign(f, writer);
43504350
...@@ -4401,7 +4401,7 @@ fn airCmpLtErrorsLen(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -4401,7 +4401,7 @@ fn airCmpLtErrorsLen(f: *Function, inst: Air.Inst.Index) !CValue {
4401 try reap(f, inst, &.{un_op});4401 try reap(f, inst, &.{un_op});
44024402
4403 const writer = f.object.writer();4403 const writer = f.object.writer();
4404 const local = try f.allocLocal(inst, Type.bool);4404 const local = try f.allocLocal(inst, .bool);
4405 try f.writeCValue(writer, local, .Other);4405 try f.writeCValue(writer, local, .Other);
4406 try writer.writeAll(" = ");4406 try writer.writeAll(" = ");
4407 try f.writeCValue(writer, operand, .Other);4407 try f.writeCValue(writer, operand, .Other);
...@@ -4517,7 +4517,7 @@ fn airSlice(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -4517,7 +4517,7 @@ fn airSlice(f: *Function, inst: Air.Inst.Index) !CValue {
4517 try a.end(f, writer);4517 try a.end(f, writer);
4518 }4518 }
4519 {4519 {
4520 const a = try Assignment.start(f, writer, CType.usize);4520 const a = try Assignment.start(f, writer, .usize);
4521 try f.writeCValueMember(writer, local, .{ .identifier = "len" });4521 try f.writeCValueMember(writer, local, .{ .identifier = "len" });
4522 try a.assign(f, writer);4522 try a.assign(f, writer);
4523 try f.writeCValue(writer, len, .Initializer);4523 try f.writeCValue(writer, len, .Initializer);
...@@ -4585,9 +4585,9 @@ fn airCall(...@@ -4585,9 +4585,9 @@ fn airCall(
4585 else => unreachable,4585 else => unreachable,
4586 };4586 };
4587 const fn_info = zcu.typeToFunc(if (callee_is_ptr) callee_ty.childType(zcu) else callee_ty).?;4587 const fn_info = zcu.typeToFunc(if (callee_is_ptr) callee_ty.childType(zcu) else callee_ty).?;
4588 const ret_ty = Type.fromInterned(fn_info.return_type);4588 const ret_ty: Type = .fromInterned(fn_info.return_type);
4589 const ret_ctype: CType = if (ret_ty.isNoReturn(zcu))4589 const ret_ctype: CType = if (ret_ty.isNoReturn(zcu))
4590 CType.void4590 .void
4591 else4591 else
4592 try f.ctypeFromType(ret_ty, .parameter);4592 try f.ctypeFromType(ret_ty, .parameter);
45934593
...@@ -4599,7 +4599,7 @@ fn airCall(...@@ -4599,7 +4599,7 @@ fn airCall(
4599 break :result .none;4599 break :result .none;
4600 } else if (f.liveness.isUnused(inst)) {4600 } else if (f.liveness.isUnused(inst)) {
4601 try writer.writeByte('(');4601 try writer.writeByte('(');
4602 try f.renderCType(writer, CType.void);4602 try f.renderCType(writer, .void);
4603 try writer.writeByte(')');4603 try writer.writeByte(')');
4604 break :result .none;4604 break :result .none;
4605 } else {4605 } else {
...@@ -5081,20 +5081,20 @@ fn airBreakpoint(writer: anytype) !CValue {...@@ -5081,20 +5081,20 @@ fn airBreakpoint(writer: anytype) !CValue {
50815081
5082fn airRetAddr(f: *Function, inst: Air.Inst.Index) !CValue {5082fn airRetAddr(f: *Function, inst: Air.Inst.Index) !CValue {
5083 const writer = f.object.writer();5083 const writer = f.object.writer();
5084 const local = try f.allocLocal(inst, Type.usize);5084 const local = try f.allocLocal(inst, .usize);
5085 try f.writeCValue(writer, local, .Other);5085 try f.writeCValue(writer, local, .Other);
5086 try writer.writeAll(" = (");5086 try writer.writeAll(" = (");
5087 try f.renderType(writer, Type.usize);5087 try f.renderType(writer, .usize);
5088 try writer.writeAll(")zig_return_address();\n");5088 try writer.writeAll(")zig_return_address();\n");
5089 return local;5089 return local;
5090}5090}
50915091
5092fn airFrameAddress(f: *Function, inst: Air.Inst.Index) !CValue {5092fn airFrameAddress(f: *Function, inst: Air.Inst.Index) !CValue {
5093 const writer = f.object.writer();5093 const writer = f.object.writer();
5094 const local = try f.allocLocal(inst, Type.usize);5094 const local = try f.allocLocal(inst, .usize);
5095 try f.writeCValue(writer, local, .Other);5095 try f.writeCValue(writer, local, .Other);
5096 try writer.writeAll(" = (");5096 try writer.writeAll(" = (");
5097 try f.renderType(writer, Type.usize);5097 try f.renderType(writer, .usize);
5098 try writer.writeAll(")zig_frame_address();\n");5098 try writer.writeAll(")zig_frame_address();\n");
5099 return local;5099 return local;
5100}5100}
...@@ -5179,10 +5179,10 @@ fn airSwitchBr(f: *Function, inst: Air.Inst.Index, is_dispatch_loop: bool) !void...@@ -5179,10 +5179,10 @@ fn airSwitchBr(f: *Function, inst: Air.Inst.Index, is_dispatch_loop: bool) !void
51795179
5180 try writer.writeAll("switch (");5180 try writer.writeAll("switch (");
51815181
5182 const lowered_condition_ty = if (condition_ty.toIntern() == .bool_type)5182 const lowered_condition_ty: Type = if (condition_ty.toIntern() == .bool_type)
5183 Type.u15183 .u1
5184 else if (condition_ty.isPtrAtRuntime(zcu))5184 else if (condition_ty.isPtrAtRuntime(zcu))
5185 Type.usize5185 .usize
5186 else5186 else
5187 condition_ty;5187 condition_ty;
5188 if (condition_ty.toIntern() != lowered_condition_ty.toIntern()) {5188 if (condition_ty.toIntern() != lowered_condition_ty.toIntern()) {
...@@ -5219,7 +5219,7 @@ fn airSwitchBr(f: *Function, inst: Air.Inst.Index, is_dispatch_loop: bool) !void...@@ -5219,7 +5219,7 @@ fn airSwitchBr(f: *Function, inst: Air.Inst.Index, is_dispatch_loop: bool) !void
5219 }5219 }
5220 if (condition_ty.isPtrAtRuntime(zcu)) {5220 if (condition_ty.isPtrAtRuntime(zcu)) {
5221 try writer.writeByte('(');5221 try writer.writeByte('(');
5222 try f.renderType(writer, Type.usize);5222 try f.renderType(writer, .usize);
5223 try writer.writeByte(')');5223 try writer.writeByte(')');
5224 }5224 }
5225 try f.object.dg.renderValue(writer, (try f.air.value(item, pt)).?, .Other);5225 try f.object.dg.renderValue(writer, (try f.air.value(item, pt)).?, .Other);
...@@ -5604,8 +5604,8 @@ fn airIsNull(...@@ -5604,8 +5604,8 @@ fn airIsNull(
5604 const operand = try f.resolveInst(un_op);5604 const operand = try f.resolveInst(un_op);
5605 try reap(f, inst, &.{un_op});5605 try reap(f, inst, &.{un_op});
56065606
5607 const local = try f.allocLocal(inst, Type.bool);5607 const local = try f.allocLocal(inst, .bool);
5608 const a = try Assignment.start(f, writer, CType.bool);5608 const a = try Assignment.start(f, writer, .bool);
5609 try f.writeCValue(writer, local, .Other);5609 try f.writeCValue(writer, local, .Other);
5610 try a.assign(f, writer);5610 try a.assign(f, writer);
56115611
...@@ -5750,7 +5750,7 @@ fn fieldLocation(...@@ -5750,7 +5750,7 @@ fn fieldLocation(
5750} {5750} {
5751 const zcu = pt.zcu;5751 const zcu = pt.zcu;
5752 const ip = &zcu.intern_pool;5752 const ip = &zcu.intern_pool;
5753 const container_ty = Type.fromInterned(ip.indexToKey(container_ptr_ty.toIntern()).ptr_type.child);5753 const container_ty: Type = .fromInterned(ip.indexToKey(container_ptr_ty.toIntern()).ptr_type.child);
5754 switch (ip.indexToKey(container_ty.toIntern())) {5754 switch (ip.indexToKey(container_ty.toIntern())) {
5755 .struct_type => {5755 .struct_type => {
5756 const loaded_struct = ip.loadStructType(container_ty.toIntern());5756 const loaded_struct = ip.loadStructType(container_ty.toIntern());
...@@ -5781,7 +5781,7 @@ fn fieldLocation(...@@ -5781,7 +5781,7 @@ fn fieldLocation(
5781 const loaded_union = ip.loadUnionType(container_ty.toIntern());5781 const loaded_union = ip.loadUnionType(container_ty.toIntern());
5782 switch (loaded_union.flagsUnordered(ip).layout) {5782 switch (loaded_union.flagsUnordered(ip).layout) {
5783 .auto, .@"extern" => {5783 .auto, .@"extern" => {
5784 const field_ty = Type.fromInterned(loaded_union.field_types.get(ip)[field_index]);5784 const field_ty: Type = .fromInterned(loaded_union.field_types.get(ip)[field_index]);
5785 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu))5785 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu))
5786 return if (loaded_union.hasTag(ip) and !container_ty.unionHasAllZeroBitFieldTypes(zcu))5786 return if (loaded_union.hasTag(ip) and !container_ty.unionHasAllZeroBitFieldTypes(zcu))
5787 .{ .field = .{ .identifier = "payload" } }5787 .{ .field = .{ .identifier = "payload" } }
...@@ -5850,7 +5850,7 @@ fn airFieldParentPtr(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -5850,7 +5850,7 @@ fn airFieldParentPtr(f: *Function, inst: Air.Inst.Index) !CValue {
5850 switch (fieldLocation(container_ptr_ty, field_ptr_ty, extra.field_index, pt)) {5850 switch (fieldLocation(container_ptr_ty, field_ptr_ty, extra.field_index, pt)) {
5851 .begin => try f.writeCValue(writer, field_ptr_val, .Initializer),5851 .begin => try f.writeCValue(writer, field_ptr_val, .Initializer),
5852 .field => |field| {5852 .field => |field| {
5853 const u8_ptr_ty = try pt.adjustPtrTypeChild(field_ptr_ty, Type.u8);5853 const u8_ptr_ty = try pt.adjustPtrTypeChild(field_ptr_ty, .u8);
58545854
5855 try writer.writeAll("((");5855 try writer.writeAll("((");
5856 try f.renderType(writer, u8_ptr_ty);5856 try f.renderType(writer, u8_ptr_ty);
...@@ -5863,14 +5863,14 @@ fn airFieldParentPtr(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -5863,14 +5863,14 @@ fn airFieldParentPtr(f: *Function, inst: Air.Inst.Index) !CValue {
5863 try writer.writeAll("))");5863 try writer.writeAll("))");
5864 },5864 },
5865 .byte_offset => |byte_offset| {5865 .byte_offset => |byte_offset| {
5866 const u8_ptr_ty = try pt.adjustPtrTypeChild(field_ptr_ty, Type.u8);5866 const u8_ptr_ty = try pt.adjustPtrTypeChild(field_ptr_ty, .u8);
58675867
5868 try writer.writeAll("((");5868 try writer.writeAll("((");
5869 try f.renderType(writer, u8_ptr_ty);5869 try f.renderType(writer, u8_ptr_ty);
5870 try writer.writeByte(')');5870 try writer.writeByte(')');
5871 try f.writeCValue(writer, field_ptr_val, .Other);5871 try f.writeCValue(writer, field_ptr_val, .Other);
5872 try writer.print(" - {})", .{5872 try writer.print(" - {})", .{
5873 try f.fmtIntLiteral(try pt.intValue(Type.usize, byte_offset)),5873 try f.fmtIntLiteral(try pt.intValue(.usize, byte_offset)),
5874 });5874 });
5875 },5875 },
5876 }5876 }
...@@ -5908,14 +5908,14 @@ fn fieldPtr(...@@ -5908,14 +5908,14 @@ fn fieldPtr(
5908 try f.writeCValueDerefMember(writer, container_ptr_val, field);5908 try f.writeCValueDerefMember(writer, container_ptr_val, field);
5909 },5909 },
5910 .byte_offset => |byte_offset| {5910 .byte_offset => |byte_offset| {
5911 const u8_ptr_ty = try pt.adjustPtrTypeChild(field_ptr_ty, Type.u8);5911 const u8_ptr_ty = try pt.adjustPtrTypeChild(field_ptr_ty, .u8);
59125912
5913 try writer.writeAll("((");5913 try writer.writeAll("((");
5914 try f.renderType(writer, u8_ptr_ty);5914 try f.renderType(writer, u8_ptr_ty);
5915 try writer.writeByte(')');5915 try writer.writeByte(')');
5916 try f.writeCValue(writer, container_ptr_val, .Other);5916 try f.writeCValue(writer, container_ptr_val, .Other);
5917 try writer.print(" + {})", .{5917 try writer.print(" + {})", .{
5918 try f.fmtIntLiteral(try pt.intValue(Type.usize, byte_offset)),5918 try f.fmtIntLiteral(try pt.intValue(.usize, byte_offset)),
5919 });5919 });
5920 },5920 },
5921 }5921 }
...@@ -6158,7 +6158,7 @@ fn airWrapOptional(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -6158,7 +6158,7 @@ fn airWrapOptional(f: *Function, inst: Air.Inst.Index) !CValue {
6158 const writer = f.object.writer();6158 const writer = f.object.writer();
6159 const local = try f.allocLocal(inst, inst_ty);6159 const local = try f.allocLocal(inst, inst_ty);
6160 {6160 {
6161 const a = try Assignment.start(f, writer, CType.bool);6161 const a = try Assignment.start(f, writer, .bool);
6162 try f.writeCValueMember(writer, local, .{ .identifier = "is_null" });6162 try f.writeCValueMember(writer, local, .{ .identifier = "is_null" });
6163 try a.assign(f, writer);6163 try a.assign(f, writer);
6164 try writer.writeAll("false");6164 try writer.writeAll("false");
...@@ -6322,12 +6322,12 @@ fn airIsErr(f: *Function, inst: Air.Inst.Index, is_ptr: bool, operator: []const...@@ -6322,12 +6322,12 @@ fn airIsErr(f: *Function, inst: Air.Inst.Index, is_ptr: bool, operator: []const
6322 const operand = try f.resolveInst(un_op);6322 const operand = try f.resolveInst(un_op);
6323 try reap(f, inst, &.{un_op});6323 try reap(f, inst, &.{un_op});
6324 const operand_ty = f.typeOf(un_op);6324 const operand_ty = f.typeOf(un_op);
6325 const local = try f.allocLocal(inst, Type.bool);6325 const local = try f.allocLocal(inst, .bool);
6326 const err_union_ty = if (is_ptr) operand_ty.childType(zcu) else operand_ty;6326 const err_union_ty = if (is_ptr) operand_ty.childType(zcu) else operand_ty;
6327 const payload_ty = err_union_ty.errorUnionPayload(zcu);6327 const payload_ty = err_union_ty.errorUnionPayload(zcu);
6328 const error_ty = err_union_ty.errorUnionSet(zcu);6328 const error_ty = err_union_ty.errorUnionSet(zcu);
63296329
6330 const a = try Assignment.start(f, writer, CType.bool);6330 const a = try Assignment.start(f, writer, .bool);
6331 try f.writeCValue(writer, local, .Other);6331 try f.writeCValue(writer, local, .Other);
6332 try a.assign(f, writer);6332 try a.assign(f, writer);
6333 const err_int_ty = try pt.errorIntType();6333 const err_int_ty = try pt.errorIntType();
...@@ -6385,17 +6385,17 @@ fn airArrayToSlice(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -6385,17 +6385,17 @@ fn airArrayToSlice(f: *Function, inst: Air.Inst.Index) !CValue {
6385 if (operand_child_ctype.info(ctype_pool) == .array) {6385 if (operand_child_ctype.info(ctype_pool) == .array) {
6386 try writer.writeByte('&');6386 try writer.writeByte('&');
6387 try f.writeCValueDeref(writer, operand);6387 try f.writeCValueDeref(writer, operand);
6388 try writer.print("[{}]", .{try f.fmtIntLiteral(try pt.intValue(Type.usize, 0))});6388 try writer.print("[{}]", .{try f.fmtIntLiteral(try pt.intValue(.usize, 0))});
6389 } else try f.writeCValue(writer, operand, .Initializer);6389 } else try f.writeCValue(writer, operand, .Initializer);
6390 }6390 }
6391 try a.end(f, writer);6391 try a.end(f, writer);
6392 }6392 }
6393 {6393 {
6394 const a = try Assignment.start(f, writer, CType.usize);6394 const a = try Assignment.start(f, writer, .usize);
6395 try f.writeCValueMember(writer, local, .{ .identifier = "len" });6395 try f.writeCValueMember(writer, local, .{ .identifier = "len" });
6396 try a.assign(f, writer);6396 try a.assign(f, writer);
6397 try writer.print("{}", .{6397 try writer.print("{}", .{
6398 try f.fmtIntLiteral(try pt.intValue(Type.usize, array_ty.arrayLen(zcu))),6398 try f.fmtIntLiteral(try pt.intValue(.usize, array_ty.arrayLen(zcu))),
6399 });6399 });
6400 try a.end(f, writer);6400 try a.end(f, writer);
6401 }6401 }
...@@ -6627,7 +6627,7 @@ fn airCmpBuiltinCall(...@@ -6627,7 +6627,7 @@ fn airCmpBuiltinCall(
6627 try writer.writeByte(')');6627 try writer.writeByte(')');
6628 if (!ref_ret) try writer.print("{s}{}", .{6628 if (!ref_ret) try writer.print("{s}{}", .{
6629 compareOperatorC(operator),6629 compareOperatorC(operator),
6630 try f.fmtIntLiteral(try pt.intValue(Type.i32, 0)),6630 try f.fmtIntLiteral(try pt.intValue(.i32, 0)),
6631 });6631 });
6632 try writer.writeAll(";\n");6632 try writer.writeAll(";\n");
6633 try v.end(f, inst, writer);6633 try v.end(f, inst, writer);
...@@ -6707,7 +6707,7 @@ fn airCmpxchg(f: *Function, inst: Air.Inst.Index, flavor: [*:0]const u8) !CValue...@@ -6707,7 +6707,7 @@ fn airCmpxchg(f: *Function, inst: Air.Inst.Index, flavor: [*:0]const u8) !CValue
6707 try a.end(f, writer);6707 try a.end(f, writer);
6708 }6708 }
6709 {6709 {
6710 const a = try Assignment.start(f, writer, CType.bool);6710 const a = try Assignment.start(f, writer, .bool);
6711 try f.writeCValueMember(writer, local, .{ .identifier = "is_null" });6711 try f.writeCValueMember(writer, local, .{ .identifier = "is_null" });
6712 try a.assign(f, writer);6712 try a.assign(f, writer);
6713 try writer.print("zig_cmpxchg_{s}((zig_atomic(", .{flavor});6713 try writer.print("zig_cmpxchg_{s}((zig_atomic(", .{flavor});
...@@ -6935,12 +6935,12 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {...@@ -6935,12 +6935,12 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {
6935 },6935 },
6936 });6936 });
69376937
6938 const index = try f.allocLocal(inst, Type.usize);6938 const index = try f.allocLocal(inst, .usize);
69396939
6940 try writer.writeAll("for (");6940 try writer.writeAll("for (");
6941 try f.writeCValue(writer, index, .Other);6941 try f.writeCValue(writer, index, .Other);
6942 try writer.writeAll(" = ");6942 try writer.writeAll(" = ");
6943 try f.object.dg.renderValue(writer, try pt.intValue(Type.usize, 0), .Initializer);6943 try f.object.dg.renderValue(writer, try pt.intValue(.usize, 0), .Initializer);
6944 try writer.writeAll("; ");6944 try writer.writeAll("; ");
6945 try f.writeCValue(writer, index, .Other);6945 try f.writeCValue(writer, index, .Other);
6946 try writer.writeAll(" != ");6946 try writer.writeAll(" != ");
...@@ -6976,7 +6976,7 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {...@@ -6976,7 +6976,7 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue {
6976 return .none;6976 return .none;
6977 }6977 }
69786978
6979 const bitcasted = try bitcast(f, Type.u8, value, elem_ty);6979 const bitcasted = try bitcast(f, .u8, value, elem_ty);
69806980
6981 try writer.writeAll("memset(");6981 try writer.writeAll("memset(");
6982 switch (dest_ty.ptrSize(zcu)) {6982 switch (dest_ty.ptrSize(zcu)) {
...@@ -7038,7 +7038,7 @@ fn writeArrayLen(f: *Function, writer: ArrayListWriter, dest_ptr: CValue, dest_t...@@ -7038,7 +7038,7 @@ fn writeArrayLen(f: *Function, writer: ArrayListWriter, dest_ptr: CValue, dest_t
7038 const zcu = pt.zcu;7038 const zcu = pt.zcu;
7039 switch (dest_ty.ptrSize(zcu)) {7039 switch (dest_ty.ptrSize(zcu)) {
7040 .one => try writer.print("{}", .{7040 .one => try writer.print("{}", .{
7041 try f.fmtIntLiteral(try pt.intValue(Type.usize, dest_ty.childType(zcu).arrayLen(zcu))),7041 try f.fmtIntLiteral(try pt.intValue(.usize, dest_ty.childType(zcu).arrayLen(zcu))),
7042 }),7042 }),
7043 .many, .c => unreachable,7043 .many, .c => unreachable,
7044 .slice => try f.writeCValueMember(writer, dest_ptr, .{ .identifier = "len" }),7044 .slice => try f.writeCValueMember(writer, dest_ptr, .{ .identifier = "len" }),
...@@ -7200,11 +7200,11 @@ fn airShuffle(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -7200,11 +7200,11 @@ fn airShuffle(f: *Function, inst: Air.Inst.Index) !CValue {
7200 for (0..extra.mask_len) |index| {7200 for (0..extra.mask_len) |index| {
7201 try f.writeCValue(writer, local, .Other);7201 try f.writeCValue(writer, local, .Other);
7202 try writer.writeByte('[');7202 try writer.writeByte('[');
7203 try f.object.dg.renderValue(writer, try pt.intValue(Type.usize, index), .Other);7203 try f.object.dg.renderValue(writer, try pt.intValue(.usize, index), .Other);
7204 try writer.writeAll("] = ");7204 try writer.writeAll("] = ");
72057205
7206 const mask_elem = (try mask.elemValue(pt, index)).toSignedInt(zcu);7206 const mask_elem = (try mask.elemValue(pt, index)).toSignedInt(zcu);
7207 const src_val = try pt.intValue(Type.usize, @as(u64, @intCast(mask_elem ^ mask_elem >> 63)));7207 const src_val = try pt.intValue(.usize, @as(u64, @intCast(mask_elem ^ mask_elem >> 63)));
72087208
7209 try f.writeCValue(writer, if (mask_elem >= 0) lhs else rhs, .Other);7209 try f.writeCValue(writer, if (mask_elem >= 0) lhs else rhs, .Other);
7210 try writer.writeByte('[');7210 try writer.writeByte('[');
...@@ -7377,7 +7377,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -7377,7 +7377,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
7377 switch (ip.indexToKey(inst_ty.toIntern())) {7377 switch (ip.indexToKey(inst_ty.toIntern())) {
7378 inline .array_type, .vector_type => |info, tag| {7378 inline .array_type, .vector_type => |info, tag| {
7379 const a: Assignment = .{7379 const a: Assignment = .{
7380 .ctype = try f.ctypeFromType(Type.fromInterned(info.child), .complete),7380 .ctype = try f.ctypeFromType(.fromInterned(info.child), .complete),
7381 };7381 };
7382 for (resolved_elements, 0..) |element, i| {7382 for (resolved_elements, 0..) |element, i| {
7383 try a.restart(f, writer);7383 try a.restart(f, writer);
...@@ -7402,7 +7402,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -7402,7 +7402,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
7402 .auto, .@"extern" => {7402 .auto, .@"extern" => {
7403 var field_it = loaded_struct.iterateRuntimeOrder(ip);7403 var field_it = loaded_struct.iterateRuntimeOrder(ip);
7404 while (field_it.next()) |field_index| {7404 while (field_it.next()) |field_index| {
7405 const field_ty = Type.fromInterned(loaded_struct.field_types.get(ip)[field_index]);7405 const field_ty: Type = .fromInterned(loaded_struct.field_types.get(ip)[field_index]);
7406 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;7406 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
74077407
7408 const a = try Assignment.start(f, writer, try f.ctypeFromType(field_ty, .complete));7408 const a = try Assignment.start(f, writer, try f.ctypeFromType(field_ty, .complete));
...@@ -7466,8 +7466,8 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -7466,8 +7466,8 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
7466 if (field_ty.isPtrAtRuntime(zcu)) {7466 if (field_ty.isPtrAtRuntime(zcu)) {
7467 try writer.writeByte('(');7467 try writer.writeByte('(');
7468 try f.renderType(writer, switch (int_info.signedness) {7468 try f.renderType(writer, switch (int_info.signedness) {
7469 .unsigned => Type.usize,7469 .unsigned => .usize,
7470 .signed => Type.isize,7470 .signed => .isize,
7471 });7471 });
7472 try writer.writeByte(')');7472 try writer.writeByte(')');
7473 }7473 }
...@@ -7501,7 +7501,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -7501,7 +7501,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
7501 },7501 },
7502 .tuple_type => |tuple_info| for (0..tuple_info.types.len) |field_index| {7502 .tuple_type => |tuple_info| for (0..tuple_info.types.len) |field_index| {
7503 if (tuple_info.values.get(ip)[field_index] != .none) continue;7503 if (tuple_info.values.get(ip)[field_index] != .none) continue;
7504 const field_ty = Type.fromInterned(tuple_info.types.get(ip)[field_index]);7504 const field_ty: Type = .fromInterned(tuple_info.types.get(ip)[field_index]);
7505 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;7505 if (!field_ty.hasRuntimeBitsIgnoreComptime(zcu)) continue;
75067506
7507 const a = try Assignment.start(f, writer, try f.ctypeFromType(field_ty, .complete));7507 const a = try Assignment.start(f, writer, try f.ctypeFromType(field_ty, .complete));
...@@ -8141,13 +8141,13 @@ fn formatIntLiteral(...@@ -8141,13 +8141,13 @@ fn formatIntLiteral(
8141 } = switch (data.ctype.info(ctype_pool)) {8141 } = switch (data.ctype.info(ctype_pool)) {
8142 .basic => |basic_info| switch (basic_info) {8142 .basic => |basic_info| switch (basic_info) {
8143 else => .{8143 else => .{
8144 .ctype = CType.void,8144 .ctype = .void,
8145 .count = 1,8145 .count = 1,
8146 .endian = .little,8146 .endian = .little,
8147 .homogeneous = true,8147 .homogeneous = true,
8148 },8148 },
8149 .zig_u128, .zig_i128 => .{8149 .zig_u128, .zig_i128 => .{
8150 .ctype = CType.u64,8150 .ctype = .u64,
8151 .count = 2,8151 .count = 2,
8152 .endian = .big,8152 .endian = .big,
8153 .homogeneous = false,8153 .homogeneous = false,
...@@ -8253,7 +8253,7 @@ fn formatIntLiteral(...@@ -8253,7 +8253,7 @@ fn formatIntLiteral(
8253 .int_info = c_limb_int_info,8253 .int_info = c_limb_int_info,
8254 .kind = data.kind,8254 .kind = data.kind,
8255 .ctype = c_limb_ctype,8255 .ctype = c_limb_ctype,
8256 .val = try pt.intValue_big(Type.comptime_int, c_limb_mut.toConst()),8256 .val = try pt.intValue_big(.comptime_int, c_limb_mut.toConst()),
8257 }, fmt, options, writer);8257 }, fmt, options, writer);
8258 }8258 }
8259 }8259 }
...@@ -8330,15 +8330,15 @@ const Vectorize = struct {...@@ -8330,15 +8330,15 @@ const Vectorize = struct {
8330 const pt = f.object.dg.pt;8330 const pt = f.object.dg.pt;
8331 const zcu = pt.zcu;8331 const zcu = pt.zcu;
8332 return if (ty.zigTypeTag(zcu) == .vector) index: {8332 return if (ty.zigTypeTag(zcu) == .vector) index: {
8333 const local = try f.allocLocal(inst, Type.usize);8333 const local = try f.allocLocal(inst, .usize);
83348334
8335 try writer.writeAll("for (");8335 try writer.writeAll("for (");
8336 try f.writeCValue(writer, local, .Other);8336 try f.writeCValue(writer, local, .Other);
8337 try writer.print(" = {d}; ", .{try f.fmtIntLiteral(try pt.intValue(Type.usize, 0))});8337 try writer.print(" = {d}; ", .{try f.fmtIntLiteral(try pt.intValue(.usize, 0))});
8338 try f.writeCValue(writer, local, .Other);8338 try f.writeCValue(writer, local, .Other);
8339 try writer.print(" < {d}; ", .{try f.fmtIntLiteral(try pt.intValue(Type.usize, ty.vectorLen(zcu)))});8339 try writer.print(" < {d}; ", .{try f.fmtIntLiteral(try pt.intValue(.usize, ty.vectorLen(zcu)))});
8340 try f.writeCValue(writer, local, .Other);8340 try f.writeCValue(writer, local, .Other);
8341 try writer.print(" += {d}) {{\n", .{try f.fmtIntLiteral(try pt.intValue(Type.usize, 1))});8341 try writer.print(" += {d}) {{\n", .{try f.fmtIntLiteral(try pt.intValue(.usize, 1))});
8342 f.object.indent_writer.pushIndent();8342 f.object.indent_writer.pushIndent();
83438343
8344 break :index .{ .index = local };8344 break :index .{ .index = local };
src/codegen/c/Type.zig+388-56
...@@ -1289,26 +1289,26 @@ pub const Pool = struct {...@@ -1289,26 +1289,26 @@ pub const Pool = struct {
1289 kind: Kind,1289 kind: Kind,
1290 ) !CType {1290 ) !CType {
1291 switch (int_info.bits) {1291 switch (int_info.bits) {
1292 0 => return CType.void,1292 0 => return .void,
1293 1...8 => switch (int_info.signedness) {1293 1...8 => switch (int_info.signedness) {
1294 .signed => return CType.i8,1294 .signed => return .i8,
1295 .unsigned => return CType.u8,1295 .unsigned => return .u8,
1296 },1296 },
1297 9...16 => switch (int_info.signedness) {1297 9...16 => switch (int_info.signedness) {
1298 .signed => return CType.i16,1298 .signed => return .i16,
1299 .unsigned => return CType.u16,1299 .unsigned => return .u16,
1300 },1300 },
1301 17...32 => switch (int_info.signedness) {1301 17...32 => switch (int_info.signedness) {
1302 .signed => return CType.i32,1302 .signed => return .i32,
1303 .unsigned => return CType.u32,1303 .unsigned => return .u32,
1304 },1304 },
1305 33...64 => switch (int_info.signedness) {1305 33...64 => switch (int_info.signedness) {
1306 .signed => return CType.i64,1306 .signed => return .i64,
1307 .unsigned => return CType.u64,1307 .unsigned => return .u64,
1308 },1308 },
1309 65...128 => switch (int_info.signedness) {1309 65...128 => switch (int_info.signedness) {
1310 .signed => return CType.i128,1310 .signed => return .i128,
1311 .unsigned => return CType.u128,1311 .unsigned => return .u128,
1312 },1312 },
1313 else => {1313 else => {
1314 const target = &mod.resolved_target.result;1314 const target = &mod.resolved_target.result;
...@@ -1357,19 +1357,19 @@ pub const Pool = struct {...@@ -1357,19 +1357,19 @@ pub const Pool = struct {
1357 .null_type,1357 .null_type,
1358 .undefined_type,1358 .undefined_type,
1359 .enum_literal_type,1359 .enum_literal_type,
1360 => return CType.void,1360 => return .void,
1361 .u1_type, .u8_type => return CType.u8,1361 .u1_type, .u8_type => return .u8,
1362 .i8_type => return CType.i8,1362 .i8_type => return .i8,
1363 .u16_type => return CType.u16,1363 .u16_type => return .u16,
1364 .i16_type => return CType.i16,1364 .i16_type => return .i16,
1365 .u29_type, .u32_type => return CType.u32,1365 .u29_type, .u32_type => return .u32,
1366 .i32_type => return CType.i32,1366 .i32_type => return .i32,
1367 .u64_type => return CType.u64,1367 .u64_type => return .u64,
1368 .i64_type => return CType.i64,1368 .i64_type => return .i64,
1369 .u80_type, .u128_type => return CType.u128,1369 .u80_type, .u128_type => return .u128,
1370 .i128_type => return CType.i128,1370 .i128_type => return .i128,
1371 .usize_type => return CType.usize,1371 .usize_type => return .usize,
1372 .isize_type => return CType.isize,1372 .isize_type => return .isize,
1373 .c_char_type => return .{ .index = .char },1373 .c_char_type => return .{ .index = .char },
1374 .c_short_type => return .{ .index = .short },1374 .c_short_type => return .{ .index = .short },
1375 .c_ushort_type => return .{ .index = .@"unsigned short" },1375 .c_ushort_type => return .{ .index = .@"unsigned short" },
...@@ -1380,12 +1380,12 @@ pub const Pool = struct {...@@ -1380,12 +1380,12 @@ pub const Pool = struct {
1380 .c_longlong_type => return .{ .index = .@"long long" },1380 .c_longlong_type => return .{ .index = .@"long long" },
1381 .c_ulonglong_type => return .{ .index = .@"unsigned long long" },1381 .c_ulonglong_type => return .{ .index = .@"unsigned long long" },
1382 .c_longdouble_type => return .{ .index = .@"long double" },1382 .c_longdouble_type => return .{ .index = .@"long double" },
1383 .f16_type => return CType.f16,1383 .f16_type => return .f16,
1384 .f32_type => return CType.f32,1384 .f32_type => return .f32,
1385 .f64_type => return CType.f64,1385 .f64_type => return .f64,
1386 .f80_type => return CType.f80,1386 .f80_type => return .f80,
1387 .f128_type => return CType.f128,1387 .f128_type => return .f128,
1388 .bool_type, .optional_noreturn_type => return CType.bool,1388 .bool_type, .optional_noreturn_type => return .bool,
1389 .noreturn_type,1389 .noreturn_type,
1390 .anyframe_type,1390 .anyframe_type,
1391 .generic_poison_type,1391 .generic_poison_type,
...@@ -1397,19 +1397,20 @@ pub const Pool = struct {...@@ -1397,19 +1397,20 @@ pub const Pool = struct {
1397 .signedness = .unsigned,1397 .signedness = .unsigned,
1398 .bits = pt.zcu.errorSetBits(),1398 .bits = pt.zcu.errorSetBits(),
1399 }, mod, kind),1399 }, mod, kind),
1400
1400 .manyptr_u8_type,1401 .manyptr_u8_type,
1401 => return pool.getPointer(allocator, .{1402 => return pool.getPointer(allocator, .{
1402 .elem_ctype = CType.u8,1403 .elem_ctype = .u8,
1403 }),1404 }),
1404 .manyptr_const_u8_type,1405 .manyptr_const_u8_type,
1405 .manyptr_const_u8_sentinel_0_type,1406 .manyptr_const_u8_sentinel_0_type,
1406 => return pool.getPointer(allocator, .{1407 => return pool.getPointer(allocator, .{
1407 .elem_ctype = CType.u8,1408 .elem_ctype = .u8,
1408 .@"const" = true,1409 .@"const" = true,
1409 }),1410 }),
1410 .single_const_pointer_to_comptime_int_type,1411 .single_const_pointer_to_comptime_int_type,
1411 => return pool.getPointer(allocator, .{1412 => return pool.getPointer(allocator, .{
1412 .elem_ctype = CType.void,1413 .elem_ctype = .void,
1413 .@"const" = true,1414 .@"const" = true,
1414 }),1415 }),
1415 .slice_const_u8_type,1416 .slice_const_u8_type,
...@@ -1420,14 +1421,14 @@ pub const Pool = struct {...@@ -1420,14 +1421,14 @@ pub const Pool = struct {
1420 .{1421 .{
1421 .name = .{ .index = .ptr },1422 .name = .{ .index = .ptr },
1422 .ctype = try pool.getPointer(allocator, .{1423 .ctype = try pool.getPointer(allocator, .{
1423 .elem_ctype = CType.u8,1424 .elem_ctype = .u8,
1424 .@"const" = true,1425 .@"const" = true,
1425 }),1426 }),
1426 .alignas = AlignAs.fromAbiAlignment(Type.ptrAbiAlignment(target.*)),1427 .alignas = AlignAs.fromAbiAlignment(Type.ptrAbiAlignment(target.*)),
1427 },1428 },
1428 .{1429 .{
1429 .name = .{ .index = .len },1430 .name = .{ .index = .len },
1430 .ctype = CType.usize,1431 .ctype = .usize,
1431 .alignas = AlignAs.fromAbiAlignment(1432 .alignas = AlignAs.fromAbiAlignment(
1432 Type.intAbiAlignment(target.ptrBitWidth(), target.*),1433 Type.intAbiAlignment(target.ptrBitWidth(), target.*),
1433 ),1434 ),
...@@ -1436,6 +1437,337 @@ pub const Pool = struct {...@@ -1436,6 +1437,337 @@ pub const Pool = struct {
1436 return pool.fromFields(allocator, .@"struct", &fields, kind);1437 return pool.fromFields(allocator, .@"struct", &fields, kind);
1437 },1438 },
14381439
1440 .vector_16_i8_type => {
1441 const vector_ctype = try pool.getVector(allocator, .{
1442 .elem_ctype = .i8,
1443 .len = 16,
1444 });
1445 if (!kind.isParameter()) return vector_ctype;
1446 var fields = [_]Info.Field{
1447 .{
1448 .name = .{ .index = .array },
1449 .ctype = vector_ctype,
1450 .alignas = AlignAs.fromAbiAlignment(Type.i8.abiAlignment(zcu)),
1451 },
1452 };
1453 return pool.fromFields(allocator, .@"struct", &fields, kind);
1454 },
1455 .vector_32_i8_type => {
1456 const vector_ctype = try pool.getVector(allocator, .{
1457 .elem_ctype = .i8,
1458 .len = 32,
1459 });
1460 if (!kind.isParameter()) return vector_ctype;
1461 var fields = [_]Info.Field{
1462 .{
1463 .name = .{ .index = .array },
1464 .ctype = vector_ctype,
1465 .alignas = AlignAs.fromAbiAlignment(Type.i8.abiAlignment(zcu)),
1466 },
1467 };
1468 return pool.fromFields(allocator, .@"struct", &fields, kind);
1469 },
1470 .vector_16_u8_type => {
1471 const vector_ctype = try pool.getVector(allocator, .{
1472 .elem_ctype = .u8,
1473 .len = 16,
1474 });
1475 if (!kind.isParameter()) return vector_ctype;
1476 var fields = [_]Info.Field{
1477 .{
1478 .name = .{ .index = .array },
1479 .ctype = vector_ctype,
1480 .alignas = AlignAs.fromAbiAlignment(Type.u8.abiAlignment(zcu)),
1481 },
1482 };
1483 return pool.fromFields(allocator, .@"struct", &fields, kind);
1484 },
1485 .vector_32_u8_type => {
1486 const vector_ctype = try pool.getVector(allocator, .{
1487 .elem_ctype = .u8,
1488 .len = 32,
1489 });
1490 if (!kind.isParameter()) return vector_ctype;
1491 var fields = [_]Info.Field{
1492 .{
1493 .name = .{ .index = .array },
1494 .ctype = vector_ctype,
1495 .alignas = AlignAs.fromAbiAlignment(Type.u8.abiAlignment(zcu)),
1496 },
1497 };
1498 return pool.fromFields(allocator, .@"struct", &fields, kind);
1499 },
1500 .vector_8_i16_type => {
1501 const vector_ctype = try pool.getVector(allocator, .{
1502 .elem_ctype = .i16,
1503 .len = 8,
1504 });
1505 if (!kind.isParameter()) return vector_ctype;
1506 var fields = [_]Info.Field{
1507 .{
1508 .name = .{ .index = .array },
1509 .ctype = vector_ctype,
1510 .alignas = AlignAs.fromAbiAlignment(Type.i16.abiAlignment(zcu)),
1511 },
1512 };
1513 return pool.fromFields(allocator, .@"struct", &fields, kind);
1514 },
1515 .vector_16_i16_type => {
1516 const vector_ctype = try pool.getVector(allocator, .{
1517 .elem_ctype = .i16,
1518 .len = 16,
1519 });
1520 if (!kind.isParameter()) return vector_ctype;
1521 var fields = [_]Info.Field{
1522 .{
1523 .name = .{ .index = .array },
1524 .ctype = vector_ctype,
1525 .alignas = AlignAs.fromAbiAlignment(Type.i16.abiAlignment(zcu)),
1526 },
1527 };
1528 return pool.fromFields(allocator, .@"struct", &fields, kind);
1529 },
1530 .vector_8_u16_type => {
1531 const vector_ctype = try pool.getVector(allocator, .{
1532 .elem_ctype = .u16,
1533 .len = 8,
1534 });
1535 if (!kind.isParameter()) return vector_ctype;
1536 var fields = [_]Info.Field{
1537 .{
1538 .name = .{ .index = .array },
1539 .ctype = vector_ctype,
1540 .alignas = AlignAs.fromAbiAlignment(Type.u16.abiAlignment(zcu)),
1541 },
1542 };
1543 return pool.fromFields(allocator, .@"struct", &fields, kind);
1544 },
1545 .vector_16_u16_type => {
1546 const vector_ctype = try pool.getVector(allocator, .{
1547 .elem_ctype = .u16,
1548 .len = 16,
1549 });
1550 if (!kind.isParameter()) return vector_ctype;
1551 var fields = [_]Info.Field{
1552 .{
1553 .name = .{ .index = .array },
1554 .ctype = vector_ctype,
1555 .alignas = AlignAs.fromAbiAlignment(Type.u16.abiAlignment(zcu)),
1556 },
1557 };
1558 return pool.fromFields(allocator, .@"struct", &fields, kind);
1559 },
1560 .vector_4_i32_type => {
1561 const vector_ctype = try pool.getVector(allocator, .{
1562 .elem_ctype = .i32,
1563 .len = 4,
1564 });
1565 if (!kind.isParameter()) return vector_ctype;
1566 var fields = [_]Info.Field{
1567 .{
1568 .name = .{ .index = .array },
1569 .ctype = vector_ctype,
1570 .alignas = AlignAs.fromAbiAlignment(Type.i32.abiAlignment(zcu)),
1571 },
1572 };
1573 return pool.fromFields(allocator, .@"struct", &fields, kind);
1574 },
1575 .vector_8_i32_type => {
1576 const vector_ctype = try pool.getVector(allocator, .{
1577 .elem_ctype = .i32,
1578 .len = 8,
1579 });
1580 if (!kind.isParameter()) return vector_ctype;
1581 var fields = [_]Info.Field{
1582 .{
1583 .name = .{ .index = .array },
1584 .ctype = vector_ctype,
1585 .alignas = AlignAs.fromAbiAlignment(Type.i32.abiAlignment(zcu)),
1586 },
1587 };
1588 return pool.fromFields(allocator, .@"struct", &fields, kind);
1589 },
1590 .vector_4_u32_type => {
1591 const vector_ctype = try pool.getVector(allocator, .{
1592 .elem_ctype = .u32,
1593 .len = 4,
1594 });
1595 if (!kind.isParameter()) return vector_ctype;
1596 var fields = [_]Info.Field{
1597 .{
1598 .name = .{ .index = .array },
1599 .ctype = vector_ctype,
1600 .alignas = AlignAs.fromAbiAlignment(Type.u32.abiAlignment(zcu)),
1601 },
1602 };
1603 return pool.fromFields(allocator, .@"struct", &fields, kind);
1604 },
1605 .vector_8_u32_type => {
1606 const vector_ctype = try pool.getVector(allocator, .{
1607 .elem_ctype = .u32,
1608 .len = 8,
1609 });
1610 if (!kind.isParameter()) return vector_ctype;
1611 var fields = [_]Info.Field{
1612 .{
1613 .name = .{ .index = .array },
1614 .ctype = vector_ctype,
1615 .alignas = AlignAs.fromAbiAlignment(Type.u32.abiAlignment(zcu)),
1616 },
1617 };
1618 return pool.fromFields(allocator, .@"struct", &fields, kind);
1619 },
1620 .vector_2_i64_type => {
1621 const vector_ctype = try pool.getVector(allocator, .{
1622 .elem_ctype = .i64,
1623 .len = 2,
1624 });
1625 if (!kind.isParameter()) return vector_ctype;
1626 var fields = [_]Info.Field{
1627 .{
1628 .name = .{ .index = .array },
1629 .ctype = vector_ctype,
1630 .alignas = AlignAs.fromAbiAlignment(Type.i64.abiAlignment(zcu)),
1631 },
1632 };
1633 return pool.fromFields(allocator, .@"struct", &fields, kind);
1634 },
1635 .vector_4_i64_type => {
1636 const vector_ctype = try pool.getVector(allocator, .{
1637 .elem_ctype = .i64,
1638 .len = 4,
1639 });
1640 if (!kind.isParameter()) return vector_ctype;
1641 var fields = [_]Info.Field{
1642 .{
1643 .name = .{ .index = .array },
1644 .ctype = vector_ctype,
1645 .alignas = AlignAs.fromAbiAlignment(Type.i64.abiAlignment(zcu)),
1646 },
1647 };
1648 return pool.fromFields(allocator, .@"struct", &fields, kind);
1649 },
1650 .vector_2_u64_type => {
1651 const vector_ctype = try pool.getVector(allocator, .{
1652 .elem_ctype = .u64,
1653 .len = 2,
1654 });
1655 if (!kind.isParameter()) return vector_ctype;
1656 var fields = [_]Info.Field{
1657 .{
1658 .name = .{ .index = .array },
1659 .ctype = vector_ctype,
1660 .alignas = AlignAs.fromAbiAlignment(Type.u64.abiAlignment(zcu)),
1661 },
1662 };
1663 return pool.fromFields(allocator, .@"struct", &fields, kind);
1664 },
1665 .vector_4_u64_type => {
1666 const vector_ctype = try pool.getVector(allocator, .{
1667 .elem_ctype = .u64,
1668 .len = 4,
1669 });
1670 if (!kind.isParameter()) return vector_ctype;
1671 var fields = [_]Info.Field{
1672 .{
1673 .name = .{ .index = .array },
1674 .ctype = vector_ctype,
1675 .alignas = AlignAs.fromAbiAlignment(Type.u64.abiAlignment(zcu)),
1676 },
1677 };
1678 return pool.fromFields(allocator, .@"struct", &fields, kind);
1679 },
1680 .vector_4_f16_type => {
1681 const vector_ctype = try pool.getVector(allocator, .{
1682 .elem_ctype = .f16,
1683 .len = 4,
1684 });
1685 if (!kind.isParameter()) return vector_ctype;
1686 var fields = [_]Info.Field{
1687 .{
1688 .name = .{ .index = .array },
1689 .ctype = vector_ctype,
1690 .alignas = AlignAs.fromAbiAlignment(Type.f16.abiAlignment(zcu)),
1691 },
1692 };
1693 return pool.fromFields(allocator, .@"struct", &fields, kind);
1694 },
1695 .vector_8_f16_type => {
1696 const vector_ctype = try pool.getVector(allocator, .{
1697 .elem_ctype = .f16,
1698 .len = 8,
1699 });
1700 if (!kind.isParameter()) return vector_ctype;
1701 var fields = [_]Info.Field{
1702 .{
1703 .name = .{ .index = .array },
1704 .ctype = vector_ctype,
1705 .alignas = AlignAs.fromAbiAlignment(Type.f16.abiAlignment(zcu)),
1706 },
1707 };
1708 return pool.fromFields(allocator, .@"struct", &fields, kind);
1709 },
1710 .vector_4_f32_type => {
1711 const vector_ctype = try pool.getVector(allocator, .{
1712 .elem_ctype = .f32,
1713 .len = 4,
1714 });
1715 if (!kind.isParameter()) return vector_ctype;
1716 var fields = [_]Info.Field{
1717 .{
1718 .name = .{ .index = .array },
1719 .ctype = vector_ctype,
1720 .alignas = AlignAs.fromAbiAlignment(Type.f32.abiAlignment(zcu)),
1721 },
1722 };
1723 return pool.fromFields(allocator, .@"struct", &fields, kind);
1724 },
1725 .vector_8_f32_type => {
1726 const vector_ctype = try pool.getVector(allocator, .{
1727 .elem_ctype = .f32,
1728 .len = 8,
1729 });
1730 if (!kind.isParameter()) return vector_ctype;
1731 var fields = [_]Info.Field{
1732 .{
1733 .name = .{ .index = .array },
1734 .ctype = vector_ctype,
1735 .alignas = AlignAs.fromAbiAlignment(Type.f32.abiAlignment(zcu)),
1736 },
1737 };
1738 return pool.fromFields(allocator, .@"struct", &fields, kind);
1739 },
1740 .vector_2_f64_type => {
1741 const vector_ctype = try pool.getVector(allocator, .{
1742 .elem_ctype = .f64,
1743 .len = 2,
1744 });
1745 if (!kind.isParameter()) return vector_ctype;
1746 var fields = [_]Info.Field{
1747 .{
1748 .name = .{ .index = .array },
1749 .ctype = vector_ctype,
1750 .alignas = AlignAs.fromAbiAlignment(Type.f64.abiAlignment(zcu)),
1751 },
1752 };
1753 return pool.fromFields(allocator, .@"struct", &fields, kind);
1754 },
1755 .vector_4_f64_type => {
1756 const vector_ctype = try pool.getVector(allocator, .{
1757 .elem_ctype = .f64,
1758 .len = 4,
1759 });
1760 if (!kind.isParameter()) return vector_ctype;
1761 var fields = [_]Info.Field{
1762 .{
1763 .name = .{ .index = .array },
1764 .ctype = vector_ctype,
1765 .alignas = AlignAs.fromAbiAlignment(Type.f64.abiAlignment(zcu)),
1766 },
1767 };
1768 return pool.fromFields(allocator, .@"struct", &fields, kind);
1769 },
1770
1439 .undef,1771 .undef,
1440 .zero,1772 .zero,
1441 .zero_usize,1773 .zero_usize,
...@@ -1521,7 +1853,7 @@ pub const Pool = struct {...@@ -1521,7 +1853,7 @@ pub const Pool = struct {
1521 },1853 },
1522 .{1854 .{
1523 .name = .{ .index = .len },1855 .name = .{ .index = .len },
1524 .ctype = CType.usize,1856 .ctype = .usize,
1525 .alignas = AlignAs.fromAbiAlignment(1857 .alignas = AlignAs.fromAbiAlignment(
1526 Type.intAbiAlignment(target.ptrBitWidth(), target.*),1858 Type.intAbiAlignment(target.ptrBitWidth(), target.*),
1527 ),1859 ),
...@@ -1532,7 +1864,7 @@ pub const Pool = struct {...@@ -1532,7 +1864,7 @@ pub const Pool = struct {
1532 },1864 },
1533 .array_type => |array_info| {1865 .array_type => |array_info| {
1534 const len = array_info.lenIncludingSentinel();1866 const len = array_info.lenIncludingSentinel();
1535 if (len == 0) return CType.void;1867 if (len == 0) return .void;
1536 const elem_type = Type.fromInterned(array_info.child);1868 const elem_type = Type.fromInterned(array_info.child);
1537 const elem_ctype = try pool.fromType(1869 const elem_ctype = try pool.fromType(
1538 allocator,1870 allocator,
...@@ -1542,7 +1874,7 @@ pub const Pool = struct {...@@ -1542,7 +1874,7 @@ pub const Pool = struct {
1542 mod,1874 mod,
1543 kind.noParameter(),1875 kind.noParameter(),
1544 );1876 );
1545 if (elem_ctype.index == .void) return CType.void;1877 if (elem_ctype.index == .void) return .void;
1546 const array_ctype = try pool.getArray(allocator, .{1878 const array_ctype = try pool.getArray(allocator, .{
1547 .elem_ctype = elem_ctype,1879 .elem_ctype = elem_ctype,
1548 .len = len,1880 .len = len,
...@@ -1558,7 +1890,7 @@ pub const Pool = struct {...@@ -1558,7 +1890,7 @@ pub const Pool = struct {
1558 return pool.fromFields(allocator, .@"struct", &fields, kind);1890 return pool.fromFields(allocator, .@"struct", &fields, kind);
1559 },1891 },
1560 .vector_type => |vector_info| {1892 .vector_type => |vector_info| {
1561 if (vector_info.len == 0) return CType.void;1893 if (vector_info.len == 0) return .void;
1562 const elem_type = Type.fromInterned(vector_info.child);1894 const elem_type = Type.fromInterned(vector_info.child);
1563 const elem_ctype = try pool.fromType(1895 const elem_ctype = try pool.fromType(
1564 allocator,1896 allocator,
...@@ -1568,7 +1900,7 @@ pub const Pool = struct {...@@ -1568,7 +1900,7 @@ pub const Pool = struct {
1568 mod,1900 mod,
1569 kind.noParameter(),1901 kind.noParameter(),
1570 );1902 );
1571 if (elem_ctype.index == .void) return CType.void;1903 if (elem_ctype.index == .void) return .void;
1572 const vector_ctype = try pool.getVector(allocator, .{1904 const vector_ctype = try pool.getVector(allocator, .{
1573 .elem_ctype = elem_ctype,1905 .elem_ctype = elem_ctype,
1574 .len = vector_info.len,1906 .len = vector_info.len,
...@@ -1584,7 +1916,7 @@ pub const Pool = struct {...@@ -1584,7 +1916,7 @@ pub const Pool = struct {
1584 return pool.fromFields(allocator, .@"struct", &fields, kind);1916 return pool.fromFields(allocator, .@"struct", &fields, kind);
1585 },1917 },
1586 .opt_type => |payload_type| {1918 .opt_type => |payload_type| {
1587 if (ip.isNoReturn(payload_type)) return CType.void;1919 if (ip.isNoReturn(payload_type)) return .void;
1588 const payload_ctype = try pool.fromType(1920 const payload_ctype = try pool.fromType(
1589 allocator,1921 allocator,
1590 scratch,1922 scratch,
...@@ -1593,7 +1925,7 @@ pub const Pool = struct {...@@ -1593,7 +1925,7 @@ pub const Pool = struct {
1593 mod,1925 mod,
1594 kind.noParameter(),1926 kind.noParameter(),
1595 );1927 );
1596 if (payload_ctype.index == .void) return CType.bool;1928 if (payload_ctype.index == .void) return .bool;
1597 switch (payload_type) {1929 switch (payload_type) {
1598 .anyerror_type => return payload_ctype,1930 .anyerror_type => return payload_ctype,
1599 else => switch (ip.indexToKey(payload_type)) {1931 else => switch (ip.indexToKey(payload_type)) {
...@@ -1606,7 +1938,7 @@ pub const Pool = struct {...@@ -1606,7 +1938,7 @@ pub const Pool = struct {
1606 var fields = [_]Info.Field{1938 var fields = [_]Info.Field{
1607 .{1939 .{
1608 .name = .{ .index = .is_null },1940 .name = .{ .index = .is_null },
1609 .ctype = CType.bool,1941 .ctype = .bool,
1610 .alignas = AlignAs.fromAbiAlignment(.@"1"),1942 .alignas = AlignAs.fromAbiAlignment(.@"1"),
1611 },1943 },
1612 .{1944 .{
...@@ -1666,7 +1998,7 @@ pub const Pool = struct {...@@ -1666,7 +1998,7 @@ pub const Pool = struct {
1666 if (kind.isForward()) return if (ty.hasRuntimeBitsIgnoreComptime(zcu))1998 if (kind.isForward()) return if (ty.hasRuntimeBitsIgnoreComptime(zcu))
1667 fwd_decl1999 fwd_decl
1668 else2000 else
1669 CType.void;2001 .void;
1670 const scratch_top = scratch.items.len;2002 const scratch_top = scratch.items.len;
1671 defer scratch.shrinkRetainingCapacity(scratch_top);2003 defer scratch.shrinkRetainingCapacity(scratch_top);
1672 try scratch.ensureUnusedCapacity(2004 try scratch.ensureUnusedCapacity(
...@@ -1710,7 +2042,7 @@ pub const Pool = struct {...@@ -1710,7 +2042,7 @@ pub const Pool = struct {
1710 scratch.items.len - scratch_top,2042 scratch.items.len - scratch_top,
1711 @typeInfo(Field).@"struct".fields.len,2043 @typeInfo(Field).@"struct".fields.len,
1712 ));2044 ));
1713 if (fields_len == 0) return CType.void;2045 if (fields_len == 0) return .void;
1714 try pool.ensureUnusedCapacity(allocator, 1);2046 try pool.ensureUnusedCapacity(allocator, 1);
1715 const extra_index = try pool.addHashedExtra(allocator, &hasher, Aggregate, .{2047 const extra_index = try pool.addHashedExtra(allocator, &hasher, Aggregate, .{
1716 .fwd_decl = fwd_decl.index,2048 .fwd_decl = fwd_decl.index,
...@@ -1762,7 +2094,7 @@ pub const Pool = struct {...@@ -1762,7 +2094,7 @@ pub const Pool = struct {
1762 scratch.items.len - scratch_top,2094 scratch.items.len - scratch_top,
1763 @typeInfo(Field).@"struct".fields.len,2095 @typeInfo(Field).@"struct".fields.len,
1764 ));2096 ));
1765 if (fields_len == 0) return CType.void;2097 if (fields_len == 0) return .void;
1766 if (kind.isForward()) {2098 if (kind.isForward()) {
1767 try pool.ensureUnusedCapacity(allocator, 1);2099 try pool.ensureUnusedCapacity(allocator, 1);
1768 const extra_index = try pool.addHashedExtra(2100 const extra_index = try pool.addHashedExtra(
...@@ -1801,7 +2133,7 @@ pub const Pool = struct {...@@ -1801,7 +2133,7 @@ pub const Pool = struct {
1801 if (kind.isForward()) return if (ty.hasRuntimeBitsIgnoreComptime(zcu))2133 if (kind.isForward()) return if (ty.hasRuntimeBitsIgnoreComptime(zcu))
1802 fwd_decl2134 fwd_decl
1803 else2135 else
1804 CType.void;2136 .void;
1805 const loaded_tag = loaded_union.loadTagType(ip);2137 const loaded_tag = loaded_union.loadTagType(ip);
1806 const scratch_top = scratch.items.len;2138 const scratch_top = scratch.items.len;
1807 defer scratch.shrinkRetainingCapacity(scratch_top);2139 defer scratch.shrinkRetainingCapacity(scratch_top);
...@@ -1848,7 +2180,7 @@ pub const Pool = struct {...@@ -1848,7 +2180,7 @@ pub const Pool = struct {
1848 @typeInfo(Field).@"struct".fields.len,2180 @typeInfo(Field).@"struct".fields.len,
1849 ));2181 ));
1850 if (!has_tag) {2182 if (!has_tag) {
1851 if (fields_len == 0) return CType.void;2183 if (fields_len == 0) return .void;
1852 try pool.ensureUnusedCapacity(allocator, 1);2184 try pool.ensureUnusedCapacity(allocator, 1);
1853 const extra_index = try pool.addHashedExtra(2185 const extra_index = try pool.addHashedExtra(
1854 allocator,2186 allocator,
...@@ -1915,7 +2247,7 @@ pub const Pool = struct {...@@ -1915,7 +2247,7 @@ pub const Pool = struct {
1915 struct_fields_len += 1;2247 struct_fields_len += 1;
1916 }2248 }
1917 }2249 }
1918 if (struct_fields_len == 0) return CType.void;2250 if (struct_fields_len == 0) return .void;
1919 sortFields(struct_fields[0..struct_fields_len]);2251 sortFields(struct_fields[0..struct_fields_len]);
1920 return pool.getAggregate(allocator, .{2252 return pool.getAggregate(allocator, .{
1921 .tag = .@"struct",2253 .tag = .@"struct",
...@@ -1929,7 +2261,7 @@ pub const Pool = struct {...@@ -1929,7 +2261,7 @@ pub const Pool = struct {
1929 }, mod, kind),2261 }, mod, kind),
1930 }2262 }
1931 },2263 },
1932 .opaque_type => return CType.void,2264 .opaque_type => return .void,
1933 .enum_type => return pool.fromType(2265 .enum_type => return pool.fromType(
1934 allocator,2266 allocator,
1935 scratch,2267 scratch,
...@@ -1938,7 +2270,7 @@ pub const Pool = struct {...@@ -1938,7 +2270,7 @@ pub const Pool = struct {
1938 mod,2270 mod,
1939 kind,2271 kind,
1940 ),2272 ),
1941 .func_type => |func_info| if (func_info.is_generic) return CType.void else {2273 .func_type => |func_info| if (func_info.is_generic) return .void else {
1942 const scratch_top = scratch.items.len;2274 const scratch_top = scratch.items.len;
1943 defer scratch.shrinkRetainingCapacity(scratch_top);2275 defer scratch.shrinkRetainingCapacity(scratch_top);
1944 try scratch.ensureUnusedCapacity(allocator, func_info.param_types.len);2276 try scratch.ensureUnusedCapacity(allocator, func_info.param_types.len);
...@@ -1952,7 +2284,7 @@ pub const Pool = struct {...@@ -1952,7 +2284,7 @@ pub const Pool = struct {
1952 pt,2284 pt,
1953 mod,2285 mod,
1954 kind.asParameter(),2286 kind.asParameter(),
1955 ) else CType.void;2287 ) else .void;
1956 for (0..func_info.param_types.len) |param_index| {2288 for (0..func_info.param_types.len) |param_index| {
1957 const param_type = Type.fromInterned(2289 const param_type = Type.fromInterned(
1958 func_info.param_types.get(ip)[param_index],2290 func_info.param_types.get(ip)[param_index],
...@@ -2033,7 +2365,7 @@ pub const Pool = struct {...@@ -2033,7 +2365,7 @@ pub const Pool = struct {
2033 pub fn eql(map_adapter: @This(), _: CType, _: void, pool_index: usize) bool {2365 pub fn eql(map_adapter: @This(), _: CType, _: void, pool_index: usize) bool {
2034 return map_adapter.source_info.eqlAdapted(2366 return map_adapter.source_info.eqlAdapted(
2035 map_adapter.source_pool,2367 map_adapter.source_pool,
2036 CType.fromPoolIndex(pool_index),2368 .fromPoolIndex(pool_index),
2037 map_adapter.pool,2369 map_adapter.pool,
2038 map_adapter.pool_adapter,2370 map_adapter.pool_adapter,
2039 );2371 );
...@@ -2047,7 +2379,7 @@ pub const Pool = struct {...@@ -2047,7 +2379,7 @@ pub const Pool = struct {
2047 .pool_adapter = pool_adapter,2379 .pool_adapter = pool_adapter,
2048 });2380 });
2049 errdefer _ = pool.map.pop();2381 errdefer _ = pool.map.pop();
2050 const ctype = CType.fromPoolIndex(gop.index);2382 const ctype: CType = .fromPoolIndex(gop.index);
2051 if (!gop.found_existing) switch (source_info) {2383 if (!gop.found_existing) switch (source_info) {
2052 .basic => unreachable,2384 .basic => unreachable,
2053 .pointer => |pointer_info| pool.items.appendAssumeCapacity(.{2385 .pointer => |pointer_info| pool.items.appendAssumeCapacity(.{
...@@ -2232,7 +2564,7 @@ pub const Pool = struct {...@@ -2232,7 +2564,7 @@ pub const Pool = struct {
2232 CTypeAdapter{ .pool = pool },2564 CTypeAdapter{ .pool = pool },
2233 );2565 );
2234 if (!gop.found_existing) pool.items.appendAssumeCapacity(.{ .tag = tag, .data = data });2566 if (!gop.found_existing) pool.items.appendAssumeCapacity(.{ .tag = tag, .data = data });
2235 return CType.fromPoolIndex(gop.index);2567 return .fromPoolIndex(gop.index);
2236 }2568 }
22372569
2238 fn tagExtra(2570 fn tagExtra(
...@@ -2290,7 +2622,7 @@ pub const Pool = struct {...@@ -2290,7 +2622,7 @@ pub const Pool = struct {
2290 pool.extra.shrinkRetainingCapacity(extra_index)2622 pool.extra.shrinkRetainingCapacity(extra_index)
2291 else2623 else
2292 pool.items.appendAssumeCapacity(.{ .tag = tag, .data = extra_index });2624 pool.items.appendAssumeCapacity(.{ .tag = tag, .data = extra_index });
2293 return CType.fromPoolIndex(gop.index);2625 return .fromPoolIndex(gop.index);
2294 }2626 }
22952627
2296 fn sortFields(fields: []Info.Field) void {2628 fn sortFields(fields: []Info.Field) void {
test/behavior/abs.zig+1-1
...@@ -335,12 +335,12 @@ fn testAbsUnsignedIntVectors(comptime len: comptime_int) !void {...@@ -335,12 +335,12 @@ fn testAbsUnsignedIntVectors(comptime len: comptime_int) !void {
335335
336test "@abs float vectors" {336test "@abs float vectors" {
337 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO337 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
338 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
339 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO338 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
340 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO339 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
341 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO340 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
342 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;341 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
343 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;342 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
343 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
344344
345 // https://github.com/ziglang/zig/issues/12827345 // https://github.com/ziglang/zig/issues/12827
346 if (builtin.zig_backend == .stage2_llvm and346 if (builtin.zig_backend == .stage2_llvm and
test/behavior/floatop.zig+1
...@@ -1654,6 +1654,7 @@ test "runtime isNan(inf * 0)" {...@@ -1654,6 +1654,7 @@ test "runtime isNan(inf * 0)" {
1654}1654}
16551655
1656test "optimized float mode" {1656test "optimized float mode" {
1657 if (builtin.zig_backend != .stage2_llvm) return error.SkipZigTest;
1657 if (builtin.mode == .Debug) return error.SkipZigTest;1658 if (builtin.mode == .Debug) return error.SkipZigTest;
16581659
1659 const big = 0x1p40;1660 const big = 0x1p40;
test/behavior/maximum_minimum.zig+3-5
...@@ -33,8 +33,7 @@ test "@max on vectors" {...@@ -33,8 +33,7 @@ test "@max on vectors" {
33 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO33 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
34 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO34 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
35 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;35 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
36 if (builtin.zig_backend == .stage2_x86_64 and36 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
37 !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest;
3837
39 const S = struct {38 const S = struct {
40 fn doTheTest() !void {39 fn doTheTest() !void {
...@@ -89,8 +88,7 @@ test "@min for vectors" {...@@ -89,8 +88,7 @@ test "@min for vectors" {
89 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO88 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
90 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO89 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
91 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;90 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
92 if (builtin.zig_backend == .stage2_x86_64 and91 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
93 !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest;
9492
95 const S = struct {93 const S = struct {
96 fn doTheTest() !void {94 fn doTheTest() !void {
...@@ -304,7 +302,7 @@ test "@min/@max notices bounds from vector types when element of comptime-known...@@ -304,7 +302,7 @@ test "@min/@max notices bounds from vector types when element of comptime-known
304 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO302 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
305 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;303 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
306 if (builtin.zig_backend == .stage2_x86_64 and304 if (builtin.zig_backend == .stage2_x86_64 and
307 !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .avx)) return error.SkipZigTest;305 !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest;
308306
309 var x: @Vector(2, u32) = .{ 1_000_000, 12345 };307 var x: @Vector(2, u32) = .{ 1_000_000, 12345 };
310 _ = &x;308 _ = &x;
test/behavior/x86_64/build.zig+1
...@@ -32,6 +32,7 @@ pub fn build(b: *std.Build) void {...@@ -32,6 +32,7 @@ pub fn build(b: *std.Build) void {
32 .cpu_features_sub = std.Target.x86.featureSet(&.{32 .cpu_features_sub = std.Target.x86.featureSet(&.{
33 .cmov,33 .cmov,
34 //.sse,34 //.sse,
35 .sse2,
35 }),36 }),
36 },37 },
37 //.{38 //.{
test/behavior/x86_64/math.zig+576-37
...@@ -1,11 +1,11 @@...@@ -1,11 +1,11 @@
1const builtin = @import("builtin");1const builtin = @import("builtin");
2const inf = math.inf;2const inf = math.inf;
3const math = std.math;3const math = std.math;
4const max = math.floatMax;4const fmax = math.floatMax;
5const min = math.floatMin;5const fmin = math.floatMin;
6const nan = math.nan;6const nan = math.nan;
7const std = @import("std");7const std = @import("std");
8const trueMin = math.floatTrueMin;8const tmin = math.floatTrueMin;
99
10const Gpr = switch (builtin.cpu.arch) {10const Gpr = switch (builtin.cpu.arch) {
11 else => unreachable,11 else => unreachable,
...@@ -17,15 +17,34 @@ const Sse = if (std.Target.x86.featureSetHas(builtin.cpu.features, .avx))...@@ -17,15 +17,34 @@ const Sse = if (std.Target.x86.featureSetHas(builtin.cpu.features, .avx))
17else17else
18 @Vector(16, u8);18 @Vector(16, u8);
1919
20inline fn sign(rhs: anytype) bool {20inline fn sign(rhs: anytype) switch (@typeInfo(@TypeOf(rhs))) {
21 return @call(.always_inline, math.signbit, .{rhs});21 else => bool,
22 .vector => |vector| @Vector(vector.len, bool),
23} {
24 switch (@typeInfo(@TypeOf(rhs))) {
25 else => {
26 const I = @Type(.{ .int = .{
27 .signedness = .unsigned,
28 .bits = @bitSizeOf(@TypeOf(rhs)),
29 } });
30 return @as(I, @bitCast(rhs)) & @as(I, 1) << (@bitSizeOf(I) - 1) != 0;
31 },
32 .vector => |vector| {
33 const I = @Type(.{ .int = .{
34 .signedness = .unsigned,
35 .bits = @bitSizeOf(vector.child),
36 } });
37 const V = @Vector(vector.len, I);
38 return @as(V, @bitCast(rhs)) & @as(V, @splat(@as(I, 1) << (@bitSizeOf(I) - 1))) != @as(V, @splat(0));
39 },
40 }
22}41}
23inline fn boolAnd(lhs: anytype, rhs: @TypeOf(lhs)) @TypeOf(lhs) {42inline fn boolAnd(lhs: anytype, rhs: @TypeOf(lhs)) @TypeOf(lhs) {
24 switch (@typeInfo(@TypeOf(lhs))) {43 switch (@typeInfo(@TypeOf(lhs))) {
25 .bool => return lhs and rhs,44 .bool => return lhs and rhs,
26 .vector => |vector| switch (vector.child) {45 .vector => |vector| switch (vector.child) {
27 bool => {46 bool => {
28 const Bits = @Vector(vector.len, u1);47 const Bits = @Type(.{ .int = .{ .signedness = .unsigned, .bits = vector.len } });
29 const lhs_bits: Bits = @bitCast(lhs);48 const lhs_bits: Bits = @bitCast(lhs);
30 const rhs_bits: Bits = @bitCast(rhs);49 const rhs_bits: Bits = @bitCast(rhs);
31 return @bitCast(lhs_bits & rhs_bits);50 return @bitCast(lhs_bits & rhs_bits);
...@@ -41,7 +60,7 @@ inline fn boolOr(lhs: anytype, rhs: @TypeOf(lhs)) @TypeOf(lhs) {...@@ -41,7 +60,7 @@ inline fn boolOr(lhs: anytype, rhs: @TypeOf(lhs)) @TypeOf(lhs) {
41 .bool => return lhs or rhs,60 .bool => return lhs or rhs,
42 .vector => |vector| switch (vector.child) {61 .vector => |vector| switch (vector.child) {
43 bool => {62 bool => {
44 const Bits = @Vector(vector.len, u1);63 const Bits = @Type(.{ .int = .{ .signedness = .unsigned, .bits = vector.len } });
45 const lhs_bits: Bits = @bitCast(lhs);64 const lhs_bits: Bits = @bitCast(lhs);
46 const rhs_bits: Bits = @bitCast(rhs);65 const rhs_bits: Bits = @bitCast(rhs);
47 return @bitCast(lhs_bits | rhs_bits);66 return @bitCast(lhs_bits | rhs_bits);
...@@ -69,12 +88,40 @@ noinline fn checkExpected(expected: anytype, actual: @TypeOf(expected)) !void {...@@ -69,12 +88,40 @@ noinline fn checkExpected(expected: anytype, actual: @TypeOf(expected)) !void {
69 }) return error.Unexpected;88 }) return error.Unexpected;
70}89}
71test checkExpected {90test checkExpected {
91 if (checkExpected(nan(f16), nan(f16)) == error.Unexpected) return error.Unexpected;
92 if (checkExpected(nan(f16), -nan(f16)) != error.Unexpected) return error.Unexpected;
93 if (checkExpected(@as(f16, 0.0), @as(f16, 0.0)) == error.Unexpected) return error.Unexpected;
94 if (checkExpected(@as(f16, -0.0), @as(f16, -0.0)) == error.Unexpected) return error.Unexpected;
95 if (checkExpected(@as(f16, -0.0), @as(f16, 0.0)) != error.Unexpected) return error.Unexpected;
96 if (checkExpected(@as(f16, 0.0), @as(f16, -0.0)) != error.Unexpected) return error.Unexpected;
97
72 if (checkExpected(nan(f32), nan(f32)) == error.Unexpected) return error.Unexpected;98 if (checkExpected(nan(f32), nan(f32)) == error.Unexpected) return error.Unexpected;
73 if (checkExpected(nan(f32), -nan(f32)) != error.Unexpected) return error.Unexpected;99 if (checkExpected(nan(f32), -nan(f32)) != error.Unexpected) return error.Unexpected;
74 if (checkExpected(@as(f32, 0.0), @as(f32, 0.0)) == error.Unexpected) return error.Unexpected;100 if (checkExpected(@as(f32, 0.0), @as(f32, 0.0)) == error.Unexpected) return error.Unexpected;
75 if (checkExpected(@as(f32, -0.0), @as(f32, -0.0)) == error.Unexpected) return error.Unexpected;101 if (checkExpected(@as(f32, -0.0), @as(f32, -0.0)) == error.Unexpected) return error.Unexpected;
76 if (checkExpected(@as(f32, -0.0), @as(f32, 0.0)) != error.Unexpected) return error.Unexpected;102 if (checkExpected(@as(f32, -0.0), @as(f32, 0.0)) != error.Unexpected) return error.Unexpected;
77 if (checkExpected(@as(f32, 0.0), @as(f32, -0.0)) != error.Unexpected) return error.Unexpected;103 if (checkExpected(@as(f32, 0.0), @as(f32, -0.0)) != error.Unexpected) return error.Unexpected;
104
105 if (checkExpected(nan(f64), nan(f64)) == error.Unexpected) return error.Unexpected;
106 if (checkExpected(nan(f64), -nan(f64)) != error.Unexpected) return error.Unexpected;
107 if (checkExpected(@as(f64, 0.0), @as(f64, 0.0)) == error.Unexpected) return error.Unexpected;
108 if (checkExpected(@as(f64, -0.0), @as(f64, -0.0)) == error.Unexpected) return error.Unexpected;
109 if (checkExpected(@as(f64, -0.0), @as(f64, 0.0)) != error.Unexpected) return error.Unexpected;
110 if (checkExpected(@as(f64, 0.0), @as(f64, -0.0)) != error.Unexpected) return error.Unexpected;
111
112 if (checkExpected(nan(f80), nan(f80)) == error.Unexpected) return error.Unexpected;
113 if (checkExpected(nan(f80), -nan(f80)) != error.Unexpected) return error.Unexpected;
114 if (checkExpected(@as(f80, 0.0), @as(f80, 0.0)) == error.Unexpected) return error.Unexpected;
115 if (checkExpected(@as(f80, -0.0), @as(f80, -0.0)) == error.Unexpected) return error.Unexpected;
116 if (checkExpected(@as(f80, -0.0), @as(f80, 0.0)) != error.Unexpected) return error.Unexpected;
117 if (checkExpected(@as(f80, 0.0), @as(f80, -0.0)) != error.Unexpected) return error.Unexpected;
118
119 if (checkExpected(nan(f128), nan(f128)) == error.Unexpected) return error.Unexpected;
120 if (checkExpected(nan(f128), -nan(f128)) != error.Unexpected) return error.Unexpected;
121 if (checkExpected(@as(f128, 0.0), @as(f128, 0.0)) == error.Unexpected) return error.Unexpected;
122 if (checkExpected(@as(f128, -0.0), @as(f128, -0.0)) == error.Unexpected) return error.Unexpected;
123 if (checkExpected(@as(f128, -0.0), @as(f128, 0.0)) != error.Unexpected) return error.Unexpected;
124 if (checkExpected(@as(f128, 0.0), @as(f128, -0.0)) != error.Unexpected) return error.Unexpected;
78}125}
79126
80fn Unary(comptime op: anytype) type {127fn Unary(comptime op: anytype) type {
...@@ -498,96 +545,96 @@ fn Unary(comptime op: anytype) type {...@@ -498,96 +545,96 @@ fn Unary(comptime op: anytype) type {
498 fn testFloatTypes() !void {545 fn testFloatTypes() !void {
499 try testArgs(f16, -nan(f16));546 try testArgs(f16, -nan(f16));
500 try testArgs(f16, -inf(f16));547 try testArgs(f16, -inf(f16));
501 try testArgs(f16, -max(f16));548 try testArgs(f16, -fmax(f16));
502 try testArgs(f16, -10.0);549 try testArgs(f16, -10.0);
503 try testArgs(f16, -1.0);550 try testArgs(f16, -1.0);
504 try testArgs(f16, -0.1);551 try testArgs(f16, -0.1);
505 try testArgs(f16, -min(f16));552 try testArgs(f16, -fmin(f16));
506 try testArgs(f16, -trueMin(f16));553 try testArgs(f16, -tmin(f16));
507 try testArgs(f16, -0.0);554 try testArgs(f16, -0.0);
508 try testArgs(f16, 0.0);555 try testArgs(f16, 0.0);
509 try testArgs(f16, trueMin(f16));556 try testArgs(f16, tmin(f16));
510 try testArgs(f16, min(f16));557 try testArgs(f16, fmin(f16));
511 try testArgs(f16, 0.1);558 try testArgs(f16, 0.1);
512 try testArgs(f16, 1.0);559 try testArgs(f16, 1.0);
513 try testArgs(f16, 10.0);560 try testArgs(f16, 10.0);
514 try testArgs(f16, max(f16));561 try testArgs(f16, fmax(f16));
515 try testArgs(f16, inf(f16));562 try testArgs(f16, inf(f16));
516 try testArgs(f16, nan(f16));563 try testArgs(f16, nan(f16));
517564
518 try testArgs(f32, -nan(f32));565 try testArgs(f32, -nan(f32));
519 try testArgs(f32, -inf(f32));566 try testArgs(f32, -inf(f32));
520 try testArgs(f32, -max(f32));567 try testArgs(f32, -fmax(f32));
521 try testArgs(f32, -10.0);568 try testArgs(f32, -10.0);
522 try testArgs(f32, -1.0);569 try testArgs(f32, -1.0);
523 try testArgs(f32, -0.1);570 try testArgs(f32, -0.1);
524 try testArgs(f32, -min(f32));571 try testArgs(f32, -fmin(f32));
525 try testArgs(f32, -trueMin(f32));572 try testArgs(f32, -tmin(f32));
526 try testArgs(f32, -0.0);573 try testArgs(f32, -0.0);
527 try testArgs(f32, 0.0);574 try testArgs(f32, 0.0);
528 try testArgs(f32, trueMin(f32));575 try testArgs(f32, tmin(f32));
529 try testArgs(f32, min(f32));576 try testArgs(f32, fmin(f32));
530 try testArgs(f32, 0.1);577 try testArgs(f32, 0.1);
531 try testArgs(f32, 1.0);578 try testArgs(f32, 1.0);
532 try testArgs(f32, 10.0);579 try testArgs(f32, 10.0);
533 try testArgs(f32, max(f32));580 try testArgs(f32, fmax(f32));
534 try testArgs(f32, inf(f32));581 try testArgs(f32, inf(f32));
535 try testArgs(f32, nan(f32));582 try testArgs(f32, nan(f32));
536583
537 try testArgs(f64, -nan(f64));584 try testArgs(f64, -nan(f64));
538 try testArgs(f64, -inf(f64));585 try testArgs(f64, -inf(f64));
539 try testArgs(f64, -max(f64));586 try testArgs(f64, -fmax(f64));
540 try testArgs(f64, -10.0);587 try testArgs(f64, -10.0);
541 try testArgs(f64, -1.0);588 try testArgs(f64, -1.0);
542 try testArgs(f64, -0.1);589 try testArgs(f64, -0.1);
543 try testArgs(f64, -min(f64));590 try testArgs(f64, -fmin(f64));
544 try testArgs(f64, -trueMin(f64));591 try testArgs(f64, -tmin(f64));
545 try testArgs(f64, -0.0);592 try testArgs(f64, -0.0);
546 try testArgs(f64, 0.0);593 try testArgs(f64, 0.0);
547 try testArgs(f64, trueMin(f64));594 try testArgs(f64, tmin(f64));
548 try testArgs(f64, min(f64));595 try testArgs(f64, fmin(f64));
549 try testArgs(f64, 0.1);596 try testArgs(f64, 0.1);
550 try testArgs(f64, 1.0);597 try testArgs(f64, 1.0);
551 try testArgs(f64, 10.0);598 try testArgs(f64, 10.0);
552 try testArgs(f64, max(f64));599 try testArgs(f64, fmax(f64));
553 try testArgs(f64, inf(f64));600 try testArgs(f64, inf(f64));
554 try testArgs(f64, nan(f64));601 try testArgs(f64, nan(f64));
555602
556 try testArgs(f80, -nan(f80));603 try testArgs(f80, -nan(f80));
557 try testArgs(f80, -inf(f80));604 try testArgs(f80, -inf(f80));
558 try testArgs(f80, -max(f80));605 try testArgs(f80, -fmax(f80));
559 try testArgs(f80, -10.0);606 try testArgs(f80, -10.0);
560 try testArgs(f80, -1.0);607 try testArgs(f80, -1.0);
561 try testArgs(f80, -0.1);608 try testArgs(f80, -0.1);
562 try testArgs(f80, -min(f80));609 try testArgs(f80, -fmin(f80));
563 try testArgs(f80, -trueMin(f80));610 try testArgs(f80, -tmin(f80));
564 try testArgs(f80, -0.0);611 try testArgs(f80, -0.0);
565 try testArgs(f80, 0.0);612 try testArgs(f80, 0.0);
566 try testArgs(f80, trueMin(f80));613 try testArgs(f80, tmin(f80));
567 try testArgs(f80, min(f80));614 try testArgs(f80, fmin(f80));
568 try testArgs(f80, 0.1);615 try testArgs(f80, 0.1);
569 try testArgs(f80, 1.0);616 try testArgs(f80, 1.0);
570 try testArgs(f80, 10.0);617 try testArgs(f80, 10.0);
571 try testArgs(f80, max(f80));618 try testArgs(f80, fmax(f80));
572 try testArgs(f80, inf(f80));619 try testArgs(f80, inf(f80));
573 try testArgs(f80, nan(f80));620 try testArgs(f80, nan(f80));
574621
575 try testArgs(f128, -nan(f128));622 try testArgs(f128, -nan(f128));
576 try testArgs(f128, -inf(f128));623 try testArgs(f128, -inf(f128));
577 try testArgs(f128, -max(f128));624 try testArgs(f128, -fmax(f128));
578 try testArgs(f128, -10.0);625 try testArgs(f128, -10.0);
579 try testArgs(f128, -1.0);626 try testArgs(f128, -1.0);
580 try testArgs(f128, -0.1);627 try testArgs(f128, -0.1);
581 try testArgs(f128, -min(f128));628 try testArgs(f128, -fmin(f128));
582 try testArgs(f128, -trueMin(f128));629 try testArgs(f128, -tmin(f128));
583 try testArgs(f128, -0.0);630 try testArgs(f128, -0.0);
584 try testArgs(f128, 0.0);631 try testArgs(f128, 0.0);
585 try testArgs(f128, trueMin(f128));632 try testArgs(f128, tmin(f128));
586 try testArgs(f128, min(f128));633 try testArgs(f128, fmin(f128));
587 try testArgs(f128, 0.1);634 try testArgs(f128, 0.1);
588 try testArgs(f128, 1.0);635 try testArgs(f128, 1.0);
589 try testArgs(f128, 10.0);636 try testArgs(f128, 10.0);
590 try testArgs(f128, max(f128));637 try testArgs(f128, fmax(f128));
591 try testArgs(f128, inf(f128));638 try testArgs(f128, inf(f128));
592 try testArgs(f128, nan(f128));639 try testArgs(f128, nan(f128));
593 }640 }
...@@ -1136,6 +1183,145 @@ fn Unary(comptime op: anytype) type {...@@ -1136,6 +1183,145 @@ fn Unary(comptime op: anytype) type {
1136 try testArgs(@Vector(3, i1025), .{ -1 << 1024, -1, 0 });1183 try testArgs(@Vector(3, i1025), .{ -1 << 1024, -1, 0 });
1137 try testArgs(@Vector(3, u1025), .{ 0, 1, 1 << 1024 });1184 try testArgs(@Vector(3, u1025), .{ 0, 1, 1 << 1024 });
1138 }1185 }
1186 fn testFloatVectorTypes() !void {
1187 try testArgs(@Vector(1, f16), .{
1188 -0x1.17cp-12,
1189 });
1190 try testArgs(@Vector(2, f16), .{
1191 0x1.47cp9, 0x1.3acp9,
1192 });
1193 try testArgs(@Vector(4, f16), .{
1194 0x1.ab4p0, -0x1.7fcp-7, -0x1.1cp0, -0x1.f14p12,
1195 });
1196 try testArgs(@Vector(8, f16), .{
1197 -0x1.8d8p8, 0x1.83p10, -0x1.5ap-1, -0x1.d78p13, -0x1.608p12, 0x1.e8p-9, -0x1.688p-10, -0x1.738p9,
1198 });
1199 try testArgs(@Vector(16, f16), .{
1200 0x1.da8p-1, -0x1.ed4p-10, -0x1.dc8p1, 0x1.b78p-14, nan(f16), 0x1.9d8p8, nan(f16), 0x1.d5p13,
1201 -0x1.2dp13, 0x1.6c4p12, 0x1.a9cp-11, -0x1.0ecp8, 0x0.4ccp-14, -0x1.0a8p-6, -0x1.5bcp-14, 0x1.6d8p-9,
1202 });
1203 try testArgs(@Vector(32, f16), .{
1204 0x1.d5cp-6, -0x1.a98p5, 0x1.49cp5, -0x1.e4p-1, -0x1.21p-13, -0x1.c94p-1, -0x1.adcp-5, -0x1.524p-1,
1205 -0x1.0d8p-3, -0x1.5c4p-2, 0x1.f84p-2, 0x1.664p1, -0x1.f64p13, -0x1.bf4p4, -0x1.4b8p0, -0x0.f64p-14,
1206 -0x1.3f8p1, 0x1.098p2, -0x1.a44p8, 0x1.048p13, 0x1.fd4p-11, 0x1.18p-9, -0x1.504p2, 0x1.d04p7,
1207 -nan(f16), 0x1.a94p2, 0x0.5e8p-14, -0x1.7acp-7, 0x1.4c8p-3, 0x1.518p-4, nan(f16), 0x1.8f8p10,
1208 });
1209 try testArgs(@Vector(64, f16), .{
1210 -0x1.c2p2, 0x0.2fcp-14, 0x1.de8p0, -0x1.714p2, 0x1.f9p-7, -0x1.11cp-13, -0x1.558p10, -0x1.2acp-7,
1211 0x1.348p14, 0x1.2dcp7, -0x1.8acp-12, -0x1.2cp2, 0x1.868p1, -0x1.1f8p-14, 0x1.638p7, -0x1.734p-5,
1212 0x0.b98p-14, -0x1.7f4p-12, -0x1.38cp15, 0x1.50cp15, 0x1.91cp8, 0x1.cb4p-1, 0x1.fc4p-13, 0x1.9a4p0,
1213 0x1.18p-4, 0x1.60cp10, 0x1.6fp-12, 0x1.b48p6, 0x1.37cp-11, 0x1.424p7, 0x1.44cp13, 0x1.aep5,
1214 0x1.968p14, 0x1.e8p13, -0x1.bp2, -0x1.644p5, 0x1.de4p-8, -0x1.5b4p-14, -0x1.4ap1, -0x1.868p9,
1215 -0x1.d14p0, 0x1.d7cp15, 0x1.3c8p14, 0x1.2ccp-14, -0x1.ee4p8, 0x1.49p-3, 0x1.35cp12, 0x1.d34p6,
1216 0x1.7acp3, -0x1.fa4p2, 0x1.7b4p13, -0x1.cf4p-12, -0x1.ebcp-10, -0x1.5p-3, 0x1.4bp-6, 0x1.83p12,
1217 -0x1.f9cp-8, -0x1.43p-8, -0x1.99p-1, -0x1.dacp3, -0x1.728p-4, -0x1.03cp4, 0x1.604p-2, -0x1.0ep13,
1218 });
1219
1220 try testArgs(@Vector(1, f32), .{
1221 -0x1.17cp-12,
1222 });
1223 try testArgs(@Vector(2, f32), .{
1224 -0x1.a3123ap90, -0x1.4a2ec6p-54,
1225 });
1226 try testArgs(@Vector(4, f32), .{
1227 -0x1.8a41p77, -0x1.7c54e2p-61, -0x1.498556p-41, 0x1.d77c22p-20,
1228 });
1229 try testArgs(@Vector(8, f32), .{
1230 0x1.943da4p-86, 0x1.528792p95, -0x1.9c9bfap-26, -0x1.8df936p-90,
1231 -0x1.6a70cep56, 0x1.626638p-48, 0x1.7bb2bap-57, -0x1.ac5104p94,
1232 });
1233 try testArgs(@Vector(16, f32), .{
1234 0x1.157044p115, -0x1.416c04p-111, 0x1.a8f164p-104, 0x1.9b6678p84,
1235 -0x1.9d065cp9, -0x1.e8c4b4p126, -0x1.ddb968p84, -0x1.fec8c8p74,
1236 0x1.64ffb2p59, 0x1.548922p20, 0x1.7270fcp22, -0x1.abac68p33,
1237 0x1.faabfp33, -0x1.8aee82p55, 0x1.1bf8fp75, 0x1.33c46ap-66,
1238 });
1239 try testArgs(@Vector(32, f32), .{
1240 -0x1.039b68p37, -0x1.34de4ap-74, -0x1.05d78ap-76, -0x1.be0f5ap-47,
1241 0x1.032204p-38, 0x1.ef8e2ap-78, -0x1.b013ecp-80, 0x1.71fe4cp99,
1242 0x1.abdadap-14, 0x1.56a9a8p-48, -0x1.8bbd7ep9, 0x1.edd308p-72,
1243 -0x1.92fafcp-121, -0x1.50812p19, 0x1.f4ddc4p28, -0x1.6f0b12p-50,
1244 -0x1.12ab02p127, 0x1.24df48p21, -0x1.993c3p-14, -0x1.4cc476p-112,
1245 0x1.13d9a8p-40, 0x1.a6e652p-9, -0x1.9c730cp-21, -0x1.a75aaap-70,
1246 -0x1.39e632p-111, 0x1.8e8da8p-45, 0x1.b5652cp31, 0x1.258366p44,
1247 0x1.d473aap92, -0x1.951b64p9, 0x1.542edp15, -0x0.f6222ap-126,
1248 });
1249
1250 try testArgs(@Vector(1, f64), .{
1251 -0x1.0114613df6f97p816,
1252 });
1253 try testArgs(@Vector(2, f64), .{
1254 -0x1.8404dad72003cp720, -0x1.6b14b40bcf3b7p-176,
1255 });
1256 try testArgs(@Vector(4, f64), .{
1257 -0x1.04e1acbfddd9cp681, -0x1.ed553cc056da7p-749,
1258 0x1.3d3f703a0c893p-905, 0x1.0b35633fa78fp691,
1259 });
1260 try testArgs(@Vector(8, f64), .{
1261 -0x1.901a2a60f0562p-301, -0x1.2516175ad61ecp-447,
1262 0x1.e7b12124846bfp564, 0x1.9291384bd7259p209,
1263 -0x1.a7bf62f803c98p900, 0x1.4e2e26257bb3p987,
1264 -0x1.413ca9a32d894p811, 0x1.61b1dd9432e95p479,
1265 });
1266 try testArgs(@Vector(16, f64), .{
1267 -0x1.8fc7286d95f54p-235, -0x1.796a7ea8372b6p-837,
1268 -0x1.8c0f930539acbp-98, -0x1.ec80dfbf0b931p-430,
1269 -0x1.e3d80c640652fp-1019, 0x1.8241238fb542fp161,
1270 -0x1.e1f1a79d50263p137, -0x1.9ac5cb2771c28p-791,
1271 0x1.4d8f00fe881e7p-401, -0x1.87fbd7bfd99d7p346,
1272 -0x1.a8a7cc575335ep1017, 0x1.37bb88dc3fd8bp-355,
1273 0x1.9d53d346c0e65p929, -0x1.bbae3d0229c34p289,
1274 -0x1.cb8ef994d5ce5p25, 0x1.ba20af512616ap50,
1275 });
1276
1277 try testArgs(@Vector(1, f80), .{
1278 -0x1.a2e9410a7dfedabp-2324,
1279 });
1280 try testArgs(@Vector(2, f80), .{
1281 -0x1.a2e9410a7dfedabp-2324,
1282 0x1.2b17da3b9746885p-8665,
1283 });
1284 try testArgs(@Vector(4, f80), .{
1285 -0x1.c488fedb7ab646cep-13007,
1286 0x1.e914deaccaa50016p2073,
1287 -0x1.d1c7ae8ec3c9df86p10642,
1288 -0x1.2da1658f337fa01p9893,
1289 });
1290 try testArgs(@Vector(8, f80), .{
1291 -0x1.bed8a74c43750656p890,
1292 -0x1.7bf57f38004ac976p8481,
1293 -0x1.9cdc10ac0657d328p7884,
1294 0x1.c86f61883da149fp12293,
1295 -0x1.528d6957df6bfdd8p14125,
1296 -0x1.5ebb4006d0243bfep14530,
1297 -0x1.94b9b18636d12402p-1845,
1298 -0x1.25439a6d68add188p5962,
1299 });
1300
1301 try testArgs(@Vector(1, f128), .{
1302 -0x1.d1e6fc3b1e66632e7b79051a47dap14300,
1303 });
1304 try testArgs(@Vector(2, f128), .{
1305 0x1.84b3ac8ffe5893b2c6af8d68de9dp-83,
1306 -0x1.438ca2c8a0d8e3ee9062d351c46ep-10235,
1307 });
1308 try testArgs(@Vector(4, f128), .{
1309 0x1.04eb03882d4fd1b090e714d3e5ep806,
1310 -0x1.4082b29f7c26e701764c915642ffp-6182,
1311 -0x1.b6f1e8565e5040415110f18b519ap13383,
1312 0x1.1c29f8c162cead9061c5797ea15ap11957,
1313 });
1314 try testArgs(@Vector(8, f128), .{
1315 -0x1.53d7f00cd204d80e5ff5bb665773p11218,
1316 -0x1.4daa1c81cffe28e8fa5cd703c287p2362,
1317 -0x1.cc6a71c3ad4560871efdbd025cd7p-8116,
1318 -0x1.87f8553cf8772fb6b78e7df3e3bap14523,
1319 -0x1.14b6880f6678f86dfb543dde1c6ep2105,
1320 0x1.9d2d4398414da9d857e76e8fd7ccp-13668,
1321 0x1.a37f07af240ded458d103c022064p-1158,
1322 0x1.425d53e6bd6070b847e5da1ed593p1394,
1323 });
1324 }
1139 };1325 };
1140}1326}
11411327
...@@ -1205,26 +1391,51 @@ fn Binary(comptime op: anytype) type {...@@ -1205,26 +1391,51 @@ fn Binary(comptime op: anytype) type {
1205 );1391 );
1206 }1392 }
1207 fn testIntTypes() !void {1393 fn testIntTypes() !void {
1394 try testArgs(i8, 0x48, 0x6c);
1208 try testArgs(u8, 0xbb, 0x43);1395 try testArgs(u8, 0xbb, 0x43);
1396 try testArgs(i16, -0x0fdf, 0x302e);
1209 try testArgs(u16, 0xb8bf, 0x626d);1397 try testArgs(u16, 0xb8bf, 0x626d);
1398 try testArgs(i32, -0x6280178f, 0x6802c034);
1210 try testArgs(u32, 0x80d7a2c6, 0xbff6a402);1399 try testArgs(u32, 0x80d7a2c6, 0xbff6a402);
1400 try testArgs(i64, 0x0365a53b8ee0c987, -0x1bb6d3013500a7d2);
1211 try testArgs(u64, 0x71138bc6b4a38898, 0x1bc4043de9438c7b);1401 try testArgs(u64, 0x71138bc6b4a38898, 0x1bc4043de9438c7b);
1402 try testArgs(i128, 0x76d428c46cdeaa2ac43de8abffb22f6d, 0x427f7545abe434a12544fdbe2a012889);
1212 try testArgs(u128, 0xe05fc132ef2cd8affee00a907f0a851f, 0x29f912a72cfc6a7c6973426a9636da9a);1403 try testArgs(u128, 0xe05fc132ef2cd8affee00a907f0a851f, 0x29f912a72cfc6a7c6973426a9636da9a);
1404 try testArgs(
1405 i256,
1406 -0x53d4148cee74ea43477a65b3daa7b8fdadcbf4508e793f4af113b8d8da5a7eb6,
1407 -0x30dcbaf7b9b7a3df033694e6795444d842fb0b8f79bc18b3ea8a6b7ccad3ea91,
1408 );
1213 try testArgs(1409 try testArgs(
1214 u256,1410 u256,
1215 0xb7935f5c2f3b1ae7a422c0a7c446884294b7d5370bada307d2fe5a4c4284a999,1411 0xb7935f5c2f3b1ae7a422c0a7c446884294b7d5370bada307d2fe5a4c4284a999,
1216 0x310e6e196ba4f143b8d285ca6addf7f3bb3344224aff221b27607a31e148be08,1412 0x310e6e196ba4f143b8d285ca6addf7f3bb3344224aff221b27607a31e148be08,
1217 );1413 );
1414 try testArgs(
1415 i258,
1416 -0x0eee283365108dbeea0bec82f5147418d8ffe86f9eed00e414b4eccd65c21239a,
1417 -0x122c730073fc29a24cd6e3e6263566879bc5325d8566b8db31fcb4a76f7ab95eb,
1418 );
1218 try testArgs(1419 try testArgs(
1219 u258,1420 u258,
1220 0x186d5ddaab8cb8cb04e5b41e36f812e039d008baf49f12894c39e29a07796d800,1421 0x186d5ddaab8cb8cb04e5b41e36f812e039d008baf49f12894c39e29a07796d800,
1221 0x2072daba6ffad168826163eb136f6d28ca4360c8e7e5e41e29755e19e4753a4f5,1422 0x2072daba6ffad168826163eb136f6d28ca4360c8e7e5e41e29755e19e4753a4f5,
1222 );1423 );
1424 try testArgs(
1425 i495,
1426 0x2fe6bc5448c55ce18252e2c9d44777505dfe63ff249a8027a6626c7d8dd9893fd5731e51474727be556f757facb586a4e04bbc0148c6c7ad692302f46fbd,
1427 -0x016a358821ef8240172f3a08e8830c06e6bcf2225f5f4d41ed42b44d249385f55cc594e1278ecac31c73faed890e5054af1a561483bb1bb6fb1f753514cf,
1428 );
1223 try testArgs(1429 try testArgs(
1224 u495,1430 u495,
1225 0x6eaf4e252b3bf74b75bac59e0b43ca5326bad2a25b3fdb74a67ef132ac5e47d72eebc3316fb2351ee66c50dc5afb92a75cea9b0e35160652c7db39eeb158,1431 0x6eaf4e252b3bf74b75bac59e0b43ca5326bad2a25b3fdb74a67ef132ac5e47d72eebc3316fb2351ee66c50dc5afb92a75cea9b0e35160652c7db39eeb158,
1226 0x49fbed744a92b549d8c05bb3512c617d24dd824f3f69bdf3923bc326a75674b85f5b828d2566fab9c86f571d12c2a63c9164feb0d191d27905533d09622a,1432 0x49fbed744a92b549d8c05bb3512c617d24dd824f3f69bdf3923bc326a75674b85f5b828d2566fab9c86f571d12c2a63c9164feb0d191d27905533d09622a,
1227 );1433 );
1434 try testArgs(
1435 i512,
1436 -0x3a6876ca92775286c6e1504a64a9b8d56985bebf4a1b66539d404e0e96f24b226f70c4bcff295fdc2043b82513b2052dc45fd78f7e9e80e5b3e101757289f054,
1437 0x5080c516a819bd32a0a5f0976441bbfbcf89e77684f1f10eb326aeb28e1f8d593278cff60fc99b8ffc87d8696882c64728dd3c322b7142803f4341f85a03bc10,
1438 );
1228 try testArgs(1439 try testArgs(
1229 u512,1440 u512,
1230 0xe5b1fedca3c77db765e517aabd05ffc524a3a8aff1784bbf67c45b894447ede32b65b9940e78173c591e56e078932d465f235aece7ad47b7f229df7ba8f12295,1441 0xe5b1fedca3c77db765e517aabd05ffc524a3a8aff1784bbf67c45b894447ede32b65b9940e78173c591e56e078932d465f235aece7ad47b7f229df7ba8f12295,
...@@ -1232,6 +1443,69 @@ fn Binary(comptime op: anytype) type {...@@ -1232,6 +1443,69 @@ fn Binary(comptime op: anytype) type {
1232 );1443 );
1233 }1444 }
1234 fn testIntVectorTypes() !void {1445 fn testIntVectorTypes() !void {
1446 try testArgs(@Vector(1, i8), .{
1447 -0x54,
1448 }, .{
1449 0x0f,
1450 });
1451 try testArgs(@Vector(2, i8), .{
1452 -0x4d, 0x55,
1453 }, .{
1454 0x7d, -0x5d,
1455 });
1456 try testArgs(@Vector(4, i8), .{
1457 0x73, 0x6f, 0x6e, -0x49,
1458 }, .{
1459 -0x66, 0x23, 0x21, -0x56,
1460 });
1461 try testArgs(@Vector(8, i8), .{
1462 0x44, -0x37, 0x33, -0x2b, -0x1f, 0x3e, 0x50, -0x4d,
1463 }, .{
1464 0x6a, 0x1a, -0x0e, 0x4c, -0x46, 0x03, -0x17, 0x3e,
1465 });
1466 try testArgs(@Vector(16, i8), .{
1467 -0x52, 0x1a, -0x4b, 0x4e, -0x75, 0x33, -0x43, 0x30, 0x71, -0x30, -0x73, -0x53, 0x64, 0x1f, -0x27, 0x36,
1468 }, .{
1469 0x65, 0x77, -0x62, 0x0f, 0x15, 0x52, 0x5c, 0x12, -0x10, 0x36, 0x6d, 0x42, -0x24, -0x79, -0x32, -0x75,
1470 });
1471 try testArgs(@Vector(32, i8), .{
1472 -0x12, -0x1e, 0x18, 0x6e, 0x31, 0x53, -0x6a, -0x34, 0x13, 0x4d, 0x30, -0x7d, -0x31, 0x1e, -0x24, 0x32,
1473 -0x1e, -0x01, 0x55, 0x33, -0x75, -0x44, -0x57, 0x2b, -0x66, 0x19, 0x7f, -0x28, -0x3f, -0x7e, -0x5d, -0x06,
1474 }, .{
1475 0x05, -0x23, 0x43, -0x54, -0x41, 0x7f, -0x6a, -0x31, 0x04, 0x15, -0x7a, -0x37, 0x6d, 0x16, 0x00, 0x4a,
1476 0x15, 0x55, -0x4a, 0x16, -0x73, -0x0c, 0x1c, -0x26, -0x14, 0x00, 0x55, 0x7b, 0x16, -0x2e, -0x5f, -0x67,
1477 });
1478 try testArgs(@Vector(64, i8), .{
1479 -0x05, 0x76, 0x4e, -0x5c, 0x7b, -0x1a, -0x38, -0x2e, 0x3d, 0x36, 0x01, 0x30, -0x02, -0x71, -0x24, 0x24,
1480 -0x2e, -0x6e, -0x60, 0x74, -0x80, -0x1c, -0x34, -0x08, -0x33, 0x77, 0x1c, -0x0f, 0x45, -0x51, -0x1d, 0x35,
1481 -0x45, 0x44, 0x27, -0x3c, 0x6b, 0x58, -0x6a, -0x26, 0x06, -0x30, -0x21, -0x0a, 0x60, -0x11, -0x05, 0x75,
1482 0x38, 0x72, -0x6d, -0x1f, -0x7f, 0x74, -0x6b, -0x14, -0x80, 0x35, -0x0f, -0x1e, 0x6a, 0x17, -0x74, -0x6c,
1483 }, .{
1484 -0x5d, 0x2d, 0x55, 0x40, -0x7c, 0x67, 0x61, 0x5f, 0x14, 0x5b, -0x0c, -0x4d, -0x5f, 0x25, 0x36, 0x3c,
1485 -0x75, -0x48, -0x2b, 0x76, -0x57, -0x4a, 0x1d, 0x65, -0x32, 0x18, -0x2a, -0x0a, -0x6e, -0x3c, -0x62, 0x4e,
1486 -0x24, -0x3c, 0x7d, -0x79, -0x1a, -0x14, -0x03, -0x56, 0x7a, 0x5f, 0x64, -0x68, 0x5f, -0x10, -0x63, -0x07,
1487 0x79, -0x44, 0x47, 0x7d, 0x6e, 0x77, 0x03, -0x4e, 0x67, 0x38, 0x46, -0x44, -0x41, 0x66, -0x16, -0x0a,
1488 });
1489 try testArgs(@Vector(128, i8), .{
1490 0x30, 0x70, -0x2a, -0x29, -0x35, -0x69, -0x18, 0x2b, 0x4a, -0x17, -0x5f, -0x36, 0x34, -0x26, 0x03, -0x2d,
1491 -0x75, -0x27, -0x07, -0x49, -0x58, 0x00, -0x45, 0x5d, -0x11, -0x68, 0x34, 0x73, -0x4d, 0x7f, -0x25, -0x6a,
1492 0x46, -0x1d, -0x68, 0x04, 0x64, -0x0d, 0x30, 0x27, -0x24, 0x67, 0x3c, -0x7c, -0x2e, -0x24, 0x24, 0x3e,
1493 -0x2c, -0x05, 0x4e, -0x17, 0x6d, 0x57, 0x76, 0x35, -0x3d, 0x51, 0x71, -0x4e, 0x50, 0x26, 0x4a, -0x42,
1494 0x73, -0x36, -0x5d, 0x2a, 0x55, 0x33, -0x2b, -0x76, 0x08, 0x43, 0x77, -0x73, -0x0a, 0x5c, -0x03, -0x50,
1495 -0x0a, -0x1c, -0x20, 0x3c, -0x7e, 0x60, 0x11, -0x77, 0x25, -0x71, 0x31, 0x2d, -0x4b, -0x26, -0x2a, 0x7f,
1496 -0x1f, 0x23, -0x34, -0x1f, 0x35, 0x0d, 0x3e, 0x76, -0x08, 0x2c, 0x12, 0x3e, -0x09, -0x3e, 0x4b, -0x52,
1497 -0x1a, -0x44, -0x53, -0x41, -0x6d, -0x5e, -0x06, -0x04, 0x3f, -0x2e, 0x01, 0x54, 0x19, -0x5a, -0x62, -0x3a,
1498 }, .{
1499 0x42, -0x11, -0x08, -0x64, -0x55, 0x31, 0x27, -0x66, 0x38, 0x5a, 0x25, -0x68, 0x0b, -0x41, -0x0d, 0x60,
1500 -0x17, -0x6d, 0x62, -0x65, -0x5e, -0x1c, -0x35, 0x28, 0x1c, -0x74, -0x7f, -0x1c, 0x3a, 0x4e, 0x05, -0x08,
1501 0x30, -0x77, 0x03, 0x68, -0x2c, 0x5c, 0x74, 0x6a, -0x21, 0x0a, 0x36, -0x55, 0x21, 0x29, -0x05, 0x70,
1502 0x23, 0x3b, 0x0a, 0x7a, 0x19, 0x14, 0x65, -0x1d, 0x2b, 0x65, 0x33, 0x2a, 0x52, -0x63, 0x57, 0x10,
1503 -0x1b, 0x26, -0x46, -0x7e, -0x25, 0x79, -0x01, -0x0d, -0x49, -0x4d, 0x74, 0x03, 0x77, 0x16, 0x03, -0x3d,
1504 0x1c, 0x25, 0x5a, -0x2f, -0x16, -0x5f, -0x36, -0x55, -0x44, -0x0c, -0x0f, 0x7b, -0x15, -0x1d, 0x32, 0x31,
1505 0x6e, -0x44, -0x4a, -0x64, 0x67, 0x04, 0x47, 0x00, 0x3c, -0x0a, -0x79, 0x3d, 0x48, 0x5a, 0x61, -0x2c,
1506 0x6d, -0x68, -0x71, -0x6b, -0x11, 0x44, -0x75, -0x55, -0x67, -0x52, 0x64, -0x3d, -0x05, -0x76, -0x6d, -0x44,
1507 });
1508
1235 try testArgs(@Vector(1, u8), .{1509 try testArgs(@Vector(1, u8), .{
1236 0x1f,1510 0x1f,
1237 }, .{1511 }, .{
...@@ -1295,6 +1569,67 @@ fn Binary(comptime op: anytype) type {...@@ -1295,6 +1569,67 @@ fn Binary(comptime op: anytype) type {
1295 0x56, 0x4f, 0xf1, 0xaa, 0x0a, 0x0f, 0xdb, 0x1b, 0xc8, 0x45, 0x9b, 0x12, 0xb4, 0x1a, 0xe4, 0xa3,1569 0x56, 0x4f, 0xf1, 0xaa, 0x0a, 0x0f, 0xdb, 0x1b, 0xc8, 0x45, 0x9b, 0x12, 0xb4, 0x1a, 0xe4, 0xa3,
1296 });1570 });
12971571
1572 try testArgs(@Vector(1, i16), .{
1573 -0x7b9c,
1574 }, .{
1575 0x600a,
1576 });
1577 try testArgs(@Vector(2, i16), .{
1578 0x43cc, -0x1421,
1579 }, .{
1580 -0x2b0e, 0x4d99,
1581 });
1582 try testArgs(@Vector(4, i16), .{
1583 0x558f, 0x6d92, 0x488f, 0x0a04,
1584 }, .{
1585 -0x01a9,
1586 0x2ee4,
1587 0x24a9,
1588 -0x5fee,
1589 });
1590 try testArgs(@Vector(8, i16), .{
1591 -0x7e5d, -0x02e4, -0x3a72, -0x2e30, 0x7c87, 0x3ea0, 0x4f02, 0x06e4,
1592 }, .{
1593 -0x417f, 0x5a13, -0x117b, 0x4c28, -0x3769, -0x56a8, 0x1656, -0x4431,
1594 });
1595 try testArgs(@Vector(16, i16), .{
1596 0x04be, 0x774a, 0x7395, -0x6ca2, -0x21a0, 0x35be, 0x186c, 0x5991,
1597 -0x1a82, 0x4527, -0x2278, -0x3554, 0x42c1, 0x7f53, -0x670d, 0x1fad,
1598 }, .{
1599 0x7a7d, 0x47dd, 0x1975, 0x4028, 0x26ef, -0x24f5, -0x77c9, -0x19a5,
1600 -0x4b04, -0x6939, -0x1b8d, 0x3718, -0x78e6, 0x0941, -0x1208, -0x392d,
1601 });
1602 try testArgs(@Vector(32, i16), .{
1603 0x4cde, 0x3ab0, 0x354e, 0x0bc0, -0x5333, 0x4857, -0x7ccf, -0x69da,
1604 0x6ab8, 0x2bf3, 0x1c5a, 0x7b11, -0x5653, 0x7bc5, 0x497e, -0x0b55,
1605 0x7aa8, -0x5a8c, -0x6d05, 0x6210, 0x1b64, 0x3f6f, 0x1a02, 0x65e4,
1606 -0x6795, 0x5867, -0x6faf, -0x07cb, -0x762c, -0x7500, 0x1f1c, -0x4348,
1607 }, .{
1608 0x72f6, -0x5405, -0x3aac, 0x2857, 0x34cd, -0x1dce, -0x56d8, 0x7150,
1609 -0x6549, 0x61bd, -0x3a9f, -0x1e02, -0x5a5a, -0x7910, -0x166d, 0x7c8e,
1610 -0x5292, -0x6c6e, -0x37e3, 0x1514, 0x1787, 0x58cb, -0x4d99, -0x6c15,
1611 0x592e, -0x045f, 0x7682, -0x1eef, 0x1fb2, -0x7117, -0x2a17, -0x2d8e,
1612 });
1613 try testArgs(@Vector(64, i16), .{
1614 0x29c3, -0x1b1f, -0x17ce, -0x50d0, -0x5de3, 0x5ffd, 0x184a, -0x7769,
1615 0x445e, 0x0d8a, 0x7844, -0x757d, 0x2b32, 0x5374, -0x6ab2, -0x71c4,
1616 0x38f9, 0x347f, 0x2d4c, 0x69a4, -0x2f92, -0x4479, 0x427b, -0x0c5f,
1617 0x15ae, 0x2c86, 0x1864, -0x0095, 0x6803, -0x3484, 0x1001, -0x0560,
1618 -0x0824, 0x7bf6, 0x7a3c, -0x458a, -0x65cc, -0x54b1, -0x75c6, 0x782e,
1619 0x35a7, -0x3188, -0x58ba, 0x40d0, -0x4a9c, 0x6b79, 0x1ef5, 0x67a2,
1620 -0x3fb8, 0x1885, -0x093d, -0x4802, 0x0379, 0x2f52, 0x7f1f, 0x256c,
1621 0x1052, 0x1b3b, -0x6146, 0x7e0d, 0x79ca, -0x79ee, 0x3d58, 0x7482,
1622 }, .{
1623 -0x0017, -0x3fdd, -0x6f93, 0x6178, 0x5c2b, 0x4eb3, 0x685b, 0x12c8,
1624 0x0290, -0x34f4, -0x6572, 0x3ab6, -0x3ed1, -0x5e5f, 0x3a90, -0x4540,
1625 -0x2098, 0x6bde, 0x1246, 0x2212, -0x4d6a, -0x2a5a, 0x5cc4, -0x240f,
1626 0x51b2, 0x5ec0, -0x5b5f, -0x1b6e, -0x57a5, -0x06bd, -0x5132, 0x7889,
1627 0x2817, 0x6ada, -0x6b46, -0x6a37, -0x6475, -0x5ff4, 0x5a27, 0x1dfa,
1628 0x6bd6, -0x49da, -0x09bf, -0x7c53, 0x2cd3, -0x6be0, -0x2dca, 0x44bd,
1629 -0x1b95, 0x7680, -0x5bb0, 0x7ad7, -0x1988, 0x149f, 0x631e, -0x1d2d,
1630 0x632b, 0x55c7, -0x3433, 0x0dde, -0x27a7, 0x560e, -0x2063, 0x4570,
1631 });
1632
1298 try testArgs(@Vector(1, u16), .{1633 try testArgs(@Vector(1, u16), .{
1299 0x9d6f,1634 0x9d6f,
1300 }, .{1635 }, .{
...@@ -1353,6 +1688,59 @@ fn Binary(comptime op: anytype) type {...@@ -1353,6 +1688,59 @@ fn Binary(comptime op: anytype) type {
1353 0x2c02, 0xff5b, 0x19ca, 0xbbf5, 0x870e, 0xc9ca, 0x47bb, 0xcfcc,1688 0x2c02, 0xff5b, 0x19ca, 0xbbf5, 0x870e, 0xc9ca, 0x47bb, 0xcfcc,
1354 });1689 });
13551690
1691 try testArgs(@Vector(1, i32), .{
1692 0x7aef7b1e,
1693 }, .{
1694 0x60310858,
1695 });
1696 try testArgs(@Vector(2, i32), .{
1697 -0x21910ac9, 0x669f37ef,
1698 }, .{
1699 0x1a2a1681, 0x003b1fdf,
1700 });
1701 try testArgs(@Vector(4, i32), .{
1702 0x7906cf0d, 0x4818a45f, -0x0a2833b6, 0x51a018c9,
1703 }, .{
1704 -0x05a3e6a7, -0x47f4a500, 0x50d1141f, -0x264c85c2,
1705 });
1706 try testArgs(@Vector(8, i32), .{
1707 0x7566235a, -0x7720144f, -0x7d4f5489, 0x3cd736c8,
1708 -0x77388801, 0x4e7f955a, 0x4cdf52bc, 0x50b0b53f,
1709 }, .{
1710 0x00ed6fc5, 0x37320361, 0x70c563c2, -0x09acb495,
1711 0x0688e83f, 0x797295c4, -0x23bfbfdb, 0x38552096,
1712 });
1713 try testArgs(@Vector(16, i32), .{
1714 -0x0214589d, 0x74a7537f, 0x7a7dcb26, 0x3e2e4c44,
1715 -0x23bfc358, 0x60e8ef18, 0x5524a7bc, -0x3d88c153,
1716 -0x7dc8ff0f, 0x6e2698f6, 0x05641ab8, -0x45e9e405,
1717 -0x7c1a04d0, -0x4a8d1e91, 0x41d56723, 0x4ba924ab,
1718 }, .{
1719 -0x528dc756, -0x6bc217f4, 0x40789b06, 0x65f08d3a,
1720 -0x077140ea, -0x43bdaa79, 0x5d98f4e7, -0x2356a1ca,
1721 -0x36ef2b49, -0x7cd09b06, 0x71c8176e, 0x5b005860,
1722 0x6ce8cfab, -0x49fd7609, 0x6cbb4e33, 0x6c7c121d,
1723 });
1724 try testArgs(@Vector(32, i32), .{
1725 0x7d22905d, -0x354e4bbe, -0x68662618, -0x246e1858,
1726 -0x1c4285a9, -0x0338059c, -0x60f5bbf4, -0x04f06917,
1727 -0x55f837b6, -0x2fba5fe3, 0x092aabf4, -0x5f533b31,
1728 0x6e81a558, -0x7bcac358, 0x6c4d8d04, 0x3e2f9852,
1729 -0x78589b1a, -0x68a00fd4, -0x77d55e25, 0x7f79b51c,
1730 -0x66b88f45, 0x7f6dc8a5, -0x27299a82, -0x426c8e1c,
1731 0x0c288f16, 0x158f8c3f, 0x26708be1, -0x0b73626e,
1732 -0x32df1bee, 0x196330f4, -0x68bb9529, -0x26376ab6,
1733 }, .{
1734 0x63bd0bd4, 0x4e507611, -0x5e5222b8, -0x35d8e114,
1735 0x1feab77b, -0x20de7dfd, -0x0ed0b09f, -0x7fc3d585,
1736 -0x2d3018e9, -0x261d431b, 0x54451864, 0x1415288f,
1737 -0x3ab89593, -0x7060e4c1, -0x54fcd501, -0x26324630,
1738 0x53fc8294, 0x2d4aceef, -0x4ac8efd2, -0x2fec97b7,
1739 -0x4de3a2fc, 0x2269fe52, -0x58c8b473, -0x21026285,
1740 -0x23438776, 0x3d5c8c41, -0x1fc946b2, -0x161c7005,
1741 0x44913ff1, -0x76e2bfaa, -0x54636350, -0x6ec53870,
1742 });
1743
1356 try testArgs(@Vector(1, u32), .{1744 try testArgs(@Vector(1, u32), .{
1357 0x1d0d9cc4,1745 0x1d0d9cc4,
1358 }, .{1746 }, .{
...@@ -1406,6 +1794,54 @@ fn Binary(comptime op: anytype) type {...@@ -1406,6 +1794,54 @@ fn Binary(comptime op: anytype) type {
1406 0xf080e943, 0xc8718d14, 0x3f920382, 0x18d101b5,1794 0xf080e943, 0xc8718d14, 0x3f920382, 0x18d101b5,
1407 });1795 });
14081796
1797 try testArgs(@Vector(1, i64), .{
1798 0x4a31679b316d8b59,
1799 }, .{
1800 0x34a583368386afde,
1801 });
1802 try testArgs(@Vector(2, i64), .{
1803 0x3bae373f9cb990b3, -0x7e8c6c876e8fd34a,
1804 }, .{
1805 0x09dbef6f7cb9c726, 0x48dfeca879b0df51,
1806 });
1807 try testArgs(@Vector(4, i64), .{
1808 -0x2bd24dd5f5da94bf, -0x144113bae33082c2,
1809 0x51e8cb7027ba4b12, -0x47b02168e2e22f13,
1810 }, .{
1811 0x769f113245641b91, -0x414d0e24ea97bc53,
1812 -0x0d2a570e7ef9e923, -0x070513d46d3b5a4c,
1813 });
1814 try testArgs(@Vector(8, i64), .{
1815 0x10bb6779b6a55ca9, 0x5f6ffd567a187af4,
1816 -0x6ba191b1168486b4, -0x441b92ce455870a1,
1817 0x2b6fdefbec9386ad, -0x6fdd3938d79217e4,
1818 0x6aa8fe1fb891501f, 0x20802f5bbdf6dc50,
1819 }, .{
1820 -0x7500319df437b479, 0x00ceb712d4fa62d4,
1821 0x67e715b9e99e660d, -0x17ae00e1f0009ec2,
1822 -0x5b700b948503acdf, -0x3ff61fb5cce5a530,
1823 0x55a3efac2e3694a4, 0x7f951a8d842f1670,
1824 });
1825 try testArgs(@Vector(16, i64), .{
1826 0x37a205109a685810, -0x50ff5d13134ccaa6,
1827 0x26813391c5505d5d, -0x502cdc01603a2f21,
1828 -0x6b1b44b1c850c7ea, 0x1f6db974ace9dd70,
1829 -0x47d15da8b519e328, 0x3ac0763abbf79d8d,
1830 0x5f12e0dc1aed4a4f, -0x46a973e16061e928,
1831 -0x3f59a3fa9699b4d5, -0x2f5012d390c78315,
1832 -0x40e510dea2c47e9c, 0x221c51defe0acc9a,
1833 -0x385fd6f1d390b84b, 0x35932fe2783fa6b9,
1834 }, .{
1835 0x0ba5202b71ad73dd, 0x65c8d2d5e2a14fe5,
1836 0x2e4d97cd66c41a3d, 0x14babbb47da51193,
1837 0x59d1d12b42ade3aa, -0x3c3617e556dfa8fb,
1838 -0x5a36602ba43279c4, -0x61f1ddda13665d9f,
1839 -0x50cd6128589ddd04, 0x135ae0dcc85674ae,
1840 -0x25e80592affc038d, 0x07e184c44fbe9b12,
1841 -0x70ede1b90964bbaa, 0x3ec48b32e8efd98e,
1842 -0x5267d41d85a29f46, 0x53099805f9116b60,
1843 });
1844
1409 try testArgs(@Vector(1, u64), .{1845 try testArgs(@Vector(1, u64), .{
1410 0x333f593bf9d08546,1846 0x333f593bf9d08546,
1411 }, .{1847 }, .{
...@@ -1454,6 +1890,49 @@ fn Binary(comptime op: anytype) type {...@@ -1454,6 +1890,49 @@ fn Binary(comptime op: anytype) type {
1454 0xed533d18f8657f3f, 0x1ddd7cd7f6bab957,1890 0xed533d18f8657f3f, 0x1ddd7cd7f6bab957,
1455 });1891 });
14561892
1893 try testArgs(@Vector(1, i128), .{
1894 -0x3bb56309fcad13fc1011dc671cf57bdc,
1895 }, .{
1896 -0x05338bb517db516ee08c45d1408e5836,
1897 });
1898 try testArgs(@Vector(2, i128), .{
1899 0x295f2901e3837e5592b9435f8c4df8a7,
1900 -0x1f246b0ff2d02a6bf30a63392fc63371,
1901 }, .{
1902 -0x31060c09e29b545670c4cbc721a4e26b,
1903 -0x631eb286321325d51c617aa798195392,
1904 });
1905 try testArgs(@Vector(4, i128), .{
1906 0x47110102c74f620f08e5b7c5dbe193c2,
1907 -0x61d12d2650413ad3ffeeeab3ba57e1f0,
1908 0x449781e64b29dc8a17a88f4b7a5b0717,
1909 0x0d2170e9238d12a585dc5377566e1938,
1910 }, .{
1911 0x0bf948e19bd01823dcb3887937d97079,
1912 -0x16f933ab12bfba3560d0d39ffe69b64a,
1913 0x3d0bfce3907a5cd157348f0329e2548e,
1914 -0x3c2d182e2e238a4bebd7defbd7f9699a,
1915 });
1916 try testArgs(@Vector(8, i128), .{
1917 -0x775678727c721662f02480619acbfc82,
1918 -0x6f504fcbff673cb91e4706af4373665f,
1919 -0x670f888d4186387c3106d125b856c294,
1920 0x0641e7efdfdd924d126b446d874154f8,
1921 0x57d7aef0f82d3351917f43c8f677392b,
1922 -0x4077e745dede8367d145c94f20ab8810,
1923 -0x0344a74fb60e1f1f72ba8ec288b05939,
1924 -0x0be3ce9be461aca1d25ad8e74dcc36e1,
1925 }, .{
1926 -0x4a873d91e5a2331def0d34c008d33d83,
1927 0x2744cecfd4c683bdd12f3cfc11d7f520,
1928 -0x0cb8e468fc1de93a7c5ad2a5a61e8f50,
1929 -0x1a3be9e58e918d6586cc4948a54515d3,
1930 -0x512ec6f88c3a34950a8aaee47130120b,
1931 -0x2e772e4a8812e553bcf9b2754a493709,
1932 0x0c7b137937dc25f9f9cbaf4d7a88ee6b,
1933 -0x2ecdd5eb81eb0e98ed8d0aa9516c1617,
1934 });
1935
1457 try testArgs(@Vector(1, u128), .{1936 try testArgs(@Vector(1, u128), .{
1458 0x5f11e16b0ca3392f907a857881455d2e,1937 0x5f11e16b0ca3392f907a857881455d2e,
1459 }, .{1938 }, .{
...@@ -1497,6 +1976,30 @@ fn Binary(comptime op: anytype) type {...@@ -1497,6 +1976,30 @@ fn Binary(comptime op: anytype) type {
1497 0xa858bce5ad0e48c13588a4e170e8667c,1976 0xa858bce5ad0e48c13588a4e170e8667c,
1498 });1977 });
14991978
1979 try testArgs(@Vector(1, i256), .{
1980 0x1fe30aed39db1accf4d1b43845aec28c1094b500492555fdf59b4f2f85c6a1ce,
1981 }, .{
1982 0x6932f4faf261c45ecd701a4fe3015d4255e486b04c4ab448fe162980cead63fb,
1983 });
1984 try testArgs(@Vector(2, i256), .{
1985 -0x23daa9bab59dc1e685f4220c189930c3420a55784f0dec1028c2778d907ccfe2,
1986 0x521c992e4f46d61709d39e076ed94d5d884585f85ccbf71ca4d593da34f61bf5,
1987 }, .{
1988 0x2d880cb5aa793218a32411389db31e935932029645573a9625dd174099c9e5b2,
1989 0x2394a6cde7e8b2dc2995f07f22f815baa6c223d99c0b1ec4b2d8abd0094db853,
1990 });
1991 try testArgs(@Vector(4, i256), .{
1992 0x244e66ed932a4d970fd8735c10bfbd5f59bd4452c20fa0fcf873823b8c9e6321,
1993 -0x31577b747614b1ab83fd0178293cd80b3cb92e739459b2d038688a2471f6d659,
1994 -0x0dbdfc3d8bbd7cab6a33598cef29125aab7571fb0db9a528e42966963d6ce0e7,
1995 -0x72c58cce172d8a34019a44407a4baf1f8f8a4a611711bd5bb4daa2a2739dd67b,
1996 }, .{
1997 -0x2e88bc68893fc2d61af0e5ccb541f31fa6169504e8cfcbeab0b74a03b9e86c33,
1998 -0x7eba0783f3382b59a17ffbea57ba1dd8fa30e2d4f7eba7ed68d336d3c37b4561,
1999 -0x66d1463efd38e9e994e126d09b5c65c8efc932ffea9ec6cdf6042561ba05f801,
2000 0x2024bbacefbabbfd5b32a09be631451764a1f889a77918f9094382dc6d02aef2,
2001 });
2002
1500 try testArgs(@Vector(1, u256), .{2003 try testArgs(@Vector(1, u256), .{
1501 0x28df37e1f57a56133ba3f5b5b2164ce24eb6c29a8973a597fd91fbee8ab4bafb,2004 0x28df37e1f57a56133ba3f5b5b2164ce24eb6c29a8973a597fd91fbee8ab4bafb,
1502 }, .{2005 }, .{
...@@ -1521,6 +2024,19 @@ fn Binary(comptime op: anytype) type {...@@ -1521,6 +2024,19 @@ fn Binary(comptime op: anytype) type {
1521 0xe47a122bd45d5e7d69722d864a6b795ddee965a0993094f8791dd309d692de8b,2024 0xe47a122bd45d5e7d69722d864a6b795ddee965a0993094f8791dd309d692de8b,
1522 });2025 });
15232026
2027 try testArgs(@Vector(1, i512), .{
2028 -0x439ba81b44584e0c4d7abc80d18ab9d679a4e921884e877b28d04eb15b2d3e7be8d670b0aba2c4cc25c12655e1899ab514d0a6e50a221bcf076d506e6411d5c2,
2029 }, .{
2030 0x18b1d3be5a03310d82859a4ab72f056a33d1a4b554522bcc062fb33eda3b8111045ee79e045dd1a665d250b897f6f2e12003a03313c2547698f8c1eab452eae1,
2031 });
2032 try testArgs(@Vector(2, i512), .{
2033 0x28e2ab84d87d5fb12be65d8650de67b992dd162fe563ca74b62f51f2f32e1084e03e32c8370930816445ac5052b4d345059c8ace582e3ef44377b160e265ec9b,
2034 -0x3a96548c707219326c42063997e71bc7a17b3067d402063843f84c86e747b71e09338079c28943d20601c0cde018bad57f5615fc89784bcb6232e45c54dff1db,
2035 }, .{
2036 0x64beecc90609b7156653b75a861e174c58fb42d5c7bf8d793efbb1cbe785c6b8cd52ce5f9aa859f174123c387820d40a2f93122b81396d739eb85c3ea33fcd37,
2037 -0x3632e347bc6d794940424ca0945dafa04328a924ec6b0ccdedcda6d296e09aa2dd5dca83b934cac752993238aa4fe826be8d62991c9347bae6f01bc0b1b4223d,
2038 });
2039
1524 try testArgs(@Vector(1, u512), .{2040 try testArgs(@Vector(1, u512), .{
1525 0x651058c1d89a8f34cfc5e66b6d25294eecfcc4a7e1e4a356eb51ee7d7b2db25378e4afee51b7d18d16e520772a60c50a02d7966f40ced1870b32c658e5821397,2041 0x651058c1d89a8f34cfc5e66b6d25294eecfcc4a7e1e4a356eb51ee7d7b2db25378e4afee51b7d18d16e520772a60c50a02d7966f40ced1870b32c658e5821397,
1526 }, .{2042 }, .{
...@@ -1534,6 +2050,12 @@ fn Binary(comptime op: anytype) type {...@@ -1534,6 +2050,12 @@ fn Binary(comptime op: anytype) type {
1534 0x8fa3d86099e9e2789d72f8e792290356d659ab20ac0414ff94745984c6ae7d986082197bb849889f912e896670aa2c1a11bd7e66e3f650710b0f0a18a1533f90,2050 0x8fa3d86099e9e2789d72f8e792290356d659ab20ac0414ff94745984c6ae7d986082197bb849889f912e896670aa2c1a11bd7e66e3f650710b0f0a18a1533f90,
1535 });2051 });
15362052
2053 try testArgs(@Vector(1, i1024), .{
2054 -0x4fe568569c0531c9bfbbda1516e93a6c61a3d035c98e13fdc85225165a3bea84d5dc6b610ced008f9321453af42ea50bbf6881d40d2759b73b9b6186c0d6d243f367e292cbbf6b5c5c30d7f4e8de19701c7b0fc9e67cdf31228daa1675a4887f6c4f1588b48855d6f4730a21f27dec8a756c568727709b65cd531020d53ff394,
2055 }, .{
2056 -0x7cab2a053dfbf944cd342460350c989fd1b4469a6c7b54ddcacd54e605d29c03651b5c463495610d82269c9ac5b51bfd07816a0f7b1ab50cb598989ed64607b3faff79a190702eb285b0fedc050ec1a71537abc47ec590eb671d4f76b19567049ba4789d1a4348385607a0320fbff9b78260536a9b6030bddb0b09da689d1687,
2057 });
2058
1537 try testArgs(@Vector(1, u1024), .{2059 try testArgs(@Vector(1, u1024), .{
1538 0x0ca1a0dfaf8bb1da714b457d23c71aef948e66c7cd45c0aa941498a796fb18502ec32f34e885d0a107d44ae81595f8b52c2f0fb38e584b7139903a0e8a823ae20d01ca0662722dd474e7efc40f32d74cc065d97d8a09d0447f1ab6107fa0a57f3f8c866ae872506627ce82f18add79cee8dc69837f4ead3ca770c4d622d7e544,2060 0x0ca1a0dfaf8bb1da714b457d23c71aef948e66c7cd45c0aa941498a796fb18502ec32f34e885d0a107d44ae81595f8b52c2f0fb38e584b7139903a0e8a823ae20d01ca0662722dd474e7efc40f32d74cc065d97d8a09d0447f1ab6107fa0a57f3f8c866ae872506627ce82f18add79cee8dc69837f4ead3ca770c4d622d7e544,
1539 }, .{2061 }, .{
...@@ -1558,6 +2080,7 @@ test abs {...@@ -1558,6 +2080,7 @@ test abs {
1558 try Unary(abs).testIntTypes();2080 try Unary(abs).testIntTypes();
1559 try Unary(abs).testIntVectorTypes();2081 try Unary(abs).testIntVectorTypes();
1560 try Unary(abs).testFloatTypes();2082 try Unary(abs).testFloatTypes();
2083 try Unary(abs).testFloatVectorTypes();
1561}2084}
15622085
1563inline fn clz(comptime Type: type, rhs: Type) @TypeOf(@clz(rhs)) {2086inline fn clz(comptime Type: type, rhs: Type) @TypeOf(@clz(rhs)) {
...@@ -1591,3 +2114,19 @@ test bitXor {...@@ -1591,3 +2114,19 @@ test bitXor {
1591 try Binary(bitXor).testIntTypes();2114 try Binary(bitXor).testIntTypes();
1592 try Binary(bitXor).testIntVectorTypes();2115 try Binary(bitXor).testIntVectorTypes();
1593}2116}
2117
2118inline fn min(comptime Type: type, lhs: Type, rhs: Type) Type {
2119 return @min(lhs, rhs);
2120}
2121test min {
2122 try Binary(min).testIntTypes();
2123 try Binary(min).testIntVectorTypes();
2124}
2125
2126inline fn max(comptime Type: type, lhs: Type, rhs: Type) Type {
2127 return @max(lhs, rhs);
2128}
2129test max {
2130 try Binary(max).testIntTypes();
2131 try Binary(max).testIntVectorTypes();
2132}
test/cases/compile_errors/anytype_param_requires_comptime.zig+1-1
...@@ -15,6 +15,6 @@ pub export fn entry() void {...@@ -15,6 +15,6 @@ pub export fn entry() void {
15// error15// error
16//16//
17// :7:25: error: unable to resolve comptime value17// :7:25: error: unable to resolve comptime value
18// :7:25: note: initializer of comptime-only struct 'tmp.S.foo__anon_441.C' must be comptime-known18// :7:25: note: initializer of comptime-only struct 'tmp.S.foo__anon_463.C' must be comptime-known
19// :4:16: note: struct requires comptime because of this field19// :4:16: note: struct requires comptime because of this field
20// :4:16: note: types are not available at runtime20// :4:16: note: types are not available at runtime
test/cases/compile_errors/bogus_method_call_on_slice.zig+1-1
...@@ -16,5 +16,5 @@ pub export fn entry2() void {...@@ -16,5 +16,5 @@ pub export fn entry2() void {
16//16//
17// :3:6: error: no field or member function named 'copy' in '[]const u8'17// :3:6: error: no field or member function named 'copy' in '[]const u8'
18// :9:8: error: no field or member function named 'bar' in '@TypeOf(.{})'18// :9:8: error: no field or member function named 'bar' in '@TypeOf(.{})'
19// :12:18: error: no field or member function named 'bar' in 'tmp.entry2__struct_445'19// :12:18: error: no field or member function named 'bar' in 'tmp.entry2__struct_467'
20// :12:6: note: struct declared here20// :12:6: note: struct declared here
test/cases/compile_errors/coerce_anon_struct.zig+1-1
...@@ -6,6 +6,6 @@ export fn foo() void {...@@ -6,6 +6,6 @@ export fn foo() void {
66
7// error7// error
8//8//
9// :4:16: error: expected type 'tmp.T', found 'tmp.foo__struct_434'9// :4:16: error: expected type 'tmp.T', found 'tmp.foo__struct_456'
10// :3:16: note: struct declared here10// :3:16: note: struct declared here
11// :1:11: note: struct declared here11// :1:11: note: struct declared here
test/src/Debugger.zig+119-110
...@@ -526,8 +526,9 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {...@@ -526,8 +526,9 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
526 \\ var null_u32: ?u32 = null;526 \\ var null_u32: ?u32 = null;
527 \\ var maybe_u32: ?u32 = null;527 \\ var maybe_u32: ?u32 = null;
528 \\ var nonnull_u32: ?u32 = 456;528 \\ var nonnull_u32: ?u32 = 456;
529 \\ null_u32 = null_u32;
529 \\ maybe_u32 = 123;530 \\ maybe_u32 = 123;
530 \\ _ = .{ &null_u32, &nonnull_u32 };531 \\ nonnull_u32 = nonnull_u32;
531 \\ }532 \\ }
532 \\}533 \\}
533 \\534 \\
...@@ -539,7 +540,7 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {...@@ -539,7 +540,7 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
539 \\frame variable -- null_u32 maybe_u32 nonnull_u32540 \\frame variable -- null_u32 maybe_u32 nonnull_u32
540 \\breakpoint delete --force 1541 \\breakpoint delete --force 1
541 \\542 \\
542 \\breakpoint set --file optionals.zig --source-pattern-regexp '_ = \.{ &null_u32, &nonnull_u32 };'543 \\breakpoint set --file optionals.zig --source-pattern-regexp 'nonnull_u32 = nonnull_u32;'
543 \\process continue544 \\process continue
544 \\frame variable --show-types -- null_u32 maybe_u32 nonnull_u32545 \\frame variable --show-types -- null_u32 maybe_u32 nonnull_u32
545 \\breakpoint delete --force 2546 \\breakpoint delete --force 2
...@@ -1285,10 +1286,12 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {...@@ -1285,10 +1286,12 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
1285 \\ mod1.m1cfi(r0pai ^ 8);1286 \\ mod1.m1cfi(r0pai ^ 8);
1286 \\}1287 \\}
1287 \\pub fn r0cf(r0ca: u32) void {1288 \\pub fn r0cf(r0ca: u32) void {
1288 \\ _ = r0ca;1289 \\ var discard = r0ca;
1290 \\ _ = &discard;
1289 \\}1291 \\}
1290 \\pub inline fn r0cfi(r0cai: u32) void {1292 \\pub inline fn r0cfi(r0cai: u32) void {
1291 \\ _ = r0cai;1293 \\ var discard = r0cai;
1294 \\ _ = &discard;
1292 \\}1295 \\}
1293 \\pub fn main() void {1296 \\pub fn main() void {
1294 \\ root0.r0pf(12);1297 \\ root0.r0pf(12);
...@@ -1331,10 +1334,12 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {...@@ -1331,10 +1334,12 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
1331 \\ mod1.m1cfi(r1pai ^ 8);1334 \\ mod1.m1cfi(r1pai ^ 8);
1332 \\}1335 \\}
1333 \\pub fn r1cf(r1ca: u32) void {1336 \\pub fn r1cf(r1ca: u32) void {
1334 \\ _ = r1ca;1337 \\ var discard = r1ca;
1338 \\ _ = &discard;
1335 \\}1339 \\}
1336 \\pub inline fn r1cfi(r1cai: u32) void {1340 \\pub inline fn r1cfi(r1cai: u32) void {
1337 \\ _ = r1cai;1341 \\ var discard = r1cai;
1342 \\ _ = &discard;
1338 \\}1343 \\}
1339 \\1344 \\
1340 ,1345 ,
...@@ -1368,10 +1373,12 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {...@@ -1368,10 +1373,12 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
1368 \\ mod1.m1cfi(m0pai ^ 8);1373 \\ mod1.m1cfi(m0pai ^ 8);
1369 \\}1374 \\}
1370 \\pub fn m0cf(m0ca: u32) void {1375 \\pub fn m0cf(m0ca: u32) void {
1371 \\ _ = m0ca;1376 \\ var discard = m0ca;
1377 \\ _ = &discard;
1372 \\}1378 \\}
1373 \\pub inline fn m0cfi(m0cai: u32) void {1379 \\pub inline fn m0cfi(m0cai: u32) void {
1374 \\ _ = m0cai;1380 \\ var discard = m0cai;
1381 \\ _ = &discard;
1375 \\}1382 \\}
1376 \\1383 \\
1377 ,1384 ,
...@@ -1404,10 +1411,12 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {...@@ -1404,10 +1411,12 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
1404 \\ mod1.m1cfi(m1pai ^ 8);1411 \\ mod1.m1cfi(m1pai ^ 8);
1405 \\}1412 \\}
1406 \\pub fn m1cf(m1ca: u32) void {1413 \\pub fn m1cf(m1ca: u32) void {
1407 \\ _ = m1ca;1414 \\ var discard = m1ca;
1415 \\ _ = &discard;
1408 \\}1416 \\}
1409 \\pub inline fn m1cfi(m1cai: u32) void {1417 \\pub inline fn m1cfi(m1cai: u32) void {
1410 \\ _ = m1cai;1418 \\ var discard = m1cai;
1419 \\ _ = &discard;
1411 \\}1420 \\}
1412 \\1421 \\
1413 ,1422 ,
...@@ -1416,13 +1425,13 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {...@@ -1416,13 +1425,13 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
1416 \\settings set frame-format 'frame #${frame.index}:{ ${module.file.basename}{\`${function.name-with-args}{${frame.no-debug}${function.pc-offset}}}}{ at ${line.file.basename}:${line.number}{:${line.column}}}{${function.is-optimized} [opt]}{${frame.is-artificial} [artificial]}\n'1425 \\settings set frame-format 'frame #${frame.index}:{ ${module.file.basename}{\`${function.name-with-args}{${frame.no-debug}${function.pc-offset}}}}{ at ${line.file.basename}:${line.number}{:${line.column}}}{${function.is-optimized} [opt]}{${frame.is-artificial} [artificial]}\n'
1417 \\1426 \\
1418 \\breakpoint set --file root0.zig --line 261427 \\breakpoint set --file root0.zig --line 26
1419 \\breakpoint set --file root0.zig --line 291428 \\breakpoint set --file root0.zig --line 30
1420 \\breakpoint set --file root1.zig --line 261429 \\breakpoint set --file root1.zig --line 26
1421 \\breakpoint set --file root1.zig --line 291430 \\breakpoint set --file root1.zig --line 30
1422 \\breakpoint set --file mod0.zig --line 261431 \\breakpoint set --file mod0.zig --line 26
1423 \\breakpoint set --file mod0.zig --line 291432 \\breakpoint set --file mod0.zig --line 30
1424 \\breakpoint set --file mod1.zig --line 261433 \\breakpoint set --file mod1.zig --line 26
1425 \\breakpoint set --file mod1.zig --line 291434 \\breakpoint set --file mod1.zig --line 30
1426 \\1435 \\
1427 \\process launch1436 \\process launch
1428 \\thread backtrace --count 31437 \\thread backtrace --count 3
...@@ -1563,259 +1572,259 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {...@@ -1563,259 +1572,259 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
1563 &.{1572 &.{
1564 \\ * frame #0: inline_call`root0.r0cf(r0ca=13) at root0.zig:26:51573 \\ * frame #0: inline_call`root0.r0cf(r0ca=13) at root0.zig:26:5
1565 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:6:151574 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:6:15
1566 \\ frame #2: inline_call`root0.main at root0.zig:32:151575 \\ frame #2: inline_call`root0.main at root0.zig:34:15
1567 ,1576 ,
1568 \\ * frame #0: inline_call`root0.r0pf [inlined] r0cfi(r0cai=14) at root0.zig:29:51577 \\ * frame #0: inline_call`root0.r0pf [inlined] r0cfi(r0cai=14) at root0.zig:30:5
1569 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:7:161578 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:7:16
1570 \\ frame #2: inline_call`root0.main at root0.zig:32:151579 \\ frame #2: inline_call`root0.main at root0.zig:34:15
1571 ,1580 ,
1572 \\ * frame #0: inline_call`root1.r1cf(r1ca=15) at root1.zig:26:51581 \\ * frame #0: inline_call`root1.r1cf(r1ca=15) at root1.zig:26:5
1573 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:8:151582 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:8:15
1574 \\ frame #2: inline_call`root0.main at root0.zig:32:151583 \\ frame #2: inline_call`root0.main at root0.zig:34:15
1575 ,1584 ,
1576 \\ * frame #0: inline_call`root0.r0pf [inlined] r1cfi(r1cai=8) at root1.zig:29:51585 \\ * frame #0: inline_call`root0.r0pf [inlined] r1cfi(r1cai=8) at root1.zig:30:5
1577 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:9:161586 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:9:16
1578 \\ frame #2: inline_call`root0.main at root0.zig:32:151587 \\ frame #2: inline_call`root0.main at root0.zig:34:15
1579 ,1588 ,
1580 \\ * frame #0: inline_call`mod0.m0cf(m0ca=9) at mod0.zig:26:51589 \\ * frame #0: inline_call`mod0.m0cf(m0ca=9) at mod0.zig:26:5
1581 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:10:141590 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:10:14
1582 \\ frame #2: inline_call`root0.main at root0.zig:32:151591 \\ frame #2: inline_call`root0.main at root0.zig:34:15
1583 ,1592 ,
1584 \\ * frame #0: inline_call`root0.r0pf [inlined] m0cfi(m0cai=10) at mod0.zig:29:51593 \\ * frame #0: inline_call`root0.r0pf [inlined] m0cfi(m0cai=10) at mod0.zig:30:5
1585 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:11:151594 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:11:15
1586 \\ frame #2: inline_call`root0.main at root0.zig:32:151595 \\ frame #2: inline_call`root0.main at root0.zig:34:15
1587 ,1596 ,
1588 \\ * frame #0: inline_call`mod1.m1cf(m1ca=11) at mod1.zig:26:51597 \\ * frame #0: inline_call`mod1.m1cf(m1ca=11) at mod1.zig:26:5
1589 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:12:141598 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:12:14
1590 \\ frame #2: inline_call`root0.main at root0.zig:32:151599 \\ frame #2: inline_call`root0.main at root0.zig:34:15
1591 ,1600 ,
1592 \\ * frame #0: inline_call`root0.r0pf [inlined] m1cfi(m1cai=4) at mod1.zig:29:51601 \\ * frame #0: inline_call`root0.r0pf [inlined] m1cfi(m1cai=4) at mod1.zig:30:5
1593 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:13:151602 \\ frame #1: inline_call`root0.r0pf(r0pa=12) at root0.zig:13:15
1594 \\ frame #2: inline_call`root0.main at root0.zig:32:151603 \\ frame #2: inline_call`root0.main at root0.zig:34:15
1595 ,1604 ,
1596 \\ * frame #0: inline_call`root0.r0cf(r0ca=22) at root0.zig:26:51605 \\ * frame #0: inline_call`root0.r0cf(r0ca=22) at root0.zig:26:5
1597 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:16:151606 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:16:15
1598 \\ frame #2: inline_call`root0.main at root0.zig:33:161607 \\ frame #2: inline_call`root0.main at root0.zig:35:16
1599 ,1608 ,
1600 \\ * frame #0: inline_call`root0.main [inlined] r0cfi(r0cai=21) at root0.zig:29:51609 \\ * frame #0: inline_call`root0.main [inlined] r0cfi(r0cai=21) at root0.zig:30:5
1601 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:17:161610 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:17:16
1602 \\ frame #2: inline_call`root0.main at root0.zig:33:161611 \\ frame #2: inline_call`root0.main at root0.zig:35:16
1603 ,1612 ,
1604 \\ * frame #0: inline_call`root1.r1cf(r1ca=20) at root1.zig:26:51613 \\ * frame #0: inline_call`root1.r1cf(r1ca=20) at root1.zig:26:5
1605 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:18:151614 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:18:15
1606 \\ frame #2: inline_call`root0.main at root0.zig:33:161615 \\ frame #2: inline_call`root0.main at root0.zig:35:16
1607 ,1616 ,
1608 \\ * frame #0: inline_call`root0.main [inlined] r1cfi(r1cai=19) at root1.zig:29:51617 \\ * frame #0: inline_call`root0.main [inlined] r1cfi(r1cai=19) at root1.zig:30:5
1609 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:19:161618 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:19:16
1610 \\ frame #2: inline_call`root0.main at root0.zig:33:161619 \\ frame #2: inline_call`root0.main at root0.zig:35:16
1611 ,1620 ,
1612 \\ * frame #0: inline_call`mod0.m0cf(m0ca=18) at mod0.zig:26:51621 \\ * frame #0: inline_call`mod0.m0cf(m0ca=18) at mod0.zig:26:5
1613 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:20:141622 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:20:14
1614 \\ frame #2: inline_call`root0.main at root0.zig:33:161623 \\ frame #2: inline_call`root0.main at root0.zig:35:16
1615 ,1624 ,
1616 \\ * frame #0: inline_call`root0.main [inlined] m0cfi(m0cai=17) at mod0.zig:29:51625 \\ * frame #0: inline_call`root0.main [inlined] m0cfi(m0cai=17) at mod0.zig:30:5
1617 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:21:151626 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:21:15
1618 \\ frame #2: inline_call`root0.main at root0.zig:33:161627 \\ frame #2: inline_call`root0.main at root0.zig:35:16
1619 ,1628 ,
1620 \\ * frame #0: inline_call`mod1.m1cf(m1ca=16) at mod1.zig:26:51629 \\ * frame #0: inline_call`mod1.m1cf(m1ca=16) at mod1.zig:26:5
1621 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:22:141630 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:22:14
1622 \\ frame #2: inline_call`root0.main at root0.zig:33:161631 \\ frame #2: inline_call`root0.main at root0.zig:35:16
1623 ,1632 ,
1624 \\ * frame #0: inline_call`root0.main [inlined] m1cfi(m1cai=31) at mod1.zig:29:51633 \\ * frame #0: inline_call`root0.main [inlined] m1cfi(m1cai=31) at mod1.zig:30:5
1625 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:23:151634 \\ frame #1: inline_call`root0.main [inlined] r0pfi(r0pai=23) at root0.zig:23:15
1626 \\ frame #2: inline_call`root0.main at root0.zig:33:161635 \\ frame #2: inline_call`root0.main at root0.zig:35:16
1627 ,1636 ,
1628 \\ * frame #0: inline_call`root0.r0cf(r0ca=35) at root0.zig:26:51637 \\ * frame #0: inline_call`root0.r0cf(r0ca=35) at root0.zig:26:5
1629 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:6:151638 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:6:15
1630 \\ frame #2: inline_call`root0.main at root0.zig:34:151639 \\ frame #2: inline_call`root0.main at root0.zig:36:15
1631 ,1640 ,
1632 \\ * frame #0: inline_call`root1.r1pf [inlined] r0cfi(r0cai=32) at root0.zig:29:51641 \\ * frame #0: inline_call`root1.r1pf [inlined] r0cfi(r0cai=32) at root0.zig:30:5
1633 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:7:161642 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:7:16
1634 \\ frame #2: inline_call`root0.main at root0.zig:34:151643 \\ frame #2: inline_call`root0.main at root0.zig:36:15
1635 ,1644 ,
1636 \\ * frame #0: inline_call`root1.r1cf(r1ca=33) at root1.zig:26:51645 \\ * frame #0: inline_call`root1.r1cf(r1ca=33) at root1.zig:26:5
1637 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:8:151646 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:8:15
1638 \\ frame #2: inline_call`root0.main at root0.zig:34:151647 \\ frame #2: inline_call`root0.main at root0.zig:36:15
1639 ,1648 ,
1640 \\ * frame #0: inline_call`root1.r1pf [inlined] r1cfi(r1cai=38) at root1.zig:29:51649 \\ * frame #0: inline_call`root1.r1pf [inlined] r1cfi(r1cai=38) at root1.zig:30:5
1641 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:9:161650 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:9:16
1642 \\ frame #2: inline_call`root0.main at root0.zig:34:151651 \\ frame #2: inline_call`root0.main at root0.zig:36:15
1643 ,1652 ,
1644 \\ * frame #0: inline_call`mod0.m0cf(m0ca=39) at mod0.zig:26:51653 \\ * frame #0: inline_call`mod0.m0cf(m0ca=39) at mod0.zig:26:5
1645 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:10:141654 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:10:14
1646 \\ frame #2: inline_call`root0.main at root0.zig:34:151655 \\ frame #2: inline_call`root0.main at root0.zig:36:15
1647 ,1656 ,
1648 \\ * frame #0: inline_call`root1.r1pf [inlined] m0cfi(m0cai=36) at mod0.zig:29:51657 \\ * frame #0: inline_call`root1.r1pf [inlined] m0cfi(m0cai=36) at mod0.zig:30:5
1649 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:11:151658 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:11:15
1650 \\ frame #2: inline_call`root0.main at root0.zig:34:151659 \\ frame #2: inline_call`root0.main at root0.zig:36:15
1651 ,1660 ,
1652 \\ * frame #0: inline_call`mod1.m1cf(m1ca=37) at mod1.zig:26:51661 \\ * frame #0: inline_call`mod1.m1cf(m1ca=37) at mod1.zig:26:5
1653 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:12:141662 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:12:14
1654 \\ frame #2: inline_call`root0.main at root0.zig:34:151663 \\ frame #2: inline_call`root0.main at root0.zig:36:15
1655 ,1664 ,
1656 \\ * frame #0: inline_call`root1.r1pf [inlined] m1cfi(m1cai=42) at mod1.zig:29:51665 \\ * frame #0: inline_call`root1.r1pf [inlined] m1cfi(m1cai=42) at mod1.zig:30:5
1657 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:13:151666 \\ frame #1: inline_call`root1.r1pf(r1pa=34) at root1.zig:13:15
1658 \\ frame #2: inline_call`root0.main at root0.zig:34:151667 \\ frame #2: inline_call`root0.main at root0.zig:36:15
1659 ,1668 ,
1660 \\ * frame #0: inline_call`root0.r0cf(r0ca=44) at root0.zig:26:51669 \\ * frame #0: inline_call`root0.r0cf(r0ca=44) at root0.zig:26:5
1661 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:16:151670 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:16:15
1662 \\ frame #2: inline_call`root0.main at root0.zig:35:161671 \\ frame #2: inline_call`root0.main at root0.zig:37:16
1663 ,1672 ,
1664 \\ * frame #0: inline_call`root0.main [inlined] r0cfi(r0cai=47) at root0.zig:29:51673 \\ * frame #0: inline_call`root0.main [inlined] r0cfi(r0cai=47) at root0.zig:30:5
1665 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:17:161674 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:17:16
1666 \\ frame #2: inline_call`root0.main at root0.zig:35:161675 \\ frame #2: inline_call`root0.main at root0.zig:37:16
1667 ,1676 ,
1668 \\ * frame #0: inline_call`root1.r1cf(r1ca=46) at root1.zig:26:51677 \\ * frame #0: inline_call`root1.r1cf(r1ca=46) at root1.zig:26:5
1669 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:18:151678 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:18:15
1670 \\ frame #2: inline_call`root0.main at root0.zig:35:161679 \\ frame #2: inline_call`root0.main at root0.zig:37:16
1671 ,1680 ,
1672 \\ * frame #0: inline_call`root0.main [inlined] r1cfi(r1cai=41) at root1.zig:29:51681 \\ * frame #0: inline_call`root0.main [inlined] r1cfi(r1cai=41) at root1.zig:30:5
1673 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:19:161682 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:19:16
1674 \\ frame #2: inline_call`root0.main at root0.zig:35:161683 \\ frame #2: inline_call`root0.main at root0.zig:37:16
1675 ,1684 ,
1676 \\ * frame #0: inline_call`mod0.m0cf(m0ca=40) at mod0.zig:26:51685 \\ * frame #0: inline_call`mod0.m0cf(m0ca=40) at mod0.zig:26:5
1677 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:20:141686 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:20:14
1678 \\ frame #2: inline_call`root0.main at root0.zig:35:161687 \\ frame #2: inline_call`root0.main at root0.zig:37:16
1679 ,1688 ,
1680 \\ * frame #0: inline_call`root0.main [inlined] m0cfi(m0cai=43) at mod0.zig:29:51689 \\ * frame #0: inline_call`root0.main [inlined] m0cfi(m0cai=43) at mod0.zig:30:5
1681 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:21:151690 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:21:15
1682 \\ frame #2: inline_call`root0.main at root0.zig:35:161691 \\ frame #2: inline_call`root0.main at root0.zig:37:16
1683 ,1692 ,
1684 \\ * frame #0: inline_call`mod1.m1cf(m1ca=42) at mod1.zig:26:51693 \\ * frame #0: inline_call`mod1.m1cf(m1ca=42) at mod1.zig:26:5
1685 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:22:141694 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:22:14
1686 \\ frame #2: inline_call`root0.main at root0.zig:35:161695 \\ frame #2: inline_call`root0.main at root0.zig:37:16
1687 ,1696 ,
1688 \\ * frame #0: inline_call`root0.main [inlined] m1cfi(m1cai=37) at mod1.zig:29:51697 \\ * frame #0: inline_call`root0.main [inlined] m1cfi(m1cai=37) at mod1.zig:30:5
1689 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:23:151698 \\ frame #1: inline_call`root0.main [inlined] r1pfi(r1pai=45) at root1.zig:23:15
1690 \\ frame #2: inline_call`root0.main at root0.zig:35:161699 \\ frame #2: inline_call`root0.main at root0.zig:37:16
1691 ,1700 ,
1692 \\ * frame #0: inline_call`root0.r0cf(r0ca=57) at root0.zig:26:51701 \\ * frame #0: inline_call`root0.r0cf(r0ca=57) at root0.zig:26:5
1693 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:6:151702 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:6:15
1694 \\ frame #2: inline_call`root0.main at root0.zig:36:141703 \\ frame #2: inline_call`root0.main at root0.zig:38:14
1695 ,1704 ,
1696 \\ * frame #0: inline_call`mod0.m0pf [inlined] r0cfi(r0cai=58) at root0.zig:29:51705 \\ * frame #0: inline_call`mod0.m0pf [inlined] r0cfi(r0cai=58) at root0.zig:30:5
1697 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:7:161706 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:7:16
1698 \\ frame #2: inline_call`root0.main at root0.zig:36:141707 \\ frame #2: inline_call`root0.main at root0.zig:38:14
1699 ,1708 ,
1700 \\ * frame #0: inline_call`root1.r1cf(r1ca=59) at root1.zig:26:51709 \\ * frame #0: inline_call`root1.r1cf(r1ca=59) at root1.zig:26:5
1701 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:8:151710 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:8:15
1702 \\ frame #2: inline_call`root0.main at root0.zig:36:141711 \\ frame #2: inline_call`root0.main at root0.zig:38:14
1703 ,1712 ,
1704 \\ * frame #0: inline_call`mod0.m0pf [inlined] r1cfi(r1cai=60) at root1.zig:29:51713 \\ * frame #0: inline_call`mod0.m0pf [inlined] r1cfi(r1cai=60) at root1.zig:30:5
1705 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:9:161714 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:9:16
1706 \\ frame #2: inline_call`root0.main at root0.zig:36:141715 \\ frame #2: inline_call`root0.main at root0.zig:38:14
1707 ,1716 ,
1708 \\ * frame #0: inline_call`mod0.m0cf(m0ca=61) at mod0.zig:26:51717 \\ * frame #0: inline_call`mod0.m0cf(m0ca=61) at mod0.zig:26:5
1709 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:10:141718 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:10:14
1710 \\ frame #2: inline_call`root0.main at root0.zig:36:141719 \\ frame #2: inline_call`root0.main at root0.zig:38:14
1711 ,1720 ,
1712 \\ * frame #0: inline_call`mod0.m0pf [inlined] m0cfi(m0cai=62) at mod0.zig:29:51721 \\ * frame #0: inline_call`mod0.m0pf [inlined] m0cfi(m0cai=62) at mod0.zig:30:5
1713 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:11:151722 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:11:15
1714 \\ frame #2: inline_call`root0.main at root0.zig:36:141723 \\ frame #2: inline_call`root0.main at root0.zig:38:14
1715 ,1724 ,
1716 \\ * frame #0: inline_call`mod1.m1cf(m1ca=63) at mod1.zig:26:51725 \\ * frame #0: inline_call`mod1.m1cf(m1ca=63) at mod1.zig:26:5
1717 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:12:141726 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:12:14
1718 \\ frame #2: inline_call`root0.main at root0.zig:36:141727 \\ frame #2: inline_call`root0.main at root0.zig:38:14
1719 ,1728 ,
1720 \\ * frame #0: inline_call`mod0.m0pf [inlined] m1cfi(m1cai=48) at mod1.zig:29:51729 \\ * frame #0: inline_call`mod0.m0pf [inlined] m1cfi(m1cai=48) at mod1.zig:30:5
1721 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:13:151730 \\ frame #1: inline_call`mod0.m0pf(m0pa=56) at mod0.zig:13:15
1722 \\ frame #2: inline_call`root0.main at root0.zig:36:141731 \\ frame #2: inline_call`root0.main at root0.zig:38:14
1723 ,1732 ,
1724 \\ * frame #0: inline_call`root0.r0cf(r0ca=66) at root0.zig:26:51733 \\ * frame #0: inline_call`root0.r0cf(r0ca=66) at root0.zig:26:5
1725 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:16:151734 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:16:15
1726 \\ frame #2: inline_call`root0.main at root0.zig:37:151735 \\ frame #2: inline_call`root0.main at root0.zig:39:15
1727 ,1736 ,
1728 \\ * frame #0: inline_call`root0.main [inlined] r0cfi(r0cai=65) at root0.zig:29:51737 \\ * frame #0: inline_call`root0.main [inlined] r0cfi(r0cai=65) at root0.zig:30:5
1729 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:17:161738 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:17:16
1730 \\ frame #2: inline_call`root0.main at root0.zig:37:151739 \\ frame #2: inline_call`root0.main at root0.zig:39:15
1731 ,1740 ,
1732 \\ * frame #0: inline_call`root1.r1cf(r1ca=64) at root1.zig:26:51741 \\ * frame #0: inline_call`root1.r1cf(r1ca=64) at root1.zig:26:5
1733 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:18:151742 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:18:15
1734 \\ frame #2: inline_call`root0.main at root0.zig:37:151743 \\ frame #2: inline_call`root0.main at root0.zig:39:15
1735 ,1744 ,
1736 \\ * frame #0: inline_call`root0.main [inlined] r1cfi(r1cai=71) at root1.zig:29:51745 \\ * frame #0: inline_call`root0.main [inlined] r1cfi(r1cai=71) at root1.zig:30:5
1737 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:19:161746 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:19:16
1738 \\ frame #2: inline_call`root0.main at root0.zig:37:151747 \\ frame #2: inline_call`root0.main at root0.zig:39:15
1739 ,1748 ,
1740 \\ * frame #0: inline_call`mod0.m0cf(m0ca=70) at mod0.zig:26:51749 \\ * frame #0: inline_call`mod0.m0cf(m0ca=70) at mod0.zig:26:5
1741 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:20:141750 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:20:14
1742 \\ frame #2: inline_call`root0.main at root0.zig:37:151751 \\ frame #2: inline_call`root0.main at root0.zig:39:15
1743 ,1752 ,
1744 \\ * frame #0: inline_call`root0.main [inlined] m0cfi(m0cai=69) at mod0.zig:29:51753 \\ * frame #0: inline_call`root0.main [inlined] m0cfi(m0cai=69) at mod0.zig:30:5
1745 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:21:151754 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:21:15
1746 \\ frame #2: inline_call`root0.main at root0.zig:37:151755 \\ frame #2: inline_call`root0.main at root0.zig:39:15
1747 ,1756 ,
1748 \\ * frame #0: inline_call`mod1.m1cf(m1ca=68) at mod1.zig:26:51757 \\ * frame #0: inline_call`mod1.m1cf(m1ca=68) at mod1.zig:26:5
1749 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:22:141758 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:22:14
1750 \\ frame #2: inline_call`root0.main at root0.zig:37:151759 \\ frame #2: inline_call`root0.main at root0.zig:39:15
1751 ,1760 ,
1752 \\ * frame #0: inline_call`root0.main [inlined] m1cfi(m1cai=75) at mod1.zig:29:51761 \\ * frame #0: inline_call`root0.main [inlined] m1cfi(m1cai=75) at mod1.zig:30:5
1753 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:23:151762 \\ frame #1: inline_call`root0.main [inlined] m0pfi(m0pai=67) at mod0.zig:23:15
1754 \\ frame #2: inline_call`root0.main at root0.zig:37:151763 \\ frame #2: inline_call`root0.main at root0.zig:39:15
1755 ,1764 ,
1756 \\ * frame #0: inline_call`root0.r0cf(r0ca=79) at root0.zig:26:51765 \\ * frame #0: inline_call`root0.r0cf(r0ca=79) at root0.zig:26:5
1757 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:6:151766 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:6:15
1758 \\ frame #2: inline_call`root0.main at root0.zig:38:141767 \\ frame #2: inline_call`root0.main at root0.zig:40:14
1759 ,1768 ,
1760 \\ * frame #0: inline_call`mod1.m1pf [inlined] r0cfi(r0cai=76) at root0.zig:29:51769 \\ * frame #0: inline_call`mod1.m1pf [inlined] r0cfi(r0cai=76) at root0.zig:30:5
1761 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:7:161770 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:7:16
1762 \\ frame #2: inline_call`root0.main at root0.zig:38:141771 \\ frame #2: inline_call`root0.main at root0.zig:40:14
1763 ,1772 ,
1764 \\ * frame #0: inline_call`root1.r1cf(r1ca=77) at root1.zig:26:51773 \\ * frame #0: inline_call`root1.r1cf(r1ca=77) at root1.zig:26:5
1765 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:8:151774 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:8:15
1766 \\ frame #2: inline_call`root0.main at root0.zig:38:141775 \\ frame #2: inline_call`root0.main at root0.zig:40:14
1767 ,1776 ,
1768 \\ * frame #0: inline_call`mod1.m1pf [inlined] r1cfi(r1cai=74) at root1.zig:29:51777 \\ * frame #0: inline_call`mod1.m1pf [inlined] r1cfi(r1cai=74) at root1.zig:30:5
1769 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:9:161778 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:9:16
1770 \\ frame #2: inline_call`root0.main at root0.zig:38:141779 \\ frame #2: inline_call`root0.main at root0.zig:40:14
1771 ,1780 ,
1772 \\ * frame #0: inline_call`mod0.m0cf(m0ca=75) at mod0.zig:26:51781 \\ * frame #0: inline_call`mod0.m0cf(m0ca=75) at mod0.zig:26:5
1773 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:10:141782 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:10:14
1774 \\ frame #2: inline_call`root0.main at root0.zig:38:141783 \\ frame #2: inline_call`root0.main at root0.zig:40:14
1775 ,1784 ,
1776 \\ * frame #0: inline_call`mod1.m1pf [inlined] m0cfi(m0cai=72) at mod0.zig:29:51785 \\ * frame #0: inline_call`mod1.m1pf [inlined] m0cfi(m0cai=72) at mod0.zig:30:5
1777 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:11:151786 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:11:15
1778 \\ frame #2: inline_call`root0.main at root0.zig:38:141787 \\ frame #2: inline_call`root0.main at root0.zig:40:14
1779 ,1788 ,
1780 \\ * frame #0: inline_call`mod1.m1cf(m1ca=73) at mod1.zig:26:51789 \\ * frame #0: inline_call`mod1.m1cf(m1ca=73) at mod1.zig:26:5
1781 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:12:141790 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:12:14
1782 \\ frame #2: inline_call`root0.main at root0.zig:38:141791 \\ frame #2: inline_call`root0.main at root0.zig:40:14
1783 ,1792 ,
1784 \\ * frame #0: inline_call`mod1.m1pf [inlined] m1cfi(m1cai=70) at mod1.zig:29:51793 \\ * frame #0: inline_call`mod1.m1pf [inlined] m1cfi(m1cai=70) at mod1.zig:30:5
1785 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:13:151794 \\ frame #1: inline_call`mod1.m1pf(m1pa=78) at mod1.zig:13:15
1786 \\ frame #2: inline_call`root0.main at root0.zig:38:141795 \\ frame #2: inline_call`root0.main at root0.zig:40:14
1787 ,1796 ,
1788 \\ * frame #0: inline_call`root0.r0cf(r0ca=88) at root0.zig:26:51797 \\ * frame #0: inline_call`root0.r0cf(r0ca=88) at root0.zig:26:5
1789 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:16:151798 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:16:15
1790 \\ frame #2: inline_call`root0.main at root0.zig:39:151799 \\ frame #2: inline_call`root0.main at root0.zig:41:15
1791 ,1800 ,
1792 \\ * frame #0: inline_call`root0.main [inlined] r0cfi(r0cai=91) at root0.zig:29:51801 \\ * frame #0: inline_call`root0.main [inlined] r0cfi(r0cai=91) at root0.zig:30:5
1793 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:17:161802 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:17:16
1794 \\ frame #2: inline_call`root0.main at root0.zig:39:151803 \\ frame #2: inline_call`root0.main at root0.zig:41:15
1795 ,1804 ,
1796 \\ * frame #0: inline_call`root1.r1cf(r1ca=90) at root1.zig:26:51805 \\ * frame #0: inline_call`root1.r1cf(r1ca=90) at root1.zig:26:5
1797 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:18:151806 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:18:15
1798 \\ frame #2: inline_call`root0.main at root0.zig:39:151807 \\ frame #2: inline_call`root0.main at root0.zig:41:15
1799 ,1808 ,
1800 \\ * frame #0: inline_call`root0.main [inlined] r1cfi(r1cai=93) at root1.zig:29:51809 \\ * frame #0: inline_call`root0.main [inlined] r1cfi(r1cai=93) at root1.zig:30:5
1801 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:19:161810 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:19:16
1802 \\ frame #2: inline_call`root0.main at root0.zig:39:151811 \\ frame #2: inline_call`root0.main at root0.zig:41:15
1803 ,1812 ,
1804 \\ * frame #0: inline_call`mod0.m0cf(m0ca=92) at mod0.zig:26:51813 \\ * frame #0: inline_call`mod0.m0cf(m0ca=92) at mod0.zig:26:5
1805 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:20:141814 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:20:14
1806 \\ frame #2: inline_call`root0.main at root0.zig:39:151815 \\ frame #2: inline_call`root0.main at root0.zig:41:15
1807 ,1816 ,
1808 \\ * frame #0: inline_call`root0.main [inlined] m0cfi(m0cai=95) at mod0.zig:29:51817 \\ * frame #0: inline_call`root0.main [inlined] m0cfi(m0cai=95) at mod0.zig:30:5
1809 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:21:151818 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:21:15
1810 \\ frame #2: inline_call`root0.main at root0.zig:39:151819 \\ frame #2: inline_call`root0.main at root0.zig:41:15
1811 ,1820 ,
1812 \\ * frame #0: inline_call`mod1.m1cf(m1ca=94) at mod1.zig:26:51821 \\ * frame #0: inline_call`mod1.m1cf(m1ca=94) at mod1.zig:26:5
1813 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:22:141822 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:22:14
1814 \\ frame #2: inline_call`root0.main at root0.zig:39:151823 \\ frame #2: inline_call`root0.main at root0.zig:41:15
1815 ,1824 ,
1816 \\ * frame #0: inline_call`root0.main [inlined] m1cfi(m1cai=81) at mod1.zig:29:51825 \\ * frame #0: inline_call`root0.main [inlined] m1cfi(m1cai=81) at mod1.zig:30:5
1817 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:23:151826 \\ frame #1: inline_call`root0.main [inlined] m1pfi(m1pai=89) at mod1.zig:23:15
1818 \\ frame #2: inline_call`root0.main at root0.zig:39:151827 \\ frame #2: inline_call`root0.main at root0.zig:41:15
1819 },1828 },
1820 );1829 );
1821 db.addLldbTest(1830 db.addLldbTest(