authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-24 14:00:15-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-24 21:02:32-05:00
logc7433212d1bf96adbfc6f3d706404436c0c98c20
tree304a40ecffbb474aad12cf4fad371959042034a5
parent7701cfa032a0d3611310426d5a5027d8862d49b1

x86_64: rewrite scalar and vector int `@min` and `@max`


12 files changed, 6183 insertions(+), 217 deletions(-)

lib/std/zig/Zir.zig+17-1
......@@ -2128,7 +2128,7 @@ pub const Inst = struct {
21282128 ref_start_index = static_len,
21292129 _,
21302130
2131 pub const static_len = 76;
2131 pub const static_len = 92;
21322132
21332133 pub fn toRef(i: Index) Inst.Ref {
21342134 return @enumFromInt(@intFromEnum(Index.ref_start_index) + @intFromEnum(i));
......@@ -2211,6 +2211,22 @@ pub const Inst = struct {
22112211 single_const_pointer_to_comptime_int_type,
22122212 slice_const_u8_type,
22132213 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,
22142230 vector_4_f16_type,
22152231 vector_8_f16_type,
22162232 vector_4_f32_type,
src/Air.zig+16
......@@ -984,6 +984,22 @@ pub const Inst = struct {
984984 single_const_pointer_to_comptime_int_type = @intFromEnum(InternPool.Index.single_const_pointer_to_comptime_int_type),
985985 slice_const_u8_type = @intFromEnum(InternPool.Index.slice_const_u8_type),
986986 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),
9871003 vector_4_f16_type = @intFromEnum(InternPool.Index.vector_4_f16_type),
9881004 vector_8_f16_type = @intFromEnum(InternPool.Index.vector_8_f16_type),
9891005 vector_4_f32_type = @intFromEnum(InternPool.Index.vector_4_f32_type),
src/InternPool.zig+80
......@@ -4567,6 +4567,22 @@ pub const Index = enum(u32) {
45674567 slice_const_u8_type,
45684568 slice_const_u8_sentinel_0_type,
45694569
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,
45704586 vector_4_f16_type,
45714587 vector_8_f16_type,
45724588 vector_4_f32_type,
......@@ -5064,6 +5080,38 @@ pub const static_keys = [_]Key{
50645080 },
50655081 } },
50665082
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 } },
50675115 // @Vector(4, f16)
50685116 .{ .vector_type = .{ .len = 4, .child = .f16_type } },
50695117 // @Vector(8, f16)
......@@ -11703,6 +11751,22 @@ pub fn typeOf(ip: *const InternPool, index: Index) Index {
1170311751 .single_const_pointer_to_comptime_int_type,
1170411752 .slice_const_u8_type,
1170511753 .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,
1170611770 .vector_4_f16_type,
1170711771 .vector_8_f16_type,
1170811772 .vector_4_f32_type,
......@@ -12026,6 +12090,22 @@ pub fn zigTypeTag(ip: *const InternPool, index: Index) std.builtin.TypeId {
1202612090 .slice_const_u8_sentinel_0_type,
1202712091 => .pointer,
1202812092
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,
1202912109 .vector_4_f16_type,
1203012110 .vector_8_f16_type,
1203112111 .vector_4_f32_type,
src/Sema.zig+16
......@@ -36611,6 +36611,22 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
3661136611 .single_const_pointer_to_comptime_int_type,
3661236612 .slice_const_u8_type,
3661336613 .slice_const_u8_sentinel_0_type,
36614 .vector_16_i8_type,
36615 .vector_32_i8_type,
36616 .vector_16_u8_type,
36617 .vector_32_u8_type,
36618 .vector_8_i16_type,
36619 .vector_16_i16_type,
36620 .vector_8_u16_type,
36621 .vector_16_u16_type,
36622 .vector_4_i32_type,
36623 .vector_8_i32_type,
36624 .vector_4_u32_type,
36625 .vector_8_u32_type,
36626 .vector_2_i64_type,
36627 .vector_4_i64_type,
36628 .vector_2_u64_type,
36629 .vector_4_u64_type,
3661436630 .vector_4_f16_type,
3661536631 .vector_8_f16_type,
3661636632 .vector_4_f32_type,
src/Type.zig+16
......@@ -4175,6 +4175,22 @@ pub const single_const_pointer_to_comptime_int: Type = .{
41754175};
41764176pub const slice_const_u8_sentinel_0: Type = .{ .ip_index = .slice_const_u8_sentinel_0_type };
41774177
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 };
41784194pub const vector_4_f16: Type = .{ .ip_index = .vector_4_f16_type };
41794195pub const vector_8_f16: Type = .{ .ip_index = .vector_8_f16_type };
41804196pub const vector_4_f32: Type = .{ .ip_index = .vector_4_f32_type };
src/arch/x86_64/CodeGen.zig+5407-175
......@@ -2393,7 +2393,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
23932393}
23942394
23952395fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2396 @setEvalBranchQuota(2_700);
2396 @setEvalBranchQuota(3_400);
23972397 const pt = cg.pt;
23982398 const zcu = pt.zcu;
23992399 const ip = &zcu.intern_pool;
......@@ -2433,8 +2433,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24332433 .add_wrap,
24342434 .sub,
24352435 .sub_wrap,
2436 .min,
2437 .max,
24382436 => |air_tag| try cg.airBinOp(inst, air_tag),
24392437
24402438 .shr, .shr_exact => try cg.airShlShrBinOp(inst),
......@@ -2554,231 +2552,5396 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
25542552 var res: [1]Temp = undefined;
25552553 if (ty_pl.ty.toType().elemType2(zcu).hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{ty_pl.ty.toType()}, &ops, comptime &.{ .{
25562554 .patterns = &.{
2557 .{ .src = .{ .to_gpr, .simm32 } },
2555 .{ .src = .{ .to_gpr, .simm32 } },
2556 },
2557 .dst_temps = .{.{ .rc = .general_purpose }},
2558 .each = .{ .once = &.{
2559 .{ ._, ._, .lea, .dst0p, .leaa(.none, .src0, .add_src0_elem_size_times_src1), ._, ._ },
2560 } },
2561 }, .{
2562 .dst_constraints = .{.{ .elem_size_is = 1 }},
2563 .patterns = &.{
2564 .{ .src = .{ .to_gpr, .to_gpr } },
2565 },
2566 .dst_temps = .{.{ .rc = .general_purpose }},
2567 .each = .{ .once = &.{
2568 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
2569 } },
2570 }, .{
2571 .dst_constraints = .{.{ .elem_size_is = 2 }},
2572 .patterns = &.{
2573 .{ .src = .{ .to_gpr, .to_gpr } },
2574 },
2575 .dst_temps = .{.{ .rc = .general_purpose }},
2576 .each = .{ .once = &.{
2577 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"2", .src1), ._, ._ },
2578 } },
2579 }, .{
2580 .dst_constraints = .{.{ .elem_size_is = 2 + 1 }},
2581 .patterns = &.{
2582 .{ .src = .{ .to_gpr, .to_gpr } },
2583 },
2584 .dst_temps = .{.{ .rc = .general_purpose }},
2585 .each = .{ .once = &.{
2586 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"2", .src1), ._, ._ },
2587 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2588 } },
2589 }, .{
2590 .dst_constraints = .{.{ .elem_size_is = 4 }},
2591 .patterns = &.{
2592 .{ .src = .{ .to_gpr, .to_gpr } },
2593 },
2594 .dst_temps = .{.{ .rc = .general_purpose }},
2595 .each = .{ .once = &.{
2596 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"4", .src1), ._, ._ },
2597 } },
2598 }, .{
2599 .dst_constraints = .{.{ .elem_size_is = 4 + 1 }},
2600 .patterns = &.{
2601 .{ .src = .{ .to_gpr, .to_gpr } },
2602 },
2603 .dst_temps = .{.{ .ref = .src1 }},
2604 .each = .{ .once = &.{
2605 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"4", .src1), ._, ._ },
2606 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2607 } },
2608 }, .{
2609 .required_features = .{ .@"64bit", null, null, null },
2610 .dst_constraints = .{.{ .elem_size_is = 8 }},
2611 .patterns = &.{
2612 .{ .src = .{ .to_gpr, .to_gpr } },
2613 },
2614 .dst_temps = .{.{ .rc = .general_purpose }},
2615 .each = .{ .once = &.{
2616 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"8", .src1), ._, ._ },
2617 } },
2618 }, .{
2619 .required_features = .{ .@"64bit", null, null, null },
2620 .dst_constraints = .{.{ .elem_size_is = 8 + 1 }},
2621 .patterns = &.{
2622 .{ .src = .{ .to_gpr, .to_gpr } },
2623 },
2624 .dst_temps = .{.{ .ref = .src1 }},
2625 .each = .{ .once = &.{
2626 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"8", .src1), ._, ._ },
2627 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2628 } },
2629 }, .{
2630 .dst_constraints = .{.po2_elem_size},
2631 .patterns = &.{
2632 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2633 },
2634 .dst_temps = .{.{ .ref = .src1 }},
2635 .clobbers = .{ .eflags = true },
2636 .each = .{ .once = &.{
2637 .{ ._, ._l, .sh, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ },
2638 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
2639 } },
2640 }, .{
2641 .patterns = &.{
2642 .{ .src = .{ .to_gpr, .to_gpr } },
2643 },
2644 .dst_temps = .{.{ .rc = .general_purpose }},
2645 .clobbers = .{ .eflags = true },
2646 .each = .{ .once = &.{
2647 .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .add_src0_elem_size), ._ },
2648 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2649 } },
2650 } }) catch |err| switch (err) {
2651 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
2652 @tagName(air_tag),
2653 cg.typeOf(bin_op.lhs).fmt(pt),
2654 ops[0].tracking(cg),
2655 ops[1].tracking(cg),
2656 }),
2657 else => |e| return e,
2658 } else { // hack around Sema OPV bugs
2659 res[0] = ops[0];
2660 }
2661 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
2662 },
2663 .ptr_sub => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else {
2664 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
2665 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
2666 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
2667 try ops[0].toSlicePtr(cg);
2668 var res: [1]Temp = undefined;
2669 if (ty_pl.ty.toType().elemType2(zcu).hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{ty_pl.ty.toType()}, &ops, comptime &.{ .{
2670 .patterns = &.{
2671 .{ .src = .{ .to_gpr, .simm32 } },
2672 },
2673 .dst_temps = .{.{ .rc = .general_purpose }},
2674 .each = .{ .once = &.{
2675 .{ ._, ._, .lea, .dst0p, .leaa(.none, .src0, .sub_src0_elem_size_times_src1), ._, ._ },
2676 } },
2677 }, .{
2678 .dst_constraints = .{.{ .elem_size_is = 1 }},
2679 .patterns = &.{
2680 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2681 },
2682 .dst_temps = .{.{ .ref = .src1 }},
2683 .clobbers = .{ .eflags = true },
2684 .each = .{ .once = &.{
2685 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2686 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
2687 } },
2688 }, .{
2689 .dst_constraints = .{.{ .elem_size_is = 2 }},
2690 .patterns = &.{
2691 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2692 },
2693 .dst_temps = .{.{ .ref = .src1 }},
2694 .clobbers = .{ .eflags = true },
2695 .each = .{ .once = &.{
2696 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2697 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"2", .src1), ._, ._ },
2698 } },
2699 }, .{
2700 .dst_constraints = .{.{ .elem_size_is = 2 + 1 }},
2701 .patterns = &.{
2702 .{ .src = .{ .to_gpr, .to_gpr } },
2703 },
2704 .dst_temps = .{.{ .rc = .general_purpose }},
2705 .clobbers = .{ .eflags = true },
2706 .each = .{ .once = &.{
2707 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"2", .src1), ._, ._ },
2708 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2709 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2710 } },
2711 }, .{
2712 .dst_constraints = .{.{ .elem_size_is = 4 }},
2713 .patterns = &.{
2714 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2715 },
2716 .dst_temps = .{.{ .ref = .src1 }},
2717 .clobbers = .{ .eflags = true },
2718 .each = .{ .once = &.{
2719 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2720 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"4", .src1), ._, ._ },
2721 } },
2722 }, .{
2723 .dst_constraints = .{.{ .elem_size_is = 4 + 1 }},
2724 .patterns = &.{
2725 .{ .src = .{ .to_gpr, .to_gpr } },
2726 },
2727 .dst_temps = .{.{ .rc = .general_purpose }},
2728 .clobbers = .{ .eflags = true },
2729 .each = .{ .once = &.{
2730 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"4", .src1), ._, ._ },
2731 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2732 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2733 } },
2734 }, .{
2735 .required_features = .{ .@"64bit", null, null, null },
2736 .dst_constraints = .{.{ .elem_size_is = 8 }},
2737 .patterns = &.{
2738 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2739 },
2740 .dst_temps = .{.{ .ref = .src1 }},
2741 .clobbers = .{ .eflags = true },
2742 .each = .{ .once = &.{
2743 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2744 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"8", .src1), ._, ._ },
2745 } },
2746 }, .{
2747 .required_features = .{ .@"64bit", null, null, null },
2748 .dst_constraints = .{.{ .elem_size_is = 8 + 1 }},
2749 .patterns = &.{
2750 .{ .src = .{ .to_gpr, .to_gpr } },
2751 },
2752 .dst_temps = .{.{ .rc = .general_purpose }},
2753 .clobbers = .{ .eflags = true },
2754 .each = .{ .once = &.{
2755 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"8", .src1), ._, ._ },
2756 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2757 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2758 } },
2759 }, .{
2760 .dst_constraints = .{.po2_elem_size},
2761 .patterns = &.{
2762 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2763 },
2764 .dst_temps = .{.{ .ref = .src1 }},
2765 .clobbers = .{ .eflags = true },
2766 .each = .{ .once = &.{
2767 .{ ._, ._l, .sa, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ },
2768 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2769 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
2770 } },
2771 }, .{
2772 .patterns = &.{
2773 .{ .src = .{ .to_gpr, .to_gpr } },
2774 },
2775 .dst_temps = .{.{ .rc = .general_purpose }},
2776 .clobbers = .{ .eflags = true },
2777 .each = .{ .once = &.{
2778 .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .sub_src0_elem_size), ._ },
2779 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2780 } },
2781 } }) catch |err| switch (err) {
2782 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
2783 @tagName(air_tag),
2784 cg.typeOf(bin_op.lhs).fmt(pt),
2785 ops[0].tracking(cg),
2786 ops[1].tracking(cg),
2787 }),
2788 else => |e| return e,
2789 } else {
2790 // hack around Sema OPV bugs
2791 res[0] = ops[0];
2792 }
2793 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
2794 },
2795 .max => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else fallback: {
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);
2798 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
2799 var res: [1]Temp = undefined;
2800 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
2801 .required_features = .{ .cmov, null, null, null },
2802 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } },
2803 .patterns = &.{
2804 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2805 },
2806 .dst_temps = .{.{ .ref = .src0 }},
2807 .clobbers = .{ .eflags = true },
2808 .each = .{ .once = &.{
2809 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
2810 .{ ._, ._l, .cmov, .dst0d, .src1d, ._, ._ },
2811 } },
2812 }, .{
2813 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } },
2814 .patterns = &.{
2815 .{ .src = .{ .to_mut_gpr, .mem } },
2816 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2817 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2818 },
2819 .dst_temps = .{.{ .ref = .src0 }},
2820 .clobbers = .{ .eflags = true },
2821 .each = .{ .once = &.{
2822 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
2823 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
2824 .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ },
2825 } },
2826 }, .{
2827 .required_features = .{ .cmov, null, null, null },
2828 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } },
2829 .patterns = &.{
2830 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2831 },
2832 .dst_temps = .{.{ .ref = .src0 }},
2833 .clobbers = .{ .eflags = true },
2834 .each = .{ .once = &.{
2835 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
2836 .{ ._, ._b, .cmov, .dst0d, .src1d, ._, ._ },
2837 } },
2838 }, .{
2839 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } },
2840 .patterns = &.{
2841 .{ .src = .{ .to_mut_gpr, .mem } },
2842 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2843 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2844 },
2845 .dst_temps = .{.{ .ref = .src0 }},
2846 .clobbers = .{ .eflags = true },
2847 .each = .{ .once = &.{
2848 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
2849 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
2850 .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ },
2851 } },
2852 }, .{
2853 .required_features = .{ .cmov, null, null, null },
2854 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } },
2855 .patterns = &.{
2856 .{ .src = .{ .to_mut_gpr, .mem } },
2857 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2858 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2859 },
2860 .dst_temps = .{.{ .ref = .src0 }},
2861 .clobbers = .{ .eflags = true },
2862 .each = .{ .once = &.{
2863 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
2864 .{ ._, ._l, .cmov, .dst0w, .src1w, ._, ._ },
2865 } },
2866 }, .{
2867 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } },
2868 .patterns = &.{
2869 .{ .src = .{ .to_mut_gpr, .mem } },
2870 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2871 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2872 },
2873 .dst_temps = .{.{ .ref = .src0 }},
2874 .clobbers = .{ .eflags = true },
2875 .each = .{ .once = &.{
2876 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
2877 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
2878 .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ },
2879 } },
2880 }, .{
2881 .required_features = .{ .cmov, null, null, null },
2882 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } },
2883 .patterns = &.{
2884 .{ .src = .{ .to_mut_gpr, .mem } },
2885 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2886 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2887 },
2888 .dst_temps = .{.{ .ref = .src0 }},
2889 .clobbers = .{ .eflags = true },
2890 .each = .{ .once = &.{
2891 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
2892 .{ ._, ._b, .cmov, .dst0w, .src1w, ._, ._ },
2893 } },
2894 }, .{
2895 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } },
2896 .patterns = &.{
2897 .{ .src = .{ .to_mut_gpr, .mem } },
2898 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2899 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2900 },
2901 .dst_temps = .{.{ .ref = .src0 }},
2902 .clobbers = .{ .eflags = true },
2903 .each = .{ .once = &.{
2904 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
2905 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
2906 .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ },
2907 } },
2908 }, .{
2909 .required_features = .{ .cmov, null, null, null },
2910 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } },
2911 .patterns = &.{
2912 .{ .src = .{ .to_mut_gpr, .mem } },
2913 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2914 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2915 },
2916 .dst_temps = .{.{ .ref = .src0 }},
2917 .clobbers = .{ .eflags = true },
2918 .each = .{ .once = &.{
2919 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
2920 .{ ._, ._l, .cmov, .dst0d, .src1d, ._, ._ },
2921 } },
2922 }, .{
2923 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } },
2924 .patterns = &.{
2925 .{ .src = .{ .to_mut_gpr, .mem } },
2926 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2927 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2928 },
2929 .dst_temps = .{.{ .ref = .src0 }},
2930 .clobbers = .{ .eflags = true },
2931 .each = .{ .once = &.{
2932 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
2933 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
2934 .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ },
2935 } },
2936 }, .{
2937 .required_features = .{ .cmov, null, null, null },
2938 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } },
2939 .patterns = &.{
2940 .{ .src = .{ .to_mut_gpr, .mem } },
2941 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2942 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2943 },
2944 .dst_temps = .{.{ .ref = .src0 }},
2945 .clobbers = .{ .eflags = true },
2946 .each = .{ .once = &.{
2947 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
2948 .{ ._, ._b, .cmov, .dst0d, .src1d, ._, ._ },
2949 } },
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 } },
2956 },
2957 .dst_temps = .{.{ .ref = .src0 }},
2958 .clobbers = .{ .eflags = true },
2959 .each = .{ .once = &.{
2960 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
2961 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
2962 .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ },
2963 } },
2964 }, .{
2965 .required_features = .{ .@"64bit", .cmov, null, null },
2966 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } },
2967 .patterns = &.{
2968 .{ .src = .{ .to_mut_gpr, .mem } },
2969 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2970 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2971 },
2972 .dst_temps = .{.{ .ref = .src0 }},
2973 .clobbers = .{ .eflags = true },
2974 .each = .{ .once = &.{
2975 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
2976 .{ ._, ._l, .cmov, .dst0q, .src1q, ._, ._ },
2977 } },
2978 }, .{
2979 .required_features = .{ .@"64bit", null, null, null },
2980 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } },
2981 .patterns = &.{
2982 .{ .src = .{ .to_mut_gpr, .mem } },
2983 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
2984 .{ .src = .{ .to_mut_gpr, .to_gpr } },
2985 },
2986 .dst_temps = .{.{ .ref = .src0 }},
2987 .clobbers = .{ .eflags = true },
2988 .each = .{ .once = &.{
2989 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
2990 .{ ._, ._nl, .j, .@"0f", ._, ._, ._ },
2991 .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ },
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 } },
3000 },
3001 .dst_temps = .{.{ .ref = .src0 }},
3002 .clobbers = .{ .eflags = true },
3003 .each = .{ .once = &.{
3004 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
3005 .{ ._, ._b, .cmov, .dst0q, .src1q, ._, ._ },
3006 } },
3007 }, .{
3008 .required_features = .{ .@"64bit", null, null, null },
3009 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } },
3010 .patterns = &.{
3011 .{ .src = .{ .to_mut_gpr, .mem } },
3012 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
3013 .{ .src = .{ .to_mut_gpr, .to_gpr } },
3014 },
3015 .dst_temps = .{.{ .ref = .src0 }},
3016 .clobbers = .{ .eflags = true },
3017 .each = .{ .once = &.{
3018 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
3019 .{ ._, ._nb, .j, .@"0f", ._, ._, ._ },
3020 .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ },
3021 } },
3022 }, .{
3023 .required_features = .{ .@"64bit", .cmov, null, null },
3024 .src_constraints = .{ .any_signed_int, .any_signed_int },
3025 .patterns = &.{
3026 .{ .src = .{ .to_mem, .to_mem } },
3027 },
3028 .extra_temps = .{
3029 .{ .type = .isize, .kind = .{ .reg = .rsi } },
3030 .{ .type = .u64, .kind = .{ .reg = .rdi } },
3031 .{ .type = .u64, .kind = .{ .reg = .rcx } },
3032 .unused,
3033 .unused,
3034 .unused,
3035 .unused,
3036 .unused,
3037 .unused,
3038 },
3039 .dst_temps = .{.mem},
3040 .clobbers = .{ .eflags = true },
3041 .each = .{ .once = &.{
3042 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
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, ._, ._, ._, ._ },
3056 } },
3057 }, .{
3058 .required_features = .{ .@"64bit", null, null, null },
3059 .src_constraints = .{ .any_signed_int, .any_signed_int },
3060 .patterns = &.{
3061 .{ .src = .{ .to_mem, .to_mem } },
3062 },
3063 .extra_temps = .{
3064 .{ .type = .isize, .kind = .{ .reg = .rsi } },
3065 .{ .type = .u64, .kind = .{ .reg = .rdi } },
3066 .{ .type = .u64, .kind = .{ .reg = .rcx } },
3067 .unused,
3068 .unused,
3069 .unused,
3070 .unused,
3071 .unused,
3072 .unused,
3073 },
3074 .dst_temps = .{.mem},
3075 .clobbers = .{ .eflags = true },
3076 .each = .{ .once = &.{
3077 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
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, ._, ._, ._, ._ },
3091 } },
3092 }, .{
3093 .required_features = .{ .@"64bit", .cmov, null, null },
3094 .src_constraints = .{ .any_unsigned_int, .any_unsigned_int },
3095 .patterns = &.{
3096 .{ .src = .{ .to_mem, .to_mem } },
3097 },
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 },
3111 .each = .{ .once = &.{
3112 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
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, ._, ._, ._, ._ },
3124 } },
3125 }, .{
3126 .required_features = .{ .@"64bit", null, null, null },
3127 .src_constraints = .{ .any_unsigned_int, .any_unsigned_int },
3128 .patterns = &.{
3129 .{ .src = .{ .to_mem, .to_mem } },
3130 },
3131 .extra_temps = .{
3132 .{ .type = .isize, .kind = .{ .reg = .rsi } },
3133 .{ .type = .u64, .kind = .{ .reg = .rdi } },
3134 .{ .type = .u64, .kind = .{ .reg = .rcx } },
3135 .unused,
3136 .unused,
3137 .unused,
3138 .unused,
3139 .unused,
3140 .unused,
3141 },
3142 .dst_temps = .{.mem},
3143 .clobbers = .{ .eflags = true },
3144 .each = .{ .once = &.{
3145 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
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, ._, ._, ._, ._ },
3157 } },
3158 }, .{
3159 .required_features = .{ .avx, null, null, null },
3160 .src_constraints = .{
3161 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3162 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3163 },
3164 .patterns = &.{
3165 .{ .src = .{ .to_sse, .mem } },
3166 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3167 .{ .src = .{ .to_sse, .to_sse } },
3168 },
3169 .dst_temps = .{.{ .rc = .sse }},
3170 .each = .{ .once = &.{
3171 .{ ._, .vp_b, .maxs, .dst0x, .src0x, .src1x, ._ },
3172 } },
3173 }, .{
3174 .required_features = .{ .sse4_1, null, null, null },
3175 .src_constraints = .{
3176 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3177 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
3178 },
3179 .patterns = &.{
3180 .{ .src = .{ .to_mut_sse, .mem } },
3181 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
3182 .{ .src = .{ .to_mut_sse, .to_sse } },
3183 },
3184 .dst_temps = .{.{ .ref = .src0 }},
3185 .each = .{ .once = &.{
3186 .{ ._, .p_b, .maxs, .dst0x, .src1x, ._, ._ },
3187 } },
3188 }, .{
3189 .required_features = .{ .sse2, null, null, null },
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 } },
3198 },
3199 .dst_temps = .{.{ .rc = .sse }},
3200 .each = .{ .once = &.{
3201 .{ ._, ._dqa, .mov, .dst0x, .src0x, ._, ._ },
3202 .{ ._, .p_b, .cmpgt, .dst0x, .src1x, ._, ._ },
3203 .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ },
3204 .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ },
3205 .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ },
3206 } },
3207 }, .{
3208 .required_features = .{ .avx2, null, null, null },
3209 .src_constraints = .{
3210 .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } },
3211 .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } },
3212 },
3213 .patterns = &.{
3214 .{ .src = .{ .to_sse, .mem } },
3215 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3216 .{ .src = .{ .to_sse, .to_sse } },
3217 },
3218 .dst_temps = .{.{ .rc = .sse }},
3219 .each = .{ .once = &.{
3220 .{ ._, .vp_b, .maxs, .dst0y, .src0y, .src1y, ._ },
3221 } },
3222 }, .{
3223 .required_features = .{ .avx2, null, null, null },
3224 .src_constraints = .{
3225 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } },
3226 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } },
3227 },
3228 .patterns = &.{
3229 .{ .src = .{ .to_mem, .to_mem } },
3230 },
3231 .extra_temps = .{
3232 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3233 .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } },
3234 .unused,
3235 .unused,
3236 .unused,
3237 .unused,
3238 .unused,
3239 .unused,
3240 .unused,
3241 },
3242 .dst_temps = .{.mem},
3243 .clobbers = .{ .eflags = true },
3244 .each = .{ .once = &.{
3245 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3246 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3247 .{ ._, .vp_b, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
3248 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
3249 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3250 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3251 } },
3252 }, .{
3253 .required_features = .{ .avx, null, null, null },
3254 .src_constraints = .{
3255 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3256 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3257 },
3258 .patterns = &.{
3259 .{ .src = .{ .to_mem, .to_mem } },
3260 },
3261 .extra_temps = .{
3262 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3263 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
3264 .unused,
3265 .unused,
3266 .unused,
3267 .unused,
3268 .unused,
3269 .unused,
3270 .unused,
3271 },
3272 .dst_temps = .{.mem},
3273 .clobbers = .{ .eflags = true },
3274 .each = .{ .once = &.{
3275 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3276 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3277 .{ ._, .vp_b, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
3278 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3279 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3280 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3281 } },
3282 }, .{
3283 .required_features = .{ .sse4_1, null, null, null },
3284 .src_constraints = .{
3285 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3286 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3287 },
3288 .patterns = &.{
3289 .{ .src = .{ .to_mem, .to_mem } },
3290 },
3291 .extra_temps = .{
3292 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3293 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
3294 .unused,
3295 .unused,
3296 .unused,
3297 .unused,
3298 .unused,
3299 .unused,
3300 .unused,
3301 },
3302 .dst_temps = .{.mem},
3303 .clobbers = .{ .eflags = true },
3304 .each = .{ .once = &.{
3305 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3306 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3307 .{ ._, .p_b, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3308 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3309 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3310 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3311 } },
3312 }, .{
3313 .required_features = .{ .sse2, null, null, null },
3314 .src_constraints = .{
3315 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3316 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
3317 },
3318 .patterns = &.{
3319 .{ .src = .{ .to_mem, .to_mem } },
3320 },
3321 .extra_temps = .{
3322 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3323 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
3324 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
3325 .unused,
3326 .unused,
3327 .unused,
3328 .unused,
3329 .unused,
3330 .unused,
3331 },
3332 .dst_temps = .{.mem},
3333 .clobbers = .{ .eflags = true },
3334 .each = .{ .once = &.{
3335 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3336 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3337 .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ },
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, ._, ._ },
3343 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3344 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3345 } },
3346 }, .{
3347 .required_features = .{ .cmov, .slow_incdec, null, null },
3348 .src_constraints = .{
3349 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3350 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3351 },
3352 .patterns = &.{
3353 .{ .src = .{ .to_mem, .to_mem } },
3354 },
3355 .extra_temps = .{
3356 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3357 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3358 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3359 .unused,
3360 .unused,
3361 .unused,
3362 .unused,
3363 .unused,
3364 .unused,
3365 },
3366 .dst_temps = .{.mem},
3367 .clobbers = .{ .eflags = true },
3368 .each = .{ .once = &.{
3369 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3370 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3371 .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3372 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
3373 .{ ._, ._l, .cmov, .tmp1d, .tmp2d, ._, ._ },
3374 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3375 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
3376 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3377 } },
3378 }, .{
3379 .required_features = .{ .cmov, null, null, null },
3380 .src_constraints = .{
3381 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3382 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3383 },
3384 .patterns = &.{
3385 .{ .src = .{ .to_mem, .to_mem } },
3386 },
3387 .extra_temps = .{
3388 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3389 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3390 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3391 .unused,
3392 .unused,
3393 .unused,
3394 .unused,
3395 .unused,
3396 .unused,
3397 },
3398 .dst_temps = .{.mem},
3399 .clobbers = .{ .eflags = true },
3400 .each = .{ .once = &.{
3401 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3402 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3403 .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3404 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
3405 .{ ._, ._l, .cmov, .tmp1d, .tmp2d, ._, ._ },
3406 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3407 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3408 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3409 } },
3410 }, .{
3411 .required_features = .{ .slow_incdec, null, null, null },
3412 .src_constraints = .{
3413 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3414 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3415 },
3416 .patterns = &.{
3417 .{ .src = .{ .to_mem, .to_mem } },
3418 },
3419 .extra_temps = .{
3420 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3421 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3422 .unused,
3423 .unused,
3424 .unused,
3425 .unused,
3426 .unused,
3427 .unused,
3428 .unused,
3429 },
3430 .dst_temps = .{.mem},
3431 .clobbers = .{ .eflags = true },
3432 .each = .{ .once = &.{
3433 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3434 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3435 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3436 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
3437 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3438 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3439 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
3440 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3441 } },
3442 }, .{
3443 .src_constraints = .{
3444 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3445 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
3446 },
3447 .patterns = &.{
3448 .{ .src = .{ .to_mem, .to_mem } },
3449 },
3450 .extra_temps = .{
3451 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3452 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
3453 .unused,
3454 .unused,
3455 .unused,
3456 .unused,
3457 .unused,
3458 .unused,
3459 .unused,
3460 },
3461 .dst_temps = .{.mem},
3462 .clobbers = .{ .eflags = true },
3463 .each = .{ .once = &.{
3464 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3465 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3466 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3467 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
3468 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3469 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3470 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3471 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3472 } },
3473 }, .{
3474 .required_features = .{ .sse, .mmx, null, null },
3475 .src_constraints = .{
3476 .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } },
3477 .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } },
3478 },
3479 .patterns = &.{
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 } },
3541 },
3542 .extra_temps = .{
3543 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3544 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
3545 .unused,
3546 .unused,
3547 .unused,
3548 .unused,
3549 .unused,
3550 .unused,
3551 .unused,
3552 },
3553 .dst_temps = .{.mem},
3554 .clobbers = .{ .eflags = true },
3555 .each = .{ .once = &.{
3556 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3557 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3558 .{ ._, .vp_b, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
3559 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
3560 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3561 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3562 } },
3563 }, .{
3564 .required_features = .{ .avx, null, null, null },
3565 .src_constraints = .{
3566 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3567 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3568 },
3569 .patterns = &.{
3570 .{ .src = .{ .to_mem, .to_mem } },
3571 },
3572 .extra_temps = .{
3573 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3574 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
3575 .unused,
3576 .unused,
3577 .unused,
3578 .unused,
3579 .unused,
3580 .unused,
3581 .unused,
3582 },
3583 .dst_temps = .{.mem},
3584 .clobbers = .{ .eflags = true },
3585 .each = .{ .once = &.{
3586 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3587 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3588 .{ ._, .vp_b, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
3589 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3590 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3591 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3592 } },
3593 }, .{
3594 .required_features = .{ .sse2, null, null, null },
3595 .src_constraints = .{
3596 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3597 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
3598 },
3599 .patterns = &.{
3600 .{ .src = .{ .to_mem, .to_mem } },
3601 },
3602 .extra_temps = .{
3603 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3604 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
3605 .unused,
3606 .unused,
3607 .unused,
3608 .unused,
3609 .unused,
3610 .unused,
3611 .unused,
3612 },
3613 .dst_temps = .{.mem},
3614 .clobbers = .{ .eflags = true },
3615 .each = .{ .once = &.{
3616 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3617 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3618 .{ ._, .p_b, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3619 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3620 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3621 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3622 } },
3623 }, .{
3624 .required_features = .{ .cmov, .slow_incdec, null, null },
3625 .src_constraints = .{
3626 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3627 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3628 },
3629 .patterns = &.{
3630 .{ .src = .{ .to_mem, .to_mem } },
3631 },
3632 .extra_temps = .{
3633 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3634 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3635 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3636 .unused,
3637 .unused,
3638 .unused,
3639 .unused,
3640 .unused,
3641 .unused,
3642 },
3643 .dst_temps = .{.mem},
3644 .clobbers = .{ .eflags = true },
3645 .each = .{ .once = &.{
3646 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3647 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
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), ._, ._ },
3653 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3654 } },
3655 }, .{
3656 .required_features = .{ .cmov, null, null, null },
3657 .src_constraints = .{
3658 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3659 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3660 },
3661 .patterns = &.{
3662 .{ .src = .{ .to_mem, .to_mem } },
3663 },
3664 .extra_temps = .{
3665 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3666 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3667 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3668 .unused,
3669 .unused,
3670 .unused,
3671 .unused,
3672 .unused,
3673 .unused,
3674 },
3675 .dst_temps = .{.mem},
3676 .clobbers = .{ .eflags = true },
3677 .each = .{ .once = &.{
3678 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3679 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3680 .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3681 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
3682 .{ ._, ._b, .cmov, .tmp1d, .tmp2d, ._, ._ },
3683 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3684 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3685 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3686 } },
3687 }, .{
3688 .required_features = .{ .slow_incdec, null, null, null },
3689 .src_constraints = .{
3690 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3691 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3692 },
3693 .patterns = &.{
3694 .{ .src = .{ .to_mem, .to_mem } },
3695 },
3696 .extra_temps = .{
3697 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3698 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3699 .unused,
3700 .unused,
3701 .unused,
3702 .unused,
3703 .unused,
3704 .unused,
3705 .unused,
3706 },
3707 .dst_temps = .{.mem},
3708 .clobbers = .{ .eflags = true },
3709 .each = .{ .once = &.{
3710 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3711 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3712 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
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), ._, ._ },
3717 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3718 } },
3719 }, .{
3720 .src_constraints = .{
3721 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3722 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
3723 },
3724 .patterns = &.{
3725 .{ .src = .{ .to_mem, .to_mem } },
3726 },
3727 .extra_temps = .{
3728 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3729 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
3730 .unused,
3731 .unused,
3732 .unused,
3733 .unused,
3734 .unused,
3735 .unused,
3736 .unused,
3737 },
3738 .dst_temps = .{.mem},
3739 .clobbers = .{ .eflags = true },
3740 .each = .{ .once = &.{
3741 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3742 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
3743 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3744 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
3745 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
3746 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
3747 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
3748 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
3749 } },
3750 }, .{
3751 .required_features = .{ .sse, .mmx, null, null },
3752 .src_constraints = .{
3753 .{ .scalar_signed_int = .{ .of = .qword, .is = .word } },
3754 .{ .scalar_signed_int = .{ .of = .qword, .is = .word } },
3755 },
3756 .patterns = &.{
3757 .{ .src = .{ .to_mut_mmx, .mem } },
3758 .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } },
3759 .{ .src = .{ .to_mut_mmx, .to_mmx } },
3760 },
3761 .dst_temps = .{.{ .ref = .src0 }},
3762 .each = .{ .once = &.{
3763 .{ ._, .p_w, .maxs, .dst0q, .src1q, ._, ._ },
3764 } },
3765 }, .{
3766 .required_features = .{ .avx, null, null, null },
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 } },
3790 },
3791 .dst_temps = .{.{ .ref = .src0 }},
3792 .each = .{ .once = &.{
3793 .{ ._, .p_w, .maxs, .dst0x, .src1x, ._, ._ },
3794 } },
3795 }, .{
3796 .required_features = .{ .avx2, null, null, null },
3797 .src_constraints = .{
3798 .{ .scalar_signed_int = .{ .of = .yword, .is = .word } },
3799 .{ .scalar_signed_int = .{ .of = .yword, .is = .word } },
3800 },
3801 .patterns = &.{
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 } },
3818 },
3819 .extra_temps = .{
3820 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3821 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
3822 .unused,
3823 .unused,
3824 .unused,
3825 .unused,
3826 .unused,
3827 .unused,
3828 .unused,
3829 },
3830 .dst_temps = .{.mem},
3831 .clobbers = .{ .eflags = true },
3832 .each = .{ .once = &.{
3833 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3834 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
3835 .{ ._, .vp_w, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
3836 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
3837 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3838 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3839 } },
3840 }, .{
3841 .required_features = .{ .avx, null, null, null },
3842 .src_constraints = .{
3843 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
3844 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
3845 },
3846 .patterns = &.{
3847 .{ .src = .{ .to_mem, .to_mem } },
3848 },
3849 .extra_temps = .{
3850 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3851 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
3852 .unused,
3853 .unused,
3854 .unused,
3855 .unused,
3856 .unused,
3857 .unused,
3858 .unused,
3859 },
3860 .dst_temps = .{.mem},
3861 .clobbers = .{ .eflags = true },
3862 .each = .{ .once = &.{
3863 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3864 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3865 .{ ._, .vp_w, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
3866 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3867 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3868 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3869 } },
3870 }, .{
3871 .required_features = .{ .sse2, null, null, null },
3872 .src_constraints = .{
3873 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
3874 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
3875 },
3876 .patterns = &.{
3877 .{ .src = .{ .to_mem, .to_mem } },
3878 },
3879 .extra_temps = .{
3880 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3881 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
3882 .unused,
3883 .unused,
3884 .unused,
3885 .unused,
3886 .unused,
3887 .unused,
3888 .unused,
3889 },
3890 .dst_temps = .{.mem},
3891 .clobbers = .{ .eflags = true },
3892 .each = .{ .once = &.{
3893 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3894 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
3895 .{ ._, .p_w, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
3896 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
3897 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3898 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3899 } },
3900 }, .{
3901 .required_features = .{ .cmov, null, null, null },
3902 .src_constraints = .{
3903 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
3904 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
3905 },
3906 .patterns = &.{
3907 .{ .src = .{ .to_mem, .to_mem } },
3908 },
3909 .extra_temps = .{
3910 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3911 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
3912 .unused,
3913 .unused,
3914 .unused,
3915 .unused,
3916 .unused,
3917 .unused,
3918 .unused,
3919 },
3920 .dst_temps = .{.mem},
3921 .clobbers = .{ .eflags = true },
3922 .each = .{ .once = &.{
3923 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3924 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
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), ._, ._ },
3929 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3930 } },
3931 }, .{
3932 .src_constraints = .{
3933 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
3934 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
3935 },
3936 .patterns = &.{
3937 .{ .src = .{ .to_mem, .to_mem } },
3938 },
3939 .extra_temps = .{
3940 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3941 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
3942 .unused,
3943 .unused,
3944 .unused,
3945 .unused,
3946 .unused,
3947 .unused,
3948 .unused,
3949 },
3950 .dst_temps = .{.mem},
3951 .clobbers = .{ .eflags = true },
3952 .each = .{ .once = &.{
3953 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3954 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
3955 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
3956 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
3957 .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
3958 .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
3959 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
3960 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3961 } },
3962 }, .{
3963 .required_features = .{ .avx, null, null, null },
3964 .src_constraints = .{
3965 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3966 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3967 },
3968 .patterns = &.{
3969 .{ .src = .{ .to_sse, .mem } },
3970 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
3971 .{ .src = .{ .to_sse, .to_sse } },
3972 },
3973 .dst_temps = .{.{ .rc = .sse }},
3974 .each = .{ .once = &.{
3975 .{ ._, .vp_w, .maxu, .dst0x, .src0x, .src1x, ._ },
3976 } },
3977 }, .{
3978 .required_features = .{ .sse4_1, null, null, null },
3979 .src_constraints = .{
3980 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3981 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3982 },
3983 .patterns = &.{
3984 .{ .src = .{ .to_mut_sse, .mem } },
3985 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
3986 .{ .src = .{ .to_mut_sse, .to_sse } },
3987 },
3988 .dst_temps = .{.{ .ref = .src0 }},
3989 .each = .{ .once = &.{
3990 .{ ._, .p_w, .maxu, .dst0x, .src1x, ._, ._ },
3991 } },
3992 }, .{
3993 .required_features = .{ .sse2, null, null, null },
3994 .src_constraints = .{
3995 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3996 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
3997 },
3998 .patterns = &.{
3999 .{ .src = .{ .to_mut_sse, .mem } },
4000 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4001 .{ .src = .{ .to_mut_sse, .to_sse } },
4002 },
4003 .dst_temps = .{.{ .ref = .src0 }},
4004 .each = .{ .once = &.{
4005 .{ ._, .p_w, .subus, .dst0x, .src1x, ._, ._ },
4006 .{ ._, .p_w, .add, .dst0x, .src1x, ._, ._ },
4007 } },
4008 }, .{
4009 .required_features = .{ .avx2, null, null, null },
4010 .src_constraints = .{
4011 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } },
4012 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } },
4013 },
4014 .patterns = &.{
4015 .{ .src = .{ .to_sse, .mem } },
4016 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4017 .{ .src = .{ .to_sse, .to_sse } },
4018 },
4019 .dst_temps = .{.{ .rc = .sse }},
4020 .each = .{ .once = &.{
4021 .{ ._, .vp_w, .maxu, .dst0y, .src0y, .src1y, ._ },
4022 } },
4023 }, .{
4024 .required_features = .{ .avx2, null, null, null },
4025 .src_constraints = .{
4026 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } },
4027 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } },
4028 },
4029 .patterns = &.{
4030 .{ .src = .{ .to_mem, .to_mem } },
4031 },
4032 .extra_temps = .{
4033 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4034 .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } },
4035 .unused,
4036 .unused,
4037 .unused,
4038 .unused,
4039 .unused,
4040 .unused,
4041 .unused,
4042 },
4043 .dst_temps = .{.mem},
4044 .clobbers = .{ .eflags = true },
4045 .each = .{ .once = &.{
4046 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
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", ._, ._, ._ },
4052 } },
4053 }, .{
4054 .required_features = .{ .avx, null, null, null },
4055 .src_constraints = .{
4056 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4057 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4058 },
4059 .patterns = &.{
4060 .{ .src = .{ .to_mem, .to_mem } },
4061 },
4062 .extra_temps = .{
4063 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4064 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
4065 .unused,
4066 .unused,
4067 .unused,
4068 .unused,
4069 .unused,
4070 .unused,
4071 .unused,
4072 },
4073 .dst_temps = .{.mem},
4074 .clobbers = .{ .eflags = true },
4075 .each = .{ .once = &.{
4076 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
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", ._, ._, ._ },
4082 } },
4083 }, .{
4084 .required_features = .{ .sse4_1, null, null, null },
4085 .src_constraints = .{
4086 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4087 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4088 },
4089 .patterns = &.{
4090 .{ .src = .{ .to_mem, .to_mem } },
4091 },
4092 .extra_temps = .{
4093 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4094 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
4095 .unused,
4096 .unused,
4097 .unused,
4098 .unused,
4099 .unused,
4100 .unused,
4101 .unused,
4102 },
4103 .dst_temps = .{.mem},
4104 .clobbers = .{ .eflags = true },
4105 .each = .{ .once = &.{
4106 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
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", ._, ._, ._ },
4112 } },
4113 }, .{
4114 .required_features = .{ .sse2, null, null, null },
4115 .src_constraints = .{
4116 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4117 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
4118 },
4119 .patterns = &.{
4120 .{ .src = .{ .to_mem, .to_mem } },
4121 },
4122 .extra_temps = .{
4123 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4124 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
4125 .unused,
4126 .unused,
4127 .unused,
4128 .unused,
4129 .unused,
4130 .unused,
4131 .unused,
4132 },
4133 .dst_temps = .{.mem},
4134 .clobbers = .{ .eflags = true },
4135 .each = .{ .once = &.{
4136 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
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", ._, ._, ._ },
4143 } },
4144 }, .{
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 },
4150 .patterns = &.{
4151 .{ .src = .{ .to_mem, .to_mem } },
4152 },
4153 .extra_temps = .{
4154 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4155 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
4156 .unused,
4157 .unused,
4158 .unused,
4159 .unused,
4160 .unused,
4161 .unused,
4162 .unused,
4163 },
4164 .dst_temps = .{.mem},
4165 .clobbers = .{ .eflags = true },
4166 .each = .{ .once = &.{
4167 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4168 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
4169 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
4170 .{ ._, ._b, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
4171 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
4172 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
4173 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4174 } },
4175 }, .{
4176 .src_constraints = .{
4177 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
4178 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
4179 },
4180 .patterns = &.{
4181 .{ .src = .{ .to_mem, .to_mem } },
4182 },
4183 .extra_temps = .{
4184 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4185 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
4186 .unused,
4187 .unused,
4188 .unused,
4189 .unused,
4190 .unused,
4191 .unused,
4192 .unused,
4193 },
4194 .dst_temps = .{.mem},
4195 .clobbers = .{ .eflags = true },
4196 .each = .{ .once = &.{
4197 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4198 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
4199 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
4200 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
4201 .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
4202 .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
4203 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
4204 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4205 } },
4206 }, .{
4207 .required_features = .{ .avx, null, null, null },
4208 .src_constraints = .{
4209 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
4210 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
4211 },
4212 .patterns = &.{
4213 .{ .src = .{ .to_sse, .mem } },
4214 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4215 .{ .src = .{ .to_sse, .to_sse } },
4216 },
4217 .dst_temps = .{.{ .rc = .sse }},
4218 .each = .{ .once = &.{
4219 .{ ._, .vp_d, .maxs, .dst0x, .src0x, .src1x, ._ },
4220 } },
4221 }, .{
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 },
4227 .patterns = &.{
4228 .{ .src = .{ .to_mut_sse, .mem } },
4229 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4230 .{ .src = .{ .to_mut_sse, .to_sse } },
4231 },
4232 .dst_temps = .{.{ .ref = .src0 }},
4233 .each = .{ .once = &.{
4234 .{ ._, .p_d, .maxs, .dst0x, .src1x, ._, ._ },
4235 } },
4236 }, .{
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 },
4242 .patterns = &.{
4243 .{ .src = .{ .to_mut_sse, .mem } },
4244 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4245 .{ .src = .{ .to_mut_sse, .to_sse } },
4246 },
4247 .dst_temps = .{.{ .rc = .sse }},
4248 .each = .{ .once = &.{
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, ._, ._ },
4254 } },
4255 }, .{
4256 .required_features = .{ .avx2, null, null, null },
4257 .src_constraints = .{
4258 .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } },
4259 .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } },
4260 },
4261 .patterns = &.{
4262 .{ .src = .{ .to_sse, .mem } },
4263 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4264 .{ .src = .{ .to_sse, .to_sse } },
4265 },
4266 .dst_temps = .{.{ .rc = .sse }},
4267 .each = .{ .once = &.{
4268 .{ ._, .vp_d, .maxs, .dst0y, .src0y, .src1y, ._ },
4269 } },
4270 }, .{
4271 .required_features = .{ .avx2, null, null, null },
4272 .src_constraints = .{
4273 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } },
4274 .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } },
4275 },
4276 .patterns = &.{
4277 .{ .src = .{ .to_mem, .to_mem } },
4278 },
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},
4291 .clobbers = .{ .eflags = true },
4292 .each = .{ .once = &.{
4293 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4294 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
4295 .{ ._, .vp_d, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
4296 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
4297 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
4298 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4299 } },
4300 }, .{
4301 .required_features = .{ .avx, null, null, null },
4302 .src_constraints = .{
4303 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4304 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4305 },
4306 .patterns = &.{
4307 .{ .src = .{ .to_mem, .to_mem } },
4308 },
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},
4321 .clobbers = .{ .eflags = true },
4322 .each = .{ .once = &.{
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", ._, ._, ._ },
4329 } },
4330 }, .{
4331 .required_features = .{ .sse4_1, null, null, null },
4332 .src_constraints = .{
4333 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4334 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4335 },
4336 .patterns = &.{
4337 .{ .src = .{ .to_mem, .to_mem } },
4338 },
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},
4351 .clobbers = .{ .eflags = true },
4352 .each = .{ .once = &.{
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", ._, ._, ._ },
4359 } },
4360 }, .{
4361 .required_features = .{ .sse2, null, null, null },
4362 .src_constraints = .{
4363 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4364 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
4365 },
4366 .patterns = &.{
4367 .{ .src = .{ .to_mem, .to_mem } },
4368 },
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},
4381 .clobbers = .{ .eflags = true },
4382 .each = .{ .once = &.{
4383 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4384 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_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", ._, ._, ._ },
4393 } },
4394 }, .{
4395 .required_features = .{ .cmov, null, null, null },
4396 .src_constraints = .{
4397 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
4398 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
4399 },
4400 .patterns = &.{
4401 .{ .src = .{ .to_mem, .to_mem } },
4402 },
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},
4415 .clobbers = .{ .eflags = true },
4416 .each = .{ .once = &.{
4417 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_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", ._, ._, ._ },
4424 } },
4425 }, .{
4426 .src_constraints = .{
4427 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
4428 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
4429 },
4430 .patterns = &.{
4431 .{ .src = .{ .to_mem, .to_mem } },
4432 },
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},
4445 .clobbers = .{ .eflags = true },
4446 .each = .{ .once = &.{
4447 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_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", ._, ._, ._ },
4455 } },
4456 }, .{
4457 .required_features = .{ .avx, null, null, null },
4458 .src_constraints = .{
4459 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4460 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4461 },
4462 .patterns = &.{
4463 .{ .src = .{ .to_sse, .mem } },
4464 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4465 .{ .src = .{ .to_sse, .to_sse } },
4466 },
4467 .dst_temps = .{.{ .rc = .sse }},
4468 .each = .{ .once = &.{
4469 .{ ._, .vp_d, .maxu, .dst0x, .src0x, .src1x, ._ },
4470 } },
4471 }, .{
4472 .required_features = .{ .sse4_1, null, null, null },
4473 .src_constraints = .{
4474 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4475 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4476 },
4477 .patterns = &.{
4478 .{ .src = .{ .to_mut_sse, .mem } },
4479 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4480 .{ .src = .{ .to_mut_sse, .to_sse } },
4481 },
4482 .dst_temps = .{.{ .ref = .src0 }},
4483 .each = .{ .once = &.{
4484 .{ ._, .p_d, .maxu, .dst0x, .src1x, ._, ._ },
4485 } },
4486 }, .{
4487 .required_features = .{ .sse2, null, null, null },
4488 .src_constraints = .{
4489 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4490 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4491 },
4492 .patterns = &.{
4493 .{ .src = .{ .to_mut_sse, .mem } },
4494 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4495 .{ .src = .{ .to_mut_sse, .to_sse } },
4496 },
4497 .extra_temps = .{
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 }},
4509 .each = .{ .once = &.{
4510 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4511 .{ ._, ._dqa, .mov, .dst0x, .lea(.xword, .tmp0), ._, ._ },
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, ._, ._ },
4519 } },
4520 }, .{
4521 .required_features = .{ .avx2, null, null, null },
4522 .src_constraints = .{
4523 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
4524 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
4525 },
4526 .patterns = &.{
4527 .{ .src = .{ .to_sse, .mem } },
4528 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4529 .{ .src = .{ .to_sse, .to_sse } },
4530 },
4531 .dst_temps = .{.{ .rc = .sse }},
4532 .each = .{ .once = &.{
4533 .{ ._, .vp_d, .maxu, .dst0y, .src0y, .src1y, ._ },
4534 } },
4535 }, .{
4536 .required_features = .{ .avx2, null, null, null },
4537 .src_constraints = .{
4538 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
4539 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
4540 },
4541 .patterns = &.{
4542 .{ .src = .{ .to_mem, .to_mem } },
4543 },
4544 .extra_temps = .{
4545 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4546 .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } },
4547 .unused,
4548 .unused,
4549 .unused,
4550 .unused,
4551 .unused,
4552 .unused,
4553 .unused,
4554 },
4555 .dst_temps = .{.mem},
4556 .clobbers = .{ .eflags = true },
4557 .each = .{ .once = &.{
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", ._, ._, ._ },
4564 } },
4565 }, .{
4566 .required_features = .{ .avx, null, null, null },
4567 .src_constraints = .{
4568 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4569 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4570 },
4571 .patterns = &.{
4572 .{ .src = .{ .to_mem, .to_mem } },
4573 },
4574 .extra_temps = .{
4575 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4576 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4577 .unused,
4578 .unused,
4579 .unused,
4580 .unused,
4581 .unused,
4582 .unused,
4583 .unused,
4584 },
4585 .dst_temps = .{.mem},
4586 .clobbers = .{ .eflags = true },
4587 .each = .{ .once = &.{
4588 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_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", ._, ._, ._ },
4594 } },
4595 }, .{
4596 .required_features = .{ .sse4_1, null, null, null },
4597 .src_constraints = .{
4598 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4599 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4600 },
4601 .patterns = &.{
4602 .{ .src = .{ .to_mem, .to_mem } },
4603 },
4604 .extra_temps = .{
4605 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4606 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4607 .unused,
4608 .unused,
4609 .unused,
4610 .unused,
4611 .unused,
4612 .unused,
4613 .unused,
4614 },
4615 .dst_temps = .{.mem},
4616 .clobbers = .{ .eflags = true },
4617 .each = .{ .once = &.{
4618 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4619 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4620 .{ ._, .p_d, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4621 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
4622 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4623 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4624 } },
4625 }, .{
4626 .required_features = .{ .sse2, null, null, null },
4627 .src_constraints = .{
4628 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4629 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
4630 },
4631 .patterns = &.{
4632 .{ .src = .{ .to_mem, .to_mem } },
4633 },
4634 .extra_temps = .{
4635 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4636 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
4637 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
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 } },
4642 .unused,
4643 .unused,
4644 },
4645 .dst_temps = .{.mem},
4646 .clobbers = .{ .eflags = true },
4647 .each = .{ .once = &.{
4648 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4649 .{ ._, ._dqa, .mov, .tmp2x, .lea(.xword, .tmp0), ._, ._ },
4650 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4651 .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4652 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_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", ._, ._, ._ },
4664 } },
4665 }, .{
4666 .required_features = .{ .cmov, null, null, null },
4667 .src_constraints = .{
4668 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
4669 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
4670 },
4671 .patterns = &.{
4672 .{ .src = .{ .to_mem, .to_mem } },
4673 },
4674 .extra_temps = .{
4675 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4676 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4677 .unused,
4678 .unused,
4679 .unused,
4680 .unused,
4681 .unused,
4682 .unused,
4683 .unused,
4684 },
4685 .dst_temps = .{.mem},
4686 .clobbers = .{ .eflags = true },
4687 .each = .{ .once = &.{
4688 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4689 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
4690 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4691 .{ ._, ._b, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4692 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
4693 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
4694 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4695 } },
4696 }, .{
4697 .src_constraints = .{
4698 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
4699 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
4700 },
4701 .patterns = &.{
4702 .{ .src = .{ .to_mem, .to_mem } },
4703 },
4704 .extra_temps = .{
4705 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4706 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4707 .unused,
4708 .unused,
4709 .unused,
4710 .unused,
4711 .unused,
4712 .unused,
4713 .unused,
4714 },
4715 .dst_temps = .{.mem},
4716 .clobbers = .{ .eflags = true },
4717 .each = .{ .once = &.{
4718 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4719 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
4720 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4721 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
4722 .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
4723 .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
4724 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
4725 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4726 } },
4727 }, .{
4728 .required_features = .{ .avx, null, null, null },
4729 .src_constraints = .{
4730 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
4731 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
4732 },
4733 .patterns = &.{
4734 .{ .src = .{ .to_sse, .to_sse } },
4735 },
4736 .dst_temps = .{.{ .rc = .sse }},
4737 .each = .{ .once = &.{
4738 .{ ._, .vp_q, .cmpgt, .dst0x, .src1x, .src0x, ._ },
4739 .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x },
4740 } },
4741 }, .{
4742 .required_features = .{ .sse4_2, null, null, null },
4743 .src_constraints = .{
4744 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
4745 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
4746 },
4747 .patterns = &.{
4748 .{ .src = .{ .to_mut_sse, .mem } },
4749 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4750 .{ .src = .{ .to_mut_sse, .to_sse } },
4751 },
4752 .extra_temps = .{
4753 .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } },
4754 .unused,
4755 .unused,
4756 .unused,
4757 .unused,
4758 .unused,
4759 .unused,
4760 .unused,
4761 .unused,
4762 },
4763 .dst_temps = .{.{ .ref = .src0 }},
4764 .each = .{ .once = &.{
4765 .{ ._, ._dqa, .mov, .tmp0x, .src1x, ._, ._ },
4766 .{ ._, .p_q, .cmpgt, .tmp0x, .src0x, ._, ._ },
4767 .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp0x, ._ },
4768 } },
4769 }, .{
4770 .required_features = .{ .avx2, null, null, null },
4771 .src_constraints = .{
4772 .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } },
4773 .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } },
4774 },
4775 .patterns = &.{
4776 .{ .src = .{ .to_sse, .to_sse } },
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 } },
4791 },
4792 .extra_temps = .{
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 } },
4797 .unused,
4798 .unused,
4799 .unused,
4800 .unused,
4801 .unused,
4802 },
4803 .dst_temps = .{.mem},
4804 .clobbers = .{ .eflags = true },
4805 .each = .{ .once = &.{
4806 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4807 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
4808 .{ ._, .v_dqa, .mov, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
4809 .{ ._, .vp_q, .cmpgt, .tmp3y, .tmp2y, .tmp1y, ._ },
4810 .{ ._, .vp_b, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
4811 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
4812 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
4813 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4814 } },
4815 }, .{
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 },
4821 .patterns = &.{
4822 .{ .src = .{ .to_mem, .to_mem } },
4823 },
4824 .extra_temps = .{
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 } },
4829 .unused,
4830 .unused,
4831 .unused,
4832 .unused,
4833 .unused,
4834 },
4835 .dst_temps = .{.mem},
4836 .clobbers = .{ .eflags = true },
4837 .each = .{ .once = &.{
4838 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4839 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4840 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_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", ._, ._, ._ },
4846 } },
4847 }, .{
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 },
4853 .patterns = &.{
4854 .{ .src = .{ .to_mem, .to_mem } },
4855 },
4856 .extra_temps = .{
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 } },
4861 .unused,
4862 .unused,
4863 .unused,
4864 .unused,
4865 .unused,
4866 },
4867 .dst_temps = .{.mem},
4868 .clobbers = .{ .eflags = true },
4869 .each = .{ .once = &.{
4870 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4871 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
4872 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
4873 .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ },
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", ._, ._, ._ },
4879 } },
4880 }, .{
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 },
4886 .patterns = &.{
4887 .{ .src = .{ .to_mem, .to_mem } },
4888 },
4889 .extra_temps = .{
4890 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4891 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
4892 .unused,
4893 .unused,
4894 .unused,
4895 .unused,
4896 .unused,
4897 .unused,
4898 .unused,
4899 },
4900 .dst_temps = .{.mem},
4901 .clobbers = .{ .eflags = true },
4902 .each = .{ .once = &.{
4903 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4904 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4905 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4906 .{ ._, ._l, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4907 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
4908 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
4909 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4910 } },
4911 }, .{
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 },
4917 .patterns = &.{
4918 .{ .src = .{ .to_mem, .to_mem } },
4919 },
4920 .extra_temps = .{
4921 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4922 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
4923 .unused,
4924 .unused,
4925 .unused,
4926 .unused,
4927 .unused,
4928 .unused,
4929 .unused,
4930 },
4931 .dst_temps = .{.mem},
4932 .clobbers = .{ .eflags = true },
4933 .each = .{ .once = &.{
4934 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
4935 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
4936 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
4937 .{ ._, ._nl, .j, .@"1f", ._, ._, ._ },
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", ._, ._, ._ },
4942 } },
4943 }, .{
4944 .required_features = .{ .avx, null, null, null },
4945 .src_constraints = .{
4946 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
4947 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
4948 },
4949 .patterns = &.{
4950 .{ .src = .{ .to_sse, .mem } },
4951 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
4952 .{ .src = .{ .to_sse, .to_sse } },
4953 },
4954 .extra_temps = .{
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 }},
4966 .each = .{ .once = &.{
4967 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4968 .{ ._, .v_, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
4969 .{ ._, .vp_, .xor, .dst0x, .tmp2x, .src0x, ._ },
4970 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .src1x, ._ },
4971 .{ ._, .vp_q, .cmpgt, .dst0x, .tmp2x, .dst0x, ._ },
4972 .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x },
4973 } },
4974 }, .{
4975 .required_features = .{ .sse4_2, null, null, null },
4976 .src_constraints = .{
4977 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
4978 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
4979 },
4980 .patterns = &.{
4981 .{ .src = .{ .to_mut_sse, .mem } },
4982 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
4983 .{ .src = .{ .to_mut_sse, .to_sse } },
4984 },
4985 .extra_temps = .{
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 }},
4997 .each = .{ .once = &.{
4998 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
4999 .{ ._, ._, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
5000 .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ },
5001 .{ ._, .p_, .xor, .tmp2x, .src0x, ._, ._ },
5002 .{ ._, .p_, .xor, .tmp3x, .src1x, ._, ._ },
5003 .{ ._, .p_q, .cmpgt, .tmp3x, .tmp2x, ._, ._ },
5004 .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp3x, ._ },
5005 } },
5006 }, .{
5007 .required_features = .{ .avx2, null, null, null },
5008 .src_constraints = .{
5009 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
5010 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
5011 },
5012 .patterns = &.{
5013 .{ .src = .{ .to_sse, .mem } },
5014 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
5015 .{ .src = .{ .to_sse, .to_sse } },
5016 },
5017 .extra_temps = .{
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 }},
5029 .each = .{ .once = &.{
5030 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
5031 .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.qword, .tmp0), ._, ._ },
5032 .{ ._, .vp_, .xor, .dst0y, .tmp2y, .src0y, ._ },
5033 .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .src1y, ._ },
5034 .{ ._, .vp_q, .cmpgt, .dst0y, .tmp2y, .dst0y, ._ },
5035 .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y },
5036 } },
5037 }, .{
5038 .required_features = .{ .avx2, null, null, null },
5039 .src_constraints = .{
5040 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
5041 .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } },
5042 },
5043 .patterns = &.{
5044 .{ .src = .{ .to_mem, .to_mem } },
5045 },
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},
5058 .clobbers = .{ .eflags = true },
5059 .each = .{ .once = &.{
5060 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
5061 .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.qword, .tmp0), ._, ._ },
5062 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_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", ._, ._, ._ },
5072 } },
5073 }, .{
5074 .required_features = .{ .avx, null, null, null },
5075 .src_constraints = .{
5076 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
5077 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
5078 },
5079 .patterns = &.{
5080 .{ .src = .{ .to_mem, .to_mem } },
5081 },
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},
5094 .clobbers = .{ .eflags = true },
5095 .each = .{ .once = &.{
5096 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
5097 .{ ._, .v_, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
5098 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5099 .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5100 .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
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", ._, ._, ._ },
5108 } },
5109 }, .{
5110 .required_features = .{ .sse4_2, null, null, null },
5111 .src_constraints = .{
5112 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
5113 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
5114 },
5115 .patterns = &.{
5116 .{ .src = .{ .to_mem, .to_mem } },
5117 },
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},
5130 .clobbers = .{ .eflags = true },
5131 .each = .{ .once = &.{
5132 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
5133 .{ ._, ._, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
5134 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5135 .{ .@"0:", ._dqa, .mov, .tmp5x, .tmp2x, ._, ._ },
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", ._, ._, ._ },
5146 } },
5147 }, .{
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 },
5153 .patterns = &.{
5154 .{ .src = .{ .to_mem, .to_mem } },
5155 },
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},
5168 .clobbers = .{ .eflags = true },
5169 .each = .{ .once = &.{
5170 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5171 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_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", ._, ._, ._ },
5177 } },
5178 }, .{
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 },
5184 .patterns = &.{
5185 .{ .src = .{ .to_mem, .to_mem } },
5186 },
5187 .extra_temps = .{
5188 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5189 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5190 .unused,
5191 .unused,
5192 .unused,
5193 .unused,
5194 .unused,
5195 .unused,
5196 .unused,
5197 },
5198 .dst_temps = .{.mem},
5199 .clobbers = .{ .eflags = true },
5200 .each = .{ .once = &.{
5201 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5202 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
5203 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
5204 .{ ._, ._nb, .j, .@"1f", ._, ._, ._ },
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", ._, ._, ._ },
5209 } },
5210 }, .{
5211 .required_features = .{ .@"64bit", .cmov, null, null },
5212 .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int },
5213 .patterns = &.{
5214 .{ .src = .{ .to_mem, .to_mem } },
5215 },
5216 .extra_temps = .{
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 } },
5221 .unused,
5222 .unused,
5223 .unused,
5224 .unused,
5225 .unused,
5226 },
5227 .dst_temps = .{.mem},
5228 .clobbers = .{ .eflags = true },
5229 .each = .{ .once = &.{
5230 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5231 .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ },
5232 .{ ._, ._c, .cl, ._, ._, ._, ._ },
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", ._, ._, ._ },
5248 } },
5249 }, .{
5250 .required_features = .{ .@"64bit", null, null, null },
5251 .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int },
5252 .patterns = &.{
5253 .{ .src = .{ .to_mem, .to_mem } },
5254 },
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},
5267 .clobbers = .{ .eflags = true },
5268 .each = .{ .once = &.{
5269 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5270 .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ },
5271 .{ ._, ._c, .cl, ._, ._, ._, ._ },
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", ._, ._, ._ },
5287 } },
5288 }, .{
5289 .required_features = .{ .@"64bit", .cmov, null, null },
5290 .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int },
5291 .patterns = &.{
5292 .{ .src = .{ .to_mem, .to_mem } },
5293 },
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},
5306 .clobbers = .{ .eflags = true },
5307 .each = .{ .once = &.{
5308 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5309 .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
5310 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5311 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
5312 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
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", ._, ._, ._ },
5324 } },
5325 }, .{
5326 .required_features = .{ .@"64bit", null, null, null },
5327 .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int },
5328 .patterns = &.{
5329 .{ .src = .{ .to_mem, .to_mem } },
5330 },
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},
5343 .clobbers = .{ .eflags = true },
5344 .each = .{ .once = &.{
5345 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5346 .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
5347 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5348 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
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", ._, ._, ._ },
5361 } },
5362 } }) catch |err| switch (err) {
5363 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
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 } },
5381 .patterns = &.{
5382 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5383 },
5384 .dst_temps = .{.{ .ref = .src0 }},
5385 .clobbers = .{ .eflags = true },
5386 .each = .{ .once = &.{
5387 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
5388 .{ ._, ._ge, .cmov, .dst0d, .src1d, ._, ._ },
5389 } },
5390 }, .{
5391 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } },
5392 .patterns = &.{
5393 .{ .src = .{ .to_mut_gpr, .mem } },
5394 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5395 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5396 },
5397 .dst_temps = .{.{ .ref = .src0 }},
5398 .clobbers = .{ .eflags = true },
5399 .each = .{ .once = &.{
5400 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
5401 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5402 .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ },
5403 } },
5404 }, .{
5405 .required_features = .{ .cmov, null, null, null },
5406 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } },
5407 .patterns = &.{
5408 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5409 },
5410 .dst_temps = .{.{ .ref = .src0 }},
5411 .clobbers = .{ .eflags = true },
5412 .each = .{ .once = &.{
5413 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
5414 .{ ._, ._ae, .cmov, .dst0d, .src1d, ._, ._ },
5415 } },
5416 }, .{
5417 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } },
5418 .patterns = &.{
5419 .{ .src = .{ .to_mut_gpr, .mem } },
5420 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5421 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5422 },
5423 .dst_temps = .{.{ .ref = .src0 }},
5424 .clobbers = .{ .eflags = true },
5425 .each = .{ .once = &.{
5426 .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ },
5427 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5428 .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ },
5429 } },
5430 }, .{
5431 .required_features = .{ .cmov, null, null, null },
5432 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } },
5433 .patterns = &.{
5434 .{ .src = .{ .to_mut_gpr, .mem } },
5435 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5436 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5437 },
5438 .dst_temps = .{.{ .ref = .src0 }},
5439 .clobbers = .{ .eflags = true },
5440 .each = .{ .once = &.{
5441 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
5442 .{ ._, ._ge, .cmov, .dst0w, .src1w, ._, ._ },
5443 } },
5444 }, .{
5445 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } },
5446 .patterns = &.{
5447 .{ .src = .{ .to_mut_gpr, .mem } },
5448 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5449 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5450 },
5451 .dst_temps = .{.{ .ref = .src0 }},
5452 .clobbers = .{ .eflags = true },
5453 .each = .{ .once = &.{
5454 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
5455 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5456 .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ },
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 } },
5465 },
5466 .dst_temps = .{.{ .ref = .src0 }},
5467 .clobbers = .{ .eflags = true },
5468 .each = .{ .once = &.{
5469 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
5470 .{ ._, ._ae, .cmov, .dst0w, .src1w, ._, ._ },
5471 } },
5472 }, .{
5473 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } },
5474 .patterns = &.{
5475 .{ .src = .{ .to_mut_gpr, .mem } },
5476 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5477 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5478 },
5479 .dst_temps = .{.{ .ref = .src0 }},
5480 .clobbers = .{ .eflags = true },
5481 .each = .{ .once = &.{
5482 .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ },
5483 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5484 .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ },
5485 } },
5486 }, .{
5487 .required_features = .{ .cmov, null, null, null },
5488 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } },
5489 .patterns = &.{
5490 .{ .src = .{ .to_mut_gpr, .mem } },
5491 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5492 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5493 },
5494 .dst_temps = .{.{ .ref = .src0 }},
5495 .clobbers = .{ .eflags = true },
5496 .each = .{ .once = &.{
5497 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
5498 .{ ._, ._ge, .cmov, .dst0d, .src1d, ._, ._ },
5499 } },
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 } },
5506 },
5507 .dst_temps = .{.{ .ref = .src0 }},
5508 .clobbers = .{ .eflags = true },
5509 .each = .{ .once = &.{
5510 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
5511 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5512 .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ },
5513 } },
5514 }, .{
5515 .required_features = .{ .cmov, null, null, null },
5516 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } },
5517 .patterns = &.{
5518 .{ .src = .{ .to_mut_gpr, .mem } },
5519 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5520 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5521 },
5522 .dst_temps = .{.{ .ref = .src0 }},
5523 .clobbers = .{ .eflags = true },
5524 .each = .{ .once = &.{
5525 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
5526 .{ ._, ._ae, .cmov, .dst0d, .src1d, ._, ._ },
5527 } },
5528 }, .{
5529 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } },
5530 .patterns = &.{
5531 .{ .src = .{ .to_mut_gpr, .mem } },
5532 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5533 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5534 },
5535 .dst_temps = .{.{ .ref = .src0 }},
5536 .clobbers = .{ .eflags = true },
5537 .each = .{ .once = &.{
5538 .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ },
5539 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5540 .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ },
5541 } },
5542 }, .{
5543 .required_features = .{ .@"64bit", .cmov, null, null },
5544 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } },
5545 .patterns = &.{
5546 .{ .src = .{ .to_mut_gpr, .mem } },
5547 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5548 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5549 },
5550 .dst_temps = .{.{ .ref = .src0 }},
5551 .clobbers = .{ .eflags = true },
5552 .each = .{ .once = &.{
5553 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
5554 .{ ._, ._ge, .cmov, .dst0q, .src1q, ._, ._ },
5555 } },
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 } },
5563 },
5564 .dst_temps = .{.{ .ref = .src0 }},
5565 .clobbers = .{ .eflags = true },
5566 .each = .{ .once = &.{
5567 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
5568 .{ ._, ._nge, .j, .@"0f", ._, ._, ._ },
5569 .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ },
5570 } },
5571 }, .{
5572 .required_features = .{ .@"64bit", .cmov, null, null },
5573 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } },
5574 .patterns = &.{
5575 .{ .src = .{ .to_mut_gpr, .mem } },
5576 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5577 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5578 },
5579 .dst_temps = .{.{ .ref = .src0 }},
5580 .clobbers = .{ .eflags = true },
5581 .each = .{ .once = &.{
5582 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
5583 .{ ._, ._ae, .cmov, .dst0q, .src1q, ._, ._ },
5584 } },
5585 }, .{
5586 .required_features = .{ .@"64bit", null, null, null },
5587 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } },
5588 .patterns = &.{
5589 .{ .src = .{ .to_mut_gpr, .mem } },
5590 .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } },
5591 .{ .src = .{ .to_mut_gpr, .to_gpr } },
5592 },
5593 .dst_temps = .{.{ .ref = .src0 }},
5594 .clobbers = .{ .eflags = true },
5595 .each = .{ .once = &.{
5596 .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ },
5597 .{ ._, ._nae, .j, .@"0f", ._, ._, ._ },
5598 .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ },
5599 } },
5600 }, .{
5601 .required_features = .{ .@"64bit", .cmov, null, null },
5602 .src_constraints = .{ .any_signed_int, .any_signed_int },
5603 .patterns = &.{
5604 .{ .src = .{ .to_mem, .to_mem } },
5605 },
5606 .extra_temps = .{
5607 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5608 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5609 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5610 .unused,
5611 .unused,
5612 .unused,
5613 .unused,
5614 .unused,
5615 .unused,
5616 },
5617 .dst_temps = .{.mem},
5618 .clobbers = .{ .eflags = true },
5619 .each = .{ .once = &.{
5620 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
5621 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5622 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
5623 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
5624 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
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, ._, ._, ._, ._ },
5634 } },
5635 }, .{
5636 .required_features = .{ .@"64bit", null, null, null },
5637 .src_constraints = .{ .any_signed_int, .any_signed_int },
5638 .patterns = &.{
5639 .{ .src = .{ .to_mem, .to_mem } },
5640 },
5641 .extra_temps = .{
5642 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5643 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5644 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5645 .unused,
5646 .unused,
5647 .unused,
5648 .unused,
5649 .unused,
5650 .unused,
5651 },
5652 .dst_temps = .{.mem},
5653 .clobbers = .{ .eflags = true },
5654 .each = .{ .once = &.{
5655 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
5656 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5657 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
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, ._, ._, ._, ._ },
5669 } },
5670 }, .{
5671 .required_features = .{ .@"64bit", .cmov, null, null },
5672 .src_constraints = .{ .any_unsigned_int, .any_unsigned_int },
5673 .patterns = &.{
5674 .{ .src = .{ .to_mem, .to_mem } },
5675 },
5676 .extra_temps = .{
5677 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5678 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5679 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5680 .unused,
5681 .unused,
5682 .unused,
5683 .unused,
5684 .unused,
5685 .unused,
5686 },
5687 .dst_temps = .{.mem},
5688 .clobbers = .{ .eflags = true },
5689 .each = .{ .once = &.{
5690 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
5691 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5692 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
5693 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
5694 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5695 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5696 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
5697 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
5698 .{ ._, ._ae, .cmov, .tmp0p, .tmp1p, ._, ._ },
5699 .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ },
5700 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
5701 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
5702 } },
5703 }, .{
5704 .required_features = .{ .@"64bit", null, null, null },
5705 .src_constraints = .{ .any_unsigned_int, .any_unsigned_int },
5706 .patterns = &.{
5707 .{ .src = .{ .to_mem, .to_mem } },
5708 },
5709 .extra_temps = .{
5710 .{ .type = .isize, .kind = .{ .reg = .rsi } },
5711 .{ .type = .u64, .kind = .{ .reg = .rdi } },
5712 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5713 .unused,
5714 .unused,
5715 .unused,
5716 .unused,
5717 .unused,
5718 .unused,
5719 },
5720 .dst_temps = .{.mem},
5721 .clobbers = .{ .eflags = true },
5722 .each = .{ .once = &.{
5723 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
5724 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5725 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
5726 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
5727 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5728 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5729 .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ },
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, ._, ._, ._, ._ },
5735 } },
5736 }, .{
5737 .required_features = .{ .avx, null, null, null },
5738 .src_constraints = .{
5739 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
5740 .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } },
5741 },
5742 .patterns = &.{
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 } },
5808 },
5809 .extra_temps = .{
5810 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5811 .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } },
5812 .unused,
5813 .unused,
5814 .unused,
5815 .unused,
5816 .unused,
5817 .unused,
5818 .unused,
5819 },
5820 .dst_temps = .{.mem},
5821 .clobbers = .{ .eflags = true },
5822 .each = .{ .once = &.{
5823 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5824 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5825 .{ ._, .vp_b, .mins, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
5826 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
5827 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
5828 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5829 } },
5830 }, .{
5831 .required_features = .{ .avx, null, null, null },
5832 .src_constraints = .{
5833 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5834 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5835 },
5836 .patterns = &.{
5837 .{ .src = .{ .to_mem, .to_mem } },
5838 },
5839 .extra_temps = .{
5840 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5841 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
5842 .unused,
5843 .unused,
5844 .unused,
5845 .unused,
5846 .unused,
5847 .unused,
5848 .unused,
5849 },
5850 .dst_temps = .{.mem},
5851 .clobbers = .{ .eflags = true },
5852 .each = .{ .once = &.{
5853 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5854 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5855 .{ ._, .vp_b, .mins, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
5856 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5857 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5858 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5859 } },
5860 }, .{
5861 .required_features = .{ .sse4_1, null, null, null },
5862 .src_constraints = .{
5863 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5864 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5865 },
5866 .patterns = &.{
5867 .{ .src = .{ .to_mem, .to_mem } },
5868 },
5869 .extra_temps = .{
5870 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5871 .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } },
5872 .unused,
5873 .unused,
5874 .unused,
5875 .unused,
5876 .unused,
5877 .unused,
5878 .unused,
5879 },
5880 .dst_temps = .{.mem},
5881 .clobbers = .{ .eflags = true },
5882 .each = .{ .once = &.{
5883 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5884 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5885 .{ ._, .p_b, .mins, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5886 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5887 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5888 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5889 } },
5890 }, .{
5891 .required_features = .{ .sse2, null, null, null },
5892 .src_constraints = .{
5893 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5894 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } },
5895 },
5896 .patterns = &.{
5897 .{ .src = .{ .to_mem, .to_mem } },
5898 },
5899 .extra_temps = .{
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,
5904 .unused,
5905 .unused,
5906 .unused,
5907 .unused,
5908 .unused,
5909 },
5910 .dst_temps = .{.mem},
5911 .clobbers = .{ .eflags = true },
5912 .each = .{ .once = &.{
5913 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5914 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5915 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
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), ._, ._ },
5922 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5923 } },
5924 }, .{
5925 .required_features = .{ .cmov, .slow_incdec, null, null },
5926 .src_constraints = .{
5927 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5928 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5929 },
5930 .patterns = &.{
5931 .{ .src = .{ .to_mem, .to_mem } },
5932 },
5933 .extra_temps = .{
5934 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5935 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
5936 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
5937 .unused,
5938 .unused,
5939 .unused,
5940 .unused,
5941 .unused,
5942 .unused,
5943 },
5944 .dst_temps = .{.mem},
5945 .clobbers = .{ .eflags = true },
5946 .each = .{ .once = &.{
5947 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5948 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5949 .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5950 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
5951 .{ ._, ._ge, .cmov, .tmp1d, .tmp2d, ._, ._ },
5952 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5953 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
5954 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5955 } },
5956 }, .{
5957 .required_features = .{ .cmov, null, null, null },
5958 .src_constraints = .{
5959 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5960 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5961 },
5962 .patterns = &.{
5963 .{ .src = .{ .to_mem, .to_mem } },
5964 },
5965 .extra_temps = .{
5966 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5967 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
5968 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
5969 .unused,
5970 .unused,
5971 .unused,
5972 .unused,
5973 .unused,
5974 .unused,
5975 },
5976 .dst_temps = .{.mem},
5977 .clobbers = .{ .eflags = true },
5978 .each = .{ .once = &.{
5979 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5980 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
5981 .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
5982 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
5983 .{ ._, ._ge, .cmov, .tmp1d, .tmp2d, ._, ._ },
5984 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
5985 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5986 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5987 } },
5988 }, .{
5989 .required_features = .{ .slow_incdec, null, null, null },
5990 .src_constraints = .{
5991 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5992 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
5993 },
5994 .patterns = &.{
5995 .{ .src = .{ .to_mem, .to_mem } },
5996 },
5997 .extra_temps = .{
5998 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5999 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
6000 .unused,
6001 .unused,
6002 .unused,
6003 .unused,
6004 .unused,
6005 .unused,
6006 .unused,
6007 },
6008 .dst_temps = .{.mem},
6009 .clobbers = .{ .eflags = true },
6010 .each = .{ .once = &.{
6011 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6012 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
6013 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6014 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
6015 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6016 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
6017 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6018 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6019 } },
6020 }, .{
6021 .src_constraints = .{
6022 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
6023 .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } },
6024 },
6025 .patterns = &.{
6026 .{ .src = .{ .to_mem, .to_mem } },
6027 },
6028 .extra_temps = .{
6029 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6030 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
6031 .unused,
6032 .unused,
6033 .unused,
6034 .unused,
6035 .unused,
6036 .unused,
6037 .unused,
6038 },
6039 .dst_temps = .{.mem},
6040 .clobbers = .{ .eflags = true },
6041 .each = .{ .once = &.{
6042 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6043 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
6044 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6045 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
6046 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6047 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
6048 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6049 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6050 } },
6051 }, .{
6052 .required_features = .{ .sse, .mmx, null, null },
6053 .src_constraints = .{
6054 .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } },
6055 .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } },
6056 },
6057 .patterns = &.{
6058 .{ .src = .{ .to_mut_mmx, .mem } },
6059 .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } },
6060 .{ .src = .{ .to_mut_mmx, .to_mmx } },
6061 },
6062 .dst_temps = .{.{ .ref = .src0 }},
6063 .each = .{ .once = &.{
6064 .{ ._, .p_b, .minu, .dst0q, .src1q, ._, ._ },
6065 } },
6066 }, .{
6067 .required_features = .{ .avx, null, null, null },
6068 .src_constraints = .{
6069 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6070 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6071 },
6072 .patterns = &.{
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 }},
6078 .each = .{ .once = &.{
6079 .{ ._, .vp_b, .minu, .dst0x, .src0x, .src1x, ._ },
6080 } },
6081 }, .{
6082 .required_features = .{ .sse2, null, null, null },
6083 .src_constraints = .{
6084 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6085 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6086 },
6087 .patterns = &.{
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 } },
6119 },
6120 .extra_temps = .{
6121 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6122 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
6123 .unused,
6124 .unused,
6125 .unused,
6126 .unused,
6127 .unused,
6128 .unused,
6129 .unused,
6130 },
6131 .dst_temps = .{.mem},
6132 .clobbers = .{ .eflags = true },
6133 .each = .{ .once = &.{
6134 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6135 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6136 .{ ._, .vp_b, .minu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
6137 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
6138 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
6139 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6140 } },
6141 }, .{
6142 .required_features = .{ .avx, null, null, null },
6143 .src_constraints = .{
6144 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6145 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6146 },
6147 .patterns = &.{
6148 .{ .src = .{ .to_mem, .to_mem } },
6149 },
6150 .extra_temps = .{
6151 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6152 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6153 .unused,
6154 .unused,
6155 .unused,
6156 .unused,
6157 .unused,
6158 .unused,
6159 .unused,
6160 },
6161 .dst_temps = .{.mem},
6162 .clobbers = .{ .eflags = true },
6163 .each = .{ .once = &.{
6164 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6165 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6166 .{ ._, .vp_b, .minu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
6167 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6168 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6169 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6170 } },
6171 }, .{
6172 .required_features = .{ .sse2, null, null, null },
6173 .src_constraints = .{
6174 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6175 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } },
6176 },
6177 .patterns = &.{
6178 .{ .src = .{ .to_mem, .to_mem } },
6179 },
6180 .extra_temps = .{
6181 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6182 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6183 .unused,
6184 .unused,
6185 .unused,
6186 .unused,
6187 .unused,
6188 .unused,
6189 .unused,
6190 },
6191 .dst_temps = .{.mem},
6192 .clobbers = .{ .eflags = true },
6193 .each = .{ .once = &.{
6194 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6195 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6196 .{ ._, .p_b, .minu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6197 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6198 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6199 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6200 } },
6201 }, .{
6202 .required_features = .{ .cmov, .slow_incdec, null, null },
6203 .src_constraints = .{
6204 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6205 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6206 },
6207 .patterns = &.{
6208 .{ .src = .{ .to_mem, .to_mem } },
6209 },
6210 .extra_temps = .{
6211 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6212 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6213 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6214 .unused,
6215 .unused,
6216 .unused,
6217 .unused,
6218 .unused,
6219 .unused,
6220 },
6221 .dst_temps = .{.mem},
6222 .clobbers = .{ .eflags = true },
6223 .each = .{ .once = &.{
6224 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6225 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
6226 .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6227 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
6228 .{ ._, ._ae, .cmov, .tmp1d, .tmp2d, ._, ._ },
6229 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
6230 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6231 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6232 } },
6233 }, .{
6234 .required_features = .{ .cmov, null, null, null },
6235 .src_constraints = .{
6236 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6237 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6238 },
6239 .patterns = &.{
6240 .{ .src = .{ .to_mem, .to_mem } },
6241 },
6242 .extra_temps = .{
6243 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6244 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6245 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6246 .unused,
6247 .unused,
6248 .unused,
6249 .unused,
6250 .unused,
6251 .unused,
6252 },
6253 .dst_temps = .{.mem},
6254 .clobbers = .{ .eflags = true },
6255 .each = .{ .once = &.{
6256 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6257 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
6258 .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6259 .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ },
6260 .{ ._, ._ae, .cmov, .tmp1d, .tmp2d, ._, ._ },
6261 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
6262 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6263 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6264 } },
6265 }, .{
6266 .required_features = .{ .slow_incdec, null, null, null },
6267 .src_constraints = .{
6268 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6269 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6270 },
6271 .patterns = &.{
6272 .{ .src = .{ .to_mem, .to_mem } },
6273 },
6274 .extra_temps = .{
6275 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6276 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6277 .unused,
6278 .unused,
6279 .unused,
6280 .unused,
6281 .unused,
6282 .unused,
6283 .unused,
6284 },
6285 .dst_temps = .{.mem},
6286 .clobbers = .{ .eflags = true },
6287 .each = .{ .once = &.{
6288 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6289 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
6290 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6291 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
6292 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6293 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
6294 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
6295 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6296 } },
6297 }, .{
6298 .src_constraints = .{
6299 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6300 .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } },
6301 },
6302 .patterns = &.{
6303 .{ .src = .{ .to_mem, .to_mem } },
6304 },
6305 .extra_temps = .{
6306 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6307 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
6308 .unused,
6309 .unused,
6310 .unused,
6311 .unused,
6312 .unused,
6313 .unused,
6314 .unused,
6315 },
6316 .dst_temps = .{.mem},
6317 .clobbers = .{ .eflags = true },
6318 .each = .{ .once = &.{
6319 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6320 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ },
6321 .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6322 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
6323 .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ },
6324 .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ },
6325 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6326 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6327 } },
6328 }, .{
6329 .required_features = .{ .sse, .mmx, null, null },
6330 .src_constraints = .{
6331 .{ .scalar_signed_int = .{ .of = .qword, .is = .word } },
6332 .{ .scalar_signed_int = .{ .of = .qword, .is = .word } },
6333 },
6334 .patterns = &.{
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 } },
6396 },
6397 .extra_temps = .{
6398 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6399 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
6400 .unused,
6401 .unused,
6402 .unused,
6403 .unused,
6404 .unused,
6405 .unused,
6406 .unused,
6407 },
6408 .dst_temps = .{.mem},
6409 .clobbers = .{ .eflags = true },
6410 .each = .{ .once = &.{
6411 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6412 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6413 .{ ._, .vp_w, .mins, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
6414 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
6415 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
6416 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6417 } },
6418 }, .{
6419 .required_features = .{ .avx, null, null, null },
6420 .src_constraints = .{
6421 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
6422 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
6423 },
6424 .patterns = &.{
6425 .{ .src = .{ .to_mem, .to_mem } },
6426 },
6427 .extra_temps = .{
6428 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6429 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
6430 .unused,
6431 .unused,
6432 .unused,
6433 .unused,
6434 .unused,
6435 .unused,
6436 .unused,
6437 },
6438 .dst_temps = .{.mem},
6439 .clobbers = .{ .eflags = true },
6440 .each = .{ .once = &.{
6441 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6442 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6443 .{ ._, .vp_w, .mins, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
6444 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6445 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6446 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6447 } },
6448 }, .{
6449 .required_features = .{ .sse2, null, null, null },
6450 .src_constraints = .{
6451 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
6452 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } },
6453 },
6454 .patterns = &.{
6455 .{ .src = .{ .to_mem, .to_mem } },
6456 },
6457 .extra_temps = .{
6458 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6459 .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } },
6460 .unused,
6461 .unused,
6462 .unused,
6463 .unused,
6464 .unused,
6465 .unused,
6466 .unused,
6467 },
6468 .dst_temps = .{.mem},
6469 .clobbers = .{ .eflags = true },
6470 .each = .{ .once = &.{
6471 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6472 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6473 .{ ._, .p_w, .mins, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6474 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6475 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6476 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6477 } },
6478 }, .{
6479 .required_features = .{ .cmov, null, null, null },
6480 .src_constraints = .{
6481 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
6482 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
6483 },
6484 .patterns = &.{
6485 .{ .src = .{ .to_mem, .to_mem } },
6486 },
6487 .extra_temps = .{
6488 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6489 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
6490 .unused,
6491 .unused,
6492 .unused,
6493 .unused,
6494 .unused,
6495 .unused,
6496 .unused,
6497 },
6498 .dst_temps = .{.mem},
6499 .clobbers = .{ .eflags = true },
6500 .each = .{ .once = &.{
6501 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6502 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
6503 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6504 .{ ._, ._ge, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6505 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
6506 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
6507 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6508 } },
6509 }, .{
6510 .src_constraints = .{
6511 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
6512 .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } },
6513 },
6514 .patterns = &.{
6515 .{ .src = .{ .to_mem, .to_mem } },
6516 },
6517 .extra_temps = .{
6518 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6519 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
6520 .unused,
6521 .unused,
6522 .unused,
6523 .unused,
6524 .unused,
6525 .unused,
6526 .unused,
6527 },
6528 .dst_temps = .{.mem},
6529 .clobbers = .{ .eflags = true },
6530 .each = .{ .once = &.{
6531 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6532 .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
6533 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6534 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
6535 .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6536 .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
6537 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
6538 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6539 } },
6540 }, .{
6541 .required_features = .{ .avx, null, null, null },
6542 .src_constraints = .{
6543 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6544 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6545 },
6546 .patterns = &.{
6547 .{ .src = .{ .to_sse, .mem } },
6548 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
6549 .{ .src = .{ .to_sse, .to_sse } },
6550 },
6551 .dst_temps = .{.{ .rc = .sse }},
6552 .each = .{ .once = &.{
6553 .{ ._, .vp_w, .minu, .dst0x, .src0x, .src1x, ._ },
6554 } },
6555 }, .{
6556 .required_features = .{ .sse4_1, null, null, null },
6557 .src_constraints = .{
6558 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6559 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6560 },
6561 .patterns = &.{
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 }},
6567 .each = .{ .once = &.{
6568 .{ ._, .p_w, .minu, .dst0x, .src1x, ._, ._ },
6569 } },
6570 }, .{
6571 .required_features = .{ .sse2, null, null, null },
6572 .src_constraints = .{
6573 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6574 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6575 },
6576 .patterns = &.{
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 } },
6610 },
6611 .extra_temps = .{
6612 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6613 .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } },
6614 .unused,
6615 .unused,
6616 .unused,
6617 .unused,
6618 .unused,
6619 .unused,
6620 .unused,
6621 },
6622 .dst_temps = .{.mem},
6623 .clobbers = .{ .eflags = true },
6624 .each = .{ .once = &.{
6625 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6626 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6627 .{ ._, .vp_w, .minu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
6628 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
6629 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
6630 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6631 } },
6632 }, .{
6633 .required_features = .{ .avx, null, null, null },
6634 .src_constraints = .{
6635 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6636 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6637 },
6638 .patterns = &.{
6639 .{ .src = .{ .to_mem, .to_mem } },
6640 },
6641 .extra_temps = .{
6642 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6643 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
6644 .unused,
6645 .unused,
6646 .unused,
6647 .unused,
6648 .unused,
6649 .unused,
6650 .unused,
6651 },
6652 .dst_temps = .{.mem},
6653 .clobbers = .{ .eflags = true },
6654 .each = .{ .once = &.{
6655 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6656 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6657 .{ ._, .vp_w, .minu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
6658 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6659 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6660 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6661 } },
6662 }, .{
6663 .required_features = .{ .sse4_1, null, null, null },
6664 .src_constraints = .{
6665 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6666 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } },
6667 },
6668 .patterns = &.{
6669 .{ .src = .{ .to_mem, .to_mem } },
6670 },
6671 .extra_temps = .{
6672 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6673 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
6674 .unused,
6675 .unused,
6676 .unused,
6677 .unused,
6678 .unused,
6679 .unused,
6680 .unused,
6681 },
6682 .dst_temps = .{.mem},
6683 .clobbers = .{ .eflags = true },
6684 .each = .{ .once = &.{
6685 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6686 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6687 .{ ._, .p_w, .minu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6688 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6689 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6690 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6691 } },
6692 }, .{
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 },
6698 .patterns = &.{
6699 .{ .src = .{ .to_mem, .to_mem } },
6700 },
6701 .extra_temps = .{
6702 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6703 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
6704 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
6705 .unused,
6706 .unused,
6707 .unused,
6708 .unused,
6709 .unused,
6710 .unused,
6711 },
6712 .dst_temps = .{.mem},
6713 .clobbers = .{ .eflags = true },
6714 .each = .{ .once = &.{
6715 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6716 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6717 .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ },
6718 .{ ._, .p_w, .subus, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6719 .{ ._, .p_w, .sub, .tmp2x, .tmp1x, ._, ._ },
6720 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp2x, ._, ._ },
6721 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6722 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6723 } },
6724 }, .{
6725 .required_features = .{ .cmov, null, null, null },
6726 .src_constraints = .{
6727 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
6728 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
6729 },
6730 .patterns = &.{
6731 .{ .src = .{ .to_mem, .to_mem } },
6732 },
6733 .extra_temps = .{
6734 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6735 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
6736 .unused,
6737 .unused,
6738 .unused,
6739 .unused,
6740 .unused,
6741 .unused,
6742 .unused,
6743 },
6744 .dst_temps = .{.mem},
6745 .clobbers = .{ .eflags = true },
6746 .each = .{ .once = &.{
6747 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6748 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
6749 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6750 .{ ._, ._ae, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6751 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
6752 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
6753 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6754 } },
6755 }, .{
6756 .src_constraints = .{
6757 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
6758 .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } },
6759 },
6760 .patterns = &.{
6761 .{ .src = .{ .to_mem, .to_mem } },
6762 },
6763 .extra_temps = .{
6764 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6765 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
6766 .unused,
6767 .unused,
6768 .unused,
6769 .unused,
6770 .unused,
6771 .unused,
6772 .unused,
6773 },
6774 .dst_temps = .{.mem},
6775 .clobbers = .{ .eflags = true },
6776 .each = .{ .once = &.{
6777 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6778 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
6779 .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6780 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
6781 .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ },
6782 .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
6783 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
6784 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6785 } },
6786 }, .{
6787 .required_features = .{ .avx, null, null, null },
6788 .src_constraints = .{
6789 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
6790 .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } },
6791 },
6792 .patterns = &.{
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 } },
6858 },
6859 .extra_temps = .{
6860 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6861 .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } },
6862 .unused,
6863 .unused,
6864 .unused,
6865 .unused,
6866 .unused,
6867 .unused,
6868 .unused,
6869 },
6870 .dst_temps = .{.mem},
6871 .clobbers = .{ .eflags = true },
6872 .each = .{ .once = &.{
6873 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6874 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6875 .{ ._, .vp_d, .mins, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
6876 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
6877 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
6878 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6879 } },
6880 }, .{
6881 .required_features = .{ .avx, null, null, null },
6882 .src_constraints = .{
6883 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6884 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6885 },
6886 .patterns = &.{
6887 .{ .src = .{ .to_mem, .to_mem } },
6888 },
6889 .extra_temps = .{
6890 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6891 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
6892 .unused,
6893 .unused,
6894 .unused,
6895 .unused,
6896 .unused,
6897 .unused,
6898 .unused,
6899 },
6900 .dst_temps = .{.mem},
6901 .clobbers = .{ .eflags = true },
6902 .each = .{ .once = &.{
6903 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6904 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6905 .{ ._, .vp_d, .mins, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
6906 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6907 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6908 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6909 } },
6910 }, .{
6911 .required_features = .{ .sse4_1, null, null, null },
6912 .src_constraints = .{
6913 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6914 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } },
6915 },
6916 .patterns = &.{
6917 .{ .src = .{ .to_mem, .to_mem } },
6918 },
6919 .extra_temps = .{
6920 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6921 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
6922 .unused,
6923 .unused,
6924 .unused,
6925 .unused,
6926 .unused,
6927 .unused,
6928 .unused,
6929 },
6930 .dst_temps = .{.mem},
6931 .clobbers = .{ .eflags = true },
6932 .each = .{ .once = &.{
6933 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6934 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6935 .{ ._, .p_d, .mins, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6936 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6937 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6938 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6939 } },
6940 }, .{
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 },
6946 .patterns = &.{
6947 .{ .src = .{ .to_mem, .to_mem } },
6948 },
6949 .extra_temps = .{
6950 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6951 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
6952 .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } },
6953 .unused,
6954 .unused,
6955 .unused,
6956 .unused,
6957 .unused,
6958 .unused,
6959 },
6960 .dst_temps = .{.mem},
6961 .clobbers = .{ .eflags = true },
6962 .each = .{ .once = &.{
6963 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6964 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6965 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6966 .{ ._, .p_d, .cmpgt, .tmp1x, .tmp2x, ._, ._ },
6967 .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ },
6968 .{ ._, .p_, .andn, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6969 .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ },
6970 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6971 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6972 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6973 } },
6974 }, .{
6975 .required_features = .{ .cmov, null, null, null },
6976 .src_constraints = .{
6977 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
6978 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
6979 },
6980 .patterns = &.{
6981 .{ .src = .{ .to_mem, .to_mem } },
6982 },
6983 .extra_temps = .{
6984 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6985 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
6986 .unused,
6987 .unused,
6988 .unused,
6989 .unused,
6990 .unused,
6991 .unused,
6992 .unused,
6993 },
6994 .dst_temps = .{.mem},
6995 .clobbers = .{ .eflags = true },
6996 .each = .{ .once = &.{
6997 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6998 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
6999 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
7000 .{ ._, ._ge, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
7001 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
7002 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
7003 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7004 } },
7005 }, .{
7006 .src_constraints = .{
7007 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
7008 .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } },
7009 },
7010 .patterns = &.{
7011 .{ .src = .{ .to_mem, .to_mem } },
7012 },
7013 .extra_temps = .{
7014 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7015 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
7016 .unused,
7017 .unused,
7018 .unused,
7019 .unused,
7020 .unused,
7021 .unused,
7022 .unused,
7023 },
7024 .dst_temps = .{.mem},
7025 .clobbers = .{ .eflags = true },
7026 .each = .{ .once = &.{
7027 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7028 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
7029 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
7030 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
7031 .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
7032 .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
7033 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
7034 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7035 } },
7036 }, .{
7037 .required_features = .{ .avx, null, null, null },
7038 .src_constraints = .{
7039 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7040 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7041 },
7042 .patterns = &.{
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 } },
7076 },
7077 .extra_temps = .{
7078 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7079 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
7080 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
7081 .unused,
7082 .unused,
7083 .unused,
7084 .unused,
7085 .unused,
7086 .unused,
7087 },
7088 .dst_temps = .{.{ .rc = .sse }},
7089 .each = .{ .once = &.{
7090 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
7091 .{ ._, ._dqa, .mov, .dst0x, .lea(.xword, .tmp0), ._, ._ },
7092 .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ },
7093 .{ ._, .p_, .xor, .dst0x, .src1x, ._, ._ },
7094 .{ ._, .p_, .xor, .tmp2x, .src0x, ._, ._ },
7095 .{ ._, .p_d, .cmpgt, .dst0x, .tmp2x, ._, ._ },
7096 .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ },
7097 .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ },
7098 .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ },
7099 } },
7100 }, .{
7101 .required_features = .{ .avx2, null, null, null },
7102 .src_constraints = .{
7103 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
7104 .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } },
7105 },
7106 .patterns = &.{
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 } },
7123 },
7124 .extra_temps = .{
7125 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7126 .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } },
7127 .unused,
7128 .unused,
7129 .unused,
7130 .unused,
7131 .unused,
7132 .unused,
7133 .unused,
7134 },
7135 .dst_temps = .{.mem},
7136 .clobbers = .{ .eflags = true },
7137 .each = .{ .once = &.{
7138 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7139 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7140 .{ ._, .vp_d, .minu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ },
7141 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
7142 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7143 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7144 } },
7145 }, .{
7146 .required_features = .{ .avx, null, null, null },
7147 .src_constraints = .{
7148 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7149 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7150 },
7151 .patterns = &.{
7152 .{ .src = .{ .to_mem, .to_mem } },
7153 },
7154 .extra_temps = .{
7155 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7156 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
7157 .unused,
7158 .unused,
7159 .unused,
7160 .unused,
7161 .unused,
7162 .unused,
7163 .unused,
7164 },
7165 .dst_temps = .{.mem},
7166 .clobbers = .{ .eflags = true },
7167 .each = .{ .once = &.{
7168 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7169 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7170 .{ ._, .vp_d, .minu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ },
7171 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
7172 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7173 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7174 } },
7175 }, .{
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 },
7181 .patterns = &.{
7182 .{ .src = .{ .to_mem, .to_mem } },
25587183 },
2559 .dst_temps = .{.{ .rc = .general_purpose }},
7184 .extra_temps = .{
7185 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7186 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
7187 .unused,
7188 .unused,
7189 .unused,
7190 .unused,
7191 .unused,
7192 .unused,
7193 .unused,
7194 },
7195 .dst_temps = .{.mem},
7196 .clobbers = .{ .eflags = true },
25607197 .each = .{ .once = &.{
2561 .{ ._, ._, .lea, .dst0p, .leaa(.none, .src0, .add_src0_elem_size_times_src1), ._, ._ },
7198 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7199 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7200 .{ ._, .p_d, .minu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7201 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
7202 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7203 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
25627204 } },
25637205 }, .{
2564 .dst_constraints = .{.{ .elem_size_is = 1 }},
7206 .required_features = .{ .sse2, null, null, null },
7207 .src_constraints = .{
7208 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7209 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } },
7210 },
25657211 .patterns = &.{
2566 .{ .src = .{ .to_gpr, .to_gpr } },
7212 .{ .src = .{ .to_mem, .to_mem } },
25677213 },
2568 .dst_temps = .{.{ .rc = .general_purpose }},
7214 .extra_temps = .{
7215 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7216 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
7217 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
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 } },
7222 .unused,
7223 .unused,
7224 },
7225 .dst_temps = .{.mem},
7226 .clobbers = .{ .eflags = true },
25697227 .each = .{ .once = &.{
2570 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
7228 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
7229 .{ ._, ._dqa, .mov, .tmp2x, .lea(.xword, .tmp0), ._, ._ },
7230 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7231 .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7232 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7233 .{ ._, ._dqa, .mov, .tmp5x, .tmp3x, ._, ._ },
7234 .{ ._, ._dqa, .mov, .tmp6x, .tmp4x, ._, ._ },
7235 .{ ._, .p_, .xor, .tmp5x, .tmp2x, ._, ._ },
7236 .{ ._, .p_, .xor, .tmp6x, .tmp2x, ._, ._ },
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), ._, ._ },
7243 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
25717244 } },
25727245 }, .{
2573 .dst_constraints = .{.{ .elem_size_is = 2 }},
7246 .required_features = .{ .cmov, null, null, null },
7247 .src_constraints = .{
7248 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
7249 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
7250 },
25747251 .patterns = &.{
2575 .{ .src = .{ .to_gpr, .to_gpr } },
7252 .{ .src = .{ .to_mem, .to_mem } },
25767253 },
2577 .dst_temps = .{.{ .rc = .general_purpose }},
7254 .extra_temps = .{
7255 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7256 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7257 .unused,
7258 .unused,
7259 .unused,
7260 .unused,
7261 .unused,
7262 .unused,
7263 .unused,
7264 },
7265 .dst_temps = .{.mem},
7266 .clobbers = .{ .eflags = true },
25787267 .each = .{ .once = &.{
2579 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"2", .src1), ._, ._ },
7268 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7269 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
7270 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
7271 .{ ._, ._ae, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
7272 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
7273 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
7274 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
25807275 } },
25817276 }, .{
2582 .dst_constraints = .{.{ .elem_size_is = 2 + 1 }},
7277 .src_constraints = .{
7278 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
7279 .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } },
7280 },
25837281 .patterns = &.{
2584 .{ .src = .{ .to_gpr, .to_gpr } },
7282 .{ .src = .{ .to_mem, .to_mem } },
25857283 },
2586 .dst_temps = .{.{ .rc = .general_purpose }},
7284 .extra_temps = .{
7285 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7286 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
7287 .unused,
7288 .unused,
7289 .unused,
7290 .unused,
7291 .unused,
7292 .unused,
7293 .unused,
7294 },
7295 .dst_temps = .{.mem},
7296 .clobbers = .{ .eflags = true },
25877297 .each = .{ .once = &.{
2588 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"2", .src1), ._, ._ },
2589 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
7298 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7299 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ },
7300 .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
7301 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
7302 .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ },
7303 .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ },
7304 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
7305 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
25907306 } },
25917307 }, .{
2592 .dst_constraints = .{.{ .elem_size_is = 4 }},
7308 .required_features = .{ .avx, null, null, null },
7309 .src_constraints = .{
7310 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
7311 .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } },
7312 },
25937313 .patterns = &.{
2594 .{ .src = .{ .to_gpr, .to_gpr } },
7314 .{ .src = .{ .to_sse, .mem } },
7315 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7316 .{ .src = .{ .to_sse, .to_sse } },
25957317 },
2596 .dst_temps = .{.{ .rc = .general_purpose }},
7318 .dst_temps = .{.{ .rc = .sse }},
25977319 .each = .{ .once = &.{
2598 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"4", .src1), ._, ._ },
7320 .{ ._, .vp_q, .cmpgt, .dst0x, .src0x, .src1x, ._ },
7321 .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x },
25997322 } },
26007323 }, .{
2601 .dst_constraints = .{.{ .elem_size_is = 4 + 1 }},
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 },
26027329 .patterns = &.{
2603 .{ .src = .{ .to_gpr, .to_gpr } },
7330 .{ .src = .{ .to_mut_sse, .mem } },
7331 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
7332 .{ .src = .{ .to_mut_sse, .to_sse } },
26047333 },
2605 .dst_temps = .{.{ .ref = .src1 }},
7334 .extra_temps = .{
7335 .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } },
7336 .unused,
7337 .unused,
7338 .unused,
7339 .unused,
7340 .unused,
7341 .unused,
7342 .unused,
7343 .unused,
7344 },
7345 .dst_temps = .{.{ .ref = .src0 }},
26067346 .each = .{ .once = &.{
2607 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"4", .src1), ._, ._ },
2608 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
7347 .{ ._, ._dqa, .mov, .tmp0x, .src0x, ._, ._ },
7348 .{ ._, .p_q, .cmpgt, .tmp0x, .src1x, ._, ._ },
7349 .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp0x, ._ },
26097350 } },
26107351 }, .{
2611 .required_features = .{ .@"64bit", null, null, null },
2612 .dst_constraints = .{.{ .elem_size_is = 8 }},
7352 .required_features = .{ .avx2, null, null, null },
7353 .src_constraints = .{
7354 .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } },
7355 .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } },
7356 },
26137357 .patterns = &.{
2614 .{ .src = .{ .to_gpr, .to_gpr } },
7358 .{ .src = .{ .to_sse, .mem } },
7359 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7360 .{ .src = .{ .to_sse, .to_sse } },
26157361 },
2616 .dst_temps = .{.{ .rc = .general_purpose }},
7362 .dst_temps = .{.{ .rc = .sse }},
26177363 .each = .{ .once = &.{
2618 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"8", .src1), ._, ._ },
7364 .{ ._, .vp_q, .cmpgt, .dst0y, .src0y, .src1y, ._ },
7365 .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y },
26197366 } },
26207367 }, .{
2621 .required_features = .{ .@"64bit", null, null, null },
2622 .dst_constraints = .{.{ .elem_size_is = 8 + 1 }},
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 },
26237373 .patterns = &.{
2624 .{ .src = .{ .to_gpr, .to_gpr } },
7374 .{ .src = .{ .to_mem, .to_mem } },
26257375 },
2626 .dst_temps = .{.{ .ref = .src1 }},
7376 .extra_temps = .{
7377 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7378 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
7379 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
7380 .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } },
7381 .unused,
7382 .unused,
7383 .unused,
7384 .unused,
7385 .unused,
7386 },
7387 .dst_temps = .{.mem},
7388 .clobbers = .{ .eflags = true },
26277389 .each = .{ .once = &.{
2628 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"8", .src1), ._, ._ },
2629 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
7390 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7391 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7392 .{ ._, .v_dqa, .mov, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
7393 .{ ._, .vp_q, .cmpgt, .tmp3y, .tmp1y, .tmp2y, ._ },
7394 .{ ._, .vp_b, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
7395 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
7396 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7397 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
26307398 } },
26317399 }, .{
2632 .dst_constraints = .{.po2_elem_size},
7400 .required_features = .{ .avx, null, null, null },
7401 .src_constraints = .{
7402 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
7403 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
7404 },
26337405 .patterns = &.{
2634 .{ .src = .{ .to_gpr, .to_mut_gpr } },
7406 .{ .src = .{ .to_mem, .to_mem } },
26357407 },
2636 .dst_temps = .{.{ .ref = .src1 }},
7408 .extra_temps = .{
7409 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7410 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
7411 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
7412 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
7413 .unused,
7414 .unused,
7415 .unused,
7416 .unused,
7417 .unused,
7418 },
7419 .dst_temps = .{.mem},
26377420 .clobbers = .{ .eflags = true },
26387421 .each = .{ .once = &.{
2639 .{ ._, ._l, .sh, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ },
2640 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
7422 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7423 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7424 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7425 .{ ._, .vp_q, .cmpgt, .tmp3x, .tmp1x, .tmp2x, ._ },
7426 .{ ._, .vp_b, .blendv, .tmp1x, .tmp1x, .tmp2x, .tmp3x },
7427 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
7428 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7429 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
26417430 } },
26427431 }, .{
7432 .required_features = .{ .sse4_2, null, null, null },
7433 .src_constraints = .{
7434 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
7435 .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } },
7436 },
26437437 .patterns = &.{
2644 .{ .src = .{ .to_gpr, .to_gpr } },
7438 .{ .src = .{ .to_mem, .to_mem } },
26457439 },
2646 .dst_temps = .{.{ .rc = .general_purpose }},
7440 .extra_temps = .{
7441 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7442 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
7443 .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } },
7444 .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } },
7445 .unused,
7446 .unused,
7447 .unused,
7448 .unused,
7449 .unused,
7450 },
7451 .dst_temps = .{.mem},
26477452 .clobbers = .{ .eflags = true },
26487453 .each = .{ .once = &.{
2649 .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .add_src0_elem_size), ._ },
2650 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
7454 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7455 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7456 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7457 .{ ._, ._dqa, .mov, .tmp3x, .tmp1x, ._, ._ },
7458 .{ ._, .p_q, .cmpgt, .tmp3x, .tmp2x, ._, ._ },
7459 .{ ._, .p_b, .blendv, .tmp1x, .tmp2x, .tmp3x, ._ },
7460 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
7461 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7462 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
26517463 } },
2652 } }) catch |err| switch (err) {
2653 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
2654 @tagName(air_tag),
2655 cg.typeOf(bin_op.lhs).fmt(pt),
2656 ops[0].tracking(cg),
2657 ops[1].tracking(cg),
2658 }),
2659 else => |e| return e,
2660 } else { // hack around Sema OPV bugs
2661 res[0] = ops[0];
2662 }
2663 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
2664 },
2665 .ptr_sub => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else {
2666 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
2667 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
2668 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
2669 try ops[0].toSlicePtr(cg);
2670 var res: [1]Temp = undefined;
2671 if (ty_pl.ty.toType().elemType2(zcu).hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{ty_pl.ty.toType()}, &ops, comptime &.{ .{
7464 }, .{
7465 .required_features = .{ .@"64bit", .cmov, null, null },
7466 .src_constraints = .{
7467 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
7468 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
7469 },
26727470 .patterns = &.{
2673 .{ .src = .{ .to_gpr, .simm32 } },
7471 .{ .src = .{ .to_mem, .to_mem } },
26747472 },
2675 .dst_temps = .{.{ .rc = .general_purpose }},
7473 .extra_temps = .{
7474 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7475 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
7476 .unused,
7477 .unused,
7478 .unused,
7479 .unused,
7480 .unused,
7481 .unused,
7482 .unused,
7483 },
7484 .dst_temps = .{.mem},
7485 .clobbers = .{ .eflags = true },
26767486 .each = .{ .once = &.{
2677 .{ ._, ._, .lea, .dst0p, .leaa(.none, .src0, .sub_src0_elem_size_times_src1), ._, ._ },
7487 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7488 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7489 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7490 .{ ._, ._ge, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7491 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
7492 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
7493 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
26787494 } },
26797495 }, .{
2680 .dst_constraints = .{.{ .elem_size_is = 1 }},
7496 .required_features = .{ .@"64bit", null, null, null },
7497 .src_constraints = .{
7498 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
7499 .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } },
7500 },
26817501 .patterns = &.{
2682 .{ .src = .{ .to_gpr, .to_mut_gpr } },
7502 .{ .src = .{ .to_mem, .to_mem } },
26837503 },
2684 .dst_temps = .{.{ .ref = .src1 }},
7504 .extra_temps = .{
7505 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7506 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
7507 .unused,
7508 .unused,
7509 .unused,
7510 .unused,
7511 .unused,
7512 .unused,
7513 .unused,
7514 },
7515 .dst_temps = .{.mem},
26857516 .clobbers = .{ .eflags = true },
26867517 .each = .{ .once = &.{
2687 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2688 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
7518 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7519 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7520 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7521 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
7522 .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7523 .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
7524 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
7525 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
26897526 } },
26907527 }, .{
2691 .dst_constraints = .{.{ .elem_size_is = 2 }},
7528 .required_features = .{ .avx, null, null, null },
7529 .src_constraints = .{
7530 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7531 .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7532 },
26927533 .patterns = &.{
2693 .{ .src = .{ .to_gpr, .to_mut_gpr } },
7534 .{ .src = .{ .to_sse, .mem } },
7535 .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } },
7536 .{ .src = .{ .to_sse, .to_sse } },
26947537 },
2695 .dst_temps = .{.{ .ref = .src1 }},
7538 .extra_temps = .{
7539 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7540 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
7541 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
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,
7639 .unused,
7640 },
7641 .dst_temps = .{.mem},
26967642 .clobbers = .{ .eflags = true },
26977643 .each = .{ .once = &.{
2698 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2699 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"2", .src1), ._, ._ },
7644 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
7645 .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.qword, .tmp0), ._, ._ },
7646 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7647 .{ .@"0:", .v_dqa, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
7648 .{ ._, .v_dqa, .mov, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
7649 .{ ._, .vp_, .xor, .tmp5y, .tmp3y, .tmp2y, ._ },
7650 .{ ._, .vp_, .xor, .tmp6y, .tmp4y, .tmp2y, ._ },
7651 .{ ._, .vp_q, .cmpgt, .tmp5y, .tmp5y, .tmp6y, ._ },
7652 .{ ._, .vp_b, .blendv, .tmp3y, .tmp3y, .tmp4y, .tmp5y },
7653 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ },
7654 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
7655 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27007656 } },
27017657 }, .{
2702 .dst_constraints = .{.{ .elem_size_is = 2 + 1 }},
7658 .required_features = .{ .avx, null, null, null },
7659 .src_constraints = .{
7660 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7661 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7662 },
27037663 .patterns = &.{
2704 .{ .src = .{ .to_gpr, .to_gpr } },
7664 .{ .src = .{ .to_mem, .to_mem } },
27057665 },
2706 .dst_temps = .{.{ .rc = .general_purpose }},
7666 .extra_temps = .{
7667 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7668 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
7669 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
7670 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
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,
7675 .unused,
7676 },
7677 .dst_temps = .{.mem},
27077678 .clobbers = .{ .eflags = true },
27087679 .each = .{ .once = &.{
2709 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"2", .src1), ._, ._ },
2710 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2711 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
7680 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
7681 .{ ._, .v_, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
7682 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7683 .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7684 .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7685 .{ ._, .vp_, .xor, .tmp5x, .tmp3x, .tmp2x, ._ },
7686 .{ ._, .vp_, .xor, .tmp6x, .tmp4x, .tmp2x, ._ },
7687 .{ ._, .vp_q, .cmpgt, .tmp5x, .tmp5x, .tmp6x, ._ },
7688 .{ ._, .vp_b, .blendv, .tmp3x, .tmp3x, .tmp4x, .tmp5x },
7689 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
7690 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7691 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27127692 } },
27137693 }, .{
2714 .dst_constraints = .{.{ .elem_size_is = 4 }},
7694 .required_features = .{ .sse4_2, null, null, null },
7695 .src_constraints = .{
7696 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7697 .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } },
7698 },
27157699 .patterns = &.{
2716 .{ .src = .{ .to_gpr, .to_mut_gpr } },
7700 .{ .src = .{ .to_mem, .to_mem } },
27177701 },
2718 .dst_temps = .{.{ .ref = .src1 }},
7702 .extra_temps = .{
7703 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7704 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
7705 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
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 } },
7710 .unused,
7711 .unused,
7712 },
7713 .dst_temps = .{.mem},
27197714 .clobbers = .{ .eflags = true },
27207715 .each = .{ .once = &.{
2721 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2722 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"4", .src1), ._, ._ },
7716 .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ },
7717 .{ ._, ._, .movddup, .tmp2x, .lea(.qword, .tmp0), ._, ._ },
7718 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7719 .{ .@"0:", ._dqa, .mov, .tmp5x, .tmp2x, ._, ._ },
7720 .{ ._, ._dqa, .mov, .tmp6x, .tmp2x, ._, ._ },
7721 .{ ._, ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
7722 .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
7723 .{ ._, .p_, .xor, .tmp5x, .tmp3x, ._, ._ },
7724 .{ ._, .p_, .xor, .tmp6x, .tmp4x, ._, ._ },
7725 .{ ._, .p_q, .cmpgt, .tmp5x, .tmp6x, ._, ._ },
7726 .{ ._, .p_b, .blendv, .tmp3x, .tmp4x, .tmp5x, ._ },
7727 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
7728 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
7729 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27237730 } },
27247731 }, .{
2725 .dst_constraints = .{.{ .elem_size_is = 4 + 1 }},
7732 .required_features = .{ .@"64bit", .cmov, null, null },
7733 .src_constraints = .{
7734 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
7735 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
7736 },
27267737 .patterns = &.{
2727 .{ .src = .{ .to_gpr, .to_gpr } },
7738 .{ .src = .{ .to_mem, .to_mem } },
27287739 },
2729 .dst_temps = .{.{ .rc = .general_purpose }},
7740 .extra_temps = .{
7741 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7742 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7743 .unused,
7744 .unused,
7745 .unused,
7746 .unused,
7747 .unused,
7748 .unused,
7749 .unused,
7750 },
7751 .dst_temps = .{.mem},
27307752 .clobbers = .{ .eflags = true },
27317753 .each = .{ .once = &.{
2732 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"4", .src1), ._, ._ },
2733 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2734 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
7754 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7755 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7756 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7757 .{ ._, ._ae, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7758 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
7759 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
7760 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27357761 } },
27367762 }, .{
27377763 .required_features = .{ .@"64bit", null, null, null },
2738 .dst_constraints = .{.{ .elem_size_is = 8 }},
7764 .src_constraints = .{
7765 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
7766 .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } },
7767 },
27397768 .patterns = &.{
2740 .{ .src = .{ .to_gpr, .to_mut_gpr } },
7769 .{ .src = .{ .to_mem, .to_mem } },
27417770 },
2742 .dst_temps = .{.{ .ref = .src1 }},
7771 .extra_temps = .{
7772 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7773 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
7774 .unused,
7775 .unused,
7776 .unused,
7777 .unused,
7778 .unused,
7779 .unused,
7780 .unused,
7781 },
7782 .dst_temps = .{.mem},
27437783 .clobbers = .{ .eflags = true },
27447784 .each = .{ .once = &.{
2745 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2746 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"8", .src1), ._, ._ },
7785 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7786 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7787 .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7788 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
7789 .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7790 .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
7791 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
7792 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
7793 } },
7794 }, .{
7795 .required_features = .{ .@"64bit", .cmov, null, null },
7796 .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int },
7797 .patterns = &.{
7798 .{ .src = .{ .to_mem, .to_mem } },
7799 },
7800 .extra_temps = .{
7801 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7802 .{ .type = .isize, .kind = .{ .reg = .rsi } },
7803 .{ .type = .u64, .kind = .{ .reg = .rdi } },
7804 .{ .type = .u64, .kind = .{ .reg = .rcx } },
7805 .unused,
7806 .unused,
7807 .unused,
7808 .unused,
7809 .unused,
7810 },
7811 .dst_temps = .{.mem},
7812 .clobbers = .{ .eflags = true },
7813 .each = .{ .once = &.{
7814 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7815 .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ },
7816 .{ ._, ._c, .cl, ._, ._, ._, ._ },
7817 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7818 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7819 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
7820 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
7821 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
7822 .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7823 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7824 .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
7825 .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
7826 .{ ._, ._ge, .cmov, .tmp1p, .tmp2p, ._, ._ },
7827 .{ ._, ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
7828 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
7829 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
7830 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
7831 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27477832 } },
27487833 }, .{
27497834 .required_features = .{ .@"64bit", null, null, null },
2750 .dst_constraints = .{.{ .elem_size_is = 8 + 1 }},
7835 .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int },
27517836 .patterns = &.{
2752 .{ .src = .{ .to_gpr, .to_gpr } },
7837 .{ .src = .{ .to_mem, .to_mem } },
27537838 },
2754 .dst_temps = .{.{ .rc = .general_purpose }},
7839 .extra_temps = .{
7840 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7841 .{ .type = .isize, .kind = .{ .reg = .rsi } },
7842 .{ .type = .u64, .kind = .{ .reg = .rdi } },
7843 .{ .type = .u64, .kind = .{ .reg = .rcx } },
7844 .unused,
7845 .unused,
7846 .unused,
7847 .unused,
7848 .unused,
7849 },
7850 .dst_temps = .{.mem},
27557851 .clobbers = .{ .eflags = true },
27567852 .each = .{ .once = &.{
2757 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"8", .src1), ._, ._ },
2758 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2759 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
7853 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7854 .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ },
7855 .{ ._, ._c, .cl, ._, ._, ._, ._ },
7856 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7857 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7858 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
7859 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
7860 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
7861 .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7862 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7863 .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
7864 .{ ._, ._nge, .j, .@"1f", ._, ._, ._ },
7865 .{ ._, ._, .lea, .tmp1p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
7866 .{ .@"1:", ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ },
7867 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
7868 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
7869 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
7870 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27607871 } },
27617872 }, .{
2762 .dst_constraints = .{.po2_elem_size},
7873 .required_features = .{ .@"64bit", .cmov, null, null },
7874 .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int },
27637875 .patterns = &.{
2764 .{ .src = .{ .to_gpr, .to_mut_gpr } },
7876 .{ .src = .{ .to_mem, .to_mem } },
27657877 },
2766 .dst_temps = .{.{ .ref = .src1 }},
7878 .extra_temps = .{
7879 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7880 .{ .type = .isize, .kind = .{ .reg = .rsi } },
7881 .{ .type = .u64, .kind = .{ .reg = .rdi } },
7882 .{ .type = .u64, .kind = .{ .reg = .rcx } },
7883 .unused,
7884 .unused,
7885 .unused,
7886 .unused,
7887 .unused,
7888 },
7889 .dst_temps = .{.mem},
27677890 .clobbers = .{ .eflags = true },
27687891 .each = .{ .once = &.{
2769 .{ ._, ._l, .sa, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ },
2770 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2771 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
7892 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7893 .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
7894 .{ ._, ._c, .cl, ._, ._, ._, ._ },
7895 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7896 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7897 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
7898 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
7899 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
7900 .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ },
7901 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ },
7902 .{ ._, ._ae, .cmov, .tmp1p, .tmp2p, ._, ._ },
7903 .{ ._, ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ },
7904 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
7905 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
7906 .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ },
7907 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
27727908 } },
27737909 }, .{
7910 .required_features = .{ .@"64bit", null, null, null },
7911 .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int },
27747912 .patterns = &.{
2775 .{ .src = .{ .to_gpr, .to_gpr } },
7913 .{ .src = .{ .to_mem, .to_mem } },
27767914 },
2777 .dst_temps = .{.{ .rc = .general_purpose }},
7915 .extra_temps = .{
7916 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7917 .{ .type = .isize, .kind = .{ .reg = .rsi } },
7918 .{ .type = .u64, .kind = .{ .reg = .rdi } },
7919 .{ .type = .u64, .kind = .{ .reg = .rcx } },
7920 .unused,
7921 .unused,
7922 .unused,
7923 .unused,
7924 .unused,
7925 },
7926 .dst_temps = .{.mem},
27787927 .clobbers = .{ .eflags = true },
27797928 .each = .{ .once = &.{
2780 .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .sub_src0_elem_size), ._ },
2781 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
7929 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
7930 .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
7931 .{ ._, ._c, .cl, ._, ._, ._, ._ },
7932 .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ },
7933 .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ },
7934 .{ ._, ._, .lea, .tmp0p, .lead(.none, .tmp0, 8), ._, ._ },
7935 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
7936 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
7937 .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ },
7938 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
7939 .{ ._, ._, .lea, .tmp1p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ },
7940 .{ .@"1:", ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ },
7941 .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ },
7942 .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ },
7943 .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ },
7944 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
27827945 } },
27837946 } }) catch |err| switch (err) {
27847947 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
......@@ -2788,10 +7951,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27887951 ops[1].tracking(cg),
27897952 }),
27907953 else => |e| return e,
2791 } else {
2792 // hack around Sema OPV bugs
2793 res[0] = ops[0];
2794 }
7954 };
27957955 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
27967956 },
27977957 .alloc => if (use_old) try cg.airAlloc(inst) else {
......@@ -15760,13 +20920,13 @@ fn airIntCast(self: *CodeGen, inst: Air.Inst.Index) !void {
1576020920 const src_mcv = try self.resolveInst(ty_op.operand);
1576120921 if (dst_ty.isVector(zcu)) {
1576220922 const max_abi_size = @max(dst_abi_size, src_abi_size);
15763 if (max_abi_size > self.vectorSize(.int)) break :result null;
1576420923 const has_avx = self.hasFeature(.avx);
1576520924
1576620925 const dst_elem_abi_size = dst_ty.childType(zcu).abiSize(zcu);
1576720926 const src_elem_abi_size = src_ty.childType(zcu).abiSize(zcu);
1576820927 switch (std.math.order(dst_elem_abi_size, src_elem_abi_size)) {
1576920928 .lt => {
20929 if (max_abi_size > self.vectorSize(.int)) break :result null;
1577020930 const mir_tag: Mir.Inst.FixedTag = switch (dst_elem_abi_size) {
1577120931 else => break :result null,
1577220932 1 => switch (src_elem_abi_size) {
......@@ -15823,6 +20983,7 @@ fn airIntCast(self: *CodeGen, inst: Air.Inst.Index) !void {
1582320983 break :result dst_mcv;
1582420984 },
1582520985 .gt => if (self.hasFeature(.sse4_1)) {
20986 if (max_abi_size > self.vectorSize(.int)) break :result null;
1582620987 const mir_tag: Mir.Inst.FixedTag = .{ switch (dst_elem_abi_size) {
1582720988 else => break :result null,
1582820989 2 => if (has_avx) .vp_w else .p_w,
......@@ -32296,9 +37457,8 @@ fn limitImmediateType(self: *CodeGen, operand: Air.Inst.Ref, comptime T: type) !
3229637457 return mcv;
3229737458}
3229837459
32299fn genTypedValue(self: *CodeGen, val: Value) InnerError!MCValue {
32300 const pt = self.pt;
32301 return switch (try codegen.genTypedValue(self.bin_file, pt, self.src_loc, val, self.target.*)) {
37460fn genResult(self: *CodeGen, res: codegen.GenResult) InnerError!MCValue {
37461 return switch (res) {
3230237462 .mcv => |mcv| switch (mcv) {
3230337463 .none => .none,
3230437464 .undef => .undef,
......@@ -32315,6 +37475,14 @@ fn genTypedValue(self: *CodeGen, val: Value) InnerError!MCValue {
3231537475 };
3231637476}
3231737477
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
3231837486const CallMCValues = struct {
3231937487 args: []MCValue,
3232037488 return_value: InstTracking,
......@@ -34106,6 +39274,10 @@ fn tempFromValue(cg: *CodeGen, value: Value) !Temp {
3410639274 return cg.tempInit(value.typeOf(cg.pt.zcu), try cg.genTypedValue(value));
3410739275}
3410839276
39277fn tempMemFromValue(cg: *CodeGen, value: Value) !Temp {
39278 return cg.tempInit(value.typeOf(cg.pt.zcu), try cg.lowerUav(value));
39279}
39280
3410939281fn tempFromOperand(
3411039282 cg: *CodeGen,
3411139283 inst: Air.Inst.Index,
......@@ -34364,7 +39536,10 @@ const Select = struct {
3436439536 any_bool_vec,
3436539537 any_int,
3436639538 any_signed_int,
39539 any_unsigned_int,
3436739540 any_scalar_int,
39541 any_scalar_signed_int,
39542 any_scalar_unsigned_int,
3436839543 any_float,
3436939544 po2_any,
3437039545 bool_vec: Memory.Size,
......@@ -34376,10 +39551,14 @@ const Select = struct {
3437639551 multiple_size: Memory.Size,
3437739552 int: Memory.Size,
3437839553 scalar_int_is: Memory.Size,
39554 scalar_signed_int_is: Memory.Size,
39555 scalar_unsigned_int_is: Memory.Size,
3437939556 scalar_int: OfIsSizes,
34380 scalar_signed_int: Memory.Size,
34381 scalar_unsigned_int: Memory.Size,
39557 scalar_signed_int: OfIsSizes,
39558 scalar_unsigned_int: OfIsSizes,
3438239559 multiple_scalar_int: OfIsSizes,
39560 multiple_scalar_signed_int: OfIsSizes,
39561 multiple_scalar_unsigned_int: OfIsSizes,
3438339562 scalar_remainder_int: OfIsSizes,
3438439563 float: Memory.Size,
3438539564 scalar_any_float: Memory.Size,
......@@ -34413,7 +39592,10 @@ const Select = struct {
3441339592 .any_bool_vec => ty.isVector(zcu) and ty.childType(zcu).toIntern() == .bool_type,
3441439593 .any_int => cg.intInfo(ty) != null,
3441539594 .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,
3441639596 .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,
3441739599 .any_float => ty.isRuntimeFloat(),
3441839600 .po2_any => std.math.isPowerOfTwo(ty.abiSize(zcu)),
3441939601 .bool_vec => |size| ty.isVector(zcu) and ty.scalarType(zcu).toIntern() == .bool_type and
......@@ -34436,18 +39618,30 @@ const Select = struct {
3443639618 size.bitSize(cg.target) >= int_info.bits
3443739619 else
3443839620 false,
34439 .scalar_int => |of_is| @divExact(of_is.of.bitSize(cg.target), 8) >= cg.unalignedSize(ty) and
34440 if (cg.intInfo(ty.scalarType(zcu))) |int_info| of_is.is.bitSize(cg.target) >= int_info.bits else false,
34441 .scalar_signed_int => |size| if (cg.intInfo(ty.scalarType(zcu))) |int_info| switch (int_info.signedness) {
39621 .scalar_signed_int_is => |size| if (cg.intInfo(ty.scalarType(zcu))) |int_info| switch (int_info.signedness) {
3444239622 .signed => size.bitSize(cg.target) >= int_info.bits,
3444339623 .unsigned => false,
3444439624 } else false,
34445 .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) {
3444639626 .signed => false,
3444739627 .unsigned => size.bitSize(cg.target) >= int_info.bits,
3444839628 } 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,
3444939637 .multiple_scalar_int => |of_is| ty.abiSize(zcu) % @divExact(of_is.of.bitSize(cg.target), 8) == 0 and
3445039638 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,
3445139645 .scalar_remainder_int => |of_is| if (cg.intInfo(ty.scalarType(zcu))) |int_info|
3445239646 of_is.is.bitSize(cg.target) >= (int_info.bits - 1) % of_is.of.bitSize(cg.target) + 1
3445339647 else
......@@ -34548,6 +39742,10 @@ const Select = struct {
3454839742 to_x87,
3454939743 mut_x87,
3455039744 to_mut_x87,
39745 mmx,
39746 to_mmx,
39747 mut_mmx,
39748 to_mut_mmx,
3455139749 mm,
3455239750 to_mm,
3455339751 mut_mm,
......@@ -34611,6 +39809,17 @@ const Select = struct {
3461139809 else => false,
3461239810 },
3461339811 .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,
3461439823 .mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) {
3461539824 .register => |reg| reg.class() == .mmx,
3461639825 .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0,
......@@ -34668,8 +39877,8 @@ const Select = struct {
3466839877 .mut_gpr, .to_mut_gpr => try temp.toRegClass(true, .general_purpose, cg),
3466939878 .x87, .to_x87 => try temp.toRegClass(false, .x87, cg),
3467039879 .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg),
34671 .mm, .to_mm => try temp.toRegClass(false, .mmx, cg),
34672 .mut_mm, .to_mut_mm => try temp.toRegClass(true, .mmx, cg),
39880 .mmx, .to_mmx, .mm, .to_mm => try temp.toRegClass(false, .mmx, cg),
39881 .mut_mmx, .to_mut_mmx, .mut_mm, .to_mut_mm => try temp.toRegClass(true, .mmx, cg),
3467339882 .sse, .to_sse, .xmm, .to_xmm, .ymm, .to_ymm => try temp.toRegClass(false, .sse, cg),
3467439883 .mut_sse, .to_mut_sse, .mut_xmm, .to_mut_xmm, .mut_ymm, .to_mut_ymm => try temp.toRegClass(true, .sse, cg),
3467539884 };
......@@ -34701,7 +39910,7 @@ const Select = struct {
3470139910 umax_mem: ConstInfo,
3470239911 symbol: *const struct { lib: ?[]const u8 = null, name: []const u8 },
3470339912
34704 const ConstInfo = struct { ref: Select.Operand.Ref, vectorize_to: Memory.Size = .none };
39913 const ConstInfo = struct { ref: Select.Operand.Ref, vectorize_to: ?Memory.Size = null };
3470539914
3470639915 fn finish(kind: Kind, temp: Temp, s: *const Select) void {
3470739916 switch (kind) {
......@@ -34758,10 +39967,10 @@ const Select = struct {
3475839967 else => .{ null, ty },
3475939968 .vector_type => |vector_type| .{ vector_type.len, .fromInterned(vector_type.child) },
3476039969 };
34761 const res_vector_len: ?u32 = if (const_info.vectorize_to != .none)
34762 @intCast(@divExact(@divExact(const_info.vectorize_to.bitSize(cg.target), 8), scalar_ty.abiSize(pt.zcu)))
34763 else
34764 vector_len;
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;
3476539974 const res_scalar_ty, const res_scalar_val: Value = res_scalar: switch (scalar_ty.toIntern()) {
3476639975 .bool_type => .{
3476739976 scalar_ty,
......@@ -34813,7 +40022,7 @@ const Select = struct {
3481340022 })).toIntern(),
3481440023 .storage = .{ .repeated_elem = res_scalar_val.toIntern() },
3481540024 } })) else res_scalar_val;
34816 return try cg.tempFromValue(res_val);
40025 return try cg.tempMemFromValue(res_val);
3481740026 },
3481840027 .symbol => |symbol| if (cg.bin_file.cast(.elf)) |elf_file| try cg.tempInit(spec.type, .{ .lea_symbol = .{
3481940028 .sym_index = try elf_file.getGlobalSymbol(symbol.name, symbol.lib),
......@@ -34855,13 +40064,13 @@ const Select = struct {
3485540064 mem,
3485640065 };
3485740066 const Adjust = packed struct(u8) {
34858 factor: i2,
34859 scale: Memory.Scale,
34860 amount: enum(u4) {
40067 sign: enum(u1) { neg, pos },
40068 lhs: enum(u4) {
3486140069 none,
3486240070 ptr_size,
3486340071 ptr_bit_size,
3486440072 size,
40073 size_sub_elem_size,
3486540074 src0_unaligned_size,
3486640075 bit_size,
3486740076 src0_bit_size,
......@@ -34874,35 +40083,41 @@ const Select = struct {
3487440083 smax,
3487540084 umax,
3487640085 },
34877
34878 const none: Adjust = .{ .factor = 0, .scale = .@"1", .amount = .none };
34879 const sub_ptr_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .ptr_size };
34880 const add_ptr_bit_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .ptr_bit_size };
34881 const add_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .size };
34882 const sub_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .size };
34883 const add_src0_unaligned_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_unaligned_size };
34884 const sub_src0_unaligned_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_unaligned_size };
34885 const add_2_bit_size: Adjust = .{ .factor = 1, .scale = .@"2", .amount = .bit_size };
34886 const add_bit_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .bit_size };
34887 const sub_bit_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .bit_size };
34888 const add_src0_bit_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_bit_size };
34889 const sub_src0_bit_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_bit_size };
34890 const add_8_len: Adjust = .{ .factor = 1, .scale = .@"8", .amount = .len };
34891 const add_4_len: Adjust = .{ .factor = 1, .scale = .@"4", .amount = .len };
34892 const add_3_len: Adjust = .{ .factor = 1, .scale = .@"3", .amount = .len };
34893 const add_2_len: Adjust = .{ .factor = 1, .scale = .@"2", .amount = .len };
34894 const add_len: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .len };
34895 const sub_len: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .len };
34896 const add_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_elem_size };
34897 const add_2_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"2", .amount = .src0_elem_size };
34898 const add_4_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"4", .amount = .src0_elem_size };
34899 const add_8_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"8", .amount = .src0_elem_size };
34900 const sub_src0_elem_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_elem_size };
34901 const add_src0_elem_size_times_src1: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_elem_size_times_src1 };
34902 const sub_src0_elem_size_times_src1: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_elem_size_times_src1 };
34903 const add_log2_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .log2_src0_elem_size };
34904 const add_elem_limbs: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .elem_limbs };
34905 const add_umax: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .umax };
40086 op: enum(u1) { mul, div },
40087 rhs: Memory.Scale,
40088
40089 const none: Adjust = .{ .sign = .pos, .lhs = .none, .op = .mul, .rhs = .@"1" };
40090 const sub_ptr_size: Adjust = .{ .sign = .neg, .lhs = .ptr_size, .op = .mul, .rhs = .@"1" };
40091 const add_ptr_bit_size: Adjust = .{ .sign = .pos, .lhs = .ptr_bit_size, .op = .mul, .rhs = .@"1" };
40092 const add_size: Adjust = .{ .sign = .pos, .lhs = .size, .op = .mul, .rhs = .@"1" };
40093 const add_size_div_8: Adjust = .{ .sign = .pos, .lhs = .size, .op = .div, .rhs = .@"8" };
40094 const sub_size_div_8: Adjust = .{ .sign = .neg, .lhs = .size, .op = .div, .rhs = .@"8" };
40095 const sub_size: Adjust = .{ .sign = .neg, .lhs = .size, .op = .mul, .rhs = .@"1" };
40096 const add_size_sub_elem_size: Adjust = .{ .sign = .pos, .lhs = .size_sub_elem_size, .op = .mul, .rhs = .@"1" };
40097 const add_src0_unaligned_size: Adjust = .{ .sign = .pos, .lhs = .src0_unaligned_size, .op = .mul, .rhs = .@"1" };
40098 const sub_src0_unaligned_size: Adjust = .{ .sign = .neg, .lhs = .src0_unaligned_size, .op = .mul, .rhs = .@"1" };
40099 const add_2_bit_size: Adjust = .{ .sign = .pos, .lhs = .bit_size, .op = .mul, .rhs = .@"2" };
40100 const add_bit_size: Adjust = .{ .sign = .pos, .lhs = .bit_size, .op = .mul, .rhs = .@"1" };
40101 const sub_bit_size: Adjust = .{ .sign = .neg, .lhs = .bit_size, .op = .mul, .rhs = .@"1" };
40102 const add_src0_bit_size: Adjust = .{ .sign = .pos, .lhs = .src0_bit_size, .op = .mul, .rhs = .@"1" };
40103 const sub_src0_bit_size: Adjust = .{ .sign = .neg, .lhs = .src0_bit_size, .op = .mul, .rhs = .@"1" };
40104 const add_8_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"8" };
40105 const add_4_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"4" };
40106 const add_3_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"3" };
40107 const add_2_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"2" };
40108 const add_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"1" };
40109 const sub_len: Adjust = .{ .sign = .neg, .lhs = .len, .op = .mul, .rhs = .@"1" };
40110 const add_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"1" };
40111 const add_2_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"2" };
40112 const add_4_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"4" };
40113 const add_8_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"8" };
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" };
3490640121 };
3490740122 const Ref = enum(u4) {
3490840123 tmp0,
......@@ -35350,11 +40565,15 @@ const Select = struct {
3535040565 const UnsignedImm = @Type(.{
3535140566 .int = .{ .signedness = .unsigned, .bits = @typeInfo(SignedImm).int.bits },
3535240567 });
35353 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) {
3535440569 .none => 0,
3535540570 .ptr_size => @divExact(s.cg.target.ptrBitWidth(), 8),
3535640571 .ptr_bit_size => s.cg.target.ptrBitWidth(),
3535740572 .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 },
3535840577 .src0_unaligned_size => @intCast(s.cg.unalignedSize(Select.Operand.Ref.src0.deref(s).typeOf(s.cg))),
3535940578 .bit_size => @intCast(op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu)),
3536040579 .src0_bit_size => @intCast(Select.Operand.Ref.src0.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu)),
......@@ -35376,7 +40595,20 @@ const Select = struct {
3537640595 .umax => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(
3537740596 -%op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
3537840597 )),
35379 }) + 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 };
3538040612 }
3538140613
3538240614 fn lower(op: Select.Operand, s: *Select) !CodeGen.Operand {
src/codegen/c/Type.zig+240
......@@ -1437,6 +1437,246 @@ pub const Pool = struct {
14371437 return pool.fromFields(allocator, .@"struct", &fields, kind);
14381438 },
14391439
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 },
14401680 .vector_4_f16_type => {
14411681 const vector_ctype = try pool.getVector(allocator, .{
14421682 .elem_ctype = .f16,
test/behavior/maximum_minimum.zig+3-5
......@@ -33,8 +33,7 @@ test "@max on vectors" {
3333 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
3434 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
3535 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
36 if (builtin.zig_backend == .stage2_x86_64 and
37 !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest;
36 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
3837
3938 const S = struct {
4039 fn doTheTest() !void {
......@@ -89,8 +88,7 @@ test "@min for vectors" {
8988 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9089 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9190 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
92 if (builtin.zig_backend == .stage2_x86_64 and
93 !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest;
91 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
9492
9593 const S = struct {
9694 fn doTheTest() !void {
......@@ -304,7 +302,7 @@ test "@min/@max notices bounds from vector types when element of comptime-known
304302 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
305303 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
306304 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
309307 var x: @Vector(2, u32) = .{ 1_000_000, 12345 };
310308 _ = &x;
test/behavior/x86_64/math.zig+385-33
......@@ -1,11 +1,11 @@
11const builtin = @import("builtin");
22const inf = math.inf;
33const math = std.math;
4const max = math.floatMax;
5const min = math.floatMin;
4const fmax = math.floatMax;
5const fmin = math.floatMin;
66const nan = math.nan;
77const std = @import("std");
8const trueMin = math.floatTrueMin;
8const tmin = math.floatTrueMin;
99
1010const Gpr = switch (builtin.cpu.arch) {
1111 else => unreachable,
......@@ -545,96 +545,96 @@ fn Unary(comptime op: anytype) type {
545545 fn testFloatTypes() !void {
546546 try testArgs(f16, -nan(f16));
547547 try testArgs(f16, -inf(f16));
548 try testArgs(f16, -max(f16));
548 try testArgs(f16, -fmax(f16));
549549 try testArgs(f16, -10.0);
550550 try testArgs(f16, -1.0);
551551 try testArgs(f16, -0.1);
552 try testArgs(f16, -min(f16));
553 try testArgs(f16, -trueMin(f16));
552 try testArgs(f16, -fmin(f16));
553 try testArgs(f16, -tmin(f16));
554554 try testArgs(f16, -0.0);
555555 try testArgs(f16, 0.0);
556 try testArgs(f16, trueMin(f16));
557 try testArgs(f16, min(f16));
556 try testArgs(f16, tmin(f16));
557 try testArgs(f16, fmin(f16));
558558 try testArgs(f16, 0.1);
559559 try testArgs(f16, 1.0);
560560 try testArgs(f16, 10.0);
561 try testArgs(f16, max(f16));
561 try testArgs(f16, fmax(f16));
562562 try testArgs(f16, inf(f16));
563563 try testArgs(f16, nan(f16));
564564
565565 try testArgs(f32, -nan(f32));
566566 try testArgs(f32, -inf(f32));
567 try testArgs(f32, -max(f32));
567 try testArgs(f32, -fmax(f32));
568568 try testArgs(f32, -10.0);
569569 try testArgs(f32, -1.0);
570570 try testArgs(f32, -0.1);
571 try testArgs(f32, -min(f32));
572 try testArgs(f32, -trueMin(f32));
571 try testArgs(f32, -fmin(f32));
572 try testArgs(f32, -tmin(f32));
573573 try testArgs(f32, -0.0);
574574 try testArgs(f32, 0.0);
575 try testArgs(f32, trueMin(f32));
576 try testArgs(f32, min(f32));
575 try testArgs(f32, tmin(f32));
576 try testArgs(f32, fmin(f32));
577577 try testArgs(f32, 0.1);
578578 try testArgs(f32, 1.0);
579579 try testArgs(f32, 10.0);
580 try testArgs(f32, max(f32));
580 try testArgs(f32, fmax(f32));
581581 try testArgs(f32, inf(f32));
582582 try testArgs(f32, nan(f32));
583583
584584 try testArgs(f64, -nan(f64));
585585 try testArgs(f64, -inf(f64));
586 try testArgs(f64, -max(f64));
586 try testArgs(f64, -fmax(f64));
587587 try testArgs(f64, -10.0);
588588 try testArgs(f64, -1.0);
589589 try testArgs(f64, -0.1);
590 try testArgs(f64, -min(f64));
591 try testArgs(f64, -trueMin(f64));
590 try testArgs(f64, -fmin(f64));
591 try testArgs(f64, -tmin(f64));
592592 try testArgs(f64, -0.0);
593593 try testArgs(f64, 0.0);
594 try testArgs(f64, trueMin(f64));
595 try testArgs(f64, min(f64));
594 try testArgs(f64, tmin(f64));
595 try testArgs(f64, fmin(f64));
596596 try testArgs(f64, 0.1);
597597 try testArgs(f64, 1.0);
598598 try testArgs(f64, 10.0);
599 try testArgs(f64, max(f64));
599 try testArgs(f64, fmax(f64));
600600 try testArgs(f64, inf(f64));
601601 try testArgs(f64, nan(f64));
602602
603603 try testArgs(f80, -nan(f80));
604604 try testArgs(f80, -inf(f80));
605 try testArgs(f80, -max(f80));
605 try testArgs(f80, -fmax(f80));
606606 try testArgs(f80, -10.0);
607607 try testArgs(f80, -1.0);
608608 try testArgs(f80, -0.1);
609 try testArgs(f80, -min(f80));
610 try testArgs(f80, -trueMin(f80));
609 try testArgs(f80, -fmin(f80));
610 try testArgs(f80, -tmin(f80));
611611 try testArgs(f80, -0.0);
612612 try testArgs(f80, 0.0);
613 try testArgs(f80, trueMin(f80));
614 try testArgs(f80, min(f80));
613 try testArgs(f80, tmin(f80));
614 try testArgs(f80, fmin(f80));
615615 try testArgs(f80, 0.1);
616616 try testArgs(f80, 1.0);
617617 try testArgs(f80, 10.0);
618 try testArgs(f80, max(f80));
618 try testArgs(f80, fmax(f80));
619619 try testArgs(f80, inf(f80));
620620 try testArgs(f80, nan(f80));
621621
622622 try testArgs(f128, -nan(f128));
623623 try testArgs(f128, -inf(f128));
624 try testArgs(f128, -max(f128));
624 try testArgs(f128, -fmax(f128));
625625 try testArgs(f128, -10.0);
626626 try testArgs(f128, -1.0);
627627 try testArgs(f128, -0.1);
628 try testArgs(f128, -min(f128));
629 try testArgs(f128, -trueMin(f128));
628 try testArgs(f128, -fmin(f128));
629 try testArgs(f128, -tmin(f128));
630630 try testArgs(f128, -0.0);
631631 try testArgs(f128, 0.0);
632 try testArgs(f128, trueMin(f128));
633 try testArgs(f128, min(f128));
632 try testArgs(f128, tmin(f128));
633 try testArgs(f128, fmin(f128));
634634 try testArgs(f128, 0.1);
635635 try testArgs(f128, 1.0);
636636 try testArgs(f128, 10.0);
637 try testArgs(f128, max(f128));
637 try testArgs(f128, fmax(f128));
638638 try testArgs(f128, inf(f128));
639639 try testArgs(f128, nan(f128));
640640 }
......@@ -1391,26 +1391,51 @@ fn Binary(comptime op: anytype) type {
13911391 );
13921392 }
13931393 fn testIntTypes() !void {
1394 try testArgs(i8, 0x48, 0x6c);
13941395 try testArgs(u8, 0xbb, 0x43);
1396 try testArgs(i16, -0x0fdf, 0x302e);
13951397 try testArgs(u16, 0xb8bf, 0x626d);
1398 try testArgs(i32, -0x6280178f, 0x6802c034);
13961399 try testArgs(u32, 0x80d7a2c6, 0xbff6a402);
1400 try testArgs(i64, 0x0365a53b8ee0c987, -0x1bb6d3013500a7d2);
13971401 try testArgs(u64, 0x71138bc6b4a38898, 0x1bc4043de9438c7b);
1402 try testArgs(i128, 0x76d428c46cdeaa2ac43de8abffb22f6d, 0x427f7545abe434a12544fdbe2a012889);
13981403 try testArgs(u128, 0xe05fc132ef2cd8affee00a907f0a851f, 0x29f912a72cfc6a7c6973426a9636da9a);
1404 try testArgs(
1405 i256,
1406 -0x53d4148cee74ea43477a65b3daa7b8fdadcbf4508e793f4af113b8d8da5a7eb6,
1407 -0x30dcbaf7b9b7a3df033694e6795444d842fb0b8f79bc18b3ea8a6b7ccad3ea91,
1408 );
13991409 try testArgs(
14001410 u256,
14011411 0xb7935f5c2f3b1ae7a422c0a7c446884294b7d5370bada307d2fe5a4c4284a999,
14021412 0x310e6e196ba4f143b8d285ca6addf7f3bb3344224aff221b27607a31e148be08,
14031413 );
1414 try testArgs(
1415 i258,
1416 -0x0eee283365108dbeea0bec82f5147418d8ffe86f9eed00e414b4eccd65c21239a,
1417 -0x122c730073fc29a24cd6e3e6263566879bc5325d8566b8db31fcb4a76f7ab95eb,
1418 );
14041419 try testArgs(
14051420 u258,
14061421 0x186d5ddaab8cb8cb04e5b41e36f812e039d008baf49f12894c39e29a07796d800,
14071422 0x2072daba6ffad168826163eb136f6d28ca4360c8e7e5e41e29755e19e4753a4f5,
14081423 );
1424 try testArgs(
1425 i495,
1426 0x2fe6bc5448c55ce18252e2c9d44777505dfe63ff249a8027a6626c7d8dd9893fd5731e51474727be556f757facb586a4e04bbc0148c6c7ad692302f46fbd,
1427 -0x016a358821ef8240172f3a08e8830c06e6bcf2225f5f4d41ed42b44d249385f55cc594e1278ecac31c73faed890e5054af1a561483bb1bb6fb1f753514cf,
1428 );
14091429 try testArgs(
14101430 u495,
14111431 0x6eaf4e252b3bf74b75bac59e0b43ca5326bad2a25b3fdb74a67ef132ac5e47d72eebc3316fb2351ee66c50dc5afb92a75cea9b0e35160652c7db39eeb158,
14121432 0x49fbed744a92b549d8c05bb3512c617d24dd824f3f69bdf3923bc326a75674b85f5b828d2566fab9c86f571d12c2a63c9164feb0d191d27905533d09622a,
14131433 );
1434 try testArgs(
1435 i512,
1436 -0x3a6876ca92775286c6e1504a64a9b8d56985bebf4a1b66539d404e0e96f24b226f70c4bcff295fdc2043b82513b2052dc45fd78f7e9e80e5b3e101757289f054,
1437 0x5080c516a819bd32a0a5f0976441bbfbcf89e77684f1f10eb326aeb28e1f8d593278cff60fc99b8ffc87d8696882c64728dd3c322b7142803f4341f85a03bc10,
1438 );
14141439 try testArgs(
14151440 u512,
14161441 0xe5b1fedca3c77db765e517aabd05ffc524a3a8aff1784bbf67c45b894447ede32b65b9940e78173c591e56e078932d465f235aece7ad47b7f229df7ba8f12295,
......@@ -1418,6 +1443,69 @@ fn Binary(comptime op: anytype) type {
14181443 );
14191444 }
14201445 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
14211509 try testArgs(@Vector(1, u8), .{
14221510 0x1f,
14231511 }, .{
......@@ -1481,6 +1569,67 @@ fn Binary(comptime op: anytype) type {
14811569 0x56, 0x4f, 0xf1, 0xaa, 0x0a, 0x0f, 0xdb, 0x1b, 0xc8, 0x45, 0x9b, 0x12, 0xb4, 0x1a, 0xe4, 0xa3,
14821570 });
14831571
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
14841633 try testArgs(@Vector(1, u16), .{
14851634 0x9d6f,
14861635 }, .{
......@@ -1539,6 +1688,59 @@ fn Binary(comptime op: anytype) type {
15391688 0x2c02, 0xff5b, 0x19ca, 0xbbf5, 0x870e, 0xc9ca, 0x47bb, 0xcfcc,
15401689 });
15411690
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
15421744 try testArgs(@Vector(1, u32), .{
15431745 0x1d0d9cc4,
15441746 }, .{
......@@ -1592,6 +1794,54 @@ fn Binary(comptime op: anytype) type {
15921794 0xf080e943, 0xc8718d14, 0x3f920382, 0x18d101b5,
15931795 });
15941796
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
15951845 try testArgs(@Vector(1, u64), .{
15961846 0x333f593bf9d08546,
15971847 }, .{
......@@ -1640,6 +1890,49 @@ fn Binary(comptime op: anytype) type {
16401890 0xed533d18f8657f3f, 0x1ddd7cd7f6bab957,
16411891 });
16421892
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
16431936 try testArgs(@Vector(1, u128), .{
16441937 0x5f11e16b0ca3392f907a857881455d2e,
16451938 }, .{
......@@ -1683,6 +1976,30 @@ fn Binary(comptime op: anytype) type {
16831976 0xa858bce5ad0e48c13588a4e170e8667c,
16841977 });
16851978
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
16862003 try testArgs(@Vector(1, u256), .{
16872004 0x28df37e1f57a56133ba3f5b5b2164ce24eb6c29a8973a597fd91fbee8ab4bafb,
16882005 }, .{
......@@ -1707,6 +2024,19 @@ fn Binary(comptime op: anytype) type {
17072024 0xe47a122bd45d5e7d69722d864a6b795ddee965a0993094f8791dd309d692de8b,
17082025 });
17092026
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
17102040 try testArgs(@Vector(1, u512), .{
17112041 0x651058c1d89a8f34cfc5e66b6d25294eecfcc4a7e1e4a356eb51ee7d7b2db25378e4afee51b7d18d16e520772a60c50a02d7966f40ced1870b32c658e5821397,
17122042 }, .{
......@@ -1720,6 +2050,12 @@ fn Binary(comptime op: anytype) type {
17202050 0x8fa3d86099e9e2789d72f8e792290356d659ab20ac0414ff94745984c6ae7d986082197bb849889f912e896670aa2c1a11bd7e66e3f650710b0f0a18a1533f90,
17212051 });
17222052
2053 try testArgs(@Vector(1, i1024), .{
2054 -0x4fe568569c0531c9bfbbda1516e93a6c61a3d035c98e13fdc85225165a3bea84d5dc6b610ced008f9321453af42ea50bbf6881d40d2759b73b9b6186c0d6d243f367e292cbbf6b5c5c30d7f4e8de19701c7b0fc9e67cdf31228daa1675a4887f6c4f1588b48855d6f4730a21f27dec8a756c568727709b65cd531020d53ff394,
2055 }, .{
2056 -0x7cab2a053dfbf944cd342460350c989fd1b4469a6c7b54ddcacd54e605d29c03651b5c463495610d82269c9ac5b51bfd07816a0f7b1ab50cb598989ed64607b3faff79a190702eb285b0fedc050ec1a71537abc47ec590eb671d4f76b19567049ba4789d1a4348385607a0320fbff9b78260536a9b6030bddb0b09da689d1687,
2057 });
2058
17232059 try testArgs(@Vector(1, u1024), .{
17242060 0x0ca1a0dfaf8bb1da714b457d23c71aef948e66c7cd45c0aa941498a796fb18502ec32f34e885d0a107d44ae81595f8b52c2f0fb38e584b7139903a0e8a823ae20d01ca0662722dd474e7efc40f32d74cc065d97d8a09d0447f1ab6107fa0a57f3f8c866ae872506627ce82f18add79cee8dc69837f4ead3ca770c4d622d7e544,
17252061 }, .{
......@@ -1778,3 +2114,19 @@ test bitXor {
17782114 try Binary(bitXor).testIntTypes();
17792115 try Binary(bitXor).testIntVectorTypes();
17802116}
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 {
1515// error
1616//
1717// :7:25: error: unable to resolve comptime value
18// :7:25: note: initializer of comptime-only struct 'tmp.S.foo__anon_447.C' must be comptime-known
18// :7:25: note: initializer of comptime-only struct 'tmp.S.foo__anon_463.C' must be comptime-known
1919// :4:16: note: struct requires comptime because of this field
2020// :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 {
1616//
1717// :3:6: error: no field or member function named 'copy' in '[]const u8'
1818// :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_451'
19// :12:18: error: no field or member function named 'bar' in 'tmp.entry2__struct_467'
2020// :12:6: note: struct declared here
test/cases/compile_errors/coerce_anon_struct.zig+1-1
......@@ -6,6 +6,6 @@ export fn foo() void {
66
77// error
88//
9// :4:16: error: expected type 'tmp.T', found 'tmp.foo__struct_440'
9// :4:16: error: expected type 'tmp.T', found 'tmp.foo__struct_456'
1010// :3:16: note: struct declared here
1111// :1:11: note: struct declared here