mirror of
https://codeberg.org/ziglang/zig.git
synced 2026-04-27 19:09:47 +03:00
x86_64: rewrite scalar +|
This commit is contained in:
+1860
-2
@@ -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(15_800);
|
||||
@setEvalBranchQuota(15_900);
|
||||
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
|
||||
.add_sat => try cg.airAddSat(inst),
|
||||
.sub_sat => try cg.airSubSat(inst),
|
||||
.mul_sat => try cg.airMulSat(inst),
|
||||
.shl_sat => try cg.airShlSat(inst),
|
||||
@@ -4346,6 +4345,1864 @@ 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_safe => unreachable,
|
||||
.add_sat => |air_tag| if (use_old) try cg.airAddSat(inst) else fallback: {
|
||||
const bin_op = air_datas[@intFromEnum(inst)].bin_op;
|
||||
if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airAddSat(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 &.{ .{
|
||||
.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 = .{ .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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .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 = .{ .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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
|
||||
.{ ._, ._, .@"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 = .{ .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 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
|
||||
.{ ._, ._, .@"test", .dst0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
|
||||
.{ ._, ._pe, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
|
||||
.{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smax), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
|
||||
.{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .cmov, null, null, null },
|
||||
.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, .mem, .none } },
|
||||
.{ .src = .{ .mem, .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 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0b, .tmp0b, ._, ._ },
|
||||
.{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0b, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0b, .ua(.src0, .add_umax), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .fast_imm16, .cmov, null, null },
|
||||
.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 } },
|
||||
},
|
||||
.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, .tmp0w, .ui(15), ._, ._ },
|
||||
.{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 } },
|
||||
},
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .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 = .{ .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 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
|
||||
.{ ._, ._no, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
|
||||
.{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .fast_imm16, .cmov, null, null },
|
||||
.src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .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 } },
|
||||
},
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
|
||||
.{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
|
||||
.{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .fast_imm16, .cmov, 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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .src = .{ .to_mut_gpr, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .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 = &.{
|
||||
.{ ._, ._, .add, .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 } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .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 = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .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 = &.{
|
||||
.{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
|
||||
.{ ._, ._no, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
|
||||
.{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .fast_imm16, .cmov, 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 } },
|
||||
.{ .src = .{ .to_mut_gpr, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .fast_imm16, .cmov, 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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .src = .{ .to_mut_gpr, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .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 = &.{
|
||||
.{ ._, ._, .add, .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 } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .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 = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .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 = &.{
|
||||
.{ ._, ._, .add, .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), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
|
||||
.{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .cmov, null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0w, .tmp0w, ._, ._ },
|
||||
.{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .cmov, 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 } },
|
||||
.{ .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 = &.{
|
||||
.{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0w, .tmp0w, ._, ._ },
|
||||
.{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .fast_imm16, null, null, null },
|
||||
.src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0w, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .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, .imm16, .none } },
|
||||
.{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0w, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0w, .ua(.src0, .add_umax), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
|
||||
.patterns = &.{
|
||||
.{ .src = .{ .to_mut_gpr, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0w, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0w, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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 = .{ .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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .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 = .{ .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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
|
||||
.{ ._, ._, .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 = .{ .{ .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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .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), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
|
||||
.{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.required_features = .{ .cmov, null, null, null },
|
||||
.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, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .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 = &.{
|
||||
.{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0d, .tmp0d, ._, ._ },
|
||||
.{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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, .mem, .none } },
|
||||
.{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
|
||||
.{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0d, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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 = .{ .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 = .{ .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, ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .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 = .{ .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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .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", .cmov, 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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._, .add, .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 = .{ .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 = .{ .rc = .general_purpose } },
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
.unused,
|
||||
},
|
||||
.dst_temps = .{ .{ .ref = .src0 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .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", 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 } },
|
||||
},
|
||||
.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 = &.{
|
||||
.{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
|
||||
.{ ._, ._, .sbb, .tmp0q, .tmp0q, ._, ._ },
|
||||
.{ ._, ._, .@"or", .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 = .{ .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 = .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 = &.{
|
||||
.{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0q, .tmp0q, ._, ._ },
|
||||
.{ ._, ._a, .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 = .{ .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 = .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 = &.{
|
||||
.{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0q, .tmp0q, ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .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 = .{ .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 }, .unused },
|
||||
.clobbers = .{ .eflags = true },
|
||||
.each = .{ .once = &.{
|
||||
.{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
|
||||
.{ ._, ._, .cmp, .dst0q, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .adc, .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), ._, ._ },
|
||||
.{ ._, ._, .adc, .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_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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._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_size), .tmp1q, ._, ._ },
|
||||
.{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
|
||||
.{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
|
||||
.{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .adc, .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), ._, ._ },
|
||||
.{ ._, ._, .adc, .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 = .{
|
||||
.{ .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 = .{ .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, .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_size, -8), .tmp1q, ._, ._ },
|
||||
.{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
|
||||
.{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
|
||||
.{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
|
||||
.{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
|
||||
} },
|
||||
}, .{
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .adc, .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_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 = .{ .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, .sia(1, .src0, .sub_size_div_8), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._c, .cl, ._, ._, ._, ._ },
|
||||
.{ .@"0:", ._, .mov, .tmp2q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
|
||||
.{ ._, ._, .adc, .tmp2q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
|
||||
.{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -8), .tmp2q, ._, ._ },
|
||||
.{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
|
||||
.{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, ._, .cmp, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp2d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
|
||||
.{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
|
||||
.{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .si(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 = .{ .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), ._, ._ },
|
||||
.{ ._, ._, .adc, .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 = .xword, .is = .xword } },
|
||||
.{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
|
||||
.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), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
|
||||
.{ ._, ._c, .cl, ._, ._, ._, ._ },
|
||||
.{ .@"0:", ._, .mov, .tmp2q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
|
||||
.{ ._, ._, .adc, .tmp2q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
|
||||
.{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp2q, ._, ._ },
|
||||
.{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
|
||||
.{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
|
||||
.{ ._, ._, .cmp, .tmp2q, .tmp1q, ._, ._ },
|
||||
.{ ._, ._na, .j, .@"0f", ._, ._, ._ },
|
||||
.{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
|
||||
.{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
|
||||
.{ ._, ._, .mov, .tmp2d, .sia(-1, .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);
|
||||
},
|
||||
.sub, .sub_optimized, .sub_wrap => |air_tag| if (use_old) try cg.airBinOp(inst, switch (air_tag) {
|
||||
else => unreachable,
|
||||
.sub, .sub_optimized => .sub,
|
||||
@@ -119854,6 +121711,7 @@ const Select = struct {
|
||||
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_smax: Adjust = .{ .sign = .pos, .lhs = .smax, .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 add_umax_shr_src1: Adjust = .{ .sign = .pos, .lhs = .umax_shr_src1, .op = .mul, .rhs = .@"1" };
|
||||
|
||||
@@ -53,12 +53,12 @@ test "saturating add" {
|
||||
|
||||
test "saturating add 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 {
|
||||
|
||||
@@ -5282,6 +5282,14 @@ test addWrap {
|
||||
try test_add_wrap.testIntVectors();
|
||||
}
|
||||
|
||||
inline fn addSat(comptime Type: type, lhs: Type, rhs: Type) Type {
|
||||
return lhs +| rhs;
|
||||
}
|
||||
test addSat {
|
||||
const test_add_sat = binary(addSat, .{});
|
||||
try test_add_sat.testInts();
|
||||
}
|
||||
|
||||
inline fn subUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
|
||||
@setRuntimeSafety(false);
|
||||
return switch (@typeInfo(Scalar(Type))) {
|
||||
|
||||
Reference in New Issue
Block a user