authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-05-17 02:08:33-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-05-17 18:00:17-04:00
log58d2bd601e3b25e818d6bca2b3267052a12f9917
treea8934f3b8ea4e4da2357129bcd82b31fbef01114
parentd3dfe61eaabb88211565a0e14d162aea1d7bfe47

x86_64: rewrite scalar `<<|`

Closes #23035

16 files changed, 4142 insertions(+), 587 deletions(-)

lib/std/math.zig+21-11
......@@ -774,18 +774,15 @@ pub fn Log2IntCeil(comptime T: type) type {
774774/// Returns the smallest integer type that can hold both from and to.
775775pub fn IntFittingRange(comptime from: comptime_int, comptime to: comptime_int) type {
776776 assert(from <= to);
777 if (from == 0 and to == 0) {
778 return u0;
779 }
780777 const signedness: std.builtin.Signedness = if (from < 0) .signed else .unsigned;
781 const largest_positive_integer = @max(if (from < 0) (-from) - 1 else from, to); // two's complement
782 const base = log2(largest_positive_integer);
783 const upper = (1 << base) - 1;
784 var magnitude_bits = if (upper >= largest_positive_integer) base else base + 1;
785 if (signedness == .signed) {
786 magnitude_bits += 1;
787 }
788 return std.meta.Int(signedness, magnitude_bits);
778 return @Type(.{ .int = .{
779 .signedness = signedness,
780 .bits = @as(u16, @intFromBool(signedness == .signed)) +
781 switch (if (from < 0) @max(@abs(from) - 1, to) else to) {
782 0 => 0,
783 else => |pos_max| 1 + log2(pos_max),
784 },
785 } });
789786}
790787
791788test IntFittingRange {
......@@ -1267,6 +1264,19 @@ pub fn log2_int(comptime T: type, x: T) Log2Int(T) {
12671264 return @as(Log2Int(T), @intCast(@typeInfo(T).int.bits - 1 - @clz(x)));
12681265}
12691266
1267test log2_int {
1268 try testing.expect(log2_int(u32, 1) == 0);
1269 try testing.expect(log2_int(u32, 2) == 1);
1270 try testing.expect(log2_int(u32, 3) == 1);
1271 try testing.expect(log2_int(u32, 4) == 2);
1272 try testing.expect(log2_int(u32, 5) == 2);
1273 try testing.expect(log2_int(u32, 6) == 2);
1274 try testing.expect(log2_int(u32, 7) == 2);
1275 try testing.expect(log2_int(u32, 8) == 3);
1276 try testing.expect(log2_int(u32, 9) == 3);
1277 try testing.expect(log2_int(u32, 10) == 3);
1278}
1279
12701280/// Return the log base 2 of integer value x, rounding up to the
12711281/// nearest integer.
12721282pub fn log2_int_ceil(comptime T: type, x: T) Log2IntCeil(T) {
lib/std/math/big/int.zig+4-4
......@@ -415,12 +415,12 @@ pub const Mutable = struct {
415415 // in the case that scalar happens to be small in magnitude within its type, but it
416416 // is well worth being able to use the stack and not needing an allocator passed in.
417417 // Note that Mutable.init still sets len to calcLimbLen(scalar) in any case.
418 const limb_len = comptime switch (@typeInfo(@TypeOf(scalar))) {
418 const limbs_len = comptime switch (@typeInfo(@TypeOf(scalar))) {
419419 .comptime_int => calcLimbLen(scalar),
420420 .int => |info| calcTwosCompLimbCount(info.bits),
421421 else => @compileError("expected scalar to be an int"),
422422 };
423 var limbs: [limb_len]Limb = undefined;
423 var limbs: [limbs_len]Limb = undefined;
424424 const operand = init(&limbs, scalar).toConst();
425425 return add(r, a, operand);
426426 }
......@@ -2454,12 +2454,12 @@ pub const Const = struct {
24542454 // in the case that scalar happens to be small in magnitude within its type, but it
24552455 // is well worth being able to use the stack and not needing an allocator passed in.
24562456 // Note that Mutable.init still sets len to calcLimbLen(scalar) in any case.
2457 const limb_len = comptime switch (@typeInfo(@TypeOf(scalar))) {
2457 const limbs_len = comptime switch (@typeInfo(@TypeOf(scalar))) {
24582458 .comptime_int => calcLimbLen(scalar),
24592459 .int => |info| calcTwosCompLimbCount(info.bits),
24602460 else => @compileError("expected scalar to be an int"),
24612461 };
2462 var limbs: [limb_len]Limb = undefined;
2462 var limbs: [limbs_len]Limb = undefined;
24632463 const rhs = Mutable.init(&limbs, scalar);
24642464 return order(lhs, rhs.toConst());
24652465 }
lib/std/math/big/int_test.zig-4
......@@ -2295,8 +2295,6 @@ test "sat shift-left signed simple positive" {
22952295}
22962296
22972297test "sat shift-left signed multi positive" {
2298 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
2299
23002298 var x: SignedDoubleLimb = 1;
23012299 _ = &x;
23022300
......@@ -2310,8 +2308,6 @@ test "sat shift-left signed multi positive" {
23102308}
23112309
23122310test "sat shift-left signed multi negative" {
2313 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
2314
23152311 var x: SignedDoubleLimb = -1;
23162312 _ = &x;
23172313
lib/std/math/log2.zig+11-10
......@@ -12,12 +12,10 @@ const expect = std.testing.expect;
1212/// - log2(nan) = nan
1313pub fn log2(x: anytype) @TypeOf(x) {
1414 const T = @TypeOf(x);
15 switch (@typeInfo(T)) {
16 .comptime_float => {
17 return @as(comptime_float, @log2(x));
18 },
19 .float => return @log2(x),
15 return switch (@typeInfo(T)) {
16 .comptime_float, .float => @log2(x),
2017 .comptime_int => comptime {
18 std.debug.assert(x > 0);
2119 var x_shifted = x;
2220 // First, calculate floorPowerOfTwo(x)
2321 var shift_amt = 1;
......@@ -34,12 +32,15 @@ pub fn log2(x: anytype) @TypeOf(x) {
3432 }
3533 return result;
3634 },
37 .int => |IntType| switch (IntType.signedness) {
38 .signed => @compileError("log2 not implemented for signed integers"),
39 .unsigned => return math.log2_int(T, x),
40 },
35 .int => |int_info| math.log2_int(switch (int_info.signedness) {
36 .signed => @Type(.{ .int = .{
37 .signedness = .unsigned,
38 .bits = int_info.bits -| 1,
39 } }),
40 .unsigned => T,
41 }, @intCast(x)),
4142 else => @compileError("log2 not implemented for " ++ @typeName(T)),
42 }
43 };
4344}
4445
4546test log2 {
lib/zig.h+20-11
......@@ -1115,14 +1115,15 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t
11151115\
11161116 static inline uint##w##_t zig_shls_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \
11171117 uint##w##_t res; \
1118 if (rhs >= bits) return lhs != UINT##w##_C(0) ? zig_maxInt_u(w, bits) : lhs; \
1119 return zig_shlo_u##w(&res, lhs, (uint8_t)rhs, bits) ? zig_maxInt_u(w, bits) : res; \
1118 if (rhs < bits && !zig_shlo_u##w(&res, lhs, rhs, bits)) return res; \
1119 return lhs == INT##w##_C(0) ? INT##w##_C(0) : zig_maxInt_u(w, bits); \
11201120 } \
11211121\
1122 static inline int##w##_t zig_shls_i##w(int##w##_t lhs, int##w##_t rhs, uint8_t bits) { \
1122 static inline int##w##_t zig_shls_i##w(int##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \
11231123 int##w##_t res; \
1124 if ((uint##w##_t)rhs < (uint##w##_t)bits && !zig_shlo_i##w(&res, lhs, (uint8_t)rhs, bits)) return res; \
1125 return lhs < INT##w##_C(0) ? zig_minInt_i(w, bits) : zig_maxInt_i(w, bits); \
1124 if (rhs < bits && !zig_shlo_i##w(&res, lhs, rhs, bits)) return res; \
1125 return lhs == INT##w##_C(0) ? INT##w##_C(0) : \
1126 lhs < INT##w##_C(0) ? zig_minInt_i(w, bits) : zig_maxInt_i(w, bits); \
11261127 } \
11271128\
11281129 static inline uint##w##_t zig_adds_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \
......@@ -1851,15 +1852,23 @@ static inline bool zig_shlo_i128(zig_i128 *res, zig_i128 lhs, uint8_t rhs, uint8
18511852
18521853static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
18531854 zig_u128 res;
1854 if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) >= INT32_C(0))
1855 return zig_cmp_u128(lhs, zig_make_u128(0, 0)) != INT32_C(0) ? zig_maxInt_u(128, bits) : lhs;
1856 return zig_shlo_u128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits) ? zig_maxInt_u(128, bits) : res;
1855 if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) < INT32_C(0) && !zig_shlo_u128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits)) return res;
1856 switch (zig_cmp_u128(lhs, zig_make_u128(0, 0))) {
1857 case 0: return zig_make_u128(0, 0);
1858 case 1: return zig_maxInt_u(128, bits);
1859 default: zig_unreachable();
1860 }
18571861}
18581862
1859static inline zig_i128 zig_shls_i128(zig_i128 lhs, zig_i128 rhs, uint8_t bits) {
1863static inline zig_i128 zig_shls_i128(zig_i128 lhs, zig_u128 rhs, uint8_t bits) {
18601864 zig_i128 res;
1861 if (zig_cmp_u128(zig_bitCast_u128(rhs), zig_make_u128(0, bits)) < INT32_C(0) && !zig_shlo_i128(&res, lhs, (uint8_t)zig_lo_i128(rhs), bits)) return res;
1862 return zig_cmp_i128(lhs, zig_make_i128(0, 0)) < INT32_C(0) ? zig_minInt_i(128, bits) : zig_maxInt_i(128, bits);
1865 if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) < INT32_C(0) && !zig_shlo_i128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits)) return res;
1866 switch (zig_cmp_i128(lhs, zig_make_i128(0, 0))) {
1867 case -1: return zig_minInt_i(128, bits);
1868 case 0: return zig_make_i128(0, 0);
1869 case 1: return zig_maxInt_i(128, bits);
1870 default: zig_unreachable();
1871 }
18631872}
18641873
18651874static inline zig_u128 zig_adds_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
src/Air.zig+3-1
......@@ -257,7 +257,9 @@ pub const Inst = struct {
257257 /// it shifts out any bits that disagree with the resultant sign bit.
258258 /// Uses the `bin_op` field.
259259 shl_exact,
260 /// Saturating integer shift left. `<<|`
260 /// Saturating integer shift left. `<<|`. The result is the same type as the `lhs`.
261 /// The `rhs` must have the same vector shape as the `lhs`, but with any unsigned
262 /// integer as the scalar type.
261263 /// Uses the `bin_op` field.
262264 shl_sat,
263265 /// Bitwise XOR. `^`
src/Sema.zig+43-28
......@@ -14215,14 +14215,15 @@ fn zirShl(
1421514215 const rhs_ty = sema.typeOf(rhs);
1421614216
1421714217 const src = block.nodeOffset(inst_data.src_node);
14218 const lhs_src = switch (air_tag) {
14219 .shl, .shl_sat => block.src(.{ .node_offset_bin_lhs = inst_data.src_node }),
14220 .shl_exact => block.builtinCallArgSrc(inst_data.src_node, 0),
14221 else => unreachable,
14222 };
14223 const rhs_src = switch (air_tag) {
14224 .shl, .shl_sat => block.src(.{ .node_offset_bin_rhs = inst_data.src_node }),
14225 .shl_exact => block.builtinCallArgSrc(inst_data.src_node, 1),
14218 const lhs_src, const rhs_src = switch (air_tag) {
14219 .shl, .shl_sat => .{
14220 block.src(.{ .node_offset_bin_lhs = inst_data.src_node }),
14221 block.src(.{ .node_offset_bin_rhs = inst_data.src_node }),
14222 },
14223 .shl_exact => .{
14224 block.builtinCallArgSrc(inst_data.src_node, 0),
14225 block.builtinCallArgSrc(inst_data.src_node, 1),
14226 },
1422614227 else => unreachable,
1422714228 };
1422814229
......@@ -14231,8 +14232,7 @@ fn zirShl(
1423114232 const scalar_ty = lhs_ty.scalarType(zcu);
1423214233 const scalar_rhs_ty = rhs_ty.scalarType(zcu);
1423314234
14234 // TODO coerce rhs if air_tag is not shl_sat
14235 const rhs_is_comptime_int = try sema.checkIntType(block, rhs_src, scalar_rhs_ty);
14235 _ = try sema.checkIntType(block, rhs_src, scalar_rhs_ty);
1423614236
1423714237 const maybe_lhs_val = try sema.resolveValueResolveLazy(lhs);
1423814238 const maybe_rhs_val = try sema.resolveValueResolveLazy(rhs);
......@@ -14245,7 +14245,7 @@ fn zirShl(
1424514245 if (try rhs_val.compareAllWithZeroSema(.eq, pt)) {
1424614246 return lhs;
1424714247 }
14248 if (scalar_ty.zigTypeTag(zcu) != .comptime_int and air_tag != .shl_sat) {
14248 if (air_tag != .shl_sat and scalar_ty.zigTypeTag(zcu) != .comptime_int) {
1424914249 const bit_value = try pt.intValue(Type.comptime_int, scalar_ty.intInfo(zcu).bits);
1425014250 if (rhs_ty.zigTypeTag(zcu) == .vector) {
1425114251 var i: usize = 0;
......@@ -14282,6 +14282,8 @@ fn zirShl(
1428214282 rhs_val.fmtValueSema(pt, sema),
1428314283 });
1428414284 }
14285 } else if (scalar_rhs_ty.isSignedInt(zcu)) {
14286 return sema.fail(block, rhs_src, "shift by signed type '{}'", .{rhs_ty.fmt(pt)});
1428514287 }
1428614288
1428714289 const runtime_src = if (maybe_lhs_val) |lhs_val| rs: {
......@@ -14309,18 +14311,34 @@ fn zirShl(
1430914311 return Air.internedToRef(val.toIntern());
1431014312 } else lhs_src;
1431114313
14312 const new_rhs = if (air_tag == .shl_sat) rhs: {
14313 // Limit the RHS type for saturating shl to be an integer as small as the LHS.
14314 if (rhs_is_comptime_int or
14315 scalar_rhs_ty.intInfo(zcu).bits > scalar_ty.intInfo(zcu).bits)
14316 {
14317 const max_int = Air.internedToRef((try lhs_ty.maxInt(pt, lhs_ty)).toIntern());
14318 const rhs_limited = try sema.analyzeMinMax(block, rhs_src, .min, &.{ rhs, max_int }, &.{ rhs_src, rhs_src });
14319 break :rhs try sema.intCast(block, src, lhs_ty, rhs_src, rhs_limited, rhs_src, false, false);
14320 } else {
14321 break :rhs rhs;
14322 }
14323 } else rhs;
14314 const rt_rhs = switch (air_tag) {
14315 else => unreachable,
14316 .shl, .shl_exact => rhs,
14317 // The backend can handle a large runtime rhs better than we can, but
14318 // we can limit a large comptime rhs better here. This also has the
14319 // necessary side effect of preventing rhs from being a `comptime_int`.
14320 .shl_sat => if (maybe_rhs_val) |rhs_val| Air.internedToRef(rt_rhs: {
14321 const bit_count = scalar_ty.intInfo(zcu).bits;
14322 const rt_rhs_scalar_ty = try pt.smallestUnsignedInt(bit_count);
14323 if (!rhs_ty.isVector(zcu)) break :rt_rhs (try pt.intValue(
14324 rt_rhs_scalar_ty,
14325 @min(try rhs_val.getUnsignedIntSema(pt) orelse bit_count, bit_count),
14326 )).toIntern();
14327 const rhs_len = rhs_ty.vectorLen(zcu);
14328 const rhs_elems = try sema.arena.alloc(InternPool.Index, rhs_len);
14329 for (rhs_elems, 0..) |*rhs_elem, i| rhs_elem.* = (try pt.intValue(
14330 rt_rhs_scalar_ty,
14331 @min(try (try rhs_val.elemValue(pt, i)).getUnsignedIntSema(pt) orelse bit_count, bit_count),
14332 )).toIntern();
14333 break :rt_rhs try pt.intern(.{ .aggregate = .{
14334 .ty = (try pt.vectorType(.{
14335 .len = rhs_len,
14336 .child = rt_rhs_scalar_ty.toIntern(),
14337 })).toIntern(),
14338 .storage = .{ .elems = rhs_elems },
14339 } });
14340 }) else rhs,
14341 };
1432414342
1432514343 try sema.requireRuntimeBlock(block, src, runtime_src);
1432614344 if (block.wantSafety()) {
......@@ -14374,7 +14392,7 @@ fn zirShl(
1437414392 return sema.tupleFieldValByIndex(block, op_ov, 0, op_ov_tuple_ty);
1437514393 }
1437614394 }
14377 return block.addBinOp(air_tag, lhs, new_rhs);
14395 return block.addBinOp(air_tag, lhs, rt_rhs);
1437814396}
1437914397
1438014398fn zirShr(
......@@ -36432,10 +36450,7 @@ fn generateUnionTagTypeSimple(
3643236450 const enum_ty = try ip.getGeneratedTagEnumType(gpa, pt.tid, .{
3643336451 .name = name,
3643436452 .owner_union_ty = union_type,
36435 .tag_ty = if (enum_field_names.len == 0)
36436 (try pt.intType(.unsigned, 0)).toIntern()
36437 else
36438 (try pt.smallestUnsignedInt(enum_field_names.len - 1)).toIntern(),
36453 .tag_ty = (try pt.smallestUnsignedInt(enum_field_names.len -| 1)).toIntern(),
3643936454 .names = enum_field_names,
3644036455 .values = &.{},
3644136456 .tag_mode = .auto,
src/Type.zig+4-4
......@@ -4132,10 +4132,10 @@ pub const empty_tuple: Type = .{ .ip_index = .empty_tuple_type };
41324132pub const generic_poison: Type = .{ .ip_index = .generic_poison_type };
41334133
41344134pub fn smallestUnsignedBits(max: u64) u16 {
4135 if (max == 0) return 0;
4136 const base = std.math.log2(max);
4137 const upper = (@as(u64, 1) << @as(u6, @intCast(base))) - 1;
4138 return @as(u16, @intCast(base + @intFromBool(upper < max)));
4135 return switch (max) {
4136 0 => 0,
4137 else => 1 + std.math.log2_int(u64, max),
4138 };
41394139}
41404140
41414141/// This is only used for comptime asserts. Bump this number when you make a change
src/arch/x86_64/CodeGen.zig+3888-456
......@@ -2408,7 +2408,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24082408}
24092409
24102410fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2411 @setEvalBranchQuota(19_300);
2411 @setEvalBranchQuota(20_000);
24122412 const pt = cg.pt;
24132413 const zcu = pt.zcu;
24142414 const ip = &zcu.intern_pool;
......@@ -2444,8 +2444,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24442444 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);
24452445 switch (air_tags[@intFromEnum(inst)]) {
24462446 // zig fmt: off
2447 .shl_sat => try cg.airShlSat(inst),
2448
24492447 .bitcast => try cg.airBitCast(inst),
24502448
24512449 .splat => try cg.airSplat(inst),
......@@ -4408,7 +4406,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
44084406 .dst_temps = .{ .{ .ref = .src0 }, .unused },
44094407 .clobbers = .{ .eflags = true },
44104408 .each = .{ .once = &.{
4411 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4409 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
44124410 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
44134411 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
44144412 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
......@@ -4457,7 +4455,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
44574455 .dst_temps = .{ .{ .ref = .src0 }, .unused },
44584456 .clobbers = .{ .eflags = true },
44594457 .each = .{ .once = &.{
4460 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4458 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
44614459 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
44624460 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
44634461 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
......@@ -4585,7 +4583,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
45854583 .dst_temps = .{ .{ .ref = .src0 }, .unused },
45864584 .clobbers = .{ .eflags = true },
45874585 .each = .{ .once = &.{
4588 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4586 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
45894587 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
45904588 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
45914589 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
......@@ -4617,7 +4615,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
46174615 .dst_temps = .{ .{ .ref = .src0 }, .unused },
46184616 .clobbers = .{ .eflags = true },
46194617 .each = .{ .once = &.{
4620 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4618 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
46214619 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
46224620 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
46234621 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
......@@ -4683,7 +4681,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
46834681 .dst_temps = .{ .{ .ref = .src0 }, .unused },
46844682 .clobbers = .{ .eflags = true },
46854683 .each = .{ .once = &.{
4686 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4684 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
46874685 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
46884686 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
46894687 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -4713,7 +4711,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
47134711 .dst_temps = .{ .{ .ref = .src0 }, .unused },
47144712 .clobbers = .{ .eflags = true },
47154713 .each = .{ .once = &.{
4716 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4714 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
47174715 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
47184716 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
47194717 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -4744,7 +4742,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
47444742 .dst_temps = .{ .{ .ref = .src0 }, .unused },
47454743 .clobbers = .{ .eflags = true },
47464744 .each = .{ .once = &.{
4747 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4745 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
47484746 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
47494747 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
47504748 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -4776,7 +4774,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
47764774 .dst_temps = .{ .{ .ref = .src0 }, .unused },
47774775 .clobbers = .{ .eflags = true },
47784776 .each = .{ .once = &.{
4779 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4777 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
47804778 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
47814779 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
47824780 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -4929,7 +4927,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
49294927 .dst_temps = .{ .{ .ref = .src0 }, .unused },
49304928 .clobbers = .{ .eflags = true },
49314929 .each = .{ .once = &.{
4932 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4930 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
49334931 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
49344932 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
49354933 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -4959,7 +4957,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
49594957 .dst_temps = .{ .{ .ref = .src0 }, .unused },
49604958 .clobbers = .{ .eflags = true },
49614959 .each = .{ .once = &.{
4962 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4960 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
49634961 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
49644962 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
49654963 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -4990,7 +4988,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
49904988 .dst_temps = .{ .{ .ref = .src0 }, .unused },
49914989 .clobbers = .{ .eflags = true },
49924990 .each = .{ .once = &.{
4993 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4991 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
49944992 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
49954993 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
49964994 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -5022,7 +5020,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
50225020 .dst_temps = .{ .{ .ref = .src0 }, .unused },
50235021 .clobbers = .{ .eflags = true },
50245022 .each = .{ .once = &.{
5025 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5023 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
50265024 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
50275025 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
50285026 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -5055,7 +5053,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
50555053 .dst_temps = .{ .{ .ref = .src0 }, .unused },
50565054 .clobbers = .{ .eflags = true },
50575055 .each = .{ .once = &.{
5058 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5056 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
50595057 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
50605058 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
50615059 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -5086,7 +5084,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
50865084 .dst_temps = .{ .{ .ref = .src0 }, .unused },
50875085 .clobbers = .{ .eflags = true },
50885086 .each = .{ .once = &.{
5089 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5087 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
50905088 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
50915089 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
50925090 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -5118,7 +5116,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
51185116 .dst_temps = .{ .{ .ref = .src0 }, .unused },
51195117 .clobbers = .{ .eflags = true },
51205118 .each = .{ .once = &.{
5121 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5119 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
51225120 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
51235121 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
51245122 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -5151,7 +5149,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
51515149 .dst_temps = .{ .{ .ref = .src0 }, .unused },
51525150 .clobbers = .{ .eflags = true },
51535151 .each = .{ .once = &.{
5154 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5152 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
51555153 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
51565154 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
51575155 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -5456,7 +5454,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54565454 .dst_temps = .{ .{ .ref = .src0 }, .unused },
54575455 .clobbers = .{ .eflags = true },
54585456 .each = .{ .once = &.{
5459 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5457 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
54605458 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
54615459 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
54625460 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
......@@ -5505,7 +5503,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
55055503 .dst_temps = .{ .{ .ref = .src0 }, .unused },
55065504 .clobbers = .{ .eflags = true },
55075505 .each = .{ .once = &.{
5508 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5506 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
55095507 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
55105508 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
55115509 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -5571,7 +5569,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
55715569 .dst_temps = .{ .{ .ref = .src0 }, .unused },
55725570 .clobbers = .{ .eflags = true },
55735571 .each = .{ .once = &.{
5574 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5572 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
55755573 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
55765574 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
55775575 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -5605,7 +5603,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
56055603 .dst_temps = .{ .{ .ref = .src0 }, .unused },
56065604 .clobbers = .{ .eflags = true },
56075605 .each = .{ .once = &.{
5608 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5606 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
56095607 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
56105608 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
56115609 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -5750,7 +5748,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
57505748 .dst_temps = .{ .{ .ref = .src0 }, .unused },
57515749 .clobbers = .{ .eflags = true },
57525750 .each = .{ .once = &.{
5753 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5751 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
57545752 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
57555753 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
57565754 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
......@@ -5815,7 +5813,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58155813 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58165814 .clobbers = .{ .eflags = true },
58175815 .each = .{ .once = &.{
5818 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5816 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
58195817 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
58205818 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
58215819 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
......@@ -5884,7 +5882,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58845882 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58855883 .clobbers = .{ .eflags = true },
58865884 .each = .{ .once = &.{
5887 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5885 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
58885886 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
58895887 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
58905888 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
......@@ -5919,7 +5917,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
59195917 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59205918 .clobbers = .{ .eflags = true },
59215919 .each = .{ .once = &.{
5922 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5920 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
59235921 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
59245922 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
59255923 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
......@@ -14879,7 +14877,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1487914877 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1488014878 .clobbers = .{ .eflags = true },
1488114879 .each = .{ .once = &.{
14882 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
14880 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1488314881 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
1488414882 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
1488514883 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
......@@ -14924,7 +14922,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1492414922 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1492514923 .clobbers = .{ .eflags = true },
1492614924 .each = .{ .once = &.{
14927 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
14925 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1492814926 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
1492914927 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
1493014928 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
......@@ -15027,7 +15025,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1502715025 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1502815026 .clobbers = .{ .eflags = true },
1502915027 .each = .{ .once = &.{
15030 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15028 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1503115029 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1503215030 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
1503315031 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
......@@ -15057,7 +15055,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1505715055 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1505815056 .clobbers = .{ .eflags = true },
1505915057 .each = .{ .once = &.{
15060 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15058 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1506115059 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1506215060 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
1506315061 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
......@@ -15117,7 +15115,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1511715115 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1511815116 .clobbers = .{ .eflags = true },
1511915117 .each = .{ .once = &.{
15120 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15118 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1512115119 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1512215120 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
1512315121 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -15147,7 +15145,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1514715145 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1514815146 .clobbers = .{ .eflags = true },
1514915147 .each = .{ .once = &.{
15150 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15148 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1515115149 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1515215150 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1515315151 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -15177,7 +15175,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1517715175 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1517815176 .clobbers = .{ .eflags = true },
1517915177 .each = .{ .once = &.{
15180 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15178 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1518115179 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1518215180 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
1518315181 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -15208,7 +15206,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1520815206 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1520915207 .clobbers = .{ .eflags = true },
1521015208 .each = .{ .once = &.{
15211 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15209 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1521215210 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1521315211 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1521415212 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -15355,7 +15353,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1535515353 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1535615354 .clobbers = .{ .eflags = true },
1535715355 .each = .{ .once = &.{
15358 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15356 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1535915357 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1536015358 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
1536115359 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -15385,7 +15383,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1538515383 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1538615384 .clobbers = .{ .eflags = true },
1538715385 .each = .{ .once = &.{
15388 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15386 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1538915387 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1539015388 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1539115389 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -15415,7 +15413,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1541515413 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1541615414 .clobbers = .{ .eflags = true },
1541715415 .each = .{ .once = &.{
15418 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15416 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1541915417 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1542015418 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
1542115419 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -15446,7 +15444,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1544615444 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1544715445 .clobbers = .{ .eflags = true },
1544815446 .each = .{ .once = &.{
15449 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15447 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1545015448 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1545115449 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1545215450 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -15477,7 +15475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1547715475 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1547815476 .clobbers = .{ .eflags = true },
1547915477 .each = .{ .once = &.{
15480 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15478 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1548115479 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1548215480 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
1548315481 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -15508,7 +15506,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1550815506 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1550915507 .clobbers = .{ .eflags = true },
1551015508 .each = .{ .once = &.{
15511 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15509 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1551215510 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1551315511 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1551415512 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
......@@ -15539,7 +15537,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1553915537 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1554015538 .clobbers = .{ .eflags = true },
1554115539 .each = .{ .once = &.{
15542 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15540 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1554315541 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1554415542 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
1554515543 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -15571,7 +15569,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1557115569 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1557215570 .clobbers = .{ .eflags = true },
1557315571 .each = .{ .once = &.{
15574 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15572 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1557515573 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
1557615574 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1557715575 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -15780,7 +15778,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1578015778 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1578115779 .clobbers = .{ .eflags = true },
1578215780 .each = .{ .once = &.{
15783 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15781 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1578415782 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
1578515783 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
1578615784 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
......@@ -15825,7 +15823,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1582515823 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1582615824 .clobbers = .{ .eflags = true },
1582715825 .each = .{ .once = &.{
15828 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15826 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1582915827 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
1583015828 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1583115829 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -15887,7 +15885,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1588715885 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1588815886 .clobbers = .{ .eflags = true },
1588915887 .each = .{ .once = &.{
15890 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15888 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1589115889 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
1589215890 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1589315891 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -15919,7 +15917,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1591915917 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1592015918 .clobbers = .{ .eflags = true },
1592115919 .each = .{ .once = &.{
15922 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15920 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
1592315921 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
1592415922 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
1592515923 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
......@@ -16039,7 +16037,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1603916037 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1604016038 .clobbers = .{ .eflags = true },
1604116039 .each = .{ .once = &.{
16042 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16040 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
1604316041 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
1604416042 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
1604516043 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
......@@ -16100,7 +16098,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1610016098 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1610116099 .clobbers = .{ .eflags = true },
1610216100 .each = .{ .once = &.{
16103 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16101 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
1610416102 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
1610516103 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
1610616104 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
......@@ -16165,7 +16163,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1616516163 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1616616164 .clobbers = .{ .eflags = true },
1616716165 .each = .{ .once = &.{
16168 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16166 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
1616916167 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
1617016168 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
1617116169 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
......@@ -16198,7 +16196,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1619816196 .dst_temps = .{ .{ .ref = .src0 }, .unused },
1619916197 .clobbers = .{ .eflags = true },
1620016198 .each = .{ .once = &.{
16201 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16199 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
1620216200 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
1620316201 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
1620416202 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
......@@ -58000,20 +57998,3084 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5800057998 }, .{
5800157999 .required_features = .{ .@"64bit", null, null, null },
5800258000 .src_constraints = .{
58003 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },
58004 .{ .unsigned_int = .byte },
58001 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },
58002 .{ .unsigned_int = .byte },
58003 .any,
58004 },
58005 .patterns = &.{
58006 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58007 },
58008 .extra_temps = .{
58009 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58010 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58011 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58012 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58013 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58014 .unused,
58015 .unused,
58016 .unused,
58017 .unused,
58018 .unused,
58019 .unused,
58020 },
58021 .dst_temps = .{ .mem, .unused },
58022 .clobbers = .{ .eflags = true },
58023 .each = .{ .once = &.{
58024 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
58025 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58026 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58027 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58028 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58029 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58030 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58031 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58032 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58033 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58034 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58035 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58036 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58037 .{ ._, ._r, .sa, .tmp3q, .src1b, ._, ._ },
58038 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58039 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
58040 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
58041 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
58042 } },
58043 }, .{
58044 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58045 .src_constraints = .{
58046 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
58047 .{ .unsigned_int = .byte },
58048 .any,
58049 },
58050 .patterns = &.{
58051 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58052 },
58053 .extra_temps = .{
58054 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58055 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58056 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58057 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58058 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58059 .unused,
58060 .unused,
58061 .unused,
58062 .unused,
58063 .unused,
58064 .unused,
58065 },
58066 .dst_temps = .{ .mem, .unused },
58067 .clobbers = .{ .eflags = true },
58068 .each = .{ .once = &.{
58069 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
58070 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58071 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58072 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58073 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58074 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58075 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58076 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58077 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58078 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58079 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58080 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58081 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58082 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },
58083 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58084 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58085 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
58086 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58087 } },
58088 }, .{
58089 .required_features = .{ .@"64bit", null, null, null },
58090 .src_constraints = .{
58091 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
58092 .{ .unsigned_int = .byte },
58093 .any,
58094 },
58095 .patterns = &.{
58096 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58097 },
58098 .extra_temps = .{
58099 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58100 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58101 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58102 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58103 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58104 .unused,
58105 .unused,
58106 .unused,
58107 .unused,
58108 .unused,
58109 .unused,
58110 },
58111 .dst_temps = .{ .mem, .unused },
58112 .clobbers = .{ .eflags = true },
58113 .each = .{ .once = &.{
58114 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
58115 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58116 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58117 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58118 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58119 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58120 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58121 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58122 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58123 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58124 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58125 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58126 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58127 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },
58128 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58129 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58130 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
58131 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
58132 } },
58133 }, .{
58134 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58135 .src_constraints = .{
58136 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },
58137 .{ .unsigned_int = .word },
58138 .any,
58139 },
58140 .patterns = &.{
58141 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
58142 },
58143 .extra_temps = .{
58144 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58145 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58146 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58147 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58148 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58149 .unused,
58150 .unused,
58151 .unused,
58152 .unused,
58153 .unused,
58154 .unused,
58155 },
58156 .dst_temps = .{ .mem, .unused },
58157 .clobbers = .{ .eflags = true },
58158 .each = .{ .once = &.{
58159 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58160 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58161 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58162 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58163 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58164 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58165 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58166 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58167 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58168 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58169 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58170 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58171 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58172 .{ ._, ._r, .sa, .tmp3q, .src1b, ._, ._ },
58173 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58174 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
58175 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
58176 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58177 } },
58178 }, .{
58179 .required_features = .{ .@"64bit", null, null, null },
58180 .src_constraints = .{
58181 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },
58182 .{ .unsigned_int = .word },
58183 .any,
58184 },
58185 .patterns = &.{
58186 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
58187 },
58188 .extra_temps = .{
58189 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58190 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58191 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58192 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58193 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58194 .unused,
58195 .unused,
58196 .unused,
58197 .unused,
58198 .unused,
58199 .unused,
58200 },
58201 .dst_temps = .{ .mem, .unused },
58202 .clobbers = .{ .eflags = true },
58203 .each = .{ .once = &.{
58204 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58205 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58206 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58207 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58208 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58209 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58210 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58211 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58212 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58213 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58214 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58215 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58216 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58217 .{ ._, ._r, .sa, .tmp3q, .src1b, ._, ._ },
58218 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58219 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
58220 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
58221 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
58222 } },
58223 }, .{
58224 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58225 .src_constraints = .{
58226 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
58227 .{ .unsigned_int = .word },
58228 .any,
58229 },
58230 .patterns = &.{
58231 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
58232 },
58233 .extra_temps = .{
58234 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58235 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58236 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58237 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58238 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58239 .unused,
58240 .unused,
58241 .unused,
58242 .unused,
58243 .unused,
58244 .unused,
58245 },
58246 .dst_temps = .{ .mem, .unused },
58247 .clobbers = .{ .eflags = true },
58248 .each = .{ .once = &.{
58249 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58250 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58251 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58252 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58253 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58254 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58255 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58256 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58257 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58258 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58259 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58260 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58261 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58262 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },
58263 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58264 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58265 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
58266 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58267 } },
58268 }, .{
58269 .required_features = .{ .@"64bit", null, null, null },
58270 .src_constraints = .{
58271 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
58272 .{ .unsigned_int = .word },
58273 .any,
58274 },
58275 .patterns = &.{
58276 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
58277 },
58278 .extra_temps = .{
58279 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58280 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58281 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58282 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58283 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58284 .unused,
58285 .unused,
58286 .unused,
58287 .unused,
58288 .unused,
58289 .unused,
58290 },
58291 .dst_temps = .{ .mem, .unused },
58292 .clobbers = .{ .eflags = true },
58293 .each = .{ .once = &.{
58294 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58295 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58296 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58297 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58298 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58299 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58300 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58301 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58302 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58303 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58304 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58305 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58306 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58307 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },
58308 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58309 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58310 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
58311 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
58312 } },
58313 } }) catch |err| switch (err) {
58314 error.SelectFailed => return cg.fail("failed to select {s} {} {} {} {}", .{
58315 @tagName(air_tag),
58316 cg.typeOf(bin_op.lhs).fmt(pt),
58317 cg.typeOf(bin_op.rhs).fmt(pt),
58318 ops[0].tracking(cg),
58319 ops[1].tracking(cg),
58320 }),
58321 else => |e| return e,
58322 };
58323 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
58324 },
58325 .shl, .shl_exact => |air_tag| if (use_old) try cg.airShlShrBinOp(inst) else fallback: {
58326 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
58327 if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airShlShrBinOp(inst);
58328 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
58329 var res: [1]Temp = undefined;
58330 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
58331 .src_constraints = .{ .{ .signed_int = .byte }, .{ .unsigned_int = .byte }, .any },
58332 .patterns = &.{
58333 .{ .src = .{ .mut_mem, .imm8, .none } },
58334 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58335 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58336 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58337 },
58338 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58339 .clobbers = .{ .eflags = true },
58340 .each = .{ .once = &.{
58341 .{ ._, ._l, .sa, .dst0b, .src1b, ._, ._ },
58342 } },
58343 }, .{
58344 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
58345 .patterns = &.{
58346 .{ .src = .{ .mut_mem, .imm8, .none } },
58347 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58348 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58349 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58350 },
58351 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58352 .clobbers = .{ .eflags = true },
58353 .each = .{ .once = &.{
58354 .{ ._, ._l, .sh, .dst0b, .src1b, ._, ._ },
58355 } },
58356 }, .{
58357 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_unsigned_int = 4 }, .any },
58358 .patterns = &.{
58359 .{ .src = .{ .mut_mem, .imm8, .none } },
58360 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58361 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58362 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58363 },
58364 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58365 .clobbers = .{ .eflags = true },
58366 .each = .{ .once = &.{
58367 .{ ._, ._l, .sa, .dst0w, .src1b, ._, ._ },
58368 } },
58369 }, .{
58370 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .exact_unsigned_int = 4 }, .any },
58371 .patterns = &.{
58372 .{ .src = .{ .mut_mem, .imm8, .none } },
58373 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58374 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58375 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58376 },
58377 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58378 .clobbers = .{ .eflags = true },
58379 .each = .{ .once = &.{
58380 .{ ._, ._l, .sh, .dst0w, .src1b, ._, ._ },
58381 } },
58382 }, .{
58383 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58384 .patterns = &.{
58385 .{ .src = .{ .mut_mem, .imm8, .none } },
58386 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58387 },
58388 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58389 .clobbers = .{ .eflags = true },
58390 .each = .{ .once = &.{
58391 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
58392 } },
58393 }, .{
58394 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58395 .patterns = &.{
58396 .{ .src = .{ .mut_mem, .imm8, .none } },
58397 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58398 },
58399 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58400 .clobbers = .{ .eflags = true },
58401 .each = .{ .once = &.{
58402 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },
58403 } },
58404 }, .{
58405 .required_features = .{ .bmi2, null, null, null },
58406 .src_constraints = .{ .{ .int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58407 .patterns = &.{
58408 .{ .src = .{ .mem, .to_gpr, .none } },
58409 .{ .src = .{ .to_gpr, .to_gpr, .none } },
58410 },
58411 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
58412 .each = .{ .once = &.{
58413 .{ ._, ._lx, .sh, .dst0d, .src0d, .src1d, ._ },
58414 } },
58415 }, .{
58416 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58417 .patterns = &.{
58418 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58419 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58420 },
58421 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58422 .clobbers = .{ .eflags = true },
58423 .each = .{ .once = &.{
58424 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
58425 } },
58426 }, .{
58427 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58428 .patterns = &.{
58429 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58430 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58431 },
58432 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58433 .clobbers = .{ .eflags = true },
58434 .each = .{ .once = &.{
58435 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },
58436 } },
58437 }, .{
58438 .required_features = .{ .@"64bit", null, null, null },
58439 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58440 .patterns = &.{
58441 .{ .src = .{ .mut_mem, .imm8, .none } },
58442 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58443 },
58444 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58445 .clobbers = .{ .eflags = true },
58446 .each = .{ .once = &.{
58447 .{ ._, ._l, .sa, .dst0q, .src1b, ._, ._ },
58448 } },
58449 }, .{
58450 .required_features = .{ .@"64bit", null, null, null },
58451 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58452 .patterns = &.{
58453 .{ .src = .{ .mut_mem, .imm8, .none } },
58454 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58455 },
58456 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58457 .clobbers = .{ .eflags = true },
58458 .each = .{ .once = &.{
58459 .{ ._, ._l, .sh, .dst0q, .src1b, ._, ._ },
58460 } },
58461 }, .{
58462 .required_features = .{ .@"64bit", .bmi2, null, null },
58463 .src_constraints = .{ .{ .int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58464 .patterns = &.{
58465 .{ .src = .{ .mem, .to_gpr, .none } },
58466 .{ .src = .{ .to_gpr, .to_gpr, .none } },
58467 },
58468 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
58469 .each = .{ .once = &.{
58470 .{ ._, ._lx, .sh, .dst0q, .src0q, .src1q, ._ },
58471 } },
58472 }, .{
58473 .required_features = .{ .@"64bit", null, null, null },
58474 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58475 .patterns = &.{
58476 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58477 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58478 },
58479 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58480 .clobbers = .{ .eflags = true },
58481 .each = .{ .once = &.{
58482 .{ ._, ._l, .sa, .dst0q, .src1b, ._, ._ },
58483 } },
58484 }, .{
58485 .required_features = .{ .@"64bit", null, null, null },
58486 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58487 .patterns = &.{
58488 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58489 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58490 },
58491 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58492 .clobbers = .{ .eflags = true },
58493 .each = .{ .once = &.{
58494 .{ ._, ._l, .sh, .dst0q, .src1b, ._, ._ },
58495 } },
58496 }, .{
58497 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58498 .src_constraints = .{
58499 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
58500 .{ .unsigned_int = .byte },
58501 .any,
58502 },
58503 .patterns = &.{
58504 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58505 },
58506 .extra_temps = .{
58507 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58508 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58509 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58510 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58511 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58512 .unused,
58513 .unused,
58514 .unused,
58515 .unused,
58516 .unused,
58517 .unused,
58518 },
58519 .dst_temps = .{ .mem, .unused },
58520 .clobbers = .{ .eflags = true },
58521 .each = .{ .once = &.{
58522 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
58523 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
58524 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58525 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
58526 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58527 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58528 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58529 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58530 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58531 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58532 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58533 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
58534 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
58535 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },
58536 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58537 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58538 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
58539 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
58540 } },
58541 }, .{
58542 .required_features = .{ .@"64bit", null, null, null },
58543 .src_constraints = .{
58544 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
58545 .{ .unsigned_int = .byte },
58546 .any,
58547 },
58548 .patterns = &.{
58549 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58550 },
58551 .extra_temps = .{
58552 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58553 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58554 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58555 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58556 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58557 .unused,
58558 .unused,
58559 .unused,
58560 .unused,
58561 .unused,
58562 .unused,
58563 },
58564 .dst_temps = .{ .mem, .unused },
58565 .clobbers = .{ .eflags = true },
58566 .each = .{ .once = &.{
58567 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
58568 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
58569 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58570 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
58571 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58572 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58573 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58574 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58575 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58576 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58577 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58578 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
58579 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58580 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },
58581 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58582 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58583 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
58584 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58585 } },
58586 }, .{
58587 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58588 .src_constraints = .{
58589 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
58590 .{ .unsigned_int = .word },
58591 .any,
58592 },
58593 .patterns = &.{
58594 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
58595 },
58596 .extra_temps = .{
58597 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58598 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58599 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58600 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58601 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58602 .unused,
58603 .unused,
58604 .unused,
58605 .unused,
58606 .unused,
58607 .unused,
58608 },
58609 .dst_temps = .{ .mem, .unused },
58610 .clobbers = .{ .eflags = true },
58611 .each = .{ .once = &.{
58612 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58613 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
58614 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58615 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
58616 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58617 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58618 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58619 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58620 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58621 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58622 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58623 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
58624 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
58625 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },
58626 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58627 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58628 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
58629 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
58630 } },
58631 }, .{
58632 .required_features = .{ .@"64bit", null, null, null },
58633 .src_constraints = .{
58634 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
58635 .{ .unsigned_int = .word },
58636 .any,
58637 },
58638 .patterns = &.{
58639 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
58640 },
58641 .extra_temps = .{
58642 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58643 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58644 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58645 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58646 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58647 .unused,
58648 .unused,
58649 .unused,
58650 .unused,
58651 .unused,
58652 .unused,
58653 },
58654 .dst_temps = .{ .mem, .unused },
58655 .clobbers = .{ .eflags = true },
58656 .each = .{ .once = &.{
58657 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58658 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
58659 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58660 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
58661 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58662 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58663 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58664 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58665 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58666 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58667 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58668 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
58669 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58670 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },
58671 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58672 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58673 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
58674 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58675 } },
58676 } }) catch |err| switch (err) {
58677 error.SelectFailed => return cg.fail("failed to select {s} {} {} {} {}", .{
58678 @tagName(air_tag),
58679 cg.typeOf(bin_op.lhs).fmt(pt),
58680 cg.typeOf(bin_op.rhs).fmt(pt),
58681 ops[0].tracking(cg),
58682 ops[1].tracking(cg),
58683 }),
58684 else => |e| return e,
58685 };
58686 switch (air_tag) {
58687 else => unreachable,
58688 .shl => res[0].wrapInt(cg) catch |err| switch (err) {
58689 error.SelectFailed => return cg.fail("failed to select wrap {} {} {} {}", .{
58690 cg.typeOf(bin_op.lhs).fmt(pt),
58691 cg.typeOf(bin_op.rhs).fmt(pt),
58692 ops[0].tracking(cg),
58693 ops[1].tracking(cg),
58694 }),
58695 else => |e| return e,
58696 },
58697 .shl_exact => {},
58698 }
58699 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
58700 },
58701 .shl_sat => |air_tag| if (use_old) try cg.airShlSat(inst) else fallback: {
58702 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
58703 const lhs_ty = cg.typeOf(bin_op.lhs);
58704 if (lhs_ty.isVector(zcu)) break :fallback try cg.airShlSat(inst);
58705 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
58706 var res: [1]Temp = undefined;
58707 switch (ops[1].tracking(cg).short) {
58708 .immediate => |rhs_imm| res[0] = try cg.tempInit(
58709 .i32,
58710 .{ .immediate = if (rhs_imm < cg.intInfo(lhs_ty).?.bits)
58711 rhs_imm
58712 else
58713 @bitCast(@as(i64, -1)) },
58714 ),
58715 else => cg.select(&res, &.{.i32}, ops[1..2], comptime &.{ .{
58716 .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any },
58717 .patterns = &.{
58718 .{ .src = .{ .mem, .none, .none } },
58719 .{ .src = .{ .to_gpr, .none, .none } },
58720 },
58721 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
58722 .each = .{ .once = &.{
58723 .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ },
58724 } },
58725 }, .{
58726 .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any },
58727 .patterns = &.{
58728 .{ .src = .{ .mem, .none, .none } },
58729 .{ .src = .{ .to_gpr, .none, .none } },
58730 },
58731 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
58732 .each = .{ .once = &.{
58733 .{ ._, ._, .movzx, .dst0d, .src0w, ._, ._ },
58734 } },
58735 }, .{
58736 .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any },
58737 .patterns = &.{
58738 .{ .src = .{ .to_mut_gpr, .none, .none } },
58739 },
58740 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58741 .each = .{ .once = &.{} },
58742 }, .{
58743 .required_features = .{ .@"64bit", .cmov, null, null },
58744 .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },
58745 .patterns = &.{
58746 .{ .src = .{ .to_mut_gpr, .none, .none } },
58747 },
58748 .extra_temps = .{
58749 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58750 .unused,
58751 .unused,
58752 .unused,
58753 .unused,
58754 .unused,
58755 .unused,
58756 .unused,
58757 .unused,
58758 .unused,
58759 .unused,
58760 },
58761 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58762 .each = .{ .once = &.{
58763 .{ ._, ._, .mov, .tmp0d, .si(1 << 16), ._, ._ },
58764 .{ ._, ._, .cmp, .src0q, .tmp0q, ._, ._ },
58765 .{ ._, ._nb, .cmov, .dst0d, .tmp0d, ._, ._ },
58766 } },
58767 }, .{
58768 .required_features = .{ .@"64bit", null, null, null },
58769 .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },
58770 .patterns = &.{
58771 .{ .src = .{ .to_mut_gpr, .none, .none } },
58772 },
58773 .extra_temps = .{
58774 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58775 .unused,
58776 .unused,
58777 .unused,
58778 .unused,
58779 .unused,
58780 .unused,
58781 .unused,
58782 .unused,
58783 .unused,
58784 .unused,
58785 },
58786 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58787 .each = .{ .once = &.{
58788 .{ ._, ._, .cmp, .src0q, .si(1 << 16), ._, ._ },
58789 .{ ._, ._, .cmc, ._, ._, ._, ._ },
58790 .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
58791 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
58792 } },
58793 }, .{
58794 .required_features = .{ .@"64bit", .cmov, null, null },
58795 .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any },
58796 .patterns = &.{
58797 .{ .src = .{ .to_mem, .none, .none } },
58798 },
58799 .extra_temps = .{
58800 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58801 .unused,
58802 .unused,
58803 .unused,
58804 .unused,
58805 .unused,
58806 .unused,
58807 .unused,
58808 .unused,
58809 .unused,
58810 .unused,
58811 },
58812 .dst_temps = .{ .{ .reg = .ecx }, .unused },
58813 .each = .{ .once = &.{
58814 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
58815 .{ ._, ._, .mov, .dst0d, .si(1 << 16), ._, ._ },
58816 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58817 .{ ._, ._ne, .j, .@"0f", ._, ._, ._ },
58818 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
58819 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
58820 .{ ._, ._, .mov, .tmp0q, .mem(.src0q), ._, ._ },
58821 .{ ._, ._, .cmp, .tmp0q, .dst0q, ._, ._ },
58822 .{ ._, ._na, .cmov, .dst0d, .tmp0d, ._, ._ },
58823 } },
58824 }, .{
58825 .required_features = .{ .@"64bit", null, null, null },
58826 .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any },
58827 .patterns = &.{
58828 .{ .src = .{ .to_mem, .none, .none } },
58829 },
58830 .extra_temps = .{
58831 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58832 .unused,
58833 .unused,
58834 .unused,
58835 .unused,
58836 .unused,
58837 .unused,
58838 .unused,
58839 .unused,
58840 .unused,
58841 .unused,
58842 },
58843 .dst_temps = .{ .{ .reg = .ecx }, .unused },
58844 .each = .{ .once = &.{
58845 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
58846 .{ ._, ._, .mov, .dst0d, .si(1 << 16), ._, ._ },
58847 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58848 .{ ._, ._ne, .j, .@"0f", ._, ._, ._ },
58849 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
58850 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
58851 .{ ._, ._, .mov, .tmp0q, .mem(.src0q), ._, ._ },
58852 .{ ._, ._, .cmp, .dst0q, .tmp0q, ._, ._ },
58853 .{ ._, ._, .sbb, .dst0d, .dst0d, ._, ._ },
58854 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
58855 } },
58856 } }) catch |err| switch (err) {
58857 error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{
58858 @tagName(air_tag),
58859 cg.typeOf(bin_op.rhs).fmt(pt),
58860 ops[1].tracking(cg),
58861 }),
58862 else => |e| return e,
58863 },
58864 }
58865 if (ops[1].index != res[0].index) {
58866 try ops[1].die(cg);
58867 ops[1] = res[0];
58868 } else cg.temp_type[@intFromEnum(res[0].unwrap(cg).temp)] = .i32;
58869 cg.select(&res, &.{lhs_ty}, &ops, comptime &.{ .{
58870 .required_features = .{ .cmov, null, null, null },
58871 .src_constraints = .{ .{ .signed_int = .byte }, .{ .exact_signed_int = 32 }, .any },
58872 .patterns = &.{
58873 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
58874 },
58875 .extra_temps = .{
58876 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
58877 .unused,
58878 .unused,
58879 .unused,
58880 .unused,
58881 .unused,
58882 .unused,
58883 .unused,
58884 .unused,
58885 .unused,
58886 .unused,
58887 },
58888 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58889 .each = .{ .once = &.{
58890 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
58891 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
58892 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
58893 .{ ._, ._, .@"test", .dst0b, .src0b, ._, ._ },
58894 .{ ._, ._nz, .cmov, .dst0d, .tmp0d, ._, ._ },
58895 } },
58896 }, .{
58897 .src_constraints = .{ .{ .signed_int = .byte }, .{ .exact_signed_int = 32 }, .any },
58898 .patterns = &.{
58899 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
58900 },
58901 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58902 .each = .{ .once = &.{
58903 .{ ._, ._, .@"test", .dst0b, .src0b, ._, ._ },
58904 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
58905 .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
58906 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smax), ._, ._ },
58907 } },
58908 }, .{
58909 .required_features = .{ .cmov, null, null, null },
58910 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 32 }, .any },
58911 .patterns = &.{
58912 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
58913 },
58914 .extra_temps = .{
58915 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
58916 .unused,
58917 .unused,
58918 .unused,
58919 .unused,
58920 .unused,
58921 .unused,
58922 .unused,
58923 .unused,
58924 .unused,
58925 .unused,
58926 },
58927 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58928 .each = .{ .once = &.{
58929 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
58930 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
58931 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
58932 .{ ._, ._, .add, .dst0b, .src0b, ._, ._ },
58933 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
58934 } },
58935 }, .{
58936 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 32 }, .any },
58937 .patterns = &.{
58938 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
58939 },
58940 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58941 .each = .{ .once = &.{
58942 .{ ._, ._, .add, .dst0b, .src0b, ._, ._ },
58943 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
58944 .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
58945 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smin), ._, ._ },
58946 } },
58947 }, .{
58948 .required_features = .{ .cmov, null, null, null },
58949 .src_constraints = .{ .{ .signed_int = .byte }, .{ .exact_signed_int = 32 }, .any },
58950 .patterns = &.{
58951 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58952 },
58953 .extra_temps = .{
58954 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
58955 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
58956 .unused,
58957 .unused,
58958 .unused,
58959 .unused,
58960 .unused,
58961 .unused,
58962 .unused,
58963 .unused,
58964 .unused,
58965 },
58966 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58967 .each = .{ .once = &.{
58968 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
58969 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
58970 .{ ._, ._, .lea, .tmp1d, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
58971 .{ ._, ._l, .sa, .dst0b, .src1b, ._, ._ },
58972 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
58973 .{ ._, ._, .cmp, .tmp1b, .ua(.src0, .add_umax_shr_src1), ._, ._ },
58974 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
58975 } },
58976 }, .{
58977 .src_constraints = .{ .{ .signed_int = .byte }, .{ .exact_signed_int = 32 }, .any },
58978 .patterns = &.{
58979 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58980 },
58981 .extra_temps = .{
58982 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
58983 .unused,
58984 .unused,
58985 .unused,
58986 .unused,
58987 .unused,
58988 .unused,
58989 .unused,
58990 .unused,
58991 .unused,
58992 .unused,
58993 },
58994 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58995 .each = .{ .once = &.{
58996 .{ ._, ._, .lea, .tmp0d, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
58997 .{ ._, ._, .cmp, .tmp0b, .ua(.src0, .add_umax_shr_src1), ._, ._ },
58998 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
58999 .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
59000 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smax), ._, ._ },
59001 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59002 .{ .@"1:", ._l, .sa, .dst0b, .src1b, ._, ._ },
59003 } },
59004 }, .{
59005 .src_constraints = .{ .{ .signed_int = .byte }, .{ .exact_signed_int = 32 }, .any },
59006 .patterns = &.{
59007 .{ .src = .{ .to_gpr, .{ .to_reg = .ecx }, .none } },
59008 },
59009 .extra_temps = .{
59010 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
59011 .unused,
59012 .unused,
59013 .unused,
59014 .unused,
59015 .unused,
59016 .unused,
59017 .unused,
59018 .unused,
59019 .unused,
59020 .unused,
59021 },
59022 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59023 .each = .{ .once = &.{
59024 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
59025 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59026 .{ ._, ._, .@"test", .src0b, .src0b, ._, ._ },
59027 .{ .@"0:", ._, .mov, .dst0d, .src0d, ._, ._ },
59028 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59029 .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
59030 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smax), ._, ._ },
59031 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59032 .{ .@"1:", ._, .mov, .dst0d, .src0d, ._, ._ },
59033 .{ ._, ._l, .sa, .dst0b, .src1b, ._, ._ },
59034 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
59035 .{ ._, ._l, .sa, .tmp0b, .uia(8, .src0, .sub_bit_size), ._, ._ },
59036 .{ ._, ._r, .sa, .tmp0b, .uia(8, .src0, .sub_bit_size), ._, ._ },
59037 .{ ._, ._r, .sa, .tmp0b, .src1b, ._, ._ },
59038 .{ ._, ._, .cmp, .tmp0b, .src0b, ._, ._ },
59039 .{ ._, ._ne, .j, .@"0b", ._, ._, ._ },
59040 } },
59041 }, .{
59042 .required_features = .{ .cmov, null, null, null },
59043 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .exact_signed_int = 32 }, .any },
59044 .patterns = &.{
59045 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59046 },
59047 .extra_temps = .{
59048 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
59049 .unused,
59050 .unused,
59051 .unused,
59052 .unused,
59053 .unused,
59054 .unused,
59055 .unused,
59056 .unused,
59057 .unused,
59058 .unused,
59059 },
59060 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59061 .each = .{ .once = &.{
59062 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
59063 .{ ._, ._, .@"test", .dst0b, .src0b, ._, ._ },
59064 .{ ._, ._nz, .cmov, .dst0d, .tmp0d, ._, ._ },
59065 } },
59066 }, .{
59067 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .exact_signed_int = 32 }, .any },
59068 .patterns = &.{
59069 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59070 },
59071 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59072 .each = .{ .once = &.{
59073 .{ ._, ._, .@"test", .dst0b, .src0b, ._, ._ },
59074 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59075 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59076 } },
59077 }, .{
59078 .required_features = .{ .cmov, null, null, null },
59079 .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_signed_int = 32 }, .any },
59080 .patterns = &.{
59081 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59082 },
59083 .extra_temps = .{
59084 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
59085 .unused,
59086 .unused,
59087 .unused,
59088 .unused,
59089 .unused,
59090 .unused,
59091 .unused,
59092 .unused,
59093 .unused,
59094 .unused,
59095 },
59096 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59097 .each = .{ .once = &.{
59098 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
59099 .{ ._, ._, .add, .dst0b, .src0b, ._, ._ },
59100 .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
59101 } },
59102 }, .{
59103 .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_signed_int = 32 }, .any },
59104 .patterns = &.{
59105 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59106 },
59107 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59108 .each = .{ .once = &.{
59109 .{ ._, ._, .add, .dst0b, .src0b, ._, ._ },
59110 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
59111 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59112 } },
59113 }, .{
59114 .required_features = .{ .cmov, null, null, null },
59115 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .exact_signed_int = 32 }, .any },
59116 .patterns = &.{
59117 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59118 },
59119 .extra_temps = .{
59120 .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } } },
59121 .unused,
59122 .unused,
59123 .unused,
59124 .unused,
59125 .unused,
59126 .unused,
59127 .unused,
59128 .unused,
59129 .unused,
59130 .unused,
59131 },
59132 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59133 .each = .{ .once = &.{
59134 .{ ._, ._, .mov, .dst0d, .src0d, ._, ._ },
59135 .{ ._, ._l, .sh, .dst0b, .src1b, ._, ._ },
59136 .{ ._, ._, .cmp, .src0b, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59137 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
59138 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
59139 } },
59140 }, .{
59141 .required_features = .{ .cmov, null, null, null },
59142 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .exact_signed_int = 32 }, .any },
59143 .patterns = &.{
59144 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59145 },
59146 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59147 .each = .{ .once = &.{
59148 .{ ._, ._, .mov, .dst0d, .src0d, ._, ._ },
59149 .{ ._, ._l, .sh, .dst0b, .src1b, ._, ._ },
59150 .{ ._, ._, .cmp, .src0b, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59151 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
59152 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59153 } },
59154 }, .{
59155 .required_features = .{ .cmov, null, null, null },
59156 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .exact_signed_int = 32 }, .any },
59157 .patterns = &.{
59158 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .ecx }, .none } },
59159 },
59160 .extra_temps = .{
59161 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
59162 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
59163 .unused,
59164 .unused,
59165 .unused,
59166 .unused,
59167 .unused,
59168 .unused,
59169 .unused,
59170 .unused,
59171 .unused,
59172 },
59173 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59174 .each = .{ .once = &.{
59175 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59176 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
59177 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59178 .{ ._, ._, .@"test", .src0b, .src0b, ._, ._ },
59179 .{ ._, ._z, .cmov, .dst0d, .src0d, ._, ._ },
59180 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59181 .{ .@"1:", ._, .mov, .tmp0d, .dst0d, ._, ._ },
59182 .{ ._, ._r, .sh, .tmp0b, .src1b, ._, ._ },
59183 .{ ._, ._, .mov, .tmp1d, .src0d, ._, ._ },
59184 .{ ._, ._l, .sh, .tmp1b, .src1b, ._, ._ },
59185 .{ ._, ._, .cmp, .src0b, .tmp0b, ._, ._ },
59186 .{ ._, ._na, .cmov, .dst0d, .tmp1d, ._, ._ },
59187 } },
59188 }, .{
59189 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .exact_signed_int = 32 }, .any },
59190 .patterns = &.{
59191 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .ecx }, .none } },
59192 },
59193 .extra_temps = .{
59194 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
59195 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
59196 .unused,
59197 .unused,
59198 .unused,
59199 .unused,
59200 .unused,
59201 .unused,
59202 .unused,
59203 .unused,
59204 .unused,
59205 },
59206 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59207 .each = .{ .once = &.{
59208 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59209 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
59210 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59211 .{ ._, ._, .@"test", .src0b, .src0b, ._, ._ },
59212 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
59213 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
59214 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59215 .{ .@"1:", ._, .mov, .tmp0d, .dst0d, ._, ._ },
59216 .{ ._, ._r, .sh, .tmp0b, .src1b, ._, ._ },
59217 .{ ._, ._, .mov, .tmp1d, .src0d, ._, ._ },
59218 .{ ._, ._l, .sh, .tmp1b, .src1b, ._, ._ },
59219 .{ ._, ._, .cmp, .src0b, .tmp0b, ._, ._ },
59220 .{ ._, ._a, .j, .@"0f", ._, ._, ._ },
59221 .{ ._, ._, .mov, .dst0d, .tmp1d, ._, ._ },
59222 } },
59223 }, .{
59224 .required_features = .{ .cmov, .fast_imm16, null, null },
59225 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59226 .patterns = &.{
59227 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59228 },
59229 .extra_temps = .{
59230 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59231 .unused,
59232 .unused,
59233 .unused,
59234 .unused,
59235 .unused,
59236 .unused,
59237 .unused,
59238 .unused,
59239 .unused,
59240 .unused,
59241 },
59242 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59243 .each = .{ .once = &.{
59244 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59245 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
59246 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
59247 .{ ._, ._, .@"test", .dst0w, .src0w, ._, ._ },
59248 .{ ._, ._nz, .cmov, .dst0d, .tmp0d, ._, ._ },
59249 } },
59250 }, .{
59251 .required_features = .{ .cmov, null, null, null },
59252 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59253 .patterns = &.{
59254 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59255 },
59256 .extra_temps = .{
59257 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59258 .unused,
59259 .unused,
59260 .unused,
59261 .unused,
59262 .unused,
59263 .unused,
59264 .unused,
59265 .unused,
59266 .unused,
59267 .unused,
59268 },
59269 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59270 .each = .{ .once = &.{
59271 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59272 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
59273 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
59274 .{ ._, ._, .@"test", .dst0w, .src0w, ._, ._ },
59275 .{ ._, ._nz, .cmov, .dst0d, .tmp0d, ._, ._ },
59276 } },
59277 }, .{
59278 .required_features = .{ .fast_imm16, null, null, null },
59279 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59280 .patterns = &.{
59281 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59282 },
59283 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59284 .each = .{ .once = &.{
59285 .{ ._, ._, .@"test", .dst0w, .src0w, ._, ._ },
59286 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59287 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
59288 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
59289 } },
59290 }, .{
59291 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59292 .patterns = &.{
59293 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59294 },
59295 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59296 .each = .{ .once = &.{
59297 .{ ._, ._, .@"test", .dst0w, .src0w, ._, ._ },
59298 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59299 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
59300 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
59301 } },
59302 }, .{
59303 .required_features = .{ .cmov, .fast_imm16, null, null },
59304 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 32 }, .any },
59305 .patterns = &.{
59306 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59307 },
59308 .extra_temps = .{
59309 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59310 .unused,
59311 .unused,
59312 .unused,
59313 .unused,
59314 .unused,
59315 .unused,
59316 .unused,
59317 .unused,
59318 .unused,
59319 .unused,
59320 },
59321 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59322 .each = .{ .once = &.{
59323 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59324 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
59325 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
59326 .{ ._, ._, .add, .dst0w, .src0w, ._, ._ },
59327 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
59328 } },
59329 }, .{
59330 .required_features = .{ .cmov, null, null, null },
59331 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 32 }, .any },
59332 .patterns = &.{
59333 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59334 },
59335 .extra_temps = .{
59336 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59337 .unused,
59338 .unused,
59339 .unused,
59340 .unused,
59341 .unused,
59342 .unused,
59343 .unused,
59344 .unused,
59345 .unused,
59346 .unused,
59347 },
59348 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59349 .each = .{ .once = &.{
59350 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59351 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
59352 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
59353 .{ ._, ._, .add, .dst0w, .src0w, ._, ._ },
59354 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
59355 } },
59356 }, .{
59357 .required_features = .{ .fast_imm16, null, null, null },
59358 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 32 }, .any },
59359 .patterns = &.{
59360 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59361 },
59362 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59363 .each = .{ .once = &.{
59364 .{ ._, ._, .add, .dst0w, .src0w, ._, ._ },
59365 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
59366 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
59367 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smin), ._, ._ },
59368 } },
59369 }, .{
59370 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 32 }, .any },
59371 .patterns = &.{
59372 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59373 },
59374 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59375 .each = .{ .once = &.{
59376 .{ ._, ._, .add, .dst0w, .src0w, ._, ._ },
59377 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
59378 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
59379 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
59380 } },
59381 }, .{
59382 .required_features = .{ .cmov, .fast_imm16, null, null },
59383 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59384 .patterns = &.{
59385 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59386 },
59387 .extra_temps = .{
59388 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59389 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59390 .unused,
59391 .unused,
59392 .unused,
59393 .unused,
59394 .unused,
59395 .unused,
59396 .unused,
59397 .unused,
59398 .unused,
59399 },
59400 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59401 .each = .{ .once = &.{
59402 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59403 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
59404 .{ ._, ._, .lea, .tmp1d, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
59405 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
59406 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
59407 .{ ._, ._, .cmp, .tmp1w, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59408 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
59409 } },
59410 }, .{
59411 .required_features = .{ .cmov, null, null, null },
59412 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59413 .patterns = &.{
59414 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59415 },
59416 .extra_temps = .{
59417 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59418 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59419 .unused,
59420 .unused,
59421 .unused,
59422 .unused,
59423 .unused,
59424 .unused,
59425 .unused,
59426 .unused,
59427 .unused,
59428 },
59429 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59430 .each = .{ .once = &.{
59431 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59432 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
59433 .{ ._, ._, .lea, .tmp1d, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
59434 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
59435 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
59436 .{ ._, ._, .cmp, .tmp1w, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59437 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
59438 } },
59439 }, .{
59440 .required_features = .{ .fast_imm16, null, null, null },
59441 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59442 .patterns = &.{
59443 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59444 },
59445 .extra_temps = .{
59446 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59447 .unused,
59448 .unused,
59449 .unused,
59450 .unused,
59451 .unused,
59452 .unused,
59453 .unused,
59454 .unused,
59455 .unused,
59456 .unused,
59457 },
59458 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59459 .each = .{ .once = &.{
59460 .{ ._, ._, .lea, .tmp0d, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
59461 .{ ._, ._, .cmp, .tmp0w, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59462 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59463 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
59464 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
59465 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59466 .{ .@"1:", ._l, .sa, .dst0d, .src1b, ._, ._ },
59467 } },
59468 }, .{
59469 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59470 .patterns = &.{
59471 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59472 },
59473 .extra_temps = .{
59474 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59475 .unused,
59476 .unused,
59477 .unused,
59478 .unused,
59479 .unused,
59480 .unused,
59481 .unused,
59482 .unused,
59483 .unused,
59484 .unused,
59485 },
59486 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59487 .each = .{ .once = &.{
59488 .{ ._, ._, .lea, .tmp0d, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
59489 .{ ._, ._, .cmp, .tmp0w, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59490 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59491 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
59492 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
59493 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59494 .{ .@"1:", ._l, .sa, .dst0d, .src1b, ._, ._ },
59495 } },
59496 }, .{
59497 .required_features = .{ .fast_imm16, null, null, null },
59498 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59499 .patterns = &.{
59500 .{ .src = .{ .to_gpr, .{ .to_reg = .ecx }, .none } },
59501 },
59502 .extra_temps = .{
59503 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59504 .unused,
59505 .unused,
59506 .unused,
59507 .unused,
59508 .unused,
59509 .unused,
59510 .unused,
59511 .unused,
59512 .unused,
59513 .unused,
59514 },
59515 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59516 .each = .{ .once = &.{
59517 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
59518 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59519 .{ ._, ._, .@"test", .src0w, .src0w, ._, ._ },
59520 .{ .@"0:", ._, .mov, .dst0d, .src0d, ._, ._ },
59521 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59522 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
59523 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
59524 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59525 .{ .@"1:", ._, .mov, .dst0d, .src0d, ._, ._ },
59526 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
59527 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
59528 .{ ._, ._l, .sa, .tmp0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
59529 .{ ._, ._r, .sa, .tmp0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
59530 .{ ._, ._r, .sa, .tmp0d, .src1b, ._, ._ },
59531 .{ ._, ._, .cmp, .tmp0w, .src0w, ._, ._ },
59532 .{ ._, ._ne, .j, .@"0b", ._, ._, ._ },
59533 } },
59534 }, .{
59535 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_signed_int = 32 }, .any },
59536 .patterns = &.{
59537 .{ .src = .{ .to_gpr, .{ .to_reg = .ecx }, .none } },
59538 },
59539 .extra_temps = .{
59540 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
59541 .unused,
59542 .unused,
59543 .unused,
59544 .unused,
59545 .unused,
59546 .unused,
59547 .unused,
59548 .unused,
59549 .unused,
59550 .unused,
59551 },
59552 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59553 .each = .{ .once = &.{
59554 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
59555 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59556 .{ ._, ._, .@"test", .src0w, .src0w, ._, ._ },
59557 .{ .@"0:", ._, .mov, .dst0d, .src0d, ._, ._ },
59558 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59559 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
59560 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
59561 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59562 .{ .@"1:", ._, .mov, .dst0d, .src0d, ._, ._ },
59563 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
59564 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
59565 .{ ._, ._l, .sa, .tmp0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
59566 .{ ._, ._r, .sa, .tmp0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
59567 .{ ._, ._r, .sa, .tmp0d, .src1b, ._, ._ },
59568 .{ ._, ._, .cmp, .tmp0w, .src0w, ._, ._ },
59569 .{ ._, ._ne, .j, .@"0b", ._, ._, ._ },
59570 } },
59571 }, .{
59572 .required_features = .{ .cmov, null, null, null },
59573 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .exact_signed_int = 32 }, .any },
59574 .patterns = &.{
59575 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59576 },
59577 .extra_temps = .{
59578 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
59579 .unused,
59580 .unused,
59581 .unused,
59582 .unused,
59583 .unused,
59584 .unused,
59585 .unused,
59586 .unused,
59587 .unused,
59588 .unused,
59589 },
59590 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59591 .each = .{ .once = &.{
59592 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
59593 .{ ._, ._, .@"test", .dst0w, .src0w, ._, ._ },
59594 .{ ._, ._nz, .cmov, .dst0d, .tmp0d, ._, ._ },
59595 } },
59596 }, .{
59597 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .exact_signed_int = 32 }, .any },
59598 .patterns = &.{
59599 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59600 },
59601 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59602 .each = .{ .once = &.{
59603 .{ ._, ._, .@"test", .dst0w, .src0w, ._, ._ },
59604 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59605 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59606 } },
59607 }, .{
59608 .required_features = .{ .cmov, null, null, null },
59609 .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_signed_int = 32 }, .any },
59610 .patterns = &.{
59611 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59612 },
59613 .extra_temps = .{
59614 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
59615 .unused,
59616 .unused,
59617 .unused,
59618 .unused,
59619 .unused,
59620 .unused,
59621 .unused,
59622 .unused,
59623 .unused,
59624 .unused,
59625 },
59626 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59627 .each = .{ .once = &.{
59628 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
59629 .{ ._, ._, .add, .dst0w, .src0w, ._, ._ },
59630 .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
59631 } },
59632 }, .{
59633 .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_signed_int = 32 }, .any },
59634 .patterns = &.{
59635 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59636 },
59637 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59638 .each = .{ .once = &.{
59639 .{ ._, ._, .add, .dst0w, .src0w, ._, ._ },
59640 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
59641 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59642 } },
59643 }, .{
59644 .required_features = .{ .cmov, null, null, null },
59645 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .exact_signed_int = 32 }, .any },
59646 .patterns = &.{
59647 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59648 },
59649 .extra_temps = .{
59650 .{ .type = .u16, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } } },
59651 .unused,
59652 .unused,
59653 .unused,
59654 .unused,
59655 .unused,
59656 .unused,
59657 .unused,
59658 .unused,
59659 .unused,
59660 .unused,
59661 },
59662 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59663 .each = .{ .once = &.{
59664 .{ ._, ._, .mov, .dst0d, .src0d, ._, ._ },
59665 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },
59666 .{ ._, ._, .cmp, .src0w, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59667 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
59668 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
59669 } },
59670 }, .{
59671 .required_features = .{ .cmov, null, null, null },
59672 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .exact_signed_int = 32 }, .any },
59673 .patterns = &.{
59674 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59675 },
59676 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59677 .each = .{ .once = &.{
59678 .{ ._, ._, .mov, .dst0d, .src0d, ._, ._ },
59679 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },
59680 .{ ._, ._, .cmp, .src0w, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59681 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
59682 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59683 } },
59684 }, .{
59685 .required_features = .{ .cmov, null, null, null },
59686 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .exact_signed_int = 32 }, .any },
59687 .patterns = &.{
59688 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .ecx }, .none } },
59689 },
59690 .extra_temps = .{
59691 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
59692 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
59693 .unused,
59694 .unused,
59695 .unused,
59696 .unused,
59697 .unused,
59698 .unused,
59699 .unused,
59700 .unused,
59701 .unused,
59702 },
59703 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59704 .each = .{ .once = &.{
59705 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59706 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
59707 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59708 .{ ._, ._, .@"test", .src0w, .src0w, ._, ._ },
59709 .{ ._, ._z, .cmov, .dst0d, .src0d, ._, ._ },
59710 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59711 .{ .@"1:", ._, .mov, .tmp0d, .dst0d, ._, ._ },
59712 .{ ._, ._r, .sh, .tmp0w, .src1b, ._, ._ },
59713 .{ ._, ._, .mov, .tmp1d, .src0d, ._, ._ },
59714 .{ ._, ._l, .sh, .tmp1d, .src1b, ._, ._ },
59715 .{ ._, ._, .cmp, .src0w, .tmp0w, ._, ._ },
59716 .{ ._, ._na, .cmov, .dst0d, .tmp1d, ._, ._ },
59717 } },
59718 }, .{
59719 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .exact_signed_int = 32 }, .any },
59720 .patterns = &.{
59721 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .ecx }, .none } },
59722 },
59723 .extra_temps = .{
59724 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
59725 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
59726 .unused,
59727 .unused,
59728 .unused,
59729 .unused,
59730 .unused,
59731 .unused,
59732 .unused,
59733 .unused,
59734 .unused,
59735 },
59736 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59737 .each = .{ .once = &.{
59738 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59739 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
59740 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59741 .{ ._, ._, .@"test", .src0w, .src0w, ._, ._ },
59742 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
59743 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
59744 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59745 .{ .@"1:", ._, .mov, .tmp0d, .dst0d, ._, ._ },
59746 .{ ._, ._r, .sh, .tmp0w, .src1b, ._, ._ },
59747 .{ ._, ._, .mov, .tmp1d, .src0d, ._, ._ },
59748 .{ ._, ._l, .sh, .tmp1d, .src1b, ._, ._ },
59749 .{ ._, ._, .cmp, .src0w, .tmp0w, ._, ._ },
59750 .{ ._, ._a, .j, .@"0f", ._, ._, ._ },
59751 .{ ._, ._, .mov, .dst0d, .tmp1d, ._, ._ },
59752 } },
59753 }, .{
59754 .required_features = .{ .cmov, null, null, null },
59755 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_signed_int = 32 }, .any },
59756 .patterns = &.{
59757 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59758 },
59759 .extra_temps = .{
59760 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
59761 .unused,
59762 .unused,
59763 .unused,
59764 .unused,
59765 .unused,
59766 .unused,
59767 .unused,
59768 .unused,
59769 .unused,
59770 .unused,
59771 },
59772 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59773 .each = .{ .once = &.{
59774 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59775 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
59776 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
59777 .{ ._, ._, .@"test", .dst0d, .src0d, ._, ._ },
59778 .{ ._, ._nz, .cmov, .dst0d, .tmp0d, ._, ._ },
59779 } },
59780 }, .{
59781 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_signed_int = 32 }, .any },
59782 .patterns = &.{
59783 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59784 },
59785 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59786 .each = .{ .once = &.{
59787 .{ ._, ._, .@"test", .dst0d, .src0d, ._, ._ },
59788 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59789 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
59790 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
59791 } },
59792 }, .{
59793 .required_features = .{ .cmov, null, null, null },
59794 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
59795 .patterns = &.{
59796 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59797 },
59798 .extra_temps = .{
59799 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
59800 .unused,
59801 .unused,
59802 .unused,
59803 .unused,
59804 .unused,
59805 .unused,
59806 .unused,
59807 .unused,
59808 .unused,
59809 .unused,
59810 },
59811 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59812 .each = .{ .once = &.{
59813 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59814 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
59815 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
59816 .{ ._, ._, .add, .dst0d, .src0d, ._, ._ },
59817 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
59818 } },
59819 }, .{
59820 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
59821 .patterns = &.{
59822 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59823 },
59824 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59825 .each = .{ .once = &.{
59826 .{ ._, ._, .add, .dst0d, .src0d, ._, ._ },
59827 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
59828 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
59829 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
59830 } },
59831 }, .{
59832 .required_features = .{ .cmov, null, null, null },
59833 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_signed_int = 32 }, .any },
59834 .patterns = &.{
59835 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59836 },
59837 .extra_temps = .{
59838 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
59839 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
59840 .unused,
59841 .unused,
59842 .unused,
59843 .unused,
59844 .unused,
59845 .unused,
59846 .unused,
59847 .unused,
59848 .unused,
59849 },
59850 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59851 .each = .{ .once = &.{
59852 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
59853 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
59854 .{ ._, ._, .lea, .tmp1d, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
59855 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
59856 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
59857 .{ ._, ._, .cmp, .tmp1d, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59858 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
59859 } },
59860 }, .{
59861 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_signed_int = 32 }, .any },
59862 .patterns = &.{
59863 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
59864 },
59865 .extra_temps = .{
59866 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
59867 .unused,
59868 .unused,
59869 .unused,
59870 .unused,
59871 .unused,
59872 .unused,
59873 .unused,
59874 .unused,
59875 .unused,
59876 .unused,
59877 },
59878 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59879 .each = .{ .once = &.{
59880 .{ ._, ._, .lea, .tmp0d, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
59881 .{ ._, ._, .cmp, .tmp0d, .ua(.src0, .add_umax_shr_src1), ._, ._ },
59882 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59883 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
59884 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
59885 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59886 .{ .@"1:", ._l, .sa, .dst0d, .src1b, ._, ._ },
59887 } },
59888 }, .{
59889 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_signed_int = 32 }, .any },
59890 .patterns = &.{
59891 .{ .src = .{ .to_gpr, .{ .to_reg = .ecx }, .none } },
59892 },
59893 .extra_temps = .{
59894 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
59895 .unused,
59896 .unused,
59897 .unused,
59898 .unused,
59899 .unused,
59900 .unused,
59901 .unused,
59902 .unused,
59903 .unused,
59904 .unused,
59905 },
59906 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
59907 .each = .{ .once = &.{
59908 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
59909 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
59910 .{ ._, ._, .@"test", .src0d, .src0d, ._, ._ },
59911 .{ .@"0:", ._, .mov, .dst0d, .src0d, ._, ._ },
59912 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59913 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
59914 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
59915 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
59916 .{ .@"1:", ._, .mov, .dst0d, .src0d, ._, ._ },
59917 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
59918 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
59919 .{ ._, ._l, .sa, .tmp0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
59920 .{ ._, ._r, .sa, .tmp0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
59921 .{ ._, ._r, .sa, .tmp0d, .src1b, ._, ._ },
59922 .{ ._, ._, .cmp, .tmp0d, .src0d, ._, ._ },
59923 .{ ._, ._ne, .j, .@"0b", ._, ._, ._ },
59924 } },
59925 }, .{
59926 .required_features = .{ .cmov, null, null, null },
59927 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_signed_int = 32 }, .any },
59928 .patterns = &.{
59929 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59930 },
59931 .extra_temps = .{
59932 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
59933 .unused,
59934 .unused,
59935 .unused,
59936 .unused,
59937 .unused,
59938 .unused,
59939 .unused,
59940 .unused,
59941 .unused,
59942 .unused,
59943 },
59944 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59945 .each = .{ .once = &.{
59946 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
59947 .{ ._, ._, .@"test", .dst0d, .src0d, ._, ._ },
59948 .{ ._, ._nz, .cmov, .dst0d, .tmp0d, ._, ._ },
59949 } },
59950 }, .{
59951 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_signed_int = 32 }, .any },
59952 .patterns = &.{
59953 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
59954 },
59955 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59956 .each = .{ .once = &.{
59957 .{ ._, ._, .@"test", .dst0d, .src0d, ._, ._ },
59958 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
59959 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59960 } },
59961 }, .{
59962 .required_features = .{ .cmov, null, null, null },
59963 .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_signed_int = 32 }, .any },
59964 .patterns = &.{
59965 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59966 },
59967 .extra_temps = .{
59968 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
59969 .unused,
59970 .unused,
59971 .unused,
59972 .unused,
59973 .unused,
59974 .unused,
59975 .unused,
59976 .unused,
59977 .unused,
59978 .unused,
59979 },
59980 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59981 .each = .{ .once = &.{
59982 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
59983 .{ ._, ._, .add, .dst0d, .src0d, ._, ._ },
59984 .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
59985 } },
59986 }, .{
59987 .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_signed_int = 32 }, .any },
59988 .patterns = &.{
59989 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
59990 },
59991 .dst_temps = .{ .{ .ref = .src0 }, .unused },
59992 .each = .{ .once = &.{
59993 .{ ._, ._, .add, .dst0d, .src0d, ._, ._ },
59994 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
59995 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
59996 } },
59997 }, .{
59998 .required_features = .{ .cmov, null, null, null },
59999 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_signed_int = 32 }, .any },
60000 .patterns = &.{
60001 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
60002 },
60003 .extra_temps = .{
60004 .{ .type = .u32, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } } },
60005 .unused,
60006 .unused,
60007 .unused,
60008 .unused,
60009 .unused,
60010 .unused,
60011 .unused,
60012 .unused,
60013 .unused,
60014 .unused,
60015 },
60016 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
60017 .each = .{ .once = &.{
60018 .{ ._, ._, .mov, .dst0d, .src0d, ._, ._ },
60019 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },
60020 .{ ._, ._, .cmp, .src0d, .ua(.src0, .add_umax_shr_src1), ._, ._ },
60021 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
60022 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
60023 } },
60024 }, .{
60025 .required_features = .{ .cmov, null, null, null },
60026 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_signed_int = 32 }, .any },
60027 .patterns = &.{
60028 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
60029 },
60030 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60031 .each = .{ .once = &.{
60032 .{ ._, ._, .mov, .dst0d, .src0d, ._, ._ },
60033 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },
60034 .{ ._, ._, .cmp, .src0d, .ua(.src0, .add_umax_shr_src1), ._, ._ },
60035 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
60036 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
60037 } },
60038 }, .{
60039 .required_features = .{ .cmov, null, null, null },
60040 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_signed_int = 32 }, .any },
60041 .patterns = &.{
60042 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .ecx }, .none } },
60043 },
60044 .extra_temps = .{
60045 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60046 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60047 .unused,
60048 .unused,
60049 .unused,
60050 .unused,
60051 .unused,
60052 .unused,
60053 .unused,
60054 .unused,
60055 .unused,
60056 },
60057 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
60058 .each = .{ .once = &.{
60059 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
60060 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60061 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60062 .{ ._, ._, .@"test", .src0d, .src0d, ._, ._ },
60063 .{ ._, ._z, .cmov, .dst0d, .src0d, ._, ._ },
60064 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
60065 .{ .@"1:", ._, .mov, .tmp0d, .dst0d, ._, ._ },
60066 .{ ._, ._r, .sh, .tmp0d, .src1b, ._, ._ },
60067 .{ ._, ._, .mov, .tmp1d, .src0d, ._, ._ },
60068 .{ ._, ._l, .sh, .tmp1d, .src1b, ._, ._ },
60069 .{ ._, ._, .cmp, .src0d, .tmp0d, ._, ._ },
60070 .{ ._, ._na, .cmov, .dst0d, .tmp1d, ._, ._ },
60071 } },
60072 }, .{
60073 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_signed_int = 32 }, .any },
60074 .patterns = &.{
60075 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .ecx }, .none } },
60076 },
60077 .extra_temps = .{
60078 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60079 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60080 .unused,
60081 .unused,
60082 .unused,
60083 .unused,
60084 .unused,
60085 .unused,
60086 .unused,
60087 .unused,
60088 .unused,
60089 },
60090 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
60091 .each = .{ .once = &.{
60092 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
60093 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60094 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60095 .{ ._, ._, .@"test", .src0d, .src0d, ._, ._ },
60096 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
60097 .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ },
60098 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
60099 .{ .@"1:", ._, .mov, .tmp0d, .dst0d, ._, ._ },
60100 .{ ._, ._r, .sh, .tmp0d, .src1b, ._, ._ },
60101 .{ ._, ._, .mov, .tmp1d, .src0d, ._, ._ },
60102 .{ ._, ._l, .sh, .tmp1d, .src1b, ._, ._ },
60103 .{ ._, ._, .cmp, .src0d, .tmp0d, ._, ._ },
60104 .{ ._, ._a, .j, .@"0f", ._, ._, ._ },
60105 .{ ._, ._, .mov, .dst0d, .tmp1d, ._, ._ },
60106 } },
60107 }, .{
60108 .required_features = .{ .@"64bit", .cmov, null, null },
60109 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60110 .patterns = &.{
60111 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
60112 },
60113 .extra_temps = .{
60114 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60115 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60116 .unused,
60117 .unused,
60118 .unused,
60119 .unused,
60120 .unused,
60121 .unused,
60122 .unused,
60123 .unused,
60124 .unused,
60125 },
60126 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60127 .each = .{ .once = &.{
60128 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
60129 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
60130 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
60131 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
60132 .{ ._, ._, .@"test", .dst0q, .src0q, ._, ._ },
60133 .{ ._, ._nz, .cmov, .dst0q, .tmp0q, ._, ._ },
60134 } },
60135 }, .{
60136 .required_features = .{ .@"64bit", null, null, null },
60137 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60138 .patterns = &.{
60139 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
60140 },
60141 .extra_temps = .{
60142 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60143 .unused,
60144 .unused,
60145 .unused,
60146 .unused,
60147 .unused,
60148 .unused,
60149 .unused,
60150 .unused,
60151 .unused,
60152 .unused,
60153 },
60154 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60155 .each = .{ .once = &.{
60156 .{ ._, ._, .@"test", .dst0q, .src0q, ._, ._ },
60157 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60158 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
60159 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smax), ._, ._ },
60160 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
60161 } },
60162 }, .{
60163 .required_features = .{ .@"64bit", .cmov, null, null },
60164 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 32 }, .any },
60165 .patterns = &.{
60166 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
60167 },
60168 .extra_temps = .{
60169 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60170 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60171 .unused,
60172 .unused,
60173 .unused,
60174 .unused,
60175 .unused,
60176 .unused,
60177 .unused,
60178 .unused,
60179 .unused,
60180 },
60181 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60182 .each = .{ .once = &.{
60183 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
60184 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
60185 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
60186 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
60187 .{ ._, ._, .add, .dst0q, .src0q, ._, ._ },
60188 .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
60189 } },
60190 }, .{
60191 .required_features = .{ .@"64bit", null, null, null },
60192 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 32 }, .any },
60193 .patterns = &.{
60194 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
60195 },
60196 .extra_temps = .{
60197 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60198 .unused,
60199 .unused,
60200 .unused,
60201 .unused,
60202 .unused,
60203 .unused,
60204 .unused,
60205 .unused,
60206 .unused,
60207 .unused,
60208 },
60209 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60210 .each = .{ .once = &.{
60211 .{ ._, ._, .add, .dst0q, .src0q, ._, ._ },
60212 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
60213 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
60214 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smin), ._, ._ },
60215 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
60216 } },
60217 }, .{
60218 .required_features = .{ .@"64bit", .cmov, null, null },
60219 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60220 .patterns = &.{
60221 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
60222 },
60223 .extra_temps = .{
60224 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60225 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60226 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60227 .unused,
60228 .unused,
60229 .unused,
60230 .unused,
60231 .unused,
60232 .unused,
60233 .unused,
60234 .unused,
60235 },
60236 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60237 .each = .{ .once = &.{
60238 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
60239 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
60240 .{ ._, ._, .lea, .tmp1q, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
60241 .{ ._, ._l, .sa, .dst0q, .src1b, ._, ._ },
60242 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smax), ._, ._ },
60243 .{ ._, ._, .xor, .tmp0q, .tmp2q, ._, ._ },
60244 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_umax_shr_src1), ._, ._ },
60245 .{ ._, ._, .cmp, .tmp1q, .tmp2q, ._, ._ },
60246 .{ ._, ._a, .cmov, .dst0q, .tmp0q, ._, ._ },
60247 } },
60248 }, .{
60249 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60250 .patterns = &.{
60251 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
60252 },
60253 .extra_temps = .{
60254 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60255 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60256 .unused,
60257 .unused,
60258 .unused,
60259 .unused,
60260 .unused,
60261 .unused,
60262 .unused,
60263 .unused,
60264 .unused,
60265 },
60266 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60267 .each = .{ .once = &.{
60268 .{ ._, ._, .lea, .tmp0q, .leaad(.src0, .add_smax_shr_src1, 1), ._, ._ },
60269 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax_shr_src1), ._, ._ },
60270 .{ ._, ._, .cmp, .tmp0q, .tmp1q, ._, ._ },
60271 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60272 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
60273 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
60274 .{ ._, ._, .xor, .dst0q, .tmp1q, ._, ._ },
60275 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
60276 .{ .@"1:", ._l, .sa, .dst0q, .src1b, ._, ._ },
60277 } },
60278 }, .{
60279 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60280 .patterns = &.{
60281 .{ .src = .{ .to_gpr, .{ .to_reg = .ecx }, .none } },
60282 },
60283 .extra_temps = .{
60284 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60285 .unused,
60286 .unused,
60287 .unused,
60288 .unused,
60289 .unused,
60290 .unused,
60291 .unused,
60292 .unused,
60293 .unused,
60294 .unused,
60295 },
60296 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
60297 .each = .{ .once = &.{
60298 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60299 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60300 .{ ._, ._, .@"test", .src0q, .src0q, ._, ._ },
60301 .{ .@"0:", ._, .mov, .dst0q, .src0q, ._, ._ },
60302 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60303 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
60304 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smax), ._, ._ },
60305 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
60306 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
60307 .{ .@"1:", ._, .mov, .dst0q, .src0q, ._, ._ },
60308 .{ ._, ._l, .sa, .dst0q, .src1b, ._, ._ },
60309 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
60310 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
60311 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
60312 .{ ._, ._r, .sa, .tmp0q, .src1b, ._, ._ },
60313 .{ ._, ._, .cmp, .tmp0q, .src0q, ._, ._ },
60314 .{ ._, ._ne, .j, .@"0b", ._, ._, ._ },
60315 } },
60316 }, .{
60317 .required_features = .{ .cmov, null, null, null },
60318 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60319 .patterns = &.{
60320 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
60321 },
60322 .extra_temps = .{
60323 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60324 .unused,
60325 .unused,
60326 .unused,
60327 .unused,
60328 .unused,
60329 .unused,
60330 .unused,
60331 .unused,
60332 .unused,
60333 .unused,
60334 },
60335 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60336 .each = .{ .once = &.{
60337 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
60338 .{ ._, ._, .@"test", .dst0q, .src0q, ._, ._ },
60339 .{ ._, ._nz, .cmov, .dst0q, .tmp0q, ._, ._ },
60340 } },
60341 }, .{
60342 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60343 .patterns = &.{
60344 .{ .src = .{ .to_mut_gpr, .{ .imm = -1 }, .none } },
60345 },
60346 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60347 .each = .{ .once = &.{
60348 .{ ._, ._, .@"test", .dst0q, .src0q, ._, ._ },
60349 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60350 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
60351 } },
60352 }, .{
60353 .required_features = .{ .cmov, null, null, null },
60354 .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_signed_int = 32 }, .any },
60355 .patterns = &.{
60356 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
60357 },
60358 .extra_temps = .{
60359 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60360 .unused,
60361 .unused,
60362 .unused,
60363 .unused,
60364 .unused,
60365 .unused,
60366 .unused,
60367 .unused,
60368 .unused,
60369 .unused,
60370 },
60371 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60372 .each = .{ .once = &.{
60373 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
60374 .{ ._, ._, .add, .dst0q, .src0q, ._, ._ },
60375 .{ ._, ._c, .cmov, .dst0q, .tmp0q, ._, ._ },
60376 } },
60377 }, .{
60378 .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_signed_int = 32 }, .any },
60379 .patterns = &.{
60380 .{ .src = .{ .to_mut_gpr, .{ .imm = 1 }, .none } },
60381 },
60382 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60383 .each = .{ .once = &.{
60384 .{ ._, ._, .add, .dst0q, .src0q, ._, ._ },
60385 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
60386 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
60387 } },
60388 }, .{
60389 .required_features = .{ .cmov, null, null, null },
60390 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60391 .patterns = &.{
60392 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
60393 },
60394 .extra_temps = .{
60395 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60396 .unused,
60397 .unused,
60398 .unused,
60399 .unused,
60400 .unused,
60401 .unused,
60402 .unused,
60403 .unused,
60404 .unused,
60405 .unused,
60406 },
60407 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
60408 .each = .{ .once = &.{
60409 .{ ._, ._, .mov, .dst0q, .src0q, ._, ._ },
60410 .{ ._, ._l, .sh, .dst0q, .src1b, ._, ._ },
60411 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax_shr_src1), ._, ._ },
60412 .{ ._, ._, .cmp, .src0q, .tmp0q, ._, ._ },
60413 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
60414 .{ ._, ._a, .cmov, .dst0q, .tmp0q, ._, ._ },
60415 } },
60416 }, .{
60417 .required_features = .{ .cmov, null, null, null },
60418 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60419 .patterns = &.{
60420 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
60421 },
60422 .extra_temps = .{
60423 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60424 .unused,
60425 .unused,
60426 .unused,
60427 .unused,
60428 .unused,
60429 .unused,
60430 .unused,
60431 .unused,
60432 .unused,
60433 .unused,
60434 },
60435 .dst_temps = .{ .{ .ref = .src0 }, .unused },
60436 .each = .{ .once = &.{
60437 .{ ._, ._, .mov, .dst0q, .src0q, ._, ._ },
60438 .{ ._, ._l, .sh, .dst0q, .src1b, ._, ._ },
60439 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax_shr_src1), ._, ._ },
60440 .{ ._, ._, .cmp, .src0q, .tmp0q, ._, ._ },
60441 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
60442 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
60443 } },
60444 }, .{
60445 .required_features = .{ .cmov, null, null, null },
60446 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60447 .patterns = &.{
60448 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .ecx }, .none } },
60449 },
60450 .extra_temps = .{
60451 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60452 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60453 .unused,
60454 .unused,
60455 .unused,
60456 .unused,
60457 .unused,
60458 .unused,
60459 .unused,
60460 .unused,
60461 .unused,
60462 },
60463 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
60464 .each = .{ .once = &.{
60465 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
60466 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60467 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60468 .{ ._, ._, .@"test", .src0q, .src0q, ._, ._ },
60469 .{ ._, ._z, .cmov, .dst0q, .src0q, ._, ._ },
60470 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
60471 .{ .@"1:", ._, .mov, .tmp0q, .dst0q, ._, ._ },
60472 .{ ._, ._r, .sh, .tmp0q, .src1b, ._, ._ },
60473 .{ ._, ._, .mov, .tmp1q, .src0q, ._, ._ },
60474 .{ ._, ._l, .sh, .tmp1q, .src1b, ._, ._ },
60475 .{ ._, ._, .cmp, .src0q, .tmp0q, ._, ._ },
60476 .{ ._, ._na, .cmov, .dst0q, .tmp1q, ._, ._ },
60477 } },
60478 }, .{
60479 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_signed_int = 32 }, .any },
60480 .patterns = &.{
60481 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .ecx }, .none } },
60482 },
60483 .extra_temps = .{
60484 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60485 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60486 .unused,
60487 .unused,
60488 .unused,
60489 .unused,
60490 .unused,
60491 .unused,
60492 .unused,
60493 .unused,
60494 .unused,
60495 },
60496 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
60497 .each = .{ .once = &.{
60498 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
60499 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60500 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60501 .{ ._, ._, .@"test", .src0q, .src0q, ._, ._ },
60502 .{ ._, ._nz, .j, .@"0f", ._, ._, ._ },
60503 .{ ._, ._, .xor, .dst0q, .dst0q, ._, ._ },
60504 .{ ._, ._mp, .j, .@"0f", ._, ._, ._ },
60505 .{ .@"1:", ._, .mov, .tmp0q, .dst0q, ._, ._ },
60506 .{ ._, ._r, .sh, .tmp0q, .src1b, ._, ._ },
60507 .{ ._, ._, .mov, .tmp1q, .src0q, ._, ._ },
60508 .{ ._, ._l, .sh, .tmp1q, .src1b, ._, ._ },
60509 .{ ._, ._, .cmp, .src0q, .tmp0q, ._, ._ },
60510 .{ ._, ._a, .j, .@"0f", ._, ._, ._ },
60511 .{ ._, ._, .mov, .dst0q, .tmp1q, ._, ._ },
60512 } },
60513 }, .{
60514 .required_features = .{ .@"64bit", .slow_incdec, null, null },
60515 .src_constraints = .{
60516 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = 128 } },
60517 .{ .exact_signed_int = 32 },
60518 .any,
60519 },
60520 .patterns = &.{
60521 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
60522 },
60523 .extra_temps = .{
60524 .{ .type = .u32, .kind = .{ .reg = .rax } },
60525 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60526 .{ .type = .usize, .kind = .{ .reg = .rdi } },
60527 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60528 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60529 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60530 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60531 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60532 .unused,
60533 .unused,
60534 .unused,
60535 },
60536 .dst_temps = .{ .mem, .unused },
60537 .clobbers = .{ .eflags = true },
60538 .each = .{ .once = &.{
60539 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60540 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60541 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
60542 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
60543 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
60544 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
60545 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
60546 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
60547 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
60548 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
60549 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
60550 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
60551 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
60552 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
60553 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60554 .{ ._, ._, .mov, .tmp3q, .memad(.src0q, .add_size, -8), ._, ._ },
60555 .{ ._, ._, .mov, .tmp4q, .lea(.tmp2q), ._, ._ },
60556 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
60557 .{ ._, ._, .mov, .tmp5q, .tmp3q, ._, ._ },
60558 .{ ._, ._ld, .sh, .tmp5q, .tmp4q, .src1b, ._ },
60559 .{ ._, ._, .xor, .tmp5q, .tmp3q, ._, ._ },
60560 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
60561 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
60562 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
60563 .{ .@"0:", ._, .mov, .tmp7q, .tmp3q, ._, ._ },
60564 .{ ._, ._, .xor, .tmp7q, .leasi(.tmp2q, .@"8", .tmp6), ._, ._ },
60565 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
60566 .{ ._, ._, .sub, .tmp6d, .si(1), ._, ._ },
60567 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
60568 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
60569 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
60570 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
60571 .{ .@"0:", ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60572 .{ ._, ._ld, .sh, .tmp4q, .tmp6q, .src1b, ._ },
60573 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp4q, ._, ._ },
60574 .{ ._, ._, .mov, .tmp4q, .tmp6q, ._, ._ },
60575 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
60576 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
60577 .{ .@"1:", ._l, .sh, .tmp4q, .src1b, ._, ._ },
60578 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
60579 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
60580 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
60581 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
60582 .{ ._, ._, .mov, .tmp7q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
60583 .{ ._, ._r, .sa, .tmp7q, .ui(63), ._, ._ },
60584 .{ ._, ._, .xor, .tmp7q, .tmp3q, ._, ._ },
60585 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
60586 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60587 .{ .@"2:", ._, .mov, .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ },
60588 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
60589 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
60590 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
60591 .{ ._, ._, .not, .tmp0q, ._, ._, ._ },
60592 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
60593 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
60594 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
60595 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
60596 } },
60597 }, .{
60598 .required_features = .{ .@"64bit", null, null, null },
60599 .src_constraints = .{
60600 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = 128 } },
60601 .{ .exact_signed_int = 32 },
60602 .any,
60603 },
60604 .patterns = &.{
60605 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
60606 },
60607 .extra_temps = .{
60608 .{ .type = .u32, .kind = .{ .reg = .rax } },
60609 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60610 .{ .type = .usize, .kind = .{ .reg = .rdi } },
60611 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60612 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60613 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60614 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60615 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60616 .unused,
60617 .unused,
60618 .unused,
60619 },
60620 .dst_temps = .{ .mem, .unused },
60621 .clobbers = .{ .eflags = true },
60622 .each = .{ .once = &.{
60623 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60624 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60625 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
60626 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
60627 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
60628 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
60629 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
60630 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
60631 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
60632 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
60633 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
60634 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
60635 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
60636 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
60637 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60638 .{ ._, ._, .mov, .tmp3q, .memad(.src0q, .add_size, -8), ._, ._ },
60639 .{ ._, ._, .mov, .tmp4q, .lea(.tmp2q), ._, ._ },
60640 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
60641 .{ ._, ._, .mov, .tmp5q, .tmp3q, ._, ._ },
60642 .{ ._, ._ld, .sh, .tmp5q, .tmp4q, .src1b, ._ },
60643 .{ ._, ._, .xor, .tmp5q, .tmp3q, ._, ._ },
60644 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
60645 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
60646 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
60647 .{ .@"0:", ._, .mov, .tmp7q, .tmp3q, ._, ._ },
60648 .{ ._, ._, .xor, .tmp7q, .leasi(.tmp2q, .@"8", .tmp6), ._, ._ },
60649 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
60650 .{ ._, ._c, .de, .tmp6d, ._, ._, ._ },
60651 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
60652 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
60653 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
60654 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
60655 .{ .@"0:", ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60656 .{ ._, ._ld, .sh, .tmp4q, .tmp6q, .src1b, ._ },
60657 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp4q, ._, ._ },
60658 .{ ._, ._, .mov, .tmp4q, .tmp6q, ._, ._ },
60659 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
60660 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
60661 .{ .@"1:", ._l, .sh, .tmp4q, .src1b, ._, ._ },
60662 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
60663 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
60664 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
60665 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
60666 .{ ._, ._, .mov, .tmp7q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
60667 .{ ._, ._r, .sa, .tmp7q, .ui(63), ._, ._ },
60668 .{ ._, ._, .xor, .tmp7q, .tmp3q, ._, ._ },
60669 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
60670 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60671 .{ .@"2:", ._, .mov, .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ },
60672 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
60673 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
60674 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
60675 .{ ._, ._, .not, .tmp0q, ._, ._, ._ },
60676 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
60677 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
60678 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
60679 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
60680 } },
60681 }, .{
60682 .required_features = .{ .@"64bit", .slow_incdec, null, null },
60683 .src_constraints = .{
60684 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = 128 } },
60685 .{ .exact_signed_int = 32 },
60686 .any,
60687 },
60688 .patterns = &.{
60689 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
60690 },
60691 .extra_temps = .{
60692 .{ .type = .u32, .kind = .{ .reg = .rax } },
60693 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60694 .{ .type = .usize, .kind = .{ .reg = .rdi } },
60695 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60696 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60697 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60698 .unused,
60699 .unused,
60700 .unused,
60701 .unused,
60702 .unused,
60703 },
60704 .dst_temps = .{ .mem, .unused },
60705 .clobbers = .{ .eflags = true },
60706 .each = .{ .once = &.{
60707 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60708 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60709 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
60710 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
60711 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
60712 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
60713 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
60714 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
60715 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
60716 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
60717 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
60718 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
60719 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
60720 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60721 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
60722 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
60723 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
60724 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
60725 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
60726 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
60727 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
60728 .{ ._, ._, .sub, .tmp5d, .si(1), ._, ._ },
60729 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
60730 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
60731 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
60732 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
60733 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60734 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
60735 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
60736 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
60737 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
60738 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
60739 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
60740 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
60741 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
60742 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
60743 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
60744 .{ ._, ._, .@"test", .tmp4q, .tmp4q, ._, ._ },
60745 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60746 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
60747 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
60748 .{ ._, ._, .mov, .src1d, .sa(.dst0, .add_size_div_8), ._, ._ },
60749 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
60750 } },
60751 }, .{
60752 .required_features = .{ .@"64bit", null, null, null },
60753 .src_constraints = .{
60754 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = 128 } },
60755 .{ .exact_signed_int = 32 },
60756 .any,
60757 },
60758 .patterns = &.{
60759 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
60760 },
60761 .extra_temps = .{
60762 .{ .type = .u32, .kind = .{ .reg = .rax } },
60763 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60764 .{ .type = .usize, .kind = .{ .reg = .rdi } },
60765 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60766 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60767 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
60768 .unused,
60769 .unused,
60770 .unused,
60771 .unused,
60772 .unused,
60773 },
60774 .dst_temps = .{ .mem, .unused },
60775 .clobbers = .{ .eflags = true },
60776 .each = .{ .once = &.{
60777 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60778 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60779 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
60780 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
60781 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
60782 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
60783 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
60784 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
60785 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
60786 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
60787 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
60788 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
60789 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
60790 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60791 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
60792 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
60793 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
60794 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
60795 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
60796 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
60797 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
60798 .{ ._, ._c, .de, .tmp5d, ._, ._, ._ },
60799 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
60800 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
60801 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
60802 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
60803 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60804 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
60805 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
60806 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
60807 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
60808 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
60809 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
60810 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
60811 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
60812 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
60813 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
60814 .{ ._, ._, .@"test", .tmp4q, .tmp4q, ._, ._ },
60815 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60816 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
60817 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
60818 .{ ._, ._, .mov, .src1d, .sa(.dst0, .add_size_div_8), ._, ._ },
60819 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
60820 } },
60821 }, .{
60822 .required_features = .{ .@"64bit", .slow_incdec, null, null },
60823 .src_constraints = .{
60824 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = 64 } },
60825 .{ .exact_signed_int = 32 },
60826 .any,
60827 },
60828 .patterns = &.{
60829 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
60830 },
60831 .extra_temps = .{
60832 .{ .type = .u32, .kind = .{ .reg = .rax } },
60833 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60834 .{ .type = .usize, .kind = .{ .reg = .rdi } },
60835 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60836 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60837 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60838 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60839 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60840 .unused,
60841 .unused,
60842 .unused,
60843 },
60844 .dst_temps = .{ .mem, .unused },
60845 .clobbers = .{ .eflags = true },
60846 .each = .{ .once = &.{
60847 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60848 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60849 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
60850 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
60851 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
60852 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
60853 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
60854 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
60855 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
60856 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
60857 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
60858 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
60859 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
60860 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
60861 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60862 .{ ._, ._, .mov, .tmp3q, .memad(.src0q, .add_size, -8), ._, ._ },
60863 .{ ._, ._, .mov, .tmp4q, .lea(.tmp2q), ._, ._ },
60864 .{ ._, ._, .mov, .tmp5q, .tmp3q, ._, ._ },
60865 .{ ._, ._ld, .sh, .tmp5q, .tmp4q, .src1b, ._ },
60866 .{ ._, ._, .xor, .tmp5q, .tmp3q, ._, ._ },
60867 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
60868 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
60869 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
60870 .{ .@"0:", ._, .mov, .tmp7q, .tmp3q, ._, ._ },
60871 .{ ._, ._, .xor, .tmp7q, .leasi(.tmp2q, .@"8", .tmp6), ._, ._ },
60872 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
60873 .{ ._, ._, .sub, .tmp6d, .si(1), ._, ._ },
60874 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
60875 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
60876 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
60877 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
60878 .{ .@"0:", ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60879 .{ ._, ._ld, .sh, .tmp4q, .tmp6q, .src1b, ._ },
60880 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp4q, ._, ._ },
60881 .{ ._, ._, .mov, .tmp4q, .tmp6q, ._, ._ },
60882 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
60883 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
60884 .{ .@"1:", ._l, .sh, .tmp4q, .src1b, ._, ._ },
60885 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
60886 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
60887 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
60888 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
60889 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
60890 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
60891 .{ ._, ._, .xor, .tmp3q, .tmp1q, ._, ._ },
60892 .{ ._, ._, .@"or", .tmp5q, .tmp3q, ._, ._ },
60893 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60894 .{ .@"2:", ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ },
60895 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
60896 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
60897 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
60898 .{ ._, ._, .not, .tmp0q, ._, ._, ._ },
60899 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
60900 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
60901 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
60902 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
60903 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
60904 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
60905 } },
60906 }, .{
60907 .required_features = .{ .@"64bit", null, null, null },
60908 .src_constraints = .{
60909 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = 64 } },
60910 .{ .exact_signed_int = 32 },
60911 .any,
60912 },
60913 .patterns = &.{
60914 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
60915 },
60916 .extra_temps = .{
60917 .{ .type = .u32, .kind = .{ .reg = .rax } },
60918 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
60919 .{ .type = .usize, .kind = .{ .reg = .rdi } },
60920 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60921 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60922 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60923 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60924 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
60925 .unused,
60926 .unused,
60927 .unused,
60928 },
60929 .dst_temps = .{ .mem, .unused },
60930 .clobbers = .{ .eflags = true },
60931 .each = .{ .once = &.{
60932 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
60933 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
60934 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
60935 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
60936 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
60937 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
60938 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
60939 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
60940 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
60941 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
60942 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
60943 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
60944 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
60945 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
60946 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60947 .{ ._, ._, .mov, .tmp3q, .memad(.src0q, .add_size, -8), ._, ._ },
60948 .{ ._, ._, .mov, .tmp4q, .lea(.tmp2q), ._, ._ },
60949 .{ ._, ._, .mov, .tmp5q, .tmp3q, ._, ._ },
60950 .{ ._, ._ld, .sh, .tmp5q, .tmp4q, .src1b, ._ },
60951 .{ ._, ._, .xor, .tmp5q, .tmp3q, ._, ._ },
60952 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
60953 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
60954 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
60955 .{ .@"0:", ._, .mov, .tmp7q, .tmp3q, ._, ._ },
60956 .{ ._, ._, .xor, .tmp7q, .leasi(.tmp2q, .@"8", .tmp6), ._, ._ },
60957 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
60958 .{ ._, ._c, .de, .tmp6d, ._, ._, ._ },
60959 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
60960 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
60961 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
60962 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
60963 .{ .@"0:", ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
60964 .{ ._, ._ld, .sh, .tmp4q, .tmp6q, .src1b, ._ },
60965 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp4q, ._, ._ },
60966 .{ ._, ._, .mov, .tmp4q, .tmp6q, ._, ._ },
60967 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
60968 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
60969 .{ .@"1:", ._l, .sh, .tmp4q, .src1b, ._, ._ },
60970 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
60971 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
60972 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
60973 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
60974 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
60975 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
60976 .{ ._, ._, .xor, .tmp3q, .tmp1q, ._, ._ },
60977 .{ ._, ._, .@"or", .tmp5q, .tmp3q, ._, ._ },
60978 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
60979 .{ .@"2:", ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ },
60980 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
60981 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
60982 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
60983 .{ ._, ._, .not, .tmp0q, ._, ._, ._ },
60984 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
60985 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
60986 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
60987 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
60988 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
60989 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
60990 } },
60991 }, .{
60992 .required_features = .{ .@"64bit", .slow_incdec, null, null },
60993 .src_constraints = .{
60994 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = 64 } },
60995 .{ .exact_signed_int = 32 },
60996 .any,
60997 },
60998 .patterns = &.{
60999 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
61000 },
61001 .extra_temps = .{
61002 .{ .type = .u32, .kind = .{ .reg = .rax } },
61003 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
61004 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61005 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
61006 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
61007 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
61008 .unused,
61009 .unused,
61010 .unused,
61011 .unused,
61012 .unused,
61013 },
61014 .dst_temps = .{ .mem, .unused },
61015 .clobbers = .{ .eflags = true },
61016 .each = .{ .once = &.{
61017 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61018 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61019 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
61020 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61021 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61022 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
61023 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61024 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61025 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61026 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61027 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
61028 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61029 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61030 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61031 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
61032 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61033 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
61034 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61035 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61036 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
61037 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
61038 .{ ._, ._, .sub, .tmp5d, .si(1), ._, ._ },
61039 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
61040 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
61041 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
61042 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61043 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61044 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
61045 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
61046 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
61047 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
61048 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61049 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
61050 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
61051 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
61052 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
61053 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61054 .{ ._, ._, .@"test", .tmp4q, .tmp4q, ._, ._ },
61055 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61056 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
61057 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61058 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
61059 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61060 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
61061 } },
61062 }, .{
61063 .required_features = .{ .@"64bit", null, null, null },
61064 .src_constraints = .{
61065 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = 64 } },
61066 .{ .exact_signed_int = 32 },
5800561067 .any,
5800661068 },
5800761069 .patterns = &.{
5800861070 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5800961071 },
5801061072 .extra_temps = .{
61073 .{ .type = .u32, .kind = .{ .reg = .rax } },
5801161074 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58012 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58013 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
61075 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61076 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5801461077 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5801561078 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58016 .unused,
5801761079 .unused,
5801861080 .unused,
5801961081 .unused,
......@@ -58023,44 +61085,70 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5802361085 .dst_temps = .{ .mem, .unused },
5802461086 .clobbers = .{ .eflags = true },
5802561087 .each = .{ .once = &.{
58026 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
58027 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58028 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58029 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58030 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58031 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58032 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58033 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58034 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58035 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58036 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58037 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
61088 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61089 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61090 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
61091 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61092 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61093 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5803861094 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58039 .{ ._, ._r, .sa, .tmp3q, .src1b, ._, ._ },
58040 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58041 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
58042 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
61095 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61096 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61097 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61098 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
61099 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61100 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61101 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61102 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
61103 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61104 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
61105 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61106 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61107 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
61108 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
61109 .{ ._, ._c, .de, .tmp5d, ._, ._, ._ },
5804361110 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
61111 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
61112 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
61113 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61114 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61115 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
61116 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
61117 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
61118 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
61119 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61120 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
61121 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
61122 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
61123 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
61124 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61125 .{ ._, ._, .@"test", .tmp4q, .tmp4q, ._, ._ },
61126 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61127 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
61128 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61129 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
61130 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61131 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
5804461132 } },
5804561133 }, .{
5804661134 .required_features = .{ .@"64bit", .slow_incdec, null, null },
5804761135 .src_constraints = .{
58048 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
58049 .{ .unsigned_int = .byte },
61136 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
61137 .{ .exact_signed_int = 32 },
5805061138 .any,
5805161139 },
5805261140 .patterns = &.{
5805361141 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5805461142 },
5805561143 .extra_temps = .{
61144 .{ .type = .u32, .kind = .{ .reg = .rax } },
5805661145 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58057 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58058 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58059 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58060 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58061 .unused,
58062 .unused,
58063 .unused,
61146 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61147 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61148 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61149 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61150 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61151 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5806461152 .unused,
5806561153 .unused,
5806661154 .unused,
......@@ -58068,44 +61156,90 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5806861156 .dst_temps = .{ .mem, .unused },
5806961157 .clobbers = .{ .eflags = true },
5807061158 .each = .{ .once = &.{
58071 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
58072 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58073 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58074 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58075 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58076 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58077 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58078 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58079 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58080 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58081 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58082 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58083 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58084 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },
58085 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58086 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58087 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
61159 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61160 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61161 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
61162 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61163 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61164 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5808861165 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61166 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61167 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61168 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61169 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61170 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
61171 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61172 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61173 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61174 .{ ._, ._, .mov, .tmp3q, .memad(.src0q, .add_size, -8), ._, ._ },
61175 .{ ._, ._, .mov, .tmp4q, .lea(.tmp2q), ._, ._ },
61176 .{ ._, ._, .mov, .tmp5q, .tmp3q, ._, ._ },
61177 .{ ._, ._ld, .sh, .tmp5q, .tmp4q, .src1b, ._ },
61178 .{ ._, ._, .xor, .tmp5q, .tmp3q, ._, ._ },
61179 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61180 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61181 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
61182 .{ .@"0:", ._, .mov, .tmp7q, .tmp3q, ._, ._ },
61183 .{ ._, ._, .xor, .tmp7q, .leasi(.tmp2q, .@"8", .tmp6), ._, ._ },
61184 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
61185 .{ ._, ._, .sub, .tmp6d, .si(1), ._, ._ },
61186 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
61187 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
61188 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
61189 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61190 .{ .@"0:", ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61191 .{ ._, ._ld, .sh, .tmp4q, .tmp6q, .src1b, ._ },
61192 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp4q, ._, ._ },
61193 .{ ._, ._, .mov, .tmp4q, .tmp6q, ._, ._ },
61194 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
61195 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61196 .{ .@"1:", ._l, .sh, .tmp4q, .src1b, ._, ._ },
61197 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
61198 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61199 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
61200 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61201 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
61202 .{ ._, ._, .mov, .tmp7q, .tmp1q, ._, ._ },
61203 .{ ._, ._l, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
61204 .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
61205 .{ ._, ._, .xor, .tmp7q, .tmp1q, ._, ._ },
61206 .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ },
61207 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
61208 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
61209 .{ ._, ._, .xor, .tmp0q, .tmp3q, ._, ._ },
61210 .{ ._, ._, .@"or", .tmp5q, .tmp0q, ._, ._ },
61211 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61212 .{ .@"2:", ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ },
61213 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
61214 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
61215 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
61216 .{ ._, ._, .not, .tmp0q, ._, ._, ._ },
61217 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61218 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
61219 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61220 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
61221 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
61222 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5808961223 } },
5809061224 }, .{
5809161225 .required_features = .{ .@"64bit", null, null, null },
5809261226 .src_constraints = .{
58093 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
58094 .{ .unsigned_int = .byte },
61227 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
61228 .{ .exact_signed_int = 32 },
5809561229 .any,
5809661230 },
5809761231 .patterns = &.{
5809861232 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5809961233 },
5810061234 .extra_temps = .{
61235 .{ .type = .u32, .kind = .{ .reg = .rax } },
5810161236 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58102 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58103 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
58104 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58105 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58106 .unused,
58107 .unused,
58108 .unused,
61237 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61238 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61239 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61240 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61241 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61242 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5810961243 .unused,
5811061244 .unused,
5811161245 .unused,
......@@ -58113,42 +61247,88 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5811361247 .dst_temps = .{ .mem, .unused },
5811461248 .clobbers = .{ .eflags = true },
5811561249 .each = .{ .once = &.{
58116 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
58117 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58118 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58119 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58120 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58121 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58122 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58123 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58124 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58125 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58126 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58127 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
61250 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61251 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61252 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
61253 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61254 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61255 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5812861256 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58129 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },
58130 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58131 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58132 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
61257 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61258 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61259 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61260 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61261 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
61262 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61263 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61264 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61265 .{ ._, ._, .mov, .tmp3q, .memad(.src0q, .add_size, -8), ._, ._ },
61266 .{ ._, ._, .mov, .tmp4q, .lea(.tmp2q), ._, ._ },
61267 .{ ._, ._, .mov, .tmp5q, .tmp3q, ._, ._ },
61268 .{ ._, ._ld, .sh, .tmp5q, .tmp4q, .src1b, ._ },
61269 .{ ._, ._, .xor, .tmp5q, .tmp3q, ._, ._ },
61270 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61271 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61272 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
61273 .{ .@"0:", ._, .mov, .tmp7q, .tmp3q, ._, ._ },
61274 .{ ._, ._, .xor, .tmp7q, .leasi(.tmp2q, .@"8", .tmp6), ._, ._ },
61275 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
61276 .{ ._, ._c, .de, .tmp6d, ._, ._, ._ },
5813361277 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
61278 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
61279 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
61280 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61281 .{ .@"0:", ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61282 .{ ._, ._ld, .sh, .tmp4q, .tmp6q, .src1b, ._ },
61283 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp4q, ._, ._ },
61284 .{ ._, ._, .mov, .tmp4q, .tmp6q, ._, ._ },
61285 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
61286 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61287 .{ .@"1:", ._l, .sh, .tmp4q, .src1b, ._, ._ },
61288 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
61289 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61290 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
61291 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61292 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
61293 .{ ._, ._, .mov, .tmp7q, .tmp1q, ._, ._ },
61294 .{ ._, ._l, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
61295 .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
61296 .{ ._, ._, .xor, .tmp7q, .tmp1q, ._, ._ },
61297 .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ },
61298 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
61299 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
61300 .{ ._, ._, .xor, .tmp0q, .tmp3q, ._, ._ },
61301 .{ ._, ._, .@"or", .tmp5q, .tmp0q, ._, ._ },
61302 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61303 .{ .@"2:", ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ },
61304 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
61305 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
61306 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
61307 .{ ._, ._, .not, .tmp0q, ._, ._, ._ },
61308 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61309 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
61310 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61311 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
61312 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
61313 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5813461314 } },
5813561315 }, .{
58136 .required_features = .{ .@"64bit", .slow_incdec, null, null },
61316 .required_features = .{ .@"64bit", .bmi, .slow_incdec, null },
5813761317 .src_constraints = .{
58138 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },
58139 .{ .unsigned_int = .word },
61318 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
61319 .{ .exact_signed_int = 32 },
5814061320 .any,
5814161321 },
5814261322 .patterns = &.{
58143 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
61323 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5814461324 },
5814561325 .extra_temps = .{
61326 .{ .type = .u32, .kind = .{ .reg = .rax } },
5814661327 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58147 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58148 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
61328 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61329 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5814961330 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5815061331 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58151 .unused,
5815261332 .unused,
5815361333 .unused,
5815461334 .unused,
......@@ -58158,42 +61338,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5815861338 .dst_temps = .{ .mem, .unused },
5815961339 .clobbers = .{ .eflags = true },
5816061340 .each = .{ .once = &.{
58161 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58162 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58163 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58164 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58165 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58166 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58167 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58168 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58169 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58170 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58171 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58172 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
58173 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58174 .{ ._, ._r, .sa, .tmp3q, .src1b, ._, ._ },
58175 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58176 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
58177 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
61341 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61342 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61343 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
61344 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61345 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61346 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5817861347 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61348 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61349 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61350 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61351 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61352 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
61353 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61354 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61355 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61356 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
61357 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61358 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
61359 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61360 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61361 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
61362 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
61363 .{ ._, ._, .sub, .tmp5d, .si(1), ._, ._ },
61364 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
61365 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
61366 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
61367 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61368 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61369 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
61370 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
61371 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
61372 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
61373 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61374 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
61375 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
61376 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
61377 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
61378 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61379 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
61380 .{ ._, ._, .mov, .tmp3q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
61381 .{ ._, ._, .andn, .tmp5q, .tmp1q, .tmp3q, ._ },
61382 .{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
61383 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
61384 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61385 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
61386 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
61387 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61388 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
61389 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61390 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
61391 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
5817961392 } },
5818061393 }, .{
58181 .required_features = .{ .@"64bit", null, null, null },
61394 .required_features = .{ .@"64bit", .bmi, null, null },
5818261395 .src_constraints = .{
58183 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },
58184 .{ .unsigned_int = .word },
61396 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
61397 .{ .exact_signed_int = 32 },
5818561398 .any,
5818661399 },
5818761400 .patterns = &.{
58188 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
61401 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5818961402 },
5819061403 .extra_temps = .{
61404 .{ .type = .u32, .kind = .{ .reg = .rax } },
5819161405 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58192 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58193 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
61406 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61407 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5819461408 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5819561409 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58196 .unused,
5819761410 .unused,
5819861411 .unused,
5819961412 .unused,
......@@ -58203,42 +61416,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5820361416 .dst_temps = .{ .mem, .unused },
5820461417 .clobbers = .{ .eflags = true },
5820561418 .each = .{ .once = &.{
58206 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58207 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58208 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58209 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58210 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58211 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58212 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58213 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58214 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58215 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58216 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58217 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
61419 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61420 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61421 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
61422 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61423 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61424 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5821861425 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58219 .{ ._, ._r, .sa, .tmp3q, .src1b, ._, ._ },
58220 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58221 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
58222 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
61426 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61427 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61428 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61429 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61430 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
61431 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61432 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61433 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61434 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
61435 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61436 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
61437 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61438 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61439 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
61440 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
61441 .{ ._, ._c, .de, .tmp5d, ._, ._, ._ },
5822361442 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
61443 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
61444 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
61445 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61446 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61447 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
61448 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
61449 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
61450 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
61451 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61452 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
61453 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
61454 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
61455 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
61456 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61457 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
61458 .{ ._, ._, .mov, .tmp3q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
61459 .{ ._, ._, .andn, .tmp5q, .tmp1q, .tmp3q, ._ },
61460 .{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
61461 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
61462 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61463 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
61464 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
61465 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61466 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
61467 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61468 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
61469 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
5822461470 } },
5822561471 }, .{
5822661472 .required_features = .{ .@"64bit", .slow_incdec, null, null },
5822761473 .src_constraints = .{
58228 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
58229 .{ .unsigned_int = .word },
61474 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
61475 .{ .exact_signed_int = 32 },
5823061476 .any,
5823161477 },
5823261478 .patterns = &.{
58233 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
61479 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5823461480 },
5823561481 .extra_temps = .{
61482 .{ .type = .u32, .kind = .{ .reg = .rax } },
5823661483 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58237 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58238 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
61484 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61485 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5823961486 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5824061487 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58241 .unused,
5824261488 .unused,
5824361489 .unused,
5824461490 .unused,
......@@ -58248,42 +61494,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5824861494 .dst_temps = .{ .mem, .unused },
5824961495 .clobbers = .{ .eflags = true },
5825061496 .each = .{ .once = &.{
58251 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58252 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58253 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58254 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58255 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58256 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58257 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58258 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58259 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58260 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58261 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58262 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
61497 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61498 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61499 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
61500 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61501 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61502 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5826361503 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58264 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },
58265 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
61504 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61505 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61506 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61507 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61508 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
61509 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61510 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61511 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61512 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
61513 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61514 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
61515 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61516 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61517 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
61518 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
61519 .{ ._, ._, .sub, .tmp5d, .si(1), ._, ._ },
61520 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
61521 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
61522 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
61523 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61524 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61525 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
61526 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
61527 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
61528 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
61529 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61530 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
61531 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
5826661532 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58267 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
58268 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61533 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
61534 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61535 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
61536 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
61537 .{ ._, ._, .@"and", .tmp1q, .tmp5q, ._, ._ },
61538 .{ ._, ._, .xor, .tmp5q, .tmp1q, ._, ._ },
61539 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
61540 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61541 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
61542 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
61543 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61544 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
61545 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61546 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
61547 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
5826961548 } },
5827061549 }, .{
5827161550 .required_features = .{ .@"64bit", null, null, null },
5827261551 .src_constraints = .{
58273 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
58274 .{ .unsigned_int = .word },
61552 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
61553 .{ .exact_signed_int = 32 },
5827561554 .any,
5827661555 },
5827761556 .patterns = &.{
58278 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
61557 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5827961558 },
5828061559 .extra_temps = .{
61560 .{ .type = .u32, .kind = .{ .reg = .rax } },
5828161561 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58282 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
58283 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
61562 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61563 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5828461564 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5828561565 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58286 .unused,
5828761566 .unused,
5828861567 .unused,
5828961568 .unused,
......@@ -58293,225 +61572,255 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5829361572 .dst_temps = .{ .mem, .unused },
5829461573 .clobbers = .{ .eflags = true },
5829561574 .each = .{ .once = &.{
58296 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
58297 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58298 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },
58299 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },
58300 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },
58301 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58302 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58303 .{ .@"0:", ._, .mov, .tmp4q, .memia(.src0q, .tmp1, .add_size), ._, ._ },
58304 .{ ._, ._rd, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58305 .{ ._, ._, .mov, .leai(.tmp2q, .tmp1), .tmp3q, ._, ._ },
58306 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58307 .{ .@"1:", ._, .add, .tmp1p, .si(8), ._, ._ },
61575 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61576 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61577 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
61578 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61579 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61580 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
5830861581 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58309 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },
58310 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },
58311 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58312 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
61582 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61583 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61584 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61585 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61586 .{ ._, ._, .mov, .tmp1d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
61587 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61588 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61589 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61590 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
61591 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61592 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
61593 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61594 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61595 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
61596 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
61597 .{ ._, ._c, .de, .tmp5d, ._, ._, ._ },
5831361598 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
58314 } },
58315 } }) catch |err| switch (err) {
58316 error.SelectFailed => return cg.fail("failed to select {s} {} {} {} {}", .{
58317 @tagName(air_tag),
58318 cg.typeOf(bin_op.lhs).fmt(pt),
58319 cg.typeOf(bin_op.rhs).fmt(pt),
58320 ops[0].tracking(cg),
58321 ops[1].tracking(cg),
58322 }),
58323 else => |e| return e,
58324 };
58325 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
58326 },
58327 .shl, .shl_exact => |air_tag| if (use_old) try cg.airShlShrBinOp(inst) else fallback: {
58328 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
58329 if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airShlShrBinOp(inst);
58330 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
58331 var res: [1]Temp = undefined;
58332 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
58333 .src_constraints = .{ .{ .signed_int = .byte }, .{ .unsigned_int = .byte }, .any },
58334 .patterns = &.{
58335 .{ .src = .{ .mut_mem, .imm8, .none } },
58336 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58337 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58338 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58339 },
58340 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58341 .clobbers = .{ .eflags = true },
58342 .each = .{ .once = &.{
58343 .{ ._, ._l, .sa, .dst0b, .src1b, ._, ._ },
58344 } },
58345 }, .{
58346 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
58347 .patterns = &.{
58348 .{ .src = .{ .mut_mem, .imm8, .none } },
58349 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58350 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58351 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58352 },
58353 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58354 .clobbers = .{ .eflags = true },
58355 .each = .{ .once = &.{
58356 .{ ._, ._l, .sh, .dst0b, .src1b, ._, ._ },
58357 } },
58358 }, .{
58359 .src_constraints = .{ .{ .signed_int = .word }, .{ .exact_unsigned_int = 4 }, .any },
58360 .patterns = &.{
58361 .{ .src = .{ .mut_mem, .imm8, .none } },
58362 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58363 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58364 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58365 },
58366 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58367 .clobbers = .{ .eflags = true },
58368 .each = .{ .once = &.{
58369 .{ ._, ._l, .sa, .dst0w, .src1b, ._, ._ },
58370 } },
58371 }, .{
58372 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .exact_unsigned_int = 4 }, .any },
58373 .patterns = &.{
58374 .{ .src = .{ .mut_mem, .imm8, .none } },
58375 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58376 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58377 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58378 },
58379 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58380 .clobbers = .{ .eflags = true },
58381 .each = .{ .once = &.{
58382 .{ ._, ._l, .sh, .dst0w, .src1b, ._, ._ },
58383 } },
58384 }, .{
58385 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58386 .patterns = &.{
58387 .{ .src = .{ .mut_mem, .imm8, .none } },
58388 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58389 },
58390 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58391 .clobbers = .{ .eflags = true },
58392 .each = .{ .once = &.{
58393 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
58394 } },
58395 }, .{
58396 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58397 .patterns = &.{
58398 .{ .src = .{ .mut_mem, .imm8, .none } },
58399 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58400 },
58401 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58402 .clobbers = .{ .eflags = true },
58403 .each = .{ .once = &.{
58404 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },
58405 } },
58406 }, .{
58407 .required_features = .{ .bmi2, null, null, null },
58408 .src_constraints = .{ .{ .int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58409 .patterns = &.{
58410 .{ .src = .{ .mem, .to_gpr, .none } },
58411 .{ .src = .{ .to_gpr, .to_gpr, .none } },
58412 },
58413 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
58414 .each = .{ .once = &.{
58415 .{ ._, ._lx, .sh, .dst0d, .src0d, .src1d, ._ },
61599 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
61600 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
61601 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61602 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61603 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
61604 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
61605 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
61606 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
61607 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61608 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
61609 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
61610 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
61611 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
61612 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61613 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
61614 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
61615 .{ ._, ._, .@"and", .tmp1q, .tmp5q, ._, ._ },
61616 .{ ._, ._, .xor, .tmp5q, .tmp1q, ._, ._ },
61617 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
61618 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61619 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
61620 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
61621 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61622 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
61623 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61624 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
61625 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
5841661626 } },
5841761627 }, .{
58418 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
58419 .patterns = &.{
58420 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58421 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
61628 .required_features = .{ .@"64bit", .slow_incdec, null, null },
61629 .src_constraints = .{
61630 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
61631 .{ .exact_signed_int = 32 },
61632 .any,
5842261633 },
58423 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58424 .clobbers = .{ .eflags = true },
58425 .each = .{ .once = &.{
58426 .{ ._, ._l, .sa, .dst0d, .src1b, ._, ._ },
58427 } },
58428 }, .{
58429 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },
5843061634 .patterns = &.{
58431 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58432 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
61635 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5843361636 },
58434 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58435 .clobbers = .{ .eflags = true },
58436 .each = .{ .once = &.{
58437 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },
58438 } },
58439 }, .{
58440 .required_features = .{ .@"64bit", null, null, null },
58441 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58442 .patterns = &.{
58443 .{ .src = .{ .mut_mem, .imm8, .none } },
58444 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
61637 .extra_temps = .{
61638 .{ .type = .u32, .kind = .{ .reg = .rax } },
61639 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
61640 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61641 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61642 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61643 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61644 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61645 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61646 .unused,
61647 .unused,
61648 .unused,
5844561649 },
58446 .dst_temps = .{ .{ .ref = .src0 }, .unused },
61650 .dst_temps = .{ .mem, .unused },
5844761651 .clobbers = .{ .eflags = true },
5844861652 .each = .{ .once = &.{
58449 .{ ._, ._l, .sa, .dst0q, .src1b, ._, ._ },
61653 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61654 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61655 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
61656 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61657 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61658 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
61659 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61660 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61661 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61662 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61663 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61664 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
61665 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61666 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61667 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61668 .{ ._, ._, .mov, .tmp3q, .memad(.src0q, .add_size, -8), ._, ._ },
61669 .{ ._, ._, .mov, .tmp4q, .lea(.tmp2q), ._, ._ },
61670 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
61671 .{ ._, ._, .mov, .tmp5q, .tmp3q, ._, ._ },
61672 .{ ._, ._ld, .sh, .tmp5q, .tmp4q, .src1b, ._ },
61673 .{ ._, ._, .xor, .tmp5q, .tmp3q, ._, ._ },
61674 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61675 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61676 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
61677 .{ .@"0:", ._, .mov, .tmp7q, .tmp3q, ._, ._ },
61678 .{ ._, ._, .xor, .tmp7q, .leasi(.tmp2q, .@"8", .tmp6), ._, ._ },
61679 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
61680 .{ ._, ._, .sub, .tmp6d, .si(1), ._, ._ },
61681 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
61682 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
61683 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
61684 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61685 .{ .@"0:", ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61686 .{ ._, ._ld, .sh, .tmp4q, .tmp6q, .src1b, ._ },
61687 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp4q, ._, ._ },
61688 .{ ._, ._, .mov, .tmp4q, .tmp6q, ._, ._ },
61689 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
61690 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61691 .{ .@"1:", ._l, .sh, .tmp4q, .src1b, ._, ._ },
61692 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
61693 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61694 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
61695 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61696 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
61697 .{ ._, ._, .mov, .tmp7q, .tmp1q, ._, ._ },
61698 .{ ._, ._l, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
61699 .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
61700 .{ ._, ._, .xor, .tmp7q, .tmp1q, ._, ._ },
61701 .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ },
61702 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
61703 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
61704 .{ ._, ._, .xor, .tmp0q, .tmp3q, ._, ._ },
61705 .{ ._, ._, .@"or", .tmp5q, .tmp0q, ._, ._ },
61706 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61707 .{ .@"2:", ._, .mov, .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ },
61708 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
61709 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
61710 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
61711 .{ ._, ._, .not, .tmp0q, ._, ._, ._ },
61712 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61713 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
61714 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61715 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5845061716 } },
5845161717 }, .{
5845261718 .required_features = .{ .@"64bit", null, null, null },
58453 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58454 .patterns = &.{
58455 .{ .src = .{ .mut_mem, .imm8, .none } },
58456 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
58457 },
58458 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58459 .clobbers = .{ .eflags = true },
58460 .each = .{ .once = &.{
58461 .{ ._, ._l, .sh, .dst0q, .src1b, ._, ._ },
58462 } },
58463 }, .{
58464 .required_features = .{ .@"64bit", .bmi2, null, null },
58465 .src_constraints = .{ .{ .int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58466 .patterns = &.{
58467 .{ .src = .{ .mem, .to_gpr, .none } },
58468 .{ .src = .{ .to_gpr, .to_gpr, .none } },
61719 .src_constraints = .{
61720 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
61721 .{ .exact_signed_int = 32 },
61722 .any,
5846961723 },
58470 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
58471 .each = .{ .once = &.{
58472 .{ ._, ._lx, .sh, .dst0q, .src0q, .src1q, ._ },
58473 } },
58474 }, .{
58475 .required_features = .{ .@"64bit", null, null, null },
58476 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
5847761724 .patterns = &.{
58478 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58479 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
61725 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5848061726 },
58481 .dst_temps = .{ .{ .ref = .src0 }, .unused },
58482 .clobbers = .{ .eflags = true },
58483 .each = .{ .once = &.{
58484 .{ ._, ._l, .sa, .dst0q, .src1b, ._, ._ },
58485 } },
58486 }, .{
58487 .required_features = .{ .@"64bit", null, null, null },
58488 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },
58489 .patterns = &.{
58490 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },
58491 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
61727 .extra_temps = .{
61728 .{ .type = .u32, .kind = .{ .reg = .rax } },
61729 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
61730 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61731 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61732 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61733 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61734 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61735 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
61736 .unused,
61737 .unused,
61738 .unused,
5849261739 },
58493 .dst_temps = .{ .{ .ref = .src0 }, .unused },
61740 .dst_temps = .{ .mem, .unused },
5849461741 .clobbers = .{ .eflags = true },
5849561742 .each = .{ .once = &.{
58496 .{ ._, ._l, .sh, .dst0q, .src1b, ._, ._ },
61743 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61744 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61745 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
61746 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61747 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61748 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
61749 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61750 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61751 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61752 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61753 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
61754 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
61755 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
61756 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61757 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61758 .{ ._, ._, .mov, .tmp3q, .memad(.src0q, .add_size, -8), ._, ._ },
61759 .{ ._, ._, .mov, .tmp4q, .lea(.tmp2q), ._, ._ },
61760 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
61761 .{ ._, ._, .mov, .tmp5q, .tmp3q, ._, ._ },
61762 .{ ._, ._ld, .sh, .tmp5q, .tmp4q, .src1b, ._ },
61763 .{ ._, ._, .xor, .tmp5q, .tmp3q, ._, ._ },
61764 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61765 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61766 .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ },
61767 .{ .@"0:", ._, .mov, .tmp7q, .tmp3q, ._, ._ },
61768 .{ ._, ._, .xor, .tmp7q, .leasi(.tmp2q, .@"8", .tmp6), ._, ._ },
61769 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
61770 .{ ._, ._c, .de, .tmp6d, ._, ._, ._ },
61771 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
61772 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
61773 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
61774 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
61775 .{ .@"0:", ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61776 .{ ._, ._ld, .sh, .tmp4q, .tmp6q, .src1b, ._ },
61777 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp4q, ._, ._ },
61778 .{ ._, ._, .mov, .tmp4q, .tmp6q, ._, ._ },
61779 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
61780 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61781 .{ .@"1:", ._l, .sh, .tmp4q, .src1b, ._, ._ },
61782 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
61783 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61784 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
61785 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61786 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
61787 .{ ._, ._, .mov, .tmp7q, .tmp1q, ._, ._ },
61788 .{ ._, ._l, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
61789 .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
61790 .{ ._, ._, .xor, .tmp7q, .tmp1q, ._, ._ },
61791 .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ },
61792 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
61793 .{ ._, ._, .@"or", .tmp5q, .tmp7q, ._, ._ },
61794 .{ ._, ._, .xor, .tmp0q, .tmp3q, ._, ._ },
61795 .{ ._, ._, .@"or", .tmp5q, .tmp0q, ._, ._ },
61796 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61797 .{ .@"2:", ._, .mov, .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ },
61798 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
61799 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
61800 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
61801 .{ ._, ._, .not, .tmp0q, ._, ._, ._ },
61802 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61803 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
61804 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61805 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5849761806 } },
5849861807 }, .{
58499 .required_features = .{ .@"64bit", .slow_incdec, null, null },
61808 .required_features = .{ .@"64bit", .bmi, .slow_incdec, null },
5850061809 .src_constraints = .{
58501 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
58502 .{ .unsigned_int = .byte },
61810 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
61811 .{ .exact_signed_int = 32 },
5850361812 .any,
5850461813 },
5850561814 .patterns = &.{
5850661815 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5850761816 },
5850861817 .extra_temps = .{
61818 .{ .type = .u32, .kind = .{ .reg = .rax } },
5850961819 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58510 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58511 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
61820 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61821 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5851261822 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5851361823 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58514 .unused,
5851561824 .unused,
5851661825 .unused,
5851761826 .unused,
......@@ -58521,42 +61830,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5852161830 .dst_temps = .{ .mem, .unused },
5852261831 .clobbers = .{ .eflags = true },
5852361832 .each = .{ .once = &.{
58524 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
61833 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61834 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61835 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
61836 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61837 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61838 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
61839 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61840 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61841 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61842 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61843 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
5852561844 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
5852661845 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
5852761846 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61847 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61848 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
61849 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61850 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
61851 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61852 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61853 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
61854 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
61855 .{ ._, ._, .sub, .tmp5d, .si(1), ._, ._ },
61856 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
61857 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
61858 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
5852861859 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58529 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58530 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58531 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58532 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
61860 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61861 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
5853361862 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58534 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58535 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
61863 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
61864 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
5853661865 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
58537 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },
61866 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
5853861867 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
5853961868 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
5854061869 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
5854161870 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
61871 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
61872 .{ ._, ._, .mov, .tmp3q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
61873 .{ ._, ._, .andn, .tmp5q, .tmp1q, .tmp3q, ._ },
61874 .{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
61875 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
61876 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61877 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
61878 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
61879 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61880 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
61881 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61882 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5854261883 } },
5854361884 }, .{
58544 .required_features = .{ .@"64bit", null, null, null },
61885 .required_features = .{ .@"64bit", .bmi, null, null },
5854561886 .src_constraints = .{
58546 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
58547 .{ .unsigned_int = .byte },
61887 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
61888 .{ .exact_signed_int = 32 },
5854861889 .any,
5854961890 },
5855061891 .patterns = &.{
5855161892 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5855261893 },
5855361894 .extra_temps = .{
61895 .{ .type = .u32, .kind = .{ .reg = .rax } },
5855461896 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58555 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58556 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
61897 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61898 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5855761899 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5855861900 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58559 .unused,
5856061901 .unused,
5856161902 .unused,
5856261903 .unused,
......@@ -58566,42 +61907,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5856661907 .dst_temps = .{ .mem, .unused },
5856761908 .clobbers = .{ .eflags = true },
5856861909 .each = .{ .once = &.{
58569 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },
61910 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61911 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61912 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
61913 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61914 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61915 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
61916 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61917 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61918 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61919 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61920 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
5857061921 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
5857161922 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
5857261923 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
61924 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61925 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
61926 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
61927 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
61928 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
61929 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
61930 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
61931 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
61932 .{ ._, ._c, .de, .tmp5d, ._, ._, ._ },
61933 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
61934 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
61935 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
5857361936 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58574 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58575 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58576 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58577 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
61937 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
61938 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
5857861939 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58579 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58580 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
61940 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
61941 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
5858161942 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58582 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },
61943 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
5858361944 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
5858461945 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
5858561946 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
5858661947 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
61948 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
61949 .{ ._, ._, .mov, .tmp3q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
61950 .{ ._, ._, .andn, .tmp5q, .tmp1q, .tmp3q, ._ },
61951 .{ ._, ._, .@"and", .tmp1q, .tmp3q, ._, ._ },
61952 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
61953 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
61954 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
61955 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
61956 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
61957 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
61958 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
61959 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5858761960 } },
5858861961 }, .{
5858961962 .required_features = .{ .@"64bit", .slow_incdec, null, null },
5859061963 .src_constraints = .{
58591 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
58592 .{ .unsigned_int = .word },
61964 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
61965 .{ .exact_signed_int = 32 },
5859361966 .any,
5859461967 },
5859561968 .patterns = &.{
58596 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
61969 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5859761970 },
5859861971 .extra_temps = .{
61972 .{ .type = .u32, .kind = .{ .reg = .rax } },
5859961973 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58600 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58601 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
61974 .{ .type = .usize, .kind = .{ .reg = .rdi } },
61975 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5860261976 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5860361977 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58604 .unused,
5860561978 .unused,
5860661979 .unused,
5860761980 .unused,
......@@ -58611,42 +61984,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5861161984 .dst_temps = .{ .mem, .unused },
5861261985 .clobbers = .{ .eflags = true },
5861361986 .each = .{ .once = &.{
58614 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
61987 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
61988 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
61989 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
61990 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
61991 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
61992 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
61993 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
61994 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
61995 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
61996 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
61997 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
5861561998 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
5861661999 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
5861762000 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
62001 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
62002 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
62003 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
62004 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
62005 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
62006 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
62007 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
62008 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
62009 .{ ._, ._, .sub, .tmp5d, .si(1), ._, ._ },
62010 .{ ._, ._a, .j, .@"0b", ._, ._, ._ },
62011 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
62012 .{ ._, ._nae, .j, .@"1f", ._, ._, ._ },
5861862013 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58619 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58620 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58621 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58622 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
62014 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
62015 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
5862362016 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58624 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58625 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },
62017 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
62018 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
5862662019 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
58627 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },
62020 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
5862862021 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
5862962022 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
5863062023 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
5863162024 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
62025 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
62026 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
62027 .{ ._, ._, .@"and", .tmp1q, .tmp5q, ._, ._ },
62028 .{ ._, ._, .xor, .tmp5q, .tmp1q, ._, ._ },
62029 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
62030 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
62031 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
62032 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
62033 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
62034 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
62035 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
62036 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5863262037 } },
5863362038 }, .{
5863462039 .required_features = .{ .@"64bit", null, null, null },
5863562040 .src_constraints = .{
58636 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
58637 .{ .unsigned_int = .word },
62041 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
62042 .{ .exact_signed_int = 32 },
5863862043 .any,
5863962044 },
5864062045 .patterns = &.{
58641 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },
62046 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
5864262047 },
5864362048 .extra_temps = .{
62049 .{ .type = .u32, .kind = .{ .reg = .rax } },
5864462050 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58645 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58646 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
62051 .{ .type = .usize, .kind = .{ .reg = .rdi } },
62052 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5864762053 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5864862054 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58649 .unused,
5865062055 .unused,
5865162056 .unused,
5865262057 .unused,
......@@ -58656,48 +62061,66 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5865662061 .dst_temps = .{ .mem, .unused },
5865762062 .clobbers = .{ .eflags = true },
5865862063 .each = .{ .once = &.{
58659 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },
62064 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
62065 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
62066 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
62067 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
62068 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
62069 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
62070 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
62071 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
62072 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
62073 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
62074 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
5866062075 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
5866162076 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
5866262077 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },
62078 .{ ._, ._, .lea, .tmp2p, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
62079 .{ ._, ._, .mov, .tmp3q, .lea(.tmp2q), ._, ._ },
62080 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
62081 .{ ._, ._ld, .sh, .tmp4q, .tmp3q, .src1b, ._ },
62082 .{ ._, ._, .@"test", .tmp0d, .tmp0d, ._, ._ },
62083 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
62084 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
62085 .{ .@"0:", ._, .@"or", .tmp4q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
62086 .{ ._, ._c, .de, .tmp5d, ._, ._, ._ },
62087 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
62088 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
62089 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
5866362090 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58664 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58665 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },
58666 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58667 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
62091 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
62092 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
5866862093 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58669 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },
58670 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
62094 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
62095 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
5867162096 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58672 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },
62097 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
5867362098 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
5867462099 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
5867562100 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
5867662101 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
62102 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
62103 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
62104 .{ ._, ._, .@"and", .tmp1q, .tmp5q, ._, ._ },
62105 .{ ._, ._, .xor, .tmp5q, .tmp1q, ._, ._ },
62106 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
62107 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
62108 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
62109 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
62110 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
62111 .{ ._, ._, .mov, .src1d, .sia(-1, .dst0, .add_size_div_8), ._, ._ },
62112 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
62113 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5867762114 } },
5867862115 } }) catch |err| switch (err) {
58679 error.SelectFailed => return cg.fail("failed to select {s} {} {} {} {}", .{
62116 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
5868062117 @tagName(air_tag),
58681 cg.typeOf(bin_op.lhs).fmt(pt),
58682 cg.typeOf(bin_op.rhs).fmt(pt),
62118 lhs_ty.fmt(pt),
5868362119 ops[0].tracking(cg),
5868462120 ops[1].tracking(cg),
5868562121 }),
5868662122 else => |e| return e,
5868762123 };
58688 switch (air_tag) {
58689 else => unreachable,
58690 .shl => res[0].wrapInt(cg) catch |err| switch (err) {
58691 error.SelectFailed => return cg.fail("failed to select wrap {} {} {} {}", .{
58692 cg.typeOf(bin_op.lhs).fmt(pt),
58693 cg.typeOf(bin_op.rhs).fmt(pt),
58694 ops[0].tracking(cg),
58695 ops[1].tracking(cg),
58696 }),
58697 else => |e| return e,
58698 },
58699 .shl_exact => {},
58700 }
5870162124 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
5870262125 },
5870362126 .not => |air_tag| if (use_old) try cg.airUnOp(inst, air_tag) else {
......@@ -139465,7 +142888,7 @@ const Select = struct {
139465142888 temps: [@intFromEnum(Select.Operand.Ref.none)]Temp,
139466142889 labels: [@intFromEnum(Label._)]struct {
139467142890 backward: ?Mir.Inst.Index,
139468 forward: [1]?Mir.Inst.Index,
142891 forward: [3]?Mir.Inst.Index,
139469142892 },
139470142893 top: u3,
139471142894
......@@ -140108,7 +143531,7 @@ const Select = struct {
140108143531 none,
140109143532 undef,
140110143533 cc: Condition,
140111 imm: u32,
143534 imm: i32,
140112143535 ref: Select.Operand.Ref,
140113143536 reg: Register,
140114143537 reg_pair: [2]Register,
......@@ -140198,7 +143621,7 @@ const Select = struct {
140198143621 .any => .{ try cg.tempAlloc(spec.type), true },
140199143622 .none => .{ try cg.tempInit(spec.type, .none), true },
140200143623 .undef => .{ try cg.tempInit(spec.type, .undef), true },
140201 .imm => |imm| .{ try cg.tempInit(spec.type, .{ .immediate = imm }), true },
143624 .imm => |imm| .{ try cg.tempInit(spec.type, .{ .immediate = @bitCast(@as(i64, imm)) }), true },
140202143625 .cc => |cc| .{ try cg.tempInit(spec.type, .{ .eflags = cc }), true },
140203143626 .ref => |ref| .{ ref.tempOf(s), false },
140204143627 .reg => |reg| .{ try cg.tempInit(spec.type, .{ .register = reg }), true },
......@@ -140565,6 +143988,8 @@ const Select = struct {
140565143988 smin,
140566143989 smax,
140567143990 umax,
143991 smin_shr_src1,
143992 smax_shr_src1,
140568143993 umax_shr_src1,
140569143994 repeat,
140570143995 },
......@@ -140630,8 +144055,9 @@ const Select = struct {
140630144055 const sub_smin: Adjust = .{ .sign = .neg, .lhs = .smin, .op = .mul, .rhs = .@"1" };
140631144056 const add_smax: Adjust = .{ .sign = .pos, .lhs = .smax, .op = .mul, .rhs = .@"1" };
140632144057 const add_umax: Adjust = .{ .sign = .pos, .lhs = .umax, .op = .mul, .rhs = .@"1" };
140633 const add_umax_shr_src1: Adjust = .{ .sign = .pos, .lhs = .umax_shr_src1, .op = .mul, .rhs = .@"1" };
140634144058 const sub_umax: Adjust = .{ .sign = .neg, .lhs = .umax, .op = .mul, .rhs = .@"1" };
144059 const add_smax_shr_src1: Adjust = .{ .sign = .pos, .lhs = .smax_shr_src1, .op = .mul, .rhs = .@"1" };
144060 const add_umax_shr_src1: Adjust = .{ .sign = .pos, .lhs = .umax_shr_src1, .op = .mul, .rhs = .@"1" };
140635144061 const repeat: Adjust = .{ .sign = .pos, .lhs = .repeat, .op = .mul, .rhs = .@"1" };
140636144062 };
140637144063 const Ref = enum(u5) {
......@@ -141410,6 +144836,12 @@ const Select = struct {
141410144836 .umax => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(
141411144837 -%op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
141412144838 )),
144839 .smax_shr_src1 => @as(SignedImm, std.math.maxInt(SignedImm)) >> @truncate(
144840 Select.Operand.Ref.src1.valueOf(s).immediate -% op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
144841 ),
144842 .smin_shr_src1 => @as(SignedImm, std.math.minInt(SignedImm)) >> @truncate(
144843 Select.Operand.Ref.src1.valueOf(s).immediate -% op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
144844 ),
141413144845 .umax_shr_src1 => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(
141414144846 Select.Operand.Ref.src1.valueOf(s).immediate -% op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
141415144847 )),
src/codegen/llvm.zig+50-15
......@@ -9023,19 +9023,25 @@ pub const FuncGen = struct {
90239023 const rhs = try self.resolveInst(bin_op.rhs);
90249024
90259025 const lhs_ty = self.typeOf(bin_op.lhs);
9026 const lhs_scalar_ty = lhs_ty.scalarType(zcu);
9027 const lhs_bits = lhs_scalar_ty.bitSize(zcu);
9028
9029 const casted_rhs = try self.wip.conv(.unsigned, rhs, try o.lowerType(lhs_ty), "");
9030
9026 const lhs_info = lhs_ty.intInfo(zcu);
90319027 const llvm_lhs_ty = try o.lowerType(lhs_ty);
90329028 const llvm_lhs_scalar_ty = llvm_lhs_ty.scalarType(&o.builder);
9029
9030 const rhs_ty = self.typeOf(bin_op.rhs);
9031 const rhs_info = rhs_ty.intInfo(zcu);
9032 assert(rhs_info.signedness == .unsigned);
9033 const llvm_rhs_ty = try o.lowerType(rhs_ty);
9034 const llvm_rhs_scalar_ty = llvm_rhs_ty.scalarType(&o.builder);
9035
90339036 const result = try self.wip.callIntrinsic(
90349037 .normal,
90359038 .none,
9036 if (lhs_scalar_ty.isSignedInt(zcu)) .@"sshl.sat" else .@"ushl.sat",
9039 switch (lhs_info.signedness) {
9040 .signed => .@"sshl.sat",
9041 .unsigned => .@"ushl.sat",
9042 },
90379043 &.{llvm_lhs_ty},
9038 &.{ lhs, casted_rhs },
9044 &.{ lhs, try self.wip.conv(.unsigned, rhs, llvm_lhs_ty, "") },
90399045 "",
90409046 );
90419047
......@@ -9044,16 +9050,45 @@ pub const FuncGen = struct {
90449050 // poison value."
90459051 // However Zig semantics says that saturating shift left can never produce
90469052 // undefined; instead it saturates.
9053 if (rhs_info.bits <= math.log2_int(u16, lhs_info.bits)) return result;
90479054 const bits = try o.builder.splatValue(
9048 llvm_lhs_ty,
9049 try o.builder.intConst(llvm_lhs_scalar_ty, lhs_bits),
9050 );
9051 const lhs_max = try o.builder.splatValue(
9052 llvm_lhs_ty,
9053 try o.builder.intConst(llvm_lhs_scalar_ty, -1),
9055 llvm_rhs_ty,
9056 try o.builder.intConst(llvm_rhs_scalar_ty, lhs_info.bits),
90549057 );
9055 const in_range = try self.wip.icmp(.ult, casted_rhs, bits, "");
9056 return self.wip.select(.normal, in_range, result, lhs_max, "");
9058 const in_range = try self.wip.icmp(.ult, rhs, bits, "");
9059 const lhs_sat = lhs_sat: switch (lhs_info.signedness) {
9060 .signed => {
9061 const zero = try o.builder.splatValue(
9062 llvm_lhs_ty,
9063 try o.builder.intConst(llvm_lhs_scalar_ty, 0),
9064 );
9065 const smin = try o.builder.splatValue(
9066 llvm_lhs_ty,
9067 try minIntConst(&o.builder, lhs_ty, llvm_lhs_ty, zcu),
9068 );
9069 const smax = try o.builder.splatValue(
9070 llvm_lhs_ty,
9071 try maxIntConst(&o.builder, lhs_ty, llvm_lhs_ty, zcu),
9072 );
9073 const lhs_lt_zero = try self.wip.icmp(.slt, lhs, zero, "");
9074 const slimit = try self.wip.select(.normal, lhs_lt_zero, smin, smax, "");
9075 const lhs_eq_zero = try self.wip.icmp(.eq, lhs, zero, "");
9076 break :lhs_sat try self.wip.select(.normal, lhs_eq_zero, zero, slimit, "");
9077 },
9078 .unsigned => {
9079 const zero = try o.builder.splatValue(
9080 llvm_lhs_ty,
9081 try o.builder.intConst(llvm_lhs_scalar_ty, 0),
9082 );
9083 const umax = try o.builder.splatValue(
9084 llvm_lhs_ty,
9085 try o.builder.intConst(llvm_lhs_scalar_ty, -1),
9086 );
9087 const lhs_eq_zero = try self.wip.icmp(.eq, lhs, zero, "");
9088 break :lhs_sat try self.wip.select(.normal, lhs_eq_zero, zero, umax, "");
9089 },
9090 };
9091 return self.wip.select(.normal, in_range, result, lhs_sat, "");
90579092 }
90589093
90599094 fn airShr(self: *FuncGen, inst: Air.Inst.Index, is_exact: bool) !Builder.Value {
test/behavior/bit_shifting.zig+4-5
......@@ -128,12 +128,12 @@ test "Saturating Shift Left where lhs is of a computed type" {
128128 });
129129 }
130130
131 pub fn FixedPoint(comptime value_type: type) type {
131 pub fn FixedPoint(comptime ValueType: type) type {
132132 return struct {
133 value: value_type,
133 value: ValueType,
134134 exponent: ShiftType,
135135
136 const ShiftType: type = getIntShiftType(value_type);
136 const ShiftType: type = getIntShiftType(ValueType);
137137
138138 pub fn shiftExponent(self: @This(), shift: ShiftType) @This() {
139139 const shiftAbs = @abs(shift);
......@@ -199,8 +199,7 @@ test "Saturating Shift Left" {
199199 try expectEqual(0xffffffffffffffffffffffffffffffff, S.shlSat(@as(u128, 0x0fffffffffffffff0fffffffffffffff), 5));
200200 try expectEqual(-0x80000000000000000000000000000000, S.shlSat(@as(i128, -0x0fffffffffffffff0fffffffffffffff), 5));
201201
202 // TODO
203 // try expectEqual(51146728248377216718956089012931236753385031969422887335676427626502090568823039920051095192592252455482604439493126109519019633529459266458258243583, S.shlSat(@as(i495, 0x2fe6bc5448c55ce18252e2c9d44777505dfe63ff249a8027a6626c7d8dd9893fd5731e51474727be556f757facb586a4e04bbc0148c6c7ad692302f46fbd), 0x31));
202 try expectEqual(51146728248377216718956089012931236753385031969422887335676427626502090568823039920051095192592252455482604439493126109519019633529459266458258243583, S.shlSat(@as(i495, 0x2fe6bc5448c55ce18252e2c9d44777505dfe63ff249a8027a6626c7d8dd9893fd5731e51474727be556f757facb586a4e04bbc0148c6c7ad692302f46fbd), 0x31));
204203 try expectEqual(-57896044618658097711785492504343953926634992332820282019728792003956564819968, S.shlSat(@as(i256, -0x53d4148cee74ea43477a65b3daa7b8fdadcbf4508e793f4af113b8d8da5a7eb6), 0x91));
205204 try expectEqual(170141183460469231731687303715884105727, S.shlSat(@as(i128, 0x2fe6bc5448c55ce18252e2c9d4477750), 0x31));
206205 try expectEqual(0, S.shlSat(@as(i128, 0), 127));
test/behavior/saturating_arithmetic.zig+41-17
......@@ -230,9 +230,10 @@ test "saturating multiplication <= 32 bits" {
230230 try testSatMul(i32, 10, -12, -120);
231231}
232232
233// TODO: remove this test, integrate into general test
234test "saturating mul i64, i128, wasm only" {
235 if (builtin.zig_backend != .stage2_wasm) return error.SkipZigTest;
233test "saturating mul i64, i128" {
234 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
235 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
236 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
236237
237238 try testSatMul(i64, 0, maxInt(i64), 0);
238239 try testSatMul(i64, 0, minInt(i64), 0);
......@@ -298,29 +299,34 @@ test "saturating multiplication" {
298299}
299300
300301test "saturating shift-left" {
301 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
302302 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
303303 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
304304 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
305305 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
306306 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
307 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
307308
308309 const S = struct {
309310 fn doTheTest() !void {
310 try testSatShl(i8, 1, 2, 4);
311 try testSatShl(i8, 127, 1, 127);
312 try testSatShl(i8, -128, 1, -128);
311 try testSatShl(i8, 1, u8, 2, 4);
312 try testSatShl(i8, 127, u8, 1, 127);
313 try testSatShl(i8, -128, u8, 1, -128);
313314 // TODO: remove this check once #9668 is completed
314315 if (!builtin.cpu.arch.isWasm()) {
315316 // skip testing ints > 64 bits on wasm due to miscompilation / wasmtime ci error
316 try testSatShl(i128, maxInt(i128), 64, maxInt(i128));
317 try testSatShl(u128, maxInt(u128), 64, maxInt(u128));
317 try testSatShl(i128, maxInt(i128), u128, 64, maxInt(i128));
318 try testSatShl(u128, maxInt(u128), u128, 64, maxInt(u128));
318319 }
319 try testSatShl(u8, 1, 2, 4);
320 try testSatShl(u8, 255, 1, 255);
320 try testSatShl(u8, 1, u8, 2, 4);
321 try testSatShl(u8, 255, u8, 1, 255);
322 try testSatShl(i8, -3, u4, 8, minInt(i8));
323 try testSatShl(i8, 0, u4, 8, 0);
324 try testSatShl(i8, 3, u4, 8, maxInt(i8));
325 try testSatShl(u8, 0, u4, 8, 0);
326 try testSatShl(u8, 3, u4, 8, maxInt(u8));
321327 }
322328
323 fn testSatShl(comptime T: type, lhs: T, rhs: T, expected: T) !void {
329 fn testSatShl(comptime Lhs: type, lhs: Lhs, comptime Rhs: type, rhs: Rhs, expected: Lhs) !void {
324330 try expect((lhs <<| rhs) == expected);
325331
326332 var x = lhs;
......@@ -332,19 +338,37 @@ test "saturating shift-left" {
332338 try S.doTheTest();
333339 try comptime S.doTheTest();
334340
335 try comptime S.testSatShl(comptime_int, 0, 0, 0);
336 try comptime S.testSatShl(comptime_int, 1, 2, 4);
337 try comptime S.testSatShl(comptime_int, 13, 150, 18554220005177478453757717602843436772975706112);
338 try comptime S.testSatShl(comptime_int, -582769, 180, -893090893854873184096635538665358532628308979495815656505344);
341 try comptime S.testSatShl(comptime_int, 0, comptime_int, 0, 0);
342 try comptime S.testSatShl(comptime_int, 1, comptime_int, 2, 4);
343 try comptime S.testSatShl(comptime_int, 13, comptime_int, 150, 18554220005177478453757717602843436772975706112);
344 try comptime S.testSatShl(comptime_int, -582769, comptime_int, 180, -893090893854873184096635538665358532628308979495815656505344);
345}
346
347test "saturating shift-left large rhs" {
348 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
349 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
350 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
351 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
352 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
353
354 {
355 var lhs: u8 = undefined;
356 lhs = 1;
357 const ct_rhs: u1024 = 1 << 1023;
358 var rt_rhs: u1024 = undefined;
359 rt_rhs = ct_rhs;
360 try expect(lhs <<| ct_rhs == maxInt(u8));
361 try expect(lhs <<| rt_rhs == maxInt(u8));
362 }
339363}
340364
341365test "saturating shl uses the LHS type" {
342 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
343366 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
344367 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
345368 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
346369 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
347370 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
371 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
348372
349373 const lhs_const: u8 = 1;
350374 var lhs_var: u8 = 1;
test/behavior/x86_64/binary.zig+17
......@@ -6,6 +6,7 @@ const DoubleBits = math.DoubleBits;
66const fmax = math.fmax;
77const fmin = math.fmin;
88const Gpr = math.Gpr;
9const imax = math.imax;
910const inf = math.inf;
1011const Log2Int = math.Log2Int;
1112const math = @import("math.zig");
......@@ -5388,6 +5389,22 @@ test shlExactUnsafe {
53885389 try test_shl_exact_unsafe.testInts();
53895390}
53905391
5392inline fn shlSat(comptime Type: type, lhs: Type, rhs: Type) Type {
5393 // workaround https://github.com/ziglang/zig/issues/23034
5394 if (@inComptime()) {
5395 // workaround https://github.com/ziglang/zig/issues/23139
5396 //return lhs <<| @min(@abs(rhs), imax(u64));
5397 return lhs <<| @min(@abs(rhs), @as(u64, imax(u64)));
5398 }
5399 // workaround https://github.com/ziglang/zig/issues/23033
5400 @setRuntimeSafety(false);
5401 return lhs <<| @abs(rhs);
5402}
5403test shlSat {
5404 const test_shl_sat = binary(shlSat, .{});
5405 try test_shl_sat.testInts();
5406}
5407
53915408inline fn bitXor(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs ^ rhs) {
53925409 return lhs ^ rhs;
53935410}
test/cases/compile_errors/saturating_shl_assign_does_not_allow_negative_rhs_at_comptime.zig deleted-12
......@@ -1,12 +0,0 @@
1export fn a() void {
2 comptime {
3 var x = @as(i32, 1);
4 x <<|= @as(i32, -2);
5 }
6}
7
8// error
9// backend=stage2
10// target=native
11//
12// :4:16: error: shift by negative amount '-2'
test/cases/compile_errors/saturating_shl_does_not_allow_negative_rhs.zig created+36
......@@ -0,0 +1,36 @@
1export fn a() void {
2 _ = @as(i32, 1) <<| @as(i32, -1);
3}
4
5comptime {
6 var x: i32 = 1;
7 x <<|= @as(i32, -2);
8}
9
10export fn b() void {
11 _ = @Vector(1, i32){1} <<| @Vector(1, i32){-3};
12}
13
14comptime {
15 var x: @Vector(2, i32) = .{ 1, 2 };
16 x <<|= @Vector(2, i32){ 0, -4 };
17}
18
19export fn c(rhs: i32) void {
20 _ = @as(i32, 1) <<| rhs;
21}
22
23export fn d(rhs: @Vector(3, i32)) void {
24 _ = @Vector(3, i32){ 1, 2, 3 } <<| rhs;
25}
26
27// error
28// backend=stage2
29// target=native
30//
31// :2:25: error: shift by negative amount '-1'
32// :7:12: error: shift by negative amount '-2'
33// :11:47: error: shift by negative amount '-3' at index '0'
34// :16:27: error: shift by negative amount '-4' at index '1'
35// :20:25: error: shift by signed type 'i32'
36// :24:40: error: shift by signed type '@Vector(3, i32)'
test/cases/compile_errors/saturating_shl_does_not_allow_negative_rhs_at_comptime.zig deleted-9
......@@ -1,9 +0,0 @@
1export fn a() void {
2 _ = @as(i32, 1) <<| @as(i32, -2);
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:25: error: shift by negative amount '-2'