authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-04-11 05:21:44-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2025-04-11 05:21:44-04:00
logc82e1fe880629beea5660c675cfc698807205601
tree33180acf7aafbf0d5352ecd4f8dffe187cbb9138
parent9e21ba12d55c638cbc4898ae0f88f63821004f74
parent73498737a2da4f43002783da4755a67aba42344e
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #23355 from jacobly0/x86_64-rewrite

x86_64: start rewriting overflow operations

15 files changed, 6026 insertions(+), 601 deletions(-)

lib/std/zig/AstGen.zig+13-13
......@@ -8854,10 +8854,10 @@ fn asmExpr(
88548854 return astgen.failNode(node, "assembly expression with no output must be marked volatile", .{});
88558855 }
88568856 }
8857 if (full.outputs.len > 32) {
8858 return astgen.failNode(full.outputs[32], "too many asm outputs", .{});
8857 if (full.outputs.len >= 16) {
8858 return astgen.failNode(full.outputs[16], "too many asm outputs", .{});
88598859 }
8860 var outputs_buffer: [32]Zir.Inst.Asm.Output = undefined;
8860 var outputs_buffer: [15]Zir.Inst.Asm.Output = undefined;
88618861 const outputs = outputs_buffer[0..full.outputs.len];
88628862
88638863 var output_type_bits: u32 = 0;
......@@ -8893,10 +8893,10 @@ fn asmExpr(
88938893 }
88948894 }
88958895
8896 if (full.inputs.len > 32) {
8896 if (full.inputs.len >= 32) {
88978897 return astgen.failNode(full.inputs[32], "too many asm inputs", .{});
88988898 }
8899 var inputs_buffer: [32]Zir.Inst.Asm.Input = undefined;
8899 var inputs_buffer: [31]Zir.Inst.Asm.Input = undefined;
89008900 const inputs = inputs_buffer[0..full.inputs.len];
89018901
89028902 for (full.inputs, 0..) |input_node, i| {
......@@ -8912,7 +8912,7 @@ fn asmExpr(
89128912 };
89138913 }
89148914
8915 var clobbers_buffer: [32]u32 = undefined;
8915 var clobbers_buffer: [63]u32 = undefined;
89168916 var clobber_i: usize = 0;
89178917 if (full.first_clobber) |first_clobber| clobbers: {
89188918 // asm ("foo" ::: "a", "b")
......@@ -12932,14 +12932,14 @@ const GenZir = struct {
1293212932 }
1293312933 gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers);
1293412934
12935 // * 0b00000000_000XXXXX - `outputs_len`.
12936 // * 0b000000XX_XXX00000 - `inputs_len`.
12937 // * 0b0XXXXX00_00000000 - `clobbers_len`.
12935 // * 0b00000000_0000XXXX - `outputs_len`.
12936 // * 0b0000000X_XXXX0000 - `inputs_len`.
12937 // * 0b0XXXXXX0_00000000 - `clobbers_len`.
1293812938 // * 0bX0000000_00000000 - is volatile
12939 const small: u16 = @as(u16, @intCast(args.outputs.len)) |
12940 @as(u16, @intCast(args.inputs.len << 5)) |
12941 @as(u16, @intCast(args.clobbers.len << 10)) |
12942 (@as(u16, @intFromBool(args.is_volatile)) << 15);
12939 const small: u16 = @as(u16, @as(u4, @intCast(args.outputs.len))) << 0 |
12940 @as(u16, @as(u5, @intCast(args.inputs.len))) << 4 |
12941 @as(u16, @as(u6, @intCast(args.clobbers.len))) << 9 |
12942 @as(u16, @intFromBool(args.is_volatile)) << 15;
1294312943
1294412944 const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len);
1294512945 astgen.instructions.appendAssumeCapacity(.{
src/Sema.zig+3-3
......@@ -16661,9 +16661,9 @@ fn zirAsm(
1666116661 const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand);
1666216662 const src = block.nodeOffset(extra.data.src_node);
1666316663 const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node });
16664 const outputs_len: u5 = @truncate(extended.small);
16665 const inputs_len: u5 = @truncate(extended.small >> 5);
16666 const clobbers_len: u5 = @truncate(extended.small >> 10);
16664 const outputs_len: u4 = @truncate(extended.small);
16665 const inputs_len: u5 = @truncate(extended.small >> 4);
16666 const clobbers_len: u6 = @truncate(extended.small >> 9);
1666716667 const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0;
1666816668 const is_global_assembly = sema.func_index == .none;
1666916669 const zir_tags = sema.code.instructions.items(.tag);
src/arch/x86_64/CodeGen.zig+5570-65
......@@ -83,7 +83,6 @@ end_di_column: u32,
8383epilogue_relocs: std.ArrayListUnmanaged(Mir.Inst.Index) = .empty,
8484
8585reused_operands: std.StaticBitSet(Liveness.bpi - 1) = undefined,
86const_tracking: ConstTrackingMap = .empty,
8786inst_tracking: InstTrackingMap = .empty,
8887
8988// Key is the block instruction
......@@ -926,7 +925,6 @@ pub fn generate(
926925 while (block_it.next()) |block| block.deinit(gpa);
927926 function.blocks.deinit(gpa);
928927 function.inst_tracking.deinit(gpa);
929 function.const_tracking.deinit(gpa);
930928 function.epilogue_relocs.deinit(gpa);
931929 function.mir_instructions.deinit(gpa);
932930 function.mir_extra.deinit(gpa);
......@@ -2418,7 +2416,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24182416}
24192417
24202418fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2421 @setEvalBranchQuota(13_900);
2419 @setEvalBranchQuota(15_100);
24222420 const pt = cg.pt;
24232421 const zcu = pt.zcu;
24242422 const ip = &zcu.intern_pool;
......@@ -2459,9 +2457,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24592457 .mul_sat => try cg.airMulSat(inst),
24602458 .shl_sat => try cg.airShlSat(inst),
24612459
2462 .add_with_overflow => try cg.airAddSubWithOverflow(inst),
2463 .sub_with_overflow => try cg.airAddSubWithOverflow(inst),
2464 .mul_with_overflow => try cg.airMulWithOverflow(inst),
24652460 .shl_with_overflow => try cg.airShlWithOverflow(inst),
24662461
24672462 .bitcast => try cg.airBitCast(inst),
......@@ -28019,6 +28014,5377 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2801928014 };
2802028015 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
2802128016 },
28017 .add_with_overflow => |air_tag| if (use_old) try cg.airAddSubWithOverflow(inst) else fallback: {
28018 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
28019 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
28020 if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airAddSubWithOverflow(inst);
28021 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
28022 var res: [2]Temp = undefined;
28023 cg.select(&res, &.{ ty_pl.ty.toType(), .u1 }, &ops, comptime &.{ .{
28024 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any },
28025 .patterns = &.{
28026 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28027 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28028 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28029 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28030 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28031 },
28032 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28033 .clobbers = .{ .eflags = true },
28034 .each = .{ .once = &.{
28035 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
28036 } },
28037 }, .{
28038 .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_unsigned_int = 8 }, .any },
28039 .patterns = &.{
28040 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28041 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28042 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28043 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28044 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28045 },
28046 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
28047 .clobbers = .{ .eflags = true },
28048 .each = .{ .once = &.{
28049 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
28050 } },
28051 }, .{
28052 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any },
28053 .patterns = &.{
28054 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28055 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28056 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28057 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28058 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28059 },
28060 .extra_temps = .{
28061 .{ .type = .i8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28062 .unused,
28063 .unused,
28064 .unused,
28065 .unused,
28066 .unused,
28067 .unused,
28068 .unused,
28069 .unused,
28070 .unused,
28071 .unused,
28072 },
28073 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .po } },
28074 .clobbers = .{ .eflags = true },
28075 .each = .{ .once = &.{
28076 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
28077 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
28078 .{ ._, ._l, .sa, .dst0b, .uia(8, .src0, .sub_bit_size), ._, ._ },
28079 .{ ._, ._r, .sa, .dst0b, .uia(8, .src0, .sub_bit_size), ._, ._ },
28080 .{ ._, ._, .@"test", .tmp0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
28081 } },
28082 }, .{
28083 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
28084 .patterns = &.{
28085 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28086 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28087 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28088 },
28089 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } },
28090 .clobbers = .{ .eflags = true },
28091 .each = .{ .once = &.{
28092 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
28093 .{ ._, ._, .@"and", .dst0b, .ua(.src0, .add_umax), ._, ._ },
28094 .{ ._, ._, .cmp, .dst0b, .src1b, ._, ._ },
28095 } },
28096 }, .{
28097 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
28098 .patterns = &.{
28099 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
28100 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28101 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28102 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28103 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28104 },
28105 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28106 .clobbers = .{ .eflags = true },
28107 .each = .{ .once = &.{
28108 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
28109 } },
28110 }, .{
28111 .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_unsigned_int = 16 }, .any },
28112 .patterns = &.{
28113 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
28114 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28115 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28116 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28117 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28118 },
28119 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
28120 .clobbers = .{ .eflags = true },
28121 .each = .{ .once = &.{
28122 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
28123 } },
28124 }, .{
28125 .required_features = .{ .fast_imm16, null, null, null },
28126 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
28127 .patterns = &.{
28128 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
28129 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28130 },
28131 .extra_temps = .{
28132 .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28133 .unused,
28134 .unused,
28135 .unused,
28136 .unused,
28137 .unused,
28138 .unused,
28139 .unused,
28140 .unused,
28141 .unused,
28142 .unused,
28143 },
28144 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28145 .clobbers = .{ .eflags = true },
28146 .each = .{ .once = &.{
28147 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
28148 .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
28149 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
28150 .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
28151 .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ },
28152 } },
28153 }, .{
28154 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
28155 .patterns = &.{
28156 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28157 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28158 },
28159 .extra_temps = .{
28160 .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28161 .unused,
28162 .unused,
28163 .unused,
28164 .unused,
28165 .unused,
28166 .unused,
28167 .unused,
28168 .unused,
28169 .unused,
28170 .unused,
28171 },
28172 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28173 .clobbers = .{ .eflags = true },
28174 .each = .{ .once = &.{
28175 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
28176 .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
28177 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
28178 .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
28179 .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ },
28180 } },
28181 }, .{
28182 .required_features = .{ .fast_imm16, null, null, null },
28183 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
28184 .patterns = &.{
28185 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
28186 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28187 },
28188 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } },
28189 .clobbers = .{ .eflags = true },
28190 .each = .{ .once = &.{
28191 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
28192 .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ },
28193 .{ ._, ._, .cmp, .dst0w, .src1w, ._, ._ },
28194 } },
28195 }, .{
28196 .required_features = .{ .fast_imm16, null, null, null },
28197 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
28198 .patterns = &.{
28199 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28200 },
28201 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } },
28202 .clobbers = .{ .eflags = true },
28203 .each = .{ .once = &.{
28204 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
28205 .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ },
28206 .{ ._, ._, .cmp, .dst0w, .src1w, ._, ._ },
28207 } },
28208 }, .{
28209 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
28210 .patterns = &.{
28211 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
28212 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28213 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28214 },
28215 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } },
28216 .clobbers = .{ .eflags = true },
28217 .each = .{ .once = &.{
28218 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
28219 .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ },
28220 .{ ._, ._, .cmp, .dst0w, .src1w, ._, ._ },
28221 } },
28222 }, .{
28223 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
28224 .patterns = &.{
28225 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
28226 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28227 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28228 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28229 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28230 },
28231 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28232 .clobbers = .{ .eflags = true },
28233 .each = .{ .once = &.{
28234 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
28235 } },
28236 }, .{
28237 .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_unsigned_int = 32 }, .any },
28238 .patterns = &.{
28239 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
28240 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28241 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28242 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28243 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28244 },
28245 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
28246 .clobbers = .{ .eflags = true },
28247 .each = .{ .once = &.{
28248 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
28249 } },
28250 }, .{
28251 .required_features = .{ .bmi2, null, null, null },
28252 .src_constraints = .{ .{ .exact_signed_int = 31 }, .{ .exact_signed_int = 31 }, .any },
28253 .patterns = &.{
28254 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
28255 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28256 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28257 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28258 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28259 },
28260 .extra_temps = .{
28261 .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28262 .unused,
28263 .unused,
28264 .unused,
28265 .unused,
28266 .unused,
28267 .unused,
28268 .unused,
28269 .unused,
28270 .unused,
28271 .unused,
28272 },
28273 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28274 .clobbers = .{ .eflags = true },
28275 .each = .{ .once = &.{
28276 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
28277 .{ ._, ._, .mov, .tmp0d, .ui(1), ._, ._ },
28278 .{ ._, ._, .add, .dst0d, .dst0d, ._, ._ },
28279 .{ ._, ._rx, .sa, .dst0d, .dst0d, .tmp0d, ._ },
28280 } },
28281 }, .{
28282 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any },
28283 .patterns = &.{
28284 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
28285 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28286 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28287 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28288 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28289 },
28290 .extra_temps = .{
28291 .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28292 .unused,
28293 .unused,
28294 .unused,
28295 .unused,
28296 .unused,
28297 .unused,
28298 .unused,
28299 .unused,
28300 .unused,
28301 .unused,
28302 },
28303 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28304 .clobbers = .{ .eflags = true },
28305 .each = .{ .once = &.{
28306 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
28307 .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
28308 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
28309 .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
28310 .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ },
28311 } },
28312 }, .{
28313 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any },
28314 .patterns = &.{
28315 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
28316 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28317 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28318 },
28319 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } },
28320 .clobbers = .{ .eflags = true },
28321 .each = .{ .once = &.{
28322 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
28323 .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ },
28324 .{ ._, ._, .cmp, .dst0d, .src1d, ._, ._ },
28325 } },
28326 }, .{
28327 .required_features = .{ .@"64bit", null, null, null },
28328 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any },
28329 .patterns = &.{
28330 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
28331 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28332 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28333 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28334 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28335 },
28336 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28337 .clobbers = .{ .eflags = true },
28338 .each = .{ .once = &.{
28339 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
28340 } },
28341 }, .{
28342 .required_features = .{ .@"64bit", null, null, null },
28343 .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_unsigned_int = 64 }, .any },
28344 .patterns = &.{
28345 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
28346 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28347 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28348 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28349 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28350 },
28351 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
28352 .clobbers = .{ .eflags = true },
28353 .each = .{ .once = &.{
28354 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
28355 } },
28356 }, .{
28357 .required_features = .{ .@"64bit", .bmi2, null, null },
28358 .src_constraints = .{ .{ .exact_signed_int = 63 }, .{ .exact_signed_int = 63 }, .any },
28359 .patterns = &.{
28360 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
28361 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28362 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28363 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28364 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28365 },
28366 .extra_temps = .{
28367 .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28368 .unused,
28369 .unused,
28370 .unused,
28371 .unused,
28372 .unused,
28373 .unused,
28374 .unused,
28375 .unused,
28376 .unused,
28377 .unused,
28378 },
28379 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28380 .clobbers = .{ .eflags = true },
28381 .each = .{ .once = &.{
28382 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
28383 .{ ._, ._, .mov, .tmp0d, .ui(1), ._, ._ },
28384 .{ ._, ._, .add, .dst0q, .dst0q, ._, ._ },
28385 .{ ._, ._rx, .sa, .dst0q, .dst0q, .tmp0q, ._ },
28386 } },
28387 }, .{
28388 .required_features = .{ .@"64bit", null, null, null },
28389 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any },
28390 .patterns = &.{
28391 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
28392 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28393 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28394 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28395 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28396 },
28397 .extra_temps = .{
28398 .{ .type = .i64, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28399 .unused,
28400 .unused,
28401 .unused,
28402 .unused,
28403 .unused,
28404 .unused,
28405 .unused,
28406 .unused,
28407 .unused,
28408 .unused,
28409 },
28410 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28411 .clobbers = .{ .eflags = true },
28412 .each = .{ .once = &.{
28413 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
28414 .{ ._, ._l, .ro, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
28415 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
28416 .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
28417 .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ },
28418 } },
28419 }, .{
28420 .required_features = .{ .@"64bit", .bmi2, null, null },
28421 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
28422 .patterns = &.{
28423 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
28424 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28425 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28426 },
28427 .extra_temps = .{
28428 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
28429 .unused,
28430 .unused,
28431 .unused,
28432 .unused,
28433 .unused,
28434 .unused,
28435 .unused,
28436 .unused,
28437 .unused,
28438 .unused,
28439 },
28440 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } },
28441 .clobbers = .{ .eflags = true },
28442 .each = .{ .once = &.{
28443 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size), ._, ._ },
28444 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
28445 .{ ._, ._, .bzhi, .dst0q, .dst0q, .tmp0q, ._ },
28446 .{ ._, ._, .cmp, .dst0q, .src1q, ._, ._ },
28447 } },
28448 }, .{
28449 .required_features = .{ .@"64bit", null, null, null },
28450 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
28451 .patterns = &.{
28452 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
28453 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
28454 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28455 },
28456 .dst_temps = .{ .{ .rc = .general_purpose }, .{ .cc = .b } },
28457 .clobbers = .{ .eflags = true },
28458 .each = .{ .once = &.{
28459 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
28460 .{ ._, ._, .add, .src0q, .src1q, ._, ._ },
28461 .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ },
28462 .{ ._, ._, .cmp, .dst0q, .src1q, ._, ._ },
28463 } },
28464 }, .{
28465 .required_features = .{ .@"64bit", null, null, null },
28466 .src_constraints = .{
28467 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
28468 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
28469 .any,
28470 },
28471 .patterns = &.{
28472 .{ .src = .{ .to_mem, .to_mem, .none } },
28473 },
28474 .extra_temps = .{
28475 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28476 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
28477 .unused,
28478 .unused,
28479 .unused,
28480 .unused,
28481 .unused,
28482 .unused,
28483 .unused,
28484 .unused,
28485 .unused,
28486 },
28487 .dst_temps = .{ .mem, .none },
28488 .clobbers = .{ .eflags = true },
28489 .each = .{ .once = &.{
28490 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
28491 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28492 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
28493 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
28494 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ },
28495 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28496 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28497 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
28498 .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
28499 .{ ._, ._o, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ },
28500 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp1q, ._, ._ },
28501 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
28502 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ },
28503 } },
28504 }, .{
28505 .required_features = .{ .@"64bit", null, null, null },
28506 .src_constraints = .{
28507 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
28508 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
28509 .any,
28510 },
28511 .patterns = &.{
28512 .{ .src = .{ .to_mem, .to_mem, .none } },
28513 },
28514 .extra_temps = .{
28515 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28516 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
28517 .unused,
28518 .unused,
28519 .unused,
28520 .unused,
28521 .unused,
28522 .unused,
28523 .unused,
28524 .unused,
28525 .unused,
28526 },
28527 .dst_temps = .{ .mem, .{ .cc = .c } },
28528 .clobbers = .{ .eflags = true },
28529 .each = .{ .once = &.{
28530 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
28531 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28532 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28533 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28534 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ },
28535 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28536 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28537 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
28538 } },
28539 }, .{
28540 .required_features = .{ .@"64bit", null, null, null },
28541 .src_constraints = .{
28542 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
28543 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
28544 .any,
28545 },
28546 .patterns = &.{
28547 .{ .src = .{ .to_mem, .to_mem, .none } },
28548 },
28549 .extra_temps = .{
28550 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28551 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
28552 .unused,
28553 .unused,
28554 .unused,
28555 .unused,
28556 .unused,
28557 .unused,
28558 .unused,
28559 .unused,
28560 .unused,
28561 },
28562 .dst_temps = .{ .mem, .{ .cc = .o } },
28563 .clobbers = .{ .eflags = true },
28564 .each = .{ .once = &.{
28565 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
28566 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28567 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28568 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28569 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ },
28570 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28571 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28572 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
28573 .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
28574 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ },
28575 } },
28576 }, .{
28577 .required_features = .{ .@"64bit", null, null, null },
28578 .src_constraints = .{
28579 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
28580 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
28581 .any,
28582 },
28583 .patterns = &.{
28584 .{ .src = .{ .to_mem, .to_mem, .none } },
28585 },
28586 .extra_temps = .{
28587 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28588 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
28589 .unused,
28590 .unused,
28591 .unused,
28592 .unused,
28593 .unused,
28594 .unused,
28595 .unused,
28596 .unused,
28597 .unused,
28598 },
28599 .dst_temps = .{ .mem, .{ .cc = .c } },
28600 .clobbers = .{ .eflags = true },
28601 .each = .{ .once = &.{
28602 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
28603 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28604 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
28605 .{ ._, ._, .adc, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
28606 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_src0_size), .tmp1q, ._, ._ },
28607 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28608 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28609 } },
28610 }, .{
28611 .required_features = .{ .@"64bit", null, null, null },
28612 .src_constraints = .{
28613 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
28614 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
28615 .any,
28616 },
28617 .patterns = &.{
28618 .{ .src = .{ .to_mem, .to_mem, .none } },
28619 },
28620 .extra_temps = .{
28621 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28622 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
28623 .unused,
28624 .unused,
28625 .unused,
28626 .unused,
28627 .unused,
28628 .unused,
28629 .unused,
28630 .unused,
28631 .unused,
28632 },
28633 .dst_temps = .{ .mem, .{ .cc = .o } },
28634 .clobbers = .{ .eflags = true },
28635 .each = .{ .once = &.{
28636 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
28637 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28638 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
28639 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
28640 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ },
28641 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28642 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28643 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
28644 .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
28645 .{ ._, ._l, .ro, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
28646 .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ },
28647 .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
28648 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp1q, ._, ._ },
28649 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
28650 .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ },
28651 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ },
28652 } },
28653 }, .{
28654 .required_features = .{ .@"64bit", .bmi2, null, null },
28655 .src_constraints = .{
28656 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
28657 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
28658 .any,
28659 },
28660 .patterns = &.{
28661 .{ .src = .{ .to_mem, .to_mem, .none } },
28662 },
28663 .extra_temps = .{
28664 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28665 .unused,
28666 .unused,
28667 .unused,
28668 .unused,
28669 .unused,
28670 .unused,
28671 .unused,
28672 .unused,
28673 .unused,
28674 .unused,
28675 },
28676 .dst_temps = .{ .mem, .{ .rc = .general_purpose } },
28677 .clobbers = .{ .eflags = true },
28678 .each = .{ .once = &.{
28679 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
28680 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28681 .{ .@"0:", ._, .mov, .dst1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
28682 .{ ._, ._, .adc, .dst1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
28683 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .dst1q, ._, ._ },
28684 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28685 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28686 .{ ._, ._, .mov, .dst1q, .memad(.src0q, .add_size, -16), ._, ._ },
28687 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
28688 .{ ._, ._, .adc, .dst1q, .memad(.src1q, .add_size, -16), ._, ._ },
28689 .{ ._, ._, .bzhi, .tmp0q, .dst1q, .tmp0q, ._ },
28690 .{ ._, ._r, .sh, .dst1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
28691 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
28692 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
28693 } },
28694 }, .{
28695 .required_features = .{ .@"64bit", null, null, null },
28696 .src_constraints = .{
28697 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
28698 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
28699 .any,
28700 },
28701 .patterns = &.{
28702 .{ .src = .{ .to_mem, .to_mem, .none } },
28703 },
28704 .extra_temps = .{
28705 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28706 .unused,
28707 .unused,
28708 .unused,
28709 .unused,
28710 .unused,
28711 .unused,
28712 .unused,
28713 .unused,
28714 .unused,
28715 .unused,
28716 },
28717 .dst_temps = .{ .mem, .{ .rc = .general_purpose } },
28718 .clobbers = .{ .eflags = true },
28719 .each = .{ .once = &.{
28720 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
28721 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28722 .{ .@"0:", ._, .mov, .dst1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
28723 .{ ._, ._, .adc, .dst1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
28724 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .dst1q, ._, ._ },
28725 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28726 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28727 .{ ._, ._, .mov, .dst1q, .memad(.src0q, .add_size, -16), ._, ._ },
28728 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
28729 .{ ._, ._, .adc, .dst1q, .memad(.src1q, .add_size, -16), ._, ._ },
28730 .{ ._, ._, .@"and", .tmp0q, .dst1q, ._, ._ },
28731 .{ ._, ._r, .sh, .dst1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
28732 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
28733 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
28734 } },
28735 }, .{
28736 .required_features = .{ .@"64bit", null, null, null },
28737 .src_constraints = .{
28738 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
28739 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
28740 .any,
28741 },
28742 .patterns = &.{
28743 .{ .src = .{ .to_mem, .to_mem, .none } },
28744 },
28745 .extra_temps = .{
28746 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28747 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
28748 .unused,
28749 .unused,
28750 .unused,
28751 .unused,
28752 .unused,
28753 .unused,
28754 .unused,
28755 .unused,
28756 .unused,
28757 },
28758 .dst_temps = .{ .mem, .{ .cc = .o } },
28759 .clobbers = .{ .eflags = true },
28760 .each = .{ .once = &.{
28761 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
28762 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28763 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28764 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28765 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ },
28766 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28767 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28768 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
28769 .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
28770 .{ ._, ._l, .ro, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
28771 .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ },
28772 .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
28773 .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ },
28774 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ },
28775 } },
28776 }, .{
28777 .required_features = .{ .@"64bit", .bmi2, null, null },
28778 .src_constraints = .{
28779 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
28780 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
28781 .any,
28782 },
28783 .patterns = &.{
28784 .{ .src = .{ .to_mem, .to_mem, .none } },
28785 },
28786 .extra_temps = .{
28787 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28788 .unused,
28789 .unused,
28790 .unused,
28791 .unused,
28792 .unused,
28793 .unused,
28794 .unused,
28795 .unused,
28796 .unused,
28797 .unused,
28798 },
28799 .dst_temps = .{ .mem, .{ .rc = .general_purpose } },
28800 .clobbers = .{ .eflags = true },
28801 .each = .{ .once = &.{
28802 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
28803 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28804 .{ .@"0:", ._, .mov, .dst1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28805 .{ ._, ._, .adc, .dst1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28806 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .dst1q, ._, ._ },
28807 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28808 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28809 .{ ._, ._, .mov, .dst1q, .memad(.src0q, .add_size, -8), ._, ._ },
28810 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
28811 .{ ._, ._, .adc, .dst1q, .memad(.src1q, .add_size, -8), ._, ._ },
28812 .{ ._, ._, .bzhi, .tmp0q, .dst1q, .tmp0q, ._ },
28813 .{ ._, ._r, .sh, .dst1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
28814 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
28815 } },
28816 }, .{
28817 .required_features = .{ .@"64bit", null, null, null },
28818 .src_constraints = .{
28819 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
28820 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
28821 .any,
28822 },
28823 .patterns = &.{
28824 .{ .src = .{ .to_mem, .to_mem, .none } },
28825 },
28826 .extra_temps = .{
28827 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
28828 .unused,
28829 .unused,
28830 .unused,
28831 .unused,
28832 .unused,
28833 .unused,
28834 .unused,
28835 .unused,
28836 .unused,
28837 .unused,
28838 },
28839 .dst_temps = .{ .mem, .{ .rc = .general_purpose } },
28840 .clobbers = .{ .eflags = true },
28841 .each = .{ .once = &.{
28842 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
28843 .{ ._, ._c, .cl, ._, ._, ._, ._ },
28844 .{ .@"0:", ._, .mov, .dst1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28845 .{ ._, ._, .adc, .dst1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
28846 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .dst1q, ._, ._ },
28847 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
28848 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28849 .{ ._, ._, .mov, .dst1q, .memad(.src0q, .add_size, -8), ._, ._ },
28850 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
28851 .{ ._, ._, .adc, .dst1q, .memad(.src1q, .add_size, -8), ._, ._ },
28852 .{ ._, ._, .@"and", .tmp0q, .dst1q, ._, ._ },
28853 .{ ._, ._r, .sh, .dst1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
28854 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
28855 } },
28856 } }) catch |err| switch (err) {
28857 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
28858 @tagName(air_tag),
28859 ty_pl.ty.toType().fmt(pt),
28860 ops[0].tracking(cg),
28861 ops[1].tracking(cg),
28862 }),
28863 else => |e| return e,
28864 };
28865 try res[0].withOverflow(&res[1], cg);
28866 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
28867 },
28868 .sub_with_overflow => |air_tag| if (use_old) try cg.airAddSubWithOverflow(inst) else fallback: {
28869 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
28870 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
28871 if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airAddSubWithOverflow(inst);
28872 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
28873 var res: [2]Temp = undefined;
28874 cg.select(&res, &.{ ty_pl.ty.toType(), .u1 }, &ops, comptime &.{ .{
28875 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any },
28876 .patterns = &.{
28877 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28878 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28879 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28880 },
28881 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28882 .clobbers = .{ .eflags = true },
28883 .each = .{ .once = &.{
28884 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
28885 } },
28886 }, .{
28887 .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_unsigned_int = 8 }, .any },
28888 .patterns = &.{
28889 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28890 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28891 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28892 },
28893 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
28894 .clobbers = .{ .eflags = true },
28895 .each = .{ .once = &.{
28896 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
28897 } },
28898 }, .{
28899 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any },
28900 .patterns = &.{
28901 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28902 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28903 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28904 },
28905 .extra_temps = .{
28906 .{ .type = .i8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28907 .unused,
28908 .unused,
28909 .unused,
28910 .unused,
28911 .unused,
28912 .unused,
28913 .unused,
28914 .unused,
28915 .unused,
28916 .unused,
28917 },
28918 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .po } },
28919 .clobbers = .{ .eflags = true },
28920 .each = .{ .once = &.{
28921 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
28922 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
28923 .{ ._, ._l, .sa, .dst0b, .uia(8, .src0, .sub_bit_size), ._, ._ },
28924 .{ ._, ._r, .sa, .dst0b, .uia(8, .src0, .sub_bit_size), ._, ._ },
28925 .{ ._, ._, .@"test", .tmp0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
28926 } },
28927 }, .{
28928 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
28929 .patterns = &.{
28930 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28931 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28932 .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } },
28933 },
28934 .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } },
28935 .clobbers = .{ .eflags = true },
28936 .each = .{ .once = &.{
28937 .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ },
28938 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
28939 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
28940 .{ ._, ._, .@"and", .dst0b, .ua(.src0, .add_umax), ._, ._ },
28941 } },
28942 }, .{
28943 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
28944 .patterns = &.{
28945 .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } },
28946 },
28947 .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } },
28948 .clobbers = .{ .eflags = true },
28949 .each = .{ .once = &.{
28950 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
28951 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
28952 .{ ._, ._, .@"and", .dst0b, .ua(.src0, .add_umax), ._, ._ },
28953 } },
28954 }, .{
28955 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
28956 .patterns = &.{
28957 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
28958 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28959 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28960 },
28961 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28962 .clobbers = .{ .eflags = true },
28963 .each = .{ .once = &.{
28964 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
28965 } },
28966 }, .{
28967 .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_unsigned_int = 16 }, .any },
28968 .patterns = &.{
28969 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
28970 .{ .src = .{ .to_mut_gpr, .mem, .none } },
28971 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
28972 },
28973 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
28974 .clobbers = .{ .eflags = true },
28975 .each = .{ .once = &.{
28976 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
28977 } },
28978 }, .{
28979 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
28980 .patterns = &.{
28981 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
28982 },
28983 .extra_temps = .{
28984 .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
28985 .unused,
28986 .unused,
28987 .unused,
28988 .unused,
28989 .unused,
28990 .unused,
28991 .unused,
28992 .unused,
28993 .unused,
28994 .unused,
28995 },
28996 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
28997 .clobbers = .{ .eflags = true },
28998 .each = .{ .once = &.{
28999 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
29000 .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29001 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
29002 .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29003 .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ },
29004 } },
29005 }, .{
29006 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
29007 .patterns = &.{
29008 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29009 },
29010 .extra_temps = .{
29011 .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29012 .unused,
29013 .unused,
29014 .unused,
29015 .unused,
29016 .unused,
29017 .unused,
29018 .unused,
29019 .unused,
29020 .unused,
29021 .unused,
29022 },
29023 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
29024 .clobbers = .{ .eflags = true },
29025 .each = .{ .once = &.{
29026 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
29027 .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29028 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
29029 .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29030 .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ },
29031 } },
29032 }, .{
29033 .required_features = .{ .fast_imm16, null, null, null },
29034 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
29035 .patterns = &.{
29036 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
29037 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29038 .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } },
29039 },
29040 .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } },
29041 .clobbers = .{ .eflags = true },
29042 .each = .{ .once = &.{
29043 .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ },
29044 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
29045 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29046 .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ },
29047 } },
29048 }, .{
29049 .required_features = .{ .fast_imm16, null, null, null },
29050 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
29051 .patterns = &.{
29052 .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } },
29053 },
29054 .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } },
29055 .clobbers = .{ .eflags = true },
29056 .each = .{ .once = &.{
29057 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
29058 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29059 .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ },
29060 } },
29061 }, .{
29062 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
29063 .patterns = &.{
29064 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
29065 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29066 .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } },
29067 },
29068 .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } },
29069 .clobbers = .{ .eflags = true },
29070 .each = .{ .once = &.{
29071 .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ },
29072 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
29073 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29074 .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ },
29075 } },
29076 }, .{
29077 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
29078 .patterns = &.{
29079 .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } },
29080 },
29081 .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } },
29082 .clobbers = .{ .eflags = true },
29083 .each = .{ .once = &.{
29084 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
29085 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29086 .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ },
29087 } },
29088 }, .{
29089 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
29090 .patterns = &.{
29091 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
29092 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29093 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29094 },
29095 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
29096 .clobbers = .{ .eflags = true },
29097 .each = .{ .once = &.{
29098 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
29099 } },
29100 }, .{
29101 .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_unsigned_int = 32 }, .any },
29102 .patterns = &.{
29103 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
29104 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29105 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29106 },
29107 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
29108 .clobbers = .{ .eflags = true },
29109 .each = .{ .once = &.{
29110 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
29111 } },
29112 }, .{
29113 .required_features = .{ .bmi2, null, null, null },
29114 .src_constraints = .{ .{ .exact_signed_int = 31 }, .{ .exact_signed_int = 31 }, .any },
29115 .patterns = &.{
29116 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
29117 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29118 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29119 },
29120 .extra_temps = .{
29121 .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29122 .unused,
29123 .unused,
29124 .unused,
29125 .unused,
29126 .unused,
29127 .unused,
29128 .unused,
29129 .unused,
29130 .unused,
29131 .unused,
29132 },
29133 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
29134 .clobbers = .{ .eflags = true },
29135 .each = .{ .once = &.{
29136 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
29137 .{ ._, ._, .mov, .tmp0d, .ui(1), ._, ._ },
29138 .{ ._, ._, .add, .dst0d, .dst0d, ._, ._ },
29139 .{ ._, ._rx, .sa, .dst0d, .dst0d, .tmp0d, ._ },
29140 } },
29141 }, .{
29142 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any },
29143 .patterns = &.{
29144 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
29145 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29146 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29147 },
29148 .extra_temps = .{
29149 .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29150 .unused,
29151 .unused,
29152 .unused,
29153 .unused,
29154 .unused,
29155 .unused,
29156 .unused,
29157 .unused,
29158 .unused,
29159 .unused,
29160 },
29161 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
29162 .clobbers = .{ .eflags = true },
29163 .each = .{ .once = &.{
29164 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
29165 .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29166 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
29167 .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29168 .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ },
29169 } },
29170 }, .{
29171 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any },
29172 .patterns = &.{
29173 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
29174 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29175 .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } },
29176 },
29177 .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } },
29178 .clobbers = .{ .eflags = true },
29179 .each = .{ .once = &.{
29180 .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ },
29181 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
29182 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29183 .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ },
29184 } },
29185 }, .{
29186 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any },
29187 .patterns = &.{
29188 .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } },
29189 },
29190 .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } },
29191 .clobbers = .{ .eflags = true },
29192 .each = .{ .once = &.{
29193 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
29194 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29195 .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ },
29196 } },
29197 }, .{
29198 .required_features = .{ .@"64bit", null, null, null },
29199 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any },
29200 .patterns = &.{
29201 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
29202 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29203 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29204 },
29205 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
29206 .clobbers = .{ .eflags = true },
29207 .each = .{ .once = &.{
29208 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
29209 } },
29210 }, .{
29211 .required_features = .{ .@"64bit", null, null, null },
29212 .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_unsigned_int = 64 }, .any },
29213 .patterns = &.{
29214 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
29215 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29216 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29217 },
29218 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
29219 .clobbers = .{ .eflags = true },
29220 .each = .{ .once = &.{
29221 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
29222 } },
29223 }, .{
29224 .required_features = .{ .@"64bit", .bmi2, null, null },
29225 .src_constraints = .{ .{ .exact_signed_int = 63 }, .{ .exact_signed_int = 63 }, .any },
29226 .patterns = &.{
29227 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
29228 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29229 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29230 },
29231 .extra_temps = .{
29232 .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29233 .unused,
29234 .unused,
29235 .unused,
29236 .unused,
29237 .unused,
29238 .unused,
29239 .unused,
29240 .unused,
29241 .unused,
29242 .unused,
29243 },
29244 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
29245 .clobbers = .{ .eflags = true },
29246 .each = .{ .once = &.{
29247 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
29248 .{ ._, ._, .mov, .tmp0d, .ui(1), ._, ._ },
29249 .{ ._, ._, .add, .dst0q, .dst0q, ._, ._ },
29250 .{ ._, ._rx, .sa, .dst0q, .dst0q, .tmp0q, ._ },
29251 } },
29252 }, .{
29253 .required_features = .{ .@"64bit", null, null, null },
29254 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any },
29255 .patterns = &.{
29256 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
29257 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29258 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29259 },
29260 .extra_temps = .{
29261 .{ .type = .i64, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29262 .unused,
29263 .unused,
29264 .unused,
29265 .unused,
29266 .unused,
29267 .unused,
29268 .unused,
29269 .unused,
29270 .unused,
29271 .unused,
29272 },
29273 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } },
29274 .clobbers = .{ .eflags = true },
29275 .each = .{ .once = &.{
29276 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
29277 .{ ._, ._l, .ro, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
29278 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
29279 .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
29280 .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ },
29281 } },
29282 }, .{
29283 .required_features = .{ .@"64bit", .bmi2, null, null },
29284 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
29285 .patterns = &.{
29286 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
29287 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29288 .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } },
29289 },
29290 .extra_temps = .{
29291 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
29292 .unused,
29293 .unused,
29294 .unused,
29295 .unused,
29296 .unused,
29297 .unused,
29298 .unused,
29299 .unused,
29300 .unused,
29301 .unused,
29302 },
29303 .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } },
29304 .clobbers = .{ .eflags = true },
29305 .each = .{ .once = &.{
29306 .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ },
29307 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size), ._, ._ },
29308 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
29309 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29310 .{ ._, ._, .bzhi, .dst0q, .dst0q, .tmp0q, ._ },
29311 } },
29312 }, .{
29313 .required_features = .{ .@"64bit", .bmi2, null, null },
29314 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
29315 .patterns = &.{
29316 .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } },
29317 },
29318 .extra_temps = .{
29319 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
29320 .unused,
29321 .unused,
29322 .unused,
29323 .unused,
29324 .unused,
29325 .unused,
29326 .unused,
29327 .unused,
29328 .unused,
29329 .unused,
29330 },
29331 .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } },
29332 .clobbers = .{ .eflags = true },
29333 .each = .{ .once = &.{
29334 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size), ._, ._ },
29335 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
29336 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29337 .{ ._, ._, .bzhi, .dst0q, .dst0q, .tmp0q, ._ },
29338 } },
29339 }, .{
29340 .required_features = .{ .@"64bit", null, null, null },
29341 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
29342 .patterns = &.{
29343 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
29344 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29345 .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } },
29346 },
29347 .dst_temps = .{ .{ .rc = .general_purpose }, .{ .rc = .general_purpose } },
29348 .clobbers = .{ .eflags = true },
29349 .each = .{ .once = &.{
29350 .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ },
29351 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
29352 .{ ._, ._, .sub, .src0q, .src1q, ._, ._ },
29353 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29354 .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ },
29355 } },
29356 }, .{
29357 .required_features = .{ .@"64bit", null, null, null },
29358 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
29359 .patterns = &.{
29360 .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } },
29361 },
29362 .dst_temps = .{ .{ .rc = .general_purpose }, .{ .ref = .src1 } },
29363 .clobbers = .{ .eflags = true },
29364 .each = .{ .once = &.{
29365 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
29366 .{ ._, ._, .sub, .src0q, .src1q, ._, ._ },
29367 .{ ._, ._c, .set, .dst1b, ._, ._, ._ },
29368 .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ },
29369 } },
29370 }, .{
29371 .required_features = .{ .@"64bit", null, null, null },
29372 .src_constraints = .{
29373 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
29374 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
29375 .any,
29376 },
29377 .patterns = &.{
29378 .{ .src = .{ .to_mem, .to_mem, .none } },
29379 },
29380 .extra_temps = .{
29381 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29382 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29383 .unused,
29384 .unused,
29385 .unused,
29386 .unused,
29387 .unused,
29388 .unused,
29389 .unused,
29390 .unused,
29391 .unused,
29392 },
29393 .dst_temps = .{ .mem, .none },
29394 .clobbers = .{ .eflags = true },
29395 .each = .{ .once = &.{
29396 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
29397 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29398 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
29399 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
29400 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ },
29401 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29402 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29403 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
29404 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
29405 .{ ._, ._o, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ },
29406 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp1q, ._, ._ },
29407 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
29408 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ },
29409 } },
29410 }, .{
29411 .required_features = .{ .@"64bit", null, null, null },
29412 .src_constraints = .{
29413 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
29414 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
29415 .any,
29416 },
29417 .patterns = &.{
29418 .{ .src = .{ .to_mem, .to_mem, .none } },
29419 },
29420 .extra_temps = .{
29421 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29422 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29423 .unused,
29424 .unused,
29425 .unused,
29426 .unused,
29427 .unused,
29428 .unused,
29429 .unused,
29430 .unused,
29431 .unused,
29432 },
29433 .dst_temps = .{ .mem, .{ .cc = .c } },
29434 .clobbers = .{ .eflags = true },
29435 .each = .{ .once = &.{
29436 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
29437 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29438 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29439 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29440 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ },
29441 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29442 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29443 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
29444 } },
29445 }, .{
29446 .required_features = .{ .@"64bit", null, null, null },
29447 .src_constraints = .{
29448 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
29449 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
29450 .any,
29451 },
29452 .patterns = &.{
29453 .{ .src = .{ .to_mem, .to_mem, .none } },
29454 },
29455 .extra_temps = .{
29456 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29457 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29458 .unused,
29459 .unused,
29460 .unused,
29461 .unused,
29462 .unused,
29463 .unused,
29464 .unused,
29465 .unused,
29466 .unused,
29467 },
29468 .dst_temps = .{ .mem, .{ .cc = .o } },
29469 .clobbers = .{ .eflags = true },
29470 .each = .{ .once = &.{
29471 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
29472 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29473 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29474 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29475 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ },
29476 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29477 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29478 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
29479 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
29480 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ },
29481 } },
29482 }, .{
29483 .required_features = .{ .@"64bit", null, null, null },
29484 .src_constraints = .{
29485 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
29486 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
29487 .any,
29488 },
29489 .patterns = &.{
29490 .{ .src = .{ .to_mem, .to_mem, .none } },
29491 },
29492 .extra_temps = .{
29493 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29494 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29495 .unused,
29496 .unused,
29497 .unused,
29498 .unused,
29499 .unused,
29500 .unused,
29501 .unused,
29502 .unused,
29503 .unused,
29504 },
29505 .dst_temps = .{ .mem, .{ .cc = .c } },
29506 .clobbers = .{ .eflags = true },
29507 .each = .{ .once = &.{
29508 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
29509 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29510 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
29511 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
29512 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_src0_size), .tmp1q, ._, ._ },
29513 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29514 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29515 } },
29516 }, .{
29517 .required_features = .{ .@"64bit", null, null, null },
29518 .src_constraints = .{
29519 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
29520 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
29521 .any,
29522 },
29523 .patterns = &.{
29524 .{ .src = .{ .to_mem, .to_mem, .none } },
29525 },
29526 .extra_temps = .{
29527 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29528 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29529 .unused,
29530 .unused,
29531 .unused,
29532 .unused,
29533 .unused,
29534 .unused,
29535 .unused,
29536 .unused,
29537 .unused,
29538 },
29539 .dst_temps = .{ .mem, .{ .cc = .o } },
29540 .clobbers = .{ .eflags = true },
29541 .each = .{ .once = &.{
29542 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
29543 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29544 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
29545 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
29546 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ },
29547 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29548 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29549 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
29550 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
29551 .{ ._, ._l, .ro, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
29552 .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ },
29553 .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
29554 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp1q, ._, ._ },
29555 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
29556 .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ },
29557 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ },
29558 } },
29559 }, .{
29560 .required_features = .{ .@"64bit", .bmi2, null, null },
29561 .src_constraints = .{
29562 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
29563 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
29564 .any,
29565 },
29566 .patterns = &.{
29567 .{ .src = .{ .to_mem, .to_mem, .none } },
29568 },
29569 .extra_temps = .{
29570 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29571 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29572 .unused,
29573 .unused,
29574 .unused,
29575 .unused,
29576 .unused,
29577 .unused,
29578 .unused,
29579 .unused,
29580 .unused,
29581 },
29582 .dst_temps = .{ .mem, .none },
29583 .clobbers = .{ .eflags = true },
29584 .each = .{ .once = &.{
29585 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
29586 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29587 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
29588 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
29589 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ },
29590 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29591 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29592 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
29593 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
29594 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
29595 .{ ._, ._c, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ },
29596 .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ },
29597 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
29598 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
29599 } },
29600 }, .{
29601 .required_features = .{ .@"64bit", null, null, null },
29602 .src_constraints = .{
29603 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
29604 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
29605 .any,
29606 },
29607 .patterns = &.{
29608 .{ .src = .{ .to_mem, .to_mem, .none } },
29609 },
29610 .extra_temps = .{
29611 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29612 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29613 .unused,
29614 .unused,
29615 .unused,
29616 .unused,
29617 .unused,
29618 .unused,
29619 .unused,
29620 .unused,
29621 .unused,
29622 },
29623 .dst_temps = .{ .mem, .none },
29624 .clobbers = .{ .eflags = true },
29625 .each = .{ .once = &.{
29626 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
29627 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29628 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
29629 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
29630 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ },
29631 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29632 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29633 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
29634 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
29635 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
29636 .{ ._, ._c, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ },
29637 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
29638 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
29639 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
29640 } },
29641 }, .{
29642 .required_features = .{ .@"64bit", null, null, null },
29643 .src_constraints = .{
29644 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
29645 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
29646 .any,
29647 },
29648 .patterns = &.{
29649 .{ .src = .{ .to_mem, .to_mem, .none } },
29650 },
29651 .extra_temps = .{
29652 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29653 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29654 .unused,
29655 .unused,
29656 .unused,
29657 .unused,
29658 .unused,
29659 .unused,
29660 .unused,
29661 .unused,
29662 .unused,
29663 },
29664 .dst_temps = .{ .mem, .{ .cc = .o } },
29665 .clobbers = .{ .eflags = true },
29666 .each = .{ .once = &.{
29667 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
29668 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29669 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29670 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29671 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ },
29672 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29673 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29674 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
29675 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
29676 .{ ._, ._l, .ro, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
29677 .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ },
29678 .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
29679 .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ },
29680 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ },
29681 } },
29682 }, .{
29683 .required_features = .{ .@"64bit", .bmi2, null, null },
29684 .src_constraints = .{
29685 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
29686 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
29687 .any,
29688 },
29689 .patterns = &.{
29690 .{ .src = .{ .to_mem, .to_mem, .none } },
29691 },
29692 .extra_temps = .{
29693 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29694 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29695 .unused,
29696 .unused,
29697 .unused,
29698 .unused,
29699 .unused,
29700 .unused,
29701 .unused,
29702 .unused,
29703 .unused,
29704 },
29705 .dst_temps = .{ .mem, .none },
29706 .clobbers = .{ .eflags = true },
29707 .each = .{ .once = &.{
29708 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
29709 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29710 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29711 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29712 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ },
29713 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29714 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29715 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
29716 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
29717 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
29718 .{ ._, ._c, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ },
29719 .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ },
29720 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
29721 } },
29722 }, .{
29723 .required_features = .{ .@"64bit", null, null, null },
29724 .src_constraints = .{
29725 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
29726 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
29727 .any,
29728 },
29729 .patterns = &.{
29730 .{ .src = .{ .to_mem, .to_mem, .none } },
29731 },
29732 .extra_temps = .{
29733 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
29734 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
29735 .unused,
29736 .unused,
29737 .unused,
29738 .unused,
29739 .unused,
29740 .unused,
29741 .unused,
29742 .unused,
29743 .unused,
29744 },
29745 .dst_temps = .{ .mem, .none },
29746 .clobbers = .{ .eflags = true },
29747 .each = .{ .once = &.{
29748 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
29749 .{ ._, ._c, .cl, ._, ._, ._, ._ },
29750 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29751 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
29752 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ },
29753 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
29754 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
29755 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
29756 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
29757 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
29758 .{ ._, ._c, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ },
29759 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
29760 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
29761 } },
29762 } }) catch |err| switch (err) {
29763 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
29764 @tagName(air_tag),
29765 ty_pl.ty.toType().fmt(pt),
29766 ops[0].tracking(cg),
29767 ops[1].tracking(cg),
29768 }),
29769 else => |e| return e,
29770 };
29771 try res[0].withOverflow(&res[1], cg);
29772 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
29773 },
29774 .mul_with_overflow => |air_tag| if (use_old) try cg.airMulWithOverflow(inst) else fallback: {
29775 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
29776 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
29777 if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airMulWithOverflow(inst);
29778 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
29779 var res: [2]Temp = undefined;
29780 cg.select(&res, &.{ ty_pl.ty.toType(), .u1 }, &ops, comptime &.{ .{
29781 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any },
29782 .patterns = &.{
29783 .{ .src = .{ .{ .to_reg = .al }, .mem, .none } },
29784 .{ .src = .{ .mem, .{ .to_reg = .al }, .none }, .commute = .{ 0, 1 } },
29785 .{ .src = .{ .{ .to_reg = .al }, .to_gpr, .none } },
29786 },
29787 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
29788 .clobbers = .{ .eflags = true },
29789 .each = .{ .once = &.{
29790 .{ ._, .i_, .mul, .src1b, ._, ._, ._ },
29791 } },
29792 }, .{
29793 .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_unsigned_int = 8 }, .any },
29794 .patterns = &.{
29795 .{ .src = .{ .{ .to_reg = .al }, .mem, .none } },
29796 .{ .src = .{ .mem, .{ .to_reg = .al }, .none }, .commute = .{ 0, 1 } },
29797 .{ .src = .{ .{ .to_reg = .al }, .to_gpr, .none } },
29798 },
29799 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
29800 .clobbers = .{ .eflags = true },
29801 .each = .{ .once = &.{
29802 .{ ._, ._, .mul, .src1b, ._, ._, ._ },
29803 } },
29804 }, .{
29805 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any },
29806 .patterns = &.{
29807 .{ .src = .{ .{ .to_reg = .al }, .mem, .none } },
29808 .{ .src = .{ .mem, .{ .to_reg = .al }, .none }, .commute = .{ 0, 1 } },
29809 .{ .src = .{ .{ .to_reg = .al }, .to_gpr, .none } },
29810 },
29811 .extra_temps = .{
29812 .{ .type = .i16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29813 .unused,
29814 .unused,
29815 .unused,
29816 .unused,
29817 .unused,
29818 .unused,
29819 .unused,
29820 .unused,
29821 .unused,
29822 .unused,
29823 },
29824 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .ne } },
29825 .clobbers = .{ .eflags = true },
29826 .each = .{ .once = &.{
29827 .{ ._, .i_, .mul, .src1b, ._, ._, ._ },
29828 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
29829 .{ ._, ._l, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29830 .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29831 .{ ._, ._, .cmp, .dst0w, .tmp0w, ._, ._ },
29832 } },
29833 }, .{
29834 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
29835 .patterns = &.{
29836 .{ .src = .{ .{ .to_reg = .al }, .mem, .none } },
29837 .{ .src = .{ .mem, .{ .to_reg = .al }, .none }, .commute = .{ 0, 1 } },
29838 .{ .src = .{ .{ .to_reg = .al }, .to_gpr, .none } },
29839 },
29840 .extra_temps = .{
29841 .{ .type = .i16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29842 .unused,
29843 .unused,
29844 .unused,
29845 .unused,
29846 .unused,
29847 .unused,
29848 .unused,
29849 .unused,
29850 .unused,
29851 .unused,
29852 },
29853 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .nbe } },
29854 .clobbers = .{ .eflags = true },
29855 .each = .{ .once = &.{
29856 .{ ._, ._, .mul, .src1b, ._, ._, ._ },
29857 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
29858 .{ ._, ._, .@"and", .dst0b, .ua(.src0, .add_umax), ._, ._ },
29859 .{ ._, ._, .cmp, .tmp0w, .ua(.src0, .add_umax), ._, ._ },
29860 } },
29861 }, .{
29862 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
29863 .patterns = &.{
29864 .{ .src = .{ .mem, .imm16, .none } },
29865 .{ .src = .{ .imm16, .mem, .none }, .commute = .{ 0, 1 } },
29866 .{ .src = .{ .to_gpr, .imm16, .none } },
29867 .{ .src = .{ .imm16, .to_gpr, .none }, .commute = .{ 0, 1 } },
29868 },
29869 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .{ .cc = .c } },
29870 .clobbers = .{ .eflags = true },
29871 .each = .{ .once = &.{
29872 .{ ._, .i_, .mul, .dst0w, .src0w, .src1w, ._ },
29873 } },
29874 }, .{
29875 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
29876 .patterns = &.{
29877 .{ .src = .{ .to_mut_gpr, .mem, .none } },
29878 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
29879 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
29880 },
29881 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
29882 .clobbers = .{ .eflags = true },
29883 .each = .{ .once = &.{
29884 .{ ._, .i_, .mul, .dst0w, .src1w, ._, ._ },
29885 } },
29886 }, .{
29887 .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_unsigned_int = 16 }, .any },
29888 .patterns = &.{
29889 .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } },
29890 .{ .src = .{ .mem, .{ .to_reg = .ax }, .none }, .commute = .{ 0, 1 } },
29891 .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } },
29892 },
29893 .extra_temps = .{
29894 .{ .type = .u16, .kind = .{ .reg = .dx } },
29895 .unused,
29896 .unused,
29897 .unused,
29898 .unused,
29899 .unused,
29900 .unused,
29901 .unused,
29902 .unused,
29903 .unused,
29904 .unused,
29905 },
29906 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
29907 .clobbers = .{ .eflags = true },
29908 .each = .{ .once = &.{
29909 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
29910 .{ ._, ._, .mul, .src1w, ._, ._, ._ },
29911 } },
29912 }, .{
29913 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
29914 .patterns = &.{
29915 .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } },
29916 .{ .src = .{ .mem, .{ .to_reg = .ax }, .none }, .commute = .{ 0, 1 } },
29917 .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } },
29918 },
29919 .extra_temps = .{
29920 .{ .type = .i32, .kind = .{ .reg = .edx } },
29921 .unused,
29922 .unused,
29923 .unused,
29924 .unused,
29925 .unused,
29926 .unused,
29927 .unused,
29928 .unused,
29929 .unused,
29930 .unused,
29931 },
29932 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .ne } },
29933 .clobbers = .{ .eflags = true },
29934 .each = .{ .once = &.{
29935 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
29936 .{ ._, .i_, .mul, .src1w, ._, ._, ._ },
29937 .{ ._, ._l, .sh, .tmp0d, .ui(16), ._, ._ },
29938 .{ ._, ._, .mov, .tmp0w, .dst0w, ._, ._ },
29939 .{ ._, ._l, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29940 .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ },
29941 .{ ._, ._, .cmp, .dst0d, .tmp0d, ._, ._ },
29942 } },
29943 }, .{
29944 .required_features = .{ .fast_imm16, null, null, null },
29945 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
29946 .patterns = &.{
29947 .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } },
29948 .{ .src = .{ .mem, .{ .to_reg = .ax }, .none }, .commute = .{ 0, 1 } },
29949 .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } },
29950 },
29951 .extra_temps = .{
29952 .{ .type = .u16, .kind = .{ .reg = .dx } },
29953 .{ .type = .u16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29954 .unused,
29955 .unused,
29956 .unused,
29957 .unused,
29958 .unused,
29959 .unused,
29960 .unused,
29961 .unused,
29962 .unused,
29963 },
29964 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .nz } },
29965 .clobbers = .{ .eflags = true },
29966 .each = .{ .once = &.{
29967 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
29968 .{ ._, ._, .mul, .src1w, ._, ._, ._ },
29969 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
29970 .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ },
29971 .{ ._, ._, .@"and", .tmp1w, .uia(std.math.maxInt(u16), .src0, .sub_umax), ._, ._ },
29972 .{ ._, ._, .@"or", .tmp1w, .tmp0w, ._, ._ },
29973 } },
29974 }, .{
29975 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
29976 .patterns = &.{
29977 .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } },
29978 .{ .src = .{ .mem, .{ .to_reg = .ax }, .none }, .commute = .{ 0, 1 } },
29979 .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } },
29980 },
29981 .extra_temps = .{
29982 .{ .type = .u16, .kind = .{ .reg = .dx } },
29983 .{ .type = .u16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
29984 .unused,
29985 .unused,
29986 .unused,
29987 .unused,
29988 .unused,
29989 .unused,
29990 .unused,
29991 .unused,
29992 .unused,
29993 },
29994 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .nz } },
29995 .clobbers = .{ .eflags = true },
29996 .each = .{ .once = &.{
29997 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
29998 .{ ._, ._, .mul, .src1w, ._, ._, ._ },
29999 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
30000 .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ },
30001 .{ ._, ._, .@"and", .tmp1d, .uia(std.math.maxInt(u16), .src0, .sub_umax), ._, ._ },
30002 .{ ._, ._, .@"or", .tmp1d, .tmp0d, ._, ._ },
30003 } },
30004 }, .{
30005 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
30006 .patterns = &.{
30007 .{ .src = .{ .mem, .imm32, .none } },
30008 .{ .src = .{ .imm32, .mem, .none }, .commute = .{ 0, 1 } },
30009 .{ .src = .{ .to_gpr, .imm32, .none } },
30010 .{ .src = .{ .imm32, .to_gpr, .none }, .commute = .{ 0, 1 } },
30011 },
30012 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .{ .cc = .c } },
30013 .clobbers = .{ .eflags = true },
30014 .each = .{ .once = &.{
30015 .{ ._, .i_, .mul, .dst0d, .src0d, .src1d, ._ },
30016 } },
30017 }, .{
30018 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
30019 .patterns = &.{
30020 .{ .src = .{ .to_mut_gpr, .mem, .none } },
30021 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
30022 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
30023 },
30024 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
30025 .clobbers = .{ .eflags = true },
30026 .each = .{ .once = &.{
30027 .{ ._, .i_, .mul, .dst0d, .src1d, ._, ._ },
30028 } },
30029 }, .{
30030 .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_unsigned_int = 32 }, .any },
30031 .patterns = &.{
30032 .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } },
30033 .{ .src = .{ .mem, .{ .to_reg = .eax }, .none }, .commute = .{ 0, 1 } },
30034 .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } },
30035 },
30036 .extra_temps = .{
30037 .{ .type = .u32, .kind = .{ .reg = .edx } },
30038 .unused,
30039 .unused,
30040 .unused,
30041 .unused,
30042 .unused,
30043 .unused,
30044 .unused,
30045 .unused,
30046 .unused,
30047 .unused,
30048 },
30049 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
30050 .clobbers = .{ .eflags = true },
30051 .each = .{ .once = &.{
30052 .{ ._, ._, .mul, .src1d, ._, ._, ._ },
30053 } },
30054 }, .{
30055 .required_features = .{ .@"64bit", null, null, null },
30056 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any },
30057 .patterns = &.{
30058 .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } },
30059 .{ .src = .{ .mem, .{ .to_reg = .eax }, .none }, .commute = .{ 0, 1 } },
30060 .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } },
30061 },
30062 .extra_temps = .{
30063 .{ .type = .i32, .kind = .{ .reg = .edx } },
30064 .unused,
30065 .unused,
30066 .unused,
30067 .unused,
30068 .unused,
30069 .unused,
30070 .unused,
30071 .unused,
30072 .unused,
30073 .unused,
30074 },
30075 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .ne } },
30076 .clobbers = .{ .eflags = true },
30077 .each = .{ .once = &.{
30078 .{ ._, .i_, .mul, .src1d, ._, ._, ._ },
30079 .{ ._, ._l, .sh, .tmp0q, .ui(32), ._, ._ },
30080 .{ ._, ._, .@"or", .tmp0q, .dst0q, ._, ._ },
30081 .{ ._, ._l, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
30082 .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
30083 .{ ._, ._, .cmp, .dst0q, .tmp0q, ._, ._ },
30084 } },
30085 }, .{
30086 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any },
30087 .patterns = &.{
30088 .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } },
30089 .{ .src = .{ .mem, .{ .to_reg = .eax }, .none }, .commute = .{ 0, 1 } },
30090 .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } },
30091 },
30092 .extra_temps = .{
30093 .{ .type = .u32, .kind = .{ .ref = .src0 } },
30094 .{ .type = .u32, .kind = .{ .reg = .edx } },
30095 .unused,
30096 .unused,
30097 .unused,
30098 .unused,
30099 .unused,
30100 .unused,
30101 .unused,
30102 .unused,
30103 .unused,
30104 },
30105 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } }, .{ .cc = .nz } },
30106 .clobbers = .{ .eflags = true },
30107 .each = .{ .once = &.{
30108 .{ ._, ._, .mul, .src1d, ._, ._, ._ },
30109 .{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ },
30110 .{ ._, ._r, .sh, .tmp0d, .sa(.src0, .add_bit_size), ._, ._ },
30111 .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ },
30112 .{ ._, ._, .@"or", .tmp0d, .tmp1d, ._, ._ },
30113 } },
30114 }, .{
30115 .required_features = .{ .@"64bit", null, null, null },
30116 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any },
30117 .patterns = &.{
30118 .{ .src = .{ .mem, .simm32, .none } },
30119 .{ .src = .{ .simm32, .mem, .none }, .commute = .{ 0, 1 } },
30120 .{ .src = .{ .to_gpr, .simm32, .none } },
30121 .{ .src = .{ .simm32, .to_gpr, .none }, .commute = .{ 0, 1 } },
30122 },
30123 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .{ .cc = .c } },
30124 .clobbers = .{ .eflags = true },
30125 .each = .{ .once = &.{
30126 .{ ._, .i_, .mul, .dst0q, .src0q, .src1d, ._ },
30127 } },
30128 }, .{
30129 .required_features = .{ .@"64bit", null, null, null },
30130 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any },
30131 .patterns = &.{
30132 .{ .src = .{ .to_mut_gpr, .mem, .none } },
30133 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
30134 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
30135 },
30136 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
30137 .clobbers = .{ .eflags = true },
30138 .each = .{ .once = &.{
30139 .{ ._, .i_, .mul, .dst0q, .src1q, ._, ._ },
30140 } },
30141 }, .{
30142 .required_features = .{ .@"64bit", null, null, null },
30143 .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_unsigned_int = 64 }, .any },
30144 .patterns = &.{
30145 .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } },
30146 .{ .src = .{ .mem, .{ .to_reg = .eax }, .none }, .commute = .{ 0, 1 } },
30147 .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } },
30148 },
30149 .extra_temps = .{
30150 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30151 .unused,
30152 .unused,
30153 .unused,
30154 .unused,
30155 .unused,
30156 .unused,
30157 .unused,
30158 .unused,
30159 .unused,
30160 .unused,
30161 },
30162 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } },
30163 .clobbers = .{ .eflags = true },
30164 .each = .{ .once = &.{
30165 .{ ._, ._, .mul, .src1q, ._, ._, ._ },
30166 } },
30167 }, .{
30168 .required_features = .{ .@"64bit", null, null, null },
30169 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any },
30170 .patterns = &.{
30171 .{ .src = .{ .{ .to_reg = .rax }, .mem, .none } },
30172 .{ .src = .{ .mem, .{ .to_reg = .rax }, .none }, .commute = .{ 0, 1 } },
30173 .{ .src = .{ .{ .to_reg = .rax }, .to_gpr, .none } },
30174 },
30175 .extra_temps = .{
30176 .{ .type = .i64, .kind = .{ .reg = .rdx } },
30177 .{ .type = .i64, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } },
30178 .unused,
30179 .unused,
30180 .unused,
30181 .unused,
30182 .unused,
30183 .unused,
30184 .unused,
30185 .unused,
30186 .unused,
30187 },
30188 .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .nz } },
30189 .clobbers = .{ .eflags = true },
30190 .each = .{ .once = &.{
30191 .{ ._, .i_, .mul, .src1q, ._, ._, ._ },
30192 .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
30193 .{ ._, ._, .mov, .tmp1q, .dst0q, ._, ._ },
30194 .{ ._, ._l, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
30195 .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ },
30196 .{ ._, ._, .xor, .tmp1q, .dst0q, ._, ._ },
30197 .{ ._, ._, .@"or", .tmp1q, .tmp0q, ._, ._ },
30198 } },
30199 }, .{
30200 .required_features = .{ .@"64bit", .bmi2, null, null },
30201 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
30202 .patterns = &.{
30203 .{ .src = .{ .{ .to_reg = .rax }, .mem, .none } },
30204 .{ .src = .{ .mem, .{ .to_reg = .rax }, .none }, .commute = .{ 0, 1 } },
30205 .{ .src = .{ .{ .to_reg = .rax }, .to_gpr, .none } },
30206 },
30207 .extra_temps = .{
30208 .{ .type = .u64, .kind = .{ .ref = .src0 } },
30209 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30210 .unused,
30211 .unused,
30212 .unused,
30213 .unused,
30214 .unused,
30215 .unused,
30216 .unused,
30217 .unused,
30218 .unused,
30219 },
30220 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } }, .{ .cc = .nz } },
30221 .clobbers = .{ .eflags = true },
30222 .each = .{ .once = &.{
30223 .{ ._, ._, .mul, .src1q, ._, ._, ._ },
30224 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_bit_size), ._, ._ },
30225 .{ ._, ._, .bzhi, .dst0q, .tmp0q, .dst0q, ._ },
30226 .{ ._, ._, .xor, .tmp0q, .dst0q, ._, ._ },
30227 .{ ._, ._, .@"or", .tmp0q, .tmp1q, ._, ._ },
30228 } },
30229 }, .{
30230 .required_features = .{ .@"64bit", null, null, null },
30231 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
30232 .patterns = &.{
30233 .{ .src = .{ .{ .to_reg = .rax }, .mem, .none } },
30234 .{ .src = .{ .mem, .{ .to_reg = .rax }, .none }, .commute = .{ 0, 1 } },
30235 .{ .src = .{ .{ .to_reg = .rax }, .to_gpr, .none } },
30236 },
30237 .extra_temps = .{
30238 .{ .type = .u64, .kind = .{ .ref = .src0 } },
30239 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30240 .unused,
30241 .unused,
30242 .unused,
30243 .unused,
30244 .unused,
30245 .unused,
30246 .unused,
30247 .unused,
30248 .unused,
30249 },
30250 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } }, .{ .cc = .nz } },
30251 .clobbers = .{ .eflags = true },
30252 .each = .{ .once = &.{
30253 .{ ._, ._, .mul, .src1q, ._, ._, ._ },
30254 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
30255 .{ ._, ._, .@"and", .dst0q, .tmp0q, ._, ._ },
30256 .{ ._, ._, .xor, .tmp0q, .dst0q, ._, ._ },
30257 .{ ._, ._, .@"or", .tmp0q, .tmp1q, ._, ._ },
30258 } },
30259 }, .{
30260 .required_features = .{ .@"64bit", .cmov, .slow_incdec, null },
30261 .src_constraints = .{
30262 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
30263 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
30264 .any,
30265 },
30266 .patterns = &.{
30267 .{ .src = .{ .to_mem, .to_mem, .none } },
30268 },
30269 .extra_temps = .{
30270 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30271 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30272 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
30273 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30274 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30275 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30276 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30277 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
30278 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30279 .{ .type = .u64, .kind = .{ .reg = .rax } },
30280 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30281 },
30282 .dst_temps = .{ .mem, .{ .cc = .nz } },
30283 .clobbers = .{ .eflags = true },
30284 .each = .{ .once = &.{
30285 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
30286 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
30287 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
30288 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
30289 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
30290 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
30291 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
30292 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
30293 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
30294 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30295 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
30296 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
30297 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
30298 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
30299 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
30300 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
30301 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
30302 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
30303 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30304 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
30305 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
30306 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
30307 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
30308 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
30309 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
30310 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
30311 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
30312 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
30313 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30314 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30315 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
30316 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
30317 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
30318 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
30319 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
30320 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
30321 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
30322 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
30323 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
30324 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
30325 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
30326 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30327 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
30328 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
30329 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
30330 .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ },
30331 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30332 .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ },
30333 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30334 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
30335 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30336 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30337 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30338 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30339 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30340 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30341 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30342 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
30343 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30344 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
30345 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30346 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30347 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
30348 .{ ._, ._c, .st, ._, ._, ._, ._ },
30349 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30350 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30351 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30352 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30353 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30354 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30355 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30356 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30357 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
30358 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
30359 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
30360 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30361 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30362 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30363 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
30364 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
30365 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
30366 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30367 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
30368 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
30369 } },
30370 }, .{
30371 .required_features = .{ .@"64bit", .cmov, null, null },
30372 .src_constraints = .{
30373 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
30374 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
30375 .any,
30376 },
30377 .patterns = &.{
30378 .{ .src = .{ .to_mem, .to_mem, .none } },
30379 },
30380 .extra_temps = .{
30381 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30382 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30383 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
30384 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30385 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30386 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30387 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30388 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
30389 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30390 .{ .type = .u64, .kind = .{ .reg = .rax } },
30391 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30392 },
30393 .dst_temps = .{ .mem, .{ .cc = .nz } },
30394 .clobbers = .{ .eflags = true },
30395 .each = .{ .once = &.{
30396 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
30397 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
30398 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
30399 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
30400 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
30401 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
30402 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
30403 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
30404 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
30405 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30406 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
30407 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
30408 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
30409 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
30410 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
30411 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
30412 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
30413 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
30414 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30415 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
30416 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
30417 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
30418 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
30419 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
30420 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
30421 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
30422 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
30423 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
30424 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30425 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30426 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
30427 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
30428 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
30429 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
30430 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
30431 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
30432 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
30433 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
30434 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
30435 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
30436 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
30437 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30438 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
30439 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
30440 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
30441 .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ },
30442 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30443 .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ },
30444 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30445 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
30446 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30447 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30448 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30449 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30450 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30451 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30452 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30453 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
30454 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30455 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
30456 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30457 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30458 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
30459 .{ ._, ._c, .st, ._, ._, ._, ._ },
30460 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30461 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30462 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30463 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30464 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30465 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30466 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30467 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30468 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
30469 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
30470 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
30471 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30472 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30473 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30474 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
30475 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
30476 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
30477 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30478 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
30479 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
30480 } },
30481 }, .{
30482 .required_features = .{ .@"64bit", .slow_incdec, null, null },
30483 .src_constraints = .{
30484 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
30485 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
30486 .any,
30487 },
30488 .patterns = &.{
30489 .{ .src = .{ .to_mem, .to_mem, .none } },
30490 },
30491 .extra_temps = .{
30492 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30493 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30494 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
30495 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30496 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30497 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30498 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30499 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
30500 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30501 .{ .type = .u64, .kind = .{ .reg = .rax } },
30502 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30503 },
30504 .dst_temps = .{ .mem, .{ .cc = .nz } },
30505 .clobbers = .{ .eflags = true },
30506 .each = .{ .once = &.{
30507 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
30508 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
30509 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
30510 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
30511 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
30512 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
30513 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
30514 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
30515 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
30516 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30517 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
30518 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
30519 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
30520 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
30521 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
30522 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
30523 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
30524 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
30525 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30526 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
30527 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
30528 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
30529 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
30530 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
30531 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
30532 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
30533 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
30534 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
30535 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30536 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30537 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
30538 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
30539 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
30540 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
30541 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
30542 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
30543 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
30544 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
30545 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
30546 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
30547 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
30548 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30549 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
30550 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
30551 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
30552 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30553 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
30554 .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ },
30555 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30556 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
30557 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30558 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30559 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30560 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30561 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30562 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30563 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30564 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
30565 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30566 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
30567 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30568 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30569 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
30570 .{ ._, ._c, .st, ._, ._, ._, ._ },
30571 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30572 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30573 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30574 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30575 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30576 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30577 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30578 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30579 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
30580 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
30581 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
30582 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30583 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30584 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30585 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
30586 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
30587 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
30588 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30589 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
30590 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
30591 } },
30592 }, .{
30593 .required_features = .{ .@"64bit", null, null, null },
30594 .src_constraints = .{
30595 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
30596 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
30597 .any,
30598 },
30599 .patterns = &.{
30600 .{ .src = .{ .to_mem, .to_mem, .none } },
30601 },
30602 .extra_temps = .{
30603 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30604 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30605 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
30606 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30607 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30608 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30609 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30610 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
30611 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30612 .{ .type = .u64, .kind = .{ .reg = .rax } },
30613 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30614 },
30615 .dst_temps = .{ .mem, .{ .cc = .nz } },
30616 .clobbers = .{ .eflags = true },
30617 .each = .{ .once = &.{
30618 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
30619 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
30620 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
30621 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
30622 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
30623 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
30624 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
30625 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
30626 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
30627 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30628 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
30629 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
30630 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
30631 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
30632 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
30633 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
30634 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
30635 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
30636 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30637 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
30638 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
30639 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
30640 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
30641 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
30642 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
30643 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
30644 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
30645 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
30646 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30647 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30648 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
30649 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
30650 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
30651 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
30652 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
30653 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
30654 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
30655 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
30656 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
30657 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
30658 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
30659 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30660 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
30661 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
30662 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
30663 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30664 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
30665 .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ },
30666 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30667 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
30668 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30669 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30670 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30671 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30672 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30673 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30674 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30675 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
30676 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30677 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
30678 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30679 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30680 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
30681 .{ ._, ._c, .st, ._, ._, ._, ._ },
30682 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30683 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30684 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30685 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30686 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30687 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30688 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30689 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30690 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
30691 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
30692 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
30693 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30694 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30695 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30696 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
30697 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
30698 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
30699 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30700 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
30701 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
30702 } },
30703 }, .{
30704 .required_features = .{ .@"64bit", .cmov, .slow_incdec, null },
30705 .src_constraints = .{
30706 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
30707 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
30708 .any,
30709 },
30710 .patterns = &.{
30711 .{ .src = .{ .to_mem, .to_mem, .none } },
30712 },
30713 .extra_temps = .{
30714 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30715 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30716 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
30717 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30718 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30719 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30720 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30721 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
30722 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30723 .{ .type = .u64, .kind = .{ .reg = .rax } },
30724 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30725 },
30726 .dst_temps = .{ .mem, .{ .cc = .nz } },
30727 .clobbers = .{ .eflags = true },
30728 .each = .{ .once = &.{
30729 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
30730 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
30731 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
30732 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
30733 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
30734 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
30735 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
30736 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
30737 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
30738 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30739 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
30740 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
30741 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
30742 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
30743 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
30744 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
30745 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
30746 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
30747 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30748 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
30749 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
30750 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
30751 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
30752 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
30753 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
30754 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
30755 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
30756 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
30757 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30758 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30759 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
30760 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
30761 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
30762 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
30763 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
30764 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
30765 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
30766 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
30767 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
30768 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
30769 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
30770 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30771 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
30772 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
30773 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
30774 .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ },
30775 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30776 .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ },
30777 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30778 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
30779 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30780 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30781 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30782 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30783 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30784 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30785 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30786 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
30787 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30788 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
30789 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30790 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30791 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
30792 .{ ._, ._c, .st, ._, ._, ._, ._ },
30793 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30794 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30795 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30796 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30797 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30798 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30799 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30800 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30801 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
30802 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
30803 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
30804 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30805 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30806 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30807 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
30808 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
30809 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
30810 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30811 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
30812 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
30813 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
30814 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
30815 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
30816 .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
30817 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
30818 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
30819 } },
30820 }, .{
30821 .required_features = .{ .@"64bit", .cmov, null, null },
30822 .src_constraints = .{
30823 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
30824 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
30825 .any,
30826 },
30827 .patterns = &.{
30828 .{ .src = .{ .to_mem, .to_mem, .none } },
30829 },
30830 .extra_temps = .{
30831 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30832 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30833 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
30834 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30835 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30836 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30837 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30838 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
30839 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30840 .{ .type = .u64, .kind = .{ .reg = .rax } },
30841 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30842 },
30843 .dst_temps = .{ .mem, .{ .cc = .nz } },
30844 .clobbers = .{ .eflags = true },
30845 .each = .{ .once = &.{
30846 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
30847 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
30848 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
30849 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
30850 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
30851 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
30852 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
30853 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
30854 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
30855 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30856 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
30857 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
30858 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
30859 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
30860 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
30861 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
30862 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
30863 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
30864 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30865 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
30866 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
30867 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
30868 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
30869 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
30870 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
30871 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
30872 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
30873 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
30874 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30875 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30876 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
30877 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
30878 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
30879 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
30880 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
30881 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
30882 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
30883 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
30884 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
30885 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
30886 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
30887 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30888 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
30889 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
30890 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
30891 .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ },
30892 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30893 .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ },
30894 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30895 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
30896 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30897 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30898 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30899 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30900 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30901 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30902 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
30903 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
30904 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30905 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
30906 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30907 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
30908 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
30909 .{ ._, ._c, .st, ._, ._, ._, ._ },
30910 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
30911 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30912 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
30913 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
30914 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
30915 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
30916 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
30917 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
30918 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
30919 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
30920 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
30921 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30922 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30923 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
30924 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
30925 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
30926 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
30927 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
30928 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
30929 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
30930 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
30931 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
30932 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
30933 .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
30934 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
30935 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
30936 } },
30937 }, .{
30938 .required_features = .{ .@"64bit", .slow_incdec, null, null },
30939 .src_constraints = .{
30940 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
30941 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
30942 .any,
30943 },
30944 .patterns = &.{
30945 .{ .src = .{ .to_mem, .to_mem, .none } },
30946 },
30947 .extra_temps = .{
30948 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30949 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30950 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
30951 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30952 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30953 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
30954 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30955 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
30956 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
30957 .{ .type = .u64, .kind = .{ .reg = .rax } },
30958 .{ .type = .u64, .kind = .{ .reg = .rdx } },
30959 },
30960 .dst_temps = .{ .mem, .{ .cc = .nz } },
30961 .clobbers = .{ .eflags = true },
30962 .each = .{ .once = &.{
30963 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
30964 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
30965 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
30966 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
30967 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
30968 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
30969 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
30970 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
30971 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
30972 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
30973 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
30974 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
30975 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
30976 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
30977 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
30978 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
30979 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
30980 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
30981 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30982 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
30983 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
30984 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
30985 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
30986 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
30987 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
30988 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
30989 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
30990 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
30991 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
30992 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
30993 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
30994 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
30995 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
30996 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
30997 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
30998 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
30999 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
31000 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
31001 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31002 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31003 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31004 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31005 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31006 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31007 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31008 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31009 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
31010 .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ },
31011 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31012 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31013 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31014 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31015 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31016 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31017 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31018 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31019 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31020 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31021 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31022 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31023 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31024 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31025 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31026 .{ ._, ._c, .st, ._, ._, ._, ._ },
31027 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31028 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31029 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31030 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31031 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31032 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31033 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31034 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31035 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31036 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31037 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
31038 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31039 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31040 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31041 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
31042 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
31043 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
31044 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31045 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
31046 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
31047 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
31048 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
31049 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31050 .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31051 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
31052 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31053 } },
31054 }, .{
31055 .required_features = .{ .@"64bit", null, null, null },
31056 .src_constraints = .{
31057 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
31058 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
31059 .any,
31060 },
31061 .patterns = &.{
31062 .{ .src = .{ .to_mem, .to_mem, .none } },
31063 },
31064 .extra_temps = .{
31065 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31066 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31067 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
31068 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31069 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31070 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31071 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31072 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
31073 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31074 .{ .type = .u64, .kind = .{ .reg = .rax } },
31075 .{ .type = .u64, .kind = .{ .reg = .rdx } },
31076 },
31077 .dst_temps = .{ .mem, .{ .cc = .nz } },
31078 .clobbers = .{ .eflags = true },
31079 .each = .{ .once = &.{
31080 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
31081 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
31082 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
31083 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
31084 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
31085 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
31086 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
31087 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
31088 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
31089 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31090 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
31091 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
31092 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
31093 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
31094 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
31095 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
31096 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
31097 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
31098 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31099 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
31100 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
31101 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
31102 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
31103 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
31104 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
31105 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
31106 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
31107 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
31108 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31109 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31110 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
31111 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
31112 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
31113 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
31114 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
31115 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
31116 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
31117 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
31118 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31119 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31120 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31121 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31122 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31123 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31124 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31125 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31126 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
31127 .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ },
31128 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31129 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31130 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31131 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31132 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31133 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31134 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31135 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31136 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31137 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31138 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31139 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31140 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31141 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31142 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31143 .{ ._, ._c, .st, ._, ._, ._, ._ },
31144 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31145 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31146 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31147 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31148 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31149 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31150 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31151 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31152 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31153 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31154 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
31155 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31156 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31157 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31158 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
31159 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
31160 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
31161 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31162 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
31163 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
31164 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
31165 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
31166 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31167 .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31168 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
31169 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31170 } },
31171 }, .{
31172 .required_features = .{ .@"64bit", .cmov, .slow_incdec, null },
31173 .src_constraints = .{
31174 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
31175 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
31176 .any,
31177 },
31178 .patterns = &.{
31179 .{ .src = .{ .to_mem, .to_mem, .none } },
31180 },
31181 .extra_temps = .{
31182 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31183 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31184 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
31185 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31186 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31187 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31188 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31189 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
31190 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31191 .{ .type = .u64, .kind = .{ .reg = .rax } },
31192 .{ .type = .u64, .kind = .{ .reg = .rdx } },
31193 },
31194 .dst_temps = .{ .mem, .{ .cc = .nz } },
31195 .clobbers = .{ .eflags = true },
31196 .each = .{ .once = &.{
31197 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
31198 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
31199 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
31200 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
31201 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
31202 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
31203 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
31204 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
31205 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
31206 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31207 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
31208 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
31209 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
31210 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
31211 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
31212 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
31213 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
31214 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
31215 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31216 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
31217 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
31218 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
31219 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
31220 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
31221 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
31222 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
31223 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
31224 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
31225 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31226 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31227 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
31228 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
31229 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
31230 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
31231 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
31232 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
31233 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
31234 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
31235 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31236 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31237 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31238 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31239 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31240 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31241 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31242 .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ },
31243 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31244 .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ },
31245 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31246 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31247 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31248 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31249 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31250 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31251 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31252 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31253 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31254 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31255 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31256 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31257 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31258 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31259 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31260 .{ ._, ._c, .st, ._, ._, ._, ._ },
31261 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31262 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31263 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31264 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31265 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31266 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31267 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31268 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31269 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31270 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31271 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
31272 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31273 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31274 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31275 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
31276 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
31277 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
31278 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31279 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
31280 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
31281 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
31282 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31283 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31284 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31285 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
31286 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
31287 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
31288 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31289 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31290 .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31291 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
31292 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31293 } },
31294 }, .{
31295 .required_features = .{ .@"64bit", .cmov, null, null },
31296 .src_constraints = .{
31297 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
31298 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
31299 .any,
31300 },
31301 .patterns = &.{
31302 .{ .src = .{ .to_mem, .to_mem, .none } },
31303 },
31304 .extra_temps = .{
31305 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31306 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31307 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
31308 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31309 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31310 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31311 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31312 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
31313 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31314 .{ .type = .u64, .kind = .{ .reg = .rax } },
31315 .{ .type = .u64, .kind = .{ .reg = .rdx } },
31316 },
31317 .dst_temps = .{ .mem, .{ .cc = .nz } },
31318 .clobbers = .{ .eflags = true },
31319 .each = .{ .once = &.{
31320 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
31321 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
31322 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
31323 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
31324 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
31325 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
31326 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
31327 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
31328 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
31329 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31330 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
31331 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
31332 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
31333 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
31334 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
31335 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
31336 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
31337 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
31338 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31339 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
31340 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
31341 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
31342 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
31343 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
31344 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
31345 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
31346 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
31347 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
31348 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31349 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31350 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
31351 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
31352 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
31353 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
31354 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
31355 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
31356 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
31357 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
31358 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31359 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31360 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31361 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31362 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31363 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31364 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31365 .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ },
31366 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31367 .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ },
31368 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31369 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31370 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31371 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31372 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31373 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31374 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31375 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31376 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31377 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31378 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31379 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31380 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31381 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31382 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31383 .{ ._, ._c, .st, ._, ._, ._, ._ },
31384 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31385 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31386 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31387 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31388 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31389 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31390 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31391 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31392 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31393 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31394 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
31395 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31396 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31397 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31398 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
31399 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
31400 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
31401 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31402 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
31403 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
31404 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
31405 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31406 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31407 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31408 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
31409 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
31410 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
31411 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31412 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31413 .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31414 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
31415 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31416 } },
31417 }, .{
31418 .required_features = .{ .@"64bit", .slow_incdec, null, null },
31419 .src_constraints = .{
31420 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
31421 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
31422 .any,
31423 },
31424 .patterns = &.{
31425 .{ .src = .{ .to_mem, .to_mem, .none } },
31426 },
31427 .extra_temps = .{
31428 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31429 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31430 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
31431 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31432 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31433 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31434 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31435 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
31436 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31437 .{ .type = .u64, .kind = .{ .reg = .rax } },
31438 .{ .type = .u64, .kind = .{ .reg = .rdx } },
31439 },
31440 .dst_temps = .{ .mem, .{ .cc = .nz } },
31441 .clobbers = .{ .eflags = true },
31442 .each = .{ .once = &.{
31443 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
31444 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
31445 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
31446 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
31447 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
31448 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
31449 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
31450 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
31451 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
31452 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31453 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
31454 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
31455 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
31456 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
31457 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
31458 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
31459 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
31460 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
31461 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31462 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
31463 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
31464 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
31465 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
31466 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
31467 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
31468 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
31469 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
31470 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
31471 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31472 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31473 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
31474 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
31475 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
31476 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
31477 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
31478 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
31479 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
31480 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
31481 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31482 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31483 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31484 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31485 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31486 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31487 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31488 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31489 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
31490 .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ },
31491 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31492 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31493 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31494 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31495 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31496 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31497 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31498 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31499 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31500 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31501 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31502 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31503 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31504 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31505 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31506 .{ ._, ._c, .st, ._, ._, ._, ._ },
31507 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31508 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31509 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31510 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31511 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31512 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31513 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31514 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31515 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31516 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31517 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
31518 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31519 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31520 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31521 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
31522 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
31523 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
31524 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31525 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
31526 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
31527 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
31528 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31529 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31530 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31531 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
31532 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
31533 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
31534 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31535 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31536 .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31537 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
31538 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31539 } },
31540 }, .{
31541 .required_features = .{ .@"64bit", null, null, null },
31542 .src_constraints = .{
31543 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
31544 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
31545 .any,
31546 },
31547 .patterns = &.{
31548 .{ .src = .{ .to_mem, .to_mem, .none } },
31549 },
31550 .extra_temps = .{
31551 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31552 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31553 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
31554 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31555 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31556 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31557 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31558 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
31559 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31560 .{ .type = .u64, .kind = .{ .reg = .rax } },
31561 .{ .type = .u64, .kind = .{ .reg = .rdx } },
31562 },
31563 .dst_temps = .{ .mem, .{ .cc = .nz } },
31564 .clobbers = .{ .eflags = true },
31565 .each = .{ .once = &.{
31566 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
31567 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
31568 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
31569 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
31570 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
31571 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
31572 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
31573 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
31574 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
31575 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31576 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
31577 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
31578 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
31579 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
31580 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
31581 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
31582 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
31583 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
31584 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31585 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
31586 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
31587 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
31588 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
31589 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
31590 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
31591 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
31592 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
31593 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
31594 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31595 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31596 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
31597 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
31598 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
31599 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
31600 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
31601 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
31602 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
31603 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
31604 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31605 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31606 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31607 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31608 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31609 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31610 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31611 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31612 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
31613 .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ },
31614 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31615 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31616 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31617 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31618 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31619 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31620 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31621 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31622 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31623 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31624 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31625 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31626 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31627 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31628 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31629 .{ ._, ._c, .st, ._, ._, ._, ._ },
31630 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31631 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31632 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31633 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31634 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31635 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31636 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31637 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31638 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31639 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31640 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
31641 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31642 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31643 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31644 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
31645 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
31646 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
31647 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31648 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
31649 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
31650 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
31651 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31652 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31653 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31654 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
31655 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
31656 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
31657 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31658 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31659 .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31660 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
31661 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31662 } },
31663 }, .{
31664 .required_features = .{ .@"64bit", .cmov, .slow_incdec, null },
31665 .src_constraints = .{
31666 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
31667 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
31668 .any,
31669 },
31670 .patterns = &.{
31671 .{ .src = .{ .to_mem, .to_mem, .none } },
31672 },
31673 .extra_temps = .{
31674 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31675 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31676 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
31677 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31678 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31679 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31680 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31681 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
31682 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31683 .{ .type = .u64, .kind = .{ .reg = .rax } },
31684 .{ .type = .u64, .kind = .{ .reg = .rdx } },
31685 },
31686 .dst_temps = .{ .mem, .{ .cc = .nz } },
31687 .clobbers = .{ .eflags = true },
31688 .each = .{ .once = &.{
31689 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
31690 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
31691 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
31692 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
31693 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
31694 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
31695 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
31696 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
31697 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
31698 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31699 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
31700 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
31701 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
31702 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
31703 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
31704 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
31705 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
31706 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
31707 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31708 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
31709 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
31710 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
31711 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
31712 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
31713 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
31714 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
31715 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
31716 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
31717 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31718 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31719 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
31720 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
31721 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
31722 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
31723 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
31724 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
31725 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
31726 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
31727 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31728 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31729 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31730 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31731 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31732 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31733 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31734 .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ },
31735 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31736 .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ },
31737 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31738 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31739 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31740 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31741 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31742 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31743 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31744 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31745 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31746 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31747 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31748 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31749 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31750 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31751 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31752 .{ ._, ._c, .st, ._, ._, ._, ._ },
31753 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31754 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31755 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31756 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31757 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31758 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31759 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31760 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31761 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31762 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31763 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
31764 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31765 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31766 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31767 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
31768 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
31769 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
31770 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31771 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
31772 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
31773 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31774 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31775 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31776 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31777 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
31778 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
31779 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31780 } },
31781 }, .{
31782 .required_features = .{ .@"64bit", .cmov, null, null },
31783 .src_constraints = .{
31784 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
31785 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
31786 .any,
31787 },
31788 .patterns = &.{
31789 .{ .src = .{ .to_mem, .to_mem, .none } },
31790 },
31791 .extra_temps = .{
31792 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31793 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31794 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
31795 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31796 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31797 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31798 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31799 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
31800 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31801 .{ .type = .u64, .kind = .{ .reg = .rax } },
31802 .{ .type = .u64, .kind = .{ .reg = .rdx } },
31803 },
31804 .dst_temps = .{ .mem, .{ .cc = .nz } },
31805 .clobbers = .{ .eflags = true },
31806 .each = .{ .once = &.{
31807 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
31808 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
31809 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
31810 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
31811 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
31812 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
31813 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
31814 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
31815 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
31816 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31817 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
31818 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
31819 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
31820 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
31821 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
31822 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
31823 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
31824 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
31825 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31826 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
31827 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
31828 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
31829 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
31830 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
31831 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
31832 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
31833 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
31834 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
31835 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31836 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31837 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
31838 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
31839 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
31840 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
31841 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
31842 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
31843 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
31844 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
31845 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31846 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31847 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31848 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31849 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31850 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31851 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31852 .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ },
31853 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31854 .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ },
31855 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31856 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31857 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31858 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31859 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31860 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31861 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31862 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31863 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31864 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31865 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31866 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31867 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31868 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31869 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31870 .{ ._, ._c, .st, ._, ._, ._, ._ },
31871 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31872 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31873 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31874 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31875 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31876 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31877 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31878 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31879 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31880 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31881 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
31882 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31883 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31884 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31885 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
31886 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
31887 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
31888 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
31889 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
31890 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
31891 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31892 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
31893 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31894 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
31895 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
31896 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
31897 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
31898 } },
31899 }, .{
31900 .required_features = .{ .@"64bit", .slow_incdec, null, null },
31901 .src_constraints = .{
31902 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
31903 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
31904 .any,
31905 },
31906 .patterns = &.{
31907 .{ .src = .{ .to_mem, .to_mem, .none } },
31908 },
31909 .extra_temps = .{
31910 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31911 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31912 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
31913 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31914 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31915 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
31916 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31917 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
31918 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
31919 .{ .type = .u64, .kind = .{ .reg = .rax } },
31920 .{ .type = .u64, .kind = .{ .reg = .rdx } },
31921 },
31922 .dst_temps = .{ .mem, .{ .cc = .nz } },
31923 .clobbers = .{ .eflags = true },
31924 .each = .{ .once = &.{
31925 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
31926 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
31927 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
31928 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
31929 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
31930 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
31931 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
31932 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
31933 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
31934 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31935 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
31936 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
31937 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
31938 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
31939 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
31940 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
31941 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
31942 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
31943 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31944 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
31945 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
31946 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
31947 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
31948 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
31949 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
31950 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
31951 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
31952 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
31953 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31954 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
31955 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
31956 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
31957 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
31958 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
31959 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
31960 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
31961 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
31962 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
31963 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
31964 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
31965 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
31966 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
31967 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
31968 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
31969 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
31970 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31971 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
31972 .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ },
31973 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31974 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
31975 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31976 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31977 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31978 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31979 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31980 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31981 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
31982 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
31983 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
31984 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
31985 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
31986 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
31987 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
31988 .{ ._, ._c, .st, ._, ._, ._, ._ },
31989 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
31990 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31991 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
31992 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
31993 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
31994 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
31995 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
31996 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
31997 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
31998 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
31999 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
32000 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
32001 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
32002 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
32003 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
32004 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
32005 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
32006 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
32007 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
32008 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
32009 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32010 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
32011 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
32012 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
32013 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
32014 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
32015 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
32016 } },
32017 }, .{
32018 .required_features = .{ .@"64bit", null, null, null },
32019 .src_constraints = .{
32020 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
32021 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
32022 .any,
32023 },
32024 .patterns = &.{
32025 .{ .src = .{ .to_mem, .to_mem, .none } },
32026 },
32027 .extra_temps = .{
32028 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32029 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32030 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32031 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32032 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32033 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32034 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32035 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32036 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32037 .{ .type = .u64, .kind = .{ .reg = .rax } },
32038 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32039 },
32040 .dst_temps = .{ .mem, .{ .cc = .nz } },
32041 .clobbers = .{ .eflags = true },
32042 .each = .{ .once = &.{
32043 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32044 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
32045 .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ },
32046 .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ },
32047 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32048 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
32049 .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ },
32050 .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32051 .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32052 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
32053 .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ },
32054 .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ },
32055 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32056 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ },
32057 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32058 .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ },
32059 .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ },
32060 .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ },
32061 .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
32062 .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ },
32063 .{ ._, ._, .mul, .tmp6q, ._, ._, ._ },
32064 .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ },
32065 .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ },
32066 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ },
32067 .{ ._, ._c, .in, .tmp5p, ._, ._, ._ },
32068 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32069 .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ },
32070 .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ },
32071 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32072 .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ },
32073 .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ },
32074 .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ },
32075 .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ },
32076 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
32077 .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ },
32078 .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ },
32079 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
32080 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
32081 .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ },
32082 .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32083 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32084 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
32085 .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ },
32086 .{ ._, ._e, .j, .@"1f", ._, ._, ._ },
32087 .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ },
32088 .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
32089 .{ ._, ._z, .j, .@"0f", ._, ._, ._ },
32090 .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ },
32091 .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ },
32092 .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ },
32093 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
32094 .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
32095 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
32096 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
32097 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
32098 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
32099 .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ },
32100 .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ },
32101 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
32102 .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ },
32103 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32104 .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ },
32105 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
32106 .{ ._, ._c, .st, ._, ._, ._, ._ },
32107 .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ },
32108 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
32109 .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ },
32110 .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
32111 .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ },
32112 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ },
32113 .{ ._, ._c, .in, .tmp0q, ._, ._, ._ },
32114 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
32115 .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ },
32116 .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ },
32117 .{ ._, ._o, .set, .tmp7b, ._, ._, ._ },
32118 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
32119 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
32120 .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ },
32121 .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ },
32122 .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ },
32123 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ },
32124 .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ },
32125 .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ },
32126 .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ },
32127 .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32128 .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ },
32129 .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
32130 .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ },
32131 .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ },
32132 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
32133 .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ },
32134 } },
32135 }, .{
32136 .required_features = .{ .@"64bit", .bmi2, .adx, null },
32137 .src_constraints = .{
32138 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32139 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32140 .any,
32141 },
32142 .patterns = &.{
32143 .{ .src = .{ .to_mem, .to_mem, .none } },
32144 },
32145 .extra_temps = .{
32146 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32147 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32148 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32149 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32150 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32151 .{ .type = .isize, .kind = .{ .reg = .rcx } },
32152 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32153 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32154 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32155 .unused,
32156 .unused,
32157 },
32158 .dst_temps = .{ .mem, .{ .cc = .nz } },
32159 .clobbers = .{ .eflags = true },
32160 .each = .{ .once = &.{
32161 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
32162 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
32163 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32164 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
32165 .{ .@"0:", ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32166 .{ ._, ._, .@"or", .tmp4q, .memi(.src0q, .tmp0), ._, ._ },
32167 .{ ._, ._z, .j, .@"2f", ._, ._, ._ },
32168 .{ ._, ._, .lea, .tmp5p, .leaad(.tmp0, .sub_src0_size, 8), ._, ._ },
32169 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32170 .{ .@"1:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp1q, .tmp5), ._ },
32171 .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ },
32172 .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_size, -8), .tmp7q, ._, ._ },
32173 .{ ._, ._rcxz, .j, .@"1f", ._, ._, ._ },
32174 .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_size), ._, ._ },
32175 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32176 .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ },
32177 .{ ._, ._mp, .j, .@"1b", ._, ._, ._ },
32178 .{ .@"2:", ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ },
32179 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32180 .{ .@"1:", ._, .mov, .tmp4d, .tmp0d, ._, ._ },
32181 .{ ._, ._x, .ado, .tmp8q, .tmp3q, ._, ._ },
32182 .{ ._, ._x, .adc, .tmp8q, .tmp3q, ._, ._ },
32183 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32184 .{ .@"1:", ._, .@"or", .tmp8q, .leaid(.tmp1q, .tmp4, 8), ._, ._ },
32185 .{ .@"2:", ._, .sub, .tmp4d, .si(8), ._, ._ },
32186 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32187 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
32188 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32189 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
32190 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32191 .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ },
32192 } },
32193 }, .{
32194 .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null },
32195 .src_constraints = .{
32196 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32197 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32198 .any,
32199 },
32200 .patterns = &.{
32201 .{ .src = .{ .to_mem, .to_mem, .none } },
32202 },
32203 .extra_temps = .{
32204 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32205 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32206 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32207 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32208 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32209 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32210 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32211 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32212 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32213 .unused,
32214 .unused,
32215 },
32216 .dst_temps = .{ .mem, .{ .cc = .nz } },
32217 .clobbers = .{ .eflags = true },
32218 .each = .{ .once = &.{
32219 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32220 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32221 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32222 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32223 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32224 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32225 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32226 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32227 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32228 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32229 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32230 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32231 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32232 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32233 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32234 .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ },
32235 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32236 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32237 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32238 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32239 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32240 .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ },
32241 .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ },
32242 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32243 .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32244 .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ },
32245 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32246 .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ },
32247 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32248 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
32249 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32250 .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ },
32251 } },
32252 }, .{
32253 .required_features = .{ .@"64bit", .bmi2, null, null },
32254 .src_constraints = .{
32255 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32256 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32257 .any,
32258 },
32259 .patterns = &.{
32260 .{ .src = .{ .to_mem, .to_mem, .none } },
32261 },
32262 .extra_temps = .{
32263 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32264 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32265 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32266 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32267 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32268 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32269 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32270 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32271 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32272 .unused,
32273 .unused,
32274 },
32275 .dst_temps = .{ .mem, .{ .cc = .nz } },
32276 .clobbers = .{ .eflags = true },
32277 .each = .{ .once = &.{
32278 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32279 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32280 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32281 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32282 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32283 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32284 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32285 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32286 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32287 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32288 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32289 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32290 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32291 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32292 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32293 .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ },
32294 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32295 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32296 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32297 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32298 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32299 .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ },
32300 .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ },
32301 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32302 .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32303 .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ },
32304 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
32305 .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ },
32306 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32307 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
32308 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
32309 .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ },
32310 } },
32311 }, .{
32312 .required_features = .{ .@"64bit", .slow_incdec, null, null },
32313 .src_constraints = .{
32314 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32315 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32316 .any,
32317 },
32318 .patterns = &.{
32319 .{ .src = .{ .to_mem, .to_mem, .none } },
32320 },
32321 .extra_temps = .{
32322 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32323 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32324 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32325 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32326 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32327 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32328 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32329 .{ .type = .u64, .kind = .{ .reg = .rax } },
32330 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32331 .unused,
32332 .unused,
32333 },
32334 .dst_temps = .{ .mem, .{ .cc = .nz } },
32335 .clobbers = .{ .eflags = true },
32336 .each = .{ .once = &.{
32337 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32338 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32339 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32340 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32341 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32342 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32343 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32344 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32345 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32346 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32347 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32348 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32349 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32350 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32351 .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ },
32352 .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ },
32353 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32354 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32355 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32356 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32357 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32358 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32359 .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ },
32360 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32361 .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32362 .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ },
32363 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32364 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
32365 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32366 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
32367 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32368 .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ },
32369 } },
32370 }, .{
32371 .required_features = .{ .@"64bit", null, null, null },
32372 .src_constraints = .{
32373 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32374 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
32375 .any,
32376 },
32377 .patterns = &.{
32378 .{ .src = .{ .to_mem, .to_mem, .none } },
32379 },
32380 .extra_temps = .{
32381 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32382 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32383 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32384 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32385 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32386 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32387 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32388 .{ .type = .u64, .kind = .{ .reg = .rax } },
32389 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32390 .unused,
32391 .unused,
32392 },
32393 .dst_temps = .{ .mem, .{ .cc = .nz } },
32394 .clobbers = .{ .eflags = true },
32395 .each = .{ .once = &.{
32396 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32397 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32398 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32399 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32400 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32401 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32402 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32403 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32404 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32405 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32406 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32407 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32408 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32409 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32410 .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ },
32411 .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ },
32412 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32413 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32414 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32415 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32416 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32417 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32418 .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ },
32419 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32420 .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32421 .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ },
32422 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
32423 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
32424 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32425 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
32426 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
32427 .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ },
32428 } },
32429 }, .{
32430 .required_features = .{ .@"64bit", .bmi2, .adx, null },
32431 .src_constraints = .{
32432 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32433 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32434 .any,
32435 },
32436 .patterns = &.{
32437 .{ .src = .{ .to_mem, .to_mem, .none } },
32438 },
32439 .extra_temps = .{
32440 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32441 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32442 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32443 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32444 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32445 .{ .type = .isize, .kind = .{ .reg = .rcx } },
32446 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32447 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32448 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32449 .unused,
32450 .unused,
32451 },
32452 .dst_temps = .{ .mem, .{ .cc = .nz } },
32453 .clobbers = .{ .eflags = true },
32454 .each = .{ .once = &.{
32455 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
32456 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
32457 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32458 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
32459 .{ .@"0:", ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32460 .{ ._, ._, .@"or", .tmp4q, .memi(.src0q, .tmp0), ._, ._ },
32461 .{ ._, ._z, .j, .@"2f", ._, ._, ._ },
32462 .{ ._, ._, .lea, .tmp5p, .leaad(.tmp0, .sub_src0_size, 8), ._, ._ },
32463 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32464 .{ .@"1:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp1q, .tmp5), ._ },
32465 .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ },
32466 .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_size, -8), .tmp7q, ._, ._ },
32467 .{ ._, ._rcxz, .j, .@"1f", ._, ._, ._ },
32468 .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_size), ._, ._ },
32469 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32470 .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ },
32471 .{ ._, ._mp, .j, .@"1b", ._, ._, ._ },
32472 .{ .@"2:", ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ },
32473 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32474 .{ .@"1:", ._, .mov, .tmp4d, .tmp0d, ._, ._ },
32475 .{ ._, ._x, .ado, .tmp8q, .tmp3q, ._, ._ },
32476 .{ ._, ._x, .adc, .tmp8q, .tmp3q, ._, ._ },
32477 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32478 .{ .@"1:", ._, .@"or", .tmp8q, .leai(.tmp1q, .tmp4), ._, ._ },
32479 .{ .@"2:", ._, .sub, .tmp4d, .si(8), ._, ._ },
32480 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32481 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
32482 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32483 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
32484 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32485 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32486 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32487 } },
32488 }, .{
32489 .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null },
32490 .src_constraints = .{
32491 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32492 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32493 .any,
32494 },
32495 .patterns = &.{
32496 .{ .src = .{ .to_mem, .to_mem, .none } },
32497 },
32498 .extra_temps = .{
32499 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32500 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32501 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32502 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32503 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32504 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32505 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32506 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32507 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32508 .unused,
32509 .unused,
32510 },
32511 .dst_temps = .{ .mem, .{ .cc = .nz } },
32512 .clobbers = .{ .eflags = true },
32513 .each = .{ .once = &.{
32514 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32515 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32516 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32517 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32518 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32519 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32520 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32521 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32522 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32523 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32524 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32525 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32526 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32527 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32528 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32529 .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ },
32530 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32531 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32532 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32533 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32534 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32535 .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ },
32536 .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ },
32537 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32538 .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32539 .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ },
32540 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32541 .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ },
32542 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32543 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
32544 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32545 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32546 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32547 } },
32548 }, .{
32549 .required_features = .{ .@"64bit", .bmi2, null, null },
32550 .src_constraints = .{
32551 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32552 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32553 .any,
32554 },
32555 .patterns = &.{
32556 .{ .src = .{ .to_mem, .to_mem, .none } },
32557 },
32558 .extra_temps = .{
32559 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32560 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32561 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32562 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32563 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32564 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32565 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32566 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32567 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32568 .unused,
32569 .unused,
32570 },
32571 .dst_temps = .{ .mem, .{ .cc = .nz } },
32572 .clobbers = .{ .eflags = true },
32573 .each = .{ .once = &.{
32574 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32575 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32576 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32577 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32578 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32579 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32580 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32581 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32582 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32583 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32584 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32585 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32586 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32587 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32588 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32589 .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ },
32590 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32591 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32592 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32593 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32594 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32595 .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ },
32596 .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ },
32597 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32598 .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32599 .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ },
32600 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
32601 .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ },
32602 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32603 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
32604 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
32605 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32606 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32607 } },
32608 }, .{
32609 .required_features = .{ .@"64bit", .slow_incdec, null, null },
32610 .src_constraints = .{
32611 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32612 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32613 .any,
32614 },
32615 .patterns = &.{
32616 .{ .src = .{ .to_mem, .to_mem, .none } },
32617 },
32618 .extra_temps = .{
32619 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32620 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32621 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32622 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32623 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32624 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32625 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32626 .{ .type = .u64, .kind = .{ .reg = .rax } },
32627 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32628 .unused,
32629 .unused,
32630 },
32631 .dst_temps = .{ .mem, .{ .cc = .nz } },
32632 .clobbers = .{ .eflags = true },
32633 .each = .{ .once = &.{
32634 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32635 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32636 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32637 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32638 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32639 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32640 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32641 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32642 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32643 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32644 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32645 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32646 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32647 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32648 .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ },
32649 .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ },
32650 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32651 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32652 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32653 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32654 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32655 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32656 .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ },
32657 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32658 .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32659 .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ },
32660 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32661 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
32662 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32663 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
32664 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32665 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32666 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32667 } },
32668 }, .{
32669 .required_features = .{ .@"64bit", null, null, null },
32670 .src_constraints = .{
32671 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32672 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32673 .any,
32674 },
32675 .patterns = &.{
32676 .{ .src = .{ .to_mem, .to_mem, .none } },
32677 },
32678 .extra_temps = .{
32679 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32680 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32681 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32682 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32683 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32684 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32685 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32686 .{ .type = .u64, .kind = .{ .reg = .rax } },
32687 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32688 .unused,
32689 .unused,
32690 },
32691 .dst_temps = .{ .mem, .{ .cc = .nz } },
32692 .clobbers = .{ .eflags = true },
32693 .each = .{ .once = &.{
32694 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32695 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32696 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32697 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32698 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32699 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32700 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32701 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32702 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32703 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32704 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32705 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32706 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32707 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32708 .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ },
32709 .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ },
32710 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32711 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32712 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32713 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32714 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32715 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32716 .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ },
32717 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32718 .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32719 .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ },
32720 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
32721 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
32722 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32723 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
32724 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
32725 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32726 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32727 } },
32728 }, .{
32729 .required_features = .{ .@"64bit", .bmi2, .adx, null },
32730 .src_constraints = .{
32731 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32732 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32733 .any,
32734 },
32735 .patterns = &.{
32736 .{ .src = .{ .to_mem, .to_mem, .none } },
32737 },
32738 .extra_temps = .{
32739 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32740 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32741 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32742 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32743 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32744 .{ .type = .isize, .kind = .{ .reg = .rcx } },
32745 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32746 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32747 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32748 .unused,
32749 .unused,
32750 },
32751 .dst_temps = .{ .mem, .{ .cc = .nz } },
32752 .clobbers = .{ .eflags = true },
32753 .each = .{ .once = &.{
32754 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
32755 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
32756 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32757 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
32758 .{ .@"0:", ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32759 .{ ._, ._, .@"or", .tmp4q, .memi(.src0q, .tmp0), ._, ._ },
32760 .{ ._, ._z, .j, .@"2f", ._, ._, ._ },
32761 .{ ._, ._, .lea, .tmp5p, .leaad(.tmp0, .sub_src0_size, 8), ._, ._ },
32762 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32763 .{ .@"1:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp1q, .tmp5), ._ },
32764 .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ },
32765 .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_size, -8), .tmp7q, ._, ._ },
32766 .{ ._, ._rcxz, .j, .@"1f", ._, ._, ._ },
32767 .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_size), ._, ._ },
32768 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32769 .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ },
32770 .{ ._, ._mp, .j, .@"1b", ._, ._, ._ },
32771 .{ .@"2:", ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ },
32772 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32773 .{ .@"1:", ._, .mov, .tmp4d, .tmp0d, ._, ._ },
32774 .{ ._, ._x, .ado, .tmp8q, .tmp3q, ._, ._ },
32775 .{ ._, ._x, .adc, .tmp8q, .tmp3q, ._, ._ },
32776 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32777 .{ .@"1:", ._, .@"or", .tmp8q, .leai(.tmp1q, .tmp4), ._, ._ },
32778 .{ .@"2:", ._, .sub, .tmp4d, .si(8), ._, ._ },
32779 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32780 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
32781 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32782 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
32783 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32784 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
32785 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
32786 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32787 .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ },
32788 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
32789 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
32790 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
32791 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32792 } },
32793 }, .{
32794 .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null },
32795 .src_constraints = .{
32796 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32797 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32798 .any,
32799 },
32800 .patterns = &.{
32801 .{ .src = .{ .to_mem, .to_mem, .none } },
32802 },
32803 .extra_temps = .{
32804 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32805 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32806 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32807 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32808 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32809 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32810 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32811 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32812 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32813 .unused,
32814 .unused,
32815 },
32816 .dst_temps = .{ .mem, .{ .cc = .nz } },
32817 .clobbers = .{ .eflags = true },
32818 .each = .{ .once = &.{
32819 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32820 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32821 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32822 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32823 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32824 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32825 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32826 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32827 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32828 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32829 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32830 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32831 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32832 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32833 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32834 .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ },
32835 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32836 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32837 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32838 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32839 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32840 .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ },
32841 .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ },
32842 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32843 .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32844 .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ },
32845 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32846 .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ },
32847 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32848 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
32849 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32850 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
32851 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
32852 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32853 .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ },
32854 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
32855 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
32856 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
32857 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32858 } },
32859 }, .{
32860 .required_features = .{ .@"64bit", .bmi2, null, null },
32861 .src_constraints = .{
32862 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32863 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32864 .any,
32865 },
32866 .patterns = &.{
32867 .{ .src = .{ .to_mem, .to_mem, .none } },
32868 },
32869 .extra_temps = .{
32870 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32871 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32872 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32873 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32874 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32875 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32876 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32877 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32878 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32879 .unused,
32880 .unused,
32881 },
32882 .dst_temps = .{ .mem, .{ .cc = .nz } },
32883 .clobbers = .{ .eflags = true },
32884 .each = .{ .once = &.{
32885 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32886 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32887 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32888 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32889 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32890 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32891 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32892 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32893 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32894 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32895 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32896 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32897 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32898 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32899 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32900 .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ },
32901 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32902 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32903 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32904 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32905 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32906 .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ },
32907 .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ },
32908 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32909 .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32910 .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ },
32911 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
32912 .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ },
32913 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32914 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
32915 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
32916 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
32917 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
32918 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32919 .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ },
32920 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
32921 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
32922 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
32923 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32924 } },
32925 }, .{
32926 .required_features = .{ .@"64bit", .slow_incdec, null, null },
32927 .src_constraints = .{
32928 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32929 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32930 .any,
32931 },
32932 .patterns = &.{
32933 .{ .src = .{ .to_mem, .to_mem, .none } },
32934 },
32935 .extra_temps = .{
32936 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32937 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32938 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32939 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
32940 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32941 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32942 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
32943 .{ .type = .u64, .kind = .{ .reg = .rax } },
32944 .{ .type = .u64, .kind = .{ .reg = .rdx } },
32945 .unused,
32946 .unused,
32947 },
32948 .dst_temps = .{ .mem, .{ .cc = .nz } },
32949 .clobbers = .{ .eflags = true },
32950 .each = .{ .once = &.{
32951 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
32952 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
32953 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
32954 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
32955 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
32956 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
32957 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
32958 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
32959 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
32960 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
32961 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
32962 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
32963 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
32964 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
32965 .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ },
32966 .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ },
32967 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
32968 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
32969 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
32970 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
32971 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
32972 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
32973 .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ },
32974 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
32975 .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
32976 .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ },
32977 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
32978 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
32979 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
32980 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
32981 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
32982 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
32983 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
32984 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
32985 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
32986 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
32987 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
32988 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
32989 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
32990 } },
32991 }, .{
32992 .required_features = .{ .@"64bit", null, null, null },
32993 .src_constraints = .{
32994 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32995 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
32996 .any,
32997 },
32998 .patterns = &.{
32999 .{ .src = .{ .to_mem, .to_mem, .none } },
33000 },
33001 .extra_temps = .{
33002 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33003 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33004 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33005 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33006 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33007 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
33008 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33009 .{ .type = .u64, .kind = .{ .reg = .rax } },
33010 .{ .type = .u64, .kind = .{ .reg = .rdx } },
33011 .unused,
33012 .unused,
33013 },
33014 .dst_temps = .{ .mem, .{ .cc = .nz } },
33015 .clobbers = .{ .eflags = true },
33016 .each = .{ .once = &.{
33017 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
33018 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
33019 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
33020 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
33021 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
33022 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
33023 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
33024 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
33025 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
33026 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
33027 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
33028 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
33029 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
33030 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
33031 .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ },
33032 .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ },
33033 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
33034 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
33035 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
33036 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
33037 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
33038 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
33039 .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ },
33040 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
33041 .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
33042 .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ },
33043 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
33044 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
33045 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
33046 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
33047 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
33048 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
33049 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ },
33050 .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
33051 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33052 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33053 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ },
33054 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
33055 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ },
33056 } },
33057 }, .{
33058 .required_features = .{ .@"64bit", .bmi2, .adx, null },
33059 .src_constraints = .{
33060 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33061 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33062 .any,
33063 },
33064 .patterns = &.{
33065 .{ .src = .{ .to_mem, .to_mem, .none } },
33066 },
33067 .extra_temps = .{
33068 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33069 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33070 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33071 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33072 .{ .type = .u64, .kind = .{ .reg = .rdx } },
33073 .{ .type = .isize, .kind = .{ .reg = .rcx } },
33074 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33075 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33076 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33077 .unused,
33078 .unused,
33079 },
33080 .dst_temps = .{ .mem, .{ .cc = .nz } },
33081 .clobbers = .{ .eflags = true },
33082 .each = .{ .once = &.{
33083 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
33084 .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ },
33085 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
33086 .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ },
33087 .{ .@"0:", ._, .xor, .tmp4d, .tmp4d, ._, ._ },
33088 .{ ._, ._, .@"or", .tmp4q, .memi(.src0q, .tmp0), ._, ._ },
33089 .{ ._, ._z, .j, .@"2f", ._, ._, ._ },
33090 .{ ._, ._, .lea, .tmp5p, .leaad(.tmp0, .sub_src0_size, 8), ._, ._ },
33091 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
33092 .{ .@"1:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp1q, .tmp5), ._ },
33093 .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ },
33094 .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_size, -8), .tmp7q, ._, ._ },
33095 .{ ._, ._rcxz, .j, .@"1f", ._, ._, ._ },
33096 .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_size), ._, ._ },
33097 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
33098 .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ },
33099 .{ ._, ._mp, .j, .@"1b", ._, ._, ._ },
33100 .{ .@"2:", ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ },
33101 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
33102 .{ .@"1:", ._, .mov, .tmp4d, .tmp0d, ._, ._ },
33103 .{ ._, ._x, .ado, .tmp8q, .tmp3q, ._, ._ },
33104 .{ ._, ._x, .adc, .tmp8q, .tmp3q, ._, ._ },
33105 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
33106 .{ .@"1:", ._, .@"or", .tmp8q, .leai(.tmp1q, .tmp4), ._, ._ },
33107 .{ .@"2:", ._, .sub, .tmp4d, .si(8), ._, ._ },
33108 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
33109 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
33110 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
33111 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
33112 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
33113 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33114 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
33115 .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ },
33116 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33117 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
33118 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
33119 } },
33120 }, .{
33121 .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null },
33122 .src_constraints = .{
33123 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33124 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33125 .any,
33126 },
33127 .patterns = &.{
33128 .{ .src = .{ .to_mem, .to_mem, .none } },
33129 },
33130 .extra_temps = .{
33131 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33132 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33133 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33134 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33135 .{ .type = .u64, .kind = .{ .reg = .rdx } },
33136 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
33137 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33138 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33139 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33140 .unused,
33141 .unused,
33142 },
33143 .dst_temps = .{ .mem, .{ .cc = .nz } },
33144 .clobbers = .{ .eflags = true },
33145 .each = .{ .once = &.{
33146 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
33147 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
33148 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
33149 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
33150 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
33151 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
33152 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
33153 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
33154 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
33155 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
33156 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
33157 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
33158 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
33159 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
33160 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
33161 .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ },
33162 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
33163 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
33164 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
33165 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
33166 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
33167 .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ },
33168 .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ },
33169 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
33170 .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
33171 .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ },
33172 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
33173 .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ },
33174 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
33175 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
33176 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
33177 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33178 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
33179 .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ },
33180 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33181 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
33182 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
33183 } },
33184 }, .{
33185 .required_features = .{ .@"64bit", .bmi2, null, null },
33186 .src_constraints = .{
33187 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33188 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33189 .any,
33190 },
33191 .patterns = &.{
33192 .{ .src = .{ .to_mem, .to_mem, .none } },
33193 },
33194 .extra_temps = .{
33195 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33196 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33197 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33198 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33199 .{ .type = .u64, .kind = .{ .reg = .rdx } },
33200 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
33201 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33202 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33203 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33204 .unused,
33205 .unused,
33206 },
33207 .dst_temps = .{ .mem, .{ .cc = .nz } },
33208 .clobbers = .{ .eflags = true },
33209 .each = .{ .once = &.{
33210 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
33211 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
33212 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
33213 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
33214 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
33215 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
33216 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
33217 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
33218 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
33219 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
33220 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
33221 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
33222 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
33223 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
33224 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
33225 .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ },
33226 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
33227 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
33228 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
33229 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
33230 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
33231 .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ },
33232 .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ },
33233 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
33234 .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
33235 .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ },
33236 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
33237 .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ },
33238 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
33239 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
33240 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
33241 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33242 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
33243 .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ },
33244 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33245 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
33246 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
33247 } },
33248 }, .{
33249 .required_features = .{ .@"64bit", .slow_incdec, null, null },
33250 .src_constraints = .{
33251 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33252 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33253 .any,
33254 },
33255 .patterns = &.{
33256 .{ .src = .{ .to_mem, .to_mem, .none } },
33257 },
33258 .extra_temps = .{
33259 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33260 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33261 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33262 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33263 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33264 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
33265 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33266 .{ .type = .u64, .kind = .{ .reg = .rax } },
33267 .{ .type = .u64, .kind = .{ .reg = .rdx } },
33268 .unused,
33269 .unused,
33270 },
33271 .dst_temps = .{ .mem, .{ .cc = .nz } },
33272 .clobbers = .{ .eflags = true },
33273 .each = .{ .once = &.{
33274 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
33275 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
33276 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
33277 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
33278 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
33279 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
33280 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
33281 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
33282 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
33283 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
33284 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
33285 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
33286 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
33287 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
33288 .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ },
33289 .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ },
33290 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
33291 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
33292 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
33293 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
33294 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
33295 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
33296 .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ },
33297 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
33298 .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
33299 .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ },
33300 .{ ._, ._ae, .j, .@"1b", ._, ._, ._ },
33301 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
33302 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
33303 .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ },
33304 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
33305 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
33306 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
33307 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33308 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33309 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
33310 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
33311 } },
33312 }, .{
33313 .required_features = .{ .@"64bit", null, null, null },
33314 .src_constraints = .{
33315 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33316 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
33317 .any,
33318 },
33319 .patterns = &.{
33320 .{ .src = .{ .to_mem, .to_mem, .none } },
33321 },
33322 .extra_temps = .{
33323 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33324 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33325 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33326 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
33327 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33328 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
33329 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33330 .{ .type = .u64, .kind = .{ .reg = .rax } },
33331 .{ .type = .u64, .kind = .{ .reg = .rdx } },
33332 .unused,
33333 .unused,
33334 },
33335 .dst_temps = .{ .mem, .{ .cc = .nz } },
33336 .clobbers = .{ .eflags = true },
33337 .each = .{ .once = &.{
33338 .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
33339 .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ },
33340 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
33341 .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ },
33342 .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ },
33343 .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ },
33344 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
33345 .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ },
33346 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
33347 .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ },
33348 .{ ._, ._mp, .j, .@"3f", ._, ._, ._ },
33349 .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ },
33350 .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ },
33351 .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ },
33352 .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ },
33353 .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ },
33354 .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ },
33355 .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ },
33356 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ },
33357 .{ ._, ._c, .in, .tmp3p, ._, ._, ._ },
33358 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
33359 .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ },
33360 .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ },
33361 .{ ._, ._mp, .j, .@"2f", ._, ._, ._ },
33362 .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ },
33363 .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ },
33364 .{ ._, ._ns, .j, .@"1b", ._, ._, ._ },
33365 .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ },
33366 .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
33367 .{ ._, ._c, .de, .tmp0d, ._, ._, ._ },
33368 .{ ._, ._ns, .j, .@"0b", ._, ._, ._ },
33369 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
33370 .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ },
33371 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33372 .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ },
33373 .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ },
33374 .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ },
33375 } },
33376 } }) catch |err| switch (err) {
33377 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
33378 @tagName(air_tag),
33379 ty_pl.ty.toType().fmt(pt),
33380 ops[0].tracking(cg),
33381 ops[1].tracking(cg),
33382 }),
33383 else => |e| return e,
33384 };
33385 try res[0].withOverflow(&res[1], cg);
33386 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
33387 },
2802233388 .alloc => if (use_old) try cg.airAlloc(inst) else {
2802333389 const ty = air_datas[@intFromEnum(inst)].ty;
2802433390 const slot = try cg.tempInit(ty, .{ .lea_frame = .{
......@@ -97522,9 +102888,6 @@ fn lowerSwitchBr(
97522102888 const relocs = try allocator.alloc(Mir.Inst.Index, case.items.len + case.ranges.len);
97523102889 defer allocator.free(relocs);
97524102890
97525 var cond_temp = try cg.tempInit(condition_ty, condition);
97526 const reset_index = cg.next_temp_index;
97527
97528102891 try cg.spillEflagsIfOccupied();
97529102892 for (case.items, relocs[0..case.items.len]) |item, *reloc| {
97530102893 const item_mcv = try cg.resolveInst(item);
......@@ -97535,6 +102898,7 @@ fn lowerSwitchBr(
97535102898 else => unreachable,
97536102899 },
97537102900 else => cc: {
102901 var cond_temp = try cg.tempInit(condition_ty, condition);
97538102902 var item_temp = try cg.tempInit(condition_ty, item_mcv);
97539102903 const cc_temp = cond_temp.cmpInts(.eq, &item_temp, cg) catch |err| switch (err) {
97540102904 error.SelectFailed => unreachable,
......@@ -97543,7 +102907,8 @@ fn lowerSwitchBr(
97543102907 try item_temp.die(cg);
97544102908 const cc = cc_temp.tracking(cg).short.eflags;
97545102909 try cc_temp.die(cg);
97546 try cg.resetTemps(reset_index);
102910 try cond_temp.die(cg);
102911 try cg.resetTemps(@enumFromInt(0));
97547102912 break :cc cc;
97548102913 },
97549102914 };
......@@ -97551,6 +102916,7 @@ fn lowerSwitchBr(
97551102916 }
97552102917
97553102918 for (case.ranges, relocs[case.items.len..]) |range, *reloc| {
102919 var cond_temp = try cg.tempInit(condition_ty, condition);
97554102920 const min_mcv = try cg.resolveInst(range[0]);
97555102921 const max_mcv = try cg.resolveInst(range[1]);
97556102922 // `null` means always false.
......@@ -97594,7 +102960,8 @@ fn lowerSwitchBr(
97594102960 break :cc cc;
97595102961 },
97596102962 };
97597 try cg.resetTemps(reset_index);
102963 try cond_temp.die(cg);
102964 try cg.resetTemps(@enumFromInt(0));
97598102965 // "Success" case is in `reloc`....
97599102966 if (lte_max) |cc| {
97600102967 reloc.* = try cg.asmJccReloc(cc, undefined);
......@@ -97605,8 +102972,6 @@ fn lowerSwitchBr(
97605102972 if (lt_min_reloc) |r| cg.performReloc(r);
97606102973 }
97607102974
97608 try cond_temp.die(cg);
97609 try cg.resetTemps(@enumFromInt(0));
97610102975 cg.checkInvariantsAfterAirInst();
97611102976
97612102977 // The jump to skip this case if the conditions all failed.
......@@ -97813,6 +103178,19 @@ fn performReloc(self: *CodeGen, reloc: Mir.Inst.Index) void {
97813103178 .pseudo_j_z_and_np_inst, .pseudo_j_nz_or_p_inst => {},
97814103179 else => unreachable,
97815103180 },
103181 .lea => switch (self.mir_instructions.items(.ops)[reloc]) {
103182 .rm => {
103183 const rx = self.mir_instructions.items(.data)[reloc].rx;
103184 assert(rx.fixes == ._);
103185 const mem_info: Mir.Memory.Info = @bitCast(
103186 self.mir_extra.items[rx.payload + std.meta.fieldIndex(Mir.Memory, "info").?],
103187 );
103188 assert(mem_info.base == .rip_inst);
103189 self.mir_extra.items[rx.payload + std.meta.fieldIndex(Mir.Memory, "base").?] = next_inst;
103190 return;
103191 },
103192 else => unreachable,
103193 },
97816103194 else => unreachable,
97817103195 }
97818103196 self.mir_instructions.items(.data)[reloc].inst.inst = next_inst;
......@@ -98096,7 +103474,10 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
98096103474 // for the string, we still use the next u32 for the null terminator.
98097103475 extra_i += clobber.len / 4 + 1;
98098103476
98099 if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory")) {
103477 if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory") or
103478 std.mem.eql(u8, clobber, "fpsr") or std.mem.eql(u8, clobber, "fpcr") or
103479 std.mem.eql(u8, clobber, "mxcsr") or std.mem.eql(u8, clobber, "dirflag"))
103480 {
98100103481 // ok, sure
98101103482 } else if (std.mem.eql(u8, clobber, "cc") or
98102103483 std.mem.eql(u8, clobber, "flags") or
......@@ -98361,7 +103742,24 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
98361103742 else
98362103743 .@"1";
98363103744 if (sib_it.next()) |_| return self.fail("invalid memory operand: '{s}'", .{op_str});
98364 op.* = if (std.mem.eql(u8, base_str, "%%dx") and index_str.len == 0) .{ .reg = .dx } else .{ .mem = .{
103745 op.* = if (std.mem.eql(u8, base_str, "%%dx") and index_str.len == 0)
103746 .{ .reg = .dx }
103747 else if (std.mem.eql(u8, base_str, "%%rip") and index_str.len == 0 and
103748 Label.isValid(.reference, op_str[0..open]))
103749 op: {
103750 const anon = std.ascii.isDigit(op_str[0]);
103751 const label_gop = try labels.getOrPut(self.gpa, op_str[0..if (anon) 1 else open]);
103752 if (anon and (op_str[1] == 'b' or op_str[1] == 'B') and !label_gop.found_existing)
103753 return self.fail("undefined label: '{s}'", .{op_str});
103754 if (!label_gop.found_existing) label_gop.value_ptr.* = .{};
103755 const pending_relocs = &label_gop.value_ptr.pending_relocs;
103756 if (if (anon)
103757 op_str[1] == 'f' or op_str[1] == 'F'
103758 else
103759 !label_gop.found_existing or pending_relocs.items.len > 0)
103760 try pending_relocs.append(self.gpa, @intCast(self.mir_instructions.len));
103761 break :op .{ .mem = .{ .base = .{ .rip_inst = label_gop.value_ptr.target } } };
103762 } else .{ .mem = .{
98365103763 .base = if (base_str.len > 0)
98366103764 .{ .reg = parseRegName(base_str["%%".len..]) orelse
98367103765 return self.fail("invalid base register: '{s}'", .{base_str}) }
......@@ -98405,9 +103803,9 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
98405103803 } else if (Label.isValid(.reference, op_str)) {
98406103804 const anon = std.ascii.isDigit(op_str[0]);
98407103805 const label_gop = try labels.getOrPut(self.gpa, op_str[0..if (anon) 1 else op_str.len]);
98408 if (!label_gop.found_existing) label_gop.value_ptr.* = .{};
98409103806 if (anon and (op_str[1] == 'b' or op_str[1] == 'B') and !label_gop.found_existing)
98410103807 return self.fail("undefined label: '{s}'", .{op_str});
103808 if (!label_gop.found_existing) label_gop.value_ptr.* = .{};
98411103809 const pending_relocs = &label_gop.value_ptr.pending_relocs;
98412103810 if (if (anon)
98413103811 op_str[1] == 'f' or op_str[1] == 'F'
......@@ -99643,7 +105041,7 @@ fn genSetMem(
99643105041 .none => .{ .immediate = @bitCast(@as(i64, disp)) },
99644105042 .reg => |base_reg| .{ .register_offset = .{ .reg = base_reg, .off = disp } },
99645105043 .frame => |base_frame_index| .{ .lea_frame = .{ .index = base_frame_index, .off = disp } },
99646 .table => unreachable,
105044 .table, .rip_inst => unreachable,
99647105045 .reloc => |sym_index| .{ .lea_symbol = .{ .sym_index = sym_index, .off = disp } },
99648105046 };
99649105047 switch (src_mcv) {
......@@ -99753,7 +105151,7 @@ fn genSetMem(
99753105151 .index = frame_index,
99754105152 .off = disp,
99755105153 }).compare(.gte, src_align),
99756 .table => unreachable,
105154 .table, .rip_inst => unreachable,
99757105155 .reloc => false,
99758105156 })).write(
99759105157 self,
......@@ -100402,7 +105800,7 @@ fn airCmpxchg(self: *CodeGen, inst: Air.Inst.Index) !void {
100402105800 const ptr_lock = switch (ptr_mem.base) {
100403105801 .none, .frame, .reloc => null,
100404105802 .reg => |reg| self.register_manager.lockReg(reg),
100405 .table => unreachable,
105803 .table, .rip_inst => unreachable,
100406105804 };
100407105805 defer if (ptr_lock) |lock| self.register_manager.unlockReg(lock);
100408105806
......@@ -100485,7 +105883,7 @@ fn atomicOp(
100485105883 const mem_lock = switch (ptr_mem.base) {
100486105884 .none, .frame, .reloc => null,
100487105885 .reg => |reg| self.register_manager.lockReg(reg),
100488 .table => unreachable,
105886 .table, .rip_inst => unreachable,
100489105887 };
100490105888 defer if (mem_lock) |lock| self.register_manager.unlockReg(lock);
100491105889
......@@ -103624,40 +109022,35 @@ fn resolveInst(self: *CodeGen, ref: Air.Inst.Ref) InnerError!MCValue {
103624109022 // If the type has no codegen bits, no need to store it.
103625109023 if (!ty.hasRuntimeBitsIgnoreComptime(zcu)) return .none;
103626109024
103627 const mcv = if (ref.toIndex()) |inst| mcv: {
109025 const mcv: MCValue = if (ref.toIndex()) |inst| mcv: {
103628109026 break :mcv self.inst_tracking.getPtr(inst).?.short;
103629109027 } else mcv: {
103630 const ip_index = ref.toInterned().?;
103631 const gop = try self.const_tracking.getOrPut(self.gpa, ip_index);
103632 if (!gop.found_existing) gop.value_ptr.* = .init(init: {
103633 const const_mcv = try self.genTypedValue(.fromInterned(ip_index));
103634 switch (const_mcv) {
103635 .lea_tlv => |tlv_sym| switch (self.bin_file.tag) {
103636 .elf, .macho => {
103637 if (self.mod.pic) {
103638 try self.spillRegisters(&.{ .rdi, .rax });
103639 } else {
103640 try self.spillRegisters(&.{.rax});
103641 }
103642 const frame_index = try self.allocFrameIndex(.init(.{
103643 .size = 8,
103644 .alignment = .@"8",
103645 }));
103646 try self.genSetMem(
103647 .{ .frame = frame_index },
103648 0,
103649 .usize,
103650 .{ .lea_symbol = .{ .sym_index = tlv_sym } },
103651 .{},
103652 );
103653 break :init .{ .load_frame = .{ .index = frame_index } };
103654 },
103655 else => break :init const_mcv,
109028 const const_mcv = try self.genTypedValue(.fromInterned(ref.toInterned().?));
109029 switch (const_mcv) {
109030 .lea_tlv => |tlv_sym| switch (self.bin_file.tag) {
109031 .elf, .macho => {
109032 if (self.mod.pic) {
109033 try self.spillRegisters(&.{ .rdi, .rax });
109034 } else {
109035 try self.spillRegisters(&.{.rax});
109036 }
109037 const frame_index = try self.allocFrameIndex(.init(.{
109038 .size = 8,
109039 .alignment = .@"8",
109040 }));
109041 try self.genSetMem(
109042 .{ .frame = frame_index },
109043 0,
109044 .usize,
109045 .{ .lea_symbol = .{ .sym_index = tlv_sym } },
109046 .{},
109047 );
109048 break :mcv .{ .load_frame = .{ .index = frame_index } };
103656109049 },
103657 else => break :init const_mcv,
103658 }
103659 });
103660 break :mcv gop.value_ptr.short;
109050 else => break :mcv const_mcv,
109051 },
109052 else => break :mcv const_mcv,
109053 }
103661109054 };
103662109055
103663109056 switch (mcv) {
......@@ -104205,13 +109598,21 @@ fn memSize(self: *CodeGen, ty: Type) Memory.Size {
104205109598fn splitType(self: *CodeGen, comptime parts_len: usize, ty: Type) ![parts_len]Type {
104206109599 const pt = self.pt;
104207109600 const zcu = pt.zcu;
109601 const ip = &zcu.intern_pool;
104208109602 var parts: [parts_len]Type = undefined;
104209 if (ty.isVector(zcu)) if (std.math.divExact(u32, ty.vectorLen(zcu), parts_len)) |vec_len| return .{
104210 try pt.vectorType(.{ .len = vec_len, .child = ty.scalarType(zcu).toIntern() }),
104211 } ** parts_len else |err| switch (err) {
104212 error.DivisionByZero => unreachable,
104213 error.UnexpectedRemainder => {},
104214 };
109603 switch (ip.indexToKey(ty.toIntern())) {
109604 .vector_type => |vector_type| if (std.math.divExact(u32, vector_type.len, parts_len)) |vec_len| return .{
109605 try pt.vectorType(.{ .len = vec_len, .child = vector_type.child }),
109606 } ** parts_len else |err| switch (err) {
109607 error.DivisionByZero => unreachable,
109608 error.UnexpectedRemainder => {},
109609 },
109610 .tuple_type => |tuple_type| if (tuple_type.types.len == parts_len) {
109611 for (&parts, tuple_type.types.get(ip)) |*part, part_ty| part.* = .fromInterned(part_ty);
109612 return parts;
109613 },
109614 else => {},
109615 }
104215109616 const classes = std.mem.sliceTo(&abi.classifySystemV(ty, zcu, self.target, .other), .none);
104216109617 if (classes.len == parts_len) for (&parts, classes, 0..) |*part, class, part_i| {
104217109618 part.* = switch (class) {
......@@ -104896,6 +110297,52 @@ const Temp = struct {
104896110297 second_temp.* = result_temp;
104897110298 }
104898110299
110300 fn withOverflow(temp: *Temp, overflow_temp: *Temp, cg: *CodeGen) InnerError!void {
110301 const temp_index = temp.unwrap(cg).temp;
110302 const temp_tracking = temp_index.tracking(cg);
110303 const overflow_temp_tracking = overflow_temp.unwrap(cg).temp.tracking(cg);
110304 switch (temp_tracking.short) {
110305 .register => |reg| switch (overflow_temp_tracking.short) {
110306 .eflags => |overflow_cc| {
110307 const result_temp_index = cg.next_temp_index;
110308 const result_temp: Temp = .{ .index = result_temp_index.toIndex() };
110309 assert(cg.reuseTemp(result_temp.index, temp.index, temp_tracking));
110310 assert(cg.reuseTemp(result_temp.index, overflow_temp.index, overflow_temp_tracking));
110311 result_temp_index.tracking(cg).* = .init(.{ .register_overflow = .{ .reg = reg, .eflags = overflow_cc } });
110312 cg.temp_type[@intFromEnum(result_temp_index)] = .slice_const_u8;
110313 cg.next_temp_index = @enumFromInt(@intFromEnum(result_temp_index) + 1);
110314 temp.* = result_temp;
110315 overflow_temp.* = result_temp;
110316 return;
110317 },
110318 .register => |overflow_reg| {
110319 const result_temp_index = cg.next_temp_index;
110320 const result_temp: Temp = .{ .index = result_temp_index.toIndex() };
110321 assert(cg.reuseTemp(result_temp.index, temp.index, temp_tracking));
110322 assert(cg.reuseTemp(result_temp.index, overflow_temp.index, overflow_temp_tracking));
110323 result_temp_index.tracking(cg).* = .init(.{ .register_pair = .{ reg, overflow_reg } });
110324 cg.temp_type[@intFromEnum(result_temp_index)] = .slice_const_u8;
110325 cg.next_temp_index = @enumFromInt(@intFromEnum(result_temp_index) + 1);
110326 temp.* = result_temp;
110327 overflow_temp.* = result_temp;
110328 return;
110329 },
110330 else => {},
110331 },
110332 .load_frame => {
110333 const zcu = cg.pt.zcu;
110334 const ip = &zcu.intern_pool;
110335 const field_tys = ip.indexToKey(temp_index.typeOf(cg).toIntern()).tuple_type.types.get(ip);
110336 try temp.write(overflow_temp, .{ .disp = @intCast(Type.fromInterned(field_tys[0]).abiSize(zcu)) }, cg);
110337 try overflow_temp.die(cg);
110338 overflow_temp.* = temp.*;
110339 return;
110340 },
110341 else => {},
110342 }
110343 std.debug.panic("{s}: {} {}\n", .{ @src().fn_name, temp_tracking, overflow_temp_tracking });
110344 }
110345
104899110346 fn asMask(temp: Temp, info: MaskInfo, cg: *CodeGen) void {
104900110347 assert(info.scalar != .none);
104901110348 const mcv = &temp.unwrap(cg).temp.tracking(cg).short;
......@@ -105581,6 +111028,42 @@ const Temp = struct {
105581111028 },
105582111029 .dst_temps = .{ .{ .ref = .src0 }, .unused },
105583111030 .each = .{ .once = &.{} },
111031 }, .{
111032 .required_features = .{ .@"64bit", null, null, null },
111033 .src_constraints = .{ .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any },
111034 .patterns = &.{
111035 .{ .src = .{ .mut_mem, .none, .none } },
111036 },
111037 .extra_temps = .{
111038 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
111039 .unused,
111040 .unused,
111041 .unused,
111042 .unused,
111043 .unused,
111044 .unused,
111045 .unused,
111046 .unused,
111047 .unused,
111048 .unused,
111049 },
111050 .dst_temps = .{ .{ .ref = .src0 }, .unused },
111051 .clobbers = .{ .eflags = true },
111052 .each = .{ .once = &.{
111053 .{ ._, ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ },
111054 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
111055 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ },
111056 } },
111057 }, .{
111058 .required_features = .{ .@"64bit", null, null, null },
111059 .src_constraints = .{ .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any },
111060 .patterns = &.{
111061 .{ .src = .{ .mut_mem, .none, .none } },
111062 },
111063 .dst_temps = .{ .{ .ref = .src0 }, .unused },
111064 .each = .{ .once = &.{
111065 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
111066 } },
105584111067 }, .{
105585111068 .required_features = .{ .@"64bit", null, null, null },
105586111069 .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any },
......@@ -109803,8 +115286,7 @@ fn tempFromOperand(cg: *CodeGen, op_ref: Air.Inst.Ref, op_dies: bool) InnerError
109803115286
109804115287 if (op_ref.toIndex()) |op_inst| return .{ .index = op_inst };
109805115288 const val = op_ref.toInterned().?;
109806 const gop = try cg.const_tracking.getOrPut(cg.gpa, val);
109807 if (!gop.found_existing) gop.value_ptr.* = .init(init: {
115289 return cg.tempInit(.fromInterned(ip.typeOf(val)), init: {
109808115290 const const_mcv = try cg.genTypedValue(.fromInterned(val));
109809115291 switch (const_mcv) {
109810115292 .lea_tlv => |tlv_sym| switch (cg.bin_file.tag) {
......@@ -109832,7 +115314,6 @@ fn tempFromOperand(cg: *CodeGen, op_ref: Air.Inst.Ref, op_dies: bool) InnerError
109832115314 else => break :init const_mcv,
109833115315 }
109834115316 });
109835 return cg.tempInit(.fromInterned(ip.typeOf(val)), gop.value_ptr.short);
109836115317}
109837115318
109838115319fn tempsFromOperandsInner(
......@@ -110330,6 +115811,7 @@ const Select = struct {
110330115811 mut_mem,
110331115812 to_mut_mem,
110332115813 gpr,
115814 immut_gpr,
110333115815 to_gpr,
110334115816 mut_gpr,
110335115817 to_mut_gpr,
......@@ -110362,15 +115844,18 @@ const Select = struct {
110362115844 return switch (src) {
110363115845 .none => temp.tracking(cg).short == .none,
110364115846 .imm8 => switch (temp.tracking(cg).short) {
110365 .immediate => |imm| std.math.cast(u8, imm) != null,
115847 .immediate => |imm| std.math.cast(u8, imm) != null or
115848 std.math.cast(i8, @as(i64, @bitCast(imm))) != null,
110366115849 else => false,
110367115850 },
110368115851 .imm16 => switch (temp.tracking(cg).short) {
110369 .immediate => |imm| std.math.cast(u16, imm) != null,
115852 .immediate => |imm| std.math.cast(u16, imm) != null or
115853 std.math.cast(i16, @as(i64, @bitCast(imm))) != null,
110370115854 else => false,
110371115855 },
110372115856 .imm32 => switch (temp.tracking(cg).short) {
110373 .immediate => |imm| std.math.cast(u32, imm) != null,
115857 .immediate => |imm| std.math.cast(u32, imm) != null or
115858 std.math.cast(i32, @as(i64, @bitCast(imm))) != null,
110374115859 else => false,
110375115860 },
110376115861 .simm32 => switch (temp.tracking(cg).short) {
......@@ -110386,6 +115871,11 @@ const Select = struct {
110386115871 .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0,
110387115872 else => false,
110388115873 },
115874 .immut_gpr => !temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) {
115875 .register => |reg| reg.class() == .general_purpose,
115876 .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0,
115877 else => false,
115878 },
110389115879 .mut_gpr => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) {
110390115880 .register => |reg| reg.class() == .general_purpose,
110391115881 .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0,
......@@ -110472,7 +115962,7 @@ const Select = struct {
110472115962 .to_param_gpr_pair => |param_spec| try temp.toRegPair(abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.index..][0..2].*, cg),
110473115963 .to_ret_gpr => |ret_spec| try temp.toReg(abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index], cg),
110474115964 .to_ret_gpr_pair => |ret_spec| try temp.toRegPair(abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index..][0..2].*, cg),
110475 .gpr, .to_gpr => try temp.toRegClass(false, .general_purpose, cg),
115965 .gpr, .immut_gpr, .to_gpr => try temp.toRegClass(false, .general_purpose, cg),
110476115966 .mut_gpr, .to_mut_gpr => try temp.toRegClass(true, .general_purpose, cg),
110477115967 .x87, .to_x87 => try temp.toRegClass(false, .x87, cg),
110478115968 .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg),
......@@ -110494,6 +115984,8 @@ const Select = struct {
110494115984 const Kind = union(enum) {
110495115985 unused,
110496115986 any,
115987 none,
115988 undef,
110497115989 cc: Condition,
110498115990 ref: Select.Operand.Ref,
110499115991 reg: Register,
......@@ -110580,6 +116072,8 @@ const Select = struct {
110580116072 return switch (spec.kind) {
110581116073 .unused => .{ undefined, false },
110582116074 .any => .{ try cg.tempAlloc(spec.type), true },
116075 .none => .{ try cg.tempInit(spec.type, .none), true },
116076 .undef => .{ try cg.tempInit(spec.type, .undef), true },
110583116077 .cc => |cc| .{ try cg.tempInit(spec.type, .{ .eflags = cc }), true },
110584116078 .ref => |ref| .{ ref.tempOf(s), false },
110585116079 .reg => |reg| .{ try cg.tempInit(spec.type, .{ .register = reg }), true },
......@@ -110812,10 +116306,17 @@ const Select = struct {
110812116306 },
110813116307 .frame => |frame_index| .{ try cg.tempInit(spec.type, .{ .load_frame = .{ .index = frame_index } }), true },
110814116308 .lazy_symbol => |lazy_symbol_spec| {
116309 const ip = &pt.zcu.intern_pool;
110815116310 const ty = if (lazy_symbol_spec.ref == .none) spec.type else lazy_symbol_spec.ref.typeOf(s);
110816116311 const lazy_symbol: link.File.LazySymbol = .{
110817116312 .kind = lazy_symbol_spec.kind,
110818 .ty = ty.toIntern(),
116313 .ty = switch (ip.indexToKey(ty.toIntern())) {
116314 .inferred_error_set_type => |func_index| switch (ip.funcIesResolvedUnordered(func_index)) {
116315 .none => unreachable, // unresolved inferred error set
116316 else => |ty_index| ty_index,
116317 },
116318 else => ty.toIntern(),
116319 },
110819116320 };
110820116321 return .{ try cg.tempInit(.usize, .{ .lea_symbol = .{
110821116322 .sym_index = if (cg.bin_file.cast(.elf)) |elf_file|
......@@ -110922,6 +116423,7 @@ const Select = struct {
110922116423 const sub_size: Adjust = .{ .sign = .neg, .lhs = .size, .op = .mul, .rhs = .@"1" };
110923116424 const sub_src0_size_div_8: Adjust = .{ .sign = .neg, .lhs = .src0_size, .op = .div, .rhs = .@"8" };
110924116425 const sub_src0_size: Adjust = .{ .sign = .neg, .lhs = .src0_size, .op = .mul, .rhs = .@"1" };
116426 const add_src0_size: Adjust = .{ .sign = .pos, .lhs = .src0_size, .op = .mul, .rhs = .@"1" };
110925116427 const add_8_src0_size: Adjust = .{ .sign = .pos, .lhs = .src0_size, .op = .mul, .rhs = .@"8" };
110926116428 const add_delta_size_div_8: Adjust = .{ .sign = .pos, .lhs = .delta_size, .op = .div, .rhs = .@"8" };
110927116429 const add_delta_elem_size: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .mul, .rhs = .@"1" };
......@@ -110965,7 +116467,9 @@ const Select = struct {
110965116467 const add_dst0_elem_size: Adjust = .{ .sign = .pos, .lhs = .dst0_elem_size, .op = .mul, .rhs = .@"1" };
110966116468 const add_elem_limbs: Adjust = .{ .sign = .pos, .lhs = .elem_limbs, .op = .mul, .rhs = .@"1" };
110967116469 const add_smin: Adjust = .{ .sign = .pos, .lhs = .smin, .op = .mul, .rhs = .@"1" };
116470 const sub_smin: Adjust = .{ .sign = .neg, .lhs = .smin, .op = .mul, .rhs = .@"1" };
110968116471 const add_umax: Adjust = .{ .sign = .pos, .lhs = .umax, .op = .mul, .rhs = .@"1" };
116472 const sub_umax: Adjust = .{ .sign = .neg, .lhs = .umax, .op = .mul, .rhs = .@"1" };
110969116473 const repeat: Adjust = .{ .sign = .pos, .lhs = .repeat, .op = .mul, .rhs = .@"1" };
110970116474 };
110971116475 const Ref = enum(u5) {
......@@ -111783,6 +117287,7 @@ fn select(
111783117287 if (std.debug.runtime_safety) {
111784117288 for (case.src_constraints[src_temps.len..]) |src_constraint| assert(src_constraint == .any);
111785117289 for (case.dst_constraints[dst_temps.len..]) |dst_constraint| assert(dst_constraint == .any);
117290 for (case.dst_temps[dst_temps.len..]) |dst_temp| assert(dst_temp == .unused);
111786117291 }
111787117292 patterns: for (case.patterns) |pattern| {
111788117293 for (pattern.src[0..src_temps.len], src_temps) |src_pattern, src_temp| if (!src_pattern.matches(src_temp, cg)) continue :patterns;
src/arch/x86_64/Emit.zig+8-6
......@@ -97,12 +97,14 @@ pub fn emitMir(emit: *Emit) Error!void {
9797 op_index -= 1;
9898 const op = lowered_inst.encoding.data.ops[op_index];
9999 if (op == .none) continue;
100 const enc_length: u4 = @intCast(
101 std.math.divCeil(u7, @intCast(op.immBitSize()), 8) catch unreachable,
102 );
100 const is_mem = op.isMemory();
101 const enc_length: u4 = if (is_mem) switch (lowered_inst.ops[op_index].mem.sib.base) {
102 .rip_inst => 4,
103 else => unreachable,
104 } else @intCast(std.math.divCeil(u7, @intCast(op.immBitSize()), 8) catch unreachable);
103105 reloc_offset -= enc_length;
104 if (op_index == lowered_relocs[0].op_index)
105 break :reloc_offset_length .{ reloc_offset, enc_length };
106 if (op_index == lowered_relocs[0].op_index) break :reloc_offset_length .{ reloc_offset, enc_length };
107 std.debug.assert(!is_mem);
106108 }
107109 };
108110 try relocs.append(emit.lower.allocator, .{
......@@ -434,7 +436,7 @@ pub fn emitMir(emit: *Emit) Error!void {
434436 loc_buf[0] = switch (mem.base()) {
435437 .none => .{ .constu = 0 },
436438 .reg => |reg| .{ .breg = reg.dwarfNum() },
437 .frame, .table => unreachable,
439 .frame, .table, .rip_inst => unreachable,
438440 .reloc => |sym_index| .{ .addr = .{ .sym = sym_index } },
439441 };
440442 break :base &loc_buf[0];
src/arch/x86_64/Encoding.zig+1-1
......@@ -50,7 +50,7 @@ pub fn findByMnemonic(
5050 else => {},
5151 } else false;
5252 const rex_extended = for (ops) |op| {
53 if (op.isBaseExtended() or op.isIndexExtended()) break true;
53 if (op.baseExtEnc() != 0b00 or op.indexExtEnc() != 0b00) break true;
5454 } else false;
5555
5656 if ((rex_required or rex_extended) and rex_invalid) return error.CannotEncode;
src/arch/x86_64/Lower.zig+1
......@@ -395,6 +395,7 @@ pub fn mem(lower: *Lower, op_index: InstOpIndex, payload: u32) Memory {
395395 .sib => |*sib| switch (sib.base) {
396396 else => {},
397397 .table => sib.disp = lower.reloc(op_index, .table, sib.disp).signed,
398 .rip_inst => |inst_index| sib.disp = lower.reloc(op_index, .{ .inst = inst_index }, sib.disp).signed,
398399 },
399400 else => {},
400401 }
src/arch/x86_64/Mir.zig+3-1
......@@ -1742,6 +1742,7 @@ pub const Memory = struct {
17421742 .reg => |reg| @intFromEnum(reg),
17431743 .frame => |frame_index| @intFromEnum(frame_index),
17441744 .reloc => |sym_index| sym_index,
1745 .rip_inst => |inst_index| inst_index,
17451746 },
17461747 .off = switch (mem.mod) {
17471748 .rm => |rm| @bitCast(rm.disp),
......@@ -1769,6 +1770,7 @@ pub const Memory = struct {
17691770 .frame => .{ .frame = @enumFromInt(mem.base) },
17701771 .table => .table,
17711772 .reloc => .{ .reloc = mem.base },
1773 .rip_inst => .{ .rip_inst = mem.base },
17721774 },
17731775 .scale_index = switch (mem.info.index) {
17741776 .none => null,
......@@ -1832,7 +1834,7 @@ pub fn resolveFrameAddr(mir: Mir, frame_addr: bits.FrameAddr) bits.RegisterOffse
18321834
18331835pub fn resolveFrameLoc(mir: Mir, mem: Memory) Memory {
18341836 return switch (mem.info.base) {
1835 .none, .reg, .table, .reloc => mem,
1837 .none, .reg, .table, .reloc, .rip_inst => mem,
18361838 .frame => if (mir.frame_locs.len > 0) .{
18371839 .info = .{
18381840 .base = .reg,
src/arch/x86_64/abi.zig+10-5
......@@ -266,7 +266,8 @@ pub fn classifySystemV(ty: Type, zcu: *Zcu, target: *const std.Target, ctx: Cont
266266 // separately.".
267267 const ty_size = ty.abiSize(zcu);
268268 switch (ty.containerLayout(zcu)) {
269 .auto, .@"extern" => {},
269 .auto => unreachable,
270 .@"extern" => {},
270271 .@"packed" => {
271272 assert(ty_size <= 16);
272273 result[0] = .integer;
......@@ -345,7 +346,8 @@ fn classifySystemVStruct(
345346 );
346347 if (zcu.typeToStruct(field_ty)) |field_loaded_struct| {
347348 switch (field_loaded_struct.layout) {
348 .auto, .@"extern" => {
349 .auto => unreachable,
350 .@"extern" => {
349351 byte_offset = classifySystemVStruct(result, byte_offset, field_loaded_struct, zcu, target);
350352 continue;
351353 },
......@@ -353,7 +355,8 @@ fn classifySystemVStruct(
353355 }
354356 } else if (zcu.typeToUnion(field_ty)) |field_loaded_union| {
355357 switch (field_loaded_union.flagsUnordered(ip).layout) {
356 .auto, .@"extern" => {
358 .auto => unreachable,
359 .@"extern" => {
357360 byte_offset = classifySystemVUnion(result, byte_offset, field_loaded_union, zcu, target);
358361 continue;
359362 },
......@@ -386,7 +389,8 @@ fn classifySystemVUnion(
386389 const field_ty = Type.fromInterned(loaded_union.field_types.get(ip)[field_index]);
387390 if (zcu.typeToStruct(field_ty)) |field_loaded_struct| {
388391 switch (field_loaded_struct.layout) {
389 .auto, .@"extern" => {
392 .auto => unreachable,
393 .@"extern" => {
390394 _ = classifySystemVStruct(result, starting_byte_offset, field_loaded_struct, zcu, target);
391395 continue;
392396 },
......@@ -394,7 +398,8 @@ fn classifySystemVUnion(
394398 }
395399 } else if (zcu.typeToUnion(field_ty)) |field_loaded_union| {
396400 switch (field_loaded_union.flagsUnordered(ip).layout) {
397 .auto, .@"extern" => {
401 .auto => unreachable,
402 .@"extern" => {
398403 _ = classifySystemVUnion(result, starting_byte_offset, field_loaded_union, zcu, target);
399404 continue;
400405 },
src/arch/x86_64/bits.zig+35-30
......@@ -4,6 +4,7 @@ const expect = std.testing.expect;
44
55const Allocator = std.mem.Allocator;
66const ArrayList = std.ArrayList;
7const Mir = @import("Mir.zig");
78
89/// EFLAGS condition codes
910pub const Condition = enum(u5) {
......@@ -359,11 +360,20 @@ pub const Register = enum(u8) {
359360
360361 ah, ch, dh, bh,
361362
362 ymm0, ymm1, ymm2, ymm3, ymm4, ymm5, ymm6, ymm7,
363 ymm8, ymm9, ymm10, ymm11, ymm12, ymm13, ymm14, ymm15,
363 zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7,
364 zmm8, zmm9, zmm10, zmm11, zmm12, zmm13, zmm14, zmm15,
365 zmm16, zmm17,zmm18, zmm19, zmm20, zmm21, zmm22, zmm23,
366 zmm24, zmm25,zmm26, zmm27, zmm28, zmm29, zmm30, zmm31,
364367
365 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
366 xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
368 ymm0, ymm1, ymm2, ymm3, ymm4, ymm5, ymm6, ymm7,
369 ymm8, ymm9, ymm10, ymm11, ymm12, ymm13, ymm14, ymm15,
370 ymm16, ymm17,ymm18, ymm19, ymm20, ymm21, ymm22, ymm23,
371 ymm24, ymm25,ymm26, ymm27, ymm28, ymm29, ymm30, ymm31,
372
373 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
374 xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
375 xmm16, xmm17,xmm18, xmm19, xmm20, xmm21, xmm22, xmm23,
376 xmm24, xmm25,xmm26, xmm27, xmm28, xmm29, xmm30, xmm31,
367377
368378 mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7,
369379
......@@ -403,8 +413,9 @@ pub const Register = enum(u8) {
403413 @intFromEnum(Register.al) ... @intFromEnum(Register.r15b) => .general_purpose,
404414 @intFromEnum(Register.ah) ... @intFromEnum(Register.bh) => .gphi,
405415
406 @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm15) => .sse,
407 @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm15) => .sse,
416 @intFromEnum(Register.zmm0) ... @intFromEnum(Register.zmm31) => .sse,
417 @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm31) => .sse,
418 @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm31) => .sse,
408419 @intFromEnum(Register.mm0) ... @intFromEnum(Register.mm7) => .mmx,
409420 @intFromEnum(Register.st0) ... @intFromEnum(Register.st7) => .x87,
410421
......@@ -427,13 +438,14 @@ pub const Register = enum(u8) {
427438 @intFromEnum(Register.al) ... @intFromEnum(Register.r15b) => @intFromEnum(Register.al),
428439 @intFromEnum(Register.ah) ... @intFromEnum(Register.bh) => @intFromEnum(Register.ah),
429440
430 @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm15) => @intFromEnum(Register.ymm0) - 16,
431 @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm15) => @intFromEnum(Register.xmm0) - 16,
432 @intFromEnum(Register.mm0) ... @intFromEnum(Register.mm7) => @intFromEnum(Register.mm0) - 32,
433 @intFromEnum(Register.st0) ... @intFromEnum(Register.st7) => @intFromEnum(Register.st0) - 40,
434 @intFromEnum(Register.es) ... @intFromEnum(Register.gs) => @intFromEnum(Register.es) - 48,
435 @intFromEnum(Register.cr0) ... @intFromEnum(Register.cr15) => @intFromEnum(Register.cr0) - 54,
436 @intFromEnum(Register.dr0) ... @intFromEnum(Register.dr15) => @intFromEnum(Register.dr0) - 70,
441 @intFromEnum(Register.zmm0) ... @intFromEnum(Register.zmm31) => @intFromEnum(Register.zmm0) - 16,
442 @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm31) => @intFromEnum(Register.ymm0) - 16,
443 @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm31) => @intFromEnum(Register.xmm0) - 16,
444 @intFromEnum(Register.mm0) ... @intFromEnum(Register.mm7) => @intFromEnum(Register.mm0) - 48,
445 @intFromEnum(Register.st0) ... @intFromEnum(Register.st7) => @intFromEnum(Register.st0) - 56,
446 @intFromEnum(Register.es) ... @intFromEnum(Register.gs) => @intFromEnum(Register.es) - 64,
447 @intFromEnum(Register.cr0) ... @intFromEnum(Register.cr15) => @intFromEnum(Register.cr0) - 70,
448 @intFromEnum(Register.dr0) ... @intFromEnum(Register.dr15) => @intFromEnum(Register.dr0) - 86,
437449
438450 else => unreachable,
439451 // zig fmt: on
......@@ -450,6 +462,7 @@ pub const Register = enum(u8) {
450462 @intFromEnum(Register.al) ... @intFromEnum(Register.r15b) => 8,
451463 @intFromEnum(Register.ah) ... @intFromEnum(Register.bh) => 8,
452464
465 @intFromEnum(Register.zmm0) ... @intFromEnum(Register.zmm15) => 512,
453466 @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm15) => 256,
454467 @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm15) => 128,
455468 @intFromEnum(Register.mm0) ... @intFromEnum(Register.mm7) => 64,
......@@ -473,8 +486,9 @@ pub const Register = enum(u8) {
473486 @intFromEnum(Register.r8w) ... @intFromEnum(Register.r15w) => true,
474487 @intFromEnum(Register.r8b) ... @intFromEnum(Register.r15b) => true,
475488
476 @intFromEnum(Register.ymm8) ... @intFromEnum(Register.ymm15) => true,
477 @intFromEnum(Register.xmm8) ... @intFromEnum(Register.xmm15) => true,
489 @intFromEnum(Register.zmm8) ... @intFromEnum(Register.zmm31) => true,
490 @intFromEnum(Register.ymm8) ... @intFromEnum(Register.ymm31) => true,
491 @intFromEnum(Register.xmm8) ... @intFromEnum(Register.xmm31) => true,
478492
479493 @intFromEnum(Register.cr8) ... @intFromEnum(Register.cr15) => true,
480494 @intFromEnum(Register.dr8) ... @intFromEnum(Register.dr15) => true,
......@@ -484,7 +498,7 @@ pub const Register = enum(u8) {
484498 };
485499 }
486500
487 pub fn enc(reg: Register) u4 {
501 pub fn enc(reg: Register) u5 {
488502 const base = switch (@intFromEnum(reg)) {
489503 // zig fmt: off
490504 @intFromEnum(Register.rax) ... @intFromEnum(Register.r15) => @intFromEnum(Register.rax),
......@@ -509,10 +523,6 @@ pub const Register = enum(u8) {
509523 return @truncate(@intFromEnum(reg) - base);
510524 }
511525
512 pub fn lowEnc(reg: Register) u3 {
513 return @truncate(reg.enc());
514 }
515
516526 pub fn toBitSize(reg: Register, bit_size: u64) Register {
517527 return switch (bit_size) {
518528 8 => reg.to8(),
......@@ -557,11 +567,12 @@ pub const Register = enum(u8) {
557567 };
558568 }
559569
560 fn sseBase(reg: Register) u7 {
570 fn sseBase(reg: Register) u8 {
561571 assert(reg.class() == .sse);
562572 return switch (@intFromEnum(reg)) {
563 @intFromEnum(Register.ymm0)...@intFromEnum(Register.ymm15) => @intFromEnum(Register.ymm0),
564 @intFromEnum(Register.xmm0)...@intFromEnum(Register.xmm15) => @intFromEnum(Register.xmm0),
573 @intFromEnum(Register.zmm0)...@intFromEnum(Register.zmm31) => @intFromEnum(Register.zmm0),
574 @intFromEnum(Register.ymm0)...@intFromEnum(Register.ymm31) => @intFromEnum(Register.ymm0),
575 @intFromEnum(Register.xmm0)...@intFromEnum(Register.xmm31) => @intFromEnum(Register.xmm0),
565576 else => unreachable,
566577 };
567578 }
......@@ -678,15 +689,9 @@ pub const Memory = struct {
678689 frame: FrameIndex,
679690 table,
680691 reloc: u32,
692 rip_inst: Mir.Inst.Index,
681693
682694 pub const Tag = @typeInfo(Base).@"union".tag_type.?;
683
684 pub fn isExtended(self: Base) bool {
685 return switch (self) {
686 .none, .frame, .table, .reloc => false, // rsp, rbp, and rip are not extended
687 .reg => |reg| reg.isExtended(),
688 };
689 }
690695 };
691696
692697 pub const Mod = union(enum(u1)) {
src/arch/x86_64/encoder.zig+54-34
......@@ -138,7 +138,7 @@ pub const Instruction = struct {
138138 .moffs => true,
139139 .rip => false,
140140 .sib => |s| switch (s.base) {
141 .none, .frame, .table, .reloc => false,
141 .none, .frame, .table, .reloc, .rip_inst => false,
142142 .reg => |reg| reg.class() == .segment,
143143 },
144144 };
......@@ -206,19 +206,22 @@ pub const Instruction = struct {
206206 };
207207 }
208208
209 pub fn isBaseExtended(op: Operand) bool {
209 pub fn baseExtEnc(op: Operand) u2 {
210210 return switch (op) {
211 .none, .imm => false,
212 .reg => |reg| reg.isExtended(),
213 .mem => |mem| mem.base().isExtended(),
211 .none, .imm => 0b00,
212 .reg => |reg| @truncate(reg.enc() >> 3),
213 .mem => |mem| switch (mem.base()) {
214 .none, .frame, .table, .reloc, .rip_inst => 0b00, // rsp, rbp, and rip are not extended
215 .reg => |reg| @truncate(reg.enc() >> 3),
216 },
214217 .bytes => unreachable,
215218 };
216219 }
217220
218 pub fn isIndexExtended(op: Operand) bool {
221 pub fn indexExtEnc(op: Operand) u2 {
219222 return switch (op) {
220 .none, .reg, .imm => false,
221 .mem => |mem| if (mem.scaleIndex()) |si| si.index.isExtended() else false,
223 .none, .reg, .imm => 0b00,
224 .mem => |mem| if (mem.scaleIndex()) |si| @truncate(si.index.enc() >> 3) else 0b00,
222225 .bytes => unreachable,
223226 };
224227 }
......@@ -279,6 +282,7 @@ pub const Instruction = struct {
279282 .frame => |frame_index| try writer.print("{}", .{frame_index}),
280283 .table => try writer.print("Table", .{}),
281284 .reloc => |sym_index| try writer.print("Symbol({d})", .{sym_index}),
285 .rip_inst => |inst_index| try writer.print("RipInst({d})", .{inst_index}),
282286 }
283287 if (mem.scaleIndex()) |si| {
284288 if (any) try writer.writeAll(" + ");
......@@ -421,14 +425,14 @@ pub const Instruction = struct {
421425 };
422426 switch (mem_op) {
423427 .reg => |reg| {
424 const rm = switch (data.op_en) {
428 const rm: u3 = switch (data.op_en) {
425429 .ia, .m, .mi, .m1, .mc, .vm, .vmi => enc.modRmExt(),
426 .mr, .mri, .mrc => inst.ops[1].reg.lowEnc(),
427 .rm, .rmi, .rm0, .rvm, .rvmr, .rvmi, .rmv => inst.ops[0].reg.lowEnc(),
428 .mvr => inst.ops[2].reg.lowEnc(),
430 .mr, .mri, .mrc => @truncate(inst.ops[1].reg.enc()),
431 .rm, .rmi, .rm0, .rvm, .rvmr, .rvmi, .rmv => @truncate(inst.ops[0].reg.enc()),
432 .mvr => @truncate(inst.ops[2].reg.enc()),
429433 else => unreachable,
430434 };
431 try encoder.modRm_direct(rm, reg.lowEnc());
435 try encoder.modRm_direct(rm, @truncate(reg.enc()));
432436 },
433437 .mem => |mem| {
434438 const op = switch (data.op_en) {
......@@ -447,7 +451,7 @@ pub const Instruction = struct {
447451 .ia => try encodeImm(inst.ops[0].imm, data.ops[0], encoder),
448452 .mi => try encodeImm(inst.ops[1].imm, data.ops[1], encoder),
449453 .rmi, .mri, .vmi => try encodeImm(inst.ops[2].imm, data.ops[2], encoder),
450 .rvmr => try encoder.imm8(@as(u8, inst.ops[3].reg.enc()) << 4),
454 .rvmr => try encoder.imm8(@as(u8, @as(u4, @intCast(inst.ops[3].reg.enc()))) << 4),
451455 .rvmi => try encodeImm(inst.ops[3].imm, data.ops[3], encoder),
452456 else => {},
453457 }
......@@ -461,8 +465,8 @@ pub const Instruction = struct {
461465 const final = opcode.len - 1;
462466 for (opcode[first..final]) |byte| try encoder.opcode_1byte(byte);
463467 switch (inst.encoding.data.op_en) {
464 .o, .oz, .oi => try encoder.opcode_withReg(opcode[final], inst.ops[0].reg.lowEnc()),
465 .zo => try encoder.opcode_withReg(opcode[final], inst.ops[1].reg.lowEnc()),
468 .o, .oz, .oi => try encoder.opcode_withReg(opcode[final], @truncate(inst.ops[0].reg.enc())),
469 .zo => try encoder.opcode_withReg(opcode[final], @truncate(inst.ops[1].reg.enc())),
466470 else => try encoder.opcode_1byte(opcode[final]),
467471 }
468472 }
......@@ -532,23 +536,29 @@ pub const Instruction = struct {
532536
533537 switch (op_en) {
534538 .z, .i, .zi, .ii, .ia, .fd, .td, .d => {},
535 .o, .oz, .oi => rex.b = inst.ops[0].reg.isExtended(),
536 .zo => rex.b = inst.ops[1].reg.isExtended(),
539 .o, .oz, .oi => rex.b = inst.ops[0].reg.enc() & 0b01000 != 0,
540 .zo => rex.b = inst.ops[1].reg.enc() & 0b01000 != 0,
537541 .m, .mi, .m1, .mc, .mr, .rm, .rmi, .mri, .mrc, .rm0, .rmv => {
538542 const r_op = switch (op_en) {
539543 .rm, .rmi, .rm0, .rmv => inst.ops[0],
540544 .mr, .mri, .mrc => inst.ops[1],
541545 else => .none,
542546 };
543 rex.r = r_op.isBaseExtended();
547 const r_op_base_ext_enc = r_op.baseExtEnc();
548 rex.r = r_op_base_ext_enc & 0b01 != 0;
549 assert(r_op_base_ext_enc & 0b10 == 0);
544550
545551 const b_x_op = switch (op_en) {
546552 .rm, .rmi, .rm0 => inst.ops[1],
547553 .m, .mi, .m1, .mc, .mr, .mri, .mrc => inst.ops[0],
548554 else => unreachable,
549555 };
550 rex.b = b_x_op.isBaseExtended();
551 rex.x = b_x_op.isIndexExtended();
556 const b_x_op_base_ext_enc = b_x_op.baseExtEnc();
557 rex.b = b_x_op_base_ext_enc & 0b01 != 0;
558 assert(b_x_op_base_ext_enc & 0b10 == 0);
559 const b_x_op_index_ext_enc = b_x_op.indexExtEnc();
560 rex.x = b_x_op_index_ext_enc & 0b01 != 0;
561 assert(b_x_op_index_ext_enc & 0b10 == 0);
552562 },
553563 .vm, .vmi, .rvm, .rvmr, .rvmi, .mvr => unreachable,
554564 }
......@@ -575,7 +585,9 @@ pub const Instruction = struct {
575585 .m, .mi, .m1, .mc, .vm, .vmi => .none,
576586 else => unreachable,
577587 };
578 vex.r = r_op.isBaseExtended();
588 const r_op_base_ext_enc = r_op.baseExtEnc();
589 vex.r = r_op_base_ext_enc & 0b01 != 0;
590 assert(r_op_base_ext_enc & 0b10 == 0);
579591
580592 const b_x_op = switch (op_en) {
581593 .rm, .rmi, .rm0, .vm, .vmi, .rmv => inst.ops[1],
......@@ -583,8 +595,12 @@ pub const Instruction = struct {
583595 .rvm, .rvmr, .rvmi => inst.ops[2],
584596 else => unreachable,
585597 };
586 vex.b = b_x_op.isBaseExtended();
587 vex.x = b_x_op.isIndexExtended();
598 const b_x_op_base_ext_enc = b_x_op.baseExtEnc();
599 vex.b = b_x_op_base_ext_enc & 0b01 != 0;
600 assert(b_x_op_base_ext_enc & 0b10 == 0);
601 const b_x_op_index_ext_enc = b_x_op.indexExtEnc();
602 vex.x = b_x_op_index_ext_enc & 0b01 != 0;
603 assert(b_x_op_index_ext_enc & 0b10 == 0);
588604 },
589605 }
590606
......@@ -621,8 +637,8 @@ pub const Instruction = struct {
621637 }
622638
623639 fn encodeMemory(encoding: Encoding, mem: Memory, operand: Operand, encoder: anytype) !void {
624 const operand_enc = switch (operand) {
625 .reg => |reg| reg.lowEnc(),
640 const operand_enc: u3 = switch (operand) {
641 .reg => |reg| @truncate(reg.enc()),
626642 .none => encoding.modRmExt(),
627643 else => unreachable,
628644 };
......@@ -634,7 +650,7 @@ pub const Instruction = struct {
634650 try encoder.modRm_SIBDisp0(operand_enc);
635651 if (mem.scaleIndex()) |si| {
636652 const scale = math.log2_int(u4, si.scale);
637 try encoder.sib_scaleIndexDisp32(scale, si.index.lowEnc());
653 try encoder.sib_scaleIndexDisp32(scale, @truncate(si.index.enc()));
638654 } else {
639655 try encoder.sib_disp32();
640656 }
......@@ -646,21 +662,21 @@ pub const Instruction = struct {
646662 try encoder.modRm_SIBDisp0(operand_enc);
647663 if (mem.scaleIndex()) |si| {
648664 const scale = math.log2_int(u4, si.scale);
649 try encoder.sib_scaleIndexDisp32(scale, si.index.lowEnc());
665 try encoder.sib_scaleIndexDisp32(scale, @truncate(si.index.enc()));
650666 } else {
651667 try encoder.sib_disp32();
652668 }
653669 try encoder.disp32(sib.disp);
654670 },
655671 .general_purpose => {
656 const dst = base.lowEnc();
672 const dst: u3 = @truncate(base.enc());
657673 const src = operand_enc;
658674 if (dst == 4 or mem.scaleIndex() != null) {
659675 if (sib.disp == 0 and dst != 5) {
660676 try encoder.modRm_SIBDisp0(src);
661677 if (mem.scaleIndex()) |si| {
662678 const scale = math.log2_int(u4, si.scale);
663 try encoder.sib_scaleIndexBase(scale, si.index.lowEnc(), dst);
679 try encoder.sib_scaleIndexBase(scale, @truncate(si.index.enc()), dst);
664680 } else {
665681 try encoder.sib_base(dst);
666682 }
......@@ -668,7 +684,7 @@ pub const Instruction = struct {
668684 try encoder.modRm_SIBDisp8(src);
669685 if (mem.scaleIndex()) |si| {
670686 const scale = math.log2_int(u4, si.scale);
671 try encoder.sib_scaleIndexBaseDisp8(scale, si.index.lowEnc(), dst);
687 try encoder.sib_scaleIndexBaseDisp8(scale, @truncate(si.index.enc()), dst);
672688 } else {
673689 try encoder.sib_baseDisp8(dst);
674690 }
......@@ -677,7 +693,7 @@ pub const Instruction = struct {
677693 try encoder.modRm_SIBDisp32(src);
678694 if (mem.scaleIndex()) |si| {
679695 const scale = math.log2_int(u4, si.scale);
680 try encoder.sib_scaleIndexBaseDisp32(scale, si.index.lowEnc(), dst);
696 try encoder.sib_scaleIndexBaseDisp32(scale, @truncate(si.index.enc()), dst);
681697 } else {
682698 try encoder.sib_baseDisp32(dst);
683699 }
......@@ -705,6 +721,10 @@ pub const Instruction = struct {
705721 try encoder.modRm_indirectDisp32(operand_enc, 0);
706722 try encoder.disp32(undefined);
707723 } else return error.CannotEncode,
724 .rip_inst => {
725 try encoder.modRm_RIPDisp32(operand_enc);
726 try encoder.disp32(sib.disp);
727 },
708728 },
709729 .rip => |rip| {
710730 try encoder.modRm_RIPDisp32(operand_enc);
......@@ -862,7 +882,7 @@ fn Encoder(comptime T: type, comptime opts: Options) type {
862882
863883 try self.writer.writeByte(
864884 @as(u8, @intFromBool(fields.w)) << 7 |
865 @as(u8, ~fields.v.enc()) << 3 |
885 @as(u8, ~@as(u4, @intCast(fields.v.enc()))) << 3 |
866886 @as(u8, @intFromBool(fields.l)) << 2 |
867887 @as(u8, @intFromEnum(fields.p)) << 0,
868888 );
......@@ -870,7 +890,7 @@ fn Encoder(comptime T: type, comptime opts: Options) type {
870890 try self.writer.writeByte(0b1100_0101);
871891 try self.writer.writeByte(
872892 @as(u8, ~@intFromBool(fields.r)) << 7 |
873 @as(u8, ~fields.v.enc()) << 3 |
893 @as(u8, ~@as(u4, @intCast(fields.v.enc()))) << 3 |
874894 @as(u8, @intFromBool(fields.l)) << 2 |
875895 @as(u8, @intFromEnum(fields.p)) << 0,
876896 );
test/behavior/math.zig+12-3
......@@ -787,7 +787,6 @@ fn should_not_be_zero(x: f128) !void {
787787
788788test "umax wrapped squaring" {
789789 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
790 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
791790 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
792791
793792 {
......@@ -1050,13 +1049,13 @@ test "@mulWithOverflow bitsize > 32" {
10501049}
10511050
10521051test "@mulWithOverflow bitsize 128 bits" {
1053 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
10541052 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
10551053 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
10561054 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
10571055 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10581056 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10591057 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
1058 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
10601059
10611060 try testMulWithOverflow(u128, 3, 0x5555555555555555_5555555555555555, 0xffffffffffffffff_ffffffffffffffff, 0);
10621061 try testMulWithOverflow(u128, 3, 0x5555555555555555_5555555555555556, 2, 1);
......@@ -1070,13 +1069,19 @@ test "@mulWithOverflow bitsize 128 bits" {
10701069 try testMulWithOverflow(i128, 3, -0x2aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaab, 0x7fffffffffffffff_ffffffffffffffff, 1);
10711070 try testMulWithOverflow(i128, -1, -1, 1, 0);
10721071 try testMulWithOverflow(i128, minInt(i128), minInt(i128), 0, 1);
1072
1073 try testMulWithOverflow(i128, 1 << 126, 1 << 1, -1 << 127, 1);
1074 try testMulWithOverflow(i128, -1 << 105, 1 << 22, -1 << 127, 0);
1075 try testMulWithOverflow(i128, 1 << 84, -1 << 43, -1 << 127, 0);
1076 try testMulWithOverflow(i128, -1 << 63, -1 << 64, -1 << 127, 1);
10731077}
10741078
1075test "@mulWithOverflow u256" {
1079test "@mulWithOverflow bitsize 256 bits" {
10761080 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
10771081 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
10781082 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
10791083 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1084 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
10801085
10811086 {
10821087 const const_lhs: u256 = 8035709466408580321693645878924206181189;
......@@ -1106,6 +1111,10 @@ test "@mulWithOverflow u256" {
11061111 try std.testing.expect(var_result[0] == const_result[0]);
11071112 try std.testing.expect(var_result[1] == const_result[1]);
11081113 }
1114 try testMulWithOverflow(i256, 1 << 254, 1 << 1, -1 << 255, 1);
1115 try testMulWithOverflow(i256, -1 << 212, 1 << 43, -1 << 255, 0);
1116 try testMulWithOverflow(i256, 1 << 170, -1 << 85, -1 << 255, 0);
1117 try testMulWithOverflow(i256, -1 << 128, -1 << 127, -1 << 255, 1);
11091118}
11101119
11111120fn testSubWithOverflow(comptime T: type, a: T, b: T, sub: T, bit: u1) !void {
test/behavior/switch.zig-1
......@@ -43,7 +43,6 @@ fn testSwitchWithAllRanges(x: u32, y: u32) u32 {
4343}
4444
4545test "switch arbitrary int size" {
46 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
4746 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
4847 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
4948 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/x86_64.zig+3-1
......@@ -7,6 +7,8 @@ test {
77 if (builtin.object_format == .macho) return error.SkipZigTest;
88 // COFF linker does not support the new backend.
99 if (builtin.object_format == .coff) return error.SkipZigTest;
10 _ = @import("x86_64/math.zig");
10 _ = @import("x86_64/binary.zig");
11 _ = @import("x86_64/cast.zig");
1112 _ = @import("x86_64/mem.zig");
13 _ = @import("x86_64/unary.zig");
1214}
test/behavior/x86_64/binary.zig+310-438
......@@ -81,26 +81,88 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela
8181 );
8282 }
8383 fn testInts() !void {
84 try testArgs(i4, 0x3, 0x2);
85 try testArgs(u4, 0xe, 0x6);
86 try testArgs(i8, 0x48, 0x6c);
87 try testArgs(u8, 0xbb, 0x43);
88 try testArgs(i16, -0x0fdf, 0x302e);
89 try testArgs(u16, 0xb8bf, 0x626d);
90 try testArgs(i32, -0x6280178f, 0x6802c034);
91 try testArgs(u32, 0x80d7a2c6, 0xbff6a402);
92 try testArgs(i64, 0x0365a53b8ee0c987, -0x1bb6d3013500a7d2);
93 try testArgs(u64, 0x71138bc6b4a38898, 0x1bc4043de9438c7b);
94 try testArgs(i128, 0x76d428c46cdeaa2ac43de8abffb22f6d, 0x427f7545abe434a12544fdbe2a012889);
95 try testArgs(u128, 0xe05fc132ef2cd8affee00a907f0a851f, 0x29f912a72cfc6a7c6973426a9636da9a);
96 try testArgs(i256, -0x53d4148cee74ea43477a65b3daa7b8fdadcbf4508e793f4af113b8d8da5a7eb6, -0x30dcbaf7b9b7a3df033694e6795444d842fb0b8f79bc18b3ea8a6b7ccad3ea91);
97 try testArgs(u256, 0xb7935f5c2f3b1ae7a422c0a7c446884294b7d5370bada307d2fe5a4c4284a999, 0x310e6e196ba4f143b8d285ca6addf7f3bb3344224aff221b27607a31e148be08);
98 try testArgs(i258, -0x0eee283365108dbeea0bec82f5147418d8ffe86f9eed00e414b4eccd65c21239a, -0x122c730073fc29a24cd6e3e6263566879bc5325d8566b8db31fcb4a76f7ab95eb);
99 try testArgs(u258, 0x186d5ddaab8cb8cb04e5b41e36f812e039d008baf49f12894c39e29a07796d800, 0x2072daba6ffad168826163eb136f6d28ca4360c8e7e5e41e29755e19e4753a4f5);
100 try testArgs(i495, 0x2fe6bc5448c55ce18252e2c9d44777505dfe63ff249a8027a6626c7d8dd9893fd5731e51474727be556f757facb586a4e04bbc0148c6c7ad692302f46fbd, -0x016a358821ef8240172f3a08e8830c06e6bcf2225f5f4d41ed42b44d249385f55cc594e1278ecac31c73faed890e5054af1a561483bb1bb6fb1f753514cf);
101 try testArgs(u495, 0x6eaf4e252b3bf74b75bac59e0b43ca5326bad2a25b3fdb74a67ef132ac5e47d72eebc3316fb2351ee66c50dc5afb92a75cea9b0e35160652c7db39eeb158, 0x49fbed744a92b549d8c05bb3512c617d24dd824f3f69bdf3923bc326a75674b85f5b828d2566fab9c86f571d12c2a63c9164feb0d191d27905533d09622a);
102 try testArgs(i512, -0x3a6876ca92775286c6e1504a64a9b8d56985bebf4a1b66539d404e0e96f24b226f70c4bcff295fdc2043b82513b2052dc45fd78f7e9e80e5b3e101757289f054, 0x5080c516a819bd32a0a5f0976441bbfbcf89e77684f1f10eb326aeb28e1f8d593278cff60fc99b8ffc87d8696882c64728dd3c322b7142803f4341f85a03bc10);
103 try testArgs(u512, 0xe5b1fedca3c77db765e517aabd05ffc524a3a8aff1784bbf67c45b894447ede32b65b9940e78173c591e56e078932d465f235aece7ad47b7f229df7ba8f12295, 0x8b4bb7c2969e3b121cc1082c442f8b4330f0a50058438fed56447175bb10178607ecfe425cb54dacc25ef26810f3e04681de1844f1aa8d029aca75d658634806);
84 try testArgs(i1, 0x0, -0x1);
85 try testArgs(u1, 0x1, 0x1);
86 try testArgs(i2, 0x0, -0x2);
87 try testArgs(u2, 0x2, 0x1);
88 try testArgs(i3, 0x1, -0x3);
89 try testArgs(u3, 0x6, 0x1);
90 try testArgs(i4, 0x6, 0x3);
91 try testArgs(u4, 0x8, 0x5);
92 try testArgs(i5, -0x9, -0xd);
93 try testArgs(u5, 0x5, 0x13);
94 try testArgs(i7, 0x34, 0x1d);
95 try testArgs(u7, 0x31, 0x56);
96 try testArgs(i8, -0x57, -0x70);
97 try testArgs(u8, 0x12, 0xd6);
98 try testArgs(i9, -0x8a, -0xa0);
99 try testArgs(u9, 0xf8, 0x95);
100 try testArgs(i15, -0x790, 0x116f);
101 try testArgs(u15, 0x548b, 0x4cd6);
102 try testArgs(i16, -0x2d17, -0x5c17);
103 try testArgs(u16, 0xadc0, 0xb223);
104 try testArgs(i17, 0xe543, 0xaad5);
105 try testArgs(u17, 0x9515, 0xa3c1);
106 try testArgs(i31, -0x28858a2f, 0x369e917a);
107 try testArgs(u31, 0x32bab794, 0x75464e7f);
108 try testArgs(i32, 0x79e74e44, 0x61fe4ab1);
109 try testArgs(u32, 0xc82f8e2, 0x5dde37e2);
110 try testArgs(i33, -0xa4cbaa13, -0x4d20ee61);
111 try testArgs(u33, 0x17461d437, 0x16cbc228f);
112 try testArgs(i63, 0x333220e16b1e53fb, 0x121a0d970a5a4504);
113 try testArgs(u63, 0x2dcd94e2ae4aa2af, 0x5f401e6e287a4dd7);
114 try testArgs(i64, 0x17e6bb7d8d430410, 0x760d42736f4b445c);
115 try testArgs(u64, 0x430970421452be50, 0xb4b5e96f4183b5fc);
116 try testArgs(i65, 0xb4477484679a6576, 0x21c9a3100d35de49);
117 try testArgs(u65, 0x1b7ffa914193a316, 0x6751268790308460);
118 try testArgs(i95, 0xd573e2100686f5df03aa29f, 0x4f7c921eb980b43a554b763);
119 try testArgs(u95, 0x62791162d2740f3ae84a9fcf, 0x1b6e66ae70bb9785a2118ecc);
120 try testArgs(i96, -0x6dc72375264ab887ea6073d5, 0x357ca705a600e94f6dd114c9);
121 try testArgs(u96, 0x77867877aae9bc90b2b57ce7, 0xd9a5352eb86061b67a61b212);
122 try testArgs(i97, 0x76f421e0ccfc6e7531c03ad5, 0x6775cdacdfca5455771c0dae);
123 try testArgs(u97, 0xaeb79499018e490b6aa2a5fc, 0x6cf53b08068cf25bdc307606);
124 try testArgs(i127, -0xc6de705251f892f8ba6a4f10aee0c7, -0x1598d3c6fd635ec0796a584af7479027);
125 try testArgs(u127, 0x5b3ec94f88a61621be2f745e90153390, 0x72456ad6a7ef886decf13195a50ca4d6);
126 try testArgs(i128, -0x44570544f745b89beb111016359577d5, -0x48904e59a05caede0974f916efba61a0);
127 try testArgs(u128, 0x3b14f670f6ac712d087a9ec7b15394d2, 0x19b69cb71a6763a9dc5baec5bb818450);
128 try testArgs(i129, 0xd58a765abb324106d83362db47fc374d, 0x548642028e222abf2ee21a1999a8ac5f);
129 try testArgs(u129, 0x1144fb18eba36e437bc45a73bbe25f10e, 0xdc7cb5f65f5127b00a842adf3f5a5231);
130 try testArgs(i159, 0x3121c6ae74c46679386f2051ee0520d9264e01cf, -0x34fec2cf28ce549281a5dc79f7ed834483f418af);
131 try testArgs(u159, 0x2e479684775f86a8ff1a9c6fab9022b18a6f6be4, 0x63c77ea3d97ad2c715fd13db972e678fefe3efba);
132 try testArgs(i160, 0x1e55924219aa114ef8d2b3193d09ae7849a3e551, -0x13f1ff6a62e562f7b78559f032bb05b2e2d15748);
133 try testArgs(u160, 0x8ed3d206fcc59350cf23dcd9e042eb36bcc63e52, 0xc88e1c5a42abf98aee0a3479e7f4fe88ab53b6f2);
134 try testArgs(i161, -0xd3d6885c0df36bd513aca744561684d12a62f044, 0xa519d3c4a7ea2e4768d840ec8641995689de6116);
135 try testArgs(u161, 0x10b4afdfa36471c77a2b629ef85e1289b798161b, 0x15e89da33c31ec01adf6921b8d13bc943f139fba2);
136 try testArgs(i191, 0x2436122b85c017733d9d28347544298d148223e1d9cbf0a2, 0x46b80688a0e0b59e66628940772893fcce258d3da7c0193);
137 try testArgs(u191, 0x3d00a8da821de44f98fa70d298bda9e25f99d8f54936d09f, 0x4ad4440686be966599985094f16e364c961503214ff86519);
138 try testArgs(i192, 0x124d0580271a71745f842e3a81d8cb6154c7f6f4b8b0cf39, -0x5bae9d7d471e609f1570a3f9805b80c4d672a086d44107eb);
139 try testArgs(u192, 0x3b882677dc62d5c76cc942bea0d2f72925ff0a9e234d7ce9, 0x5d7825e3f2254bf214257ebe84716dc88fde6c9563218ac4);
140 try testArgs(i193, 0x9c143db83d19c8fff1c23f3c93b103eaf8be02910a1cbe5, 0xcfa1059ba12508d2ff3ef9763ce8224eb1d0a0f22def289d);
141 try testArgs(u193, 0x635890f170da79117490445db595c1f2bb5a5cf640abc8e8, 0xdb5a2a6a3c6db7f43949123f0886cb93bbbed2d5dd7690e);
142 try testArgs(i223, -0x25e4a8d454e5957a9906a66a0c02ad53e727e3e18ca4b8be98561306, 0x8d6d3977afce56a5dffc537de19d4c73f2e5603699373d010e51d10);
143 try testArgs(u223, 0x5721636a3c6d271fe9eb08420d29454775666266801a7d23d61075be, 0x7e573fd8dcbd6dc780d13b61d5255cae790ea697d1c9a5479fa51ee);
144 try testArgs(i224, 0x51f97aaa96493aaed2677294bfde0715d69d961fef97a557ae9dbc84, 0x306d9305e2d5162dd0ce0454d2daaa54879b11a77386bb03e779a23e);
145 try testArgs(u224, 0xdc7eb2070c048b6fd22d6df97b3ef5e9fc5f28d8d229710333defecd, 0x475662887f29712bc927fae9de37cd842d883682a26e653d7b3f2ed9);
146 try testArgs(i225, -0x9b3dba4fe2026e8d90d9be4b8b2334034d2ae23569c4e1a3a311925d, -0x2ae4c074cff2da1e7fcab269ce6da7f4a9f763062f97526c0b4abf34);
147 try testArgs(u225, 0xb36dd536afb070e9be7fba5eaf548fe741182cabaf9f9510f86b3ffb, 0x1f35e5728f29e2566afd9a325beaf17ebf5f894e744825bdd56bb12d0);
148 try testArgs(i255, 0x2db696171e4045e17cb2a96763ff2728b459e5bf9ade6e9cd118bbc4f91aca89, -0x1580d80086052560091fe42077ce66c45d7e93173f74327f44fec7b63ed9f2aa);
149 try testArgs(u255, 0x392b3639141d03da49d576fd0ce498e1bafb8fc032604e68e91e589f6d2a05a3, 0x46f60e500f01bdbe18f71fb8dbef0395245a94f55421637ca50eb8922a751977);
150 try testArgs(i256, -0x2f3c22cb1d12628b2eccd705f1526d8a91258183742d9521bdc97d943591d87c, -0x864d3ef8b592e041289dbb54def60ceee798673138aa750a5efdaffcd42b62d);
151 try testArgs(u256, 0x25776f0ce5f3c6761eec99ace965f9162e9416e4d4e298674e5723b64e443528, 0xb1ee7fd2efaddd5d25eea49bde34e53c40d59221757f17d53d9a4c9ab7eca3f5);
152 try testArgs(i257, 0xd599706e1a09217f1f698520993d2b62ee877a4150bd8db6e5546657900dc7ce, 0x51d0faef82bb0878a4fd4331dcaec6ed57156acc2377c7e301eca6989e897346);
153 try testArgs(u257, 0xb0d42105facc0db629c5a65d6e975d25163841051efb1e187b70015f8c9e22ba, 0xf0eb6d0529e15fac6e97e850f50b7bf5056c9010345884926bf056590ddf3187);
154 try testArgs(i511, 0x23c07fa26fea1595de6e368cb42d05696562d8fb05a2aab6b304c443275071a31684a369f69f30fd53223017669dcf8157f7ff1bcda05ad28dcf46c92f7f2bd5, 0x44884ae45727d2c249b280cbb6795f237015f1082ade12167c52f0318422b3ae9c1753263011878e3fa4fce0db683efdd249e325188a40ccb959bd6bf050fbf);
155 try testArgs(u511, 0x642d98a41a7cc71dab7845c2c568696d0d77733c266846019756937cc29382d46074c8eb86502f4855c35f6354e51d98c41674166a9a7385ab94b0c7a63f58c0, 0x3cc5230f530a12c8cae29654e55a6d7cd26fe7606beed5c9a8fef443b107bf18dd8cc034683b47a213a3a885abd7048188713e8e7b9157145cd24748e256f5b7);
156 try testArgs(i512, -0x4b6d88a77e2a42d67daada905d16c6045b4dd57e608a0482f45531781d4994e2a6b71ad41a106b2dfc76e60aebd9e1d357b24b8d6889de3cf3e58ff3a48f54aa, -0x2e28e1b21ec33fd5dd9b1fbdc312e32884208b549ce0ca1661ca1150a6bd43363d4d186aa8ac70ad0595b44b5279ff070df8bd0b51095c62c8c499bfcaa7494c);
157 try testArgs(u512, 0xf40ad922664478a7b71a5676fc49434a45ba86975cef377c8321159cd880b67cd543fcca70187d5912675c0bc1fa4129cb470f280cde56ac4ec848ca589f143f, 0xe20a8110780ff05718adc173677ff0579126576f1fc3857ac41d6b7d5334d93134181af15ce2d35224d2e5c63384f33e331b16ecbc6db44edbb4074134d23e97);
158 try testArgs(i513, 0x55a556c6b6605897ffb7a791bdf309d5edb879f2841d1bba37006cdd0e7d00d971c85def024e28b7a17e53f3bcf5a5d5c43e780c6d13d67de1ca7b8f05deddfb, 0x53f475716443b38792e618ce109cec641aa351ce2e258a99153820c5522a4acc7f2b5b4ecd0000bcbe5a410bbee200576f6ff17ce7e8b7d1f0752390d1bb9b3f);
159 try testArgs(u513, 0x1e4e15bc406c558c14f48b83090647d7f2254fa571eac7f8aad8edb76a90547f7854bd6315e50ad44ea93034db9fab450a584b53abf8537e31d39cd706a31eaa7, 0x1d348de8124b72ca1d0e382501024c9e1b0f6fc16c5cd4a86aef2731bd39c29173749afe94bb2992ea805148fe0d96abdc5980b2143bd81419c1e40bf81b2496f);
160 try testArgs(i1023, -0x37781a6086d9310e4cdb24f5f374736e32af53c9545298aa53fe17854f73052cd808f658efacea622c59adb51af4d2dd636521ca2717acc43389c975505b7543da2c62f33c3152907f13b1ffa5b9881b33acec3cab1d8e33c2239ea6835277c474629a9157f8acd7c1d83076c2e75a48a8d3a94067e801c51057e47e09f0be14, 0x39ad04132dec8b795b98fd7cd085605ce8354655633068ee485d9dc78853feb922a54a3df6209989d1137e4ea8b0ad2cae48b21df2e0c04feeca56d2551f12782312a6ae483ffff466ff78446ebd4d47a61c1cba2603a62b44a72800060dda7eec8bc9060b8c5533afa7946bd38e93fddb863392500c22616dd4ae4932f20fe4);
161 try testArgs(u1023, 0x6e14a9d998a9ef7ac77b6fe08225fcc176e687685736e0e32c9e6b8fe96e9a7b14b3318310e945f7f84128455075eedb4a7b7736185f58e5640688c5d3b47d785338a0b70e77f4d237fd85f7820f3ebe6eb30f5a71231e813a70d6c76963d66291f271cd6f462ce685a0270ec5f6e856340f91d7597cd2b779566fe3ff4d4a98, 0x211eafbd449691e390d14dd34cb9c4d32627ecbec485d4a0a7cca1b28bd81d2153a7a75c2f62c4c3c7f198740cfe65dfa3c86156aa0b6d22757fd07f4070ddd50e334782f045a58b96c5a8f04b4615968501e9b5e801c475bdc034919c9e9df6df3cbbd59bacfa9409b21c3365d10e132d75958774c6244446127b043d155ec4);
162 try testArgs(i1024, 0xa6bd15fd4c529a24e4d727c5c0db9422ed7038ba23944b2b54ffc8d3731e2ffc19e12d885010fb10d208ea045e2a4cfec32d190f221bd453ec73fcecc03e37fd70be3fba3945c881cb9bce69f3f6ad9a6ee0d42a393b3669d1ca518d0b7b06a2c47978f22bc1db8802ef6ce29ea51b48256c6fed82e04355665f9d27ff485b, -0x69f258c2a86e97161ce2e683801591976a8e5a71b88605450961ee271637e6c2fee13459c29d42d4c5fb408f80236d3b2db34752e307fee6cbce2e5088adc817902a5adbbba72c8be84b9f8af5ce0fac464cae61cff9cbbe3a8dcdbec0af855b2e6c2c19fbe4f01baec9ca28b78bd7d383281c71d81da74fd0a2c8a5b754ee57);
163 try testArgs(u1024, 0x111e0a4e0c61ab3c5229154539ddb010542cb528533b4ea13813d8dbbaca7de395aac3c22dae1bd9db8bf9005ea9ef3df253aefabdce060a93e60da6edc3b1b2d78aead4647e7a589b66aa53fb953742b71f823b539150918df0fe781ee4d00279e4da9995804391bb19504de2f108f7d6ba14d624fa175842bd429f638de8f9, 0xcf9160dcb7ed13a738f7c8b2a17ca2fe84f53620a50f6a948698c4efca88392dc104ef5d26f19c82c8f770f727585702cc8d1c4cc2bba9e691e61b055d98cd636347a7c50b3bd2b2f5dfa416dadbdd76c111d45598c93ef729588cf998a55260cfe94d376ec4e8dc132afa42b66b68bc826c50169f9f4fc798cf7e8f29df639a);
164 try testArgs(i1025, 0xef2102c2cab6ad6bf2f2ba09c154440e65acc56cb14c5221a12b12404f7eafefeab4537f70cc10afb945e93c935223ffd3146911021666fd68fcaa494ded54ce66d2832b1d82b0654f24f1183bbc3ee45eb15c424a74ad41f22c7009b86cb404ac3b810445679417d7e0c5d5f4e88dec7c90352afa367004facbc1d668ab0a7, 0xc7743d3a52bad9bed0d24dbeaac4f27f4790ee14e984484f7ee077e6285394f046f2ba6d3a9c6e0aea1c07de98741a88669a035ec4d9755130fe96414223486e89d710a743ca2c2b53871fdb4851d90a595111d8d12e6732e4b580e235218edee3bc56fca3de99bc5f9a37c9dbc9a8ca5aaba710ec5e498b58b239a1be56915b);
165 try testArgs(u1025, 0x1dea81169800bac2f3afcf3be5dbd2d8eefbace8a24a2da0a383a928d1109459f34028be4413119f1af00ad90ce4d63064016dc1cee5b783c79c1998a0a49de21c4db71d432273576503589fc966c7ec2d730fa9bc4c5ff3128a82653ab8149528de67804718e39722f89b91c75d012ea41c642c889f0db95c882a9790a5e922f, 0x156fe02946ab9069a644dcc1f2b1afa04ee88ab1de19575a2715abf4a52bf374d297fdf78455ccdb87a934d3d818d774b63865eaedfdad3c56a56b8fcc62703c391aedf16cf770af06d7d205f93778c012df54fe5290084e1cd2bbec86a2f295cdce69a2cd774e064580f3c9cfae60d17b12f610e86566e68d5183d706c8ad8af);
104166 }
105167 fn testFloats() !void {
106168 @setEvalBranchQuota(21_700);
......@@ -1942,130 +2004,67 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela
19422004 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
19432005 });
19442006
1945 // workaround https://github.com/ziglang/zig/issues/22914
1946 // TODO: try testArgs(@Vector(1, i2), .{
1947 // 0x1,
1948 // }, .{
1949 // 0x1,
1950 // });
1951 // try testArgs(@Vector(2, i2), .{
1952 // 0x0, -0x2,
1953 // }, .{
1954 // -0x2, -0x2,
1955 // });
1956 // try testArgs(@Vector(4, i2), .{
1957 // -0x2, -0x1, 0x0, -0x2,
1958 // }, .{
1959 // -0x2, 0x1, -0x1, -0x2,
1960 // });
1961 // try testArgs(@Vector(8, i2), .{
1962 // -0x1, 0x1, 0x1, -0x1, -0x2, -0x2, 0x0, -0x2,
1963 // }, .{
1964 // -0x1, -0x1, -0x2, -0x1, -0x2, 0x1, -0x1, 0x1,
1965 // });
1966 // try testArgs(@Vector(16, i2), .{
1967 // 0x0, -0x2, -0x1, -0x2, 0x1, 0x0, -0x1, 0x0, 0x1, -0x2, 0x1, -0x1, -0x2, -0x2, 0x1, 0x0,
1968 // }, .{
1969 // -0x2, -0x2, 0x1, -0x2, -0x1, -0x2, -0x1, -0x2, -0x2, -0x2, -0x1, -0x2, 0x1, -0x2, -0x2, -0x2,
1970 // });
1971 // try testArgs(@Vector(32, i2), .{
1972 // -0x2, 0x1, -0x1, 0x1, 0x0, -0x2, 0x1, -0x2, -0x2, 0x0, -0x1, 0x0, -0x2, -0x2, 0x0, 0x1,
1973 // -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, 0x1, -0x2, -0x1, -0x1, 0x1, -0x2, 0x0, -0x1, 0x0, -0x2,
1974 // }, .{
1975 // 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x2, 0x1, -0x2, -0x1, -0x2, 0x1, 0x1, 0x1, -0x1,
1976 // -0x2, 0x1, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, -0x2, 0x1, -0x2, -0x1, 0x1, -0x2, -0x2,
1977 // });
1978 // try testArgs(@Vector(64, i2), .{
1979 // 0x1, -0x2, -0x1, 0x0, 0x1, -0x2, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, 0x1, 0x1, 0x0, 0x1,
1980 // -0x1, -0x1, -0x1, 0x1, 0x1, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0, 0x1, 0x1, 0x0, -0x2, -0x2,
1981 // 0x1, 0x0, -0x2, -0x2, 0x1, -0x2, -0x2, 0x1, 0x1, -0x2, 0x1, 0x0, 0x0, -0x1, 0x0, 0x1,
1982 // -0x2, 0x0, 0x0, -0x1, -0x1, 0x1, -0x2, 0x0, -0x2, 0x0, -0x2, 0x1, 0x0, -0x1, -0x1, 0x1,
1983 // }, .{
1984 // -0x2, -0x2, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, 0x1, 0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x1,
1985 // -0x2, 0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x1, -0x2, -0x2, 0x1, -0x1, -0x2, 0x1, -0x2, 0x1,
1986 // 0x1, -0x2, -0x2, -0x2, -0x2, 0x1, 0x1, 0x1, -0x2, 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, -0x1,
1987 // -0x2, 0x1, -0x1, 0x1, -0x1, -0x1, 0x1, 0x1, -0x2, 0x1, 0x1, -0x2, -0x2, -0x1, -0x2, -0x2,
1988 // });
1989 // try testArgs(@Vector(128, i2), .{
1990 // -0x1, -0x2, 0x0, -0x2, -0x2, 0x1, -0x1, 0x0, -0x1, -0x2, 0x0, -0x2, 0x0, 0x1, 0x0, -0x1,
1991 // 0x0, -0x2, 0x1, 0x0, 0x1, 0x0, -0x2, 0x1, 0x1, 0x1, -0x1, 0x1, 0x0, -0x1, 0x1, -0x1,
1992 // 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, -0x2, -0x2, 0x0, 0x0, 0x1, 0x1, -0x2, -0x1,
1993 // 0x1, 0x0, 0x0, 0x1, -0x2, -0x1, 0x0, -0x1, 0x1, -0x2, 0x1, 0x0, 0x1, 0x0, 0x0, -0x2,
1994 // 0x0, 0x0, -0x1, 0x1, -0x1, 0x0, -0x1, -0x2, 0x1, -0x2, -0x2, -0x1, -0x2, 0x0, 0x0, 0x0,
1995 // -0x1, -0x1, -0x1, -0x1, -0x2, 0x0, -0x1, 0x1, 0x0, 0x0, -0x2, 0x0, 0x0, 0x0, 0x0, 0x1,
1996 // 0x1, -0x2, 0x0, 0x0, -0x1, -0x1, 0x1, -0x1, -0x2, 0x0, -0x1, -0x1, -0x2, -0x2, 0x0, 0x0,
1997 // -0x1, 0x0, 0x1, 0x0, -0x1, -0x2, 0x1, -0x2, -0x1, -0x1, 0x0, 0x0, -0x1, 0x0, 0x0, 0x1,
1998 // }, .{
1999 // -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, 0x1, 0x1, 0x1, -0x2, -0x2, 0x1, -0x2, -0x2, 0x1, -0x1,
2000 // -0x1, -0x2, 0x1, -0x1, 0x1, 0x1, 0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, 0x1, 0x1, -0x2,
2001 // -0x1, -0x2, -0x2, -0x2, -0x2, -0x2, -0x1, -0x2, 0x1, 0x1, -0x1, -0x1, -0x1, -0x1, 0x1, -0x2,
2002 // 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x2, -0x2, -0x2, 0x1, 0x1, -0x2,
2003 // -0x1, 0x1, -0x2, -0x1, -0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, -0x2, -0x2, -0x2, -0x2,
2004 // 0x1, -0x1, 0x1, -0x2, 0x1, -0x1, -0x1, 0x1, 0x1, -0x1, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2,
2005 // -0x2, 0x1, -0x2, -0x2, -0x1, -0x1, -0x1, -0x2, 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, -0x2, 0x1,
2006 // 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x1, -0x2, -0x1, -0x1, 0x1, -0x2, -0x2, -0x2,
2007 // });
20082007 try testArgs(@Vector(1, i2), .{
2009 -0x1,
2008 0x1,
20102009 }, .{
2011 -0x2,
2010 0x1,
20122011 });
20132012 try testArgs(@Vector(2, i2), .{
2014 -0x1, -0x1,
2013 0x0, -0x2,
20152014 }, .{
2016 0x1, -0x1,
2015 -0x2, -0x2,
20172016 });
20182017 try testArgs(@Vector(4, i2), .{
2019 -0x1, 0x1, -0x1, -0x1,
2018 -0x2, -0x1, 0x0, -0x2,
20202019 }, .{
2021 0x1, -0x1, -0x1, 0x1,
2020 -0x2, 0x1, -0x1, -0x2,
20222021 });
20232022 try testArgs(@Vector(8, i2), .{
2024 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, -0x1, 0x1,
2023 -0x1, 0x1, 0x1, -0x1, -0x2, -0x2, 0x0, -0x2,
20252024 }, .{
2026 0x1, -0x1, -0x1, -0x2, -0x1, -0x2, -0x1, 0x1,
2025 -0x1, -0x1, -0x2, -0x1, -0x2, 0x1, -0x1, 0x1,
20272026 });
20282027 try testArgs(@Vector(16, i2), .{
2029 0x1, 0x0, 0x0, -0x1, 0x1, 0x0, 0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, 0x1, 0x1, 0x0,
2028 0x0, -0x2, -0x1, -0x2, 0x1, 0x0, -0x1, 0x0, 0x1, -0x2, 0x1, -0x1, -0x2, -0x2, 0x1, 0x0,
20302029 }, .{
2031 0x1, 0x1, 0x1, 0x1, -0x2, -0x2, -0x1, -0x1, -0x1, -0x2, 0x1, 0x1, -0x1, -0x2, -0x1, -0x1,
2030 -0x2, -0x2, 0x1, -0x2, -0x1, -0x2, -0x1, -0x2, -0x2, -0x2, -0x1, -0x2, 0x1, -0x2, -0x2, -0x2,
20322031 });
20332032 try testArgs(@Vector(32, i2), .{
2034 0x0, 0x1, -0x1, -0x1, -0x1, 0x0, -0x1, 0x0, -0x1, -0x1, 0x1, -0x1, 0x0, -0x1, 0x0, -0x1,
2035 -0x1, 0x1, 0x1, 0x1, -0x1, -0x1, 0x1, -0x1, -0x1, 0x1, -0x1, -0x1, 0x1, 0x0, 0x0, 0x1,
2033 -0x2, 0x1, -0x1, 0x1, 0x0, -0x2, 0x1, -0x2, -0x2, 0x0, -0x1, 0x0, -0x2, -0x2, 0x0, 0x1,
2034 -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, 0x1, -0x2, -0x1, -0x1, 0x1, -0x2, 0x0, -0x1, 0x0, -0x2,
20362035 }, .{
2037 -0x2, -0x1, -0x2, 0x1, -0x1, 0x1, -0x2, -0x2, -0x1, -0x1, -0x1, -0x1, 0x1, 0x1, 0x1, -0x2,
2038 -0x1, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, 0x1, -0x2, -0x1, -0x1, -0x2, 0x1, -0x2, -0x2, -0x1,
2036 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x2, 0x1, -0x2, -0x1, -0x2, 0x1, 0x1, 0x1, -0x1,
2037 -0x2, 0x1, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, -0x2, 0x1, -0x2, -0x1, 0x1, -0x2, -0x2,
20392038 });
20402039 try testArgs(@Vector(64, i2), .{
2041 0x1, 0x1, -0x1, 0x0, 0x0, 0x1, 0x1, -0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0,
2042 -0x1, 0x0, 0x0, 0x0, 0x0, -0x1, 0x0, 0x1, 0x1, 0x0, 0x1, -0x1, -0x1, 0x0, -0x1, 0x0,
2043 -0x1, 0x1, -0x1, 0x0, -0x1, 0x1, 0x0, 0x0, 0x0, 0x1, -0x1, 0x0, -0x1, 0x1, 0x0, 0x0,
2044 0x1, -0x1, -0x1, 0x0, 0x1, -0x1, -0x1, 0x0, 0x1, 0x1, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0,
2040 0x1, -0x2, -0x1, 0x0, 0x1, -0x2, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, 0x1, 0x1, 0x0, 0x1,
2041 -0x1, -0x1, -0x1, 0x1, 0x1, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0, 0x1, 0x1, 0x0, -0x2, -0x2,
2042 0x1, 0x0, -0x2, -0x2, 0x1, -0x2, -0x2, 0x1, 0x1, -0x2, 0x1, 0x0, 0x0, -0x1, 0x0, 0x1,
2043 -0x2, 0x0, 0x0, -0x1, -0x1, 0x1, -0x2, 0x0, -0x2, 0x0, -0x2, 0x1, 0x0, -0x1, -0x1, 0x1,
20452044 }, .{
2046 -0x1, 0x1, -0x2, -0x1, -0x1, 0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x1,
2047 -0x1, -0x1, 0x1, -0x2, -0x2, -0x2, -0x1, -0x1, -0x2, 0x1, -0x2, -0x2, -0x2, 0x1, -0x2, -0x2,
2048 -0x2, -0x1, -0x1, 0x1, -0x2, -0x1, -0x1, -0x1, -0x2, 0x1, -0x1, 0x1, -0x2, -0x2, 0x1, -0x1,
2049 -0x1, 0x1, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, 0x1, 0x1, -0x1, 0x1, 0x1, -0x1, -0x2,
2045 -0x2, -0x2, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, 0x1, 0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x1,
2046 -0x2, 0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x1, -0x2, -0x2, 0x1, -0x1, -0x2, 0x1, -0x2, 0x1,
2047 0x1, -0x2, -0x2, -0x2, -0x2, 0x1, 0x1, 0x1, -0x2, 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, -0x1,
2048 -0x2, 0x1, -0x1, 0x1, -0x1, -0x1, 0x1, 0x1, -0x2, 0x1, 0x1, -0x2, -0x2, -0x1, -0x2, -0x2,
20502049 });
20512050 try testArgs(@Vector(128, i2), .{
2052 0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, 0x0, 0x1, 0x0, -0x1, 0x0, -0x1, 0x0, 0x0, 0x0,
2053 0x0, 0x0, 0x1, -0x1, 0x1, -0x1, -0x1, 0x1, 0x0, 0x1, 0x1, 0x0, 0x1, -0x1, 0x0, -0x1,
2054 0x0, 0x1, -0x1, 0x1, -0x1, -0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, -0x1, 0x1,
2055 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, -0x1, 0x1, 0x1, -0x1, 0x1, -0x1, 0x0, 0x1, 0x0, 0x1,
2056 0x0, -0x1, 0x0, 0x0, 0x1, -0x1, 0x0, 0x0, -0x1, -0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1,
2057 0x0, -0x1, 0x1, -0x1, -0x1, 0x0, 0x0, 0x1, -0x1, -0x1, 0x1, 0x0, -0x1, 0x1, 0x0, -0x1,
2058 0x1, 0x0, 0x1, -0x1, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, -0x1, -0x1, 0x0, 0x1, 0x0,
2059 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, -0x1, 0x0, -0x1, -0x1, 0x0, 0x0, 0x0, 0x1, 0x1, -0x1,
2060 }, .{
2061 -0x2, -0x2, -0x1, -0x2, -0x1, -0x1, -0x2, -0x2, -0x2, 0x1, -0x2, -0x2, -0x2, -0x2, -0x2, 0x1,
2062 -0x1, 0x1, -0x1, -0x1, -0x2, -0x2, -0x1, -0x2, 0x1, -0x2, -0x1, -0x2, -0x2, -0x1, 0x1, -0x1,
2063 -0x2, -0x1, -0x1, -0x2, -0x1, -0x2, -0x1, 0x1, -0x1, -0x1, 0x1, -0x1, -0x2, 0x1, -0x2, -0x1,
2064 -0x2, 0x1, -0x1, -0x2, -0x2, -0x2, -0x2, -0x1, 0x1, 0x1, 0x1, 0x1, -0x1, -0x2, -0x1, -0x1,
2065 -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, 0x1, -0x2, -0x1, -0x2, -0x1, -0x2, -0x2, 0x1, -0x1, 0x1,
2066 -0x2, -0x2, 0x1, -0x2, -0x1, -0x1, 0x1, -0x1, -0x1, -0x1, -0x2, -0x2, -0x1, 0x1, 0x1, -0x2,
2067 -0x1, -0x2, 0x1, 0x1, 0x1, 0x1, -0x2, 0x1, -0x1, -0x1, -0x2, 0x1, -0x1, -0x2, -0x1, -0x2,
2068 -0x2, -0x2, -0x1, -0x1, -0x2, -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x2, -0x1, 0x1, -0x2, 0x1,
2051 -0x1, -0x2, 0x0, -0x2, -0x2, 0x1, -0x1, 0x0, -0x1, -0x2, 0x0, -0x2, 0x0, 0x1, 0x0, -0x1,
2052 0x0, -0x2, 0x1, 0x0, 0x1, 0x0, -0x2, 0x1, 0x1, 0x1, -0x1, 0x1, 0x0, -0x1, 0x1, -0x1,
2053 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, -0x2, -0x2, 0x0, 0x0, 0x1, 0x1, -0x2, -0x1,
2054 0x1, 0x0, 0x0, 0x1, -0x2, -0x1, 0x0, -0x1, 0x1, -0x2, 0x1, 0x0, 0x1, 0x0, 0x0, -0x2,
2055 0x0, 0x0, -0x1, 0x1, -0x1, 0x0, -0x1, -0x2, 0x1, -0x2, -0x2, -0x1, -0x2, 0x0, 0x0, 0x0,
2056 -0x1, -0x1, -0x1, -0x1, -0x2, 0x0, -0x1, 0x1, 0x0, 0x0, -0x2, 0x0, 0x0, 0x0, 0x0, 0x1,
2057 0x1, -0x2, 0x0, 0x0, -0x1, -0x1, 0x1, -0x1, -0x2, 0x0, -0x1, -0x1, -0x2, -0x2, 0x0, 0x0,
2058 -0x1, 0x0, 0x1, 0x0, -0x1, -0x2, 0x1, -0x2, -0x1, -0x1, 0x0, 0x0, -0x1, 0x0, 0x0, 0x1,
2059 }, .{
2060 -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, 0x1, 0x1, 0x1, -0x2, -0x2, 0x1, -0x2, -0x2, 0x1, -0x1,
2061 -0x1, -0x2, 0x1, -0x1, 0x1, 0x1, 0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, 0x1, 0x1, -0x2,
2062 -0x1, -0x2, -0x2, -0x2, -0x2, -0x2, -0x1, -0x2, 0x1, 0x1, -0x1, -0x1, -0x1, -0x1, 0x1, -0x2,
2063 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x2, -0x2, -0x2, 0x1, 0x1, -0x2,
2064 -0x1, 0x1, -0x2, -0x1, -0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, -0x2, -0x2, -0x2, -0x2,
2065 0x1, -0x1, 0x1, -0x2, 0x1, -0x1, -0x1, 0x1, 0x1, -0x1, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2,
2066 -0x2, 0x1, -0x2, -0x2, -0x1, -0x1, -0x1, -0x2, 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, -0x2, 0x1,
2067 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x1, -0x2, -0x1, -0x1, 0x1, -0x2, -0x2, -0x2,
20692068 });
20702069
20712070 try testArgs(@Vector(1, u2), .{
......@@ -2131,130 +2130,67 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela
21312130 0x2, 0x2, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, 0x3, 0x2, 0x3, 0x1,
21322131 });
21332132
2134 // workaround https://github.com/ziglang/zig/issues/22914
2135 // TODO: try testArgs(@Vector(1, i3), .{
2136 // -0x3,
2137 // }, .{
2138 // -0x1,
2139 // });
2140 // try testArgs(@Vector(2, i3), .{
2141 // 0x2, -0x3,
2142 // }, .{
2143 // 0x1, 0x3,
2144 // });
2145 // try testArgs(@Vector(4, i3), .{
2146 // 0x1, -0x4, -0x2, -0x3,
2147 // }, .{
2148 // -0x2, -0x4, 0x2, 0x2,
2149 // });
2150 // try testArgs(@Vector(8, i3), .{
2151 // 0x0, 0x1, 0x3, 0x1, -0x3, 0x1, 0x3, 0x3,
2152 // }, .{
2153 // -0x3, 0x2, 0x1, 0x1, -0x4, -0x1, 0x3, -0x2,
2154 // });
2155 // try testArgs(@Vector(16, i3), .{
2156 // -0x4, 0x3, -0x2, 0x0, -0x2, -0x1, 0x2, -0x4, 0x1, -0x3, 0x2, -0x2, 0x1, -0x2, 0x2, -0x4,
2157 // }, .{
2158 // 0x2, -0x3, 0x3, 0x1, -0x4, 0x1, -0x1, 0x1, -0x1, -0x3, -0x4, 0x2, 0x3, 0x3, -0x1, -0x4,
2159 // });
2160 // try testArgs(@Vector(32, i3), .{
2161 // 0x1, -0x3, -0x1, -0x3, -0x3, 0x2, 0x1, 0x0, 0x0, -0x1, 0x3, -0x2, 0x3, 0x0, -0x3, 0x0,
2162 // -0x4, -0x2, -0x1, -0x4, -0x4, 0x2, 0x2, 0x3, 0x1, 0x2, -0x4, -0x4, -0x3, 0x1, -0x1, -0x2,
2163 // }, .{
2164 // -0x4, -0x2, 0x1, -0x1, 0x3, 0x1, 0x2, -0x3, 0x2, -0x2, 0x1, -0x1, -0x2, -0x1, -0x1, -0x2,
2165 // -0x2, -0x3, 0x3, -0x3, -0x4, 0x1, -0x3, 0x3, 0x1, -0x3, 0x3, 0x3, -0x4, 0x3, 0x2, -0x2,
2166 // });
2167 // try testArgs(@Vector(64, i3), .{
2168 // 0x1, 0x2, 0x1, 0x2, -0x2, 0x2, 0x2, -0x1, -0x4, 0x1, 0x3, 0x0, -0x2, -0x2, 0x2, -0x2,
2169 // 0x0, -0x4, -0x3, -0x4, -0x1, -0x1, 0x2, 0x2, -0x2, -0x1, -0x1, 0x3, 0x3, -0x4, 0x2, 0x0,
2170 // 0x3, 0x2, -0x4, -0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x3, -0x3, 0x1, -0x4, -0x2, 0x1, -0x3,
2171 // -0x3, -0x1, 0x1, -0x3, -0x1, 0x3, -0x4, -0x4, 0x0, 0x0, -0x4, -0x2, 0x3, -0x1, -0x3, -0x3,
2172 // }, .{
2173 // 0x3, -0x2, 0x1, -0x4, 0x1, 0x3, -0x3, 0x1, 0x3, 0x1, 0x1, -0x1, -0x2, 0x1, -0x3, 0x1,
2174 // -0x2, -0x2, 0x3, -0x3, -0x1, -0x3, 0x1, -0x1, -0x3, -0x3, 0x1, -0x2, 0x1, -0x2, 0x1, 0x2,
2175 // 0x3, -0x4, -0x4, -0x1, 0x1, 0x3, 0x1, 0x1, -0x4, 0x2, -0x3, 0x3, 0x3, -0x1, 0x1, -0x1,
2176 // -0x2, 0x2, 0x2, -0x4, -0x4, 0x3, -0x2, -0x4, -0x1, -0x2, -0x4, 0x1, 0x2, 0x1, -0x1, -0x2,
2177 // });
2178 // try testArgs(@Vector(128, i3), .{
2179 // -0x4, 0x1, 0x0, -0x4, -0x4, 0x1, -0x4, -0x2, 0x2, 0x2, -0x3, 0x1, 0x2, -0x2, 0x1, 0x1,
2180 // 0x3, 0x0, 0x3, -0x4, -0x1, 0x3, 0x3, -0x4, 0x0, -0x3, 0x2, -0x2, 0x0, 0x3, 0x1, -0x2,
2181 // -0x1, -0x1, 0x3, -0x1, -0x2, 0x3, 0x3, 0x1, -0x3, 0x1, -0x1, -0x2, -0x4, 0x2, -0x2, -0x1,
2182 // 0x1, 0x1, 0x1, 0x0, -0x1, 0x2, -0x1, 0x3, 0x2, -0x1, -0x2, 0x3, -0x2, 0x3, 0x3, 0x1,
2183 // 0x3, -0x3, -0x4, -0x1, 0x2, 0x2, -0x2, 0x3, -0x4, -0x2, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0,
2184 // -0x2, 0x3, 0x0, -0x3, -0x4, 0x2, -0x3, -0x2, -0x4, 0x0, -0x3, -0x4, -0x4, -0x2, -0x1, -0x3,
2185 // 0x0, -0x1, 0x0, -0x1, 0x2, -0x4, -0x3, 0x0, -0x4, 0x0, -0x2, 0x1, -0x2, -0x4, -0x1, -0x1,
2186 // -0x3, 0x3, -0x1, -0x1, -0x2, 0x1, 0x3, 0x1, -0x3, 0x1, -0x4, -0x2, 0x0, -0x1, -0x2, 0x2,
2187 // }, .{
2188 // -0x3, 0x2, -0x3, 0x1, -0x2, -0x1, -0x3, 0x1, 0x2, 0x2, -0x2, 0x2, 0x2, 0x1, 0x3, -0x1,
2189 // -0x4, -0x3, 0x2, -0x3, -0x2, 0x3, -0x3, 0x2, -0x1, -0x3, 0x1, 0x2, -0x4, 0x2, -0x2, -0x3,
2190 // 0x1, -0x1, 0x2, 0x2, -0x1, -0x3, -0x4, 0x2, 0x1, -0x4, 0x1, -0x4, 0x2, -0x1, 0x2, -0x2,
2191 // 0x2, 0x1, -0x4, 0x3, 0x1, -0x2, -0x3, -0x4, 0x3, -0x1, 0x3, -0x4, -0x2, 0x1, -0x2, 0x3,
2192 // 0x1, 0x1, 0x2, 0x1, -0x1, -0x2, 0x2, -0x1, 0x1, -0x1, -0x3, -0x1, 0x1, -0x4, -0x1, -0x1,
2193 // -0x3, -0x1, -0x4, 0x3, 0x1, -0x1, -0x1, -0x1, 0x1, -0x4, 0x1, -0x2, -0x4, 0x2, -0x4, -0x3,
2194 // 0x2, -0x4, -0x1, 0x1, 0x3, 0x2, -0x1, 0x3, 0x2, 0x2, 0x1, -0x4, -0x3, 0x1, -0x1, 0x1,
2195 // -0x2, -0x4, 0x1, 0x3, -0x1, 0x3, 0x1, 0x2, -0x4, 0x2, 0x2, -0x3, -0x3, -0x4, -0x2, 0x3,
2196 // });
21972133 try testArgs(@Vector(1, i3), .{
2198 -0x1,
2199 }, .{
22002134 -0x3,
2135 }, .{
2136 -0x1,
22012137 });
22022138 try testArgs(@Vector(2, i3), .{
2203 0x2, -0x2,
2139 0x2, -0x3,
22042140 }, .{
2205 0x3, 0x3,
2141 0x1, 0x3,
22062142 });
22072143 try testArgs(@Vector(4, i3), .{
2208 0x1, 0x0, -0x2, 0x0,
2144 0x1, -0x4, -0x2, -0x3,
22092145 }, .{
2210 0x2, -0x2, -0x4, 0x3,
2146 -0x2, -0x4, 0x2, 0x2,
22112147 });
22122148 try testArgs(@Vector(8, i3), .{
2213 0x3, -0x1, -0x3, -0x3, -0x3, -0x2, 0x2, -0x3,
2149 0x0, 0x1, 0x3, 0x1, -0x3, 0x1, 0x3, 0x3,
22142150 }, .{
2215 -0x1, 0x1, -0x2, 0x2, 0x1, -0x2, -0x3, -0x1,
2151 -0x3, 0x2, 0x1, 0x1, -0x4, -0x1, 0x3, -0x2,
22162152 });
22172153 try testArgs(@Vector(16, i3), .{
2218 -0x1, -0x1, 0x3, -0x2, -0x2, -0x2, -0x2, -0x1, 0x2, 0x1, -0x2, 0x2, -0x2, 0x1, 0x1, -0x3,
2154 -0x4, 0x3, -0x2, 0x0, -0x2, -0x1, 0x2, -0x4, 0x1, -0x3, 0x2, -0x2, 0x1, -0x2, 0x2, -0x4,
22192155 }, .{
2220 0x1, -0x1, -0x1, -0x1, 0x1, 0x3, -0x1, -0x1, 0x1, 0x3, -0x1, -0x3, 0x1, 0x3, 0x1, -0x2,
2156 0x2, -0x3, 0x3, 0x1, -0x4, 0x1, -0x1, 0x1, -0x1, -0x3, -0x4, 0x2, 0x3, 0x3, -0x1, -0x4,
22212157 });
22222158 try testArgs(@Vector(32, i3), .{
2223 0x3, -0x1, -0x3, 0x1, 0x0, 0x0, -0x3, -0x1, -0x3, 0x1, 0x1, 0x2, -0x1, 0x1, -0x1, -0x1,
2224 0x1, -0x3, 0x1, -0x1, 0x1, 0x0, -0x2, 0x3, -0x2, -0x3, 0x3, 0x1, -0x1, 0x0, 0x3, -0x1,
2159 0x1, -0x3, -0x1, -0x3, -0x3, 0x2, 0x1, 0x0, 0x0, -0x1, 0x3, -0x2, 0x3, 0x0, -0x3, 0x0,
2160 -0x4, -0x2, -0x1, -0x4, -0x4, 0x2, 0x2, 0x3, 0x1, 0x2, -0x4, -0x4, -0x3, 0x1, -0x1, -0x2,
22252161 }, .{
2226 0x1, -0x2, -0x4, -0x4, 0x2, 0x1, -0x4, -0x3, -0x4, 0x1, -0x3, -0x4, -0x1, 0x2, -0x1, 0x1,
2227 0x2, -0x2, -0x4, 0x3, -0x3, 0x1, 0x2, -0x2, -0x2, 0x3, 0x3, 0x2, -0x2, -0x4, -0x2, -0x3,
2162 -0x4, -0x2, 0x1, -0x1, 0x3, 0x1, 0x2, -0x3, 0x2, -0x2, 0x1, -0x1, -0x2, -0x1, -0x1, -0x2,
2163 -0x2, -0x3, 0x3, -0x3, -0x4, 0x1, -0x3, 0x3, 0x1, -0x3, 0x3, 0x3, -0x4, 0x3, 0x2, -0x2,
22282164 });
22292165 try testArgs(@Vector(64, i3), .{
2230 -0x2, 0x1, 0x3, -0x1, -0x3, -0x1, 0x1, -0x3, 0x1, -0x2, 0x0, 0x3, 0x0, -0x2, 0x1, -0x3,
2231 -0x2, 0x1, -0x2, 0x2, 0x0, 0x1, -0x3, 0x0, -0x3, 0x0, -0x3, -0x2, -0x2, -0x3, -0x2, 0x3,
2232 -0x1, 0x1, 0x1, 0x1, -0x1, 0x0, -0x3, -0x3, -0x3, -0x3, -0x2, 0x2, 0x3, 0x2, -0x3, 0x1,
2233 -0x3, -0x3, -0x1, -0x1, -0x1, -0x3, -0x2, -0x2, 0x2, 0x3, 0x3, -0x3, 0x0, 0x3, -0x3, -0x3,
2166 0x1, 0x2, 0x1, 0x2, -0x2, 0x2, 0x2, -0x1, -0x4, 0x1, 0x3, 0x0, -0x2, -0x2, 0x2, -0x2,
2167 0x0, -0x4, -0x3, -0x4, -0x1, -0x1, 0x2, 0x2, -0x2, -0x1, -0x1, 0x3, 0x3, -0x4, 0x2, 0x0,
2168 0x3, 0x2, -0x4, -0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x3, -0x3, 0x1, -0x4, -0x2, 0x1, -0x3,
2169 -0x3, -0x1, 0x1, -0x3, -0x1, 0x3, -0x4, -0x4, 0x0, 0x0, -0x4, -0x2, 0x3, -0x1, -0x3, -0x3,
22342170 }, .{
2235 0x2, 0x1, -0x1, -0x3, -0x1, -0x4, -0x2, -0x3, 0x2, -0x2, -0x4, 0x2, 0x2, -0x2, 0x1, 0x1,
2236 0x1, -0x1, -0x3, 0x2, -0x2, 0x2, -0x1, 0x3, 0x3, -0x1, -0x1, -0x3, -0x1, 0x2, -0x2, 0x2,
2237 0x1, -0x4, -0x2, -0x4, 0x2, -0x1, -0x2, 0x3, 0x3, 0x3, -0x4, -0x2, 0x3, -0x4, 0x1, -0x2,
2238 -0x2, 0x2, -0x3, -0x3, 0x1, -0x3, 0x3, 0x2, 0x1, 0x3, -0x3, 0x3, 0x2, -0x2, -0x2, 0x2,
2171 0x3, -0x2, 0x1, -0x4, 0x1, 0x3, -0x3, 0x1, 0x3, 0x1, 0x1, -0x1, -0x2, 0x1, -0x3, 0x1,
2172 -0x2, -0x2, 0x3, -0x3, -0x1, -0x3, 0x1, -0x1, -0x3, -0x3, 0x1, -0x2, 0x1, -0x2, 0x1, 0x2,
2173 0x3, -0x4, -0x4, -0x1, 0x1, 0x3, 0x1, 0x1, -0x4, 0x2, -0x3, 0x3, 0x3, -0x1, 0x1, -0x1,
2174 -0x2, 0x2, 0x2, -0x4, -0x4, 0x3, -0x2, -0x4, -0x1, -0x2, -0x4, 0x1, 0x2, 0x1, -0x1, -0x2,
22392175 });
22402176 try testArgs(@Vector(128, i3), .{
2241 -0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, -0x3, 0x1, -0x2, -0x1, 0x0, 0x2, 0x3, -0x3,
2242 -0x1, -0x1, -0x2, 0x3, 0x1, 0x2, 0x2, 0x3, -0x2, 0x3, -0x2, -0x3, 0x1, 0x0, -0x1, -0x2,
2243 -0x1, -0x1, 0x1, -0x1, 0x2, -0x3, 0x1, -0x2, -0x1, 0x2, -0x2, 0x1, 0x1, -0x3, -0x2, 0x3,
2244 -0x1, -0x1, 0x1, -0x3, -0x1, -0x2, 0x0, 0x1, -0x1, 0x0, -0x1, 0x2, 0x1, 0x2, 0x3, -0x1,
2245 0x0, 0x1, 0x2, 0x3, -0x2, 0x2, -0x3, 0x2, 0x0, -0x2, -0x3, -0x2, 0x0, 0x1, 0x2, 0x1,
2246 -0x3, 0x0, -0x2, -0x3, -0x1, 0x2, -0x3, 0x2, 0x3, 0x1, 0x1, -0x1, 0x2, 0x1, -0x1, 0x2,
2247 0x2, 0x0, 0x1, -0x3, -0x3, 0x1, 0x2, 0x0, 0x1, 0x0, 0x0, -0x1, 0x0, 0x0, 0x3, 0x3,
2248 0x0, -0x2, -0x2, -0x2, 0x3, 0x0, -0x1, -0x2, 0x0, 0x3, -0x3, 0x1, 0x2, -0x1, 0x1, 0x1,
2249 }, .{
2250 0x3, 0x3, 0x2, 0x3, -0x3, -0x4, 0x1, -0x3, 0x2, 0x3, 0x3, -0x2, 0x2, -0x1, 0x1, 0x3,
2251 -0x4, -0x4, -0x1, -0x1, 0x2, -0x3, -0x3, -0x3, -0x2, -0x3, -0x2, -0x1, 0x1, 0x3, -0x4, -0x2,
2252 -0x3, 0x1, 0x3, 0x1, -0x2, 0x1, 0x1, 0x2, 0x1, 0x2, -0x4, -0x4, -0x3, -0x2, -0x1, -0x2,
2253 0x3, 0x2, -0x3, -0x2, -0x2, 0x3, -0x3, -0x4, 0x3, -0x3, 0x3, -0x1, 0x3, -0x1, -0x1, 0x2,
2254 0x3, -0x4, -0x4, -0x2, -0x4, 0x2, -0x2, -0x4, -0x2, -0x2, -0x3, 0x3, 0x2, 0x2, 0x2, -0x4,
2255 0x1, -0x4, -0x3, -0x2, -0x4, -0x4, 0x1, -0x4, -0x1, 0x3, -0x2, -0x4, 0x3, -0x4, 0x3, -0x1,
2256 0x3, 0x1, -0x1, 0x1, 0x1, 0x2, 0x1, -0x3, -0x4, -0x1, -0x1, -0x2, -0x3, -0x2, 0x3, -0x2,
2257 -0x1, 0x3, 0x3, -0x1, 0x3, 0x1, 0x1, 0x2, -0x3, 0x3, -0x1, 0x3, -0x3, -0x4, -0x4, 0x1,
2177 -0x4, 0x1, 0x0, -0x4, -0x4, 0x1, -0x4, -0x2, 0x2, 0x2, -0x3, 0x1, 0x2, -0x2, 0x1, 0x1,
2178 0x3, 0x0, 0x3, -0x4, -0x1, 0x3, 0x3, -0x4, 0x0, -0x3, 0x2, -0x2, 0x0, 0x3, 0x1, -0x2,
2179 -0x1, -0x1, 0x3, -0x1, -0x2, 0x3, 0x3, 0x1, -0x3, 0x1, -0x1, -0x2, -0x4, 0x2, -0x2, -0x1,
2180 0x1, 0x1, 0x1, 0x0, -0x1, 0x2, -0x1, 0x3, 0x2, -0x1, -0x2, 0x3, -0x2, 0x3, 0x3, 0x1,
2181 0x3, -0x3, -0x4, -0x1, 0x2, 0x2, -0x2, 0x3, -0x4, -0x2, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0,
2182 -0x2, 0x3, 0x0, -0x3, -0x4, 0x2, -0x3, -0x2, -0x4, 0x0, -0x3, -0x4, -0x4, -0x2, -0x1, -0x3,
2183 0x0, -0x1, 0x0, -0x1, 0x2, -0x4, -0x3, 0x0, -0x4, 0x0, -0x2, 0x1, -0x2, -0x4, -0x1, -0x1,
2184 -0x3, 0x3, -0x1, -0x1, -0x2, 0x1, 0x3, 0x1, -0x3, 0x1, -0x4, -0x2, 0x0, -0x1, -0x2, 0x2,
2185 }, .{
2186 -0x3, 0x2, -0x3, 0x1, -0x2, -0x1, -0x3, 0x1, 0x2, 0x2, -0x2, 0x2, 0x2, 0x1, 0x3, -0x1,
2187 -0x4, -0x3, 0x2, -0x3, -0x2, 0x3, -0x3, 0x2, -0x1, -0x3, 0x1, 0x2, -0x4, 0x2, -0x2, -0x3,
2188 0x1, -0x1, 0x2, 0x2, -0x1, -0x3, -0x4, 0x2, 0x1, -0x4, 0x1, -0x4, 0x2, -0x1, 0x2, -0x2,
2189 0x2, 0x1, -0x4, 0x3, 0x1, -0x2, -0x3, -0x4, 0x3, -0x1, 0x3, -0x4, -0x2, 0x1, -0x2, 0x3,
2190 0x1, 0x1, 0x2, 0x1, -0x1, -0x2, 0x2, -0x1, 0x1, -0x1, -0x3, -0x1, 0x1, -0x4, -0x1, -0x1,
2191 -0x3, -0x1, -0x4, 0x3, 0x1, -0x1, -0x1, -0x1, 0x1, -0x4, 0x1, -0x2, -0x4, 0x2, -0x4, -0x3,
2192 0x2, -0x4, -0x1, 0x1, 0x3, 0x2, -0x1, 0x3, 0x2, 0x2, 0x1, -0x4, -0x3, 0x1, -0x1, 0x1,
2193 -0x2, -0x4, 0x1, 0x3, -0x1, 0x3, 0x1, 0x2, -0x4, 0x2, 0x2, -0x3, -0x3, -0x4, -0x2, 0x3,
22582194 });
22592195
22602196 try testArgs(@Vector(1, u3), .{
......@@ -2320,130 +2256,67 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela
23202256 0x1, 0x1, 0x2, 0x7, 0x2, 0x5, 0x1, 0x6, 0x4, 0x6, 0x1, 0x6, 0x5, 0x1, 0x2, 0x1,
23212257 });
23222258
2323 // workaround https://github.com/ziglang/zig/issues/22914
2324 // TODO: try testArgs(@Vector(1, i4), .{
2325 // 0x2,
2326 // }, .{
2327 // 0x1,
2328 // });
2329 // try testArgs(@Vector(2, i4), .{
2330 // -0x2, 0x5,
2331 // }, .{
2332 // -0x1, 0x2,
2333 // });
2334 // try testArgs(@Vector(4, i4), .{
2335 // -0x8, 0x5, 0x5, -0x2,
2336 // }, .{
2337 // -0x3, -0x7, -0x4, -0x5,
2338 // });
2339 // try testArgs(@Vector(8, i4), .{
2340 // 0x7, 0x3, 0x2, -0x1, -0x8, -0x2, 0x7, 0x1,
2341 // }, .{
2342 // -0x2, 0x4, -0x8, 0x7, 0x1, -0x5, 0x6, -0x7,
2343 // });
2344 // try testArgs(@Vector(16, i4), .{
2345 // 0x6, -0x3, 0x6, 0x6, -0x5, 0x6, 0x3, 0x7, -0x6, 0x7, -0x7, 0x6, -0x2, -0x2, -0x5, 0x0,
2346 // }, .{
2347 // 0x2, -0x3, -0x4, -0x5, 0x3, 0x3, -0x5, 0x5, 0x4, -0x1, -0x6, 0x4, 0x7, -0x2, 0x3, 0x2,
2348 // });
2349 // try testArgs(@Vector(32, i4), .{
2350 // -0x1, -0x4, 0x6, 0x6, 0x5, 0x3, 0x4, 0x0, 0x3, 0x7, -0x6, 0x7, -0x2, -0x7, -0x4, 0x6,
2351 // 0x3, -0x7, -0x5, 0x1, -0x7, -0x6, 0x1, 0x3, 0x7, -0x8, -0x5, 0x6, -0x5, 0x0, 0x0, -0x8,
2352 // }, .{
2353 // -0x4, -0x4, -0x4, 0x4, -0x5, 0x3, -0x1, 0x6, 0x1, -0x3, -0x1, 0x6, 0x5, -0x8, 0x1, -0x4,
2354 // -0x1, -0x4, 0x1, -0x3, 0x4, 0x6, -0x3, -0x8, -0x7, -0x4, 0x2, -0x3, -0x1, -0x2, 0x6, -0x6,
2355 // });
2356 // try testArgs(@Vector(64, i4), .{
2357 // 0x0, -0x3, -0x3, 0x5, 0x2, -0x1, 0x4, 0x5, 0x6, -0x2, 0x1, 0x5, -0x3, -0x1, -0x2, -0x1,
2358 // -0x8, 0x2, -0x1, -0x2, 0x7, -0x3, -0x2, -0x3, 0x1, -0x5, 0x5, 0x2, -0x1, -0x6, -0x2, -0x1,
2359 // -0x2, -0x5, 0x0, 0x6, 0x3, -0x4, -0x5, -0x5, -0x4, -0x7, -0x4, 0x1, 0x0, -0x6, -0x7, -0x6,
2360 // 0x1, -0x6, 0x4, -0x4, -0x2, 0x6, -0x7, 0x4, 0x4, 0x5, 0x3, -0x6, -0x8, -0x5, 0x5, -0x7,
2361 // }, .{
2362 // -0x1, -0x5, 0x5, -0x2, 0x6, -0x6, -0x4, -0x5, -0x4, 0x7, -0x6, 0x7, 0x4, -0x5, 0x5, 0x7,
2363 // -0x6, 0x3, -0x4, 0x2, -0x8, 0x4, -0x2, 0x5, -0x5, -0x5, -0x8, 0x3, -0x1, -0x4, -0x8, -0x2,
2364 // -0x2, 0x5, -0x7, -0x3, 0x2, -0x5, -0x6, -0x7, -0x8, -0x2, 0x5, -0x3, 0x2, -0x1, -0x7, -0x4,
2365 // -0x3, -0x3, 0x6, -0x8, 0x3, -0x4, 0x7, 0x3, -0x2, 0x7, -0x1, 0x1, 0x1, 0x6, -0x2, -0x2,
2366 // });
2367 // try testArgs(@Vector(128, i4), .{
2368 // -0x1, -0x3, -0x3, -0x4, 0x3, -0x4, 0x0, -0x4, 0x7, 0x3, 0x5, -0x4, -0x5, -0x4, -0x2, -0x7,
2369 // 0x2, 0x0, -0x4, 0x7, 0x3, -0x5, 0x4, 0x5, -0x2, -0x3, -0x4, 0x6, -0x7, -0x1, 0x1, -0x6,
2370 // 0x1, 0x5, 0x2, 0x5, 0x2, 0x2, -0x4, -0x4, 0x5, 0x2, -0x2, -0x8, -0x1, -0x2, 0x5, 0x3,
2371 // 0x0, -0x5, 0x5, 0x7, 0x6, -0x3, -0x2, 0x0, -0x7, -0x7, -0x4, 0x2, -0x4, 0x7, 0x1, -0x5,
2372 // -0x4, -0x8, 0x2, -0x7, 0x3, -0x4, 0x7, 0x6, -0x7, -0x3, -0x7, 0x2, 0x4, 0x2, -0x5, -0x6,
2373 // 0x3, 0x5, 0x1, 0x6, 0x5, 0x7, 0x7, -0x4, -0x7, -0x1, 0x0, -0x7, 0x6, 0x0, 0x6, 0x0,
2374 // 0x0, -0x5, -0x1, -0x8, 0x7, -0x6, -0x5, -0x2, -0x4, 0x1, 0x1, -0x8, 0x2, 0x6, -0x1, -0x3,
2375 // -0x6, 0x5, -0x8, 0x3, 0x3, 0x1, -0x1, -0x3, -0x3, -0x6, 0x7, -0x6, -0x8, 0x1, -0x7, -0x8,
2376 // }, .{
2377 // 0x1, 0x3, 0x1, 0x3, -0x6, 0x6, 0x2, -0x3, 0x1, -0x7, 0x7, -0x3, -0x1, -0x1, 0x7, 0x2,
2378 // -0x8, 0x2, -0x3, -0x4, 0x4, -0x4, 0x7, 0x6, -0x5, -0x2, -0x1, 0x6, -0x7, 0x4, 0x7, -0x3,
2379 // -0x5, -0x8, -0x5, -0x6, -0x6, 0x2, 0x1, -0x8, 0x4, 0x3, -0x5, 0x7, -0x8, 0x3, -0x1, 0x7,
2380 // -0x3, 0x7, -0x3, -0x2, -0x6, 0x4, 0x2, -0x2, -0x2, -0x7, 0x5, -0x1, -0x6, 0x7, -0x5, 0x5,
2381 // 0x4, 0x5, -0x8, -0x5, 0x6, 0x1, -0x5, 0x7, -0x6, -0x3, -0x4, 0x6, -0x8, 0x7, 0x7, -0x6,
2382 // 0x6, -0x4, 0x2, -0x8, -0x8, -0x4, -0x8, -0x3, 0x6, 0x5, 0x7, -0x6, 0x1, 0x2, -0x7, -0x3,
2383 // -0x3, 0x1, -0x3, 0x3, -0x1, 0x3, -0x7, -0x8, 0x1, -0x3, -0x3, -0x3, -0x4, 0x5, 0x7, -0x7,
2384 // 0x3, 0x2, 0x6, -0x2, -0x4, -0x3, -0x1, 0x5, -0x6, 0x2, 0x3, -0x5, 0x5, -0x3, -0x2, -0x8,
2385 // });
23862259 try testArgs(@Vector(1, i4), .{
2387 -0x1,
2260 0x2,
23882261 }, .{
2389 -0x1,
2262 0x1,
23902263 });
23912264 try testArgs(@Vector(2, i4), .{
2392 0x7, 0x5,
2265 -0x2, 0x5,
23932266 }, .{
2394 0x4, 0x1,
2267 -0x1, 0x2,
23952268 });
23962269 try testArgs(@Vector(4, i4), .{
2397 -0x2, -0x3, -0x6, 0x1,
2270 -0x8, 0x5, 0x5, -0x2,
23982271 }, .{
2399 0x3, -0x5, -0x1, -0x3,
2272 -0x3, -0x7, -0x4, -0x5,
24002273 });
24012274 try testArgs(@Vector(8, i4), .{
2402 -0x5, -0x3, -0x2, 0x2, -0x4, -0x4, 0x0, 0x1,
2275 0x7, 0x3, 0x2, -0x1, -0x8, -0x2, 0x7, 0x1,
24032276 }, .{
2404 -0x7, -0x2, -0x7, 0x1, 0x6, 0x2, -0x7, 0x7,
2277 -0x2, 0x4, -0x8, 0x7, 0x1, -0x5, 0x6, -0x7,
24052278 });
24062279 try testArgs(@Vector(16, i4), .{
2407 -0x1, -0x1, 0x6, 0x3, -0x1, 0x2, -0x6, 0x6, 0x1, 0x5, -0x1, 0x7, 0x7, -0x3, -0x1, 0x4,
2280 0x6, -0x3, 0x6, 0x6, -0x5, 0x6, 0x3, 0x7, -0x6, 0x7, -0x7, 0x6, -0x2, -0x2, -0x5, 0x0,
24082281 }, .{
2409 0x1, -0x3, 0x4, -0x1, 0x2, 0x5, -0x3, -0x5, -0x5, 0x5, -0x7, 0x7, 0x1, 0x5, -0x5, -0x6,
2282 0x2, -0x3, -0x4, -0x5, 0x3, 0x3, -0x5, 0x5, 0x4, -0x1, -0x6, 0x4, 0x7, -0x2, 0x3, 0x2,
24102283 });
24112284 try testArgs(@Vector(32, i4), .{
2412 -0x7, 0x4, -0x5, -0x5, -0x5, 0x1, 0x7, 0x3, -0x2, 0x7, -0x3, -0x7, -0x3, -0x2, -0x5, -0x7,
2413 0x5, 0x4, 0x3, 0x0, -0x6, -0x2, -0x4, -0x1, 0x5, 0x4, -0x7, -0x7, -0x5, 0x5, -0x5, -0x1,
2285 -0x1, -0x4, 0x6, 0x6, 0x5, 0x3, 0x4, 0x0, 0x3, 0x7, -0x6, 0x7, -0x2, -0x7, -0x4, 0x6,
2286 0x3, -0x7, -0x5, 0x1, -0x7, -0x6, 0x1, 0x3, 0x7, -0x8, -0x5, 0x6, -0x5, 0x0, 0x0, -0x8,
24142287 }, .{
2415 0x4, 0x4, 0x5, 0x2, 0x3, -0x4, 0x6, 0x2, -0x7, 0x3, 0x7, 0x2, 0x6, 0x2, 0x2, 0x3,
2416 0x7, -0x3, -0x7, -0x2, 0x3, -0x1, -0x4, 0x4, -0x8, 0x1, 0x6, -0x7, 0x5, 0x1, 0x7, -0x2,
2288 -0x4, -0x4, -0x4, 0x4, -0x5, 0x3, -0x1, 0x6, 0x1, -0x3, -0x1, 0x6, 0x5, -0x8, 0x1, -0x4,
2289 -0x1, -0x4, 0x1, -0x3, 0x4, 0x6, -0x3, -0x8, -0x7, -0x4, 0x2, -0x3, -0x1, -0x2, 0x6, -0x6,
24172290 });
24182291 try testArgs(@Vector(64, i4), .{
2419 0x0, 0x3, 0x7, -0x7, 0x1, -0x5, -0x4, 0x2, 0x2, 0x5, 0x4, 0x0, -0x3, -0x4, -0x4, -0x4,
2420 -0x7, 0x6, 0x2, 0x1, 0x0, 0x3, -0x6, 0x4, -0x4, 0x2, 0x7, 0x3, -0x4, -0x3, -0x3, -0x3,
2421 -0x4, 0x0, -0x3, -0x6, 0x0, 0x1, -0x5, -0x7, -0x2, -0x1, -0x1, -0x7, 0x3, -0x5, -0x4, -0x3,
2422 0x5, 0x1, -0x4, 0x7, 0x1, 0x7, -0x5, 0x4, 0x5, -0x4, 0x1, -0x4, 0x4, 0x5, 0x4, -0x2,
2292 0x0, -0x3, -0x3, 0x5, 0x2, -0x1, 0x4, 0x5, 0x6, -0x2, 0x1, 0x5, -0x3, -0x1, -0x2, -0x1,
2293 -0x8, 0x2, -0x1, -0x2, 0x7, -0x3, -0x2, -0x3, 0x1, -0x5, 0x5, 0x2, -0x1, -0x6, -0x2, -0x1,
2294 -0x2, -0x5, 0x0, 0x6, 0x3, -0x4, -0x5, -0x5, -0x4, -0x7, -0x4, 0x1, 0x0, -0x6, -0x7, -0x6,
2295 0x1, -0x6, 0x4, -0x4, -0x2, 0x6, -0x7, 0x4, 0x4, 0x5, 0x3, -0x6, -0x8, -0x5, 0x5, -0x7,
24232296 }, .{
2424 0x2, -0x4, -0x1, 0x4, 0x4, -0x1, -0x3, 0x6, 0x4, 0x2, 0x4, 0x3, -0x6, -0x7, -0x4, 0x6,
2425 0x6, 0x4, 0x6, -0x7, 0x2, 0x4, -0x8, -0x1, -0x8, 0x3, -0x2, -0x7, 0x1, 0x5, -0x3, -0x6,
2426 -0x8, 0x2, -0x5, 0x7, 0x4, 0x7, -0x4, 0x3, 0x6, -0x7, -0x1, 0x1, -0x8, -0x2, -0x3, 0x3,
2427 0x3, -0x4, 0x4, -0x7, 0x5, -0x4, -0x1, 0x2, 0x6, -0x2, -0x5, 0x2, 0x7, 0x2, -0x8, -0x3,
2297 -0x1, -0x5, 0x5, -0x2, 0x6, -0x6, -0x4, -0x5, -0x4, 0x7, -0x6, 0x7, 0x4, -0x5, 0x5, 0x7,
2298 -0x6, 0x3, -0x4, 0x2, -0x8, 0x4, -0x2, 0x5, -0x5, -0x5, -0x8, 0x3, -0x1, -0x4, -0x8, -0x2,
2299 -0x2, 0x5, -0x7, -0x3, 0x2, -0x5, -0x6, -0x7, -0x8, -0x2, 0x5, -0x3, 0x2, -0x1, -0x7, -0x4,
2300 -0x3, -0x3, 0x6, -0x8, 0x3, -0x4, 0x7, 0x3, -0x2, 0x7, -0x1, 0x1, 0x1, 0x6, -0x2, -0x2,
24282301 });
24292302 try testArgs(@Vector(128, i4), .{
2430 0x3, 0x3, -0x6, 0x3, 0x2, 0x1, 0x5, -0x2, 0x0, -0x7, 0x4, 0x3, 0x0, -0x3, -0x7, -0x5,
2431 0x4, 0x0, 0x1, 0x6, 0x3, 0x3, -0x4, 0x7, -0x6, -0x6, 0x6, 0x1, 0x6, -0x5, -0x6, -0x6,
2432 0x4, -0x2, 0x3, -0x1, -0x4, -0x6, -0x1, 0x2, 0x4, 0x3, -0x2, 0x2, 0x3, 0x5, 0x0, -0x2,
2433 0x5, 0x6, -0x1, -0x5, 0x6, 0x7, 0x7, -0x6, -0x6, 0x0, 0x0, -0x6, -0x2, -0x7, -0x6, 0x3,
2434 -0x6, -0x6, 0x4, -0x4, 0x4, -0x5, 0x0, 0x6, 0x6, 0x7, 0x4, -0x5, 0x5, -0x7, -0x7, 0x6,
2435 -0x4, 0x4, -0x7, 0x4, 0x3, 0x2, -0x4, -0x1, -0x6, -0x2, 0x5, -0x2, 0x4, -0x7, -0x3, -0x3,
2436 0x4, 0x1, -0x1, 0x2, -0x1, 0x4, -0x5, -0x3, -0x1, -0x3, 0x3, 0x7, 0x5, -0x1, -0x1, -0x4,
2437 0x2, 0x1, -0x3, 0x7, -0x6, -0x7, -0x6, -0x4, -0x5, -0x2, 0x5, 0x0, -0x5, 0x7, -0x7, 0x5,
2438 }, .{
2439 -0x6, -0x5, -0x1, 0x4, 0x6, 0x4, -0x1, -0x7, -0x3, 0x4, -0x6, -0x2, -0x3, 0x1, 0x6, 0x2,
2440 -0x1, -0x3, -0x4, 0x2, 0x3, 0x6, -0x7, 0x3, 0x7, -0x6, 0x1, -0x7, -0x5, 0x6, 0x7, -0x4,
2441 0x7, -0x4, 0x2, -0x5, 0x4, 0x5, 0x5, -0x3, -0x1, 0x6, -0x6, -0x2, -0x4, 0x3, -0x4, -0x4,
2442 -0x5, 0x6, -0x6, 0x3, -0x6, -0x3, 0x6, 0x5, 0x6, -0x6, -0x3, 0x1, -0x4, -0x5, -0x8, -0x3,
2443 -0x4, 0x7, -0x2, -0x1, 0x4, 0x2, -0x3, 0x6, 0x4, 0x6, -0x3, 0x6, 0x5, -0x2, -0x1, 0x5,
2444 0x6, -0x6, -0x8, -0x2, -0x3, 0x6, -0x6, 0x5, -0x2, -0x6, 0x5, -0x6, 0x2, 0x1, 0x3, -0x3,
2445 0x7, 0x7, 0x3, -0x1, 0x5, -0x2, -0x3, 0x4, 0x7, -0x7, 0x7, 0x6, -0x2, -0x5, 0x4, -0x5,
2446 -0x1, -0x2, 0x1, 0x4, -0x2, 0x1, -0x3, 0x1, -0x4, 0x3, -0x2, -0x6, -0x4, -0x2, -0x8, 0x2,
2303 -0x1, -0x3, -0x3, -0x4, 0x3, -0x4, 0x0, -0x4, 0x7, 0x3, 0x5, -0x4, -0x5, -0x4, -0x2, -0x7,
2304 0x2, 0x0, -0x4, 0x7, 0x3, -0x5, 0x4, 0x5, -0x2, -0x3, -0x4, 0x6, -0x7, -0x1, 0x1, -0x6,
2305 0x1, 0x5, 0x2, 0x5, 0x2, 0x2, -0x4, -0x4, 0x5, 0x2, -0x2, -0x8, -0x1, -0x2, 0x5, 0x3,
2306 0x0, -0x5, 0x5, 0x7, 0x6, -0x3, -0x2, 0x0, -0x7, -0x7, -0x4, 0x2, -0x4, 0x7, 0x1, -0x5,
2307 -0x4, -0x8, 0x2, -0x7, 0x3, -0x4, 0x7, 0x6, -0x7, -0x3, -0x7, 0x2, 0x4, 0x2, -0x5, -0x6,
2308 0x3, 0x5, 0x1, 0x6, 0x5, 0x7, 0x7, -0x4, -0x7, -0x1, 0x0, -0x7, 0x6, 0x0, 0x6, 0x0,
2309 0x0, -0x5, -0x1, -0x8, 0x7, -0x6, -0x5, -0x2, -0x4, 0x1, 0x1, -0x8, 0x2, 0x6, -0x1, -0x3,
2310 -0x6, 0x5, -0x8, 0x3, 0x3, 0x1, -0x1, -0x3, -0x3, -0x6, 0x7, -0x6, -0x8, 0x1, -0x7, -0x8,
2311 }, .{
2312 0x1, 0x3, 0x1, 0x3, -0x6, 0x6, 0x2, -0x3, 0x1, -0x7, 0x7, -0x3, -0x1, -0x1, 0x7, 0x2,
2313 -0x8, 0x2, -0x3, -0x4, 0x4, -0x4, 0x7, 0x6, -0x5, -0x2, -0x1, 0x6, -0x7, 0x4, 0x7, -0x3,
2314 -0x5, -0x8, -0x5, -0x6, -0x6, 0x2, 0x1, -0x8, 0x4, 0x3, -0x5, 0x7, -0x8, 0x3, -0x1, 0x7,
2315 -0x3, 0x7, -0x3, -0x2, -0x6, 0x4, 0x2, -0x2, -0x2, -0x7, 0x5, -0x1, -0x6, 0x7, -0x5, 0x5,
2316 0x4, 0x5, -0x8, -0x5, 0x6, 0x1, -0x5, 0x7, -0x6, -0x3, -0x4, 0x6, -0x8, 0x7, 0x7, -0x6,
2317 0x6, -0x4, 0x2, -0x8, -0x8, -0x4, -0x8, -0x3, 0x6, 0x5, 0x7, -0x6, 0x1, 0x2, -0x7, -0x3,
2318 -0x3, 0x1, -0x3, 0x3, -0x1, 0x3, -0x7, -0x8, 0x1, -0x3, -0x3, -0x3, -0x4, 0x5, 0x7, -0x7,
2319 0x3, 0x2, 0x6, -0x2, -0x4, -0x3, -0x1, 0x5, -0x6, 0x2, 0x3, -0x5, 0x5, -0x3, -0x2, -0x8,
24472320 });
24482321
24492322 try testArgs(@Vector(1, u4), .{
......@@ -2509,130 +2382,67 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela
25092382 0x9, 0x6, 0x4, 0x5, 0xf, 0xe, 0x8, 0x5, 0x2, 0x5, 0xf, 0xb, 0xf, 0x4, 0x6, 0x4,
25102383 });
25112384
2512 // workaround https://github.com/ziglang/zig/issues/22914
2513 // TODO: try testArgs(@Vector(1, i5), .{
2514 // 0x03,
2515 // }, .{
2516 // 0x0a,
2517 // });
2518 // try testArgs(@Vector(2, i5), .{
2519 // 0x0c, -0x0e,
2520 // }, .{
2521 // -0x0f, -0x0e,
2522 // });
2523 // try testArgs(@Vector(4, i5), .{
2524 // -0x0a, 0x06, -0x05, 0x09,
2525 // }, .{
2526 // -0x0f, 0x05, 0x05, 0x09,
2527 // });
2528 // try testArgs(@Vector(8, i5), .{
2529 // -0x04, -0x04, 0x05, -0x05, 0x0f, -0x0e, 0x0f, -0x0e,
2530 // }, .{
2531 // -0x09, -0x0d, 0x02, 0x01, 0x08, -0x05, -0x09, -0x03,
2532 // });
2533 // try testArgs(@Vector(16, i5), .{
2534 // -0x0e, -0x08, -0x10, -0x0b, -0x10, -0x09, -0x0f, -0x05, -0x10, 0x06, 0x0d, -0x04, 0x09, -0x0e, -0x10, -0x10,
2535 // }, .{
2536 // 0x03, 0x0b, 0x0c, 0x06, -0x0d, 0x0e, -0x09, -0x04, 0x0a, -0x0e, -0x0d, 0x0f, -0x09, -0x0e, -0x0b, 0x03,
2537 // });
2538 // try testArgs(@Vector(32, i5), .{
2539 // -0x08, -0x05, 0x09, -0x08, 0x01, 0x0e, -0x0c, 0x0b, -0x0e, 0x0f, -0x0b, 0x01, -0x03, 0x03, 0x08, 0x04,
2540 // 0x02, 0x0f, -0x0b, -0x0b, 0x0d, 0x00, 0x09, 0x00, -0x06, -0x08, -0x01, 0x0b, 0x05, 0x03, -0x05, -0x07,
2541 // }, .{
2542 // -0x0c, 0x07, 0x0d, -0x09, 0x0a, 0x06, -0x0b, -0x07, -0x0a, 0x08, 0x07, -0x0d, 0x08, 0x07, 0x09, -0x07,
2543 // 0x0b, -0x02, -0x02, -0x02, -0x06, -0x08, 0x0a, -0x0a, 0x02, -0x07, -0x0a, 0x0d, -0x07, -0x05, -0x0e, 0x05,
2544 // });
2545 // try testArgs(@Vector(64, i5), .{
2546 // 0x04, -0x0d, 0x0d, -0x01, 0x07, 0x0c, 0x00, 0x01, -0x07, 0x0a, -0x01, -0x01, 0x08, -0x0b, -0x03, -0x06,
2547 // -0x03, -0x03, -0x0c, 0x0e, -0x0c, -0x02, 0x07, -0x03, 0x0e, -0x0a, -0x0e, -0x06, -0x08, 0x0a, -0x0c, -0x0c,
2548 // 0x06, -0x04, 0x04, 0x00, 0x05, 0x07, 0x04, 0x06, -0x01, 0x0a, 0x07, -0x08, 0x00, 0x0f, 0x0f, 0x0d,
2549 // -0x07, 0x0f, 0x05, -0x0b, -0x08, -0x0c, 0x0d, -0x05, -0x05, 0x0e, 0x02, 0x06, 0x0d, 0x06, 0x00, 0x0a,
2550 // }, .{
2551 // 0x02, -0x09, -0x01, -0x10, -0x0c, -0x0f, -0x10, -0x0d, 0x02, 0x0e, 0x07, -0x01, -0x0a, -0x0b, 0x05, -0x0e,
2552 // -0x09, 0x03, 0x08, -0x0d, 0x0d, 0x03, -0x02, 0x0e, 0x0c, 0x03, 0x0b, -0x0d, -0x04, -0x10, 0x0e, 0x0d,
2553 // 0x09, -0x03, -0x0e, -0x03, -0x05, -0x0c, -0x07, 0x08, -0x06, 0x08, -0x0e, 0x02, -0x10, 0x01, 0x01, -0x0a,
2554 // 0x01, -0x09, 0x03, -0x01, 0x05, 0x09, 0x06, -0x03, -0x0a, 0x08, -0x0e, 0x0e, 0x07, -0x05, -0x0c, -0x10,
2555 // });
2556 // try testArgs(@Vector(128, i5), .{
2557 // 0x01, 0x0b, -0x01, -0x10, -0x05, 0x05, -0x09, 0x0e, -0x0e, 0x04, 0x0f, -0x06, 0x0f, 0x04, -0x02, 0x0a,
2558 // -0x08, -0x06, 0x08, -0x07, -0x08, 0x0e, 0x06, 0x0d, -0x07, -0x04, 0x04, -0x0b, 0x02, -0x06, 0x07, -0x10,
2559 // 0x0d, 0x09, 0x0b, -0x04, 0x0e, -0x06, -0x0a, 0x01, 0x06, 0x08, 0x01, -0x0b, -0x09, -0x08, -0x0c, -0x0b,
2560 // 0x07, 0x06, 0x0d, 0x0c, -0x0b, -0x03, -0x06, -0x0c, -0x0e, 0x05, 0x0b, 0x08, -0x01, 0x00, 0x01, 0x0a,
2561 // 0x00, 0x0a, 0x06, 0x06, -0x10, -0x05, -0x05, -0x0f, 0x02, -0x06, -0x08, -0x08, 0x0f, 0x09, -0x07, -0x05,
2562 // 0x07, 0x06, 0x03, 0x05, 0x02, 0x0f, 0x0d, -0x0e, -0x03, -0x01, -0x06, -0x02, -0x01, -0x07, 0x09, 0x05,
2563 // -0x07, -0x07, -0x08, 0x0c, -0x0e, 0x09, -0x0c, -0x0d, 0x07, 0x04, 0x07, -0x03, 0x09, 0x0e, 0x04, 0x02,
2564 // 0x0f, -0x02, -0x10, -0x03, -0x0d, -0x04, 0x0c, -0x06, -0x01, -0x0e, -0x0e, -0x0a, 0x0d, -0x0e, 0x04, 0x03,
2565 // }, .{
2566 // -0x08, -0x09, -0x04, 0x0f, -0x0f, -0x08, -0x04, 0x0b, 0x09, -0x0b, -0x02, 0x0f, 0x01, -0x01, -0x0a, -0x0a,
2567 // 0x08, 0x09, 0x0d, -0x06, 0x0f, -0x02, 0x0c, 0x01, 0x0c, 0x02, -0x04, 0x0b, 0x05, 0x02, -0x08, -0x09,
2568 // 0x01, 0x0f, -0x0b, 0x02, -0x06, 0x08, -0x0e, -0x02, -0x0b, -0x03, -0x01, 0x0c, 0x09, -0x04, 0x08, -0x0a,
2569 // 0x09, -0x05, 0x08, 0x0e, 0x05, 0x03, -0x0a, 0x0d, -0x03, 0x06, 0x0f, -0x09, 0x0a, 0x03, 0x02, 0x0c,
2570 // 0x08, -0x0a, 0x06, 0x0e, 0x08, 0x02, 0x08, -0x04, -0x0d, -0x02, -0x08, -0x0a, 0x0a, 0x0c, -0x03, 0x04,
2571 // 0x0b, -0x0c, -0x0e, 0x01, 0x07, -0x01, 0x09, 0x0f, -0x06, -0x05, -0x0e, -0x01, -0x04, 0x0a, -0x0a, -0x0d,
2572 // -0x10, -0x10, -0x03, -0x0f, -0x0c, -0x0a, -0x0b, -0x06, -0x04, -0x0f, -0x0b, -0x08, 0x0e, 0x04, -0x01, -0x0b,
2573 // -0x06, 0x0a, 0x0a, -0x0c, -0x0c, 0x0b, -0x02, 0x0c, -0x04, -0x06, -0x0c, -0x09, -0x09, -0x0b, -0x0c, -0x0b,
2574 // });
25752385 try testArgs(@Vector(1, i5), .{
2576 -0x0f,
2386 0x03,
25772387 }, .{
2578 -0x03,
2388 0x0a,
25792389 });
25802390 try testArgs(@Vector(2, i5), .{
2581 0x0b, -0x04,
2391 0x0c, -0x0e,
25822392 }, .{
2583 -0x05, -0x08,
2393 -0x0f, -0x0e,
25842394 });
25852395 try testArgs(@Vector(4, i5), .{
2586 0x08, 0x0f, -0x06, -0x0d,
2396 -0x0a, 0x06, -0x05, 0x09,
25872397 }, .{
2588 -0x03, -0x0a, -0x05, -0x03,
2398 -0x0f, 0x05, 0x05, 0x09,
25892399 });
25902400 try testArgs(@Vector(8, i5), .{
2591 0x08, 0x0c, 0x07, 0x00, -0x06, 0x08, 0x08, 0x0d,
2401 -0x04, -0x04, 0x05, -0x05, 0x0f, -0x0e, 0x0f, -0x0e,
25922402 }, .{
2593 0x07, 0x09, 0x05, -0x08, 0x08, -0x0e, -0x0e, -0x0e,
2403 -0x09, -0x0d, 0x02, 0x01, 0x08, -0x05, -0x09, -0x03,
25942404 });
25952405 try testArgs(@Vector(16, i5), .{
2596 0x06, 0x0b, 0x07, 0x0e, 0x0e, 0x02, -0x08, -0x0b, -0x03, 0x09, -0x08, 0x0e, -0x03, -0x0a, 0x01, 0x0b,
2406 -0x0e, -0x08, -0x10, -0x0b, -0x10, -0x09, -0x0f, -0x05, -0x10, 0x06, 0x0d, -0x04, 0x09, -0x0e, -0x10, -0x10,
25972407 }, .{
2598 -0x05, 0x0f, -0x08, -0x10, -0x07, 0x06, 0x08, 0x01, 0x0a, 0x06, 0x05, -0x0f, 0x03, 0x05, 0x0b, -0x06,
2408 0x03, 0x0b, 0x0c, 0x06, -0x0d, 0x0e, -0x09, -0x04, 0x0a, -0x0e, -0x0d, 0x0f, -0x09, -0x0e, -0x0b, 0x03,
25992409 });
26002410 try testArgs(@Vector(32, i5), .{
2601 0x0e, 0x07, -0x08, 0x0b, 0x04, -0x05, 0x0f, 0x02, 0x04, -0x0c, 0x0d, 0x09, 0x0e, -0x02, -0x0f, 0x04,
2602 -0x03, -0x02, 0x09, -0x0d, 0x01, 0x00, -0x0e, -0x0a, 0x02, -0x06, 0x0c, 0x03, 0x06, 0x0e, 0x06, -0x07,
2411 -0x08, -0x05, 0x09, -0x08, 0x01, 0x0e, -0x0c, 0x0b, -0x0e, 0x0f, -0x0b, 0x01, -0x03, 0x03, 0x08, 0x04,
2412 0x02, 0x0f, -0x0b, -0x0b, 0x0d, 0x00, 0x09, 0x00, -0x06, -0x08, -0x01, 0x0b, 0x05, 0x03, -0x05, -0x07,
26032413 }, .{
2604 -0x0a, 0x01, 0x0a, -0x10, 0x06, 0x09, 0x0e, 0x03, 0x0e, -0x09, 0x08, -0x08, 0x06, 0x0c, -0x0a, -0x07,
2605 0x04, -0x02, -0x09, 0x0b, 0x0e, -0x03, -0x01, -0x0d, 0x0e, -0x0a, -0x02, 0x08, 0x0e, 0x02, -0x04, -0x05,
2414 -0x0c, 0x07, 0x0d, -0x09, 0x0a, 0x06, -0x0b, -0x07, -0x0a, 0x08, 0x07, -0x0d, 0x08, 0x07, 0x09, -0x07,
2415 0x0b, -0x02, -0x02, -0x02, -0x06, -0x08, 0x0a, -0x0a, 0x02, -0x07, -0x0a, 0x0d, -0x07, -0x05, -0x0e, 0x05,
26062416 });
26072417 try testArgs(@Vector(64, i5), .{
2608 0x04, 0x02, -0x04, -0x0a, -0x0b, -0x0b, -0x0c, -0x08, -0x0b, -0x05, 0x0c, 0x0b, 0x05, 0x02, -0x01, -0x06,
2609 -0x09, -0x06, 0x0a, 0x0f, -0x06, -0x0d, 0x0c, 0x05, 0x0b, -0x06, -0x02, 0x09, 0x0e, -0x09, 0x05, 0x0a,
2610 -0x0c, 0x0b, -0x01, -0x04, 0x01, 0x0c, 0x0f, -0x0f, -0x07, 0x0a, 0x04, 0x02, 0x08, -0x01, -0x03, 0x0a,
2611 -0x0e, -0x04, -0x03, -0x0b, -0x01, 0x02, -0x05, 0x08, -0x03, 0x02, -0x01, -0x05, 0x07, -0x09, 0x0f, 0x00,
2418 0x04, -0x0d, 0x0d, -0x01, 0x07, 0x0c, 0x00, 0x01, -0x07, 0x0a, -0x01, -0x01, 0x08, -0x0b, -0x03, -0x06,
2419 -0x03, -0x03, -0x0c, 0x0e, -0x0c, -0x02, 0x07, -0x03, 0x0e, -0x0a, -0x0e, -0x06, -0x08, 0x0a, -0x0c, -0x0c,
2420 0x06, -0x04, 0x04, 0x00, 0x05, 0x07, 0x04, 0x06, -0x01, 0x0a, 0x07, -0x08, 0x00, 0x0f, 0x0f, 0x0d,
2421 -0x07, 0x0f, 0x05, -0x0b, -0x08, -0x0c, 0x0d, -0x05, -0x05, 0x0e, 0x02, 0x06, 0x0d, 0x06, 0x00, 0x0a,
26122422 }, .{
2613 -0x09, -0x02, -0x0a, -0x05, -0x05, -0x0d, 0x04, -0x05, 0x0e, -0x01, -0x07, 0x04, 0x0d, -0x0f, -0x09, -0x04,
2614 -0x0b, -0x0b, 0x0e, 0x01, 0x06, -0x0f, -0x0b, 0x03, -0x04, 0x05, -0x03, -0x09, 0x0a, 0x04, 0x04, -0x06,
2615 -0x02, 0x01, 0x0e, 0x0c, -0x10, 0x0f, -0x09, -0x08, -0x10, -0x02, -0x07, -0x0d, 0x08, 0x07, -0x03, 0x01,
2616 -0x0d, -0x10, -0x07, 0x08, 0x0d, 0x07, 0x09, 0x0f, 0x04, 0x06, -0x05, -0x09, 0x04, -0x04, -0x04, 0x0d,
2423 0x02, -0x09, -0x01, -0x10, -0x0c, -0x0f, -0x10, -0x0d, 0x02, 0x0e, 0x07, -0x01, -0x0a, -0x0b, 0x05, -0x0e,
2424 -0x09, 0x03, 0x08, -0x0d, 0x0d, 0x03, -0x02, 0x0e, 0x0c, 0x03, 0x0b, -0x0d, -0x04, -0x10, 0x0e, 0x0d,
2425 0x09, -0x03, -0x0e, -0x03, -0x05, -0x0c, -0x07, 0x08, -0x06, 0x08, -0x0e, 0x02, -0x10, 0x01, 0x01, -0x0a,
2426 0x01, -0x09, 0x03, -0x01, 0x05, 0x09, 0x06, -0x03, -0x0a, 0x08, -0x0e, 0x0e, 0x07, -0x05, -0x0c, -0x10,
26172427 });
26182428 try testArgs(@Vector(128, i5), .{
2619 -0x02, -0x07, -0x03, 0x08, -0x0b, -0x09, -0x0c, 0x0d, -0x0e, 0x08, -0x03, -0x09, 0x0a, 0x02, -0x0d, 0x05,
2620 -0x04, -0x0c, -0x07, 0x08, -0x0a, 0x04, 0x08, -0x07, 0x0c, 0x03, 0x0e, 0x0f, 0x08, -0x08, -0x02, -0x0a,
2621 -0x08, 0x04, -0x0c, -0x09, 0x0a, -0x0e, -0x04, -0x05, 0x02, 0x0d, -0x04, -0x0f, -0x0d, -0x02, 0x05, -0x07,
2622 0x06, 0x0b, -0x0b, -0x04, -0x04, -0x0e, -0x0c, 0x09, 0x02, -0x0c, 0x0e, 0x09, 0x02, -0x04, 0x05, 0x04,
2623 -0x0e, -0x02, -0x08, 0x05, 0x00, 0x0f, -0x0a, 0x0a, 0x0b, 0x0b, 0x02, -0x02, -0x0d, -0x08, -0x0d, 0x03,
2624 0x0b, -0x0b, 0x02, 0x05, -0x06, -0x07, -0x08, -0x0a, -0x09, -0x03, -0x0e, -0x0f, -0x0b, 0x03, 0x00, 0x09,
2625 0x07, 0x0a, -0x0b, 0x06, 0x01, -0x03, -0x0a, -0x09, -0x07, -0x0d, 0x0a, -0x0c, 0x01, -0x09, -0x01, -0x01,
2626 -0x09, 0x00, 0x0f, 0x05, -0x0b, 0x0c, 0x04, 0x0c, 0x0b, -0x08, 0x01, -0x05, -0x04, 0x02, 0x0c, 0x04,
2627 }, .{
2628 -0x08, -0x05, -0x0a, 0x06, -0x06, -0x04, 0x01, 0x07, 0x0d, -0x0a, -0x02, 0x0b, -0x01, -0x0c, -0x04, 0x0c,
2629 -0x06, 0x0d, 0x04, 0x0b, 0x07, 0x0c, 0x02, 0x02, -0x02, 0x09, 0x0d, -0x07, -0x08, 0x07, -0x04, 0x06,
2630 -0x0a, 0x07, 0x01, 0x07, -0x0d, 0x02, 0x09, -0x02, 0x0e, -0x08, -0x03, -0x07, 0x07, 0x0a, -0x0e, -0x06,
2631 0x0b, -0x0d, 0x0c, -0x06, -0x07, 0x0a, 0x0b, -0x0a, 0x05, 0x01, -0x0d, -0x08, -0x0e, -0x08, -0x07, -0x01,
2632 -0x10, 0x07, 0x03, 0x06, 0x03, 0x0a, 0x08, -0x0a, 0x04, -0x09, 0x0c, 0x01, -0x10, 0x02, 0x09, 0x0d,
2633 0x0f, -0x01, -0x06, -0x0a, 0x04, 0x01, 0x07, 0x07, 0x0e, 0x0e, -0x04, -0x0a, -0x03, 0x07, 0x07, -0x10,
2634 -0x04, 0x0e, -0x09, -0x0f, -0x0b, -0x0e, 0x0c, -0x0d, 0x0b, -0x06, 0x0f, -0x0d, 0x0b, 0x04, -0x10, -0x10,
2635 -0x0e, 0x09, 0x0d, -0x02, -0x0e, -0x06, -0x0b, -0x0f, -0x08, -0x0f, -0x0d, -0x0a, -0x02, 0x03, 0x0b, -0x0a,
2429 0x01, 0x0b, -0x01, -0x10, -0x05, 0x05, -0x09, 0x0e, -0x0e, 0x04, 0x0f, -0x06, 0x0f, 0x04, -0x02, 0x0a,
2430 -0x08, -0x06, 0x08, -0x07, -0x08, 0x0e, 0x06, 0x0d, -0x07, -0x04, 0x04, -0x0b, 0x02, -0x06, 0x07, -0x10,
2431 0x0d, 0x09, 0x0b, -0x04, 0x0e, -0x06, -0x0a, 0x01, 0x06, 0x08, 0x01, -0x0b, -0x09, -0x08, -0x0c, -0x0b,
2432 0x07, 0x06, 0x0d, 0x0c, -0x0b, -0x03, -0x06, -0x0c, -0x0e, 0x05, 0x0b, 0x08, -0x01, 0x00, 0x01, 0x0a,
2433 0x00, 0x0a, 0x06, 0x06, -0x10, -0x05, -0x05, -0x0f, 0x02, -0x06, -0x08, -0x08, 0x0f, 0x09, -0x07, -0x05,
2434 0x07, 0x06, 0x03, 0x05, 0x02, 0x0f, 0x0d, -0x0e, -0x03, -0x01, -0x06, -0x02, -0x01, -0x07, 0x09, 0x05,
2435 -0x07, -0x07, -0x08, 0x0c, -0x0e, 0x09, -0x0c, -0x0d, 0x07, 0x04, 0x07, -0x03, 0x09, 0x0e, 0x04, 0x02,
2436 0x0f, -0x02, -0x10, -0x03, -0x0d, -0x04, 0x0c, -0x06, -0x01, -0x0e, -0x0e, -0x0a, 0x0d, -0x0e, 0x04, 0x03,
2437 }, .{
2438 -0x08, -0x09, -0x04, 0x0f, -0x0f, -0x08, -0x04, 0x0b, 0x09, -0x0b, -0x02, 0x0f, 0x01, -0x01, -0x0a, -0x0a,
2439 0x08, 0x09, 0x0d, -0x06, 0x0f, -0x02, 0x0c, 0x01, 0x0c, 0x02, -0x04, 0x0b, 0x05, 0x02, -0x08, -0x09,
2440 0x01, 0x0f, -0x0b, 0x02, -0x06, 0x08, -0x0e, -0x02, -0x0b, -0x03, -0x01, 0x0c, 0x09, -0x04, 0x08, -0x0a,
2441 0x09, -0x05, 0x08, 0x0e, 0x05, 0x03, -0x0a, 0x0d, -0x03, 0x06, 0x0f, -0x09, 0x0a, 0x03, 0x02, 0x0c,
2442 0x08, -0x0a, 0x06, 0x0e, 0x08, 0x02, 0x08, -0x04, -0x0d, -0x02, -0x08, -0x0a, 0x0a, 0x0c, -0x03, 0x04,
2443 0x0b, -0x0c, -0x0e, 0x01, 0x07, -0x01, 0x09, 0x0f, -0x06, -0x05, -0x0e, -0x01, -0x04, 0x0a, -0x0a, -0x0d,
2444 -0x10, -0x10, -0x03, -0x0f, -0x0c, -0x0a, -0x0b, -0x06, -0x04, -0x0f, -0x0b, -0x08, 0x0e, 0x04, -0x01, -0x0b,
2445 -0x06, 0x0a, 0x0a, -0x0c, -0x0c, 0x0b, -0x02, 0x0c, -0x04, -0x06, -0x0c, -0x09, -0x09, -0x0b, -0x0c, -0x0b,
26362446 });
26372447
26382448 try testArgs(@Vector(1, u5), .{
......@@ -5452,6 +5262,17 @@ test addUnsafe {
54525262 try test_add_unsafe.testFloatVectors();
54535263}
54545264
5265inline fn addSafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
5266 @setRuntimeSafety(true);
5267 return @as(AddOneBit(Type), lhs) + rhs;
5268}
5269test addSafe {
5270 const test_add_safe = binary(addSafe, .{});
5271 try test_add_safe.testInts();
5272 try test_add_safe.testFloats();
5273 try test_add_safe.testFloatVectors();
5274}
5275
54555276inline fn addWrap(comptime Type: type, lhs: Type, rhs: Type) Type {
54565277 return lhs +% rhs;
54575278}
......@@ -5463,15 +5284,14 @@ test addWrap {
54635284
54645285inline fn subUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
54655286 @setRuntimeSafety(false);
5466 switch (@typeInfo(Scalar(Type))) {
5287 return switch (@typeInfo(Scalar(Type))) {
54675288 else => @compileError(@typeName(Type)),
54685289 .int => |int| switch (int.signedness) {
5469 .signed => {},
5470 .unsigned => return @as(AddOneBit(Type), @max(lhs, rhs)) - @min(lhs, rhs),
5290 .signed => @as(AddOneBit(Type), lhs) - rhs,
5291 .unsigned => @as(AddOneBit(Type), @max(lhs, rhs)) - @min(lhs, rhs),
54715292 },
5472 .float => {},
5473 }
5474 return @as(AddOneBit(Type), lhs) - rhs;
5293 .float => lhs - rhs,
5294 };
54755295}
54765296test subUnsafe {
54775297 const test_sub_unsafe = binary(subUnsafe, .{});
......@@ -5481,6 +5301,24 @@ test subUnsafe {
54815301 try test_sub_unsafe.testFloatVectors();
54825302}
54835303
5304inline fn subSafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
5305 @setRuntimeSafety(true);
5306 return switch (@typeInfo(Scalar(Type))) {
5307 else => @compileError(@typeName(Type)),
5308 .int => |int| switch (int.signedness) {
5309 .signed => @as(AddOneBit(Type), lhs) - rhs,
5310 .unsigned => @as(AddOneBit(Type), @max(lhs, rhs)) - @min(lhs, rhs),
5311 },
5312 .float => lhs - rhs,
5313 };
5314}
5315test subSafe {
5316 const test_sub_safe = binary(subSafe, .{});
5317 try test_sub_safe.testInts();
5318 try test_sub_safe.testFloats();
5319 try test_sub_safe.testFloatVectors();
5320}
5321
54845322inline fn subWrap(comptime Type: type, lhs: Type, rhs: Type) Type {
54855323 return lhs -% rhs;
54865324}
......@@ -5500,6 +5338,15 @@ test mulUnsafe {
55005338 try test_mul_unsafe.testIntVectors();
55015339}
55025340
5341inline fn mulSafe(comptime Type: type, lhs: Type, rhs: Type) DoubleBits(Type) {
5342 @setRuntimeSafety(true);
5343 return @as(DoubleBits(Type), lhs) * rhs;
5344}
5345test mulSafe {
5346 const test_mul_safe = binary(mulSafe, .{});
5347 try test_mul_safe.testInts();
5348}
5349
55035350inline fn mulWrap(comptime Type: type, lhs: Type, rhs: Type) Type {
55045351 return lhs *% rhs;
55055352}
......@@ -5606,6 +5453,30 @@ test min {
56065453 try test_min.testFloatVectors();
56075454}
56085455
5456inline fn addWithOverflow(comptime Type: type, lhs: Type, rhs: Type) struct { Type, u1 } {
5457 return @addWithOverflow(lhs, rhs);
5458}
5459test addWithOverflow {
5460 const test_add_with_overflow = binary(addWithOverflow, .{});
5461 try test_add_with_overflow.testInts();
5462}
5463
5464inline fn subWithOverflow(comptime Type: type, lhs: Type, rhs: Type) struct { Type, u1 } {
5465 return @subWithOverflow(lhs, rhs);
5466}
5467test subWithOverflow {
5468 const test_sub_with_overflow = binary(subWithOverflow, .{});
5469 try test_sub_with_overflow.testInts();
5470}
5471
5472inline fn mulWithOverflow(comptime Type: type, lhs: Type, rhs: Type) struct { Type, u1 } {
5473 return @mulWithOverflow(lhs, rhs);
5474}
5475test mulWithOverflow {
5476 const test_mul_with_overflow = binary(mulWithOverflow, .{});
5477 try test_mul_with_overflow.testInts();
5478}
5479
56095480inline fn equal(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs == rhs) {
56105481 return lhs == rhs;
56115482}
......@@ -5709,15 +5580,16 @@ test shl {
57095580 try test_shl.testInts();
57105581}
57115582
5712inline fn shlExact(comptime Type: type, lhs: Type, rhs: Type) Type {
5583inline fn shlExactUnsafe(comptime Type: type, lhs: Type, rhs: Type) Type {
5584 @setRuntimeSafety(false);
57135585 const bit_cast_rhs: @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(Type) } }) = @bitCast(rhs);
57145586 const truncate_rhs: Log2Int(Type) = @truncate(bit_cast_rhs);
57155587 const final_rhs = if (comptime cast(Log2Int(Type), @bitSizeOf(Type))) |bits| truncate_rhs % bits else truncate_rhs;
57165588 return @shlExact(lhs << final_rhs >> final_rhs, final_rhs);
57175589}
5718test shlExact {
5719 const test_shl_exact = binary(shlExact, .{});
5720 try test_shl_exact.testInts();
5590test shlExactUnsafe {
5591 const test_shl_exact_unsafe = binary(shlExactUnsafe, .{});
5592 try test_shl_exact_unsafe.testInts();
57215593}
57225594
57235595inline fn bitXor(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs ^ rhs) {
test/behavior/x86_64/math.zig+3
......@@ -153,6 +153,9 @@ pub noinline fn checkExpected(expected: anytype, actual: @TypeOf(expected), comp
153153 );
154154 },
155155 },
156 .@"struct" => |@"struct"| inline for (@"struct".fields) |field| {
157 try checkExpected(@field(expected, field.name), @field(actual, field.name), compare);
158 } else return,
156159 };
157160 if (switch (@typeInfo(Expected)) {
158161 else => unexpected,