diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index ccc870e363..74fbd03adb 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -8854,10 +8854,10 @@ fn asmExpr( return astgen.failNode(node, "assembly expression with no output must be marked volatile", .{}); } } - if (full.outputs.len > 32) { - return astgen.failNode(full.outputs[32], "too many asm outputs", .{}); + if (full.outputs.len >= 16) { + return astgen.failNode(full.outputs[16], "too many asm outputs", .{}); } - var outputs_buffer: [32]Zir.Inst.Asm.Output = undefined; + var outputs_buffer: [15]Zir.Inst.Asm.Output = undefined; const outputs = outputs_buffer[0..full.outputs.len]; var output_type_bits: u32 = 0; @@ -8893,10 +8893,10 @@ fn asmExpr( } } - if (full.inputs.len > 32) { + if (full.inputs.len >= 32) { return astgen.failNode(full.inputs[32], "too many asm inputs", .{}); } - var inputs_buffer: [32]Zir.Inst.Asm.Input = undefined; + var inputs_buffer: [31]Zir.Inst.Asm.Input = undefined; const inputs = inputs_buffer[0..full.inputs.len]; for (full.inputs, 0..) |input_node, i| { @@ -8912,7 +8912,7 @@ fn asmExpr( }; } - var clobbers_buffer: [32]u32 = undefined; + var clobbers_buffer: [63]u32 = undefined; var clobber_i: usize = 0; if (full.first_clobber) |first_clobber| clobbers: { // asm ("foo" ::: "a", "b") @@ -12932,14 +12932,14 @@ const GenZir = struct { } gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers); - // * 0b00000000_000XXXXX - `outputs_len`. - // * 0b000000XX_XXX00000 - `inputs_len`. - // * 0b0XXXXX00_00000000 - `clobbers_len`. + // * 0b00000000_0000XXXX - `outputs_len`. + // * 0b0000000X_XXXX0000 - `inputs_len`. + // * 0b0XXXXXX0_00000000 - `clobbers_len`. // * 0bX0000000_00000000 - is volatile - const small: u16 = @as(u16, @intCast(args.outputs.len)) | - @as(u16, @intCast(args.inputs.len << 5)) | - @as(u16, @intCast(args.clobbers.len << 10)) | - (@as(u16, @intFromBool(args.is_volatile)) << 15); + const small: u16 = @as(u16, @as(u4, @intCast(args.outputs.len))) << 0 | + @as(u16, @as(u5, @intCast(args.inputs.len))) << 4 | + @as(u16, @as(u6, @intCast(args.clobbers.len))) << 9 | + @as(u16, @intFromBool(args.is_volatile)) << 15; const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len); astgen.instructions.appendAssumeCapacity(.{ diff --git a/src/Sema.zig b/src/Sema.zig index ad800c29a6..5dbf26f375 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -16661,9 +16661,9 @@ fn zirAsm( const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand); const src = block.nodeOffset(extra.data.src_node); const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node }); - const outputs_len: u5 = @truncate(extended.small); - const inputs_len: u5 = @truncate(extended.small >> 5); - const clobbers_len: u5 = @truncate(extended.small >> 10); + const outputs_len: u4 = @truncate(extended.small); + const inputs_len: u5 = @truncate(extended.small >> 4); + const clobbers_len: u6 = @truncate(extended.small >> 9); const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0; const is_global_assembly = sema.func_index == .none; const zir_tags = sema.code.instructions.items(.tag); diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 88d186acef..c0eea14c92 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -83,7 +83,6 @@ end_di_column: u32, epilogue_relocs: std.ArrayListUnmanaged(Mir.Inst.Index) = .empty, reused_operands: std.StaticBitSet(Liveness.bpi - 1) = undefined, -const_tracking: ConstTrackingMap = .empty, inst_tracking: InstTrackingMap = .empty, // Key is the block instruction @@ -926,7 +925,6 @@ pub fn generate( while (block_it.next()) |block| block.deinit(gpa); function.blocks.deinit(gpa); function.inst_tracking.deinit(gpa); - function.const_tracking.deinit(gpa); function.epilogue_relocs.deinit(gpa); function.mir_instructions.deinit(gpa); function.mir_extra.deinit(gpa); @@ -2418,7 +2416,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { - @setEvalBranchQuota(13_900); + @setEvalBranchQuota(15_100); const pt = cg.pt; const zcu = pt.zcu; const ip = &zcu.intern_pool; @@ -2459,9 +2457,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .mul_sat => try cg.airMulSat(inst), .shl_sat => try cg.airShlSat(inst), - .add_with_overflow => try cg.airAddSubWithOverflow(inst), - .sub_with_overflow => try cg.airAddSubWithOverflow(inst), - .mul_with_overflow => try cg.airMulWithOverflow(inst), .shl_with_overflow => try cg.airShlWithOverflow(inst), .bitcast => try cg.airBitCast(inst), @@ -28019,6 +28014,5377 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }; try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); }, + .add_with_overflow => |air_tag| if (use_old) try cg.airAddSubWithOverflow(inst) else fallback: { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; + if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airAddSubWithOverflow(inst); + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + var res: [2]Temp = undefined; + cg.select(&res, &.{ ty_pl.ty.toType(), .u1 }, &ops, comptime &.{ .{ + .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_unsigned_int = 8 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .po } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0b, .src1b, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._l, .sa, .dst0b, .uia(8, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0b, .uia(8, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .@"test", .tmp0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0b, .src1b, ._, ._ }, + .{ ._, ._, .@"and", .dst0b, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .cmp, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_unsigned_int = 16 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + }, + .extra_temps = .{ + .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0w, .src1w, ._, ._ }, + .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + }, + .extra_temps = .{ + .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0w, .src1w, ._, ._ }, + .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ }, + } }, + }, .{ + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0w, .src1w, ._, ._ }, + .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .cmp, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, + .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .cmp, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .cmp, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_unsigned_int = 32 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .exact_signed_int = 31 }, .{ .exact_signed_int = 31 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ui(1), ._, ._ }, + .{ ._, ._, .add, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._rx, .sa, .dst0d, .dst0d, .tmp0d, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, + .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .cmp, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_unsigned_int = 64 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .exact_signed_int = 63 }, .{ .exact_signed_int = 63 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0q, .src1q, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ui(1), ._, ._ }, + .{ ._, ._, .add, .dst0q, .dst0q, ._, ._ }, + .{ ._, ._rx, .sa, .dst0q, .dst0q, .tmp0q, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i64, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .add, .dst0q, .src1q, ._, ._ }, + .{ ._, ._l, .ro, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ }, + .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .b } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size), ._, ._ }, + .{ ._, ._, .add, .dst0q, .src1q, ._, ._ }, + .{ ._, ._, .bzhi, .dst0q, .dst0q, .tmp0q, ._ }, + .{ ._, ._, .cmp, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .{ .cc = .b } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .add, .src0q, .src1q, ._, ._ }, + .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ }, + .{ ._, ._, .cmp, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .none }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ }, + .{ ._, ._o, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_src0_size), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ }, + .{ ._, ._l, .ro, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .dst1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .adc, .dst1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .dst1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .dst1q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .adc, .dst1q, .memad(.src1q, .add_size, -16), ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .dst1q, .tmp0q, ._ }, + .{ ._, ._r, .sh, .dst1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .dst1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .adc, .dst1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .dst1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .dst1q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .adc, .dst1q, .memad(.src1q, .add_size, -16), ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .dst1q, ._, ._ }, + .{ ._, ._r, .sh, .dst1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._l, .ro, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .dst1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .dst1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .dst1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .dst1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .adc, .dst1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .dst1q, .tmp0q, ._ }, + .{ ._, ._r, .sh, .dst1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .dst1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .dst1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .dst1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .dst1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .adc, .dst1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .dst1q, ._, ._ }, + .{ ._, ._r, .sh, .dst1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ + @tagName(air_tag), + ty_pl.ty.toType().fmt(pt), + ops[0].tracking(cg), + ops[1].tracking(cg), + }), + else => |e| return e, + }; + try res[0].withOverflow(&res[1], cg); + try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + .sub_with_overflow => |air_tag| if (use_old) try cg.airAddSubWithOverflow(inst) else fallback: { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; + if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airAddSubWithOverflow(inst); + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + var res: [2]Temp = undefined; + cg.select(&res, &.{ ty_pl.ty.toType(), .u1 }, &ops, comptime &.{ .{ + .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_unsigned_int = 8 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .po } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._l, .sa, .dst0b, .uia(8, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0b, .uia(8, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .@"test", .tmp0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ }, + .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0b, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0b, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_unsigned_int = 16 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + }, + .extra_temps = .{ + .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ }, + .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ }, + .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ }, + } }, + }, .{ + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ }, + .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ }, + .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_unsigned_int = 32 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .exact_signed_int = 31 }, .{ .exact_signed_int = 31 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ui(1), ._, ._ }, + .{ ._, ._, .add, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._rx, .sa, .dst0d, .dst0d, .tmp0d, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ }, + .{ ._, ._l, .ro, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .ro, .tmp0d, .ui(1), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ }, + .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_unsigned_int = 64 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .exact_signed_int = 63 }, .{ .exact_signed_int = 63 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u8, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ui(1), ._, ._ }, + .{ ._, ._, .add, .dst0q, .dst0q, ._, ._ }, + .{ ._, ._rx, .sa, .dst0q, .dst0q, .tmp0q, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i64, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ }, + .{ ._, ._l, .ro, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ }, + .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size), ._, ._ }, + .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .bzhi, .dst0q, .dst0q, .tmp0q, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .ref = .src1 } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size), ._, ._ }, + .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .bzhi, .dst0q, .dst0q, .tmp0q, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .to_mut_gpr, .immut_gpr, .none } }, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .{ .rc = .general_purpose } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst1d, .dst1d, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .sub, .src0q, .src1q, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{ .{ .rc = .general_purpose }, .{ .ref = .src1 } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .sub, .src0q, .src1q, ._, ._ }, + .{ ._, ._c, .set, .dst1b, ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .none }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ }, + .{ ._, ._o, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_src0_size), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ }, + .{ ._, ._l, .ro, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .none }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ }, + .{ ._, ._c, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .none }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -16), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ }, + .{ ._, ._c, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .o } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._l, .ro, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .ro, .tmp0q, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .none }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._c, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .none }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp1q, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._c, .set, .mema(.dst0b, .add_src0_size), ._, ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ + @tagName(air_tag), + ty_pl.ty.toType().fmt(pt), + ops[0].tracking(cg), + ops[1].tracking(cg), + }), + else => |e| return e, + }; + try res[0].withOverflow(&res[1], cg); + try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + .mul_with_overflow => |air_tag| if (use_old) try cg.airMulWithOverflow(inst) else fallback: { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; + if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airMulWithOverflow(inst); + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + var res: [2]Temp = undefined; + cg.select(&res, &.{ ty_pl.ty.toType(), .u1 }, &ops, comptime &.{ .{ + .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .al }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .al }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .al }, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .src1b, ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_unsigned_int = 8 }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .al }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .al }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .al }, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mul, .src1b, ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .al }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .al }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .al }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .ne } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .src1b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._l, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .cmp, .dst0w, .tmp0w, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .al }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .al }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .al }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .nbe } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mul, .src1b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, + .{ ._, ._, .@"and", .dst0b, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .cmp, .tmp0w, .ua(.src0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .imm16, .none } }, + .{ .src = .{ .imm16, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_gpr, .none }, .commute = .{ 0, 1 } }, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .dst0w, .src0w, .src1w, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_unsigned_int = 16 }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .ax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u16, .kind = .{ .reg = .dx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mul, .src1w, ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .ax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i32, .kind = .{ .reg = .edx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .ne } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, .i_, .mul, .src1w, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp0d, .ui(16), ._, ._ }, + .{ ._, ._, .mov, .tmp0w, .dst0w, ._, ._ }, + .{ ._, ._l, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .cmp, .dst0d, .tmp0d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .ax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u16, .kind = .{ .reg = .dx } }, + .{ .type = .u16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mul, .src1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ }, + .{ ._, ._, .@"and", .dst0w, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp1w, .uia(std.math.maxInt(u16), .src0, .sub_umax), ._, ._ }, + .{ ._, ._, .@"or", .tmp1w, .tmp0w, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .ax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u16, .kind = .{ .reg = .dx } }, + .{ .type = .u16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mul, .src1w, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp1d, .uia(std.math.maxInt(u16), .src0, .sub_umax), ._, ._ }, + .{ ._, ._, .@"or", .tmp1d, .tmp0d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .imm32, .none } }, + .{ .src = .{ .imm32, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_gpr, .none }, .commute = .{ 0, 1 } }, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .dst0d, .src0d, .src1d, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_unsigned_int = 32 }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .eax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mul, .src1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .eax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i32, .kind = .{ .reg = .edx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .ne } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .src1d, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp0q, .ui(32), ._, ._ }, + .{ ._, ._, .@"or", .tmp0q, .dst0q, ._, ._ }, + .{ ._, ._l, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .cmp, .dst0q, .tmp0q, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .eax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .ref = .src0 } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } }, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mul, .src1d, ._, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .tmp0d, ._, ._ }, + .{ ._, ._r, .sh, .tmp0d, .sa(.src0, .add_bit_size), ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .@"or", .tmp0d, .tmp1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .simm32, .none } }, + .{ .src = .{ .simm32, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_gpr, .none }, .commute = .{ 0, 1 } }, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .dst0q, .src0q, .src1d, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_unsigned_int = 64 }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .eax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .c } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mul, .src1q, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .rax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .rax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .rax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .i64, .kind = .{ .reg = .rdx } }, + .{ .type = .i64, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .src1q, ._, ._, ._ }, + .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .dst0q, ._, ._ }, + .{ ._, ._l, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0q, .uia(64, .src0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .dst0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp1q, .tmp0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .rax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .rax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .rax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u64, .kind = .{ .ref = .src0 } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } }, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mul, .src1q, ._, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_bit_size), ._, ._ }, + .{ ._, ._, .bzhi, .dst0q, .tmp0q, .dst0q, ._ }, + .{ ._, ._, .xor, .tmp0q, .dst0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp0q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .rax }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .rax }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .rax }, .to_gpr, .none } }, + }, + .extra_temps = .{ + .{ .type = .u64, .kind = .{ .ref = .src0 } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .mut_rc = .{ .ref = .src1, .rc = .general_purpose } }, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mul, .src1q, ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .dst0q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp0q, .dst0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp0q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, .slow_incdec, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, .slow_incdec, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, .slow_incdec, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, .slow_incdec, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp8q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._nz, .cmov, .tmp2q, .tmp8q, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp5p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp1q, ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp6q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp10q, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp7b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp10q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp9q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp9q, .tmp3q, ._, ._ }, + .{ ._, ._, .mul, .tmp6q, ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp7b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp9q, .tmp8q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp5, .add_src0_size), .tmp9q, ._, ._ }, + .{ ._, ._c, .in, .tmp5p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp10q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp6q, .leasi(.tmp2q, .@"8", .tmp5), ._, ._ }, + .{ ._, ._, .xor, .tmp6q, .tmp3q, ._, ._ }, + .{ ._, ._, .@"or", .tmp10q, .tmp6q, ._, ._ }, + .{ .@"2:", ._c, .de, .tmp5d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp10q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp2p, .lead(.tmp2, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .sia(1, .src0, .sub_size_div_8), ._, ._ }, + .{ ._, ._, .mov, .tmp5q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp3b, ._, ._ }, + .{ ._, ._e, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src0, .add_size, -8), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp2q, .memad(.src1, .add_size, -8), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .leasi(.tmp2q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8d, .tmp7d, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .lea(.tmp2q), ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._c, .st, ._, ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp8q, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._, .adc, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ }, + .{ ._, ._r, .rc, .tmp6b, .ui(1), ._, ._ }, + .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp0q, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp8q, .tmp5q, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .add, .tmp6b, .tmp6b, ._, ._ }, + .{ ._, ._, .sbb, .tmp8q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ .@"2:", ._o, .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp8q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp7b, ._, ._ }, + .{ .@"1:", ._r, .sh, .tmp5q, .ui(63), ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp5q, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .src0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .xor, .tmp1q, .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .adx, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .isize, .kind = .{ .reg = .rcx } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, ._z, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .leaad(.tmp0, .sub_src0_size, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ .@"1:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp1q, .tmp5), ._ }, + .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_size, -8), .tmp7q, ._, ._ }, + .{ ._, ._rcxz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ }, + .{ ._, ._mp, .j, .@"1b", ._, ._, ._ }, + .{ .@"2:", ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp4d, .tmp0d, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .tmp3q, ._, ._ }, + .{ ._, ._x, .adc, .tmp8q, .tmp3q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leaid(.tmp1q, .tmp4, 8), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp4d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp2q, .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .adx, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .isize, .kind = .{ .reg = .rcx } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, ._z, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .leaad(.tmp0, .sub_src0_size, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ .@"1:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp1q, .tmp5), ._ }, + .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_size, -8), .tmp7q, ._, ._ }, + .{ ._, ._rcxz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ }, + .{ ._, ._mp, .j, .@"1b", ._, ._, ._ }, + .{ .@"2:", ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp4d, .tmp0d, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .tmp3q, ._, ._ }, + .{ ._, ._x, .adc, .tmp8q, .tmp3q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leai(.tmp1q, .tmp4), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp4d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .adx, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .isize, .kind = .{ .reg = .rcx } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, ._z, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .leaad(.tmp0, .sub_src0_size, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ .@"1:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp1q, .tmp5), ._ }, + .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_size, -8), .tmp7q, ._, ._ }, + .{ ._, ._rcxz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ }, + .{ ._, ._mp, .j, .@"1b", ._, ._, ._ }, + .{ .@"2:", ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp4d, .tmp0d, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .tmp3q, ._, ._ }, + .{ ._, ._x, .adc, .tmp8q, .tmp3q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leai(.tmp1q, .tmp4), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp4d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -16), ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .ui(0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .adx, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .isize, .kind = .{ .reg = .rcx } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, ._z, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .leaad(.tmp0, .sub_src0_size, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ .@"1:", ._x, .mul, .tmp8q, .tmp7q, .leai(.tmp1q, .tmp5), ._ }, + .{ ._, ._x, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memiad(.dst0q, .tmp5, .add_src0_size, -8), .tmp7q, ._, ._ }, + .{ ._, ._rcxz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .memia(.dst0q, .tmp5, .add_src0_size), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._, .lea, .tmp5p, .lead(.tmp5, 8), ._, ._ }, + .{ ._, ._mp, .j, .@"1b", ._, ._, ._ }, + .{ .@"2:", ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp4d, .tmp0d, ._, ._ }, + .{ ._, ._x, .ado, .tmp8q, .tmp3q, ._, ._ }, + .{ ._, ._x, .adc, .tmp8q, .tmp3q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leai(.tmp1q, .tmp4), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp4d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ .@"2:", ._x, .mul, .tmp8q, .tmp7q, .leasi(.tmp1q, .@"8", .tmp3), ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .@"or", .tmp5q, .tmp8q, ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp5q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp5q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .bzhi, .tmp0q, .tmp1q, .tmp0q, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._, .sub, .tmp3d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._ae, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + .unused, + }, + .dst_temps = .{ .mem, .{ .cc = .nz } }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memd(.src1, 8), ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .lea, .tmp3p, .leaa(.tmp0, .sub_src0_size_div_8), ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .xor, .tmp5d, .tmp5d, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"or", .tmp4q, .memsi(.src0q, .@"8", .tmp0), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._mp, .j, .@"3f", ._, ._, ._ }, + .{ .@"1:", ._, .adc, .tmp8q, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), ._, ._ }, + .{ ._, ._, .adc, .tmp5b, .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp6q, .tmp8q, ._, ._ }, + .{ .@"2:", ._, .mov, .tmp7q, .tmp4q, ._, ._ }, + .{ ._, ._, .mul, .leasi(.tmp1q, .@"8", .tmp3), ._, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .adc, .tmp7q, .tmp6q, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp3, .add_src0_size), .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp3p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp0d, ._, ._ }, + .{ ._, ._, .adc, .tmp8q, .si(0), ._, ._ }, + .{ ._, ._mp, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", ._, .@"or", .tmp8q, .leasi(.tmp1q, .@"8", .tmp3), ._, ._ }, + .{ .@"2:", ._c, .de, .tmp3d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ .@"3:", ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.dst0q, .add_src0_size, -8), ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ }, + .{ ._, ._r, .sh, .tmp1q, .ua(.src0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_src0_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp1q, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ + @tagName(air_tag), + ty_pl.ty.toType().fmt(pt), + ops[0].tracking(cg), + ops[1].tracking(cg), + }), + else => |e| return e, + }; + try res[0].withOverflow(&res[1], cg); + try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, .alloc => if (use_old) try cg.airAlloc(inst) else { const ty = air_datas[@intFromEnum(inst)].ty; const slot = try cg.tempInit(ty, .{ .lea_frame = .{ @@ -97522,9 +102888,6 @@ fn lowerSwitchBr( const relocs = try allocator.alloc(Mir.Inst.Index, case.items.len + case.ranges.len); defer allocator.free(relocs); - var cond_temp = try cg.tempInit(condition_ty, condition); - const reset_index = cg.next_temp_index; - try cg.spillEflagsIfOccupied(); for (case.items, relocs[0..case.items.len]) |item, *reloc| { const item_mcv = try cg.resolveInst(item); @@ -97535,6 +102898,7 @@ fn lowerSwitchBr( else => unreachable, }, else => cc: { + var cond_temp = try cg.tempInit(condition_ty, condition); var item_temp = try cg.tempInit(condition_ty, item_mcv); const cc_temp = cond_temp.cmpInts(.eq, &item_temp, cg) catch |err| switch (err) { error.SelectFailed => unreachable, @@ -97543,7 +102907,8 @@ fn lowerSwitchBr( try item_temp.die(cg); const cc = cc_temp.tracking(cg).short.eflags; try cc_temp.die(cg); - try cg.resetTemps(reset_index); + try cond_temp.die(cg); + try cg.resetTemps(@enumFromInt(0)); break :cc cc; }, }; @@ -97551,6 +102916,7 @@ fn lowerSwitchBr( } for (case.ranges, relocs[case.items.len..]) |range, *reloc| { + var cond_temp = try cg.tempInit(condition_ty, condition); const min_mcv = try cg.resolveInst(range[0]); const max_mcv = try cg.resolveInst(range[1]); // `null` means always false. @@ -97594,7 +102960,8 @@ fn lowerSwitchBr( break :cc cc; }, }; - try cg.resetTemps(reset_index); + try cond_temp.die(cg); + try cg.resetTemps(@enumFromInt(0)); // "Success" case is in `reloc`.... if (lte_max) |cc| { reloc.* = try cg.asmJccReloc(cc, undefined); @@ -97605,8 +102972,6 @@ fn lowerSwitchBr( if (lt_min_reloc) |r| cg.performReloc(r); } - try cond_temp.die(cg); - try cg.resetTemps(@enumFromInt(0)); cg.checkInvariantsAfterAirInst(); // The jump to skip this case if the conditions all failed. @@ -97813,6 +103178,19 @@ fn performReloc(self: *CodeGen, reloc: Mir.Inst.Index) void { .pseudo_j_z_and_np_inst, .pseudo_j_nz_or_p_inst => {}, else => unreachable, }, + .lea => switch (self.mir_instructions.items(.ops)[reloc]) { + .rm => { + const rx = self.mir_instructions.items(.data)[reloc].rx; + assert(rx.fixes == ._); + const mem_info: Mir.Memory.Info = @bitCast( + self.mir_extra.items[rx.payload + std.meta.fieldIndex(Mir.Memory, "info").?], + ); + assert(mem_info.base == .rip_inst); + self.mir_extra.items[rx.payload + std.meta.fieldIndex(Mir.Memory, "base").?] = next_inst; + return; + }, + else => unreachable, + }, else => unreachable, } self.mir_instructions.items(.data)[reloc].inst.inst = next_inst; @@ -98096,7 +103474,10 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void { // for the string, we still use the next u32 for the null terminator. extra_i += clobber.len / 4 + 1; - if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory")) { + if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory") or + std.mem.eql(u8, clobber, "fpsr") or std.mem.eql(u8, clobber, "fpcr") or + std.mem.eql(u8, clobber, "mxcsr") or std.mem.eql(u8, clobber, "dirflag")) + { // ok, sure } else if (std.mem.eql(u8, clobber, "cc") or std.mem.eql(u8, clobber, "flags") or @@ -98361,7 +103742,24 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void { else .@"1"; if (sib_it.next()) |_| return self.fail("invalid memory operand: '{s}'", .{op_str}); - op.* = if (std.mem.eql(u8, base_str, "%%dx") and index_str.len == 0) .{ .reg = .dx } else .{ .mem = .{ + op.* = if (std.mem.eql(u8, base_str, "%%dx") and index_str.len == 0) + .{ .reg = .dx } + else if (std.mem.eql(u8, base_str, "%%rip") and index_str.len == 0 and + Label.isValid(.reference, op_str[0..open])) + op: { + const anon = std.ascii.isDigit(op_str[0]); + const label_gop = try labels.getOrPut(self.gpa, op_str[0..if (anon) 1 else open]); + if (anon and (op_str[1] == 'b' or op_str[1] == 'B') and !label_gop.found_existing) + return self.fail("undefined label: '{s}'", .{op_str}); + if (!label_gop.found_existing) label_gop.value_ptr.* = .{}; + const pending_relocs = &label_gop.value_ptr.pending_relocs; + if (if (anon) + op_str[1] == 'f' or op_str[1] == 'F' + else + !label_gop.found_existing or pending_relocs.items.len > 0) + try pending_relocs.append(self.gpa, @intCast(self.mir_instructions.len)); + break :op .{ .mem = .{ .base = .{ .rip_inst = label_gop.value_ptr.target } } }; + } else .{ .mem = .{ .base = if (base_str.len > 0) .{ .reg = parseRegName(base_str["%%".len..]) orelse return self.fail("invalid base register: '{s}'", .{base_str}) } @@ -98405,9 +103803,9 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void { } else if (Label.isValid(.reference, op_str)) { const anon = std.ascii.isDigit(op_str[0]); const label_gop = try labels.getOrPut(self.gpa, op_str[0..if (anon) 1 else op_str.len]); - if (!label_gop.found_existing) label_gop.value_ptr.* = .{}; if (anon and (op_str[1] == 'b' or op_str[1] == 'B') and !label_gop.found_existing) return self.fail("undefined label: '{s}'", .{op_str}); + if (!label_gop.found_existing) label_gop.value_ptr.* = .{}; const pending_relocs = &label_gop.value_ptr.pending_relocs; if (if (anon) op_str[1] == 'f' or op_str[1] == 'F' @@ -99643,7 +105041,7 @@ fn genSetMem( .none => .{ .immediate = @bitCast(@as(i64, disp)) }, .reg => |base_reg| .{ .register_offset = .{ .reg = base_reg, .off = disp } }, .frame => |base_frame_index| .{ .lea_frame = .{ .index = base_frame_index, .off = disp } }, - .table => unreachable, + .table, .rip_inst => unreachable, .reloc => |sym_index| .{ .lea_symbol = .{ .sym_index = sym_index, .off = disp } }, }; switch (src_mcv) { @@ -99753,7 +105151,7 @@ fn genSetMem( .index = frame_index, .off = disp, }).compare(.gte, src_align), - .table => unreachable, + .table, .rip_inst => unreachable, .reloc => false, })).write( self, @@ -100402,7 +105800,7 @@ fn airCmpxchg(self: *CodeGen, inst: Air.Inst.Index) !void { const ptr_lock = switch (ptr_mem.base) { .none, .frame, .reloc => null, .reg => |reg| self.register_manager.lockReg(reg), - .table => unreachable, + .table, .rip_inst => unreachable, }; defer if (ptr_lock) |lock| self.register_manager.unlockReg(lock); @@ -100485,7 +105883,7 @@ fn atomicOp( const mem_lock = switch (ptr_mem.base) { .none, .frame, .reloc => null, .reg => |reg| self.register_manager.lockReg(reg), - .table => unreachable, + .table, .rip_inst => unreachable, }; defer if (mem_lock) |lock| self.register_manager.unlockReg(lock); @@ -103624,40 +109022,35 @@ fn resolveInst(self: *CodeGen, ref: Air.Inst.Ref) InnerError!MCValue { // If the type has no codegen bits, no need to store it. if (!ty.hasRuntimeBitsIgnoreComptime(zcu)) return .none; - const mcv = if (ref.toIndex()) |inst| mcv: { + const mcv: MCValue = if (ref.toIndex()) |inst| mcv: { break :mcv self.inst_tracking.getPtr(inst).?.short; } else mcv: { - const ip_index = ref.toInterned().?; - const gop = try self.const_tracking.getOrPut(self.gpa, ip_index); - if (!gop.found_existing) gop.value_ptr.* = .init(init: { - const const_mcv = try self.genTypedValue(.fromInterned(ip_index)); - switch (const_mcv) { - .lea_tlv => |tlv_sym| switch (self.bin_file.tag) { - .elf, .macho => { - if (self.mod.pic) { - try self.spillRegisters(&.{ .rdi, .rax }); - } else { - try self.spillRegisters(&.{.rax}); - } - const frame_index = try self.allocFrameIndex(.init(.{ - .size = 8, - .alignment = .@"8", - })); - try self.genSetMem( - .{ .frame = frame_index }, - 0, - .usize, - .{ .lea_symbol = .{ .sym_index = tlv_sym } }, - .{}, - ); - break :init .{ .load_frame = .{ .index = frame_index } }; - }, - else => break :init const_mcv, + const const_mcv = try self.genTypedValue(.fromInterned(ref.toInterned().?)); + switch (const_mcv) { + .lea_tlv => |tlv_sym| switch (self.bin_file.tag) { + .elf, .macho => { + if (self.mod.pic) { + try self.spillRegisters(&.{ .rdi, .rax }); + } else { + try self.spillRegisters(&.{.rax}); + } + const frame_index = try self.allocFrameIndex(.init(.{ + .size = 8, + .alignment = .@"8", + })); + try self.genSetMem( + .{ .frame = frame_index }, + 0, + .usize, + .{ .lea_symbol = .{ .sym_index = tlv_sym } }, + .{}, + ); + break :mcv .{ .load_frame = .{ .index = frame_index } }; }, - else => break :init const_mcv, - } - }); - break :mcv gop.value_ptr.short; + else => break :mcv const_mcv, + }, + else => break :mcv const_mcv, + } }; switch (mcv) { @@ -104205,13 +109598,21 @@ fn memSize(self: *CodeGen, ty: Type) Memory.Size { fn splitType(self: *CodeGen, comptime parts_len: usize, ty: Type) ![parts_len]Type { const pt = self.pt; const zcu = pt.zcu; + const ip = &zcu.intern_pool; var parts: [parts_len]Type = undefined; - if (ty.isVector(zcu)) if (std.math.divExact(u32, ty.vectorLen(zcu), parts_len)) |vec_len| return .{ - try pt.vectorType(.{ .len = vec_len, .child = ty.scalarType(zcu).toIntern() }), - } ** parts_len else |err| switch (err) { - error.DivisionByZero => unreachable, - error.UnexpectedRemainder => {}, - }; + switch (ip.indexToKey(ty.toIntern())) { + .vector_type => |vector_type| if (std.math.divExact(u32, vector_type.len, parts_len)) |vec_len| return .{ + try pt.vectorType(.{ .len = vec_len, .child = vector_type.child }), + } ** parts_len else |err| switch (err) { + error.DivisionByZero => unreachable, + error.UnexpectedRemainder => {}, + }, + .tuple_type => |tuple_type| if (tuple_type.types.len == parts_len) { + for (&parts, tuple_type.types.get(ip)) |*part, part_ty| part.* = .fromInterned(part_ty); + return parts; + }, + else => {}, + } const classes = std.mem.sliceTo(&abi.classifySystemV(ty, zcu, self.target, .other), .none); if (classes.len == parts_len) for (&parts, classes, 0..) |*part, class, part_i| { part.* = switch (class) { @@ -104896,6 +110297,52 @@ const Temp = struct { second_temp.* = result_temp; } + fn withOverflow(temp: *Temp, overflow_temp: *Temp, cg: *CodeGen) InnerError!void { + const temp_index = temp.unwrap(cg).temp; + const temp_tracking = temp_index.tracking(cg); + const overflow_temp_tracking = overflow_temp.unwrap(cg).temp.tracking(cg); + switch (temp_tracking.short) { + .register => |reg| switch (overflow_temp_tracking.short) { + .eflags => |overflow_cc| { + const result_temp_index = cg.next_temp_index; + const result_temp: Temp = .{ .index = result_temp_index.toIndex() }; + assert(cg.reuseTemp(result_temp.index, temp.index, temp_tracking)); + assert(cg.reuseTemp(result_temp.index, overflow_temp.index, overflow_temp_tracking)); + result_temp_index.tracking(cg).* = .init(.{ .register_overflow = .{ .reg = reg, .eflags = overflow_cc } }); + cg.temp_type[@intFromEnum(result_temp_index)] = .slice_const_u8; + cg.next_temp_index = @enumFromInt(@intFromEnum(result_temp_index) + 1); + temp.* = result_temp; + overflow_temp.* = result_temp; + return; + }, + .register => |overflow_reg| { + const result_temp_index = cg.next_temp_index; + const result_temp: Temp = .{ .index = result_temp_index.toIndex() }; + assert(cg.reuseTemp(result_temp.index, temp.index, temp_tracking)); + assert(cg.reuseTemp(result_temp.index, overflow_temp.index, overflow_temp_tracking)); + result_temp_index.tracking(cg).* = .init(.{ .register_pair = .{ reg, overflow_reg } }); + cg.temp_type[@intFromEnum(result_temp_index)] = .slice_const_u8; + cg.next_temp_index = @enumFromInt(@intFromEnum(result_temp_index) + 1); + temp.* = result_temp; + overflow_temp.* = result_temp; + return; + }, + else => {}, + }, + .load_frame => { + const zcu = cg.pt.zcu; + const ip = &zcu.intern_pool; + const field_tys = ip.indexToKey(temp_index.typeOf(cg).toIntern()).tuple_type.types.get(ip); + try temp.write(overflow_temp, .{ .disp = @intCast(Type.fromInterned(field_tys[0]).abiSize(zcu)) }, cg); + try overflow_temp.die(cg); + overflow_temp.* = temp.*; + return; + }, + else => {}, + } + std.debug.panic("{s}: {} {}\n", .{ @src().fn_name, temp_tracking, overflow_temp_tracking }); + } + fn asMask(temp: Temp, info: MaskInfo, cg: *CodeGen) void { assert(info.scalar != .none); const mcv = &temp.unwrap(cg).temp.tracking(cg).short; @@ -105581,6 +111028,42 @@ const Temp = struct { }, .dst_temps = .{ .{ .ref = .src0 }, .unused }, .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + }, + .dst_temps = .{ .{ .ref = .src0 }, .unused }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, + } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, .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 if (op_ref.toIndex()) |op_inst| return .{ .index = op_inst }; const val = op_ref.toInterned().?; - const gop = try cg.const_tracking.getOrPut(cg.gpa, val); - if (!gop.found_existing) gop.value_ptr.* = .init(init: { + return cg.tempInit(.fromInterned(ip.typeOf(val)), init: { const const_mcv = try cg.genTypedValue(.fromInterned(val)); switch (const_mcv) { .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 else => break :init const_mcv, } }); - return cg.tempInit(.fromInterned(ip.typeOf(val)), gop.value_ptr.short); } fn tempsFromOperandsInner( @@ -110330,6 +115811,7 @@ const Select = struct { mut_mem, to_mut_mem, gpr, + immut_gpr, to_gpr, mut_gpr, to_mut_gpr, @@ -110362,15 +115844,18 @@ const Select = struct { return switch (src) { .none => temp.tracking(cg).short == .none, .imm8 => switch (temp.tracking(cg).short) { - .immediate => |imm| std.math.cast(u8, imm) != null, + .immediate => |imm| std.math.cast(u8, imm) != null or + std.math.cast(i8, @as(i64, @bitCast(imm))) != null, else => false, }, .imm16 => switch (temp.tracking(cg).short) { - .immediate => |imm| std.math.cast(u16, imm) != null, + .immediate => |imm| std.math.cast(u16, imm) != null or + std.math.cast(i16, @as(i64, @bitCast(imm))) != null, else => false, }, .imm32 => switch (temp.tracking(cg).short) { - .immediate => |imm| std.math.cast(u32, imm) != null, + .immediate => |imm| std.math.cast(u32, imm) != null or + std.math.cast(i32, @as(i64, @bitCast(imm))) != null, else => false, }, .simm32 => switch (temp.tracking(cg).short) { @@ -110386,6 +115871,11 @@ const Select = struct { .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0, else => false, }, + .immut_gpr => !temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) { + .register => |reg| reg.class() == .general_purpose, + .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0, + else => false, + }, .mut_gpr => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) { .register => |reg| reg.class() == .general_purpose, .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0, @@ -110472,7 +115962,7 @@ const Select = struct { .to_param_gpr_pair => |param_spec| try temp.toRegPair(abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.index..][0..2].*, cg), .to_ret_gpr => |ret_spec| try temp.toReg(abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index], cg), .to_ret_gpr_pair => |ret_spec| try temp.toRegPair(abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index..][0..2].*, cg), - .gpr, .to_gpr => try temp.toRegClass(false, .general_purpose, cg), + .gpr, .immut_gpr, .to_gpr => try temp.toRegClass(false, .general_purpose, cg), .mut_gpr, .to_mut_gpr => try temp.toRegClass(true, .general_purpose, cg), .x87, .to_x87 => try temp.toRegClass(false, .x87, cg), .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg), @@ -110494,6 +115984,8 @@ const Select = struct { const Kind = union(enum) { unused, any, + none, + undef, cc: Condition, ref: Select.Operand.Ref, reg: Register, @@ -110580,6 +116072,8 @@ const Select = struct { return switch (spec.kind) { .unused => .{ undefined, false }, .any => .{ try cg.tempAlloc(spec.type), true }, + .none => .{ try cg.tempInit(spec.type, .none), true }, + .undef => .{ try cg.tempInit(spec.type, .undef), true }, .cc => |cc| .{ try cg.tempInit(spec.type, .{ .eflags = cc }), true }, .ref => |ref| .{ ref.tempOf(s), false }, .reg => |reg| .{ try cg.tempInit(spec.type, .{ .register = reg }), true }, @@ -110812,10 +116306,17 @@ const Select = struct { }, .frame => |frame_index| .{ try cg.tempInit(spec.type, .{ .load_frame = .{ .index = frame_index } }), true }, .lazy_symbol => |lazy_symbol_spec| { + const ip = &pt.zcu.intern_pool; const ty = if (lazy_symbol_spec.ref == .none) spec.type else lazy_symbol_spec.ref.typeOf(s); const lazy_symbol: link.File.LazySymbol = .{ .kind = lazy_symbol_spec.kind, - .ty = ty.toIntern(), + .ty = switch (ip.indexToKey(ty.toIntern())) { + .inferred_error_set_type => |func_index| switch (ip.funcIesResolvedUnordered(func_index)) { + .none => unreachable, // unresolved inferred error set + else => |ty_index| ty_index, + }, + else => ty.toIntern(), + }, }; return .{ try cg.tempInit(.usize, .{ .lea_symbol = .{ .sym_index = if (cg.bin_file.cast(.elf)) |elf_file| @@ -110922,6 +116423,7 @@ const Select = struct { const sub_size: Adjust = .{ .sign = .neg, .lhs = .size, .op = .mul, .rhs = .@"1" }; const sub_src0_size_div_8: Adjust = .{ .sign = .neg, .lhs = .src0_size, .op = .div, .rhs = .@"8" }; const sub_src0_size: Adjust = .{ .sign = .neg, .lhs = .src0_size, .op = .mul, .rhs = .@"1" }; + const add_src0_size: Adjust = .{ .sign = .pos, .lhs = .src0_size, .op = .mul, .rhs = .@"1" }; const add_8_src0_size: Adjust = .{ .sign = .pos, .lhs = .src0_size, .op = .mul, .rhs = .@"8" }; const add_delta_size_div_8: Adjust = .{ .sign = .pos, .lhs = .delta_size, .op = .div, .rhs = .@"8" }; const add_delta_elem_size: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .mul, .rhs = .@"1" }; @@ -110965,7 +116467,9 @@ const Select = struct { const add_dst0_elem_size: Adjust = .{ .sign = .pos, .lhs = .dst0_elem_size, .op = .mul, .rhs = .@"1" }; const add_elem_limbs: Adjust = .{ .sign = .pos, .lhs = .elem_limbs, .op = .mul, .rhs = .@"1" }; const add_smin: Adjust = .{ .sign = .pos, .lhs = .smin, .op = .mul, .rhs = .@"1" }; + const sub_smin: Adjust = .{ .sign = .neg, .lhs = .smin, .op = .mul, .rhs = .@"1" }; const add_umax: Adjust = .{ .sign = .pos, .lhs = .umax, .op = .mul, .rhs = .@"1" }; + const sub_umax: Adjust = .{ .sign = .neg, .lhs = .umax, .op = .mul, .rhs = .@"1" }; const repeat: Adjust = .{ .sign = .pos, .lhs = .repeat, .op = .mul, .rhs = .@"1" }; }; const Ref = enum(u5) { @@ -111783,6 +117287,7 @@ fn select( if (std.debug.runtime_safety) { for (case.src_constraints[src_temps.len..]) |src_constraint| assert(src_constraint == .any); for (case.dst_constraints[dst_temps.len..]) |dst_constraint| assert(dst_constraint == .any); + for (case.dst_temps[dst_temps.len..]) |dst_temp| assert(dst_temp == .unused); } patterns: for (case.patterns) |pattern| { for (pattern.src[0..src_temps.len], src_temps) |src_pattern, src_temp| if (!src_pattern.matches(src_temp, cg)) continue :patterns; diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig index e6f3f6541a..8ea3928971 100644 --- a/src/arch/x86_64/Emit.zig +++ b/src/arch/x86_64/Emit.zig @@ -97,12 +97,14 @@ pub fn emitMir(emit: *Emit) Error!void { op_index -= 1; const op = lowered_inst.encoding.data.ops[op_index]; if (op == .none) continue; - const enc_length: u4 = @intCast( - std.math.divCeil(u7, @intCast(op.immBitSize()), 8) catch unreachable, - ); + const is_mem = op.isMemory(); + const enc_length: u4 = if (is_mem) switch (lowered_inst.ops[op_index].mem.sib.base) { + .rip_inst => 4, + else => unreachable, + } else @intCast(std.math.divCeil(u7, @intCast(op.immBitSize()), 8) catch unreachable); reloc_offset -= enc_length; - if (op_index == lowered_relocs[0].op_index) - break :reloc_offset_length .{ reloc_offset, enc_length }; + if (op_index == lowered_relocs[0].op_index) break :reloc_offset_length .{ reloc_offset, enc_length }; + std.debug.assert(!is_mem); } }; try relocs.append(emit.lower.allocator, .{ @@ -434,7 +436,7 @@ pub fn emitMir(emit: *Emit) Error!void { loc_buf[0] = switch (mem.base()) { .none => .{ .constu = 0 }, .reg => |reg| .{ .breg = reg.dwarfNum() }, - .frame, .table => unreachable, + .frame, .table, .rip_inst => unreachable, .reloc => |sym_index| .{ .addr = .{ .sym = sym_index } }, }; break :base &loc_buf[0]; diff --git a/src/arch/x86_64/Encoding.zig b/src/arch/x86_64/Encoding.zig index 238c259bb4..05ca39f6f0 100644 --- a/src/arch/x86_64/Encoding.zig +++ b/src/arch/x86_64/Encoding.zig @@ -50,7 +50,7 @@ pub fn findByMnemonic( else => {}, } else false; const rex_extended = for (ops) |op| { - if (op.isBaseExtended() or op.isIndexExtended()) break true; + if (op.baseExtEnc() != 0b00 or op.indexExtEnc() != 0b00) break true; } else false; if ((rex_required or rex_extended) and rex_invalid) return error.CannotEncode; diff --git a/src/arch/x86_64/Lower.zig b/src/arch/x86_64/Lower.zig index ae0e3dc48d..dcf857e789 100644 --- a/src/arch/x86_64/Lower.zig +++ b/src/arch/x86_64/Lower.zig @@ -395,6 +395,7 @@ pub fn mem(lower: *Lower, op_index: InstOpIndex, payload: u32) Memory { .sib => |*sib| switch (sib.base) { else => {}, .table => sib.disp = lower.reloc(op_index, .table, sib.disp).signed, + .rip_inst => |inst_index| sib.disp = lower.reloc(op_index, .{ .inst = inst_index }, sib.disp).signed, }, else => {}, } diff --git a/src/arch/x86_64/Mir.zig b/src/arch/x86_64/Mir.zig index d7f16695eb..f922923622 100644 --- a/src/arch/x86_64/Mir.zig +++ b/src/arch/x86_64/Mir.zig @@ -1742,6 +1742,7 @@ pub const Memory = struct { .reg => |reg| @intFromEnum(reg), .frame => |frame_index| @intFromEnum(frame_index), .reloc => |sym_index| sym_index, + .rip_inst => |inst_index| inst_index, }, .off = switch (mem.mod) { .rm => |rm| @bitCast(rm.disp), @@ -1769,6 +1770,7 @@ pub const Memory = struct { .frame => .{ .frame = @enumFromInt(mem.base) }, .table => .table, .reloc => .{ .reloc = mem.base }, + .rip_inst => .{ .rip_inst = mem.base }, }, .scale_index = switch (mem.info.index) { .none => null, @@ -1832,7 +1834,7 @@ pub fn resolveFrameAddr(mir: Mir, frame_addr: bits.FrameAddr) bits.RegisterOffse pub fn resolveFrameLoc(mir: Mir, mem: Memory) Memory { return switch (mem.info.base) { - .none, .reg, .table, .reloc => mem, + .none, .reg, .table, .reloc, .rip_inst => mem, .frame => if (mir.frame_locs.len > 0) .{ .info = .{ .base = .reg, diff --git a/src/arch/x86_64/abi.zig b/src/arch/x86_64/abi.zig index 6d11a44c2a..f219cc118d 100644 --- a/src/arch/x86_64/abi.zig +++ b/src/arch/x86_64/abi.zig @@ -266,7 +266,8 @@ pub fn classifySystemV(ty: Type, zcu: *Zcu, target: *const std.Target, ctx: Cont // separately.". const ty_size = ty.abiSize(zcu); switch (ty.containerLayout(zcu)) { - .auto, .@"extern" => {}, + .auto => unreachable, + .@"extern" => {}, .@"packed" => { assert(ty_size <= 16); result[0] = .integer; @@ -345,7 +346,8 @@ fn classifySystemVStruct( ); if (zcu.typeToStruct(field_ty)) |field_loaded_struct| { switch (field_loaded_struct.layout) { - .auto, .@"extern" => { + .auto => unreachable, + .@"extern" => { byte_offset = classifySystemVStruct(result, byte_offset, field_loaded_struct, zcu, target); continue; }, @@ -353,7 +355,8 @@ fn classifySystemVStruct( } } else if (zcu.typeToUnion(field_ty)) |field_loaded_union| { switch (field_loaded_union.flagsUnordered(ip).layout) { - .auto, .@"extern" => { + .auto => unreachable, + .@"extern" => { byte_offset = classifySystemVUnion(result, byte_offset, field_loaded_union, zcu, target); continue; }, @@ -386,7 +389,8 @@ fn classifySystemVUnion( const field_ty = Type.fromInterned(loaded_union.field_types.get(ip)[field_index]); if (zcu.typeToStruct(field_ty)) |field_loaded_struct| { switch (field_loaded_struct.layout) { - .auto, .@"extern" => { + .auto => unreachable, + .@"extern" => { _ = classifySystemVStruct(result, starting_byte_offset, field_loaded_struct, zcu, target); continue; }, @@ -394,7 +398,8 @@ fn classifySystemVUnion( } } else if (zcu.typeToUnion(field_ty)) |field_loaded_union| { switch (field_loaded_union.flagsUnordered(ip).layout) { - .auto, .@"extern" => { + .auto => unreachable, + .@"extern" => { _ = classifySystemVUnion(result, starting_byte_offset, field_loaded_union, zcu, target); continue; }, diff --git a/src/arch/x86_64/bits.zig b/src/arch/x86_64/bits.zig index 91a557cbf1..0555ca6eae 100644 --- a/src/arch/x86_64/bits.zig +++ b/src/arch/x86_64/bits.zig @@ -4,6 +4,7 @@ const expect = std.testing.expect; const Allocator = std.mem.Allocator; const ArrayList = std.ArrayList; +const Mir = @import("Mir.zig"); /// EFLAGS condition codes pub const Condition = enum(u5) { @@ -359,11 +360,20 @@ pub const Register = enum(u8) { ah, ch, dh, bh, - ymm0, ymm1, ymm2, ymm3, ymm4, ymm5, ymm6, ymm7, - ymm8, ymm9, ymm10, ymm11, ymm12, ymm13, ymm14, ymm15, + zmm0, zmm1, zmm2, zmm3, zmm4, zmm5, zmm6, zmm7, + zmm8, zmm9, zmm10, zmm11, zmm12, zmm13, zmm14, zmm15, + zmm16, zmm17,zmm18, zmm19, zmm20, zmm21, zmm22, zmm23, + zmm24, zmm25,zmm26, zmm27, zmm28, zmm29, zmm30, zmm31, - xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, - xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, + ymm0, ymm1, ymm2, ymm3, ymm4, ymm5, ymm6, ymm7, + ymm8, ymm9, ymm10, ymm11, ymm12, ymm13, ymm14, ymm15, + ymm16, ymm17,ymm18, ymm19, ymm20, ymm21, ymm22, ymm23, + ymm24, ymm25,ymm26, ymm27, ymm28, ymm29, ymm30, ymm31, + + xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, + xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, + xmm16, xmm17,xmm18, xmm19, xmm20, xmm21, xmm22, xmm23, + xmm24, xmm25,xmm26, xmm27, xmm28, xmm29, xmm30, xmm31, mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7, @@ -403,8 +413,9 @@ pub const Register = enum(u8) { @intFromEnum(Register.al) ... @intFromEnum(Register.r15b) => .general_purpose, @intFromEnum(Register.ah) ... @intFromEnum(Register.bh) => .gphi, - @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm15) => .sse, - @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm15) => .sse, + @intFromEnum(Register.zmm0) ... @intFromEnum(Register.zmm31) => .sse, + @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm31) => .sse, + @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm31) => .sse, @intFromEnum(Register.mm0) ... @intFromEnum(Register.mm7) => .mmx, @intFromEnum(Register.st0) ... @intFromEnum(Register.st7) => .x87, @@ -427,13 +438,14 @@ pub const Register = enum(u8) { @intFromEnum(Register.al) ... @intFromEnum(Register.r15b) => @intFromEnum(Register.al), @intFromEnum(Register.ah) ... @intFromEnum(Register.bh) => @intFromEnum(Register.ah), - @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm15) => @intFromEnum(Register.ymm0) - 16, - @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm15) => @intFromEnum(Register.xmm0) - 16, - @intFromEnum(Register.mm0) ... @intFromEnum(Register.mm7) => @intFromEnum(Register.mm0) - 32, - @intFromEnum(Register.st0) ... @intFromEnum(Register.st7) => @intFromEnum(Register.st0) - 40, - @intFromEnum(Register.es) ... @intFromEnum(Register.gs) => @intFromEnum(Register.es) - 48, - @intFromEnum(Register.cr0) ... @intFromEnum(Register.cr15) => @intFromEnum(Register.cr0) - 54, - @intFromEnum(Register.dr0) ... @intFromEnum(Register.dr15) => @intFromEnum(Register.dr0) - 70, + @intFromEnum(Register.zmm0) ... @intFromEnum(Register.zmm31) => @intFromEnum(Register.zmm0) - 16, + @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm31) => @intFromEnum(Register.ymm0) - 16, + @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm31) => @intFromEnum(Register.xmm0) - 16, + @intFromEnum(Register.mm0) ... @intFromEnum(Register.mm7) => @intFromEnum(Register.mm0) - 48, + @intFromEnum(Register.st0) ... @intFromEnum(Register.st7) => @intFromEnum(Register.st0) - 56, + @intFromEnum(Register.es) ... @intFromEnum(Register.gs) => @intFromEnum(Register.es) - 64, + @intFromEnum(Register.cr0) ... @intFromEnum(Register.cr15) => @intFromEnum(Register.cr0) - 70, + @intFromEnum(Register.dr0) ... @intFromEnum(Register.dr15) => @intFromEnum(Register.dr0) - 86, else => unreachable, // zig fmt: on @@ -450,6 +462,7 @@ pub const Register = enum(u8) { @intFromEnum(Register.al) ... @intFromEnum(Register.r15b) => 8, @intFromEnum(Register.ah) ... @intFromEnum(Register.bh) => 8, + @intFromEnum(Register.zmm0) ... @intFromEnum(Register.zmm15) => 512, @intFromEnum(Register.ymm0) ... @intFromEnum(Register.ymm15) => 256, @intFromEnum(Register.xmm0) ... @intFromEnum(Register.xmm15) => 128, @intFromEnum(Register.mm0) ... @intFromEnum(Register.mm7) => 64, @@ -473,8 +486,9 @@ pub const Register = enum(u8) { @intFromEnum(Register.r8w) ... @intFromEnum(Register.r15w) => true, @intFromEnum(Register.r8b) ... @intFromEnum(Register.r15b) => true, - @intFromEnum(Register.ymm8) ... @intFromEnum(Register.ymm15) => true, - @intFromEnum(Register.xmm8) ... @intFromEnum(Register.xmm15) => true, + @intFromEnum(Register.zmm8) ... @intFromEnum(Register.zmm31) => true, + @intFromEnum(Register.ymm8) ... @intFromEnum(Register.ymm31) => true, + @intFromEnum(Register.xmm8) ... @intFromEnum(Register.xmm31) => true, @intFromEnum(Register.cr8) ... @intFromEnum(Register.cr15) => true, @intFromEnum(Register.dr8) ... @intFromEnum(Register.dr15) => true, @@ -484,7 +498,7 @@ pub const Register = enum(u8) { }; } - pub fn enc(reg: Register) u4 { + pub fn enc(reg: Register) u5 { const base = switch (@intFromEnum(reg)) { // zig fmt: off @intFromEnum(Register.rax) ... @intFromEnum(Register.r15) => @intFromEnum(Register.rax), @@ -509,10 +523,6 @@ pub const Register = enum(u8) { return @truncate(@intFromEnum(reg) - base); } - pub fn lowEnc(reg: Register) u3 { - return @truncate(reg.enc()); - } - pub fn toBitSize(reg: Register, bit_size: u64) Register { return switch (bit_size) { 8 => reg.to8(), @@ -557,11 +567,12 @@ pub const Register = enum(u8) { }; } - fn sseBase(reg: Register) u7 { + fn sseBase(reg: Register) u8 { assert(reg.class() == .sse); return switch (@intFromEnum(reg)) { - @intFromEnum(Register.ymm0)...@intFromEnum(Register.ymm15) => @intFromEnum(Register.ymm0), - @intFromEnum(Register.xmm0)...@intFromEnum(Register.xmm15) => @intFromEnum(Register.xmm0), + @intFromEnum(Register.zmm0)...@intFromEnum(Register.zmm31) => @intFromEnum(Register.zmm0), + @intFromEnum(Register.ymm0)...@intFromEnum(Register.ymm31) => @intFromEnum(Register.ymm0), + @intFromEnum(Register.xmm0)...@intFromEnum(Register.xmm31) => @intFromEnum(Register.xmm0), else => unreachable, }; } @@ -678,15 +689,9 @@ pub const Memory = struct { frame: FrameIndex, table, reloc: u32, + rip_inst: Mir.Inst.Index, pub const Tag = @typeInfo(Base).@"union".tag_type.?; - - pub fn isExtended(self: Base) bool { - return switch (self) { - .none, .frame, .table, .reloc => false, // rsp, rbp, and rip are not extended - .reg => |reg| reg.isExtended(), - }; - } }; pub const Mod = union(enum(u1)) { diff --git a/src/arch/x86_64/encoder.zig b/src/arch/x86_64/encoder.zig index ce61310406..4042c528ae 100644 --- a/src/arch/x86_64/encoder.zig +++ b/src/arch/x86_64/encoder.zig @@ -138,7 +138,7 @@ pub const Instruction = struct { .moffs => true, .rip => false, .sib => |s| switch (s.base) { - .none, .frame, .table, .reloc => false, + .none, .frame, .table, .reloc, .rip_inst => false, .reg => |reg| reg.class() == .segment, }, }; @@ -206,19 +206,22 @@ pub const Instruction = struct { }; } - pub fn isBaseExtended(op: Operand) bool { + pub fn baseExtEnc(op: Operand) u2 { return switch (op) { - .none, .imm => false, - .reg => |reg| reg.isExtended(), - .mem => |mem| mem.base().isExtended(), + .none, .imm => 0b00, + .reg => |reg| @truncate(reg.enc() >> 3), + .mem => |mem| switch (mem.base()) { + .none, .frame, .table, .reloc, .rip_inst => 0b00, // rsp, rbp, and rip are not extended + .reg => |reg| @truncate(reg.enc() >> 3), + }, .bytes => unreachable, }; } - pub fn isIndexExtended(op: Operand) bool { + pub fn indexExtEnc(op: Operand) u2 { return switch (op) { - .none, .reg, .imm => false, - .mem => |mem| if (mem.scaleIndex()) |si| si.index.isExtended() else false, + .none, .reg, .imm => 0b00, + .mem => |mem| if (mem.scaleIndex()) |si| @truncate(si.index.enc() >> 3) else 0b00, .bytes => unreachable, }; } @@ -279,6 +282,7 @@ pub const Instruction = struct { .frame => |frame_index| try writer.print("{}", .{frame_index}), .table => try writer.print("Table", .{}), .reloc => |sym_index| try writer.print("Symbol({d})", .{sym_index}), + .rip_inst => |inst_index| try writer.print("RipInst({d})", .{inst_index}), } if (mem.scaleIndex()) |si| { if (any) try writer.writeAll(" + "); @@ -421,14 +425,14 @@ pub const Instruction = struct { }; switch (mem_op) { .reg => |reg| { - const rm = switch (data.op_en) { + const rm: u3 = switch (data.op_en) { .ia, .m, .mi, .m1, .mc, .vm, .vmi => enc.modRmExt(), - .mr, .mri, .mrc => inst.ops[1].reg.lowEnc(), - .rm, .rmi, .rm0, .rvm, .rvmr, .rvmi, .rmv => inst.ops[0].reg.lowEnc(), - .mvr => inst.ops[2].reg.lowEnc(), + .mr, .mri, .mrc => @truncate(inst.ops[1].reg.enc()), + .rm, .rmi, .rm0, .rvm, .rvmr, .rvmi, .rmv => @truncate(inst.ops[0].reg.enc()), + .mvr => @truncate(inst.ops[2].reg.enc()), else => unreachable, }; - try encoder.modRm_direct(rm, reg.lowEnc()); + try encoder.modRm_direct(rm, @truncate(reg.enc())); }, .mem => |mem| { const op = switch (data.op_en) { @@ -447,7 +451,7 @@ pub const Instruction = struct { .ia => try encodeImm(inst.ops[0].imm, data.ops[0], encoder), .mi => try encodeImm(inst.ops[1].imm, data.ops[1], encoder), .rmi, .mri, .vmi => try encodeImm(inst.ops[2].imm, data.ops[2], encoder), - .rvmr => try encoder.imm8(@as(u8, inst.ops[3].reg.enc()) << 4), + .rvmr => try encoder.imm8(@as(u8, @as(u4, @intCast(inst.ops[3].reg.enc()))) << 4), .rvmi => try encodeImm(inst.ops[3].imm, data.ops[3], encoder), else => {}, } @@ -461,8 +465,8 @@ pub const Instruction = struct { const final = opcode.len - 1; for (opcode[first..final]) |byte| try encoder.opcode_1byte(byte); switch (inst.encoding.data.op_en) { - .o, .oz, .oi => try encoder.opcode_withReg(opcode[final], inst.ops[0].reg.lowEnc()), - .zo => try encoder.opcode_withReg(opcode[final], inst.ops[1].reg.lowEnc()), + .o, .oz, .oi => try encoder.opcode_withReg(opcode[final], @truncate(inst.ops[0].reg.enc())), + .zo => try encoder.opcode_withReg(opcode[final], @truncate(inst.ops[1].reg.enc())), else => try encoder.opcode_1byte(opcode[final]), } } @@ -532,23 +536,29 @@ pub const Instruction = struct { switch (op_en) { .z, .i, .zi, .ii, .ia, .fd, .td, .d => {}, - .o, .oz, .oi => rex.b = inst.ops[0].reg.isExtended(), - .zo => rex.b = inst.ops[1].reg.isExtended(), + .o, .oz, .oi => rex.b = inst.ops[0].reg.enc() & 0b01000 != 0, + .zo => rex.b = inst.ops[1].reg.enc() & 0b01000 != 0, .m, .mi, .m1, .mc, .mr, .rm, .rmi, .mri, .mrc, .rm0, .rmv => { const r_op = switch (op_en) { .rm, .rmi, .rm0, .rmv => inst.ops[0], .mr, .mri, .mrc => inst.ops[1], else => .none, }; - rex.r = r_op.isBaseExtended(); + const r_op_base_ext_enc = r_op.baseExtEnc(); + rex.r = r_op_base_ext_enc & 0b01 != 0; + assert(r_op_base_ext_enc & 0b10 == 0); const b_x_op = switch (op_en) { .rm, .rmi, .rm0 => inst.ops[1], .m, .mi, .m1, .mc, .mr, .mri, .mrc => inst.ops[0], else => unreachable, }; - rex.b = b_x_op.isBaseExtended(); - rex.x = b_x_op.isIndexExtended(); + const b_x_op_base_ext_enc = b_x_op.baseExtEnc(); + rex.b = b_x_op_base_ext_enc & 0b01 != 0; + assert(b_x_op_base_ext_enc & 0b10 == 0); + const b_x_op_index_ext_enc = b_x_op.indexExtEnc(); + rex.x = b_x_op_index_ext_enc & 0b01 != 0; + assert(b_x_op_index_ext_enc & 0b10 == 0); }, .vm, .vmi, .rvm, .rvmr, .rvmi, .mvr => unreachable, } @@ -575,7 +585,9 @@ pub const Instruction = struct { .m, .mi, .m1, .mc, .vm, .vmi => .none, else => unreachable, }; - vex.r = r_op.isBaseExtended(); + const r_op_base_ext_enc = r_op.baseExtEnc(); + vex.r = r_op_base_ext_enc & 0b01 != 0; + assert(r_op_base_ext_enc & 0b10 == 0); const b_x_op = switch (op_en) { .rm, .rmi, .rm0, .vm, .vmi, .rmv => inst.ops[1], @@ -583,8 +595,12 @@ pub const Instruction = struct { .rvm, .rvmr, .rvmi => inst.ops[2], else => unreachable, }; - vex.b = b_x_op.isBaseExtended(); - vex.x = b_x_op.isIndexExtended(); + const b_x_op_base_ext_enc = b_x_op.baseExtEnc(); + vex.b = b_x_op_base_ext_enc & 0b01 != 0; + assert(b_x_op_base_ext_enc & 0b10 == 0); + const b_x_op_index_ext_enc = b_x_op.indexExtEnc(); + vex.x = b_x_op_index_ext_enc & 0b01 != 0; + assert(b_x_op_index_ext_enc & 0b10 == 0); }, } @@ -621,8 +637,8 @@ pub const Instruction = struct { } fn encodeMemory(encoding: Encoding, mem: Memory, operand: Operand, encoder: anytype) !void { - const operand_enc = switch (operand) { - .reg => |reg| reg.lowEnc(), + const operand_enc: u3 = switch (operand) { + .reg => |reg| @truncate(reg.enc()), .none => encoding.modRmExt(), else => unreachable, }; @@ -634,7 +650,7 @@ pub const Instruction = struct { try encoder.modRm_SIBDisp0(operand_enc); if (mem.scaleIndex()) |si| { const scale = math.log2_int(u4, si.scale); - try encoder.sib_scaleIndexDisp32(scale, si.index.lowEnc()); + try encoder.sib_scaleIndexDisp32(scale, @truncate(si.index.enc())); } else { try encoder.sib_disp32(); } @@ -646,21 +662,21 @@ pub const Instruction = struct { try encoder.modRm_SIBDisp0(operand_enc); if (mem.scaleIndex()) |si| { const scale = math.log2_int(u4, si.scale); - try encoder.sib_scaleIndexDisp32(scale, si.index.lowEnc()); + try encoder.sib_scaleIndexDisp32(scale, @truncate(si.index.enc())); } else { try encoder.sib_disp32(); } try encoder.disp32(sib.disp); }, .general_purpose => { - const dst = base.lowEnc(); + const dst: u3 = @truncate(base.enc()); const src = operand_enc; if (dst == 4 or mem.scaleIndex() != null) { if (sib.disp == 0 and dst != 5) { try encoder.modRm_SIBDisp0(src); if (mem.scaleIndex()) |si| { const scale = math.log2_int(u4, si.scale); - try encoder.sib_scaleIndexBase(scale, si.index.lowEnc(), dst); + try encoder.sib_scaleIndexBase(scale, @truncate(si.index.enc()), dst); } else { try encoder.sib_base(dst); } @@ -668,7 +684,7 @@ pub const Instruction = struct { try encoder.modRm_SIBDisp8(src); if (mem.scaleIndex()) |si| { const scale = math.log2_int(u4, si.scale); - try encoder.sib_scaleIndexBaseDisp8(scale, si.index.lowEnc(), dst); + try encoder.sib_scaleIndexBaseDisp8(scale, @truncate(si.index.enc()), dst); } else { try encoder.sib_baseDisp8(dst); } @@ -677,7 +693,7 @@ pub const Instruction = struct { try encoder.modRm_SIBDisp32(src); if (mem.scaleIndex()) |si| { const scale = math.log2_int(u4, si.scale); - try encoder.sib_scaleIndexBaseDisp32(scale, si.index.lowEnc(), dst); + try encoder.sib_scaleIndexBaseDisp32(scale, @truncate(si.index.enc()), dst); } else { try encoder.sib_baseDisp32(dst); } @@ -705,6 +721,10 @@ pub const Instruction = struct { try encoder.modRm_indirectDisp32(operand_enc, 0); try encoder.disp32(undefined); } else return error.CannotEncode, + .rip_inst => { + try encoder.modRm_RIPDisp32(operand_enc); + try encoder.disp32(sib.disp); + }, }, .rip => |rip| { try encoder.modRm_RIPDisp32(operand_enc); @@ -862,7 +882,7 @@ fn Encoder(comptime T: type, comptime opts: Options) type { try self.writer.writeByte( @as(u8, @intFromBool(fields.w)) << 7 | - @as(u8, ~fields.v.enc()) << 3 | + @as(u8, ~@as(u4, @intCast(fields.v.enc()))) << 3 | @as(u8, @intFromBool(fields.l)) << 2 | @as(u8, @intFromEnum(fields.p)) << 0, ); @@ -870,7 +890,7 @@ fn Encoder(comptime T: type, comptime opts: Options) type { try self.writer.writeByte(0b1100_0101); try self.writer.writeByte( @as(u8, ~@intFromBool(fields.r)) << 7 | - @as(u8, ~fields.v.enc()) << 3 | + @as(u8, ~@as(u4, @intCast(fields.v.enc()))) << 3 | @as(u8, @intFromBool(fields.l)) << 2 | @as(u8, @intFromEnum(fields.p)) << 0, ); diff --git a/test/behavior/math.zig b/test/behavior/math.zig index 28d7ec0488..2d95407a8e 100644 --- a/test/behavior/math.zig +++ b/test/behavior/math.zig @@ -787,7 +787,6 @@ fn should_not_be_zero(x: f128) !void { test "umax wrapped squaring" { if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; { @@ -1050,13 +1049,13 @@ test "@mulWithOverflow bitsize > 32" { } test "@mulWithOverflow bitsize 128 bits" { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; try testMulWithOverflow(u128, 3, 0x5555555555555555_5555555555555555, 0xffffffffffffffff_ffffffffffffffff, 0); try testMulWithOverflow(u128, 3, 0x5555555555555555_5555555555555556, 2, 1); @@ -1070,13 +1069,19 @@ test "@mulWithOverflow bitsize 128 bits" { try testMulWithOverflow(i128, 3, -0x2aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaab, 0x7fffffffffffffff_ffffffffffffffff, 1); try testMulWithOverflow(i128, -1, -1, 1, 0); try testMulWithOverflow(i128, minInt(i128), minInt(i128), 0, 1); + + try testMulWithOverflow(i128, 1 << 126, 1 << 1, -1 << 127, 1); + try testMulWithOverflow(i128, -1 << 105, 1 << 22, -1 << 127, 0); + try testMulWithOverflow(i128, 1 << 84, -1 << 43, -1 << 127, 0); + try testMulWithOverflow(i128, -1 << 63, -1 << 64, -1 << 127, 1); } -test "@mulWithOverflow u256" { +test "@mulWithOverflow bitsize 256 bits" { if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; { const const_lhs: u256 = 8035709466408580321693645878924206181189; @@ -1106,6 +1111,10 @@ test "@mulWithOverflow u256" { try std.testing.expect(var_result[0] == const_result[0]); try std.testing.expect(var_result[1] == const_result[1]); } + try testMulWithOverflow(i256, 1 << 254, 1 << 1, -1 << 255, 1); + try testMulWithOverflow(i256, -1 << 212, 1 << 43, -1 << 255, 0); + try testMulWithOverflow(i256, 1 << 170, -1 << 85, -1 << 255, 0); + try testMulWithOverflow(i256, -1 << 128, -1 << 127, -1 << 255, 1); } fn testSubWithOverflow(comptime T: type, a: T, b: T, sub: T, bit: u1) !void { diff --git a/test/behavior/switch.zig b/test/behavior/switch.zig index b10027bd48..b518766d97 100644 --- a/test/behavior/switch.zig +++ b/test/behavior/switch.zig @@ -43,7 +43,6 @@ fn testSwitchWithAllRanges(x: u32, y: u32) u32 { } test "switch arbitrary int size" { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO diff --git a/test/behavior/x86_64.zig b/test/behavior/x86_64.zig index 5d704d6fbc..5ad7b228c6 100644 --- a/test/behavior/x86_64.zig +++ b/test/behavior/x86_64.zig @@ -7,6 +7,8 @@ test { if (builtin.object_format == .macho) return error.SkipZigTest; // COFF linker does not support the new backend. if (builtin.object_format == .coff) return error.SkipZigTest; - _ = @import("x86_64/math.zig"); + _ = @import("x86_64/binary.zig"); + _ = @import("x86_64/cast.zig"); _ = @import("x86_64/mem.zig"); + _ = @import("x86_64/unary.zig"); } diff --git a/test/behavior/x86_64/binary.zig b/test/behavior/x86_64/binary.zig index 2be9a3f3b1..4e749304c7 100644 --- a/test/behavior/x86_64/binary.zig +++ b/test/behavior/x86_64/binary.zig @@ -81,26 +81,88 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela ); } fn testInts() !void { - try testArgs(i4, 0x3, 0x2); - try testArgs(u4, 0xe, 0x6); - try testArgs(i8, 0x48, 0x6c); - try testArgs(u8, 0xbb, 0x43); - try testArgs(i16, -0x0fdf, 0x302e); - try testArgs(u16, 0xb8bf, 0x626d); - try testArgs(i32, -0x6280178f, 0x6802c034); - try testArgs(u32, 0x80d7a2c6, 0xbff6a402); - try testArgs(i64, 0x0365a53b8ee0c987, -0x1bb6d3013500a7d2); - try testArgs(u64, 0x71138bc6b4a38898, 0x1bc4043de9438c7b); - try testArgs(i128, 0x76d428c46cdeaa2ac43de8abffb22f6d, 0x427f7545abe434a12544fdbe2a012889); - try testArgs(u128, 0xe05fc132ef2cd8affee00a907f0a851f, 0x29f912a72cfc6a7c6973426a9636da9a); - try testArgs(i256, -0x53d4148cee74ea43477a65b3daa7b8fdadcbf4508e793f4af113b8d8da5a7eb6, -0x30dcbaf7b9b7a3df033694e6795444d842fb0b8f79bc18b3ea8a6b7ccad3ea91); - try testArgs(u256, 0xb7935f5c2f3b1ae7a422c0a7c446884294b7d5370bada307d2fe5a4c4284a999, 0x310e6e196ba4f143b8d285ca6addf7f3bb3344224aff221b27607a31e148be08); - try testArgs(i258, -0x0eee283365108dbeea0bec82f5147418d8ffe86f9eed00e414b4eccd65c21239a, -0x122c730073fc29a24cd6e3e6263566879bc5325d8566b8db31fcb4a76f7ab95eb); - try testArgs(u258, 0x186d5ddaab8cb8cb04e5b41e36f812e039d008baf49f12894c39e29a07796d800, 0x2072daba6ffad168826163eb136f6d28ca4360c8e7e5e41e29755e19e4753a4f5); - try testArgs(i495, 0x2fe6bc5448c55ce18252e2c9d44777505dfe63ff249a8027a6626c7d8dd9893fd5731e51474727be556f757facb586a4e04bbc0148c6c7ad692302f46fbd, -0x016a358821ef8240172f3a08e8830c06e6bcf2225f5f4d41ed42b44d249385f55cc594e1278ecac31c73faed890e5054af1a561483bb1bb6fb1f753514cf); - try testArgs(u495, 0x6eaf4e252b3bf74b75bac59e0b43ca5326bad2a25b3fdb74a67ef132ac5e47d72eebc3316fb2351ee66c50dc5afb92a75cea9b0e35160652c7db39eeb158, 0x49fbed744a92b549d8c05bb3512c617d24dd824f3f69bdf3923bc326a75674b85f5b828d2566fab9c86f571d12c2a63c9164feb0d191d27905533d09622a); - try testArgs(i512, -0x3a6876ca92775286c6e1504a64a9b8d56985bebf4a1b66539d404e0e96f24b226f70c4bcff295fdc2043b82513b2052dc45fd78f7e9e80e5b3e101757289f054, 0x5080c516a819bd32a0a5f0976441bbfbcf89e77684f1f10eb326aeb28e1f8d593278cff60fc99b8ffc87d8696882c64728dd3c322b7142803f4341f85a03bc10); - try testArgs(u512, 0xe5b1fedca3c77db765e517aabd05ffc524a3a8aff1784bbf67c45b894447ede32b65b9940e78173c591e56e078932d465f235aece7ad47b7f229df7ba8f12295, 0x8b4bb7c2969e3b121cc1082c442f8b4330f0a50058438fed56447175bb10178607ecfe425cb54dacc25ef26810f3e04681de1844f1aa8d029aca75d658634806); + try testArgs(i1, 0x0, -0x1); + try testArgs(u1, 0x1, 0x1); + try testArgs(i2, 0x0, -0x2); + try testArgs(u2, 0x2, 0x1); + try testArgs(i3, 0x1, -0x3); + try testArgs(u3, 0x6, 0x1); + try testArgs(i4, 0x6, 0x3); + try testArgs(u4, 0x8, 0x5); + try testArgs(i5, -0x9, -0xd); + try testArgs(u5, 0x5, 0x13); + try testArgs(i7, 0x34, 0x1d); + try testArgs(u7, 0x31, 0x56); + try testArgs(i8, -0x57, -0x70); + try testArgs(u8, 0x12, 0xd6); + try testArgs(i9, -0x8a, -0xa0); + try testArgs(u9, 0xf8, 0x95); + try testArgs(i15, -0x790, 0x116f); + try testArgs(u15, 0x548b, 0x4cd6); + try testArgs(i16, -0x2d17, -0x5c17); + try testArgs(u16, 0xadc0, 0xb223); + try testArgs(i17, 0xe543, 0xaad5); + try testArgs(u17, 0x9515, 0xa3c1); + try testArgs(i31, -0x28858a2f, 0x369e917a); + try testArgs(u31, 0x32bab794, 0x75464e7f); + try testArgs(i32, 0x79e74e44, 0x61fe4ab1); + try testArgs(u32, 0xc82f8e2, 0x5dde37e2); + try testArgs(i33, -0xa4cbaa13, -0x4d20ee61); + try testArgs(u33, 0x17461d437, 0x16cbc228f); + try testArgs(i63, 0x333220e16b1e53fb, 0x121a0d970a5a4504); + try testArgs(u63, 0x2dcd94e2ae4aa2af, 0x5f401e6e287a4dd7); + try testArgs(i64, 0x17e6bb7d8d430410, 0x760d42736f4b445c); + try testArgs(u64, 0x430970421452be50, 0xb4b5e96f4183b5fc); + try testArgs(i65, 0xb4477484679a6576, 0x21c9a3100d35de49); + try testArgs(u65, 0x1b7ffa914193a316, 0x6751268790308460); + try testArgs(i95, 0xd573e2100686f5df03aa29f, 0x4f7c921eb980b43a554b763); + try testArgs(u95, 0x62791162d2740f3ae84a9fcf, 0x1b6e66ae70bb9785a2118ecc); + try testArgs(i96, -0x6dc72375264ab887ea6073d5, 0x357ca705a600e94f6dd114c9); + try testArgs(u96, 0x77867877aae9bc90b2b57ce7, 0xd9a5352eb86061b67a61b212); + try testArgs(i97, 0x76f421e0ccfc6e7531c03ad5, 0x6775cdacdfca5455771c0dae); + try testArgs(u97, 0xaeb79499018e490b6aa2a5fc, 0x6cf53b08068cf25bdc307606); + try testArgs(i127, -0xc6de705251f892f8ba6a4f10aee0c7, -0x1598d3c6fd635ec0796a584af7479027); + try testArgs(u127, 0x5b3ec94f88a61621be2f745e90153390, 0x72456ad6a7ef886decf13195a50ca4d6); + try testArgs(i128, -0x44570544f745b89beb111016359577d5, -0x48904e59a05caede0974f916efba61a0); + try testArgs(u128, 0x3b14f670f6ac712d087a9ec7b15394d2, 0x19b69cb71a6763a9dc5baec5bb818450); + try testArgs(i129, 0xd58a765abb324106d83362db47fc374d, 0x548642028e222abf2ee21a1999a8ac5f); + try testArgs(u129, 0x1144fb18eba36e437bc45a73bbe25f10e, 0xdc7cb5f65f5127b00a842adf3f5a5231); + try testArgs(i159, 0x3121c6ae74c46679386f2051ee0520d9264e01cf, -0x34fec2cf28ce549281a5dc79f7ed834483f418af); + try testArgs(u159, 0x2e479684775f86a8ff1a9c6fab9022b18a6f6be4, 0x63c77ea3d97ad2c715fd13db972e678fefe3efba); + try testArgs(i160, 0x1e55924219aa114ef8d2b3193d09ae7849a3e551, -0x13f1ff6a62e562f7b78559f032bb05b2e2d15748); + try testArgs(u160, 0x8ed3d206fcc59350cf23dcd9e042eb36bcc63e52, 0xc88e1c5a42abf98aee0a3479e7f4fe88ab53b6f2); + try testArgs(i161, -0xd3d6885c0df36bd513aca744561684d12a62f044, 0xa519d3c4a7ea2e4768d840ec8641995689de6116); + try testArgs(u161, 0x10b4afdfa36471c77a2b629ef85e1289b798161b, 0x15e89da33c31ec01adf6921b8d13bc943f139fba2); + try testArgs(i191, 0x2436122b85c017733d9d28347544298d148223e1d9cbf0a2, 0x46b80688a0e0b59e66628940772893fcce258d3da7c0193); + try testArgs(u191, 0x3d00a8da821de44f98fa70d298bda9e25f99d8f54936d09f, 0x4ad4440686be966599985094f16e364c961503214ff86519); + try testArgs(i192, 0x124d0580271a71745f842e3a81d8cb6154c7f6f4b8b0cf39, -0x5bae9d7d471e609f1570a3f9805b80c4d672a086d44107eb); + try testArgs(u192, 0x3b882677dc62d5c76cc942bea0d2f72925ff0a9e234d7ce9, 0x5d7825e3f2254bf214257ebe84716dc88fde6c9563218ac4); + try testArgs(i193, 0x9c143db83d19c8fff1c23f3c93b103eaf8be02910a1cbe5, 0xcfa1059ba12508d2ff3ef9763ce8224eb1d0a0f22def289d); + try testArgs(u193, 0x635890f170da79117490445db595c1f2bb5a5cf640abc8e8, 0xdb5a2a6a3c6db7f43949123f0886cb93bbbed2d5dd7690e); + try testArgs(i223, -0x25e4a8d454e5957a9906a66a0c02ad53e727e3e18ca4b8be98561306, 0x8d6d3977afce56a5dffc537de19d4c73f2e5603699373d010e51d10); + try testArgs(u223, 0x5721636a3c6d271fe9eb08420d29454775666266801a7d23d61075be, 0x7e573fd8dcbd6dc780d13b61d5255cae790ea697d1c9a5479fa51ee); + try testArgs(i224, 0x51f97aaa96493aaed2677294bfde0715d69d961fef97a557ae9dbc84, 0x306d9305e2d5162dd0ce0454d2daaa54879b11a77386bb03e779a23e); + try testArgs(u224, 0xdc7eb2070c048b6fd22d6df97b3ef5e9fc5f28d8d229710333defecd, 0x475662887f29712bc927fae9de37cd842d883682a26e653d7b3f2ed9); + try testArgs(i225, -0x9b3dba4fe2026e8d90d9be4b8b2334034d2ae23569c4e1a3a311925d, -0x2ae4c074cff2da1e7fcab269ce6da7f4a9f763062f97526c0b4abf34); + try testArgs(u225, 0xb36dd536afb070e9be7fba5eaf548fe741182cabaf9f9510f86b3ffb, 0x1f35e5728f29e2566afd9a325beaf17ebf5f894e744825bdd56bb12d0); + try testArgs(i255, 0x2db696171e4045e17cb2a96763ff2728b459e5bf9ade6e9cd118bbc4f91aca89, -0x1580d80086052560091fe42077ce66c45d7e93173f74327f44fec7b63ed9f2aa); + try testArgs(u255, 0x392b3639141d03da49d576fd0ce498e1bafb8fc032604e68e91e589f6d2a05a3, 0x46f60e500f01bdbe18f71fb8dbef0395245a94f55421637ca50eb8922a751977); + try testArgs(i256, -0x2f3c22cb1d12628b2eccd705f1526d8a91258183742d9521bdc97d943591d87c, -0x864d3ef8b592e041289dbb54def60ceee798673138aa750a5efdaffcd42b62d); + try testArgs(u256, 0x25776f0ce5f3c6761eec99ace965f9162e9416e4d4e298674e5723b64e443528, 0xb1ee7fd2efaddd5d25eea49bde34e53c40d59221757f17d53d9a4c9ab7eca3f5); + try testArgs(i257, 0xd599706e1a09217f1f698520993d2b62ee877a4150bd8db6e5546657900dc7ce, 0x51d0faef82bb0878a4fd4331dcaec6ed57156acc2377c7e301eca6989e897346); + try testArgs(u257, 0xb0d42105facc0db629c5a65d6e975d25163841051efb1e187b70015f8c9e22ba, 0xf0eb6d0529e15fac6e97e850f50b7bf5056c9010345884926bf056590ddf3187); + try testArgs(i511, 0x23c07fa26fea1595de6e368cb42d05696562d8fb05a2aab6b304c443275071a31684a369f69f30fd53223017669dcf8157f7ff1bcda05ad28dcf46c92f7f2bd5, 0x44884ae45727d2c249b280cbb6795f237015f1082ade12167c52f0318422b3ae9c1753263011878e3fa4fce0db683efdd249e325188a40ccb959bd6bf050fbf); + try testArgs(u511, 0x642d98a41a7cc71dab7845c2c568696d0d77733c266846019756937cc29382d46074c8eb86502f4855c35f6354e51d98c41674166a9a7385ab94b0c7a63f58c0, 0x3cc5230f530a12c8cae29654e55a6d7cd26fe7606beed5c9a8fef443b107bf18dd8cc034683b47a213a3a885abd7048188713e8e7b9157145cd24748e256f5b7); + try testArgs(i512, -0x4b6d88a77e2a42d67daada905d16c6045b4dd57e608a0482f45531781d4994e2a6b71ad41a106b2dfc76e60aebd9e1d357b24b8d6889de3cf3e58ff3a48f54aa, -0x2e28e1b21ec33fd5dd9b1fbdc312e32884208b549ce0ca1661ca1150a6bd43363d4d186aa8ac70ad0595b44b5279ff070df8bd0b51095c62c8c499bfcaa7494c); + try testArgs(u512, 0xf40ad922664478a7b71a5676fc49434a45ba86975cef377c8321159cd880b67cd543fcca70187d5912675c0bc1fa4129cb470f280cde56ac4ec848ca589f143f, 0xe20a8110780ff05718adc173677ff0579126576f1fc3857ac41d6b7d5334d93134181af15ce2d35224d2e5c63384f33e331b16ecbc6db44edbb4074134d23e97); + try testArgs(i513, 0x55a556c6b6605897ffb7a791bdf309d5edb879f2841d1bba37006cdd0e7d00d971c85def024e28b7a17e53f3bcf5a5d5c43e780c6d13d67de1ca7b8f05deddfb, 0x53f475716443b38792e618ce109cec641aa351ce2e258a99153820c5522a4acc7f2b5b4ecd0000bcbe5a410bbee200576f6ff17ce7e8b7d1f0752390d1bb9b3f); + try testArgs(u513, 0x1e4e15bc406c558c14f48b83090647d7f2254fa571eac7f8aad8edb76a90547f7854bd6315e50ad44ea93034db9fab450a584b53abf8537e31d39cd706a31eaa7, 0x1d348de8124b72ca1d0e382501024c9e1b0f6fc16c5cd4a86aef2731bd39c29173749afe94bb2992ea805148fe0d96abdc5980b2143bd81419c1e40bf81b2496f); + try testArgs(i1023, -0x37781a6086d9310e4cdb24f5f374736e32af53c9545298aa53fe17854f73052cd808f658efacea622c59adb51af4d2dd636521ca2717acc43389c975505b7543da2c62f33c3152907f13b1ffa5b9881b33acec3cab1d8e33c2239ea6835277c474629a9157f8acd7c1d83076c2e75a48a8d3a94067e801c51057e47e09f0be14, 0x39ad04132dec8b795b98fd7cd085605ce8354655633068ee485d9dc78853feb922a54a3df6209989d1137e4ea8b0ad2cae48b21df2e0c04feeca56d2551f12782312a6ae483ffff466ff78446ebd4d47a61c1cba2603a62b44a72800060dda7eec8bc9060b8c5533afa7946bd38e93fddb863392500c22616dd4ae4932f20fe4); + try testArgs(u1023, 0x6e14a9d998a9ef7ac77b6fe08225fcc176e687685736e0e32c9e6b8fe96e9a7b14b3318310e945f7f84128455075eedb4a7b7736185f58e5640688c5d3b47d785338a0b70e77f4d237fd85f7820f3ebe6eb30f5a71231e813a70d6c76963d66291f271cd6f462ce685a0270ec5f6e856340f91d7597cd2b779566fe3ff4d4a98, 0x211eafbd449691e390d14dd34cb9c4d32627ecbec485d4a0a7cca1b28bd81d2153a7a75c2f62c4c3c7f198740cfe65dfa3c86156aa0b6d22757fd07f4070ddd50e334782f045a58b96c5a8f04b4615968501e9b5e801c475bdc034919c9e9df6df3cbbd59bacfa9409b21c3365d10e132d75958774c6244446127b043d155ec4); + try testArgs(i1024, 0xa6bd15fd4c529a24e4d727c5c0db9422ed7038ba23944b2b54ffc8d3731e2ffc19e12d885010fb10d208ea045e2a4cfec32d190f221bd453ec73fcecc03e37fd70be3fba3945c881cb9bce69f3f6ad9a6ee0d42a393b3669d1ca518d0b7b06a2c47978f22bc1db8802ef6ce29ea51b48256c6fed82e04355665f9d27ff485b, -0x69f258c2a86e97161ce2e683801591976a8e5a71b88605450961ee271637e6c2fee13459c29d42d4c5fb408f80236d3b2db34752e307fee6cbce2e5088adc817902a5adbbba72c8be84b9f8af5ce0fac464cae61cff9cbbe3a8dcdbec0af855b2e6c2c19fbe4f01baec9ca28b78bd7d383281c71d81da74fd0a2c8a5b754ee57); + try testArgs(u1024, 0x111e0a4e0c61ab3c5229154539ddb010542cb528533b4ea13813d8dbbaca7de395aac3c22dae1bd9db8bf9005ea9ef3df253aefabdce060a93e60da6edc3b1b2d78aead4647e7a589b66aa53fb953742b71f823b539150918df0fe781ee4d00279e4da9995804391bb19504de2f108f7d6ba14d624fa175842bd429f638de8f9, 0xcf9160dcb7ed13a738f7c8b2a17ca2fe84f53620a50f6a948698c4efca88392dc104ef5d26f19c82c8f770f727585702cc8d1c4cc2bba9e691e61b055d98cd636347a7c50b3bd2b2f5dfa416dadbdd76c111d45598c93ef729588cf998a55260cfe94d376ec4e8dc132afa42b66b68bc826c50169f9f4fc798cf7e8f29df639a); + try testArgs(i1025, 0xef2102c2cab6ad6bf2f2ba09c154440e65acc56cb14c5221a12b12404f7eafefeab4537f70cc10afb945e93c935223ffd3146911021666fd68fcaa494ded54ce66d2832b1d82b0654f24f1183bbc3ee45eb15c424a74ad41f22c7009b86cb404ac3b810445679417d7e0c5d5f4e88dec7c90352afa367004facbc1d668ab0a7, 0xc7743d3a52bad9bed0d24dbeaac4f27f4790ee14e984484f7ee077e6285394f046f2ba6d3a9c6e0aea1c07de98741a88669a035ec4d9755130fe96414223486e89d710a743ca2c2b53871fdb4851d90a595111d8d12e6732e4b580e235218edee3bc56fca3de99bc5f9a37c9dbc9a8ca5aaba710ec5e498b58b239a1be56915b); + try testArgs(u1025, 0x1dea81169800bac2f3afcf3be5dbd2d8eefbace8a24a2da0a383a928d1109459f34028be4413119f1af00ad90ce4d63064016dc1cee5b783c79c1998a0a49de21c4db71d432273576503589fc966c7ec2d730fa9bc4c5ff3128a82653ab8149528de67804718e39722f89b91c75d012ea41c642c889f0db95c882a9790a5e922f, 0x156fe02946ab9069a644dcc1f2b1afa04ee88ab1de19575a2715abf4a52bf374d297fdf78455ccdb87a934d3d818d774b63865eaedfdad3c56a56b8fcc62703c391aedf16cf770af06d7d205f93778c012df54fe5290084e1cd2bbec86a2f295cdce69a2cd774e064580f3c9cfae60d17b12f610e86566e68d5183d706c8ad8af); } fn testFloats() !void { @setEvalBranchQuota(21_700); @@ -1942,130 +2004,67 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, }); - // workaround https://github.com/ziglang/zig/issues/22914 - // TODO: try testArgs(@Vector(1, i2), .{ - // 0x1, - // }, .{ - // 0x1, - // }); - // try testArgs(@Vector(2, i2), .{ - // 0x0, -0x2, - // }, .{ - // -0x2, -0x2, - // }); - // try testArgs(@Vector(4, i2), .{ - // -0x2, -0x1, 0x0, -0x2, - // }, .{ - // -0x2, 0x1, -0x1, -0x2, - // }); - // try testArgs(@Vector(8, i2), .{ - // -0x1, 0x1, 0x1, -0x1, -0x2, -0x2, 0x0, -0x2, - // }, .{ - // -0x1, -0x1, -0x2, -0x1, -0x2, 0x1, -0x1, 0x1, - // }); - // try testArgs(@Vector(16, i2), .{ - // 0x0, -0x2, -0x1, -0x2, 0x1, 0x0, -0x1, 0x0, 0x1, -0x2, 0x1, -0x1, -0x2, -0x2, 0x1, 0x0, - // }, .{ - // -0x2, -0x2, 0x1, -0x2, -0x1, -0x2, -0x1, -0x2, -0x2, -0x2, -0x1, -0x2, 0x1, -0x2, -0x2, -0x2, - // }); - // try testArgs(@Vector(32, i2), .{ - // -0x2, 0x1, -0x1, 0x1, 0x0, -0x2, 0x1, -0x2, -0x2, 0x0, -0x1, 0x0, -0x2, -0x2, 0x0, 0x1, - // -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, 0x1, -0x2, -0x1, -0x1, 0x1, -0x2, 0x0, -0x1, 0x0, -0x2, - // }, .{ - // 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x2, 0x1, -0x2, -0x1, -0x2, 0x1, 0x1, 0x1, -0x1, - // -0x2, 0x1, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, -0x2, 0x1, -0x2, -0x1, 0x1, -0x2, -0x2, - // }); - // try testArgs(@Vector(64, i2), .{ - // 0x1, -0x2, -0x1, 0x0, 0x1, -0x2, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, 0x1, 0x1, 0x0, 0x1, - // -0x1, -0x1, -0x1, 0x1, 0x1, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0, 0x1, 0x1, 0x0, -0x2, -0x2, - // 0x1, 0x0, -0x2, -0x2, 0x1, -0x2, -0x2, 0x1, 0x1, -0x2, 0x1, 0x0, 0x0, -0x1, 0x0, 0x1, - // -0x2, 0x0, 0x0, -0x1, -0x1, 0x1, -0x2, 0x0, -0x2, 0x0, -0x2, 0x1, 0x0, -0x1, -0x1, 0x1, - // }, .{ - // -0x2, -0x2, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, 0x1, 0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x1, - // -0x2, 0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x1, -0x2, -0x2, 0x1, -0x1, -0x2, 0x1, -0x2, 0x1, - // 0x1, -0x2, -0x2, -0x2, -0x2, 0x1, 0x1, 0x1, -0x2, 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, -0x1, - // -0x2, 0x1, -0x1, 0x1, -0x1, -0x1, 0x1, 0x1, -0x2, 0x1, 0x1, -0x2, -0x2, -0x1, -0x2, -0x2, - // }); - // try testArgs(@Vector(128, i2), .{ - // -0x1, -0x2, 0x0, -0x2, -0x2, 0x1, -0x1, 0x0, -0x1, -0x2, 0x0, -0x2, 0x0, 0x1, 0x0, -0x1, - // 0x0, -0x2, 0x1, 0x0, 0x1, 0x0, -0x2, 0x1, 0x1, 0x1, -0x1, 0x1, 0x0, -0x1, 0x1, -0x1, - // 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, -0x2, -0x2, 0x0, 0x0, 0x1, 0x1, -0x2, -0x1, - // 0x1, 0x0, 0x0, 0x1, -0x2, -0x1, 0x0, -0x1, 0x1, -0x2, 0x1, 0x0, 0x1, 0x0, 0x0, -0x2, - // 0x0, 0x0, -0x1, 0x1, -0x1, 0x0, -0x1, -0x2, 0x1, -0x2, -0x2, -0x1, -0x2, 0x0, 0x0, 0x0, - // -0x1, -0x1, -0x1, -0x1, -0x2, 0x0, -0x1, 0x1, 0x0, 0x0, -0x2, 0x0, 0x0, 0x0, 0x0, 0x1, - // 0x1, -0x2, 0x0, 0x0, -0x1, -0x1, 0x1, -0x1, -0x2, 0x0, -0x1, -0x1, -0x2, -0x2, 0x0, 0x0, - // -0x1, 0x0, 0x1, 0x0, -0x1, -0x2, 0x1, -0x2, -0x1, -0x1, 0x0, 0x0, -0x1, 0x0, 0x0, 0x1, - // }, .{ - // -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, 0x1, 0x1, 0x1, -0x2, -0x2, 0x1, -0x2, -0x2, 0x1, -0x1, - // -0x1, -0x2, 0x1, -0x1, 0x1, 0x1, 0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, 0x1, 0x1, -0x2, - // -0x1, -0x2, -0x2, -0x2, -0x2, -0x2, -0x1, -0x2, 0x1, 0x1, -0x1, -0x1, -0x1, -0x1, 0x1, -0x2, - // 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x2, -0x2, -0x2, 0x1, 0x1, -0x2, - // -0x1, 0x1, -0x2, -0x1, -0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, -0x2, -0x2, -0x2, -0x2, - // 0x1, -0x1, 0x1, -0x2, 0x1, -0x1, -0x1, 0x1, 0x1, -0x1, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, - // -0x2, 0x1, -0x2, -0x2, -0x1, -0x1, -0x1, -0x2, 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, -0x2, 0x1, - // 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x1, -0x2, -0x1, -0x1, 0x1, -0x2, -0x2, -0x2, - // }); try testArgs(@Vector(1, i2), .{ - -0x1, + 0x1, }, .{ - -0x2, + 0x1, }); try testArgs(@Vector(2, i2), .{ - -0x1, -0x1, + 0x0, -0x2, }, .{ - 0x1, -0x1, + -0x2, -0x2, }); try testArgs(@Vector(4, i2), .{ - -0x1, 0x1, -0x1, -0x1, + -0x2, -0x1, 0x0, -0x2, }, .{ - 0x1, -0x1, -0x1, 0x1, + -0x2, 0x1, -0x1, -0x2, }); try testArgs(@Vector(8, i2), .{ - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, -0x1, 0x1, + -0x1, 0x1, 0x1, -0x1, -0x2, -0x2, 0x0, -0x2, }, .{ - 0x1, -0x1, -0x1, -0x2, -0x1, -0x2, -0x1, 0x1, + -0x1, -0x1, -0x2, -0x1, -0x2, 0x1, -0x1, 0x1, }); try testArgs(@Vector(16, i2), .{ - 0x1, 0x0, 0x0, -0x1, 0x1, 0x0, 0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, 0x1, 0x1, 0x0, + 0x0, -0x2, -0x1, -0x2, 0x1, 0x0, -0x1, 0x0, 0x1, -0x2, 0x1, -0x1, -0x2, -0x2, 0x1, 0x0, }, .{ - 0x1, 0x1, 0x1, 0x1, -0x2, -0x2, -0x1, -0x1, -0x1, -0x2, 0x1, 0x1, -0x1, -0x2, -0x1, -0x1, + -0x2, -0x2, 0x1, -0x2, -0x1, -0x2, -0x1, -0x2, -0x2, -0x2, -0x1, -0x2, 0x1, -0x2, -0x2, -0x2, }); try testArgs(@Vector(32, i2), .{ - 0x0, 0x1, -0x1, -0x1, -0x1, 0x0, -0x1, 0x0, -0x1, -0x1, 0x1, -0x1, 0x0, -0x1, 0x0, -0x1, - -0x1, 0x1, 0x1, 0x1, -0x1, -0x1, 0x1, -0x1, -0x1, 0x1, -0x1, -0x1, 0x1, 0x0, 0x0, 0x1, + -0x2, 0x1, -0x1, 0x1, 0x0, -0x2, 0x1, -0x2, -0x2, 0x0, -0x1, 0x0, -0x2, -0x2, 0x0, 0x1, + -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, 0x1, -0x2, -0x1, -0x1, 0x1, -0x2, 0x0, -0x1, 0x0, -0x2, }, .{ - -0x2, -0x1, -0x2, 0x1, -0x1, 0x1, -0x2, -0x2, -0x1, -0x1, -0x1, -0x1, 0x1, 0x1, 0x1, -0x2, - -0x1, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, 0x1, -0x2, -0x1, -0x1, -0x2, 0x1, -0x2, -0x2, -0x1, + 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x2, 0x1, -0x2, -0x1, -0x2, 0x1, 0x1, 0x1, -0x1, + -0x2, 0x1, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, -0x2, 0x1, -0x2, -0x1, 0x1, -0x2, -0x2, }); try testArgs(@Vector(64, i2), .{ - 0x1, 0x1, -0x1, 0x0, 0x0, 0x1, 0x1, -0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, - -0x1, 0x0, 0x0, 0x0, 0x0, -0x1, 0x0, 0x1, 0x1, 0x0, 0x1, -0x1, -0x1, 0x0, -0x1, 0x0, - -0x1, 0x1, -0x1, 0x0, -0x1, 0x1, 0x0, 0x0, 0x0, 0x1, -0x1, 0x0, -0x1, 0x1, 0x0, 0x0, - 0x1, -0x1, -0x1, 0x0, 0x1, -0x1, -0x1, 0x0, 0x1, 0x1, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0, + 0x1, -0x2, -0x1, 0x0, 0x1, -0x2, -0x1, -0x2, -0x2, -0x1, -0x2, -0x1, 0x1, 0x1, 0x0, 0x1, + -0x1, -0x1, -0x1, 0x1, 0x1, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0, 0x1, 0x1, 0x0, -0x2, -0x2, + 0x1, 0x0, -0x2, -0x2, 0x1, -0x2, -0x2, 0x1, 0x1, -0x2, 0x1, 0x0, 0x0, -0x1, 0x0, 0x1, + -0x2, 0x0, 0x0, -0x1, -0x1, 0x1, -0x2, 0x0, -0x2, 0x0, -0x2, 0x1, 0x0, -0x1, -0x1, 0x1, }, .{ - -0x1, 0x1, -0x2, -0x1, -0x1, 0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x1, - -0x1, -0x1, 0x1, -0x2, -0x2, -0x2, -0x1, -0x1, -0x2, 0x1, -0x2, -0x2, -0x2, 0x1, -0x2, -0x2, - -0x2, -0x1, -0x1, 0x1, -0x2, -0x1, -0x1, -0x1, -0x2, 0x1, -0x1, 0x1, -0x2, -0x2, 0x1, -0x1, - -0x1, 0x1, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, -0x2, 0x1, 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, + -0x2, -0x2, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, 0x1, 0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x1, + -0x2, 0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x1, -0x2, -0x2, 0x1, -0x1, -0x2, 0x1, -0x2, 0x1, + 0x1, -0x2, -0x2, -0x2, -0x2, 0x1, 0x1, 0x1, -0x2, 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, -0x1, + -0x2, 0x1, -0x1, 0x1, -0x1, -0x1, 0x1, 0x1, -0x2, 0x1, 0x1, -0x2, -0x2, -0x1, -0x2, -0x2, }); try testArgs(@Vector(128, i2), .{ - 0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, 0x0, 0x1, 0x0, -0x1, 0x0, -0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, -0x1, 0x1, -0x1, -0x1, 0x1, 0x0, 0x1, 0x1, 0x0, 0x1, -0x1, 0x0, -0x1, - 0x0, 0x1, -0x1, 0x1, -0x1, -0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, -0x1, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, -0x1, 0x1, 0x1, -0x1, 0x1, -0x1, 0x0, 0x1, 0x0, 0x1, - 0x0, -0x1, 0x0, 0x0, 0x1, -0x1, 0x0, 0x0, -0x1, -0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, - 0x0, -0x1, 0x1, -0x1, -0x1, 0x0, 0x0, 0x1, -0x1, -0x1, 0x1, 0x0, -0x1, 0x1, 0x0, -0x1, - 0x1, 0x0, 0x1, -0x1, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, -0x1, -0x1, 0x0, 0x1, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, -0x1, 0x0, -0x1, -0x1, 0x0, 0x0, 0x0, 0x1, 0x1, -0x1, + -0x1, -0x2, 0x0, -0x2, -0x2, 0x1, -0x1, 0x0, -0x1, -0x2, 0x0, -0x2, 0x0, 0x1, 0x0, -0x1, + 0x0, -0x2, 0x1, 0x0, 0x1, 0x0, -0x2, 0x1, 0x1, 0x1, -0x1, 0x1, 0x0, -0x1, 0x1, -0x1, + 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, -0x2, -0x2, 0x0, 0x0, 0x1, 0x1, -0x2, -0x1, + 0x1, 0x0, 0x0, 0x1, -0x2, -0x1, 0x0, -0x1, 0x1, -0x2, 0x1, 0x0, 0x1, 0x0, 0x0, -0x2, + 0x0, 0x0, -0x1, 0x1, -0x1, 0x0, -0x1, -0x2, 0x1, -0x2, -0x2, -0x1, -0x2, 0x0, 0x0, 0x0, + -0x1, -0x1, -0x1, -0x1, -0x2, 0x0, -0x1, 0x1, 0x0, 0x0, -0x2, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x1, -0x2, 0x0, 0x0, -0x1, -0x1, 0x1, -0x1, -0x2, 0x0, -0x1, -0x1, -0x2, -0x2, 0x0, 0x0, + -0x1, 0x0, 0x1, 0x0, -0x1, -0x2, 0x1, -0x2, -0x1, -0x1, 0x0, 0x0, -0x1, 0x0, 0x0, 0x1, }, .{ - -0x2, -0x2, -0x1, -0x2, -0x1, -0x1, -0x2, -0x2, -0x2, 0x1, -0x2, -0x2, -0x2, -0x2, -0x2, 0x1, - -0x1, 0x1, -0x1, -0x1, -0x2, -0x2, -0x1, -0x2, 0x1, -0x2, -0x1, -0x2, -0x2, -0x1, 0x1, -0x1, - -0x2, -0x1, -0x1, -0x2, -0x1, -0x2, -0x1, 0x1, -0x1, -0x1, 0x1, -0x1, -0x2, 0x1, -0x2, -0x1, - -0x2, 0x1, -0x1, -0x2, -0x2, -0x2, -0x2, -0x1, 0x1, 0x1, 0x1, 0x1, -0x1, -0x2, -0x1, -0x1, - -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, 0x1, -0x2, -0x1, -0x2, -0x1, -0x2, -0x2, 0x1, -0x1, 0x1, - -0x2, -0x2, 0x1, -0x2, -0x1, -0x1, 0x1, -0x1, -0x1, -0x1, -0x2, -0x2, -0x1, 0x1, 0x1, -0x2, - -0x1, -0x2, 0x1, 0x1, 0x1, 0x1, -0x2, 0x1, -0x1, -0x1, -0x2, 0x1, -0x1, -0x2, -0x1, -0x2, - -0x2, -0x2, -0x1, -0x1, -0x2, -0x1, 0x1, -0x1, 0x1, 0x1, 0x1, -0x2, -0x1, 0x1, -0x2, 0x1, + -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, 0x1, 0x1, 0x1, -0x2, -0x2, 0x1, -0x2, -0x2, 0x1, -0x1, + -0x1, -0x2, 0x1, -0x1, 0x1, 0x1, 0x1, -0x1, -0x1, -0x1, -0x1, -0x1, -0x1, 0x1, 0x1, -0x2, + -0x1, -0x2, -0x2, -0x2, -0x2, -0x2, -0x1, -0x2, 0x1, 0x1, -0x1, -0x1, -0x1, -0x1, 0x1, -0x2, + 0x1, -0x1, 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x2, -0x2, -0x2, 0x1, 0x1, -0x2, + -0x1, 0x1, -0x2, -0x1, -0x1, 0x1, -0x2, -0x2, 0x1, 0x1, -0x2, -0x1, -0x2, -0x2, -0x2, -0x2, + 0x1, -0x1, 0x1, -0x2, 0x1, -0x1, -0x1, 0x1, 0x1, -0x1, 0x1, -0x1, -0x2, -0x2, -0x1, -0x2, + -0x2, 0x1, -0x2, -0x2, -0x1, -0x1, -0x1, -0x2, 0x1, -0x2, 0x1, -0x2, 0x1, -0x2, -0x2, 0x1, + 0x1, -0x1, 0x1, 0x1, -0x1, -0x2, 0x1, 0x1, -0x1, -0x2, -0x1, -0x1, 0x1, -0x2, -0x2, -0x2, }); try testArgs(@Vector(1, u2), .{ @@ -2131,130 +2130,67 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela 0x2, 0x2, 0x3, 0x3, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x3, 0x1, 0x3, 0x2, 0x3, 0x1, }); - // workaround https://github.com/ziglang/zig/issues/22914 - // TODO: try testArgs(@Vector(1, i3), .{ - // -0x3, - // }, .{ - // -0x1, - // }); - // try testArgs(@Vector(2, i3), .{ - // 0x2, -0x3, - // }, .{ - // 0x1, 0x3, - // }); - // try testArgs(@Vector(4, i3), .{ - // 0x1, -0x4, -0x2, -0x3, - // }, .{ - // -0x2, -0x4, 0x2, 0x2, - // }); - // try testArgs(@Vector(8, i3), .{ - // 0x0, 0x1, 0x3, 0x1, -0x3, 0x1, 0x3, 0x3, - // }, .{ - // -0x3, 0x2, 0x1, 0x1, -0x4, -0x1, 0x3, -0x2, - // }); - // try testArgs(@Vector(16, i3), .{ - // -0x4, 0x3, -0x2, 0x0, -0x2, -0x1, 0x2, -0x4, 0x1, -0x3, 0x2, -0x2, 0x1, -0x2, 0x2, -0x4, - // }, .{ - // 0x2, -0x3, 0x3, 0x1, -0x4, 0x1, -0x1, 0x1, -0x1, -0x3, -0x4, 0x2, 0x3, 0x3, -0x1, -0x4, - // }); - // try testArgs(@Vector(32, i3), .{ - // 0x1, -0x3, -0x1, -0x3, -0x3, 0x2, 0x1, 0x0, 0x0, -0x1, 0x3, -0x2, 0x3, 0x0, -0x3, 0x0, - // -0x4, -0x2, -0x1, -0x4, -0x4, 0x2, 0x2, 0x3, 0x1, 0x2, -0x4, -0x4, -0x3, 0x1, -0x1, -0x2, - // }, .{ - // -0x4, -0x2, 0x1, -0x1, 0x3, 0x1, 0x2, -0x3, 0x2, -0x2, 0x1, -0x1, -0x2, -0x1, -0x1, -0x2, - // -0x2, -0x3, 0x3, -0x3, -0x4, 0x1, -0x3, 0x3, 0x1, -0x3, 0x3, 0x3, -0x4, 0x3, 0x2, -0x2, - // }); - // try testArgs(@Vector(64, i3), .{ - // 0x1, 0x2, 0x1, 0x2, -0x2, 0x2, 0x2, -0x1, -0x4, 0x1, 0x3, 0x0, -0x2, -0x2, 0x2, -0x2, - // 0x0, -0x4, -0x3, -0x4, -0x1, -0x1, 0x2, 0x2, -0x2, -0x1, -0x1, 0x3, 0x3, -0x4, 0x2, 0x0, - // 0x3, 0x2, -0x4, -0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x3, -0x3, 0x1, -0x4, -0x2, 0x1, -0x3, - // -0x3, -0x1, 0x1, -0x3, -0x1, 0x3, -0x4, -0x4, 0x0, 0x0, -0x4, -0x2, 0x3, -0x1, -0x3, -0x3, - // }, .{ - // 0x3, -0x2, 0x1, -0x4, 0x1, 0x3, -0x3, 0x1, 0x3, 0x1, 0x1, -0x1, -0x2, 0x1, -0x3, 0x1, - // -0x2, -0x2, 0x3, -0x3, -0x1, -0x3, 0x1, -0x1, -0x3, -0x3, 0x1, -0x2, 0x1, -0x2, 0x1, 0x2, - // 0x3, -0x4, -0x4, -0x1, 0x1, 0x3, 0x1, 0x1, -0x4, 0x2, -0x3, 0x3, 0x3, -0x1, 0x1, -0x1, - // -0x2, 0x2, 0x2, -0x4, -0x4, 0x3, -0x2, -0x4, -0x1, -0x2, -0x4, 0x1, 0x2, 0x1, -0x1, -0x2, - // }); - // try testArgs(@Vector(128, i3), .{ - // -0x4, 0x1, 0x0, -0x4, -0x4, 0x1, -0x4, -0x2, 0x2, 0x2, -0x3, 0x1, 0x2, -0x2, 0x1, 0x1, - // 0x3, 0x0, 0x3, -0x4, -0x1, 0x3, 0x3, -0x4, 0x0, -0x3, 0x2, -0x2, 0x0, 0x3, 0x1, -0x2, - // -0x1, -0x1, 0x3, -0x1, -0x2, 0x3, 0x3, 0x1, -0x3, 0x1, -0x1, -0x2, -0x4, 0x2, -0x2, -0x1, - // 0x1, 0x1, 0x1, 0x0, -0x1, 0x2, -0x1, 0x3, 0x2, -0x1, -0x2, 0x3, -0x2, 0x3, 0x3, 0x1, - // 0x3, -0x3, -0x4, -0x1, 0x2, 0x2, -0x2, 0x3, -0x4, -0x2, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0, - // -0x2, 0x3, 0x0, -0x3, -0x4, 0x2, -0x3, -0x2, -0x4, 0x0, -0x3, -0x4, -0x4, -0x2, -0x1, -0x3, - // 0x0, -0x1, 0x0, -0x1, 0x2, -0x4, -0x3, 0x0, -0x4, 0x0, -0x2, 0x1, -0x2, -0x4, -0x1, -0x1, - // -0x3, 0x3, -0x1, -0x1, -0x2, 0x1, 0x3, 0x1, -0x3, 0x1, -0x4, -0x2, 0x0, -0x1, -0x2, 0x2, - // }, .{ - // -0x3, 0x2, -0x3, 0x1, -0x2, -0x1, -0x3, 0x1, 0x2, 0x2, -0x2, 0x2, 0x2, 0x1, 0x3, -0x1, - // -0x4, -0x3, 0x2, -0x3, -0x2, 0x3, -0x3, 0x2, -0x1, -0x3, 0x1, 0x2, -0x4, 0x2, -0x2, -0x3, - // 0x1, -0x1, 0x2, 0x2, -0x1, -0x3, -0x4, 0x2, 0x1, -0x4, 0x1, -0x4, 0x2, -0x1, 0x2, -0x2, - // 0x2, 0x1, -0x4, 0x3, 0x1, -0x2, -0x3, -0x4, 0x3, -0x1, 0x3, -0x4, -0x2, 0x1, -0x2, 0x3, - // 0x1, 0x1, 0x2, 0x1, -0x1, -0x2, 0x2, -0x1, 0x1, -0x1, -0x3, -0x1, 0x1, -0x4, -0x1, -0x1, - // -0x3, -0x1, -0x4, 0x3, 0x1, -0x1, -0x1, -0x1, 0x1, -0x4, 0x1, -0x2, -0x4, 0x2, -0x4, -0x3, - // 0x2, -0x4, -0x1, 0x1, 0x3, 0x2, -0x1, 0x3, 0x2, 0x2, 0x1, -0x4, -0x3, 0x1, -0x1, 0x1, - // -0x2, -0x4, 0x1, 0x3, -0x1, 0x3, 0x1, 0x2, -0x4, 0x2, 0x2, -0x3, -0x3, -0x4, -0x2, 0x3, - // }); try testArgs(@Vector(1, i3), .{ - -0x1, - }, .{ -0x3, + }, .{ + -0x1, }); try testArgs(@Vector(2, i3), .{ - 0x2, -0x2, + 0x2, -0x3, }, .{ - 0x3, 0x3, + 0x1, 0x3, }); try testArgs(@Vector(4, i3), .{ - 0x1, 0x0, -0x2, 0x0, + 0x1, -0x4, -0x2, -0x3, }, .{ - 0x2, -0x2, -0x4, 0x3, + -0x2, -0x4, 0x2, 0x2, }); try testArgs(@Vector(8, i3), .{ - 0x3, -0x1, -0x3, -0x3, -0x3, -0x2, 0x2, -0x3, + 0x0, 0x1, 0x3, 0x1, -0x3, 0x1, 0x3, 0x3, }, .{ - -0x1, 0x1, -0x2, 0x2, 0x1, -0x2, -0x3, -0x1, + -0x3, 0x2, 0x1, 0x1, -0x4, -0x1, 0x3, -0x2, }); try testArgs(@Vector(16, i3), .{ - -0x1, -0x1, 0x3, -0x2, -0x2, -0x2, -0x2, -0x1, 0x2, 0x1, -0x2, 0x2, -0x2, 0x1, 0x1, -0x3, + -0x4, 0x3, -0x2, 0x0, -0x2, -0x1, 0x2, -0x4, 0x1, -0x3, 0x2, -0x2, 0x1, -0x2, 0x2, -0x4, }, .{ - 0x1, -0x1, -0x1, -0x1, 0x1, 0x3, -0x1, -0x1, 0x1, 0x3, -0x1, -0x3, 0x1, 0x3, 0x1, -0x2, + 0x2, -0x3, 0x3, 0x1, -0x4, 0x1, -0x1, 0x1, -0x1, -0x3, -0x4, 0x2, 0x3, 0x3, -0x1, -0x4, }); try testArgs(@Vector(32, i3), .{ - 0x3, -0x1, -0x3, 0x1, 0x0, 0x0, -0x3, -0x1, -0x3, 0x1, 0x1, 0x2, -0x1, 0x1, -0x1, -0x1, - 0x1, -0x3, 0x1, -0x1, 0x1, 0x0, -0x2, 0x3, -0x2, -0x3, 0x3, 0x1, -0x1, 0x0, 0x3, -0x1, + 0x1, -0x3, -0x1, -0x3, -0x3, 0x2, 0x1, 0x0, 0x0, -0x1, 0x3, -0x2, 0x3, 0x0, -0x3, 0x0, + -0x4, -0x2, -0x1, -0x4, -0x4, 0x2, 0x2, 0x3, 0x1, 0x2, -0x4, -0x4, -0x3, 0x1, -0x1, -0x2, }, .{ - 0x1, -0x2, -0x4, -0x4, 0x2, 0x1, -0x4, -0x3, -0x4, 0x1, -0x3, -0x4, -0x1, 0x2, -0x1, 0x1, - 0x2, -0x2, -0x4, 0x3, -0x3, 0x1, 0x2, -0x2, -0x2, 0x3, 0x3, 0x2, -0x2, -0x4, -0x2, -0x3, + -0x4, -0x2, 0x1, -0x1, 0x3, 0x1, 0x2, -0x3, 0x2, -0x2, 0x1, -0x1, -0x2, -0x1, -0x1, -0x2, + -0x2, -0x3, 0x3, -0x3, -0x4, 0x1, -0x3, 0x3, 0x1, -0x3, 0x3, 0x3, -0x4, 0x3, 0x2, -0x2, }); try testArgs(@Vector(64, i3), .{ - -0x2, 0x1, 0x3, -0x1, -0x3, -0x1, 0x1, -0x3, 0x1, -0x2, 0x0, 0x3, 0x0, -0x2, 0x1, -0x3, - -0x2, 0x1, -0x2, 0x2, 0x0, 0x1, -0x3, 0x0, -0x3, 0x0, -0x3, -0x2, -0x2, -0x3, -0x2, 0x3, - -0x1, 0x1, 0x1, 0x1, -0x1, 0x0, -0x3, -0x3, -0x3, -0x3, -0x2, 0x2, 0x3, 0x2, -0x3, 0x1, - -0x3, -0x3, -0x1, -0x1, -0x1, -0x3, -0x2, -0x2, 0x2, 0x3, 0x3, -0x3, 0x0, 0x3, -0x3, -0x3, + 0x1, 0x2, 0x1, 0x2, -0x2, 0x2, 0x2, -0x1, -0x4, 0x1, 0x3, 0x0, -0x2, -0x2, 0x2, -0x2, + 0x0, -0x4, -0x3, -0x4, -0x1, -0x1, 0x2, 0x2, -0x2, -0x1, -0x1, 0x3, 0x3, -0x4, 0x2, 0x0, + 0x3, 0x2, -0x4, -0x1, 0x1, 0x1, 0x3, 0x1, 0x2, 0x3, -0x3, 0x1, -0x4, -0x2, 0x1, -0x3, + -0x3, -0x1, 0x1, -0x3, -0x1, 0x3, -0x4, -0x4, 0x0, 0x0, -0x4, -0x2, 0x3, -0x1, -0x3, -0x3, }, .{ - 0x2, 0x1, -0x1, -0x3, -0x1, -0x4, -0x2, -0x3, 0x2, -0x2, -0x4, 0x2, 0x2, -0x2, 0x1, 0x1, - 0x1, -0x1, -0x3, 0x2, -0x2, 0x2, -0x1, 0x3, 0x3, -0x1, -0x1, -0x3, -0x1, 0x2, -0x2, 0x2, - 0x1, -0x4, -0x2, -0x4, 0x2, -0x1, -0x2, 0x3, 0x3, 0x3, -0x4, -0x2, 0x3, -0x4, 0x1, -0x2, - -0x2, 0x2, -0x3, -0x3, 0x1, -0x3, 0x3, 0x2, 0x1, 0x3, -0x3, 0x3, 0x2, -0x2, -0x2, 0x2, + 0x3, -0x2, 0x1, -0x4, 0x1, 0x3, -0x3, 0x1, 0x3, 0x1, 0x1, -0x1, -0x2, 0x1, -0x3, 0x1, + -0x2, -0x2, 0x3, -0x3, -0x1, -0x3, 0x1, -0x1, -0x3, -0x3, 0x1, -0x2, 0x1, -0x2, 0x1, 0x2, + 0x3, -0x4, -0x4, -0x1, 0x1, 0x3, 0x1, 0x1, -0x4, 0x2, -0x3, 0x3, 0x3, -0x1, 0x1, -0x1, + -0x2, 0x2, 0x2, -0x4, -0x4, 0x3, -0x2, -0x4, -0x1, -0x2, -0x4, 0x1, 0x2, 0x1, -0x1, -0x2, }); try testArgs(@Vector(128, i3), .{ - -0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, -0x3, 0x1, -0x2, -0x1, 0x0, 0x2, 0x3, -0x3, - -0x1, -0x1, -0x2, 0x3, 0x1, 0x2, 0x2, 0x3, -0x2, 0x3, -0x2, -0x3, 0x1, 0x0, -0x1, -0x2, - -0x1, -0x1, 0x1, -0x1, 0x2, -0x3, 0x1, -0x2, -0x1, 0x2, -0x2, 0x1, 0x1, -0x3, -0x2, 0x3, - -0x1, -0x1, 0x1, -0x3, -0x1, -0x2, 0x0, 0x1, -0x1, 0x0, -0x1, 0x2, 0x1, 0x2, 0x3, -0x1, - 0x0, 0x1, 0x2, 0x3, -0x2, 0x2, -0x3, 0x2, 0x0, -0x2, -0x3, -0x2, 0x0, 0x1, 0x2, 0x1, - -0x3, 0x0, -0x2, -0x3, -0x1, 0x2, -0x3, 0x2, 0x3, 0x1, 0x1, -0x1, 0x2, 0x1, -0x1, 0x2, - 0x2, 0x0, 0x1, -0x3, -0x3, 0x1, 0x2, 0x0, 0x1, 0x0, 0x0, -0x1, 0x0, 0x0, 0x3, 0x3, - 0x0, -0x2, -0x2, -0x2, 0x3, 0x0, -0x1, -0x2, 0x0, 0x3, -0x3, 0x1, 0x2, -0x1, 0x1, 0x1, + -0x4, 0x1, 0x0, -0x4, -0x4, 0x1, -0x4, -0x2, 0x2, 0x2, -0x3, 0x1, 0x2, -0x2, 0x1, 0x1, + 0x3, 0x0, 0x3, -0x4, -0x1, 0x3, 0x3, -0x4, 0x0, -0x3, 0x2, -0x2, 0x0, 0x3, 0x1, -0x2, + -0x1, -0x1, 0x3, -0x1, -0x2, 0x3, 0x3, 0x1, -0x3, 0x1, -0x1, -0x2, -0x4, 0x2, -0x2, -0x1, + 0x1, 0x1, 0x1, 0x0, -0x1, 0x2, -0x1, 0x3, 0x2, -0x1, -0x2, 0x3, -0x2, 0x3, 0x3, 0x1, + 0x3, -0x3, -0x4, -0x1, 0x2, 0x2, -0x2, 0x3, -0x4, -0x2, -0x1, 0x0, 0x1, -0x1, 0x0, 0x0, + -0x2, 0x3, 0x0, -0x3, -0x4, 0x2, -0x3, -0x2, -0x4, 0x0, -0x3, -0x4, -0x4, -0x2, -0x1, -0x3, + 0x0, -0x1, 0x0, -0x1, 0x2, -0x4, -0x3, 0x0, -0x4, 0x0, -0x2, 0x1, -0x2, -0x4, -0x1, -0x1, + -0x3, 0x3, -0x1, -0x1, -0x2, 0x1, 0x3, 0x1, -0x3, 0x1, -0x4, -0x2, 0x0, -0x1, -0x2, 0x2, }, .{ - 0x3, 0x3, 0x2, 0x3, -0x3, -0x4, 0x1, -0x3, 0x2, 0x3, 0x3, -0x2, 0x2, -0x1, 0x1, 0x3, - -0x4, -0x4, -0x1, -0x1, 0x2, -0x3, -0x3, -0x3, -0x2, -0x3, -0x2, -0x1, 0x1, 0x3, -0x4, -0x2, - -0x3, 0x1, 0x3, 0x1, -0x2, 0x1, 0x1, 0x2, 0x1, 0x2, -0x4, -0x4, -0x3, -0x2, -0x1, -0x2, - 0x3, 0x2, -0x3, -0x2, -0x2, 0x3, -0x3, -0x4, 0x3, -0x3, 0x3, -0x1, 0x3, -0x1, -0x1, 0x2, - 0x3, -0x4, -0x4, -0x2, -0x4, 0x2, -0x2, -0x4, -0x2, -0x2, -0x3, 0x3, 0x2, 0x2, 0x2, -0x4, - 0x1, -0x4, -0x3, -0x2, -0x4, -0x4, 0x1, -0x4, -0x1, 0x3, -0x2, -0x4, 0x3, -0x4, 0x3, -0x1, - 0x3, 0x1, -0x1, 0x1, 0x1, 0x2, 0x1, -0x3, -0x4, -0x1, -0x1, -0x2, -0x3, -0x2, 0x3, -0x2, - -0x1, 0x3, 0x3, -0x1, 0x3, 0x1, 0x1, 0x2, -0x3, 0x3, -0x1, 0x3, -0x3, -0x4, -0x4, 0x1, + -0x3, 0x2, -0x3, 0x1, -0x2, -0x1, -0x3, 0x1, 0x2, 0x2, -0x2, 0x2, 0x2, 0x1, 0x3, -0x1, + -0x4, -0x3, 0x2, -0x3, -0x2, 0x3, -0x3, 0x2, -0x1, -0x3, 0x1, 0x2, -0x4, 0x2, -0x2, -0x3, + 0x1, -0x1, 0x2, 0x2, -0x1, -0x3, -0x4, 0x2, 0x1, -0x4, 0x1, -0x4, 0x2, -0x1, 0x2, -0x2, + 0x2, 0x1, -0x4, 0x3, 0x1, -0x2, -0x3, -0x4, 0x3, -0x1, 0x3, -0x4, -0x2, 0x1, -0x2, 0x3, + 0x1, 0x1, 0x2, 0x1, -0x1, -0x2, 0x2, -0x1, 0x1, -0x1, -0x3, -0x1, 0x1, -0x4, -0x1, -0x1, + -0x3, -0x1, -0x4, 0x3, 0x1, -0x1, -0x1, -0x1, 0x1, -0x4, 0x1, -0x2, -0x4, 0x2, -0x4, -0x3, + 0x2, -0x4, -0x1, 0x1, 0x3, 0x2, -0x1, 0x3, 0x2, 0x2, 0x1, -0x4, -0x3, 0x1, -0x1, 0x1, + -0x2, -0x4, 0x1, 0x3, -0x1, 0x3, 0x1, 0x2, -0x4, 0x2, 0x2, -0x3, -0x3, -0x4, -0x2, 0x3, }); try testArgs(@Vector(1, u3), .{ @@ -2320,130 +2256,67 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela 0x1, 0x1, 0x2, 0x7, 0x2, 0x5, 0x1, 0x6, 0x4, 0x6, 0x1, 0x6, 0x5, 0x1, 0x2, 0x1, }); - // workaround https://github.com/ziglang/zig/issues/22914 - // TODO: try testArgs(@Vector(1, i4), .{ - // 0x2, - // }, .{ - // 0x1, - // }); - // try testArgs(@Vector(2, i4), .{ - // -0x2, 0x5, - // }, .{ - // -0x1, 0x2, - // }); - // try testArgs(@Vector(4, i4), .{ - // -0x8, 0x5, 0x5, -0x2, - // }, .{ - // -0x3, -0x7, -0x4, -0x5, - // }); - // try testArgs(@Vector(8, i4), .{ - // 0x7, 0x3, 0x2, -0x1, -0x8, -0x2, 0x7, 0x1, - // }, .{ - // -0x2, 0x4, -0x8, 0x7, 0x1, -0x5, 0x6, -0x7, - // }); - // try testArgs(@Vector(16, i4), .{ - // 0x6, -0x3, 0x6, 0x6, -0x5, 0x6, 0x3, 0x7, -0x6, 0x7, -0x7, 0x6, -0x2, -0x2, -0x5, 0x0, - // }, .{ - // 0x2, -0x3, -0x4, -0x5, 0x3, 0x3, -0x5, 0x5, 0x4, -0x1, -0x6, 0x4, 0x7, -0x2, 0x3, 0x2, - // }); - // try testArgs(@Vector(32, i4), .{ - // -0x1, -0x4, 0x6, 0x6, 0x5, 0x3, 0x4, 0x0, 0x3, 0x7, -0x6, 0x7, -0x2, -0x7, -0x4, 0x6, - // 0x3, -0x7, -0x5, 0x1, -0x7, -0x6, 0x1, 0x3, 0x7, -0x8, -0x5, 0x6, -0x5, 0x0, 0x0, -0x8, - // }, .{ - // -0x4, -0x4, -0x4, 0x4, -0x5, 0x3, -0x1, 0x6, 0x1, -0x3, -0x1, 0x6, 0x5, -0x8, 0x1, -0x4, - // -0x1, -0x4, 0x1, -0x3, 0x4, 0x6, -0x3, -0x8, -0x7, -0x4, 0x2, -0x3, -0x1, -0x2, 0x6, -0x6, - // }); - // try testArgs(@Vector(64, i4), .{ - // 0x0, -0x3, -0x3, 0x5, 0x2, -0x1, 0x4, 0x5, 0x6, -0x2, 0x1, 0x5, -0x3, -0x1, -0x2, -0x1, - // -0x8, 0x2, -0x1, -0x2, 0x7, -0x3, -0x2, -0x3, 0x1, -0x5, 0x5, 0x2, -0x1, -0x6, -0x2, -0x1, - // -0x2, -0x5, 0x0, 0x6, 0x3, -0x4, -0x5, -0x5, -0x4, -0x7, -0x4, 0x1, 0x0, -0x6, -0x7, -0x6, - // 0x1, -0x6, 0x4, -0x4, -0x2, 0x6, -0x7, 0x4, 0x4, 0x5, 0x3, -0x6, -0x8, -0x5, 0x5, -0x7, - // }, .{ - // -0x1, -0x5, 0x5, -0x2, 0x6, -0x6, -0x4, -0x5, -0x4, 0x7, -0x6, 0x7, 0x4, -0x5, 0x5, 0x7, - // -0x6, 0x3, -0x4, 0x2, -0x8, 0x4, -0x2, 0x5, -0x5, -0x5, -0x8, 0x3, -0x1, -0x4, -0x8, -0x2, - // -0x2, 0x5, -0x7, -0x3, 0x2, -0x5, -0x6, -0x7, -0x8, -0x2, 0x5, -0x3, 0x2, -0x1, -0x7, -0x4, - // -0x3, -0x3, 0x6, -0x8, 0x3, -0x4, 0x7, 0x3, -0x2, 0x7, -0x1, 0x1, 0x1, 0x6, -0x2, -0x2, - // }); - // try testArgs(@Vector(128, i4), .{ - // -0x1, -0x3, -0x3, -0x4, 0x3, -0x4, 0x0, -0x4, 0x7, 0x3, 0x5, -0x4, -0x5, -0x4, -0x2, -0x7, - // 0x2, 0x0, -0x4, 0x7, 0x3, -0x5, 0x4, 0x5, -0x2, -0x3, -0x4, 0x6, -0x7, -0x1, 0x1, -0x6, - // 0x1, 0x5, 0x2, 0x5, 0x2, 0x2, -0x4, -0x4, 0x5, 0x2, -0x2, -0x8, -0x1, -0x2, 0x5, 0x3, - // 0x0, -0x5, 0x5, 0x7, 0x6, -0x3, -0x2, 0x0, -0x7, -0x7, -0x4, 0x2, -0x4, 0x7, 0x1, -0x5, - // -0x4, -0x8, 0x2, -0x7, 0x3, -0x4, 0x7, 0x6, -0x7, -0x3, -0x7, 0x2, 0x4, 0x2, -0x5, -0x6, - // 0x3, 0x5, 0x1, 0x6, 0x5, 0x7, 0x7, -0x4, -0x7, -0x1, 0x0, -0x7, 0x6, 0x0, 0x6, 0x0, - // 0x0, -0x5, -0x1, -0x8, 0x7, -0x6, -0x5, -0x2, -0x4, 0x1, 0x1, -0x8, 0x2, 0x6, -0x1, -0x3, - // -0x6, 0x5, -0x8, 0x3, 0x3, 0x1, -0x1, -0x3, -0x3, -0x6, 0x7, -0x6, -0x8, 0x1, -0x7, -0x8, - // }, .{ - // 0x1, 0x3, 0x1, 0x3, -0x6, 0x6, 0x2, -0x3, 0x1, -0x7, 0x7, -0x3, -0x1, -0x1, 0x7, 0x2, - // -0x8, 0x2, -0x3, -0x4, 0x4, -0x4, 0x7, 0x6, -0x5, -0x2, -0x1, 0x6, -0x7, 0x4, 0x7, -0x3, - // -0x5, -0x8, -0x5, -0x6, -0x6, 0x2, 0x1, -0x8, 0x4, 0x3, -0x5, 0x7, -0x8, 0x3, -0x1, 0x7, - // -0x3, 0x7, -0x3, -0x2, -0x6, 0x4, 0x2, -0x2, -0x2, -0x7, 0x5, -0x1, -0x6, 0x7, -0x5, 0x5, - // 0x4, 0x5, -0x8, -0x5, 0x6, 0x1, -0x5, 0x7, -0x6, -0x3, -0x4, 0x6, -0x8, 0x7, 0x7, -0x6, - // 0x6, -0x4, 0x2, -0x8, -0x8, -0x4, -0x8, -0x3, 0x6, 0x5, 0x7, -0x6, 0x1, 0x2, -0x7, -0x3, - // -0x3, 0x1, -0x3, 0x3, -0x1, 0x3, -0x7, -0x8, 0x1, -0x3, -0x3, -0x3, -0x4, 0x5, 0x7, -0x7, - // 0x3, 0x2, 0x6, -0x2, -0x4, -0x3, -0x1, 0x5, -0x6, 0x2, 0x3, -0x5, 0x5, -0x3, -0x2, -0x8, - // }); try testArgs(@Vector(1, i4), .{ - -0x1, + 0x2, }, .{ - -0x1, + 0x1, }); try testArgs(@Vector(2, i4), .{ - 0x7, 0x5, + -0x2, 0x5, }, .{ - 0x4, 0x1, + -0x1, 0x2, }); try testArgs(@Vector(4, i4), .{ - -0x2, -0x3, -0x6, 0x1, + -0x8, 0x5, 0x5, -0x2, }, .{ - 0x3, -0x5, -0x1, -0x3, + -0x3, -0x7, -0x4, -0x5, }); try testArgs(@Vector(8, i4), .{ - -0x5, -0x3, -0x2, 0x2, -0x4, -0x4, 0x0, 0x1, + 0x7, 0x3, 0x2, -0x1, -0x8, -0x2, 0x7, 0x1, }, .{ - -0x7, -0x2, -0x7, 0x1, 0x6, 0x2, -0x7, 0x7, + -0x2, 0x4, -0x8, 0x7, 0x1, -0x5, 0x6, -0x7, }); try testArgs(@Vector(16, i4), .{ - -0x1, -0x1, 0x6, 0x3, -0x1, 0x2, -0x6, 0x6, 0x1, 0x5, -0x1, 0x7, 0x7, -0x3, -0x1, 0x4, + 0x6, -0x3, 0x6, 0x6, -0x5, 0x6, 0x3, 0x7, -0x6, 0x7, -0x7, 0x6, -0x2, -0x2, -0x5, 0x0, }, .{ - 0x1, -0x3, 0x4, -0x1, 0x2, 0x5, -0x3, -0x5, -0x5, 0x5, -0x7, 0x7, 0x1, 0x5, -0x5, -0x6, + 0x2, -0x3, -0x4, -0x5, 0x3, 0x3, -0x5, 0x5, 0x4, -0x1, -0x6, 0x4, 0x7, -0x2, 0x3, 0x2, }); try testArgs(@Vector(32, i4), .{ - -0x7, 0x4, -0x5, -0x5, -0x5, 0x1, 0x7, 0x3, -0x2, 0x7, -0x3, -0x7, -0x3, -0x2, -0x5, -0x7, - 0x5, 0x4, 0x3, 0x0, -0x6, -0x2, -0x4, -0x1, 0x5, 0x4, -0x7, -0x7, -0x5, 0x5, -0x5, -0x1, + -0x1, -0x4, 0x6, 0x6, 0x5, 0x3, 0x4, 0x0, 0x3, 0x7, -0x6, 0x7, -0x2, -0x7, -0x4, 0x6, + 0x3, -0x7, -0x5, 0x1, -0x7, -0x6, 0x1, 0x3, 0x7, -0x8, -0x5, 0x6, -0x5, 0x0, 0x0, -0x8, }, .{ - 0x4, 0x4, 0x5, 0x2, 0x3, -0x4, 0x6, 0x2, -0x7, 0x3, 0x7, 0x2, 0x6, 0x2, 0x2, 0x3, - 0x7, -0x3, -0x7, -0x2, 0x3, -0x1, -0x4, 0x4, -0x8, 0x1, 0x6, -0x7, 0x5, 0x1, 0x7, -0x2, + -0x4, -0x4, -0x4, 0x4, -0x5, 0x3, -0x1, 0x6, 0x1, -0x3, -0x1, 0x6, 0x5, -0x8, 0x1, -0x4, + -0x1, -0x4, 0x1, -0x3, 0x4, 0x6, -0x3, -0x8, -0x7, -0x4, 0x2, -0x3, -0x1, -0x2, 0x6, -0x6, }); try testArgs(@Vector(64, i4), .{ - 0x0, 0x3, 0x7, -0x7, 0x1, -0x5, -0x4, 0x2, 0x2, 0x5, 0x4, 0x0, -0x3, -0x4, -0x4, -0x4, - -0x7, 0x6, 0x2, 0x1, 0x0, 0x3, -0x6, 0x4, -0x4, 0x2, 0x7, 0x3, -0x4, -0x3, -0x3, -0x3, - -0x4, 0x0, -0x3, -0x6, 0x0, 0x1, -0x5, -0x7, -0x2, -0x1, -0x1, -0x7, 0x3, -0x5, -0x4, -0x3, - 0x5, 0x1, -0x4, 0x7, 0x1, 0x7, -0x5, 0x4, 0x5, -0x4, 0x1, -0x4, 0x4, 0x5, 0x4, -0x2, + 0x0, -0x3, -0x3, 0x5, 0x2, -0x1, 0x4, 0x5, 0x6, -0x2, 0x1, 0x5, -0x3, -0x1, -0x2, -0x1, + -0x8, 0x2, -0x1, -0x2, 0x7, -0x3, -0x2, -0x3, 0x1, -0x5, 0x5, 0x2, -0x1, -0x6, -0x2, -0x1, + -0x2, -0x5, 0x0, 0x6, 0x3, -0x4, -0x5, -0x5, -0x4, -0x7, -0x4, 0x1, 0x0, -0x6, -0x7, -0x6, + 0x1, -0x6, 0x4, -0x4, -0x2, 0x6, -0x7, 0x4, 0x4, 0x5, 0x3, -0x6, -0x8, -0x5, 0x5, -0x7, }, .{ - 0x2, -0x4, -0x1, 0x4, 0x4, -0x1, -0x3, 0x6, 0x4, 0x2, 0x4, 0x3, -0x6, -0x7, -0x4, 0x6, - 0x6, 0x4, 0x6, -0x7, 0x2, 0x4, -0x8, -0x1, -0x8, 0x3, -0x2, -0x7, 0x1, 0x5, -0x3, -0x6, - -0x8, 0x2, -0x5, 0x7, 0x4, 0x7, -0x4, 0x3, 0x6, -0x7, -0x1, 0x1, -0x8, -0x2, -0x3, 0x3, - 0x3, -0x4, 0x4, -0x7, 0x5, -0x4, -0x1, 0x2, 0x6, -0x2, -0x5, 0x2, 0x7, 0x2, -0x8, -0x3, + -0x1, -0x5, 0x5, -0x2, 0x6, -0x6, -0x4, -0x5, -0x4, 0x7, -0x6, 0x7, 0x4, -0x5, 0x5, 0x7, + -0x6, 0x3, -0x4, 0x2, -0x8, 0x4, -0x2, 0x5, -0x5, -0x5, -0x8, 0x3, -0x1, -0x4, -0x8, -0x2, + -0x2, 0x5, -0x7, -0x3, 0x2, -0x5, -0x6, -0x7, -0x8, -0x2, 0x5, -0x3, 0x2, -0x1, -0x7, -0x4, + -0x3, -0x3, 0x6, -0x8, 0x3, -0x4, 0x7, 0x3, -0x2, 0x7, -0x1, 0x1, 0x1, 0x6, -0x2, -0x2, }); try testArgs(@Vector(128, i4), .{ - 0x3, 0x3, -0x6, 0x3, 0x2, 0x1, 0x5, -0x2, 0x0, -0x7, 0x4, 0x3, 0x0, -0x3, -0x7, -0x5, - 0x4, 0x0, 0x1, 0x6, 0x3, 0x3, -0x4, 0x7, -0x6, -0x6, 0x6, 0x1, 0x6, -0x5, -0x6, -0x6, - 0x4, -0x2, 0x3, -0x1, -0x4, -0x6, -0x1, 0x2, 0x4, 0x3, -0x2, 0x2, 0x3, 0x5, 0x0, -0x2, - 0x5, 0x6, -0x1, -0x5, 0x6, 0x7, 0x7, -0x6, -0x6, 0x0, 0x0, -0x6, -0x2, -0x7, -0x6, 0x3, - -0x6, -0x6, 0x4, -0x4, 0x4, -0x5, 0x0, 0x6, 0x6, 0x7, 0x4, -0x5, 0x5, -0x7, -0x7, 0x6, - -0x4, 0x4, -0x7, 0x4, 0x3, 0x2, -0x4, -0x1, -0x6, -0x2, 0x5, -0x2, 0x4, -0x7, -0x3, -0x3, - 0x4, 0x1, -0x1, 0x2, -0x1, 0x4, -0x5, -0x3, -0x1, -0x3, 0x3, 0x7, 0x5, -0x1, -0x1, -0x4, - 0x2, 0x1, -0x3, 0x7, -0x6, -0x7, -0x6, -0x4, -0x5, -0x2, 0x5, 0x0, -0x5, 0x7, -0x7, 0x5, + -0x1, -0x3, -0x3, -0x4, 0x3, -0x4, 0x0, -0x4, 0x7, 0x3, 0x5, -0x4, -0x5, -0x4, -0x2, -0x7, + 0x2, 0x0, -0x4, 0x7, 0x3, -0x5, 0x4, 0x5, -0x2, -0x3, -0x4, 0x6, -0x7, -0x1, 0x1, -0x6, + 0x1, 0x5, 0x2, 0x5, 0x2, 0x2, -0x4, -0x4, 0x5, 0x2, -0x2, -0x8, -0x1, -0x2, 0x5, 0x3, + 0x0, -0x5, 0x5, 0x7, 0x6, -0x3, -0x2, 0x0, -0x7, -0x7, -0x4, 0x2, -0x4, 0x7, 0x1, -0x5, + -0x4, -0x8, 0x2, -0x7, 0x3, -0x4, 0x7, 0x6, -0x7, -0x3, -0x7, 0x2, 0x4, 0x2, -0x5, -0x6, + 0x3, 0x5, 0x1, 0x6, 0x5, 0x7, 0x7, -0x4, -0x7, -0x1, 0x0, -0x7, 0x6, 0x0, 0x6, 0x0, + 0x0, -0x5, -0x1, -0x8, 0x7, -0x6, -0x5, -0x2, -0x4, 0x1, 0x1, -0x8, 0x2, 0x6, -0x1, -0x3, + -0x6, 0x5, -0x8, 0x3, 0x3, 0x1, -0x1, -0x3, -0x3, -0x6, 0x7, -0x6, -0x8, 0x1, -0x7, -0x8, }, .{ - -0x6, -0x5, -0x1, 0x4, 0x6, 0x4, -0x1, -0x7, -0x3, 0x4, -0x6, -0x2, -0x3, 0x1, 0x6, 0x2, - -0x1, -0x3, -0x4, 0x2, 0x3, 0x6, -0x7, 0x3, 0x7, -0x6, 0x1, -0x7, -0x5, 0x6, 0x7, -0x4, - 0x7, -0x4, 0x2, -0x5, 0x4, 0x5, 0x5, -0x3, -0x1, 0x6, -0x6, -0x2, -0x4, 0x3, -0x4, -0x4, - -0x5, 0x6, -0x6, 0x3, -0x6, -0x3, 0x6, 0x5, 0x6, -0x6, -0x3, 0x1, -0x4, -0x5, -0x8, -0x3, - -0x4, 0x7, -0x2, -0x1, 0x4, 0x2, -0x3, 0x6, 0x4, 0x6, -0x3, 0x6, 0x5, -0x2, -0x1, 0x5, - 0x6, -0x6, -0x8, -0x2, -0x3, 0x6, -0x6, 0x5, -0x2, -0x6, 0x5, -0x6, 0x2, 0x1, 0x3, -0x3, - 0x7, 0x7, 0x3, -0x1, 0x5, -0x2, -0x3, 0x4, 0x7, -0x7, 0x7, 0x6, -0x2, -0x5, 0x4, -0x5, - -0x1, -0x2, 0x1, 0x4, -0x2, 0x1, -0x3, 0x1, -0x4, 0x3, -0x2, -0x6, -0x4, -0x2, -0x8, 0x2, + 0x1, 0x3, 0x1, 0x3, -0x6, 0x6, 0x2, -0x3, 0x1, -0x7, 0x7, -0x3, -0x1, -0x1, 0x7, 0x2, + -0x8, 0x2, -0x3, -0x4, 0x4, -0x4, 0x7, 0x6, -0x5, -0x2, -0x1, 0x6, -0x7, 0x4, 0x7, -0x3, + -0x5, -0x8, -0x5, -0x6, -0x6, 0x2, 0x1, -0x8, 0x4, 0x3, -0x5, 0x7, -0x8, 0x3, -0x1, 0x7, + -0x3, 0x7, -0x3, -0x2, -0x6, 0x4, 0x2, -0x2, -0x2, -0x7, 0x5, -0x1, -0x6, 0x7, -0x5, 0x5, + 0x4, 0x5, -0x8, -0x5, 0x6, 0x1, -0x5, 0x7, -0x6, -0x3, -0x4, 0x6, -0x8, 0x7, 0x7, -0x6, + 0x6, -0x4, 0x2, -0x8, -0x8, -0x4, -0x8, -0x3, 0x6, 0x5, 0x7, -0x6, 0x1, 0x2, -0x7, -0x3, + -0x3, 0x1, -0x3, 0x3, -0x1, 0x3, -0x7, -0x8, 0x1, -0x3, -0x3, -0x3, -0x4, 0x5, 0x7, -0x7, + 0x3, 0x2, 0x6, -0x2, -0x4, -0x3, -0x1, 0x5, -0x6, 0x2, 0x3, -0x5, 0x5, -0x3, -0x2, -0x8, }); try testArgs(@Vector(1, u4), .{ @@ -2509,130 +2382,67 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela 0x9, 0x6, 0x4, 0x5, 0xf, 0xe, 0x8, 0x5, 0x2, 0x5, 0xf, 0xb, 0xf, 0x4, 0x6, 0x4, }); - // workaround https://github.com/ziglang/zig/issues/22914 - // TODO: try testArgs(@Vector(1, i5), .{ - // 0x03, - // }, .{ - // 0x0a, - // }); - // try testArgs(@Vector(2, i5), .{ - // 0x0c, -0x0e, - // }, .{ - // -0x0f, -0x0e, - // }); - // try testArgs(@Vector(4, i5), .{ - // -0x0a, 0x06, -0x05, 0x09, - // }, .{ - // -0x0f, 0x05, 0x05, 0x09, - // }); - // try testArgs(@Vector(8, i5), .{ - // -0x04, -0x04, 0x05, -0x05, 0x0f, -0x0e, 0x0f, -0x0e, - // }, .{ - // -0x09, -0x0d, 0x02, 0x01, 0x08, -0x05, -0x09, -0x03, - // }); - // try testArgs(@Vector(16, i5), .{ - // -0x0e, -0x08, -0x10, -0x0b, -0x10, -0x09, -0x0f, -0x05, -0x10, 0x06, 0x0d, -0x04, 0x09, -0x0e, -0x10, -0x10, - // }, .{ - // 0x03, 0x0b, 0x0c, 0x06, -0x0d, 0x0e, -0x09, -0x04, 0x0a, -0x0e, -0x0d, 0x0f, -0x09, -0x0e, -0x0b, 0x03, - // }); - // try testArgs(@Vector(32, i5), .{ - // -0x08, -0x05, 0x09, -0x08, 0x01, 0x0e, -0x0c, 0x0b, -0x0e, 0x0f, -0x0b, 0x01, -0x03, 0x03, 0x08, 0x04, - // 0x02, 0x0f, -0x0b, -0x0b, 0x0d, 0x00, 0x09, 0x00, -0x06, -0x08, -0x01, 0x0b, 0x05, 0x03, -0x05, -0x07, - // }, .{ - // -0x0c, 0x07, 0x0d, -0x09, 0x0a, 0x06, -0x0b, -0x07, -0x0a, 0x08, 0x07, -0x0d, 0x08, 0x07, 0x09, -0x07, - // 0x0b, -0x02, -0x02, -0x02, -0x06, -0x08, 0x0a, -0x0a, 0x02, -0x07, -0x0a, 0x0d, -0x07, -0x05, -0x0e, 0x05, - // }); - // try testArgs(@Vector(64, i5), .{ - // 0x04, -0x0d, 0x0d, -0x01, 0x07, 0x0c, 0x00, 0x01, -0x07, 0x0a, -0x01, -0x01, 0x08, -0x0b, -0x03, -0x06, - // -0x03, -0x03, -0x0c, 0x0e, -0x0c, -0x02, 0x07, -0x03, 0x0e, -0x0a, -0x0e, -0x06, -0x08, 0x0a, -0x0c, -0x0c, - // 0x06, -0x04, 0x04, 0x00, 0x05, 0x07, 0x04, 0x06, -0x01, 0x0a, 0x07, -0x08, 0x00, 0x0f, 0x0f, 0x0d, - // -0x07, 0x0f, 0x05, -0x0b, -0x08, -0x0c, 0x0d, -0x05, -0x05, 0x0e, 0x02, 0x06, 0x0d, 0x06, 0x00, 0x0a, - // }, .{ - // 0x02, -0x09, -0x01, -0x10, -0x0c, -0x0f, -0x10, -0x0d, 0x02, 0x0e, 0x07, -0x01, -0x0a, -0x0b, 0x05, -0x0e, - // -0x09, 0x03, 0x08, -0x0d, 0x0d, 0x03, -0x02, 0x0e, 0x0c, 0x03, 0x0b, -0x0d, -0x04, -0x10, 0x0e, 0x0d, - // 0x09, -0x03, -0x0e, -0x03, -0x05, -0x0c, -0x07, 0x08, -0x06, 0x08, -0x0e, 0x02, -0x10, 0x01, 0x01, -0x0a, - // 0x01, -0x09, 0x03, -0x01, 0x05, 0x09, 0x06, -0x03, -0x0a, 0x08, -0x0e, 0x0e, 0x07, -0x05, -0x0c, -0x10, - // }); - // try testArgs(@Vector(128, i5), .{ - // 0x01, 0x0b, -0x01, -0x10, -0x05, 0x05, -0x09, 0x0e, -0x0e, 0x04, 0x0f, -0x06, 0x0f, 0x04, -0x02, 0x0a, - // -0x08, -0x06, 0x08, -0x07, -0x08, 0x0e, 0x06, 0x0d, -0x07, -0x04, 0x04, -0x0b, 0x02, -0x06, 0x07, -0x10, - // 0x0d, 0x09, 0x0b, -0x04, 0x0e, -0x06, -0x0a, 0x01, 0x06, 0x08, 0x01, -0x0b, -0x09, -0x08, -0x0c, -0x0b, - // 0x07, 0x06, 0x0d, 0x0c, -0x0b, -0x03, -0x06, -0x0c, -0x0e, 0x05, 0x0b, 0x08, -0x01, 0x00, 0x01, 0x0a, - // 0x00, 0x0a, 0x06, 0x06, -0x10, -0x05, -0x05, -0x0f, 0x02, -0x06, -0x08, -0x08, 0x0f, 0x09, -0x07, -0x05, - // 0x07, 0x06, 0x03, 0x05, 0x02, 0x0f, 0x0d, -0x0e, -0x03, -0x01, -0x06, -0x02, -0x01, -0x07, 0x09, 0x05, - // -0x07, -0x07, -0x08, 0x0c, -0x0e, 0x09, -0x0c, -0x0d, 0x07, 0x04, 0x07, -0x03, 0x09, 0x0e, 0x04, 0x02, - // 0x0f, -0x02, -0x10, -0x03, -0x0d, -0x04, 0x0c, -0x06, -0x01, -0x0e, -0x0e, -0x0a, 0x0d, -0x0e, 0x04, 0x03, - // }, .{ - // -0x08, -0x09, -0x04, 0x0f, -0x0f, -0x08, -0x04, 0x0b, 0x09, -0x0b, -0x02, 0x0f, 0x01, -0x01, -0x0a, -0x0a, - // 0x08, 0x09, 0x0d, -0x06, 0x0f, -0x02, 0x0c, 0x01, 0x0c, 0x02, -0x04, 0x0b, 0x05, 0x02, -0x08, -0x09, - // 0x01, 0x0f, -0x0b, 0x02, -0x06, 0x08, -0x0e, -0x02, -0x0b, -0x03, -0x01, 0x0c, 0x09, -0x04, 0x08, -0x0a, - // 0x09, -0x05, 0x08, 0x0e, 0x05, 0x03, -0x0a, 0x0d, -0x03, 0x06, 0x0f, -0x09, 0x0a, 0x03, 0x02, 0x0c, - // 0x08, -0x0a, 0x06, 0x0e, 0x08, 0x02, 0x08, -0x04, -0x0d, -0x02, -0x08, -0x0a, 0x0a, 0x0c, -0x03, 0x04, - // 0x0b, -0x0c, -0x0e, 0x01, 0x07, -0x01, 0x09, 0x0f, -0x06, -0x05, -0x0e, -0x01, -0x04, 0x0a, -0x0a, -0x0d, - // -0x10, -0x10, -0x03, -0x0f, -0x0c, -0x0a, -0x0b, -0x06, -0x04, -0x0f, -0x0b, -0x08, 0x0e, 0x04, -0x01, -0x0b, - // -0x06, 0x0a, 0x0a, -0x0c, -0x0c, 0x0b, -0x02, 0x0c, -0x04, -0x06, -0x0c, -0x09, -0x09, -0x0b, -0x0c, -0x0b, - // }); try testArgs(@Vector(1, i5), .{ - -0x0f, + 0x03, }, .{ - -0x03, + 0x0a, }); try testArgs(@Vector(2, i5), .{ - 0x0b, -0x04, + 0x0c, -0x0e, }, .{ - -0x05, -0x08, + -0x0f, -0x0e, }); try testArgs(@Vector(4, i5), .{ - 0x08, 0x0f, -0x06, -0x0d, + -0x0a, 0x06, -0x05, 0x09, }, .{ - -0x03, -0x0a, -0x05, -0x03, + -0x0f, 0x05, 0x05, 0x09, }); try testArgs(@Vector(8, i5), .{ - 0x08, 0x0c, 0x07, 0x00, -0x06, 0x08, 0x08, 0x0d, + -0x04, -0x04, 0x05, -0x05, 0x0f, -0x0e, 0x0f, -0x0e, }, .{ - 0x07, 0x09, 0x05, -0x08, 0x08, -0x0e, -0x0e, -0x0e, + -0x09, -0x0d, 0x02, 0x01, 0x08, -0x05, -0x09, -0x03, }); try testArgs(@Vector(16, i5), .{ - 0x06, 0x0b, 0x07, 0x0e, 0x0e, 0x02, -0x08, -0x0b, -0x03, 0x09, -0x08, 0x0e, -0x03, -0x0a, 0x01, 0x0b, + -0x0e, -0x08, -0x10, -0x0b, -0x10, -0x09, -0x0f, -0x05, -0x10, 0x06, 0x0d, -0x04, 0x09, -0x0e, -0x10, -0x10, }, .{ - -0x05, 0x0f, -0x08, -0x10, -0x07, 0x06, 0x08, 0x01, 0x0a, 0x06, 0x05, -0x0f, 0x03, 0x05, 0x0b, -0x06, + 0x03, 0x0b, 0x0c, 0x06, -0x0d, 0x0e, -0x09, -0x04, 0x0a, -0x0e, -0x0d, 0x0f, -0x09, -0x0e, -0x0b, 0x03, }); try testArgs(@Vector(32, i5), .{ - 0x0e, 0x07, -0x08, 0x0b, 0x04, -0x05, 0x0f, 0x02, 0x04, -0x0c, 0x0d, 0x09, 0x0e, -0x02, -0x0f, 0x04, - -0x03, -0x02, 0x09, -0x0d, 0x01, 0x00, -0x0e, -0x0a, 0x02, -0x06, 0x0c, 0x03, 0x06, 0x0e, 0x06, -0x07, + -0x08, -0x05, 0x09, -0x08, 0x01, 0x0e, -0x0c, 0x0b, -0x0e, 0x0f, -0x0b, 0x01, -0x03, 0x03, 0x08, 0x04, + 0x02, 0x0f, -0x0b, -0x0b, 0x0d, 0x00, 0x09, 0x00, -0x06, -0x08, -0x01, 0x0b, 0x05, 0x03, -0x05, -0x07, }, .{ - -0x0a, 0x01, 0x0a, -0x10, 0x06, 0x09, 0x0e, 0x03, 0x0e, -0x09, 0x08, -0x08, 0x06, 0x0c, -0x0a, -0x07, - 0x04, -0x02, -0x09, 0x0b, 0x0e, -0x03, -0x01, -0x0d, 0x0e, -0x0a, -0x02, 0x08, 0x0e, 0x02, -0x04, -0x05, + -0x0c, 0x07, 0x0d, -0x09, 0x0a, 0x06, -0x0b, -0x07, -0x0a, 0x08, 0x07, -0x0d, 0x08, 0x07, 0x09, -0x07, + 0x0b, -0x02, -0x02, -0x02, -0x06, -0x08, 0x0a, -0x0a, 0x02, -0x07, -0x0a, 0x0d, -0x07, -0x05, -0x0e, 0x05, }); try testArgs(@Vector(64, i5), .{ - 0x04, 0x02, -0x04, -0x0a, -0x0b, -0x0b, -0x0c, -0x08, -0x0b, -0x05, 0x0c, 0x0b, 0x05, 0x02, -0x01, -0x06, - -0x09, -0x06, 0x0a, 0x0f, -0x06, -0x0d, 0x0c, 0x05, 0x0b, -0x06, -0x02, 0x09, 0x0e, -0x09, 0x05, 0x0a, - -0x0c, 0x0b, -0x01, -0x04, 0x01, 0x0c, 0x0f, -0x0f, -0x07, 0x0a, 0x04, 0x02, 0x08, -0x01, -0x03, 0x0a, - -0x0e, -0x04, -0x03, -0x0b, -0x01, 0x02, -0x05, 0x08, -0x03, 0x02, -0x01, -0x05, 0x07, -0x09, 0x0f, 0x00, + 0x04, -0x0d, 0x0d, -0x01, 0x07, 0x0c, 0x00, 0x01, -0x07, 0x0a, -0x01, -0x01, 0x08, -0x0b, -0x03, -0x06, + -0x03, -0x03, -0x0c, 0x0e, -0x0c, -0x02, 0x07, -0x03, 0x0e, -0x0a, -0x0e, -0x06, -0x08, 0x0a, -0x0c, -0x0c, + 0x06, -0x04, 0x04, 0x00, 0x05, 0x07, 0x04, 0x06, -0x01, 0x0a, 0x07, -0x08, 0x00, 0x0f, 0x0f, 0x0d, + -0x07, 0x0f, 0x05, -0x0b, -0x08, -0x0c, 0x0d, -0x05, -0x05, 0x0e, 0x02, 0x06, 0x0d, 0x06, 0x00, 0x0a, }, .{ - -0x09, -0x02, -0x0a, -0x05, -0x05, -0x0d, 0x04, -0x05, 0x0e, -0x01, -0x07, 0x04, 0x0d, -0x0f, -0x09, -0x04, - -0x0b, -0x0b, 0x0e, 0x01, 0x06, -0x0f, -0x0b, 0x03, -0x04, 0x05, -0x03, -0x09, 0x0a, 0x04, 0x04, -0x06, - -0x02, 0x01, 0x0e, 0x0c, -0x10, 0x0f, -0x09, -0x08, -0x10, -0x02, -0x07, -0x0d, 0x08, 0x07, -0x03, 0x01, - -0x0d, -0x10, -0x07, 0x08, 0x0d, 0x07, 0x09, 0x0f, 0x04, 0x06, -0x05, -0x09, 0x04, -0x04, -0x04, 0x0d, + 0x02, -0x09, -0x01, -0x10, -0x0c, -0x0f, -0x10, -0x0d, 0x02, 0x0e, 0x07, -0x01, -0x0a, -0x0b, 0x05, -0x0e, + -0x09, 0x03, 0x08, -0x0d, 0x0d, 0x03, -0x02, 0x0e, 0x0c, 0x03, 0x0b, -0x0d, -0x04, -0x10, 0x0e, 0x0d, + 0x09, -0x03, -0x0e, -0x03, -0x05, -0x0c, -0x07, 0x08, -0x06, 0x08, -0x0e, 0x02, -0x10, 0x01, 0x01, -0x0a, + 0x01, -0x09, 0x03, -0x01, 0x05, 0x09, 0x06, -0x03, -0x0a, 0x08, -0x0e, 0x0e, 0x07, -0x05, -0x0c, -0x10, }); try testArgs(@Vector(128, i5), .{ - -0x02, -0x07, -0x03, 0x08, -0x0b, -0x09, -0x0c, 0x0d, -0x0e, 0x08, -0x03, -0x09, 0x0a, 0x02, -0x0d, 0x05, - -0x04, -0x0c, -0x07, 0x08, -0x0a, 0x04, 0x08, -0x07, 0x0c, 0x03, 0x0e, 0x0f, 0x08, -0x08, -0x02, -0x0a, - -0x08, 0x04, -0x0c, -0x09, 0x0a, -0x0e, -0x04, -0x05, 0x02, 0x0d, -0x04, -0x0f, -0x0d, -0x02, 0x05, -0x07, - 0x06, 0x0b, -0x0b, -0x04, -0x04, -0x0e, -0x0c, 0x09, 0x02, -0x0c, 0x0e, 0x09, 0x02, -0x04, 0x05, 0x04, - -0x0e, -0x02, -0x08, 0x05, 0x00, 0x0f, -0x0a, 0x0a, 0x0b, 0x0b, 0x02, -0x02, -0x0d, -0x08, -0x0d, 0x03, - 0x0b, -0x0b, 0x02, 0x05, -0x06, -0x07, -0x08, -0x0a, -0x09, -0x03, -0x0e, -0x0f, -0x0b, 0x03, 0x00, 0x09, - 0x07, 0x0a, -0x0b, 0x06, 0x01, -0x03, -0x0a, -0x09, -0x07, -0x0d, 0x0a, -0x0c, 0x01, -0x09, -0x01, -0x01, - -0x09, 0x00, 0x0f, 0x05, -0x0b, 0x0c, 0x04, 0x0c, 0x0b, -0x08, 0x01, -0x05, -0x04, 0x02, 0x0c, 0x04, + 0x01, 0x0b, -0x01, -0x10, -0x05, 0x05, -0x09, 0x0e, -0x0e, 0x04, 0x0f, -0x06, 0x0f, 0x04, -0x02, 0x0a, + -0x08, -0x06, 0x08, -0x07, -0x08, 0x0e, 0x06, 0x0d, -0x07, -0x04, 0x04, -0x0b, 0x02, -0x06, 0x07, -0x10, + 0x0d, 0x09, 0x0b, -0x04, 0x0e, -0x06, -0x0a, 0x01, 0x06, 0x08, 0x01, -0x0b, -0x09, -0x08, -0x0c, -0x0b, + 0x07, 0x06, 0x0d, 0x0c, -0x0b, -0x03, -0x06, -0x0c, -0x0e, 0x05, 0x0b, 0x08, -0x01, 0x00, 0x01, 0x0a, + 0x00, 0x0a, 0x06, 0x06, -0x10, -0x05, -0x05, -0x0f, 0x02, -0x06, -0x08, -0x08, 0x0f, 0x09, -0x07, -0x05, + 0x07, 0x06, 0x03, 0x05, 0x02, 0x0f, 0x0d, -0x0e, -0x03, -0x01, -0x06, -0x02, -0x01, -0x07, 0x09, 0x05, + -0x07, -0x07, -0x08, 0x0c, -0x0e, 0x09, -0x0c, -0x0d, 0x07, 0x04, 0x07, -0x03, 0x09, 0x0e, 0x04, 0x02, + 0x0f, -0x02, -0x10, -0x03, -0x0d, -0x04, 0x0c, -0x06, -0x01, -0x0e, -0x0e, -0x0a, 0x0d, -0x0e, 0x04, 0x03, }, .{ - -0x08, -0x05, -0x0a, 0x06, -0x06, -0x04, 0x01, 0x07, 0x0d, -0x0a, -0x02, 0x0b, -0x01, -0x0c, -0x04, 0x0c, - -0x06, 0x0d, 0x04, 0x0b, 0x07, 0x0c, 0x02, 0x02, -0x02, 0x09, 0x0d, -0x07, -0x08, 0x07, -0x04, 0x06, - -0x0a, 0x07, 0x01, 0x07, -0x0d, 0x02, 0x09, -0x02, 0x0e, -0x08, -0x03, -0x07, 0x07, 0x0a, -0x0e, -0x06, - 0x0b, -0x0d, 0x0c, -0x06, -0x07, 0x0a, 0x0b, -0x0a, 0x05, 0x01, -0x0d, -0x08, -0x0e, -0x08, -0x07, -0x01, - -0x10, 0x07, 0x03, 0x06, 0x03, 0x0a, 0x08, -0x0a, 0x04, -0x09, 0x0c, 0x01, -0x10, 0x02, 0x09, 0x0d, - 0x0f, -0x01, -0x06, -0x0a, 0x04, 0x01, 0x07, 0x07, 0x0e, 0x0e, -0x04, -0x0a, -0x03, 0x07, 0x07, -0x10, - -0x04, 0x0e, -0x09, -0x0f, -0x0b, -0x0e, 0x0c, -0x0d, 0x0b, -0x06, 0x0f, -0x0d, 0x0b, 0x04, -0x10, -0x10, - -0x0e, 0x09, 0x0d, -0x02, -0x0e, -0x06, -0x0b, -0x0f, -0x08, -0x0f, -0x0d, -0x0a, -0x02, 0x03, 0x0b, -0x0a, + -0x08, -0x09, -0x04, 0x0f, -0x0f, -0x08, -0x04, 0x0b, 0x09, -0x0b, -0x02, 0x0f, 0x01, -0x01, -0x0a, -0x0a, + 0x08, 0x09, 0x0d, -0x06, 0x0f, -0x02, 0x0c, 0x01, 0x0c, 0x02, -0x04, 0x0b, 0x05, 0x02, -0x08, -0x09, + 0x01, 0x0f, -0x0b, 0x02, -0x06, 0x08, -0x0e, -0x02, -0x0b, -0x03, -0x01, 0x0c, 0x09, -0x04, 0x08, -0x0a, + 0x09, -0x05, 0x08, 0x0e, 0x05, 0x03, -0x0a, 0x0d, -0x03, 0x06, 0x0f, -0x09, 0x0a, 0x03, 0x02, 0x0c, + 0x08, -0x0a, 0x06, 0x0e, 0x08, 0x02, 0x08, -0x04, -0x0d, -0x02, -0x08, -0x0a, 0x0a, 0x0c, -0x03, 0x04, + 0x0b, -0x0c, -0x0e, 0x01, 0x07, -0x01, 0x09, 0x0f, -0x06, -0x05, -0x0e, -0x01, -0x04, 0x0a, -0x0a, -0x0d, + -0x10, -0x10, -0x03, -0x0f, -0x0c, -0x0a, -0x0b, -0x06, -0x04, -0x0f, -0x0b, -0x08, 0x0e, 0x04, -0x01, -0x0b, + -0x06, 0x0a, 0x0a, -0x0c, -0x0c, 0x0b, -0x02, 0x0c, -0x04, -0x06, -0x0c, -0x09, -0x09, -0x0b, -0x0c, -0x0b, }); try testArgs(@Vector(1, u5), .{ @@ -5452,6 +5262,17 @@ test addUnsafe { try test_add_unsafe.testFloatVectors(); } +inline fn addSafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) { + @setRuntimeSafety(true); + return @as(AddOneBit(Type), lhs) + rhs; +} +test addSafe { + const test_add_safe = binary(addSafe, .{}); + try test_add_safe.testInts(); + try test_add_safe.testFloats(); + try test_add_safe.testFloatVectors(); +} + inline fn addWrap(comptime Type: type, lhs: Type, rhs: Type) Type { return lhs +% rhs; } @@ -5463,15 +5284,14 @@ test addWrap { inline fn subUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) { @setRuntimeSafety(false); - switch (@typeInfo(Scalar(Type))) { + return switch (@typeInfo(Scalar(Type))) { else => @compileError(@typeName(Type)), .int => |int| switch (int.signedness) { - .signed => {}, - .unsigned => return @as(AddOneBit(Type), @max(lhs, rhs)) - @min(lhs, rhs), + .signed => @as(AddOneBit(Type), lhs) - rhs, + .unsigned => @as(AddOneBit(Type), @max(lhs, rhs)) - @min(lhs, rhs), }, - .float => {}, - } - return @as(AddOneBit(Type), lhs) - rhs; + .float => lhs - rhs, + }; } test subUnsafe { const test_sub_unsafe = binary(subUnsafe, .{}); @@ -5481,6 +5301,24 @@ test subUnsafe { try test_sub_unsafe.testFloatVectors(); } +inline fn subSafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) { + @setRuntimeSafety(true); + return switch (@typeInfo(Scalar(Type))) { + else => @compileError(@typeName(Type)), + .int => |int| switch (int.signedness) { + .signed => @as(AddOneBit(Type), lhs) - rhs, + .unsigned => @as(AddOneBit(Type), @max(lhs, rhs)) - @min(lhs, rhs), + }, + .float => lhs - rhs, + }; +} +test subSafe { + const test_sub_safe = binary(subSafe, .{}); + try test_sub_safe.testInts(); + try test_sub_safe.testFloats(); + try test_sub_safe.testFloatVectors(); +} + inline fn subWrap(comptime Type: type, lhs: Type, rhs: Type) Type { return lhs -% rhs; } @@ -5500,6 +5338,15 @@ test mulUnsafe { try test_mul_unsafe.testIntVectors(); } +inline fn mulSafe(comptime Type: type, lhs: Type, rhs: Type) DoubleBits(Type) { + @setRuntimeSafety(true); + return @as(DoubleBits(Type), lhs) * rhs; +} +test mulSafe { + const test_mul_safe = binary(mulSafe, .{}); + try test_mul_safe.testInts(); +} + inline fn mulWrap(comptime Type: type, lhs: Type, rhs: Type) Type { return lhs *% rhs; } @@ -5606,6 +5453,30 @@ test min { try test_min.testFloatVectors(); } +inline fn addWithOverflow(comptime Type: type, lhs: Type, rhs: Type) struct { Type, u1 } { + return @addWithOverflow(lhs, rhs); +} +test addWithOverflow { + const test_add_with_overflow = binary(addWithOverflow, .{}); + try test_add_with_overflow.testInts(); +} + +inline fn subWithOverflow(comptime Type: type, lhs: Type, rhs: Type) struct { Type, u1 } { + return @subWithOverflow(lhs, rhs); +} +test subWithOverflow { + const test_sub_with_overflow = binary(subWithOverflow, .{}); + try test_sub_with_overflow.testInts(); +} + +inline fn mulWithOverflow(comptime Type: type, lhs: Type, rhs: Type) struct { Type, u1 } { + return @mulWithOverflow(lhs, rhs); +} +test mulWithOverflow { + const test_mul_with_overflow = binary(mulWithOverflow, .{}); + try test_mul_with_overflow.testInts(); +} + inline fn equal(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs == rhs) { return lhs == rhs; } @@ -5709,15 +5580,16 @@ test shl { try test_shl.testInts(); } -inline fn shlExact(comptime Type: type, lhs: Type, rhs: Type) Type { +inline fn shlExactUnsafe(comptime Type: type, lhs: Type, rhs: Type) Type { + @setRuntimeSafety(false); const bit_cast_rhs: @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(Type) } }) = @bitCast(rhs); const truncate_rhs: Log2Int(Type) = @truncate(bit_cast_rhs); const final_rhs = if (comptime cast(Log2Int(Type), @bitSizeOf(Type))) |bits| truncate_rhs % bits else truncate_rhs; return @shlExact(lhs << final_rhs >> final_rhs, final_rhs); } -test shlExact { - const test_shl_exact = binary(shlExact, .{}); - try test_shl_exact.testInts(); +test shlExactUnsafe { + const test_shl_exact_unsafe = binary(shlExactUnsafe, .{}); + try test_shl_exact_unsafe.testInts(); } inline fn bitXor(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs ^ rhs) { diff --git a/test/behavior/x86_64/math.zig b/test/behavior/x86_64/math.zig index f168737830..5b31876edc 100644 --- a/test/behavior/x86_64/math.zig +++ b/test/behavior/x86_64/math.zig @@ -153,6 +153,9 @@ pub noinline fn checkExpected(expected: anytype, actual: @TypeOf(expected), comp ); }, }, + .@"struct" => |@"struct"| inline for (@"struct".fields) |field| { + try checkExpected(@field(expected, field.name), @field(actual, field.name), compare); + } else return, }; if (switch (@typeInfo(Expected)) { else => unexpected,