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 {...@@ -774,18 +774,15 @@ pub fn Log2IntCeil(comptime T: type) type {
774/// Returns the smallest integer type that can hold both from and to.774/// Returns the smallest integer type that can hold both from and to.
775pub fn IntFittingRange(comptime from: comptime_int, comptime to: comptime_int) type {775pub fn IntFittingRange(comptime from: comptime_int, comptime to: comptime_int) type {
776 assert(from <= to);776 assert(from <= to);
777 if (from == 0 and to == 0) {
778 return u0;
779 }
780 const signedness: std.builtin.Signedness = if (from < 0) .signed else .unsigned;777 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 complement778 return @Type(.{ .int = .{
782 const base = log2(largest_positive_integer);779 .signedness = signedness,
783 const upper = (1 << base) - 1;780 .bits = @as(u16, @intFromBool(signedness == .signed)) +
784 var magnitude_bits = if (upper >= largest_positive_integer) base else base + 1;781 switch (if (from < 0) @max(@abs(from) - 1, to) else to) {
785 if (signedness == .signed) {782 0 => 0,
786 magnitude_bits += 1;783 else => |pos_max| 1 + log2(pos_max),
787 }784 },
788 return std.meta.Int(signedness, magnitude_bits);785 } });
789}786}
790787
791test IntFittingRange {788test IntFittingRange {
...@@ -1267,6 +1264,19 @@ pub fn log2_int(comptime T: type, x: T) Log2Int(T) {...@@ -1267,6 +1264,19 @@ pub fn log2_int(comptime T: type, x: T) Log2Int(T) {
1267 return @as(Log2Int(T), @intCast(@typeInfo(T).int.bits - 1 - @clz(x)));1264 return @as(Log2Int(T), @intCast(@typeInfo(T).int.bits - 1 - @clz(x)));
1268}1265}
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
1270/// Return the log base 2 of integer value x, rounding up to the1280/// Return the log base 2 of integer value x, rounding up to the
1271/// nearest integer.1281/// nearest integer.
1272pub fn log2_int_ceil(comptime T: type, x: T) Log2IntCeil(T) {1282pub 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 {...@@ -415,12 +415,12 @@ pub const Mutable = struct {
415 // in the case that scalar happens to be small in magnitude within its type, but it415 // in the case that scalar happens to be small in magnitude within its type, but it
416 // is well worth being able to use the stack and not needing an allocator passed in.416 // is well worth being able to use the stack and not needing an allocator passed in.
417 // Note that Mutable.init still sets len to calcLimbLen(scalar) in any case.417 // 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))) {
419 .comptime_int => calcLimbLen(scalar),419 .comptime_int => calcLimbLen(scalar),
420 .int => |info| calcTwosCompLimbCount(info.bits),420 .int => |info| calcTwosCompLimbCount(info.bits),
421 else => @compileError("expected scalar to be an int"),421 else => @compileError("expected scalar to be an int"),
422 };422 };
423 var limbs: [limb_len]Limb = undefined;423 var limbs: [limbs_len]Limb = undefined;
424 const operand = init(&limbs, scalar).toConst();424 const operand = init(&limbs, scalar).toConst();
425 return add(r, a, operand);425 return add(r, a, operand);
426 }426 }
...@@ -2454,12 +2454,12 @@ pub const Const = struct {...@@ -2454,12 +2454,12 @@ pub const Const = struct {
2454 // in the case that scalar happens to be small in magnitude within its type, but it2454 // in the case that scalar happens to be small in magnitude within its type, but it
2455 // is well worth being able to use the stack and not needing an allocator passed in.2455 // is well worth being able to use the stack and not needing an allocator passed in.
2456 // Note that Mutable.init still sets len to calcLimbLen(scalar) in any case.2456 // 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))) {
2458 .comptime_int => calcLimbLen(scalar),2458 .comptime_int => calcLimbLen(scalar),
2459 .int => |info| calcTwosCompLimbCount(info.bits),2459 .int => |info| calcTwosCompLimbCount(info.bits),
2460 else => @compileError("expected scalar to be an int"),2460 else => @compileError("expected scalar to be an int"),
2461 };2461 };
2462 var limbs: [limb_len]Limb = undefined;2462 var limbs: [limbs_len]Limb = undefined;
2463 const rhs = Mutable.init(&limbs, scalar);2463 const rhs = Mutable.init(&limbs, scalar);
2464 return order(lhs, rhs.toConst());2464 return order(lhs, rhs.toConst());
2465 }2465 }
lib/std/math/big/int_test.zig-4
...@@ -2295,8 +2295,6 @@ test "sat shift-left signed simple positive" {...@@ -2295,8 +2295,6 @@ test "sat shift-left signed simple positive" {
2295}2295}
22962296
2297test "sat shift-left signed multi positive" {2297test "sat shift-left signed multi positive" {
2298 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
2299
2300 var x: SignedDoubleLimb = 1;2298 var x: SignedDoubleLimb = 1;
2301 _ = &x;2299 _ = &x;
23022300
...@@ -2310,8 +2308,6 @@ test "sat shift-left signed multi positive" {...@@ -2310,8 +2308,6 @@ test "sat shift-left signed multi positive" {
2310}2308}
23112309
2312test "sat shift-left signed multi negative" {2310test "sat shift-left signed multi negative" {
2313 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
2314
2315 var x: SignedDoubleLimb = -1;2311 var x: SignedDoubleLimb = -1;
2316 _ = &x;2312 _ = &x;
23172313
lib/std/math/log2.zig+11-10
...@@ -12,12 +12,10 @@ const expect = std.testing.expect;...@@ -12,12 +12,10 @@ const expect = std.testing.expect;
12/// - log2(nan) = nan12/// - log2(nan) = nan
13pub fn log2(x: anytype) @TypeOf(x) {13pub fn log2(x: anytype) @TypeOf(x) {
14 const T = @TypeOf(x);14 const T = @TypeOf(x);
15 switch (@typeInfo(T)) {15 return switch (@typeInfo(T)) {
16 .comptime_float => {16 .comptime_float, .float => @log2(x),
17 return @as(comptime_float, @log2(x));
18 },
19 .float => return @log2(x),
20 .comptime_int => comptime {17 .comptime_int => comptime {
18 std.debug.assert(x > 0);
21 var x_shifted = x;19 var x_shifted = x;
22 // First, calculate floorPowerOfTwo(x)20 // First, calculate floorPowerOfTwo(x)
23 var shift_amt = 1;21 var shift_amt = 1;
...@@ -34,12 +32,15 @@ pub fn log2(x: anytype) @TypeOf(x) {...@@ -34,12 +32,15 @@ pub fn log2(x: anytype) @TypeOf(x) {
34 }32 }
35 return result;33 return result;
36 },34 },
37 .int => |IntType| switch (IntType.signedness) {35 .int => |int_info| math.log2_int(switch (int_info.signedness) {
38 .signed => @compileError("log2 not implemented for signed integers"),36 .signed => @Type(.{ .int = .{
39 .unsigned => return math.log2_int(T, x),37 .signedness = .unsigned,
40 },38 .bits = int_info.bits -| 1,
39 } }),
40 .unsigned => T,
41 }, @intCast(x)),
41 else => @compileError("log2 not implemented for " ++ @typeName(T)),42 else => @compileError("log2 not implemented for " ++ @typeName(T)),
42 }43 };
43}44}
4445
45test log2 {46test 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...@@ -1115,14 +1115,15 @@ static inline bool zig_mulo_i16(int16_t *res, int16_t lhs, int16_t rhs, uint8_t
1115\1115\
1116 static inline uint##w##_t zig_shls_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \1116 static inline uint##w##_t zig_shls_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \
1117 uint##w##_t res; \1117 uint##w##_t res; \
1118 if (rhs >= bits) return lhs != UINT##w##_C(0) ? zig_maxInt_u(w, bits) : lhs; \1118 if (rhs < bits && !zig_shlo_u##w(&res, lhs, rhs, bits)) return res; \
1119 return zig_shlo_u##w(&res, lhs, (uint8_t)rhs, bits) ? zig_maxInt_u(w, bits) : res; \1119 return lhs == INT##w##_C(0) ? INT##w##_C(0) : zig_maxInt_u(w, bits); \
1120 } \1120 } \
1121\1121\
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) { \
1123 int##w##_t res; \1123 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; \1124 if (rhs < bits && !zig_shlo_i##w(&res, lhs, rhs, bits)) return res; \
1125 return lhs < INT##w##_C(0) ? zig_minInt_i(w, bits) : zig_maxInt_i(w, bits); \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); \
1126 } \1127 } \
1127\1128\
1128 static inline uint##w##_t zig_adds_u##w(uint##w##_t lhs, uint##w##_t rhs, uint8_t bits) { \1129 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...@@ -1851,15 +1852,23 @@ static inline bool zig_shlo_i128(zig_i128 *res, zig_i128 lhs, uint8_t rhs, uint8
18511852
1852static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {1853static inline zig_u128 zig_shls_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {
1853 zig_u128 res;1854 zig_u128 res;
1854 if (zig_cmp_u128(rhs, zig_make_u128(0, bits)) >= INT32_C(0))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;
1855 return zig_cmp_u128(lhs, zig_make_u128(0, 0)) != INT32_C(0) ? zig_maxInt_u(128, bits) : lhs;1856 switch (zig_cmp_u128(lhs, zig_make_u128(0, 0))) {
1856 return zig_shlo_u128(&res, lhs, (uint8_t)zig_lo_u128(rhs), bits) ? zig_maxInt_u(128, bits) : res;1857 case 0: return zig_make_u128(0, 0);
1858 case 1: return zig_maxInt_u(128, bits);
1859 default: zig_unreachable();
1860 }
1857}1861}
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) {
1860 zig_i128 res;1864 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;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;
1862 return zig_cmp_i128(lhs, zig_make_i128(0, 0)) < INT32_C(0) ? zig_minInt_i(128, bits) : zig_maxInt_i(128, bits);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 }
1863}1872}
18641873
1865static inline zig_u128 zig_adds_u128(zig_u128 lhs, zig_u128 rhs, uint8_t bits) {1874static 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 {...@@ -257,7 +257,9 @@ pub const Inst = struct {
257 /// it shifts out any bits that disagree with the resultant sign bit.257 /// it shifts out any bits that disagree with the resultant sign bit.
258 /// Uses the `bin_op` field.258 /// Uses the `bin_op` field.
259 shl_exact,259 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.
261 /// Uses the `bin_op` field.263 /// Uses the `bin_op` field.
262 shl_sat,264 shl_sat,
263 /// Bitwise XOR. `^`265 /// Bitwise XOR. `^`
src/Sema.zig+43-28
...@@ -14215,14 +14215,15 @@ fn zirShl(...@@ -14215,14 +14215,15 @@ fn zirShl(
14215 const rhs_ty = sema.typeOf(rhs);14215 const rhs_ty = sema.typeOf(rhs);
1421614216
14217 const src = block.nodeOffset(inst_data.src_node);14217 const src = block.nodeOffset(inst_data.src_node);
14218 const lhs_src = switch (air_tag) {14218 const lhs_src, const rhs_src = switch (air_tag) {
14219 .shl, .shl_sat => block.src(.{ .node_offset_bin_lhs = inst_data.src_node }),14219 .shl, .shl_sat => .{
14220 .shl_exact => block.builtinCallArgSrc(inst_data.src_node, 0),14220 block.src(.{ .node_offset_bin_lhs = inst_data.src_node }),
14221 else => unreachable,14221 block.src(.{ .node_offset_bin_rhs = inst_data.src_node }),
14222 };14222 },
14223 const rhs_src = switch (air_tag) {14223 .shl_exact => .{
14224 .shl, .shl_sat => block.src(.{ .node_offset_bin_rhs = inst_data.src_node }),14224 block.builtinCallArgSrc(inst_data.src_node, 0),
14225 .shl_exact => block.builtinCallArgSrc(inst_data.src_node, 1),14225 block.builtinCallArgSrc(inst_data.src_node, 1),
14226 },
14226 else => unreachable,14227 else => unreachable,
14227 };14228 };
1422814229
...@@ -14231,8 +14232,7 @@ fn zirShl(...@@ -14231,8 +14232,7 @@ fn zirShl(
14231 const scalar_ty = lhs_ty.scalarType(zcu);14232 const scalar_ty = lhs_ty.scalarType(zcu);
14232 const scalar_rhs_ty = rhs_ty.scalarType(zcu);14233 const scalar_rhs_ty = rhs_ty.scalarType(zcu);
1423314234
14234 // TODO coerce rhs if air_tag is not shl_sat14235 _ = try sema.checkIntType(block, rhs_src, scalar_rhs_ty);
14235 const rhs_is_comptime_int = try sema.checkIntType(block, rhs_src, scalar_rhs_ty);
1423614236
14237 const maybe_lhs_val = try sema.resolveValueResolveLazy(lhs);14237 const maybe_lhs_val = try sema.resolveValueResolveLazy(lhs);
14238 const maybe_rhs_val = try sema.resolveValueResolveLazy(rhs);14238 const maybe_rhs_val = try sema.resolveValueResolveLazy(rhs);
...@@ -14245,7 +14245,7 @@ fn zirShl(...@@ -14245,7 +14245,7 @@ fn zirShl(
14245 if (try rhs_val.compareAllWithZeroSema(.eq, pt)) {14245 if (try rhs_val.compareAllWithZeroSema(.eq, pt)) {
14246 return lhs;14246 return lhs;
14247 }14247 }
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) {
14249 const bit_value = try pt.intValue(Type.comptime_int, scalar_ty.intInfo(zcu).bits);14249 const bit_value = try pt.intValue(Type.comptime_int, scalar_ty.intInfo(zcu).bits);
14250 if (rhs_ty.zigTypeTag(zcu) == .vector) {14250 if (rhs_ty.zigTypeTag(zcu) == .vector) {
14251 var i: usize = 0;14251 var i: usize = 0;
...@@ -14282,6 +14282,8 @@ fn zirShl(...@@ -14282,6 +14282,8 @@ fn zirShl(
14282 rhs_val.fmtValueSema(pt, sema),14282 rhs_val.fmtValueSema(pt, sema),
14283 });14283 });
14284 }14284 }
14285 } else if (scalar_rhs_ty.isSignedInt(zcu)) {
14286 return sema.fail(block, rhs_src, "shift by signed type '{}'", .{rhs_ty.fmt(pt)});
14285 }14287 }
1428614288
14287 const runtime_src = if (maybe_lhs_val) |lhs_val| rs: {14289 const runtime_src = if (maybe_lhs_val) |lhs_val| rs: {
...@@ -14309,18 +14311,34 @@ fn zirShl(...@@ -14309,18 +14311,34 @@ fn zirShl(
14309 return Air.internedToRef(val.toIntern());14311 return Air.internedToRef(val.toIntern());
14310 } else lhs_src;14312 } else lhs_src;
1431114313
14312 const new_rhs = if (air_tag == .shl_sat) rhs: {14314 const rt_rhs = switch (air_tag) {
14313 // Limit the RHS type for saturating shl to be an integer as small as the LHS.14315 else => unreachable,
14314 if (rhs_is_comptime_int or14316 .shl, .shl_exact => rhs,
14315 scalar_rhs_ty.intInfo(zcu).bits > scalar_ty.intInfo(zcu).bits)14317 // The backend can handle a large runtime rhs better than we can, but
14316 {14318 // we can limit a large comptime rhs better here. This also has the
14317 const max_int = Air.internedToRef((try lhs_ty.maxInt(pt, lhs_ty)).toIntern());14319 // necessary side effect of preventing rhs from being a `comptime_int`.
14318 const rhs_limited = try sema.analyzeMinMax(block, rhs_src, .min, &.{ rhs, max_int }, &.{ rhs_src, rhs_src });14320 .shl_sat => if (maybe_rhs_val) |rhs_val| Air.internedToRef(rt_rhs: {
14319 break :rhs try sema.intCast(block, src, lhs_ty, rhs_src, rhs_limited, rhs_src, false, false);14321 const bit_count = scalar_ty.intInfo(zcu).bits;
14320 } else {14322 const rt_rhs_scalar_ty = try pt.smallestUnsignedInt(bit_count);
14321 break :rhs rhs;14323 if (!rhs_ty.isVector(zcu)) break :rt_rhs (try pt.intValue(
14322 }14324 rt_rhs_scalar_ty,
14323 } else rhs;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
14325 try sema.requireRuntimeBlock(block, src, runtime_src);14343 try sema.requireRuntimeBlock(block, src, runtime_src);
14326 if (block.wantSafety()) {14344 if (block.wantSafety()) {
...@@ -14374,7 +14392,7 @@ fn zirShl(...@@ -14374,7 +14392,7 @@ fn zirShl(
14374 return sema.tupleFieldValByIndex(block, op_ov, 0, op_ov_tuple_ty);14392 return sema.tupleFieldValByIndex(block, op_ov, 0, op_ov_tuple_ty);
14375 }14393 }
14376 }14394 }
14377 return block.addBinOp(air_tag, lhs, new_rhs);14395 return block.addBinOp(air_tag, lhs, rt_rhs);
14378}14396}
1437914397
14380fn zirShr(14398fn zirShr(
...@@ -36432,10 +36450,7 @@ fn generateUnionTagTypeSimple(...@@ -36432,10 +36450,7 @@ fn generateUnionTagTypeSimple(
36432 const enum_ty = try ip.getGeneratedTagEnumType(gpa, pt.tid, .{36450 const enum_ty = try ip.getGeneratedTagEnumType(gpa, pt.tid, .{
36433 .name = name,36451 .name = name,
36434 .owner_union_ty = union_type,36452 .owner_union_ty = union_type,
36435 .tag_ty = if (enum_field_names.len == 0)36453 .tag_ty = (try pt.smallestUnsignedInt(enum_field_names.len -| 1)).toIntern(),
36436 (try pt.intType(.unsigned, 0)).toIntern()
36437 else
36438 (try pt.smallestUnsignedInt(enum_field_names.len - 1)).toIntern(),
36439 .names = enum_field_names,36454 .names = enum_field_names,
36440 .values = &.{},36455 .values = &.{},
36441 .tag_mode = .auto,36456 .tag_mode = .auto,
src/Type.zig+4-4
...@@ -4132,10 +4132,10 @@ pub const empty_tuple: Type = .{ .ip_index = .empty_tuple_type };...@@ -4132,10 +4132,10 @@ pub const empty_tuple: Type = .{ .ip_index = .empty_tuple_type };
4132pub const generic_poison: Type = .{ .ip_index = .generic_poison_type };4132pub const generic_poison: Type = .{ .ip_index = .generic_poison_type };
41334133
4134pub fn smallestUnsignedBits(max: u64) u16 {4134pub fn smallestUnsignedBits(max: u64) u16 {
4135 if (max == 0) return 0;4135 return switch (max) {
4136 const base = std.math.log2(max);4136 0 => 0,
4137 const upper = (@as(u64, 1) << @as(u6, @intCast(base))) - 1;4137 else => 1 + std.math.log2_int(u64, max),
4138 return @as(u16, @intCast(base + @intFromBool(upper < max)));4138 };
4139}4139}
41404140
4141/// This is only used for comptime asserts. Bump this number when you make a change4141/// 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 {...@@ -2408,7 +2408,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2408}2408}
24092409
2410fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {2410fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2411 @setEvalBranchQuota(19_300);2411 @setEvalBranchQuota(20_000);
2412 const pt = cg.pt;2412 const pt = cg.pt;
2413 const zcu = pt.zcu;2413 const zcu = pt.zcu;
2414 const ip = &zcu.intern_pool;2414 const ip = &zcu.intern_pool;
...@@ -2444,8 +2444,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2444,8 +2444,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2444 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);2444 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);
2445 switch (air_tags[@intFromEnum(inst)]) {2445 switch (air_tags[@intFromEnum(inst)]) {
2446 // zig fmt: off2446 // zig fmt: off
2447 .shl_sat => try cg.airShlSat(inst),
2448
2449 .bitcast => try cg.airBitCast(inst),2447 .bitcast => try cg.airBitCast(inst),
24502448
2451 .splat => try cg.airSplat(inst),2449 .splat => try cg.airSplat(inst),
...@@ -4408,7 +4406,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4408,7 +4406,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4408 .dst_temps = .{ .{ .ref = .src0 }, .unused },4406 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4409 .clobbers = .{ .eflags = true },4407 .clobbers = .{ .eflags = true },
4410 .each = .{ .once = &.{4408 .each = .{ .once = &.{
4411 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4409 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4412 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },4410 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
4413 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },4411 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
4414 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },4412 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
...@@ -4457,7 +4455,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4457,7 +4455,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4457 .dst_temps = .{ .{ .ref = .src0 }, .unused },4455 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4458 .clobbers = .{ .eflags = true },4456 .clobbers = .{ .eflags = true },
4459 .each = .{ .once = &.{4457 .each = .{ .once = &.{
4460 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4458 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4461 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },4459 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
4462 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },4460 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
4463 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },4461 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
...@@ -4585,7 +4583,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4585,7 +4583,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4585 .dst_temps = .{ .{ .ref = .src0 }, .unused },4583 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4586 .clobbers = .{ .eflags = true },4584 .clobbers = .{ .eflags = true },
4587 .each = .{ .once = &.{4585 .each = .{ .once = &.{
4588 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4586 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4589 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4587 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4590 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },4588 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
4591 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },4589 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
...@@ -4617,7 +4615,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4617,7 +4615,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4617 .dst_temps = .{ .{ .ref = .src0 }, .unused },4615 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4618 .clobbers = .{ .eflags = true },4616 .clobbers = .{ .eflags = true },
4619 .each = .{ .once = &.{4617 .each = .{ .once = &.{
4620 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4618 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4621 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4619 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4622 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },4620 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
4623 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },4621 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
...@@ -4683,7 +4681,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4683,7 +4681,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4683 .dst_temps = .{ .{ .ref = .src0 }, .unused },4681 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4684 .clobbers = .{ .eflags = true },4682 .clobbers = .{ .eflags = true },
4685 .each = .{ .once = &.{4683 .each = .{ .once = &.{
4686 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4684 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4687 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4685 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4688 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },4686 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4689 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },4687 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -4713,7 +4711,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4713,7 +4711,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4713 .dst_temps = .{ .{ .ref = .src0 }, .unused },4711 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4714 .clobbers = .{ .eflags = true },4712 .clobbers = .{ .eflags = true },
4715 .each = .{ .once = &.{4713 .each = .{ .once = &.{
4716 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4714 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4717 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4715 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4718 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },4716 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4719 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },4717 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -4744,7 +4742,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4744,7 +4742,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4744 .dst_temps = .{ .{ .ref = .src0 }, .unused },4742 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4745 .clobbers = .{ .eflags = true },4743 .clobbers = .{ .eflags = true },
4746 .each = .{ .once = &.{4744 .each = .{ .once = &.{
4747 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4745 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4748 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4746 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4749 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },4747 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4750 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },4748 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -4776,7 +4774,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4776,7 +4774,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4776 .dst_temps = .{ .{ .ref = .src0 }, .unused },4774 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4777 .clobbers = .{ .eflags = true },4775 .clobbers = .{ .eflags = true },
4778 .each = .{ .once = &.{4776 .each = .{ .once = &.{
4779 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4777 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4780 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4778 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4781 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },4779 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4782 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },4780 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -4929,7 +4927,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4929,7 +4927,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4929 .dst_temps = .{ .{ .ref = .src0 }, .unused },4927 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4930 .clobbers = .{ .eflags = true },4928 .clobbers = .{ .eflags = true },
4931 .each = .{ .once = &.{4929 .each = .{ .once = &.{
4932 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4930 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4933 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4931 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4934 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },4932 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4935 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },4933 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -4959,7 +4957,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4959,7 +4957,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4959 .dst_temps = .{ .{ .ref = .src0 }, .unused },4957 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4960 .clobbers = .{ .eflags = true },4958 .clobbers = .{ .eflags = true },
4961 .each = .{ .once = &.{4959 .each = .{ .once = &.{
4962 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4960 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4963 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4961 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4964 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },4962 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4965 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },4963 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -4990,7 +4988,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4990,7 +4988,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4990 .dst_temps = .{ .{ .ref = .src0 }, .unused },4988 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4991 .clobbers = .{ .eflags = true },4989 .clobbers = .{ .eflags = true },
4992 .each = .{ .once = &.{4990 .each = .{ .once = &.{
4993 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },4991 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
4994 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },4992 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4995 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },4993 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4996 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },4994 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -5022,7 +5020,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5022,7 +5020,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5022 .dst_temps = .{ .{ .ref = .src0 }, .unused },5020 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5023 .clobbers = .{ .eflags = true },5021 .clobbers = .{ .eflags = true },
5024 .each = .{ .once = &.{5022 .each = .{ .once = &.{
5025 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5023 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5026 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },5024 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
5027 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },5025 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5028 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },5026 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -5055,7 +5053,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5055,7 +5053,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5055 .dst_temps = .{ .{ .ref = .src0 }, .unused },5053 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5056 .clobbers = .{ .eflags = true },5054 .clobbers = .{ .eflags = true },
5057 .each = .{ .once = &.{5055 .each = .{ .once = &.{
5058 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5056 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5059 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },5057 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
5060 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },5058 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
5061 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },5059 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -5086,7 +5084,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5086,7 +5084,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5086 .dst_temps = .{ .{ .ref = .src0 }, .unused },5084 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5087 .clobbers = .{ .eflags = true },5085 .clobbers = .{ .eflags = true },
5088 .each = .{ .once = &.{5086 .each = .{ .once = &.{
5089 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5087 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5090 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },5088 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
5091 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },5089 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5092 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },5090 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -5118,7 +5116,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5118,7 +5116,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5118 .dst_temps = .{ .{ .ref = .src0 }, .unused },5116 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5119 .clobbers = .{ .eflags = true },5117 .clobbers = .{ .eflags = true },
5120 .each = .{ .once = &.{5118 .each = .{ .once = &.{
5121 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5119 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5122 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },5120 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
5123 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },5121 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
5124 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },5122 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -5151,7 +5149,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5151,7 +5149,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5151 .dst_temps = .{ .{ .ref = .src0 }, .unused },5149 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5152 .clobbers = .{ .eflags = true },5150 .clobbers = .{ .eflags = true },
5153 .each = .{ .once = &.{5151 .each = .{ .once = &.{
5154 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5152 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5155 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },5153 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
5156 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },5154 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5157 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },5155 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -5456,7 +5454,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5456,7 +5454,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5456 .dst_temps = .{ .{ .ref = .src0 }, .unused },5454 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5457 .clobbers = .{ .eflags = true },5455 .clobbers = .{ .eflags = true },
5458 .each = .{ .once = &.{5456 .each = .{ .once = &.{
5459 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5457 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5460 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },5458 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
5461 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },5459 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
5462 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },5460 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
...@@ -5505,7 +5503,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5505,7 +5503,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5505 .dst_temps = .{ .{ .ref = .src0 }, .unused },5503 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5506 .clobbers = .{ .eflags = true },5504 .clobbers = .{ .eflags = true },
5507 .each = .{ .once = &.{5505 .each = .{ .once = &.{
5508 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5506 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5509 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },5507 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
5510 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },5508 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5511 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },5509 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -5571,7 +5569,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5571,7 +5569,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5571 .dst_temps = .{ .{ .ref = .src0 }, .unused },5569 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5572 .clobbers = .{ .eflags = true },5570 .clobbers = .{ .eflags = true },
5573 .each = .{ .once = &.{5571 .each = .{ .once = &.{
5574 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5572 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5575 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },5573 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
5576 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },5574 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5577 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },5575 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -5605,7 +5603,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5605,7 +5603,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5605 .dst_temps = .{ .{ .ref = .src0 }, .unused },5603 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5606 .clobbers = .{ .eflags = true },5604 .clobbers = .{ .eflags = true },
5607 .each = .{ .once = &.{5605 .each = .{ .once = &.{
5608 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },5606 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
5609 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },5607 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
5610 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },5608 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5611 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },5609 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -5750,7 +5748,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5750,7 +5748,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5750 .dst_temps = .{ .{ .ref = .src0 }, .unused },5748 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5751 .clobbers = .{ .eflags = true },5749 .clobbers = .{ .eflags = true },
5752 .each = .{ .once = &.{5750 .each = .{ .once = &.{
5753 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },5751 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
5754 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },5752 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
5755 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },5753 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
5756 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },5754 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
...@@ -5815,7 +5813,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5815,7 +5813,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5815 .dst_temps = .{ .{ .ref = .src0 }, .unused },5813 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5816 .clobbers = .{ .eflags = true },5814 .clobbers = .{ .eflags = true },
5817 .each = .{ .once = &.{5815 .each = .{ .once = &.{
5818 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },5816 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
5819 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },5817 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
5820 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },5818 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5821 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },5819 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
...@@ -5884,7 +5882,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5884,7 +5882,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5884 .dst_temps = .{ .{ .ref = .src0 }, .unused },5882 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5885 .clobbers = .{ .eflags = true },5883 .clobbers = .{ .eflags = true },
5886 .each = .{ .once = &.{5884 .each = .{ .once = &.{
5887 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },5885 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
5888 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },5886 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
5889 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },5887 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5890 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },5888 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
...@@ -5919,7 +5917,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5919,7 +5917,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5919 .dst_temps = .{ .{ .ref = .src0 }, .unused },5917 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5920 .clobbers = .{ .eflags = true },5918 .clobbers = .{ .eflags = true },
5921 .each = .{ .once = &.{5919 .each = .{ .once = &.{
5922 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },5920 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
5923 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },5921 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
5924 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },5922 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5925 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },5923 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
...@@ -14879,7 +14877,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -14879,7 +14877,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
14879 .dst_temps = .{ .{ .ref = .src0 }, .unused },14877 .dst_temps = .{ .{ .ref = .src0 }, .unused },
14880 .clobbers = .{ .eflags = true },14878 .clobbers = .{ .eflags = true },
14881 .each = .{ .once = &.{14879 .each = .{ .once = &.{
14882 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },14880 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
14883 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },14881 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
14884 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },14882 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
14885 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },14883 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
...@@ -14924,7 +14922,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -14924,7 +14922,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
14924 .dst_temps = .{ .{ .ref = .src0 }, .unused },14922 .dst_temps = .{ .{ .ref = .src0 }, .unused },
14925 .clobbers = .{ .eflags = true },14923 .clobbers = .{ .eflags = true },
14926 .each = .{ .once = &.{14924 .each = .{ .once = &.{
14927 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },14925 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
14928 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },14926 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
14929 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },14927 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
14930 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },14928 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
...@@ -15027,7 +15025,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15027,7 +15025,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15027 .dst_temps = .{ .{ .ref = .src0 }, .unused },15025 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15028 .clobbers = .{ .eflags = true },15026 .clobbers = .{ .eflags = true },
15029 .each = .{ .once = &.{15027 .each = .{ .once = &.{
15030 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15028 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15031 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15029 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15032 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },15030 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
15033 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },15031 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
...@@ -15057,7 +15055,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15057,7 +15055,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15057 .dst_temps = .{ .{ .ref = .src0 }, .unused },15055 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15058 .clobbers = .{ .eflags = true },15056 .clobbers = .{ .eflags = true },
15059 .each = .{ .once = &.{15057 .each = .{ .once = &.{
15060 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15058 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15061 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15059 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15062 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15060 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15063 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },15061 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
...@@ -15117,7 +15115,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15117,7 +15115,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15117 .dst_temps = .{ .{ .ref = .src0 }, .unused },15115 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15118 .clobbers = .{ .eflags = true },15116 .clobbers = .{ .eflags = true },
15119 .each = .{ .once = &.{15117 .each = .{ .once = &.{
15120 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15118 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15121 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15119 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15122 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },15120 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15123 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },15121 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -15147,7 +15145,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15147,7 +15145,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15147 .dst_temps = .{ .{ .ref = .src0 }, .unused },15145 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15148 .clobbers = .{ .eflags = true },15146 .clobbers = .{ .eflags = true },
15149 .each = .{ .once = &.{15147 .each = .{ .once = &.{
15150 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15148 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15151 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15149 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15152 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15150 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15153 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },15151 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -15177,7 +15175,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15177,7 +15175,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15177 .dst_temps = .{ .{ .ref = .src0 }, .unused },15175 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15178 .clobbers = .{ .eflags = true },15176 .clobbers = .{ .eflags = true },
15179 .each = .{ .once = &.{15177 .each = .{ .once = &.{
15180 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15178 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15181 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15179 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15182 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },15180 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15183 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15181 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -15208,7 +15206,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15208,7 +15206,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15208 .dst_temps = .{ .{ .ref = .src0 }, .unused },15206 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15209 .clobbers = .{ .eflags = true },15207 .clobbers = .{ .eflags = true },
15210 .each = .{ .once = &.{15208 .each = .{ .once = &.{
15211 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15209 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15212 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15210 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15213 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15211 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15214 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15212 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -15355,7 +15353,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15355,7 +15353,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15355 .dst_temps = .{ .{ .ref = .src0 }, .unused },15353 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15356 .clobbers = .{ .eflags = true },15354 .clobbers = .{ .eflags = true },
15357 .each = .{ .once = &.{15355 .each = .{ .once = &.{
15358 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15356 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15359 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15357 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15360 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },15358 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15361 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },15359 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -15385,7 +15383,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15385,7 +15383,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15385 .dst_temps = .{ .{ .ref = .src0 }, .unused },15383 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15386 .clobbers = .{ .eflags = true },15384 .clobbers = .{ .eflags = true },
15387 .each = .{ .once = &.{15385 .each = .{ .once = &.{
15388 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15386 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15389 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15387 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15390 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15388 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15391 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },15389 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -15415,7 +15413,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15415,7 +15413,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15415 .dst_temps = .{ .{ .ref = .src0 }, .unused },15413 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15416 .clobbers = .{ .eflags = true },15414 .clobbers = .{ .eflags = true },
15417 .each = .{ .once = &.{15415 .each = .{ .once = &.{
15418 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15416 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15419 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15417 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15420 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },15418 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15421 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15419 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -15446,7 +15444,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15446,7 +15444,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15446 .dst_temps = .{ .{ .ref = .src0 }, .unused },15444 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15447 .clobbers = .{ .eflags = true },15445 .clobbers = .{ .eflags = true },
15448 .each = .{ .once = &.{15446 .each = .{ .once = &.{
15449 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15447 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15450 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15448 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15451 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15449 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15452 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15450 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -15477,7 +15475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15477,7 +15475,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15477 .dst_temps = .{ .{ .ref = .src0 }, .unused },15475 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15478 .clobbers = .{ .eflags = true },15476 .clobbers = .{ .eflags = true },
15479 .each = .{ .once = &.{15477 .each = .{ .once = &.{
15480 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15478 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15481 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15479 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15482 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },15480 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15483 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },15481 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -15508,7 +15506,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15508,7 +15506,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15508 .dst_temps = .{ .{ .ref = .src0 }, .unused },15506 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15509 .clobbers = .{ .eflags = true },15507 .clobbers = .{ .eflags = true },
15510 .each = .{ .once = &.{15508 .each = .{ .once = &.{
15511 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15509 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15512 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15510 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15513 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15511 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15514 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },15512 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
...@@ -15539,7 +15537,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15539,7 +15537,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15539 .dst_temps = .{ .{ .ref = .src0 }, .unused },15537 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15540 .clobbers = .{ .eflags = true },15538 .clobbers = .{ .eflags = true },
15541 .each = .{ .once = &.{15539 .each = .{ .once = &.{
15542 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15540 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15543 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15541 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15544 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },15542 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15545 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15543 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -15571,7 +15569,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15571,7 +15569,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15571 .dst_temps = .{ .{ .ref = .src0 }, .unused },15569 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15572 .clobbers = .{ .eflags = true },15570 .clobbers = .{ .eflags = true },
15573 .each = .{ .once = &.{15571 .each = .{ .once = &.{
15574 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15572 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15575 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },15573 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15576 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15574 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15577 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15575 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -15780,7 +15778,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15780,7 +15778,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15780 .dst_temps = .{ .{ .ref = .src0 }, .unused },15778 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15781 .clobbers = .{ .eflags = true },15779 .clobbers = .{ .eflags = true },
15782 .each = .{ .once = &.{15780 .each = .{ .once = &.{
15783 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15781 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15784 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },15782 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
15785 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15783 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15786 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15784 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
...@@ -15825,7 +15823,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15825,7 +15823,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15825 .dst_temps = .{ .{ .ref = .src0 }, .unused },15823 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15826 .clobbers = .{ .eflags = true },15824 .clobbers = .{ .eflags = true },
15827 .each = .{ .once = &.{15825 .each = .{ .once = &.{
15828 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15826 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15829 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },15827 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
15830 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15828 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15831 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15829 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -15887,7 +15885,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15887,7 +15885,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15887 .dst_temps = .{ .{ .ref = .src0 }, .unused },15885 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15888 .clobbers = .{ .eflags = true },15886 .clobbers = .{ .eflags = true },
15889 .each = .{ .once = &.{15887 .each = .{ .once = &.{
15890 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15888 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15891 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },15889 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
15892 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15890 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15893 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15891 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -15919,7 +15917,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -15919,7 +15917,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
15919 .dst_temps = .{ .{ .ref = .src0 }, .unused },15917 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15920 .clobbers = .{ .eflags = true },15918 .clobbers = .{ .eflags = true },
15921 .each = .{ .once = &.{15919 .each = .{ .once = &.{
15922 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },15920 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
15923 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },15921 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
15924 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },15922 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15925 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },15923 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
...@@ -16039,7 +16037,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -16039,7 +16037,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
16039 .dst_temps = .{ .{ .ref = .src0 }, .unused },16037 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16040 .clobbers = .{ .eflags = true },16038 .clobbers = .{ .eflags = true },
16041 .each = .{ .once = &.{16039 .each = .{ .once = &.{
16042 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },16040 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
16043 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },16041 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
16044 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },16042 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
16045 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },16043 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
...@@ -16100,7 +16098,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -16100,7 +16098,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
16100 .dst_temps = .{ .{ .ref = .src0 }, .unused },16098 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16101 .clobbers = .{ .eflags = true },16099 .clobbers = .{ .eflags = true },
16102 .each = .{ .once = &.{16100 .each = .{ .once = &.{
16103 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },16101 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
16104 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },16102 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
16105 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },16103 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16106 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },16104 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
...@@ -16165,7 +16163,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -16165,7 +16163,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
16165 .dst_temps = .{ .{ .ref = .src0 }, .unused },16163 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16166 .clobbers = .{ .eflags = true },16164 .clobbers = .{ .eflags = true },
16167 .each = .{ .once = &.{16165 .each = .{ .once = &.{
16168 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },16166 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
16169 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },16167 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
16170 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },16168 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16171 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },16169 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
...@@ -16198,7 +16196,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -16198,7 +16196,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
16198 .dst_temps = .{ .{ .ref = .src0 }, .unused },16196 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16199 .clobbers = .{ .eflags = true },16197 .clobbers = .{ .eflags = true },
16200 .each = .{ .once = &.{16198 .each = .{ .once = &.{
16201 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },16199 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
16202 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },16200 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
16203 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },16201 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16204 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },16202 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
...@@ -58000,20 +57998,3084 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58000,20 +57998,3084 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58000 }, .{57998 }, .{
58001 .required_features = .{ .@"64bit", null, null, null },57999 .required_features = .{ .@"64bit", null, null, null },
58002 .src_constraints = .{58000 .src_constraints = .{
58003 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },58001 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },
58004 .{ .unsigned_int = .byte },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 },
58005 .any,61067 .any,
58006 },61068 },
58007 .patterns = &.{61069 .patterns = &.{
58008 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },61070 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58009 },61071 },
58010 .extra_temps = .{61072 .extra_temps = .{
61073 .{ .type = .u32, .kind = .{ .reg = .rax } },
58011 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61074 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58012 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },61075 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58013 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61076 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58014 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61077 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58015 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61078 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58016 .unused,
58017 .unused,61079 .unused,
58018 .unused,61080 .unused,
58019 .unused,61081 .unused,
...@@ -58023,44 +61085,70 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58023,44 +61085,70 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58023 .dst_temps = .{ .mem, .unused },61085 .dst_temps = .{ .mem, .unused },
58024 .clobbers = .{ .eflags = true },61086 .clobbers = .{ .eflags = true },
58025 .each = .{ .once = &.{61087 .each = .{ .once = &.{
58026 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },61088 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
58027 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61089 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
58028 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },61090 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
58029 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },61091 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58030 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },61092 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
58031 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },61093 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
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), ._, ._ },
58038 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },61094 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58039 .{ ._, ._r, .sa, .tmp3q, .src1b, ._, ._ },61095 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
58040 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },61096 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
58041 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },61097 .{ .@"1:", ._, .mov, .tmp0d, .src1d, ._, ._ },
58042 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },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, ._, ._, ._ },
58043 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },61110 .{ ._, ._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), ._, ._ },
58044 } },61132 } },
58045 }, .{61133 }, .{
58046 .required_features = .{ .@"64bit", .slow_incdec, null, null },61134 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58047 .src_constraints = .{61135 .src_constraints = .{
58048 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },61136 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
58049 .{ .unsigned_int = .byte },61137 .{ .exact_signed_int = 32 },
58050 .any,61138 .any,
58051 },61139 },
58052 .patterns = &.{61140 .patterns = &.{
58053 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },61141 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58054 },61142 },
58055 .extra_temps = .{61143 .extra_temps = .{
61144 .{ .type = .u32, .kind = .{ .reg = .rax } },
58056 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61145 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58057 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },61146 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58058 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61147 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58059 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61148 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58060 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61149 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58061 .unused,61150 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58062 .unused,61151 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58063 .unused,
58064 .unused,61152 .unused,
58065 .unused,61153 .unused,
58066 .unused,61154 .unused,
...@@ -58068,44 +61156,90 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58068,44 +61156,90 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58068 .dst_temps = .{ .mem, .unused },61156 .dst_temps = .{ .mem, .unused },
58069 .clobbers = .{ .eflags = true },61157 .clobbers = .{ .eflags = true },
58070 .each = .{ .once = &.{61158 .each = .{ .once = &.{
58071 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },61159 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
58072 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61160 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
58073 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },61161 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
58074 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },61162 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58075 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },61163 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
58076 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },61164 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
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), ._, ._ },
58088 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },61165 .{ ._, ._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, ._, ._ },
58089 } },61223 } },
58090 }, .{61224 }, .{
58091 .required_features = .{ .@"64bit", null, null, null },61225 .required_features = .{ .@"64bit", null, null, null },
58092 .src_constraints = .{61226 .src_constraints = .{
58093 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },61227 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
58094 .{ .unsigned_int = .byte },61228 .{ .exact_signed_int = 32 },
58095 .any,61229 .any,
58096 },61230 },
58097 .patterns = &.{61231 .patterns = &.{
58098 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },61232 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58099 },61233 },
58100 .extra_temps = .{61234 .extra_temps = .{
61235 .{ .type = .u32, .kind = .{ .reg = .rax } },
58101 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61236 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58102 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },61237 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58103 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61238 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58104 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61239 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58105 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61240 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58106 .unused,61241 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58107 .unused,61242 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58108 .unused,
58109 .unused,61243 .unused,
58110 .unused,61244 .unused,
58111 .unused,61245 .unused,
...@@ -58113,42 +61247,88 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58113,42 +61247,88 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58113 .dst_temps = .{ .mem, .unused },61247 .dst_temps = .{ .mem, .unused },
58114 .clobbers = .{ .eflags = true },61248 .clobbers = .{ .eflags = true },
58115 .each = .{ .once = &.{61249 .each = .{ .once = &.{
58116 .{ ._, ._, .movzx, .tmp0d, .src1b, ._, ._ },61250 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
58117 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61251 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
58118 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },61252 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
58119 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },61253 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58120 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },61254 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
58121 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },61255 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
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), ._, ._ },
58128 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },61256 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58129 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },61257 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
58130 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },61258 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
58131 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },61259 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
58132 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },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, ._, ._, ._ },
58133 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },61277 .{ ._, ._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, ._, ._ },
58134 } },61314 } },
58135 }, .{61315 }, .{
58136 .required_features = .{ .@"64bit", .slow_incdec, null, null },61316 .required_features = .{ .@"64bit", .bmi, .slow_incdec, null },
58137 .src_constraints = .{61317 .src_constraints = .{
58138 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },61318 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
58139 .{ .unsigned_int = .word },61319 .{ .exact_signed_int = 32 },
58140 .any,61320 .any,
58141 },61321 },
58142 .patterns = &.{61322 .patterns = &.{
58143 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },61323 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58144 },61324 },
58145 .extra_temps = .{61325 .extra_temps = .{
61326 .{ .type = .u32, .kind = .{ .reg = .rax } },
58146 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61327 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58147 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },61328 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58148 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61329 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58149 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61330 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58150 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61331 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58151 .unused,
58152 .unused,61332 .unused,
58153 .unused,61333 .unused,
58154 .unused,61334 .unused,
...@@ -58158,42 +61338,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58158,42 +61338,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58158 .dst_temps = .{ .mem, .unused },61338 .dst_temps = .{ .mem, .unused },
58159 .clobbers = .{ .eflags = true },61339 .clobbers = .{ .eflags = true },
58160 .each = .{ .once = &.{61340 .each = .{ .once = &.{
58161 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },61341 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
58162 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61342 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
58163 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },61343 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
58164 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },61344 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58165 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },61345 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
58166 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },61346 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
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), ._, ._ },
58178 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },61347 .{ ._, ._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), ._, ._ },
58179 } },61392 } },
58180 }, .{61393 }, .{
58181 .required_features = .{ .@"64bit", null, null, null },61394 .required_features = .{ .@"64bit", .bmi, null, null },
58182 .src_constraints = .{61395 .src_constraints = .{
58183 .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } },61396 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
58184 .{ .unsigned_int = .word },61397 .{ .exact_signed_int = 32 },
58185 .any,61398 .any,
58186 },61399 },
58187 .patterns = &.{61400 .patterns = &.{
58188 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },61401 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58189 },61402 },
58190 .extra_temps = .{61403 .extra_temps = .{
61404 .{ .type = .u32, .kind = .{ .reg = .rax } },
58191 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61405 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58192 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },61406 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58193 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61407 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58194 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61408 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58195 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61409 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58196 .unused,
58197 .unused,61410 .unused,
58198 .unused,61411 .unused,
58199 .unused,61412 .unused,
...@@ -58203,42 +61416,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58203,42 +61416,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58203 .dst_temps = .{ .mem, .unused },61416 .dst_temps = .{ .mem, .unused },
58204 .clobbers = .{ .eflags = true },61417 .clobbers = .{ .eflags = true },
58205 .each = .{ .once = &.{61418 .each = .{ .once = &.{
58206 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },61419 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
58207 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61420 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
58208 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },61421 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
58209 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },61422 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58210 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },61423 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
58211 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },61424 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
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), ._, ._ },
58218 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },61425 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58219 .{ ._, ._r, .sa, .tmp3q, .src1b, ._, ._ },61426 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
58220 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },61427 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
58221 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },61428 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
58222 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },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, ._, ._, ._ },
58223 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },61442 .{ ._, ._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), ._, ._ },
58224 } },61470 } },
58225 }, .{61471 }, .{
58226 .required_features = .{ .@"64bit", .slow_incdec, null, null },61472 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58227 .src_constraints = .{61473 .src_constraints = .{
58228 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },61474 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
58229 .{ .unsigned_int = .word },61475 .{ .exact_signed_int = 32 },
58230 .any,61476 .any,
58231 },61477 },
58232 .patterns = &.{61478 .patterns = &.{
58233 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },61479 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58234 },61480 },
58235 .extra_temps = .{61481 .extra_temps = .{
61482 .{ .type = .u32, .kind = .{ .reg = .rax } },
58236 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61483 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58237 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },61484 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58238 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61485 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58239 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61486 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58240 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61487 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58241 .unused,
58242 .unused,61488 .unused,
58243 .unused,61489 .unused,
58244 .unused,61490 .unused,
...@@ -58248,42 +61494,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58248,42 +61494,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58248 .dst_temps = .{ .mem, .unused },61494 .dst_temps = .{ .mem, .unused },
58249 .clobbers = .{ .eflags = true },61495 .clobbers = .{ .eflags = true },
58250 .each = .{ .once = &.{61496 .each = .{ .once = &.{
58251 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },61497 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
58252 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61498 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
58253 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },61499 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
58254 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },61500 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58255 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },61501 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
58256 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },61502 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
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), ._, ._ },
58263 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },61503 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58264 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },61504 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
58265 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },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, ._, ._ },
58266 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },61532 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58267 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },61533 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
58268 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },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), ._, ._ },
58269 } },61548 } },
58270 }, .{61549 }, .{
58271 .required_features = .{ .@"64bit", null, null, null },61550 .required_features = .{ .@"64bit", null, null, null },
58272 .src_constraints = .{61551 .src_constraints = .{
58273 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },61552 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
58274 .{ .unsigned_int = .word },61553 .{ .exact_signed_int = 32 },
58275 .any,61554 .any,
58276 },61555 },
58277 .patterns = &.{61556 .patterns = &.{
58278 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },61557 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58279 },61558 },
58280 .extra_temps = .{61559 .extra_temps = .{
61560 .{ .type = .u32, .kind = .{ .reg = .rax } },
58281 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61561 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58282 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },61562 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58283 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61563 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58284 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61564 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58285 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61565 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58286 .unused,
58287 .unused,61566 .unused,
58288 .unused,61567 .unused,
58289 .unused,61568 .unused,
...@@ -58293,225 +61572,255 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58293,225 +61572,255 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58293 .dst_temps = .{ .mem, .unused },61572 .dst_temps = .{ .mem, .unused },
58294 .clobbers = .{ .eflags = true },61573 .clobbers = .{ .eflags = true },
58295 .each = .{ .once = &.{61574 .each = .{ .once = &.{
58296 .{ ._, ._, .movzx, .tmp0d, .src1w, ._, ._ },61575 .{ ._, ._, .cmp, .src1d, .sia(-1, .src0, .add_bit_size), ._, ._ },
58297 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61576 .{ ._, ._na, .j, .@"1f", ._, ._, ._ },
58298 .{ ._, ._, .lea, .tmp1p, .leasia(.none, .@"8", .tmp0, .sub_src0_size), ._, ._ },61577 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
58299 .{ ._, ._, .not, .tmp0p, ._, ._, ._ },61578 .{ .@"0:", ._, .cmp, .memi(.src0q, .tmp0), .si(0), ._, ._ },
58300 .{ ._, ._, .lea, .tmp2p, .memsia(.dst0, .@"8", .tmp0, .add_size), ._, ._ },61579 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
58301 .{ ._, ._, .mov, .tmp3q, .memia(.src0q, .tmp1, .add_size), ._, ._ },61580 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
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), ._, ._ },
58308 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },61581 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
58309 .{ ._, ._r, .sh, .tmp3q, .src1b, ._, ._ },61582 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
58310 .{ .@"0:", ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp3q, ._, ._ },61583 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
58311 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },61584 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
58312 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },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, ._, ._, ._ },
58313 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },61598 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
58314 } },61599 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },
58315 } }) catch |err| switch (err) {61600 .{ ._, ._s, .j, .@"1f", ._, ._, ._ },
58316 error.SelectFailed => return cg.fail("failed to select {s} {} {} {} {}", .{61601 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58317 @tagName(air_tag),61602 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58318 cg.typeOf(bin_op.lhs).fmt(pt),61603 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
58319 cg.typeOf(bin_op.rhs).fmt(pt),61604 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58320 ops[0].tracking(cg),61605 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
58321 ops[1].tracking(cg),61606 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
58322 }),61607 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58323 else => |e| return e,61608 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
58324 };61609 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58325 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);61610 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58326 },61611 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
58327 .shl, .shl_exact => |air_tag| if (use_old) try cg.airShlShrBinOp(inst) else fallback: {61612 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58328 const bin_op = air_datas[@intFromEnum(inst)].bin_op;61613 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
58329 if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airShlShrBinOp(inst);61614 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
58330 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });61615 .{ ._, ._, .@"and", .tmp1q, .tmp5q, ._, ._ },
58331 var res: [1]Temp = undefined;61616 .{ ._, ._, .xor, .tmp5q, .tmp1q, ._, ._ },
58332 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{61617 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
58333 .src_constraints = .{ .{ .signed_int = .byte }, .{ .unsigned_int = .byte }, .any },61618 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
58334 .patterns = &.{61619 .{ .@"2:", ._, .mov, .tmp0q, .si(-1), ._, ._ },
58335 .{ .src = .{ .mut_mem, .imm8, .none } },61620 .{ ._, ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ },
58336 .{ .src = .{ .to_mut_gpr, .imm8, .none } },61621 .{ .@"3:", ._, .lea, .tmp2p, .mem(.dst0), ._, ._ },
58337 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },61622 .{ ._, ._, .mov, .src1d, .sia(-2, .dst0, .add_size_div_8), ._, ._ },
58338 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },61623 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
58339 },61624 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
58340 .dst_temps = .{ .{ .ref = .src0 }, .unused },61625 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
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, ._ },
58416 } },61626 } },
58417 }, .{61627 }, .{
58418 .src_constraints = .{ .{ .signed_int = .dword }, .{ .exact_unsigned_int = 5 }, .any },61628 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58419 .patterns = &.{61629 .src_constraints = .{
58420 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },61630 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
58421 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },61631 .{ .exact_signed_int = 32 },
61632 .any,
58422 },61633 },
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 },
58430 .patterns = &.{61634 .patterns = &.{
58431 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },61635 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58432 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58433 },61636 },
58434 .dst_temps = .{ .{ .ref = .src0 }, .unused },61637 .extra_temps = .{
58435 .clobbers = .{ .eflags = true },61638 .{ .type = .u32, .kind = .{ .reg = .rax } },
58436 .each = .{ .once = &.{61639 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58437 .{ ._, ._l, .sh, .dst0d, .src1b, ._, ._ },61640 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58438 } },61641 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58439 }, .{61642 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58440 .required_features = .{ .@"64bit", null, null, null },61643 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58441 .src_constraints = .{ .{ .signed_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },61644 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58442 .patterns = &.{61645 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58443 .{ .src = .{ .mut_mem, .imm8, .none } },61646 .unused,
58444 .{ .src = .{ .to_mut_gpr, .imm8, .none } },61647 .unused,
61648 .unused,
58445 },61649 },
58446 .dst_temps = .{ .{ .ref = .src0 }, .unused },61650 .dst_temps = .{ .mem, .unused },
58447 .clobbers = .{ .eflags = true },61651 .clobbers = .{ .eflags = true },
58448 .each = .{ .once = &.{61652 .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, ._, ._ },
58450 } },61716 } },
58451 }, .{61717 }, .{
58452 .required_features = .{ .@"64bit", null, null, null },61718 .required_features = .{ .@"64bit", null, null, null },
58453 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },61719 .src_constraints = .{
58454 .patterns = &.{61720 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
58455 .{ .src = .{ .mut_mem, .imm8, .none } },61721 .{ .exact_signed_int = 32 },
58456 .{ .src = .{ .to_mut_gpr, .imm8, .none } },61722 .any,
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 } },
58469 },61723 },
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 },
58477 .patterns = &.{61724 .patterns = &.{
58478 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },61725 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58479 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },
58480 },61726 },
58481 .dst_temps = .{ .{ .ref = .src0 }, .unused },61727 .extra_temps = .{
58482 .clobbers = .{ .eflags = true },61728 .{ .type = .u32, .kind = .{ .reg = .rax } },
58483 .each = .{ .once = &.{61729 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58484 .{ ._, ._l, .sa, .dst0q, .src1b, ._, ._ },61730 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58485 } },61731 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58486 }, .{61732 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58487 .required_features = .{ .@"64bit", null, null, null },61733 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58488 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .exact_unsigned_int = 6 }, .any },61734 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58489 .patterns = &.{61735 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
58490 .{ .src = .{ .mut_mem, .{ .to_reg = .cl }, .none } },61736 .unused,
58491 .{ .src = .{ .to_mut_gpr, .{ .to_reg = .cl }, .none } },61737 .unused,
61738 .unused,
58492 },61739 },
58493 .dst_temps = .{ .{ .ref = .src0 }, .unused },61740 .dst_temps = .{ .mem, .unused },
58494 .clobbers = .{ .eflags = true },61741 .clobbers = .{ .eflags = true },
58495 .each = .{ .once = &.{61742 .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, ._, ._ },
58497 } },61806 } },
58498 }, .{61807 }, .{
58499 .required_features = .{ .@"64bit", .slow_incdec, null, null },61808 .required_features = .{ .@"64bit", .bmi, .slow_incdec, null },
58500 .src_constraints = .{61809 .src_constraints = .{
58501 .{ .remainder_int = .{ .of = .qword, .is = .qword } },61810 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
58502 .{ .unsigned_int = .byte },61811 .{ .exact_signed_int = 32 },
58503 .any,61812 .any,
58504 },61813 },
58505 .patterns = &.{61814 .patterns = &.{
58506 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },61815 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58507 },61816 },
58508 .extra_temps = .{61817 .extra_temps = .{
61818 .{ .type = .u32, .kind = .{ .reg = .rax } },
58509 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61819 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58510 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61820 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58511 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61821 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58512 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61822 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58513 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61823 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58514 .unused,
58515 .unused,61824 .unused,
58516 .unused,61825 .unused,
58517 .unused,61826 .unused,
...@@ -58521,42 +61830,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58521,42 +61830,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58521 .dst_temps = .{ .mem, .unused },61830 .dst_temps = .{ .mem, .unused },
58522 .clobbers = .{ .eflags = true },61831 .clobbers = .{ .eflags = true },
58523 .each = .{ .once = &.{61832 .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, ._, ._ },
58525 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },61844 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
58526 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61845 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58527 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },61846 .{ ._, ._, .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", ._, ._, ._ },
58528 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },61859 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58529 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },61860 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58530 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },61861 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
58531 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58532 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58533 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },61862 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58534 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },61863 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
58535 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },61864 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
58536 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },61865 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
58537 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },61866 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
58538 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },61867 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58539 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },61868 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58540 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },61869 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
58541 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },61870 .{ ._, ._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, ._, ._ },
58542 } },61883 } },
58543 }, .{61884 }, .{
58544 .required_features = .{ .@"64bit", null, null, null },61885 .required_features = .{ .@"64bit", .bmi, null, null },
58545 .src_constraints = .{61886 .src_constraints = .{
58546 .{ .remainder_int = .{ .of = .qword, .is = .qword } },61887 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
58547 .{ .unsigned_int = .byte },61888 .{ .exact_signed_int = 32 },
58548 .any,61889 .any,
58549 },61890 },
58550 .patterns = &.{61891 .patterns = &.{
58551 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },61892 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58552 },61893 },
58553 .extra_temps = .{61894 .extra_temps = .{
61895 .{ .type = .u32, .kind = .{ .reg = .rax } },
58554 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61896 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58555 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61897 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58556 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61898 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58557 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61899 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58558 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61900 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58559 .unused,
58560 .unused,61901 .unused,
58561 .unused,61902 .unused,
58562 .unused,61903 .unused,
...@@ -58566,42 +61907,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58566,42 +61907,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58566 .dst_temps = .{ .mem, .unused },61907 .dst_temps = .{ .mem, .unused },
58567 .clobbers = .{ .eflags = true },61908 .clobbers = .{ .eflags = true },
58568 .each = .{ .once = &.{61909 .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, ._, ._ },
58570 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },61921 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
58571 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61922 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58572 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },61923 .{ ._, ._, .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", ._, ._, ._ },
58573 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },61936 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58574 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },61937 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58575 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },61938 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
58576 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58577 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58578 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },61939 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58579 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },61940 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
58580 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },61941 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
58581 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },61942 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58582 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },61943 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
58583 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },61944 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58584 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },61945 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58585 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },61946 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
58586 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },61947 .{ ._, ._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, ._, ._ },
58587 } },61960 } },
58588 }, .{61961 }, .{
58589 .required_features = .{ .@"64bit", .slow_incdec, null, null },61962 .required_features = .{ .@"64bit", .slow_incdec, null, null },
58590 .src_constraints = .{61963 .src_constraints = .{
58591 .{ .remainder_int = .{ .of = .qword, .is = .qword } },61964 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
58592 .{ .unsigned_int = .word },61965 .{ .exact_signed_int = 32 },
58593 .any,61966 .any,
58594 },61967 },
58595 .patterns = &.{61968 .patterns = &.{
58596 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },61969 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58597 },61970 },
58598 .extra_temps = .{61971 .extra_temps = .{
61972 .{ .type = .u32, .kind = .{ .reg = .rax } },
58599 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61973 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58600 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },61974 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58601 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },61975 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58602 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61976 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58603 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },61977 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58604 .unused,
58605 .unused,61978 .unused,
58606 .unused,61979 .unused,
58607 .unused,61980 .unused,
...@@ -58611,42 +61984,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58611,42 +61984,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58611 .dst_temps = .{ .mem, .unused },61984 .dst_temps = .{ .mem, .unused },
58612 .clobbers = .{ .eflags = true },61985 .clobbers = .{ .eflags = true },
58613 .each = .{ .once = &.{61986 .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, ._, ._ },
58615 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },61998 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
58616 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },61999 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58617 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },62000 .{ ._, ._, .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", ._, ._, ._ },
58618 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },62013 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58619 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },62014 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58620 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },62015 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
58621 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58622 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58623 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },62016 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58624 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },62017 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
58625 .{ .@"1:", ._, .sub, .tmp1d, .si(1), ._, ._ },62018 .{ ._, ._, .sub, .tmp1d, .si(1), ._, ._ },
58626 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },62019 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
58627 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },62020 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
58628 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },62021 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58629 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },62022 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58630 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },62023 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
58631 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },62024 .{ ._, ._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, ._, ._ },
58632 } },62037 } },
58633 }, .{62038 }, .{
58634 .required_features = .{ .@"64bit", null, null, null },62039 .required_features = .{ .@"64bit", null, null, null },
58635 .src_constraints = .{62040 .src_constraints = .{
58636 .{ .remainder_int = .{ .of = .qword, .is = .qword } },62041 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
58637 .{ .unsigned_int = .word },62042 .{ .exact_signed_int = 32 },
58638 .any,62043 .any,
58639 },62044 },
58640 .patterns = &.{62045 .patterns = &.{
58641 .{ .src = .{ .to_mem, .{ .to_reg = .cx }, .none } },62046 .{ .src = .{ .to_mem, .{ .to_reg = .cl }, .none } },
58642 },62047 },
58643 .extra_temps = .{62048 .extra_temps = .{
62049 .{ .type = .u32, .kind = .{ .reg = .rax } },
58644 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },62050 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
58645 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },62051 .{ .type = .usize, .kind = .{ .reg = .rdi } },
58646 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },62052 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58647 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },62053 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58648 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },62054 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
58649 .unused,
58650 .unused,62055 .unused,
58651 .unused,62056 .unused,
58652 .unused,62057 .unused,
...@@ -58656,48 +62061,66 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -58656,48 +62061,66 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
58656 .dst_temps = .{ .mem, .unused },62061 .dst_temps = .{ .mem, .unused },
58657 .clobbers = .{ .eflags = true },62062 .clobbers = .{ .eflags = true },
58658 .each = .{ .once = &.{62063 .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, ._, ._ },
58660 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },62075 .{ ._, ._, .mov, .tmp1d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
58661 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },62076 .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ },
58662 .{ ._, ._, .sub, .tmp1d, .tmp0d, ._, ._ },62077 .{ ._, ._, .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", ._, ._, ._ },
58663 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },62090 .{ ._, ._, .lea, .tmp2p, .memsid(.dst0, .@"8", .tmp0, 8), ._, ._ },
58664 .{ ._, ._, .mov, .tmp3q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },62091 .{ .@"0:", ._, .mov, .tmp5q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58665 .{ ._, ._mp, .j, .@"1f", ._, ._, ._ },62092 .{ ._, ._ld, .sh, .tmp3q, .tmp5q, .src1b, ._ },
58666 .{ .@"0:", ._, .mov, .tmp4q, .memsi(.src0q, .@"8", .tmp1), ._, ._ },
58667 .{ ._, ._ld, .sh, .tmp3q, .tmp4q, .src1b, ._ },
58668 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },62093 .{ ._, ._, .mov, .leasi(.tmp2q, .@"8", .tmp1), .tmp3q, ._, ._ },
58669 .{ ._, ._, .mov, .tmp3q, .tmp4q, ._, ._ },62094 .{ ._, ._, .mov, .tmp3q, .tmp5q, ._, ._ },
58670 .{ .@"1:", ._c, .de, .tmp1d, ._, ._, ._ },62095 .{ ._, ._c, .de, .tmp1d, ._, ._, ._ },
58671 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },62096 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
58672 .{ ._, ._l, .sh, .tmp3q, .src1b, ._, ._ },62097 .{ .@"1:", ._l, .sh, .tmp3q, .src1b, ._, ._ },
58673 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },62098 .{ .@"0:", ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp3q, ._, ._ },
58674 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },62099 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
58675 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },62100 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
58676 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },62101 .{ ._, ._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, ._, ._ },
58677 } },62114 } },
58678 } }) catch |err| switch (err) {62115 } }) catch |err| switch (err) {
58679 error.SelectFailed => return cg.fail("failed to select {s} {} {} {} {}", .{62116 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
58680 @tagName(air_tag),62117 @tagName(air_tag),
58681 cg.typeOf(bin_op.lhs).fmt(pt),62118 lhs_ty.fmt(pt),
58682 cg.typeOf(bin_op.rhs).fmt(pt),
58683 ops[0].tracking(cg),62119 ops[0].tracking(cg),
58684 ops[1].tracking(cg),62120 ops[1].tracking(cg),
58685 }),62121 }),
58686 else => |e| return e,62122 else => |e| return e,
58687 };62123 };
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 }
58701 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);62124 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
58702 },62125 },
58703 .not => |air_tag| if (use_old) try cg.airUnOp(inst, air_tag) else {62126 .not => |air_tag| if (use_old) try cg.airUnOp(inst, air_tag) else {
...@@ -139465,7 +142888,7 @@ const Select = struct {...@@ -139465,7 +142888,7 @@ const Select = struct {
139465 temps: [@intFromEnum(Select.Operand.Ref.none)]Temp,142888 temps: [@intFromEnum(Select.Operand.Ref.none)]Temp,
139466 labels: [@intFromEnum(Label._)]struct {142889 labels: [@intFromEnum(Label._)]struct {
139467 backward: ?Mir.Inst.Index,142890 backward: ?Mir.Inst.Index,
139468 forward: [1]?Mir.Inst.Index,142891 forward: [3]?Mir.Inst.Index,
139469 },142892 },
139470 top: u3,142893 top: u3,
139471142894
...@@ -140108,7 +143531,7 @@ const Select = struct {...@@ -140108,7 +143531,7 @@ const Select = struct {
140108 none,143531 none,
140109 undef,143532 undef,
140110 cc: Condition,143533 cc: Condition,
140111 imm: u32,143534 imm: i32,
140112 ref: Select.Operand.Ref,143535 ref: Select.Operand.Ref,
140113 reg: Register,143536 reg: Register,
140114 reg_pair: [2]Register,143537 reg_pair: [2]Register,
...@@ -140198,7 +143621,7 @@ const Select = struct {...@@ -140198,7 +143621,7 @@ const Select = struct {
140198 .any => .{ try cg.tempAlloc(spec.type), true },143621 .any => .{ try cg.tempAlloc(spec.type), true },
140199 .none => .{ try cg.tempInit(spec.type, .none), true },143622 .none => .{ try cg.tempInit(spec.type, .none), true },
140200 .undef => .{ try cg.tempInit(spec.type, .undef), true },143623 .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 },
140202 .cc => |cc| .{ try cg.tempInit(spec.type, .{ .eflags = cc }), true },143625 .cc => |cc| .{ try cg.tempInit(spec.type, .{ .eflags = cc }), true },
140203 .ref => |ref| .{ ref.tempOf(s), false },143626 .ref => |ref| .{ ref.tempOf(s), false },
140204 .reg => |reg| .{ try cg.tempInit(spec.type, .{ .register = reg }), true },143627 .reg => |reg| .{ try cg.tempInit(spec.type, .{ .register = reg }), true },
...@@ -140565,6 +143988,8 @@ const Select = struct {...@@ -140565,6 +143988,8 @@ const Select = struct {
140565 smin,143988 smin,
140566 smax,143989 smax,
140567 umax,143990 umax,
143991 smin_shr_src1,
143992 smax_shr_src1,
140568 umax_shr_src1,143993 umax_shr_src1,
140569 repeat,143994 repeat,
140570 },143995 },
...@@ -140630,8 +144055,9 @@ const Select = struct {...@@ -140630,8 +144055,9 @@ const Select = struct {
140630 const sub_smin: Adjust = .{ .sign = .neg, .lhs = .smin, .op = .mul, .rhs = .@"1" };144055 const sub_smin: Adjust = .{ .sign = .neg, .lhs = .smin, .op = .mul, .rhs = .@"1" };
140631 const add_smax: Adjust = .{ .sign = .pos, .lhs = .smax, .op = .mul, .rhs = .@"1" };144056 const add_smax: Adjust = .{ .sign = .pos, .lhs = .smax, .op = .mul, .rhs = .@"1" };
140632 const add_umax: Adjust = .{ .sign = .pos, .lhs = .umax, .op = .mul, .rhs = .@"1" };144057 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" };
140634 const sub_umax: Adjust = .{ .sign = .neg, .lhs = .umax, .op = .mul, .rhs = .@"1" };144058 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" };
140635 const repeat: Adjust = .{ .sign = .pos, .lhs = .repeat, .op = .mul, .rhs = .@"1" };144061 const repeat: Adjust = .{ .sign = .pos, .lhs = .repeat, .op = .mul, .rhs = .@"1" };
140636 };144062 };
140637 const Ref = enum(u5) {144063 const Ref = enum(u5) {
...@@ -141410,6 +144836,12 @@ const Select = struct {...@@ -141410,6 +144836,12 @@ const Select = struct {
141410 .umax => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(144836 .umax => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(
141411 -%op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),144837 -%op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
141412 )),144838 )),
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 ),
141413 .umax_shr_src1 => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(144845 .umax_shr_src1 => @bitCast(@as(UnsignedImm, std.math.maxInt(UnsignedImm)) >> @truncate(
141414 Select.Operand.Ref.src1.valueOf(s).immediate -% op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),144846 Select.Operand.Ref.src1.valueOf(s).immediate -% op.flags.base.ref.typeOf(s).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
141415 )),144847 )),
src/codegen/llvm.zig+50-15
...@@ -9023,19 +9023,25 @@ pub const FuncGen = struct {...@@ -9023,19 +9023,25 @@ pub const FuncGen = struct {
9023 const rhs = try self.resolveInst(bin_op.rhs);9023 const rhs = try self.resolveInst(bin_op.rhs);
90249024
9025 const lhs_ty = self.typeOf(bin_op.lhs);9025 const lhs_ty = self.typeOf(bin_op.lhs);
9026 const lhs_scalar_ty = lhs_ty.scalarType(zcu);9026 const lhs_info = lhs_ty.intInfo(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
9031 const llvm_lhs_ty = try o.lowerType(lhs_ty);9027 const llvm_lhs_ty = try o.lowerType(lhs_ty);
9032 const llvm_lhs_scalar_ty = llvm_lhs_ty.scalarType(&o.builder);9028 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
9033 const result = try self.wip.callIntrinsic(9036 const result = try self.wip.callIntrinsic(
9034 .normal,9037 .normal,
9035 .none,9038 .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 },
9037 &.{llvm_lhs_ty},9043 &.{llvm_lhs_ty},
9038 &.{ lhs, casted_rhs },9044 &.{ lhs, try self.wip.conv(.unsigned, rhs, llvm_lhs_ty, "") },
9039 "",9045 "",
9040 );9046 );
90419047
...@@ -9044,16 +9050,45 @@ pub const FuncGen = struct {...@@ -9044,16 +9050,45 @@ pub const FuncGen = struct {
9044 // poison value."9050 // poison value."
9045 // However Zig semantics says that saturating shift left can never produce9051 // However Zig semantics says that saturating shift left can never produce
9046 // undefined; instead it saturates.9052 // undefined; instead it saturates.
9053 if (rhs_info.bits <= math.log2_int(u16, lhs_info.bits)) return result;
9047 const bits = try o.builder.splatValue(9054 const bits = try o.builder.splatValue(
9048 llvm_lhs_ty,9055 llvm_rhs_ty,
9049 try o.builder.intConst(llvm_lhs_scalar_ty, lhs_bits),9056 try o.builder.intConst(llvm_rhs_scalar_ty, lhs_info.bits),
9050 );
9051 const lhs_max = try o.builder.splatValue(
9052 llvm_lhs_ty,
9053 try o.builder.intConst(llvm_lhs_scalar_ty, -1),
9054 );9057 );
9055 const in_range = try self.wip.icmp(.ult, casted_rhs, bits, "");9058 const in_range = try self.wip.icmp(.ult, rhs, bits, "");
9056 return self.wip.select(.normal, in_range, result, lhs_max, "");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, "");
9057 }9092 }
90589093
9059 fn airShr(self: *FuncGen, inst: Air.Inst.Index, is_exact: bool) !Builder.Value {9094 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" {...@@ -128,12 +128,12 @@ test "Saturating Shift Left where lhs is of a computed type" {
128 });128 });
129 }129 }
130130
131 pub fn FixedPoint(comptime value_type: type) type {131 pub fn FixedPoint(comptime ValueType: type) type {
132 return struct {132 return struct {
133 value: value_type,133 value: ValueType,
134 exponent: ShiftType,134 exponent: ShiftType,
135135
136 const ShiftType: type = getIntShiftType(value_type);136 const ShiftType: type = getIntShiftType(ValueType);
137137
138 pub fn shiftExponent(self: @This(), shift: ShiftType) @This() {138 pub fn shiftExponent(self: @This(), shift: ShiftType) @This() {
139 const shiftAbs = @abs(shift);139 const shiftAbs = @abs(shift);
...@@ -199,8 +199,7 @@ test "Saturating Shift Left" {...@@ -199,8 +199,7 @@ test "Saturating Shift Left" {
199 try expectEqual(0xffffffffffffffffffffffffffffffff, S.shlSat(@as(u128, 0x0fffffffffffffff0fffffffffffffff), 5));199 try expectEqual(0xffffffffffffffffffffffffffffffff, S.shlSat(@as(u128, 0x0fffffffffffffff0fffffffffffffff), 5));
200 try expectEqual(-0x80000000000000000000000000000000, S.shlSat(@as(i128, -0x0fffffffffffffff0fffffffffffffff), 5));200 try expectEqual(-0x80000000000000000000000000000000, S.shlSat(@as(i128, -0x0fffffffffffffff0fffffffffffffff), 5));
201201
202 // TODO202 try expectEqual(51146728248377216718956089012931236753385031969422887335676427626502090568823039920051095192592252455482604439493126109519019633529459266458258243583, S.shlSat(@as(i495, 0x2fe6bc5448c55ce18252e2c9d44777505dfe63ff249a8027a6626c7d8dd9893fd5731e51474727be556f757facb586a4e04bbc0148c6c7ad692302f46fbd), 0x31));
203 // try expectEqual(51146728248377216718956089012931236753385031969422887335676427626502090568823039920051095192592252455482604439493126109519019633529459266458258243583, S.shlSat(@as(i495, 0x2fe6bc5448c55ce18252e2c9d44777505dfe63ff249a8027a6626c7d8dd9893fd5731e51474727be556f757facb586a4e04bbc0148c6c7ad692302f46fbd), 0x31));
204 try expectEqual(-57896044618658097711785492504343953926634992332820282019728792003956564819968, S.shlSat(@as(i256, -0x53d4148cee74ea43477a65b3daa7b8fdadcbf4508e793f4af113b8d8da5a7eb6), 0x91));203 try expectEqual(-57896044618658097711785492504343953926634992332820282019728792003956564819968, S.shlSat(@as(i256, -0x53d4148cee74ea43477a65b3daa7b8fdadcbf4508e793f4af113b8d8da5a7eb6), 0x91));
205 try expectEqual(170141183460469231731687303715884105727, S.shlSat(@as(i128, 0x2fe6bc5448c55ce18252e2c9d4477750), 0x31));204 try expectEqual(170141183460469231731687303715884105727, S.shlSat(@as(i128, 0x2fe6bc5448c55ce18252e2c9d4477750), 0x31));
206 try expectEqual(0, S.shlSat(@as(i128, 0), 127));205 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" {...@@ -230,9 +230,10 @@ test "saturating multiplication <= 32 bits" {
230 try testSatMul(i32, 10, -12, -120);230 try testSatMul(i32, 10, -12, -120);
231}231}
232232
233// TODO: remove this test, integrate into general test233test "saturating mul i64, i128" {
234test "saturating mul i64, i128, wasm only" {234 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
235 if (builtin.zig_backend != .stage2_wasm) 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
237 try testSatMul(i64, 0, maxInt(i64), 0);238 try testSatMul(i64, 0, maxInt(i64), 0);
238 try testSatMul(i64, 0, minInt(i64), 0);239 try testSatMul(i64, 0, minInt(i64), 0);
...@@ -298,29 +299,34 @@ test "saturating multiplication" {...@@ -298,29 +299,34 @@ test "saturating multiplication" {
298}299}
299300
300test "saturating shift-left" {301test "saturating shift-left" {
301 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
302 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO302 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
303 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO303 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
304 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO304 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
305 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;305 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
306 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;306 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
308 const S = struct {309 const S = struct {
309 fn doTheTest() !void {310 fn doTheTest() !void {
310 try testSatShl(i8, 1, 2, 4);311 try testSatShl(i8, 1, u8, 2, 4);
311 try testSatShl(i8, 127, 1, 127);312 try testSatShl(i8, 127, u8, 1, 127);
312 try testSatShl(i8, -128, 1, -128);313 try testSatShl(i8, -128, u8, 1, -128);
313 // TODO: remove this check once #9668 is completed314 // TODO: remove this check once #9668 is completed
314 if (!builtin.cpu.arch.isWasm()) {315 if (!builtin.cpu.arch.isWasm()) {
315 // skip testing ints > 64 bits on wasm due to miscompilation / wasmtime ci error316 // 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(i128, maxInt(i128), u128, 64, maxInt(i128));
317 try testSatShl(u128, maxInt(u128), 64, maxInt(u128));318 try testSatShl(u128, maxInt(u128), u128, 64, maxInt(u128));
318 }319 }
319 try testSatShl(u8, 1, 2, 4);320 try testSatShl(u8, 1, u8, 2, 4);
320 try testSatShl(u8, 255, 1, 255);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));
321 }327 }
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 {
324 try expect((lhs <<| rhs) == expected);330 try expect((lhs <<| rhs) == expected);
325331
326 var x = lhs;332 var x = lhs;
...@@ -332,19 +338,37 @@ test "saturating shift-left" {...@@ -332,19 +338,37 @@ test "saturating shift-left" {
332 try S.doTheTest();338 try S.doTheTest();
333 try comptime S.doTheTest();339 try comptime S.doTheTest();
334340
335 try comptime S.testSatShl(comptime_int, 0, 0, 0);341 try comptime S.testSatShl(comptime_int, 0, comptime_int, 0, 0);
336 try comptime S.testSatShl(comptime_int, 1, 2, 4);342 try comptime S.testSatShl(comptime_int, 1, comptime_int, 2, 4);
337 try comptime S.testSatShl(comptime_int, 13, 150, 18554220005177478453757717602843436772975706112);343 try comptime S.testSatShl(comptime_int, 13, comptime_int, 150, 18554220005177478453757717602843436772975706112);
338 try comptime S.testSatShl(comptime_int, -582769, 180, -893090893854873184096635538665358532628308979495815656505344);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 }
339}363}
340364
341test "saturating shl uses the LHS type" {365test "saturating shl uses the LHS type" {
342 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
343 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO366 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
344 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO367 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
345 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO368 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
346 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;369 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
347 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;370 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
349 const lhs_const: u8 = 1;373 const lhs_const: u8 = 1;
350 var lhs_var: u8 = 1;374 var lhs_var: u8 = 1;
test/behavior/x86_64/binary.zig+17
...@@ -6,6 +6,7 @@ const DoubleBits = math.DoubleBits;...@@ -6,6 +6,7 @@ const DoubleBits = math.DoubleBits;
6const fmax = math.fmax;6const fmax = math.fmax;
7const fmin = math.fmin;7const fmin = math.fmin;
8const Gpr = math.Gpr;8const Gpr = math.Gpr;
9const imax = math.imax;
9const inf = math.inf;10const inf = math.inf;
10const Log2Int = math.Log2Int;11const Log2Int = math.Log2Int;
11const math = @import("math.zig");12const math = @import("math.zig");
...@@ -5388,6 +5389,22 @@ test shlExactUnsafe {...@@ -5388,6 +5389,22 @@ test shlExactUnsafe {
5388 try test_shl_exact_unsafe.testInts();5389 try test_shl_exact_unsafe.testInts();
5389}5390}
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
5391inline fn bitXor(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs ^ rhs) {5408inline fn bitXor(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs ^ rhs) {
5392 return lhs ^ rhs;5409 return lhs ^ rhs;
5393}5410}
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'