Commit 3529889cf3
Changed files (3)
src
arch
x86_64
test
behavior
src/arch/x86_64/CodeGen.zig
@@ -2408,7 +2408,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
}
fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
- @setEvalBranchQuota(16_900);
+ @setEvalBranchQuota(17_100);
const pt = cg.pt;
const zcu = pt.zcu;
const ip = &zcu.intern_pool;
@@ -2444,7 +2444,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);
switch (air_tags[@intFromEnum(inst)]) {
// zig fmt: off
- .sub_sat => try cg.airSubSat(inst),
.mul_sat => try cg.airMulSat(inst),
.shl_sat => try cg.airShlSat(inst),
@@ -14815,6 +14814,1720 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
},
.sub_safe => unreachable,
+ .sub_sat => |air_tag| if (use_old) try cg.airSubSat(inst) else fallback: {
+ const bin_op = air_datas[@intFromEnum(inst)].bin_op;
+ if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airSubSat(inst);
+ var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
+ var res: [1]Temp = undefined;
+ cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
+ .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .{ .imm = 0 }, .none } },
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .each = .{ .once = &.{} },
+ }, .{
+ .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .any, .imm8, .none } },
+ },
+ .dst_temps = .{ .{ .imm = 0 }, .unused },
+ .each = .{ .once = &.{} },
+ }, .{
+ .required_features = .{ .bmi, null, null, null },
+ .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_gpr, .to_gpr, .none } },
+ },
+ .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .andn, .dst0d, .src1d, .src0d, ._ },
+ } },
+ }, .{
+ .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .mem, .to_mut_gpr, .none } },
+ .{ .src = .{ .to_gpr, .to_mut_gpr, .none } },
+ },
+ .dst_temps = .{ .{ .ref = .src1 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .not, .src1b, ._, ._, ._ },
+ .{ ._, ._, .@"and", .dst0b, .src0b, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .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 } },
+ },
+ .extra_temps = .{
+ .{ .type = .i8, .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, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
+ .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .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 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
+ .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smin), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .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 = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
+ .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
+ .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .@"test", .dst0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
+ .{ ._, ._po, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .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 } },
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
+ .{ ._, ._, .@"test", .dst0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
+ .{ ._, ._pe, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
+ .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .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, .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 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
+ .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .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, .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 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
+ .{ ._, ._, .cmc, ._, ._, ._, ._ },
+ .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .@"and", .dst0b, .tmp0b, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, .fast_imm16, null, null },
+ .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 } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .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, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .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 } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .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, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .fast_imm16, null, null, null },
+ .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 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smin), ._, ._ },
+ } },
+ }, .{
+ .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 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, .fast_imm16, null, null },
+ .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, .fast_imm16, null, null },
+ .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .fast_imm16, null, null, null },
+ .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .fast_imm16, null, null, null },
+ .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .bmi2, .cmov, .fast_imm16, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .bmi2, .cmov, .fast_imm16, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .bmi2, .cmov, null, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .bmi2, .cmov, null, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, .fast_imm16, null, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, .fast_imm16, null, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .fast_imm16, null, null, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .fast_imm16, null, null, null },
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
+ .patterns = &.{
+ .{ .src = .{ .to_mut_gpr, .imm16, .none } },
+ .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
+ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, 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, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .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, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
+ .{ ._, ._, .cmc, ._, ._, ._, ._ },
+ .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .@"and", .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .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 } },
+ },
+ .extra_temps = .{
+ .{ .type = .i32, .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, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .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 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
+ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, 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 = .i32, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .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 = .i32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
+ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .bmi2, .cmov, null, null },
+ .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 = .{ .rc = .general_purpose } },
+ .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .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 = .{ .rc = .general_purpose } },
+ .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .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 = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
+ .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
+ .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .cmov, null, null, null },
+ .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, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .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, .to_gpr, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
+ .{ ._, ._, .cmc, ._, ._, ._, ._ },
+ .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .@"and", .dst0d, .tmp0d, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", .cmov, 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 } },
+ },
+ .extra_temps = .{
+ .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
+ } },
+ }, .{
+ .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 } },
+ },
+ .extra_temps = .{
+ .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smin), ._, ._ },
+ .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", .cmov, 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 = .i64, .kind = .{ .rc = .general_purpose } },
+ .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
+ .{ ._, ._, .mov, .tmp1q, .dst0q, ._, ._ },
+ .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, 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 = .i64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
+ .{ ._, ._, .add, .tmp0q, .tmp0q, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", .bmi2, .cmov, 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 = .{ .rc = .general_purpose } },
+ .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
+ .{ ._, ._rx, .ro, .tmp1q, .dst0q, .sia(-31, .src0, .add_bit_size), ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", .cmov, 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 = .{ .rc = .general_purpose } },
+ .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
+ .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
+ .{ ._, ._, .mov, .tmp1q, .dst0q, ._, ._ },
+ .{ ._, ._r, .sh, .tmp1q, .sia(-31, .src0, .add_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
+ .{ ._, ._o, .cmov, .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 = .{ .rc = .general_purpose } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .{ .ref = .src0 }, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
+ .{ ._, ._r, .sh, .tmp0q, .sia(-31, .src0, .add_bit_size), ._, ._ },
+ .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smax), ._, ._ },
+ .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", .cmov, 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, .to_gpr, .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 = &.{
+ .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._c, .cmov, .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, .to_gpr, .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 = &.{
+ .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
+ .{ ._, ._, .cmc, ._, ._, ._, ._ },
+ .{ ._, ._, .sbb, .tmp0q, .tmp0q, ._, ._ },
+ .{ ._, ._, .@"and", .dst0q, .tmp0q, ._, ._ },
+ } },
+ }, .{
+ .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 = .{ .reg = .rdi } },
+ .{ .type = .i64, .kind = .{ .reg = .rax } },
+ .{ .type = .u64, .kind = .{ .reg = .rcx } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .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_size, -8), .tmp1q, ._, ._ },
+ .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
+ .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
+ .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
+ .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
+ .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
+ .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
+ .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
+ .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
+ .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .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 = .{ .reg = .rdi } },
+ .{ .type = .i64, .kind = .{ .reg = .rax } },
+ .{ .type = .u64, .kind = .{ .reg = .rcx } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .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_size, -16), .tmp1q, ._, ._ },
+ .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
+ .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
+ .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
+ .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
+ .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .tmp2d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
+ .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
+ .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
+ .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
+ .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
+ .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .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 = .{ .reg = .rdi } },
+ .{ .type = .i64, .kind = .{ .reg = .rax } },
+ .{ .type = .u64, .kind = .{ .reg = .rcx } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .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_size, -8), .tmp1q, ._, ._ },
+ .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
+ .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
+ .{ ._, ._l, .sa, .tmp1q, .uia(63, .src0, .sub_bit_size_rem_64), ._, ._ },
+ .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
+ .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .tmp2d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
+ .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
+ .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
+ .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
+ .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
+ .{ .@"0:", ._r, .sa, .tmp1q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .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 = .{ .reg = .rdi } },
+ .{ .type = .i64, .kind = .{ .reg = .rax } },
+ .{ .type = .u64, .kind = .{ .reg = .rcx } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .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_size), .tmp1q, ._, ._ },
+ .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
+ .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
+ .{ ._, ._l, .sa, .tmp1q, .uia(63, .src0, .sub_bit_size_rem_64), ._, ._ },
+ .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
+ .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
+ .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
+ .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
+ .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
+ .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
+ .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
+ .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
+ } },
+ }, .{
+ .required_features = .{ .@"64bit", null, null, null },
+ .src_constraints = .{
+ .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
+ .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
+ .any,
+ },
+ .patterns = &.{
+ .{ .src = .{ .to_mem, .to_mem, .none } },
+ },
+ .extra_temps = .{
+ .{ .type = .isize, .kind = .{ .reg = .rdi } },
+ .{ .type = .u64, .kind = .{ .reg = .rax } },
+ .{ .type = .u64, .kind = .{ .reg = .rcx } },
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ .unused,
+ },
+ .dst_temps = .{ .mem, .unused },
+ .clobbers = .{ .eflags = true },
+ .each = .{ .once = &.{
+ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
+ .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
+ .{ .@"0:", ._, .mov, .tmp2q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .sbb, .tmp2q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
+ .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp2q, ._, ._ },
+ .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
+ .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
+ .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
+ .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
+ .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
+ .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
+ } },
+ } }) catch |err| switch (err) {
+ error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
+ @tagName(air_tag),
+ cg.typeOf(bin_op.lhs).fmt(pt),
+ ops[0].tracking(cg),
+ ops[1].tracking(cg),
+ }),
+ else => |e| return e,
+ };
+ try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
+ },
.mul, .mul_optimized => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, .mul) else {
const bin_op = air_datas[@intFromEnum(inst)].bin_op;
const ty = cg.typeOf(bin_op.lhs);
@@ -127883,6 +129596,7 @@ const Select = struct {
const Src = union(enum) {
none,
+ any,
imm: i16,
imm8,
imm16,
@@ -127931,6 +129645,7 @@ const Select = struct {
fn matches(src: Src, temp: Temp, cg: *CodeGen) bool {
return switch (src) {
.none => temp.tracking(cg).short == .none,
+ .any => true,
.imm => |specific_imm| switch (temp.tracking(cg).short) {
.immediate => |imm| @as(i64, @bitCast(imm)) == specific_imm,
else => false,
@@ -128045,7 +129760,7 @@ const Select = struct {
fn convert(src: Src, temp: *Temp, cg: *CodeGen) InnerError!bool {
return switch (src) {
- .none, .imm, .imm8, .imm16, .imm32, .simm32 => false,
+ .none, .any, .imm, .imm8, .imm16, .imm32, .simm32 => false,
.mem, .to_mem => try temp.toBase(false, cg),
.mut_mem, .to_mut_mem => try temp.toBase(true, cg),
.to_reg => |reg| try temp.toReg(reg, cg),
@@ -128079,6 +129794,7 @@ const Select = struct {
none,
undef,
cc: Condition,
+ imm: u32,
ref: Select.Operand.Ref,
reg: Register,
reg_pair: [2]Register,
@@ -128168,6 +129884,7 @@ const Select = struct {
.any => .{ try cg.tempAlloc(spec.type), true },
.none => .{ try cg.tempInit(spec.type, .none), true },
.undef => .{ try cg.tempInit(spec.type, .undef), true },
+ .imm => |imm| .{ try cg.tempInit(spec.type, .{ .immediate = imm }), 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 },
test/behavior/x86_64/binary.zig
@@ -5097,6 +5097,14 @@ test subWrap {
try test_sub_wrap.testIntVectors();
}
+inline fn subSat(comptime Type: type, lhs: Type, rhs: Type) Type {
+ return lhs -| rhs;
+}
+test subSat {
+ const test_sub_sat = binary(subSat, .{});
+ try test_sub_sat.testInts();
+}
+
inline fn mulUnsafe(comptime Type: type, lhs: Type, rhs: Type) DoubleBits(Type) {
@setRuntimeSafety(false);
return @as(DoubleBits(Type), lhs) * rhs;
test/behavior/saturating_arithmetic.zig
@@ -127,12 +127,12 @@ test "saturating subtraction" {
test "saturating subtraction 128bit" {
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
- 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
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 S = struct {
fn doTheTest() !void {